Les guillemets et SQL
in Dotclear - Lien permanent
20
oct.
2007
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/


Commentaires
Oups !... Je viens donc de corriger mon widget OtherBlog qui utilisait des requêtes non universelles... Pas testé avec une base SQLite.