Archivio della categoria ‘MySQL’

PHP : Come esportare lo schema di un database come xml

Avere a disposizione un dump di un database é sempre importante per vari e ovvii motivi.

Un modo originale, ma che fornisce un risultato pratico e utilizzabile in svariate circostanze, è quello di ottenere, tramite script PHP, lo schema di un database MySQL come XML. Sapete benissimo quanto sia importante e quante potenzialità abbia questo linguaggio di markup, e, pertanto, avere uno schema di un db descritto da un file xml potrebbe avere notevoli vantaggi a seconda delle esigenze del caso.

Il codice riportato qui sotto é preso da questo interessante articolo e, alla fine, farò alcune veloci considerazioni :

<?php
// database constants da cambiare in relazione al vostro da esportare
define("DB_SERVER", "localhost");
define("DB_USER", "root");
define("DB_PASS", "password");
define("DB_NAME", "name_db");

// connection to the database
$dbhandle = mysql_connect(DB_SERVER, DB_USER, DB_PASS)
or die("Unable to connect to MySQL");

// select a database to work with
$selected = mysql_select_db(DB_NAME, $dbhandle)
or die("Could not select examples");

// return all available tables
$result_tbl = mysql_query( "SHOW TABLES FROM ".DB_NAME, $dbhandle );

$tables = array();
while ($row = mysql_fetch_row($result_tbl)) {
$tables[] = $row[0];
}

$output = "<?xml version=\"1.0\" ?>\n";
$output .= "<schema>";

// iterate over each table and return the fields for each table
foreach ( $tables as $table ) {
$output .= "<table name=\"$table\">";
$result_fld = mysql_query( "SHOW FIELDS FROM ".$table, $dbhandle );

while( $row1 = mysql_fetch_row($result_fld) ) {
$output .= "<field name=\"$row1[0]\" type=\"$row1[1]\"";
$output .= ($row1[3] == "PRI") ? " primary_key=\"yes\" />" : " />";
}

$output .= "</table>";
}

$output .= "</schema>";

// tell the browser what kind of file is come in
header("Content-type: text/xml");
// print out XML that describes the schema
echo $output;

// close the connection
mysql_close($dbhandle);
?>


Dopo aver correttamente definito le costanti, vi connetterete al db MySQL e utilizzerete il comando SHOW TABLES per ottenere tutte le tabelle del database. Fatto questo, si passa ad iterare le singole tabelle per estrarre i campi di ogni tabella sfruttando il comando SHOW FIELDS.

La parte finale del codice, invece, è riservata ad inserire tutte le informazioni estratte in un file XML.

Wordpress e database : 3 modi di integrazione

wordpress-logo

Volendo lavorare alla realizzazione o alla modifica di un tema per WordPress, prima o poi, avrete bisogno di interagire con il database MySQL per ricavare delle informazioni. Siano esse il semplice titolo di un post oppure informazioni più precise e complicate da ottenere. In ogni caso é necessario scrivere qualche riga in php perchè difficilmente trovate tutto già disponibile. Ecco perché, dopo aver parlato di come connettersi ad un database MySQL, eccovi un articolo sulle vari modalità di integrazione.

La classe ezSQL di Wordpress

Come in molte applicazioni, anche per Wordpress, esiste un ‘database abstraction layer’ ovvero una classe o libreria che si posiziona tra il codice e il database che ospita i dati. Questo strato/layer fornisce un’interfaccia di comunicazione fra il cms e il database. La classe utilizzata da Wordpress é ezSQL di cui abbiamo già parlato in modo generale.

L’handler, ovvero l’oggetto con proprietà e metodi, di cui si serve la classe suddetta per tutte le interazioni tra Wordpress e Database, é la famosa $wpdb.

Essendo la $wpdb una variabile globale, all’interno di tutte le funzioni che scriverete e in cui é previsto un collegamento con il database, dichiaratela come globale in modo da poter avere libero accesso ai suoi metodi e proprietà :

functions mia_funzione()

{

global $wpdb;

………………….

}

Le proprietà dell’oggetto wpdb

