Ich versuche zu lernen, wie man Abfragen am besten schreibt. Ich verstehe auch, wie wichtig es ist, konsequent zu sein. Bis jetzt habe ich zufällig einfache Anführungszeichen, doppelte Anführungszeichen und Backticks verwendet, ohne wirklich darüber nachzudenken.
Beispiel:
$query = 'INSERT INTO table (id, col1, col2) VALUES (NULL, val1, val2)';
Auch in dem obigen Beispiel der Meinung , dass table
, col1
, val1
usw. können Variablen sein.
Was ist der Standard dafür? Wie geht's?
Ich habe hier etwa 20 Minuten lang Antworten auf ähnliche Fragen gelesen, aber es scheint, dass es keine endgültige Antwort auf diese Frage gibt.
"tablename"
und einfache Anführungszeichen für Literale, z'this is a some text'
. Back-Ticks werden in Standard-SQL niemals verwendet. (Wenn Sie ein doppeltes Anführungszeichen in einen Bezeichner"odd""tablename"
'Conan O''Brien'
Antworten:
Backticks sind für Tabellen- und Spaltenkennungen zu verwenden, sind jedoch nur erforderlich, wenn die Kennung ein reserviertes MySQL-Schlüsselwort ist oder wenn die Kennung Leerzeichen oder Zeichen enthält, die über einen begrenzten Satz hinausgehen (siehe unten). Es wird häufig empfohlen, die Verwendung reservierter Schlüsselwörter zu vermeiden wenn möglich als Spalten- oder Tabellenkennungen, um das Angebotsproblem zu vermeiden.
Für Zeichenfolgenwerte wie in der
VALUES()
Liste sollten einfache Anführungszeichen verwendet werden . Doppelte Anführungszeichen werden von MySQL auch für Zeichenfolgenwerte unterstützt, aber einfache Anführungszeichen werden von anderen RDBMS häufiger akzeptiert. Daher ist es eine gute Angewohnheit, einfache Anführungszeichen anstelle von doppelten Anführungszeichen zu verwenden.MySQL erwartet auch ,
DATE
undDATETIME
Literalwerte wie einfache Anführungszeichen als Zeichenfolge zu sein'2001-01-01 00:00:00'
. Konsultieren Sie Datum und Uhrzeit Literale Dokumentation für weitere Details, insbesondere Alternativen zu dem Bindestrich verwendet-
als Segmenttrennzeichen in Datumsstrings.In Ihrem Beispiel würde ich die PHP-Zeichenfolge in doppelte Anführungszeichen setzen und einfache Anführungszeichen für die Werte verwenden
'val1', 'val2'
.NULL
ist ein MySQL-Schlüsselwort und ein spezieller (Nicht-) Wert und wird daher nicht in Anführungszeichen gesetzt.Keine dieser Tabellen- oder Spaltenkennungen sind reservierte Wörter oder verwenden Zeichen, die in Anführungszeichen gesetzt werden müssen, aber ich habe sie trotzdem mit Backticks zitiert (dazu später mehr ...).
Funktionen, die dem RDBMS eigen sind (z. B.
NOW()
in MySQL), sollten nicht in Anführungszeichen gesetzt werden, obwohl ihre Argumente denselben Zeichenfolgen- oder Bezeichner-Anführungsregeln unterliegen, die bereits erwähnt wurden.Variable Interpolation
Die Anführungszeichen für Variablen ändern sich nicht. Wenn Sie die Variablen jedoch direkt in einer Zeichenfolge interpolieren möchten, müssen sie in PHP in doppelte Anführungszeichen gesetzt werden. Stellen Sie einfach sicher, dass Sie die Variablen für die Verwendung in SQL ordnungsgemäß maskiert haben. ( Es wird empfohlen, stattdessen eine API zu verwenden, die vorbereitete Anweisungen unterstützt, um sich vor SQL-Injection zu schützen .)
Vorbereitete Aussagen
Wenn Sie mit vorbereiteten Aussagen arbeiten, konsultieren Sie die Dokumentation, um festzustellen, ob die Platzhalter der Aussage in Anführungszeichen gesetzt werden müssen oder nicht. Die beliebtesten APIs in PHP, PDO und MySQLi erwarten nicht zitierte Platzhalter, ebenso wie die meisten vorbereiteten Anweisungs-APIs in anderen Sprachen:
Zeichen, bei denen ein Backtick in Bezeichnern angegeben werden muss:
Gemäß der MySQL-Dokumentation müssen Sie keine Bezeichner (Backtick) mit dem folgenden Zeichensatz in Anführungszeichen setzen:
Sie können Zeichen, die über diesen Satz hinausgehen, als Tabellen- oder Spaltenbezeichner verwenden, einschließlich Leerzeichen, aber dann müssen Sie sie in Anführungszeichen setzen (Backtick).
quelle
In MySQL gibt es zwei Arten von Anführungszeichen:
'
zum Einschließen von String-Literalen`
zum Einschließen von Bezeichnern wie Tabellen- und SpaltennamenUnd dann
"
ist da noch ein Sonderfall. Abhängig von den MySQL-Servern kann es jeweils für einen der oben genannten Zwecke verwendet werdensql_mode
:"
Zeichen verwendet werden, um Zeichenfolgenliterale wie folgt einzuschließen'
ANSI_QUOTES
Modus kann das"
Zeichen verwendet werden, um Bezeichner genau wie einzuschließen`
Die folgende Abfrage führt je nach SQL-Modus zu unterschiedlichen Ergebnissen (oder Fehlern):
ANSI_QUOTES deaktiviert
Die Abfrage wählt das Zeichenfolgenliteral aus,
"column"
wobei die Spaltefoo
der Zeichenfolge entspricht"bar"
ANSI_QUOTES aktiviert
Die Abfrage wählt die Spalte aus,
column
in der die Spaltefoo
der Spalte entsprichtbar
Wann was zu verwenden
"
damit Ihr Code unabhängig von den SQL-Modi wirdquelle
(Es gibt oben gute Antworten bezüglich der SQL-Natur Ihrer Frage, aber dies kann auch relevant sein, wenn Sie neu in PHP sind.)
Vielleicht ist es wichtig zu erwähnen, dass PHP Zeichenfolgen in einfachen und doppelten Anführungszeichen unterschiedlich behandelt ...
Zeichenfolgen in einfachen Anführungszeichen sind "Literale" und so ziemlich WYSIWYG-Zeichenfolgen. Zeichenfolgen in doppelten Anführungszeichen werden von PHP für eine mögliche Variablensubstitution interpretiert (Backticks in PHP sind nicht genau Zeichenfolgen; sie führen einen Befehl in der Shell aus und geben das Ergebnis zurück).
Beispiele:
quelle
Backticks werden im Allgemeinen verwendet, um die reservierten Schlüsselwörter anzuzeigen
identifier
und vor versehentlicher Verwendung zu schützen .Zum Beispiel:
Hier helfen die Backticks dem Server zu verstehen, dass dies
database
tatsächlich der Name der Datenbank ist, nicht die Datenbankkennung.Gleiches gilt für die Tabellennamen und Feldnamen. Dies ist eine sehr gute Angewohnheit, wenn Sie Ihre Datenbankkennung mit Backticks versehen.
Nun zu doppelten Anführungszeichen und einfachen Anführungszeichen (Michael hat das bereits erwähnt).
Um einen Wert zu definieren, müssen Sie jedoch entweder einfache oder doppelte Anführungszeichen verwenden. Sehen wir uns ein anderes Beispiel an.
Hier habe ich bewusst vergessen, das
title1
mit Anführungszeichen zu versehen. Jetzt nimmt der Server dentitle1
als Spaltennamen (dh einen Bezeichner). Um anzuzeigen, dass es sich um einen Wert handelt, müssen Sie entweder doppelte oder einfache Anführungszeichen verwenden.In Kombination mit PHP erleichtern doppelte und einfache Anführungszeichen das Schreiben von Abfragen erheblich. Sehen wir uns eine modifizierte Version der Abfrage in Ihrer Frage an.
Jetzt verwenden Sie doppelte Anführungszeichen in PHP, um die Variablen zu erstellen
$val1
und$val2
ihre Werte zu verwenden, wodurch eine perfekt gültige Abfrage erstellt wird. Mögenwird machen
quelle
In MySQL, werden diese Symbole verwendet , um eine Abfrage zu begrenzen
`
,"
,'
und()
."
oder'
werden zum Einschließen von stringartigen Werten"26-01-2014 00:00:00"
oder verwendet'26-01-2014 00:00:00'
. Diese Symbole sind nur für Streicher, keine Aggregatfunktionen wienow
,sum
odermax
.`
wird zum Einschließen von Tabellen- oder Spaltennamen verwendet, zselect `column_name` from `table_name` where id='2'
(
und)
einfach Teile einer Abfrage einschließen, zselect `column_name` from `table_name` where (id='2' and gender='male') or name='rakesh'
.quelle
Die String-Literale in MySQL und PHP sind identisch.
Wenn Ihre Zeichenfolge einfache Anführungszeichen enthält, können Sie die Zeichenfolge in doppelte Anführungszeichen setzen, oder wenn sie doppelte Anführungszeichen enthält, können Sie die Zeichenfolge in einfache Anführungszeichen setzen. Wenn Ihre Zeichenfolge jedoch sowohl einfache als auch doppelte Anführungszeichen enthält, müssen Sie die Zeichenfolge umgehen, mit der die Zeichenfolge in Anführungszeichen gesetzt wurde.
Meistens verwenden wir einfache Anführungszeichen für einen SQL-Zeichenfolgenwert, daher müssen wir doppelte Anführungszeichen für eine PHP-Zeichenfolge verwenden.
Und Sie könnten eine Variable in der doppelten Anführungszeichenfolge von PHP verwenden:
Aber wenn
$val1
oder$val2
einfache Anführungszeichen enthält, wird Ihre SQL falsch sein. Sie müssen es also maskieren, bevor es in SQL verwendet wird. dafür istmysql_real_escape_string
es da. (Obwohl eine vorbereitete Aussage besser ist.)quelle
In Kombination mit PHP und MySQL erleichtern doppelte und einfache Anführungszeichen das Schreiben von Abfragen erheblich.
Angenommen, Sie verwenden eine direkte Post-Variable in der MySQL-Abfrage. Verwenden Sie sie dann folgendermaßen:
Dies ist die beste Vorgehensweise für die Verwendung von PHP-Variablen in MySQL.
quelle
Hier gab es viele hilfreiche Antworten, die im Allgemeinen in zwei Punkten gipfelten.
UND wie @MichaelBerkowski sagte
Es gibt jedoch einen Fall, in dem ein Bezeichner weder ein reserviertes Schlüsselwort sein kann noch Leerzeichen oder Zeichen enthält, die über einen begrenzten Satz hinausgehen, sondern notwendigerweise Backticks erfordern.
BEISPIEL
123E10
ist ein gültiger Bezeichnername, aber auch ein gültigesINTEGER
Literal.[Ohne ins Detail zu gehen, wie Sie einen solchen Bezeichnernamen erhalten würden] Angenommen, ich möchte eine temporäre Tabelle mit dem Namen erstellen
123456e6
.Kein Fehler bei Backticks.
FEHLER, wenn keine Backticks verwendet werden.
Es handelt sich jedoch
123451a6
um einen vollkommen feinen Bezeichnernamen (ohne hintere Häkchen).Dies liegt vollständig daran, dass
1234156e6
es sich auch um eine Exponentialzahl handelt.quelle
Wenn Tabellenspalten und Werte Variablen sind, gibt es zwei Möglichkeiten:
Mit doppelten Anführungszeichen
""
die vollständige Abfrage:Oder
Mit einfachen Anführungszeichen
''
:Verwenden Sie Back-Ticks,
``
wenn ein Spalten- / Wertname einem reservierten MySQL-Schlüsselwort ähnelt.Hinweis: Wenn Sie einen Spaltennamen mit einem Tabellennamen kennzeichnen, verwenden Sie folgende Back Ticks:
`table_name`
.`column_name`
<- Hinweis:.
Von Back Ticks ausschließen.quelle
Einfache Anführungszeichen sollten für Zeichenfolgenwerte wie in der Liste VALUES () verwendet werden.
Backticks werden im Allgemeinen verwendet, um eine Kennung anzugeben und um sicher zu sein, dass die reservierten Schlüsselwörter nicht versehentlich verwendet werden.
In Kombination mit PHP und MySQL erleichtern doppelte und einfache Anführungszeichen das Schreiben von Abfragen erheblich.
quelle
Abgesehen von all den (gut erklärten) Antworten wurde Folgendes nicht erwähnt, und ich besuche diese Fragen und Antworten ziemlich oft.
In einer Nussschale; MySQL glaubt, dass Sie in einer eigenen Tabelle / Spalte rechnen möchten, und interpretiert Bindestriche wie "E-Mail" als
e
Minusmail
.Haftungsausschluss: Daher dachte ich, ich würde dies als eine Art "FYI" -Antwort für diejenigen hinzufügen, die mit der Arbeit mit Datenbanken völlig neu sind und die bereits beschriebenen technischen Begriffe möglicherweise nicht verstehen.
quelle
SQL Server und MySQL, PostgreySQL, Oracle verstehen keine doppelten Anführungszeichen ("). Daher sollte Ihre Abfrage frei von doppelten Anführungszeichen (") sein und nur einfache Anführungszeichen (') verwenden.
Back-Trip (`) ist in SQL optional und wird für Tabellennamen, Datenbanknamen und Spaltennamen verwendet.
Wenn Sie versuchen, eine Abfrage in Ihr Back-End zu schreiben, um MySQL aufzurufen, können Sie doppelte Anführungszeichen (") oder einfache Anführungszeichen (') verwenden, um einer Variablen eine Abfrage zuzuweisen, wie:
Wenn
where
Ihre Abfrage eine Anweisung enthält und / oder versucht,insert
einen Wert und / oder einenupdate
Wert zu erhalten, bei dem es sich um eine Zeichenfolge handelt, verwenden Sie ein einfaches Anführungszeichen (') für diese Werte wie:Wenn Sie sich bei der Verwendung von doppelten Anführungszeichen (") und einfachen Anführungszeichen (') aus dieser Verwirrung heraushalten möchten, empfehlen wir, bei einfachen Anführungszeichen (') zu bleiben. Dies beinhaltet Backslash () wie:
Probleme mit doppelten (") oder einfachen (') Anführungszeichen treten auf, wenn wir einen Wert dynamisch zuweisen und eine Zeichenfolgenverkettung durchführen mussten, wie:
Wenn Sie weitere Freigaben benötigen, befolgen Sie die Anführungszeichen in JavaScript
quelle