Les guillemets et SQL

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/

Notes

[1] J'ai pesté pendant pas loin d'une heure avant de mettre le doigt sur ce problème.

[2] Je n'ai pas fait le test avec une base SQLite, alors si quelqu'un peut infirmer ou confirmer qu'il le fasse dans les commentaires.

Ajouter un commentaire

Les commentaires peuvent être formatés en utilisant la syntaxe Markdown Extra.

Ajouter un rétrolien

URL de rétrolien : https://open-time.net/trackback/3138

Haut de page