Se tramite codice php abbiamo ampie possibilità di integrazione tra Wordpress e Database, lo dobbiamo alla vasta gamma di proprietà dell’oggetto wpdb. Le proprietà riescono a coprire benissimo e ampiamente tutti i metadati, le tabelle e i relativi collegamenti del DB MySQL e, proprio sfruttando queste proprietà, vi mostrerò alcune integrazioni basilari.

Premetto che, per accedere alle varie proprietà a disposizione, si usa  la seguente sintassi : $wpdb –> {property}

Inoltre, tra le tante, la proprietà più importante che prederemo in considerazione é la :  $wpdb –> {posts} che impatta la tabella degli articoli con tutti gli attributi (autore, titolo, data, content, status,category ecc) del caso. Non che le altre tabelle che fanno parte dell’installazione di default siano meno importanti, ma, indubbiamente, la tabella posts é quella che immagazzina la maggior parte dei dati di cui si vogliono ottenere informazioni.

Aggiungere Dati al database MySQL con Wordpress

Per aggiungere dati nelle tabelle MySQL del database con Wordpress potete sfruttare il metodo insert() di wpdb i cui riferimenti trovate a questo link. Vediamo, in generale, come fare, premettendo che per evitare il famoso problema dovuto alla tecnica d’attacco SQL Injection, occorre ‘bonificare’ o controllare apriori i dati da inserire. Per avere una panoramica più approfondita, dedicherò alla SQL Injection un articolo specifico.

Vediamo, ora, un esempio che consente di inserire nella tabella posts (quella che gestisce gli articoli, come detto) alcuni dati musicali con titolo del brano, descrizione e tipo sfruttando la sintassi del metodo insert() : <?php $wpdb->insert( $table, $data, $format ); ?>

functions add_music_post ( $music_titolo, $music_descrizione) {

global $wpdb;

$wpdb –> insert( $wpdb –>posts, array(‘posts_title => $music_titolo, ‘post_content’ => $music_descrizione, ‘post_type => ‘mp3’), array(‘%s’, ‘%s’, ‘%s’) );

}

Modificare Dati nel database MySQL con Wordpress

Accanto al metodo insert() visto sopra, un altro metodo consente di apportare modifiche ai dati presenti nel Database : update(). I riferimenti del metodo li trovate a questo link, ma vi anticipo che la sintassi é la seguente :

$wpdb->update( ‘table’, array( ‘column1′ => ‘value1′, ‘column2′ => ‘value2′ ), array( ‘ID’ => 1 ), array( ‘%s’, ‘%d’ ), array( ‘%d’ ) )

dove i parametri sono la tabella da aggiornare, le colonne impattate e i valori precisi. Vediamo un esempio :

functions edit_music_post ( $post_id, $titolo_new, $descrizione_new) {

global $wpdb;

$wpdb –> update( $wpdb –>posts, array(‘posts_title => $titolo_new, ‘post_content’ => $descrizione_new) , array(‘ID’ => post_id), array(‘%s’, ‘%s’, ) array (‘%d’) );

}

Ottenere Dati dal Database MySQL con Wordpress

Quest’ultimo é, di sicuro, il metodo più interessante ed utile perché consente di ottenere dati dal database cui Wordpress è collegato. Logicamente, le possibilità son molteplici anche in considerazione della enorme mole di dati cui si può attingere.

Vediamo tre tipologie di azioni :

Ottenere singolo valore da una tabella

Il metodo impattato in questa situazione é il get_var() e qui trovate i riferimenti. Il suo utilizzo é semplice poiché, per ottenere un singolo valore di una particolare riga di tabella, basta passare direttamente l’SQL statement al metodo :

$post_id = $wpdb->get_var(“select id from ‘ . $wpdb->posts. ‘ where post_autore=1 limit 1”);

La select vi restituirà banalmente solo l’id dell’ultimo post scritto dall’autore con id = 1.

Ottenere una colonna di dati

Il metodo é il get_col() e si usa, tanto per riprendere l’esempio precedente, nel caso in cui vogliate ottenere tutti i posts pubblicati dall’autore con id pari a 1 e non solo il più recente tenendo presente che il set di dati restituiti é, a tutti gli effetti, un oggetto :

