L'oggetto $wpdb consente di gestire in maniera semplice le varie query delle nostre applicazioni. Tuttavia il supporto alla protezione delle SQL INJECTION non è automatico, occorre utilizzare le apposite funzioni esc_sql() o prepare().
Grazie all'oggetto $wpdb Wordpress consente di gestire agevolmente l'esecuzione delle query e la relativa risposta del database. Tuttavia questa classe non richiama automaticamente funzioni di protezione dalle Sql Injection e da caratteri pericolosi. Per far questo è necessario utilizzare la funzione esc_sql oppure prepare().
La funzione esc_sql() è stata introdotta da Wordpress 2.8.0 e riceve come parametro una stringa. Si tratta di una funzione da usare a sè:
$stringa = "ciao 'test'";
echo esc_sql($stringa);
Tuttavia è preferibile gestire tutte le query con l'oggetto $wpdb, che offre già un proprio metodo di pulizia delle query: prepare().
Prepare() si comporta come una classica printf, ricevendo come parametro una stringa con caratteri jolly e a seguire i relativi valori. Ecco un esempio pratico:
$sql = 'select * from '.$wpdb->posts.' where post_status="publish" and post_type="%s"';
$variabile_dati = 'post';
$elenco = $wpdb->prepare($sql,$variabile_dati);
Come in una printf(), il numero di parametri cambia a seconda delle stringhe da utilizzare. L'importante è rispettare il corretto ordine: il primo parametro è la stringa sql, tutti gli altri sono le variabili che nella stringa sono stati temporaneamente sostituiti dal "segnaposto" %s.
Se abbiamo bisogno di conoscere le variabili realmente passata al database dopo la funzione di ripulitura di prepare(), è sufficiente un var_dump:
var_dump($elenco);
In caso di errore torna sempre utile l'apposita funzione di debug:
$wpdb->show_errors();