Christian Seiler: addslashes?

Beitrag lesen

Hallo,

Bleiben wir doch nochmals beim Hochkomma ' das in einem Namen oder ähnlichem vorkommen kann. Wenn man einen "normalen" Insert mit mysql() macht, dann bricht doch der Insert ab, wenn ein solchen Zeichen vorkommt und nicht maskiert oder behandelt ist.
Liegt das nun an der MySQL Datenbank ansich oder an der MySQL Funktion?
Was ist denn an der P.S. anders? Letztendlich macht es doch auch genau den gleichen Insert oder?

Der Hintergrund ist folgender:

Deine Aufgabenstellung ist, eine neue Zeile in eine MySQL-Tabelle einzufügen. PHP bietet Dir dafür 2 Wege:

1. Einen SQL-Befehl an die Datenbank zu senden.
 2. Einen SQL-Befehl mit zusätzlichen Informationen an die Datenbank zu
    senden.

Stell Dir nun vor, Deine Tabelle heißt "tabelle", hat ein Feld "feld", in das Du den Text "hochkomma '" einfügen willst.

Betrachten wir zuerst Fall 1. Dort sendest Du eine einzige Zeichenkette (also einen String) an den MySQL-Server. Diese müsste in dem Fall so aussehen:

INSERT INTO tabelle (feld) VALUES ('hochkomma \'')

Was macht nun der MySQL-Server? Er verarbeitet den String, genauso wie ein Browser HTML verarbeitet oder PHP den Sourcecode Deiner Seite. Beim Verarbeiten dieses Strings erhält er folgende Informationen:

* Du willst etwas in eine Tabelle einfügen (INSERT INTO)
 * Der Name der Tabelle ist "tabelle"
 * Du willst folgendes Feld füllen: "feld"
 * Der Wert des Felds ist: "hochkomma '"

Wozu also in diesem Fall der ? Weil der MySQL-Server nur einen String als Befehl zu Gesicht bekommt, muss er Wissen, wo *innerhalb* dieses Befehlsstrings denn tatsächlich Strings im SQL-Sinne auftauchen. Diese werden in SQL-Befehlen durch ' begrenzt. Wenn in dem String selbst jetzt ein ' vorkommen soll, muss es (im Falle von MySQL, bei anderen DBs ist das anders) mit \ maskeirt werden, damit MySQL nicht annimmt, dass der String schon zuende ist.

Betrachten wir nun Fall 2, mit Prepared Statements: Dort sendest Du *zwei* Zeichenketten an den MySQL-Server. Die eine ist:

INSERT INTO tabelle (feld) VALUES (:wert)

Die andere ist:

hochkomma '

Wenn der Server nun den SQL-Befehl verarbeitet, dann erfährt er folgendes:

* Du willst etwas in eine Tabelle einfügen (INSERT INTO)
 * Der Name der Tabelle ist "tabelle"
 * Du willst folgendes Feld füllen: "feld"
 * Der Wert des Felds ist der Inhalt des zweiten mitgesendeten Strings

Das heißt: Die Verarbeitung des SQL-Befehls kann erfolgen, ohne dass der MySQL-Server auch nur einen *EINZIGEN* SQL-String aus dem Befehl extrahieren muss. Denn der Befehl enthält nur einen Hinweis für den Server "such Dir den String aus einer anderen Quelle" - und diese andere Quelle ist dann eben der zweite String, den Du dem MySQL-Server in Deiner Anfrage mitschickst.

Wird das ganze jetzt etwas klarer?

Viele Grüße,
Christian