$object = $wpdb->get_var(“select id from ‘ . $wpdb->posts. ‘ where post_autore=1”);

Ottenere un full data set

Nel caso in cui le vostre richieste non siano un semplice valore o una solo colonna, ma un vero dataset, abbiamo a disposizione il metodo get_results(). Qui trovate i riferimenti anche se la sintassi non é difficile.

Vediamo un esempio che vi fornisca tutti gli utenti registrati sul vostro blog dopo Luglio 2010 :

$users = $wpdb->get_results( select * from ‘ . $wpdb->users . ‘ where user_registred > ‘2010-07-01’ “);

Quelli che ho presentato sono solo alcuni tra i vari metodi utilizzabili per un’integrazione tra il codice Wordpress e MySQL. Se volete avere tutte le info necessarie, la classe wpdb e i relativi metodi sono elencati nella pagina ufficiale del codex Wordpress.

Query SQL – Come usare il Join nelle relazioni fra tabelle

join-inner

Scopo primario di una database è quello di conservare i dati in maniera stabile e sicura, ma scopo di chi lo crea e gestisce è quello di sfruttare tutte le possibilità a disposizione per organizzarli in una struttura tale che eviti la ridondanza dei dati stessi.

Quando si parla di normalizzare un database, si intende il creare una struttura tale in cui i dati siano fisicamente separati tra loro, ma legati tramite relazioni fra le varie tabelle in cui i dati sono inseriti.

L’operatore Join è usato, appunto, quando la query riguarda l’estrazione di dati da due o più tabelle le cui colonne sono legate fra loro da qualche relazione (chiave primaria…). Ecco perchè si parla spesso di join fra due tabelle.

Vediamo ora come usare l’operatore join in SQL prendendo come esempio due tabelle, registi e film con la tabella film legata a quella registi da un campo (id_regista) di riferimento al regista del film specificato, il cui nome si trova fisicamente all’interno della tabella registi. Per chi non lo sapesse, premetto che se si vuole indicare un campo contenuto in una determinata tabella in SQL, occorre utilizzare la forma nome_tabella.nome_campo (ad esempio film.titolo)

Supponiamo di avere una classica query che vuole estrarre un dato particolare :

SELECT

registi.nome, film.titolo, film.attori

FROM registi, film

WHERE registi.id = film.id_regista

La query, direi, è abbastanza chiara e semplice nel suo significato. Passiamo ora a vedere come renderla o modificarla a seconda delle esigenze con i 4 operatori di join, ovvero :

- INNER JOIN o JOIN

- LEFT JOIN

- RIGHT JOIN

- FULL JOIN

INNER JOIN

La select sopra riportata poteva essere scritta anche sfruttando l’operatore INNER JOIN o JOIN ovvero :

SELECT

registi.nome, film.titolo, film.attori

FROM registi INNER JOIN film

WHERE registi.id = film.id_regista

In tal caso, questa forma di JOIN più semplice combina dei criteri per estrarre soltanto le righe che presentano i campi indicati in entrambe le tabelle, cioè tutti i nomi dei registi il cui id è presente, come chiave primaria, nella tabella dei film. Esattamente come la prima select, in sostanza.

Vediamo, invece, come sfruttare gli altri tre operatori.

LEFT JOIN

SELECT

registi.nome, film.titolo

FROM registi LEFT JOIN film

WHERE registi.id = film.id_regista

Questo JOIN non tiene solo conto di tutte le righe che soddisfano la relazione, ma vi include anche quelle righe presenti nella tabella che si trova a sinistra del JOIN (in tal caso registi) e valorizza i campi della seconda tabella con NULL. Quindi, in questo caso, saranno riportati anche tutti i registi il cui id non è presente nella tabella film.

RIGHT JOIN

Questo JOIN non tiene solo conto di tutte le righe che soddisfano la relazione, ma vi include anche quelle righe presenti nella tabella che si trova a destra del JOIN (in tal caso film) e valorizza i campi della prima tabella con NULL. Quindi, in questo caso, saranno riportati anche tutti i film che non hanno un regista legato con la tabella registi.

