Introduction : pourquoi les guillemets en MySQL rendent-ils fou ?
\n\nSi vous avez déjà écrit des requêtes SQL en PHP, vous avez sûrement été confronté à la confusion : quand utiliser les guillemets simples (' '), quand utiliser les doubles (" "), et quand utiliser ces mystérieux backticks (` `) ? Une erreur d'un seul caractère et au lieu de données, vous obtenez une erreur de syntaxe MySQL ou, pire encore, une faille de sécurité.
Ce sujet est l'une des questions les plus populaires sur Stack Overflow (plus de 2 millions de vues !). Et pour cause. Même les développeurs expérimentés s'y perdent parfois. Aujourd'hui, nous allons une fois pour toutes mettre les points sur les i. Vous apprendrez :
\n\n- \n
- À quoi sert chaque type de guillemet en MySQL \n
- Comment échapper correctement les données en PHP \n
- Pourquoi les guillemets doubles sont presque toujours à éviter \n
- Comment vous protéger contre les injections SQL \n
C'est parti ! 🚀
\n\nAnatomie d'une requête MySQL : trois types de guillemets
\n\nEn MySQL, il existe trois symboles qui ressemblent à des guillemets, mais qui remplissent des fonctions complètement différentes :
\n\n1. Guillemets simples (' ') — pour les valeurs chaînes
\n\nQuand les utiliser : toujours lorsque vous transmettez une chaîne (texte, date, email, mot de passe).
\n\nSELECT * FROM users WHERE name = 'Jean';\nINSERT INTO articles (title) VALUES ('MySQL pour les nuls');\n\nMySQL interprète tout ce qui se trouve entre guillemets simples comme un littéral de chaîne. Cela signifie que vous dites à la base : « Voici une valeur, n'essayez pas de l'interpréter comme un nom de colonne ou une commande ».
\n\n2. Guillemets doubles (" ") — presque pareil, mais avec une nuance
\n\nEn SQL standard, les guillemets doubles sont utilisés pour les identifiants (noms de tables et de colonnes). Mais MySQL fonctionne par défaut dans un mode où les guillemets doubles sont équivalents aux guillemets simples. Cela prête souvent à confusion.
\n\n-- Cela fonctionne, mais il vaut mieux éviter\nSELECT * FROM users WHERE name = "Marie";\n\nProblème : si vous activez le mode strict ANSI_QUOTES, les guillemets doubles commenceront à fonctionner comme des backticks. Votre code sera cassé. Par conséquent :
Règle n°1 : Utilisez les guillemets simples pour les chaînes. Toujours. Les guillemets doubles uniquement si vous savez exactement ce que vous faites, ou pour la compatibilité avec d'autres SGBD.
\n\n3. Backticks (` `) — pour les noms de tables et de colonnes
\n\nLes backticks (guillemets inversés) sont des identifiants. Ils sont nécessaires pour :
\n\n- \n
- Utiliser des mots réservés comme noms (mauvaise pratique, mais ça arrive) \n
- Travailler avec des noms contenant des espaces ou des caractères spéciaux \n
- Éviter les conflits avec les mots-clés MySQL \n
-- Mauvais : 'select' est un mot réservé\nSELECT * FROM select;\n\n-- Bon : on échappe avec des backticks\nSELECT * FROM `select`;\n\n-- Obligatoire : nom avec un espace\nSELECT `user name` FROM users;\n\n-- Recommandé : toujours échapper les noms de tables et colonnes\nSELECT `id`, `name` FROM `users` WHERE `status` = 'active';\n\nImportant : les backticks NE DOIVENT PAS être utilisés pour les valeurs. Cela provoquerait une erreur.
\n\n-- ERREUR : MySQL pensera que 'Jean' est un nom de colonne\nSELECT * FROM users WHERE name = `Jean`;\n\nPHP + MySQL : comment ne pas se perdre avec les guillemets
\n\nVoici le plus intéressant : comment tout cela fonctionne en PHP. PHP utilise lui-même des guillemets simples et doubles pour les chaînes, et il est facile de se tromper.
\n\nCas n°1 : Insertion directe d'une variable (dangereux !)
\n\n// MAUVAIS : vulnérabilité aux injections SQL\n$name = "Jean'; DROP TABLE users; --";\n$query = "SELECT * FROM users WHERE name = '$name'";\n// Résultat : SELECT * FROM users WHERE name = 'Jean'; DROP TABLE users; --'\n\nC'est une injection SQL classique. Ne faites jamais cela !
\n\n