J'essaie d'apprendre la meilleure façon d'écrire des requêtes. Je comprends également l'importance d'être cohérent. Jusqu'à présent, j'ai utilisé au hasard des guillemets simples, des guillemets doubles et des guillemets sans aucune véritable pensée.
Exemple:
$query = 'INSERT INTO table (id, col1, col2) VALUES (NULL, val1, val2)';
En outre, dans l'exemple ci - dessus, considérer que table
, col1
, val1
, etc. , peuvent être des variables.
Quelle est la norme pour cela? Que faire?
Je lis les réponses à des questions similaires ici depuis environ 20 minutes, mais il semble qu'il n'y ait pas de réponse définitive à cette question.
"tablename"
, et les guillemets simples sont pour les littéraux, par exemple'this is a some text'
. Les back-ticks ne sont jamais utilisés en SQL standard. (Si vous devez inclure un guillemet double dans un identifiant, tapez-le deux fois comme"odd""tablename"
. De même, double guillemets simples dans des littéraux, comme'Conan O''Brien'
.)Réponses:
Les backticks doivent être utilisés pour les identificateurs de table et de colonne, mais ne sont nécessaires que lorsque l'identifiant est un mot clé réservé MySQL , ou lorsque l'identifiant contient des espaces ou des caractères au-delà d'un ensemble limité (voir ci-dessous). Il est souvent recommandé d'éviter d'utiliser des mots clés réservés comme identificateurs de colonne ou de table lorsque cela est possible, en évitant le problème de citation.
Des guillemets simples doivent être utilisés pour les valeurs de chaîne comme dans la
VALUES()
liste. Les guillemets doubles sont également pris en charge par MySQL pour les valeurs de chaîne, mais les guillemets simples sont plus largement acceptés par les autres SGBDR, c'est donc une bonne habitude d'utiliser des guillemets simples au lieu de doubles.MySQL s'attend également à ce
DATE
queDATETIME
les valeurs littérales soient entre guillemets simples comme des chaînes'2001-01-01 00:00:00'
. Consultez la documentation des littéraux de date et d'heure pour plus de détails, en particulier des alternatives à l'utilisation du trait-
d' union comme délimiteur de segment dans les chaînes de date.Donc, en utilisant votre exemple, je citerais deux fois la chaîne PHP et utiliserais des guillemets simples sur les valeurs
'val1', 'val2'
.NULL
est un mot-clé MySQL, et une valeur (non) spéciale, et n'est donc pas cité.Aucun de ces identifiants de table ou de colonne n'est un mot réservé ou n'utilise des caractères nécessitant une citation, mais je les ai quand même cités avec des astuces (plus de détails plus loin ...).
Les fonctions natives du SGBDR (par exemple,
NOW()
dans MySQL) ne doivent pas être citées, bien que leurs arguments soient soumis aux mêmes règles de citation de chaîne ou d'identifiant déjà mentionnées.Interpolation variable
Les modèles de guillemets pour les variables ne changent pas, bien que si vous avez l'intention d'interpoler les variables directement dans une chaîne, ils doivent être entre guillemets doubles en PHP. Assurez-vous simplement que vous avez correctement échappé les variables à utiliser dans SQL. ( Il est recommandé d'utiliser à la place une API prenant en charge les instructions préparées, comme protection contre l'injection SQL ).
Déclarations préparées
Lorsque vous travaillez avec des instructions préparées, consultez la documentation pour déterminer si les espaces réservés de l'instruction doivent être cités. Les API les plus populaires disponibles en PHP, PDO et MySQLi, attendent des espaces réservés non cités, comme le font la plupart des API d'instructions préparées dans d'autres langues:
Caractères nécessitant un backtick entre guillemets:
Selon la documentation MySQL , vous n'avez pas besoin de citer (backtick) les identifiants en utilisant le jeu de caractères suivant:
Vous pouvez utiliser des caractères au-delà de cet ensemble comme identifiants de table ou de colonne, y compris les espaces blancs par exemple, mais vous devez ensuite les citer (les insérer).
la source
Il existe deux types de devis dans MySQL:
'
pour enfermer des littéraux de chaîne`
pour enfermer des identificateurs tels que les noms de table et de colonneEt puis il y a
"
ce qui est un cas particulier. Il pourrait être utilisé à l' une des fins mentionnées ci-dessus à la fois en fonction du serveur MySQLsql_mode
:"
caractère peut être utilisé pour entourer des littéraux de chaîne comme'
ANSI_QUOTES
mode, le"
caractère peut être utilisé pour entourer des identifiants comme`
La requête suivante produira des résultats (ou erreurs) différents selon le mode SQL:
ANSI_QUOTES désactivé
La requête sélectionnera le littéral de chaîne
"column"
où la colonnefoo
est égale à la chaîne"bar"
ANSI_QUOTES activé
La requête sélectionnera la colonne
column
où la colonnefoo
est égale à la colonnebar
Quand utiliser quoi
"
afin que votre code devienne indépendant des modes SQLla source
(Il existe de bonnes réponses ci-dessus concernant la nature SQL de votre question, mais cela peut également être pertinent si vous êtes nouveau sur PHP.)
Il est peut-être important de mentionner que PHP gère différemment les chaînes entre guillemets simples et doubles ...
Les chaînes entre guillemets simples sont des «littéraux» et sont à peu près des chaînes WYSIWYG. Les chaînes entre guillemets doubles sont interprétées par PHP pour une éventuelle substitution de variable (les backticks en PHP ne sont pas exactement des chaînes; ils exécutent une commande dans le shell et retournent le résultat).
Exemples:
la source
Les backticks sont généralement utilisés pour indiquer un
identifier
et ainsi être à l' abri de l'utilisation accidentelle des mots-clés réservés .Par exemple:
Ici, les backticks aideront le serveur à comprendre que
database
c'est en fait le nom de la base de données, pas l'identifiant de la base de données.La même chose peut être faite pour les noms de table et les noms de champ. C'est une très bonne habitude si vous enveloppez votre identifiant de base de données avec des astuces.
Maintenant sur les guillemets doubles et les guillemets simples (Michael l'a déjà mentionné).
Mais, pour définir une valeur, vous devez utiliser des guillemets simples ou doubles. Voyons un autre exemple.
Ici, j'ai délibérément oublié d'envelopper les
title1
citations. Maintenant, le serveur prendra letitle1
comme un nom de colonne (c'est-à-dire un identifiant). Donc, pour indiquer qu'il s'agit d'une valeur, vous devez utiliser des guillemets doubles ou simples.Désormais, en combinaison avec PHP, les guillemets doubles et les guillemets simples facilitent le temps d'écriture de vos requêtes. Voyons une version modifiée de la requête dans votre question.
Maintenant, en utilisant des guillemets doubles dans le PHP, vous allez créer les variables
$val1
, et$val2
utiliser leurs valeurs créant ainsi une requête parfaitement valide. Commefera
la source
Dans MySQL, ces symboles sont utilisés pour délimiter une requête
`
,"
,'
et()
."
ou'
sont utilisés pour inclure des valeurs de type chaîne"26-01-2014 00:00:00"
ou'26-01-2014 00:00:00'
. Ces symboles ne sont que pour les chaînes, les fonctions non agrégées aimentnow
,sum
oumax
.`
est utilisé pour inclure des noms de table ou de colonne, par exempleselect `column_name` from `table_name` where id='2'
(
et)
simplement joindre des parties d'une requête, par exempleselect `column_name` from `table_name` where (id='2' and gender='male') or name='rakesh'
.la source
Les littéraux de chaîne dans MySQL et PHP sont les mêmes.
Donc, si votre chaîne contient des guillemets simples, vous pouvez utiliser des guillemets doubles pour citer la chaîne, ou si elle contient des guillemets doubles, vous pouvez utiliser des guillemets simples pour citer la chaîne. Mais si votre chaîne contient à la fois des guillemets simples et des guillemets doubles, vous devez échapper à celui qui utilisé pour citer la chaîne.
Généralement, nous utilisons des guillemets simples pour une valeur de chaîne SQL, nous devons donc utiliser des guillemets doubles pour une chaîne PHP.
Et vous pouvez utiliser une variable dans la chaîne entre guillemets de PHP:
Mais si
$val1
ou$val2
contient des guillemets simples, cela rendra votre SQL erroné. Vous devez donc y échapper avant de l'utiliser dans sql; c'est pour çamysql_real_escape_string
. (Bien qu'une déclaration préparée soit meilleure.)la source
En combinaison de PHP et MySQL, les guillemets doubles et les guillemets simples rendent votre temps d'écriture de requête tellement plus facile.
Supposons maintenant que vous utilisez une variable de publication directe dans la requête MySQL, puis utilisez-la de cette façon:
C'est la meilleure pratique pour utiliser des variables PHP dans MySQL.
la source
Il y a eu ici de nombreuses réponses utiles, qui ont généralement abouti à deux points.
ET comme l'a dit @MichaelBerkowski
Il y a cependant un cas où un identifiant ne peut être ni un mot - clé réservé, ni contenir des espaces ou des caractères au-delà d'un ensemble limité, mais nécessite nécessairement des retours en arrière autour d'eux.
EXEMPLE
123E10
est un nom d'identifiant valide mais également unINTEGER
littéral valide .[Sans entrer dans les détails pour obtenir un tel nom d'identifiant], supposons que je veuille créer une table temporaire nommée
123456e6
.Aucune erreur sur les backticks.
ERREUR lorsque vous n'utilisez pas de backticks.
Cependant,
123451a6
c'est un nom d'identifiant parfaitement fin (sans tiques arrière).C'est complètement parce que
1234156e6
c'est aussi un nombre exponentiel.la source
Si les colonnes et les valeurs de table sont des variables, il y a deux façons:
Avec des guillemets doubles,
""
la requête complète:Ou
Avec des guillemets simples
''
:Utilisez les ticks arrière
``
lorsqu'un nom de colonne / valeur est similaire à un mot clé réservé MySQL.Remarque: Si vous dénotez un nom de colonne avec un nom de table, utilisez des graduations comme ceci:
`table_name`
.`column_name`
<- Remarque: exclure.
des tiques arrière.la source
Des guillemets simples doivent être utilisés pour les valeurs de chaîne comme dans la liste VALUES ().
Les backticks sont généralement utilisés pour indiquer un identifiant et ainsi être à l'abri de l'utilisation accidentelle des mots-clés réservés.
En combinaison de PHP et MySQL, les guillemets doubles et les guillemets simples facilitent le temps d'écriture de vos requêtes.
la source
En plus de toutes les réponses (bien expliquées), il n'y a pas eu les suivantes et je visite ce Q&R assez souvent.
En un mot; MySQL pense que vous voulez faire des calculs sur sa propre table / colonne et interprète les tirets comme "e-mail" comme
e
moinsmail
.Avertissement: J'ai donc pensé ajouter ceci comme un type de réponse "FYI" pour ceux qui sont complètement nouveaux dans le travail avec les bases de données et qui peuvent ne pas comprendre les termes techniques déjà décrits.
la source
Les serveurs SQL et MySQL, PostgreySQL, Oracle ne comprennent pas les guillemets doubles ("). Ainsi, votre requête doit être exempte de guillemets doubles (") et ne doit utiliser que des guillemets simples (').
Back-trip (`) est facultatif à utiliser dans SQL et est utilisé pour le nom de table, le nom de base de données et les noms de colonne.
Si vous essayez d'écrire une requête dans votre back-end pour appeler MySQL, vous pouvez utiliser des guillemets doubles (") ou des guillemets simples (') pour affecter une requête à une variable comme:
S'il y a une
where
instruction dans votre requête et / ou essayezinsert
une valeur et / ou uneupdate
valeur qui est une chaîne, utilisez des guillemets simples (') pour ces valeurs comme:Si vous voulez éviter cette confusion lorsque vous utilisez des guillemets doubles (") et des guillemets simples ('), nous vous recommandons de vous en tenir aux guillemets simples ('), ce qui inclura une barre oblique inverse () comme:
Un problème avec les guillemets doubles (") ou simples (') survient lorsque nous avons dû attribuer une valeur dynamique et effectuer une concaténation de chaîne comme:
Si vous avez besoin d'un dégagement supplémentaire, suivez les devis en JavaScript
la source