FULL JOIN

SELECT

registi.nome, film.titolo

FROM registi FULL JOIN film

WHERE registi.id = film.id_regista

Questo ultimo tipo di JOIN esterno è il FULL JOIN, che, come avrete intuito, mette assieme sia LEFT che RIGHT e include tutti i dati presenti in entrambe le tabelle cioè, inserisce le righe presenti nella prima tabella ma non nella seconda e viceversa, oltre che naturalmente tutte quelle che soddisfano la relazione.

5 Funzioni utili per gestire le stringhe in MySQL

logo mysql 5 Funzioni utili per gestire le stringhe in MySQL

La gestione delle stringhe è sempre una delle attività di maggior impatto e interesse in tutti i linguaggi. Anche il database non è esente da questo ed è per tale motivo che vi propongo in dettaglio alcune tra le più importanti funzioni per gestire e manipolare stringhe in MySQL.

Upper() e Lower()

Si tratta di semplici funzioni che restituiscono una stringa tutta in minuscolo (lower) o in maiuscolo (upper) a seconda delle esigenze. Potete utilizzarle tranquillamente in una select passando alla funzione un parametro :
Continua a leggere »

I triggers in MYSQL : Introduzione ed esempi

Logo-mysql

I triggers sono uno di quegli argomenti di cui si sente spesso parlare, ma difficilmente si approfondisce come si deve. In questo post, che non vuol essere un tutorial MySql sui triggers, volevo solo affrontare il tema in modo più completo e dettagliato per non far restare tale parola avvolta solo da un alone di mistero.

Tanto per citare, invece, un tutorial coi fiocchi sull’argomento :

However, as applications grow more and more complicated, the further we can abstract the layers of an application to handle what they should, the greater our internal development usability becomes

Questo non significa che occorre utilizzare e sfruttare un trigger solo in applicazioni con una enorme mole di dati, ma, va da se, i vantaggi sono tanto più evidenti quanto più grande è il database di progetto su cui applichiamo i triggers. Sempre che convenga..

In sostanza, i trigger sono semplici oggetti associati a tabelle che vengono attivati nel momento in cui un determinato evento si verifica relativamente a quella tabella. Essi consentono di applicare un controllo sull’integrità dei dati inseriti cioè di verificare se questi ultimi sono corretti e se vanno, eventualmente, modificati.

Relativamente a MySQL, si parla di trigger dalla versione MySQL 5.0.2

La definizione di un trigger deve essere stabilita dopo aver deciso a quale evento deve essere associato (inserimento di righe, modifiche o cancellazioni) e se deve essere eseguito prima o dopo tale evento.

Ecco i possibili tipi di trigger:

  • BEFORE INSERT
  • BEFORE UPDATE
  • BEFORE DELETE
  • AFTER INSERT
  • AFTER UPDATE
  • AFTER DELETE

Vediamo, in dettaglio, la sintassi di base di un trigger tenendo presente che, anche se un trigger è associato ad una tabella, facendo parte di un database,il suo nome deve essere univoco all’interno del db stesso.

CREATE TRIGGER nome_del_trigger
{ BEFORE | AFTER }
{ INSERT | UPDATE | DELETE }
ON nome_della_tabella
FOR EACH ROW
codice_SQL_da_applicare_con_il_trigger

La prima linea indica il nome del trigger che stiamo creando. Tale nome, così come per le tabelle o database, deve essere lungo al massimo 64 caratteri.

La seconda linea determina il tempo di esecuzione del trigger. Come detto, infatti, esso può agire prima dell’esecuzione vera e propria della query oppure dopo. In seguito capiremo cosa questo comporta.

La terza linea introduce il tipo di query SQL che genererà l’esecuzione del trigger. Attenzione perchè sono ammesse solo query esecutive (INSERT, UPDATE,DELETE) e non SELECT. Altra cosa importante da sottolineare è che la INSERT non rappresenta soltanto le query classica, ma tutte le query che prevedono l’inserimento dati come LOAD DATA o REPLACE in caso di un record nuovo.

