Hi!
Mir ist aufgefallen, dass in div. Foren, Manuals oder Tutorials SQL-Statments in Bezug auf Hochkommas immer wieder eine andere Schreibweise verwenden. Funktionieren tun jedoch alle. Ich Frage mich nun wie es korrekt ist.
Eine Einfache Antwort darauf fällt mir nicht ein, weil im konkreten Fall jeweils die Bedingungen und Rahmenbedingungen angemessen berücksichtigt werden sollten. Wobei: "Mach es so, dass es funktioniert und sich nicht missbrauchen lässt" wäre zwar einfach geantwortet, aber daraus kann man alles und nichts entnehmen.
INSERT INTO tabelle1 (wert1, wert2) VALUES (1, 2)
so geschrieben vollkommen OK, weil sowohl die Bezeichner nicht reserviert sind, als auch die Werte numerische Werte darstellen, WENN wert1 und wert2 auch numerische Spaltentypen darstellen.
Der WENN-Nebensatz muss nicht zwingend so berücksichtigt werden. MySQL kennt auch automatische Typumwandlung. Insofern ist es prinzipiell in Ordnung, Zahlen als Zahlenliteral zu notieren, auch wenn sie in andere Spaltentypen eingefügt werden sollen. Ebenso ist es in Ordnung, sie als Stringliteral zu schreiben, auch wenn das Ziel ein Zahlenfeld ist. Die automatische Typumwandlung richtet es. Natürlich sind nicht alle Kombinationen von Notationsweise und Feldtyp miteinander kompatibel und damit sinnvoll.
INSERT INTO tabelle1 (
wert1
,wert2
) VALUES (1, 2)
Immer noch OK, obwohl die Kennzeichnung der Bezeichner durch Backticks hier nicht notwendig ist, da sie keine reservierten Begriffe in MySQL darstellen. Es ist aber auch nicht schädlich, sie zu kennzeichnen.
Manchmal ist es jedoch erforderlich, Identifier/Bezeichner explizit zu kennzeichnen, weil es Namenskonflikte mit reservierten Wörtern gibt. Nicht immer kann oder will man auf einen alternativen Namen ausweichen.
Außerdem gibt es neben den `` auch noch den ANSI-kompatiblen Modus (ANSI_QUOTES) - siehe Kapitel Identifier.
INSERT INTO tabelle1 (
wert1
,wert2
) VALUES ('1', '2')
Hier wäre davon auszugehen, dass die Spaltentypen von wert1 und wert2 auch Stringtypen sein dürften. Bei Stringwerten ('1', '2') ist es notwendig, diese in Quotierung zu setzen. Es ist allerdings auch bei numerischen Spaltentypen erlaubt, die Werte in Quotierung zu setzen, wenn nicht direkt im Querystring damit gerechnet werden soll.
Strings- und Zahlen- -Typ und -Notation sind beliebig über Kreuz austauschbar.
select '2'+'2'; ergibt auch 4, denn zum Stringverbinden muss man CONCAT() verwenden.
Weiters wundert mich, dass im folgenden mysql_query die Variablen direkt im String stehen und das auch funktioniert.
mysql_query("INSERT INTO tabelle1 (wert1
,wert2
) VALUES ('$value1', '$value2')")
Aus PHP-Sicht in Ordnung, aber sicherheitstechnisch problematisch.
Ich hätte es eher so gemacht:
mysql_query("INSERT INTO tabelle1 (wert1
,wert2
) VALUES ('".$value1."', '".$value2."')")
Ergibt das selbe, inklusive der Sicherheitsbedenken. Besser: Kontextwechsel beachten (beachte dort auch die sprintf()-Notation).
Lo!