Les astérisques doivent être utilisés pour les identificateurs de table et de colonne, mais ne sont nécessaires que lorsque l'identificateur est un numéro de série. Mot-clé réservé de MySQL Il est souvent recommandé d'éviter d'utiliser des mots-clés réservés comme identifiants de colonnes ou de tables, afin d'éviter le problème des guillemets.
Les guillemets simples doivent être utilisés pour les valeurs de type chaîne de caractères, comme dans l'exemple suivant VALUES()
liste. Les guillemets doubles sont également pris en charge par MySQL pour les chaînes de caractères, mais les guillemets simples sont plus largement acceptés par les autres SGBDR, c'est donc une bonne habitude d'utiliser les guillemets simples plutôt que les doubles.
MySQL attend également DATE
y DATETIME
les valeurs littérales doivent être mises entre guillemets sous forme de chaînes de caractères comme '2001-01-01 00:00:00'
. Consultez les littéraux de date et d'heure pour plus de détails, en particulier les alternatives à l'utilisation du trait d'union. -
comme délimiteur de segment dans les chaînes de dates.
En utilisant votre exemple, je mettrais la chaîne PHP entre guillemets et j'utiliserais des guillemets simples pour les valeurs. 'val1', 'val2'
. NULL
est un mot-clé MySQL, et une (non)-valeur spéciale, et est donc non citée.
Aucun de ces identifiants de table ou de colonne n'est un mot réservé ou n'utilise de caractères nécessitant une citation, mais je les ai tout de même cités avec des backticks (nous y reviendrons plus tard...).
Fonctions natives du SGBDR (par exemple, NOW()
dans MySQL) ne doivent pas être cités, bien que leurs arguments soient soumis aux mêmes règles de citation des chaînes ou des identifiants déjà mentionnées.
Backtick (\`)
table & column
$query = "**INSERT INTO \`table\` (\`id\`, \`col1\`, \`col2\`, \`date\`, \`updated\`)
VALUES (NULL, 'val1', 'val2', '2001-01-01', NOW())**";
Unquoted keyword
Single-quoted (') strings
Single-quoted (') DATE
Unquoted function
Interpolation variable
Les modèles de citation pour les variables ne changent pas, bien que si vous avez l'intention d'interpoler les variables directement dans une chaîne, elle doit être doublement citée en PHP. Assurez-vous simplement que vous avez correctement échappé les variables pour les utiliser en SQL. ( Il est recommandé d'utiliser une API supportant les instructions préparées à la place, comme protection contre l'injection SQL. ).
// Same thing with some variable replacements
// Here, a variable table name $table is backtick-quoted, and variables
// in the VALUES list are single-quoted
$query = "INSERT INTO **\`$table\`** (\`id\`, \`col1\`, \`col2\`, \`date\`) VALUES (NULL, **'$val1'**, **'$val2'**, **'$date'**)";
Déclarations préparées
Lorsque vous travaillez avec des instructions préparées, consultez la documentation pour déterminer si les caractères de remplacement de l'instruction doivent être cités ou non. Les API les plus populaires disponibles en PHP, PDO et MySQLi, prévoient non coté comme le font la plupart des API d'instructions préparées dans d'autres langues :
// PDO example with named parameters, unquoted
$query = "INSERT INTO `table` (`id`, `col1`, `col2`, `date`) VALUES (:id, :col1, :col2, :date)";
// MySQLi example with ? parameters, unquoted
$query = "INSERT INTO `table` (`id`, `col1`, `col2`, `date`) VALUES (?, ?, ?, ?)";
Caractères nécessitant la citation du backtick dans les identifiants :
Selon la documentation MySQL vous n'avez pas besoin de citer (backtick) les identifiants utilisant le jeu de caractères suivant :
ASCII : [0-9,a-z,A-Z$_]
(lettres latines de base, chiffres de 0 à 9, dollar, trait de soulignement)
Vous pouvez utiliser des caractères au-delà de ce jeu comme identificateurs de table ou de colonne, y compris les espaces blancs par exemple, mais vous devez alors doit les citer (backtick).
En outre, bien que les chiffres soient des caractères valables pour les identificateurs, ces derniers ne peuvent pas être constitués uniquement de chiffres. Si c'est le cas, ils doivent être entourés de barres obliques inversées.
29 votes
Notez que cette question est très spécifique à MySQL. Le SQL en général (c'est-à-dire le SQL ISO/ANSI) a un ensemble différent de guillemets : les guillemets doubles sont pour les identificateurs délimités, par ex.
"tablename"
et les guillemets simples sont pour les littéraux, par ex.'this is a some text'
. Les guillemets ne sont jamais utilisés en SQL standard. (Si vous devez inclure un guillemet double dans un identificateur, tapez-le deux fois sous forme de"odd""tablename"
. De même, les guillemets simples doubles dans les littéraux, comme'Conan O''Brien'
.)