dedlfix: Probleme mit mysql_real_escape_string()

Beitrag lesen

echo $begrüßung;

Wenn du die Funktion auf den Text anwendest und ihn dann in die Datenbank schreibst, steht in der Tabelle nur der Text ohne Slashes. Bei der Abfrage aus der Datenbank werden standardmäßig keine Slashes mehr hinzugefügt.

Also so wie ich das sehe, werden durch die mysql_real_escape_string() funktion dem Text Slashes hinzugefügt (bei Anführungszeichen etc.) und so wird der Text dann auch in die Datenbank geschrieben (also mit Slashes).

Nein, die Slashes werden nur benötigt, weil die Daten über eine Text-Schnittstelle (das SQL-Statement) transportiert werden sollen. Man muss da ja unterscheiden können, ob bestimmte Zeichen zu den Daten gehören oder Statement-Bestandteil sind. Der Server entfernt beim Analysieren des Statments diese Maskierungen und trägt die Daten in Rohform in die Felder ein.

Wenn ich den Text dann wie gewohnt ausgeben lasse, stehen die Slashes noch immer da... Deswegen wende ich jetzt vor der Ausgabe stripslashes() an, damit der Text wieder normal dasteht. Ich hoffe, das ist eine gute Lösung, habe aber bisher nichts gegenteiliges entdecken können.

Das kommt davon, weil du nun doppelt maskierst. Zum einen wirken die Magic Quotes und zum anderen machst du das auch noch händisch mit mysql_real_escape_string(). Da die Magic Quotes nicht sämtliche Zeichen berücksichtigen, ein aussterbendes Feature sind (PHP6) und obendrein auch noch immer wirken, auch wenn man sie grad nicht haben möchte (z.B. in einem Vorschauformular), solltest du sie auszuschalten versuchen, oder, wenn das nicht geht, ihre Auswirkungen rückgängig machen. Jedes Script, das mit externen Daten (EGPCS-Arrays = $_*) arbeitet, sollte das auf der Seite Disabling Magic Quotes angeführte Beispiel einmalig am Anfang ausführen, um die Eingabedaten Magic-Quotes-frei zu bekommen.

Die Lösung, stripslashes() erst auf die Ausgabedaten anzuwenden, ist nicht besonders sinnvoll, da damit in der Datenbank maskierte Daten zu stehen kommen, mit denen man schlecht Stringverarbeitung betreiben kann. Die Slashes erhöhen die String-Länge, beim Teilstring-Bilden darf man sie nicht vom nachfolgenden Zeichen trennen, bei der Sortierung werden sie als normales Zeichen angesehen, usw. usf.

Eine andere, modernere Alternative zum händischen Maskieren der Daten sind Prepared Statements. Hier wird der Befehl mit Platzhaltern notiert, in die dann die Daten eingefügt werden. Um die ordnungsgemäße Übertragung der Daten kümmert sich die Datenbankschnittstelle selbst. Entweder werden Statement und Daten gleich getrennt übertragen (z.B. mysqli) oder die Daten werden von der Schnittstelle entsprechend behandelt in die Statements eingefügt (PDO mit Datenbanken ohne Prepared Statements).
Prepared Statements werden von der MySQL Improved Extension oder von den PDO Functions - eine allgemeine Datenbankabstraktionsschicht - zur Verfügung gestellt.
Natürlich gilt auch hier, dass die Magic Quotes zunächst aus den Daten entfernt werden müssen, da sie sonst als Bestandteil der Daten angesehen werden.

echo "$verabschiedung $name";