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 champs suivis d'un * sont obligatoires

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