Si vous développez des balises templates, des widgets ou des plugins, voilà une erreur à ne pas commettre sous peine de passer pas mal de temps avant de trouver le problème[1]. Dans les requêtes SQL que vous pourriez utiliser, encadrez impérativement les chaînes de caractères utilisées comme constantes (dans les clauses WHERE
par exemple) par des guillemets simples '
et pas par des guillemets doubles "
.
Exemple de code non universel[2] (compte le nombre de billet comportant un chapo) :
$sql = 'SELECT count(P.post_id) FROM '.$core->prefix.'post P '; $sql .= 'WHERE P.post_status = 1 AND P.post_type = "post" '. $sql .= 'AND P.post_excerpt IS NOT NULL ';
ce qui donne la requête SQL suivante :
SELECT count(P.post_id) FROM dc_post P WHERE P.post_status = 1 AND P.post_type = "post" AND P.post_excerpt IS NOT NULL
Avec MySQL aucun problème, par contre, si vous utilisez une base de données PostgreSQL vous aurez droit à un beau message d'erreur indiquant que post
n'est pas un champ connu.
Voilà comment coder la même requête de manière universelle :
$sql = 'SELECT count(P.post_id) FROM '.$core->prefix.'post P '; $sql .= 'WHERE P.post_status = 1 AND P.post_type = \'post\' '. $sql .= 'AND P.post_excerpt IS NOT NULL ';
ce qui donnera la requête SQL suivante :
SELECT count(P.post_id) FROM dc_post P WHERE P.post_status = 1 AND P.post_type = 'post' AND P.post_excerpt IS NOT NULL
À vous les studios \o/
1 De mirovinben -
Oups !... Je viens donc de corriger mon widget OtherBlog qui utilisait des requêtes non universelles... Pas testé avec une base SQLite.