Ich versuche zu lernen, wie man Abfragen am besten schreibt. Ich weiß auch, wie wichtig es ist, konsistent zu sein. Bis jetzt habe ich wahllos 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)';
Beachten Sie im obigen Beispiel auch, dass table
, col1
, val1
, usw. Variablen sein können.
Was ist der Standard dafür? Wie gehen Sie vor?
Ich lese hier seit etwa 20 Minuten Antworten auf ähnliche Fragen, aber es scheint, als gäbe es keine endgültige Antwort auf diese Frage./sub>
Backticks sind für Tabellen- und Spaltenbezeichner zu verwenden, sind aber nur notwendig, wenn der Bezeichner ein MySQL reserved keyword ist oder wenn der Bezeichner Leerzeichen oder Zeichen außerhalb eines begrenzten Satzes enthält (siehe unten). Es wird oft empfohlen, reservierte Schlüsselwörter als Spalten- oder Tabellenbezeichner zu vermeiden, wenn es möglich ist, um das Problem der Anführungszeichen zu vermeiden.
Einfache Anführungszeichen sollten für String-Werte wie in der VALUES()
-Liste benutzt werden. Doppelte Anführungszeichen werden von MySQL auch für String-Werte unterstützt, aber einfache Anführungszeichen werden von anderen RDBMS eher akzeptiert, so dass es eine gute Angewohnheit ist, einfache Anführungszeichen anstelle von doppelten zu verwenden.
MySQL erwartet auch, dass DATE
- und DATETIME
-Literalwerte in einfachen Anführungszeichen als Zeichenketten wie '2001-01-01 00:00:00'
stehen. Konsultieren Sie die Date and Time Literals-Dokumentation für weitere Details, insbesondere Alternativen zur Verwendung des Bindestrichs -
als Segmentbegrenzer in Datums-Strings.
In Ihrem Beispiel würde ich also den PHP-String in doppelte Anführungszeichen setzen und die Werte "val1" und "val2" in einfache Anführungszeichen setzen. NULL" ist ein MySQL-Schlüsselwort und ein spezieller (Nicht-)Wert, der daher nicht in Anführungszeichen gesetzt wird.
Keine dieser Tabellen- oder Spaltenbezeichner sind reservierte Wörter oder verwenden Zeichen, die in Anführungszeichen gesetzt werden müssen, aber ich habe sie trotzdem mit Backticks in Anführungszeichen gesetzt (mehr dazu später...).
RDBMS-eigene Funktionen (z.B. NOW()
in MySQL) sollten nicht in Anführungszeichen gesetzt werden, obwohl ihre Argumente den bereits erwähnten Regeln für die Quotierung von Zeichenketten oder Bezeichnern unterliegen.
Backtick (`) Tabelle & Spalte ───────┬─────┬──┬──┬──┬───────┐┬──┬──┬──┬┬──┬──┬──┬┬──┬──┬──┬ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ $query = "INSERT INTO `table` (`id`, `col1`, `col2`, `date`, `updated`) VALUES (NULL, 'val1', 'val2', '2001-01-01', NOW())"; ↑↑↑↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑↑↑↑↑ Unquotiertes Schlüsselwort ─────┴┴┴┘ │ │ │ │ │ │ │││││ Strings in einfachen Anführungszeichen (') ───────────┴────┴──┴────┘ │ │ │││││ Einfaches Anführungszeichen (') DATE ───────────────────────────┴──────────┘ │││││ Unquotierte Funktion ─────────────────────────────────────────┴┴┴┴ ┴┘
Die Anführungszeichen für Variablen ändern sich nicht. Wenn Sie jedoch beabsichtigen, die Variablen direkt in einen String zu interpolieren, muss dieser in PHP in doppelte Anführungszeichen gesetzt werden. Stellen Sie sicher, dass Sie die Variablen für die Verwendung in SQL richtig escaped haben. (Es wird empfohlen, stattdessen eine API zu verwenden, die Prepared Statements unterstützt, um sich gegen SQL-Injection zu schützen).
// Das Gleiche mit einigen Variablenersetzungen // Hier wird ein variabler Tabellenname $table in Backtick-Quotes gesetzt, und Variablen // in der VALUES-Liste sind in einfachen Anführungszeichen $query = "INSERT INTO `$table` (`id`, `col1`, `col2`, `date`) VALUES (NULL, '$val1', '$val2', '$date')";
Wenn Sie mit vorbereiteten Anweisungen arbeiten, konsultieren Sie die Dokumentation, um festzustellen, ob die Platzhalter der Anweisung in Anführungszeichen gesetzt werden müssen oder nicht. Die populärsten in PHP verfügbaren APIs, PDO und MySQLi, erwarten unquoted Platzhalter, ebenso wie die meisten APIs für vorbereitete Anweisungen in anderen Sprachen:
// 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 (?, ?, ?, ?)";
[Nach der MySQL-Dokumentation (http://dev.mysql.com/doc/refman/5.5/en/identifiers.html) müssen Sie Bezeichner mit dem folgenden Zeichensatz nicht in Anführungszeichen setzen (Backtick):
ASCII:
[0-9,a-z,A-Z$_]
(lateinische Grundbuchstaben, Ziffern 0-9, Dollar, Unterstrich)
Sie können über diesen Zeichensatz hinausgehende Zeichen als Tabellen- oder Spaltenbezeichner verwenden, z. B. auch Leerzeichen, aber dann müssen Sie sie in Anführungszeichen setzen (Backtick).
Backticks werden im Allgemeinen verwendet, um einen "Bezeichner" zu kennzeichnen und um sich vor der versehentlichen Verwendung der Reservierten Schlüsselwörter zu schützen.
Zum Beispiel:
Use `database`;
Hier helfen die Backticks dem Server zu verstehen, dass Datenbank
tatsächlich der Name der Datenbank ist und nicht der Datenbankbezeichner.
Dasselbe kann für die Tabellen- und Feldnamen gemacht werden. Es ist eine gute Angewohnheit, wenn Sie Ihren Datenbankbezeichner mit Backticks umschließen.
Lesen Sie diese Antwort, um mehr über Backticks zu erfahren.
Nun zu den doppelten Anführungszeichen & einfachen Anführungszeichen (Michael hat das bereits erwähnt).
Aber, um einen Wert zu definieren, müssen Sie entweder einfache oder doppelte Anführungszeichen verwenden. Lassen Sie uns ein weiteres Beispiel sehen.
INSERT INTO `tablename` (`id, `title`) VALUES ( NULL, title1);
Hier habe ich absichtlich vergessen, title1
in Anführungszeichen zu setzen. Nun wird der Server title1
als Spaltenname (d.h. als Bezeichner) auffassen. Um also anzuzeigen, dass es sich um einen Wert handelt, müssen Sie entweder doppelte oder einfache Anführungszeichen verwenden.
INSERT INTO `tablename` (`id, `title`) VALUES ( NULL, 'title1');
In Kombination mit PHP machen doppelte und einfache Anführungszeichen das Schreiben von Abfragen viel einfacher. Schauen wir uns eine geänderte Version der Abfrage in Ihrer Frage an.
$query = "INSERT INTO `table` (`id`, `col1`, `col2`) VALUES (NULL, '$val1', '$val2')";
Durch die Verwendung von doppelten Anführungszeichen in PHP werden die Variablen $val1
und $val2
mit ihren Werten belegt, wodurch eine vollkommen gültige Abfrage entsteht. Wie
$val1 = "my value 1";
$val2 = "my value 2";
$query = "INSERT INTO `table` (`id`, `col1`, `col2`) VALUES (NULL, '$val1', '$val2')";
wird
INSERT INTO `table` (`id`, `col1`, `col2`) VALUES (NULL, 'my value 1', 'my value 2')
Wenn Tabellenspalten und -werte Variablen sind, gibt es zwei Möglichkeiten:
Mit doppelten Anführungszeichen ""
die komplette Abfrage:
$query = "INSERT INTO $table_name (id, $col1, $col2)
VALUES (NULL, '$val1', '$val2')";
Oder
$query = "INSERT INTO ".$table_name." (id, ".$col1.", ".$col2.")
VALUES (NULL, '".$val1."', '".$val2."')";
Mit einfachen Anführungszeichen ''
:
$query = 'INSERT INTO '.$table_name.' (id, '.$col1.', '.$col2.')
VALUES (NULL, '.$val1.', '.$val2.')';
Verwenden Sie Back Ticks ``
, wenn ein Spalten-/Wertname einem reservierten MySQL-Schlüsselwort ähnlich ist.
Hinweis: Wenn Sie einen Spaltennamen mit einem Tabellennamen bezeichnen, verwenden Sie back ticks wie folgt:
Tabellenname
.
Spaltenname`` <-- Anmerkung: schließen Sie
.` von back ticks aus.