Julia: addslahes liefert nicht das gewünschte Ergebnis

Hi,
ich habe ein php-Formular, dessen Eingaben ich erst nach Behandlung mit addslashes in die mysql-Datenbank speichere. Das Escapen scheint dabei aber nicht wie gewünscht zu funktionieren.
Ein String wie \ ' steht auch genauso in der Datenbank. Wenn ich mir die Werte aus der Datenbank mit stripslashes anzeigen lassen will, wird daraus natürlich \ '
Was mache ich falsch?

Viele Grüße,
Julia

  1. Hallo,

    ich habe ein php-Formular, dessen Eingaben ich erst nach Behandlung mit addslashes in die mysql-Datenbank speichere.

    die Funktion addslashes hat im Zusammenhang mit einer Datenbank nichts verloren. Belasse die Daten lieber in ihrem ursprünglichen Zustand und speichere sie mit der MySQL-Funktion mysql_real_escape_string() in der Datenbank.

    Oder wie hier des öfteren zu lesen ist, behandele die Daten immer Kontextspezifisch.

    Grüße, Matze

  2. Hi,

    ich habe ein php-Formular, dessen Eingaben ich erst nach Behandlung mit addslashes in die mysql-Datenbank speichere.

    Das ist in aller Regel Unfug.
    Nutze die Funktionalitaet, die die DB-Schnittstelle dir dafuer zur Verfuegung stellt. Bei MySQL ist dies bspq. mysql_real_escape_string().

    Das Escapen scheint dabei aber nicht wie gewünscht zu funktionieren.
    Ein String wie \ ' steht auch genauso in der Datenbank. Wenn ich mir die Werte aus der Datenbank mit stripslashes anzeigen lassen will, wird daraus natürlich \ '
    Was mache ich falsch?

    Dir ist nicht klar, wozu das Escapen dient. Es dient ausschliesslich dazu, dass die DB-Schnittstelle dich nicht missversteht. Der Text Hans' Auto waere missverstaendlich, wenn du ihn in einem SQL-Statement als 'Hans' Auto' notierst - da waere der String schon nach Hans wieder zu Ende.
    Also escaped man 'Hans' Auto' - damit ist das fuer die Schnittstelle verstaendlich. Die eigentlichen Daten soll das aber natuerlich nicht versauen - man will ja Hans' Auto in die DB eintragen. Und genau so versteht die das auch - es steht dann wirklich nur Hans' Auto in der DB, alles andere waere ja bloedsinnig. Und deshalb ist es auch absolut ueberfluessig, nach dem Auslesen aus der Datenbank, die dir ja nur Hans' Auto wieder zurueckgibt, das Escapen wieder "rueckgaengig" machen zu wollen - es _gibt_ nichts rueckgaengig zu machen.

    MfG ChrisB

  3. Hallo Julia,

    Ein String wie \ ' steht auch genauso in der Datenbank. Wenn ich mir die Werte aus der Datenbank mit stripslashes anzeigen lassen will, wird daraus natürlich \ '

    zum einen solltest Du den Hinweis von Matze berücksichtigen.

    Was mache ich falsch?

    Du wendest stripslashes an, das ist ebenfalls ein Fehler.

    Freundliche Grüße

    Vinzenz

  4. Hi,
    man kann nicht alles wissen... aber dazulernen

    Danke euch allen!

    Viele Grüße,
    Julia

  5. echo $begrüßung;

    ich habe ein php-Formular, dessen Eingaben ich erst nach Behandlung mit addslashes in die mysql-Datenbank speichere. Das Escapen scheint dabei aber nicht wie gewünscht zu funktionieren.
    Ein String wie \ ' steht auch genauso in der Datenbank. Wenn ich mir die Werte aus der Datenbank mit stripslashes anzeigen lassen will, wird daraus natürlich \ '

    Bisher nicht erwähnt wurde noch ein PHP-Feature namens Magic Quotes. Wenn das aktiviert ist, wendet es bereits selbständig addslashes() auf sämtliche Eingabedaten an. Sowas gehört sich nicht. Daten müssen dem Ausgabemedium entsprechend behandelt werden, nicht generell auf Verdacht für ein einziges spezifisches und dann noch dazu nicht richtig. addslashes() und Magic Quotes berücksichtigen nicht alle Zeichen, die für MySQL beachtet werden müssen. Möchte man die Eingabedaten gar nicht in eine Datenbank ausgeben sondern beispielsweise in ein HTML-Dokument (z.B. beim Affenformular), dann sind die Slashes komplett fehl am Platz. Hier muss htmlspecialchars() angewendet werden.

    Vorschlag: Versuche die Magic Quotes zu deaktivieren. Wenn das nicht generell geht, verwende das Codebeispiel auf der verlinkten Seite einmalig am Scriptanfang, um die Auswirkungen der Magic Quotes rückgängig zu machen. Verwende vor einer Datenausgabe die speziell für dieses Medium vorgesehene Behandlung.

    echo "$verabschiedung $name";