La quarta linea specifica la tabella su cui attivare il trigger. È possibile avere un solo trigger attivo per lo stesso tipo di query sulla stessa tabella.

La quinta linea illustra l’individualità del trigger che si applica ad ogni riga singolarmente e non a tutta la tabella nel suo insieme. Per fare un esempio, una DELETE di massa sulla tabella, attiva e avvia tanti trigger quante sono le righe interessate.

La sesta linea infine rappresenta il codice SQL da eseguire all’attivazione dell’evento. Il codice SQL che possiamo utilizzare, normalmente, effettua una serie di controlli di flusso.

Prima di vedere un esempio su come utilizzare i trigger bisogna specificare una cosa. Poiché le istruzioni all’interno dello statement devono terminare con il famoso punto e virgola, esso non può essere sfruttato per indicare la terminazione di un trigger.

A tale scopo, viene definito // come terminazione quindi, prima della dichiarazione dei trigger bisogna definire il delimitatore con il seguente codice:

DELIMITER //

Ed ora, per completare il discorso, vediamo un esempio. Tra le tante modalità di applicazione, una delle più sfruttate è data dal controllo della correttezza dei valori inseriti nel database.

Pensiamo, ad esempio, al caso in cui abbiamo un campo i cui valori possono oscillare tra un massimo e un minimo (0-100). Il controllo potrebbe certamente esser fatto a posteriori tramite una query di UPDATE che aggiorni i vari record che presentano eventuali errori, ma anche sfruttando un trigger che agisca prima di una insert o di un update :

DELIMITER //

CREATE TRIGGER prodotti_insert_controllo
BEFORE INSERT ON prodotti
FOR EACH ROW
BEGIN
IF NEW.prezzo < 0 THEN
SET NEW.prezzo = 0;
END IF;
IF NEW.prezzo > 1000 THEN
SET NEW.prezzo = 1000;
END IF;
END; //

CREATE TRIGGER prodotti_update_controllo
BEFORE UPDATE ON prodotti
FOR EACH ROW
BEGIN
IF NEW.prezzo < 0 THEN
SET NEW.prezzo = 0;
IF NEW.prezzo > 1000 THEN
SET NEW.prezzo = 1000;
END; //

DELIMITER;

Come vedete, invece di preoccuparci a posteriori di intervenire sui valori fuori range, meglio prevenire con un trigger dedicato. Pensate, infatti, a dover controllare la correttezza di oltre 10000 records piuttosto che a prevenire ed avere una correttezza già garantita.

Conclusioni

Utilizzare i triggers per risolvere problemi all’interno di un database è davvero molto comodo, ma aggiungendo un carico di lavoro, dobbiamo capirne vantaggi reali prima di utilizzarli.

Infatti, a volte possiamo anche farne a meno optando per soluzioni diverse (jobs per schedulare azioni ricorsive, stored procedure per gestire operazioni ecc). Inoltre è fondamentale avere a mente il numero di righe che saranno coinvolte dall’azione del trigger,poichè fin tanto che si lavora con tabelle con poche centinaia di righe potrebbero esser utili senza sconvolgere le prestazioni del sistema, ma su database con milioni di righe, urge analisi approfondita prima di creare triggers!

Find e Replace in file di testo da linea di comando

Tutto è nato quando un mio collega mi ha chiesto aiuto. Aveva un file bello corposo (un export di un database intero) da aprire e modificare.

MySQL Format date : formattare le date MySQL in modo facile

Siccome,nel lavorare con le date, l’operazione statisticamente più comune è quella di estrarre alcuni valori dal database e presentarli in modo che siano facilmente interpretabili, MySQL mette a disposizione la funzione DATE_FORMAT() per risolvere il problema in maniera semplice ed elegante evitando inutili acrobazie (magari tramite PHP).

Come cambiare la password di admin su Wordpress via query SQL

Se avete perso o dimenticato la password di administrator sul vostro Wordpress, eccovi un trucchetto veloce tramite sql per risolvere il problema se neuroni e sinapsi non vi autano. Si tratta di un semplice update da lanciare con una query SQL o tramite linea di comando o, meglio, sfruttando un Database Manager Web come phpMyAdmin. [...]