Ines: der Input wird geändert beim schreiben in die Datenbank, bzw. aus der Datenbank

Ich versuche einen Text, kann auch Programmiercode sein, mittels Formular in eine MYSQL Datenbank zu schreiben.

Diesen möchte ich anschließend genauso wieder ausgeben.

Das ist ein Beispieltext der in die Datenbank soll.

$test=array(' ','ö','ä','ü','Ö','Ä','Ü','ß');
so könnte es
aussehen.

Ich übergebe ihn so in die Datenbank. mysql_real_escape_string($string);

Wenn ich sie wieder auslese, behandele ich den String dann wie folgt:

nl2br(htmlspecialchars(stripslashes($string)))

Doch leider ist kein Zeilenvorschub mehr vorhanden und auch zusätzlich solche Einblendungen \n, \r habe ich neu.

Wie kann ich vorgehen um die Daten Korrekt wiederzugeben.

Danke

mfg Ines

  1. Tach!

    Ich übergebe ihn so in die Datenbank. mysql_real_escape_string($string);

    Wenn ich sie wieder auslese, behandele ich den String dann wie folgt:

    nl2br(htmlspecialchars(stripslashes($string)))

    Wofür verwendest du hier das stripslashes()?

    Wie kann ich vorgehen um die Daten Korrekt wiederzugeben.

    Lies und versteh den Kontextwechsel.

    dedlfix.

  2. Hallo,

    Das ist ein Beispieltext der in die Datenbank soll.

    $test=array(' ','ö','ä','ü','Ö','Ä','Ü','ß');
    so könnte es
    aussehen.
    

    Ich übergebe ihn so in die Datenbank.

    mysql_real_escape_string($string);
    

    das ist soweit schon mal gut. Damit ist beim Weg in die DB hinein der Kontextwechsel berücksichtigt.

    Wenn ich sie wieder auslese, behandele ich den String dann wie folgt:

    nl2br(htmlspecialchars(stripslashes($string)))
    

    Wenn du den Text wieder im HTML-Kontext ausgibst, ist htmlspecialchars() natürlich korrekt. Aber was willst du an der Stelle mit stripslashes()?

    Doch leider ist kein Zeilenvorschub mehr vorhanden und auch zusätzlich solche Einblendungen \n, \r habe ich neu.

    Die Steuerzeichen \r und \n sind Zeilenumbrüche. Und nl2br() ersetzt sie dann durch \r\n<br />, so dass nicht nur im Quelltext, sondern auch in der HTML-Ausgabe ein Zeilenumbruch zu sehen ist

    Wie kann ich vorgehen um die Daten Korrekt wiederzugeben.

    Als erstes würde ich an der Stelle mal stripslashes() entsorgen. Das sieht kaputt aus und passt an der Stelle nicht ins Konzept.

    So long,
     Martin

    --
    Bei der Umsetzung von guten Ideen hapert es meist viel mehr an der Wolle als an der Könne.
    1. So jetzt habe den behandlung des Ausgabestirng bearbeitet.

      Wenn ich den String in die Datenbank einfüge

      $test=array(' ','ö','ä','ü','Ö','Ä','Ü','ß');
      so könnte es
      aussehen.
      

      mysql_real_escape_string($string);

      dann steht es so in der Datenbank

      $test=array(\' \',\'ö\',\'ä\',\'ü\',\'Ö\',\'Ä\',\'Ü\',\'ß\');\r\nso könnte es\r\naussehen.
      

      und wenn ich es auslese, steht es auch genaus so da:

      $test=array(\' \',\'ö\',\'ä\',\'ü\',\'Ö\',\'Ä\',\'Ü\',\'ß\');\r\nso könnte es\r\naussehen.
      

      Wie bekomme ich den die maskierung wieder weg und den Zeilenvorschub richtig angezeigt

      1. Tach!

        dann steht es so in der Datenbank

        Wie schaust du denn in die Datenbank rein? Das ist doch nur ein Haufen Binärdaten. Abfragen und anzeigen lassen ist nicht gleichzusetzen mit einem unverändernden Reinschauen, denn beim abfragen und anzeigen lassen sind schon wieder eine Menge Prozesse beteiligt, die Umwandlungen vorgenommen haben können. Schaust du allerdings mit dem phpMyAdmin, dann kann man davon ausgehen, dass der das alles richtig macht und 1:1 anzeigt.

        Wie bekomme ich den die maskierung wieder weg und den Zeilenvorschub richtig angezeigt

        Die Frage ist eher, wie bekommst du die gar nicht erst in die Datenbank rein. Irgendwas machst du da zu viel. Aber was das ist, kann man auf dem Bisschen, was du hier zeigst, nicht erkennen.

        Verwendest du vielleicht Prepared Statements? Dann wäre das mysql_real_escape_string() falsch. Außerdem gehört diese Funktion zur mysql-Extension von PHP, die bereits auf dem Abstellgleis steht. Nimm mysqli oder PDO.

        dedlfix.

        1. Wie schaust du denn in die Datenbank rein?

          mit dem phpMyAdmin.

          Wie bekomme ich den die maskierung wieder weg und den Zeilenvorschub richtig angezeigt

          Die Frage ist eher, wie bekommst du die gar nicht erst in die Datenbank rein. Irgendwas machst du da zu viel. Aber was das ist, kann man auf dem Bisschen, was du hier zeigst, nicht erkennen.

          $SQLString = "INSERT INTO table010 (inhalt) VALUES ('".mysql_real_escape_string($string)."')"; $Ergebnis = mysql_query($SQLString);

          1. mysql_real_escape_string($string);

            Warnung: Diese Erweiterung ist seit PHP 5.5.0 als veraltet markiert und wird in der Zukunft entfernt werden.

            Heisst das wiederrum, wenn ich 5.5 oder höher laufen habe brauche ich kein

            mysql_real_escape_string

            1. Tach!

              mysql_real_escape_string($string);

              Warnung: Diese Erweiterung ist seit PHP 5.5.0 als veraltet markiert und wird in der Zukunft entfernt werden.

              Heisst das wiederrum, wenn ich 5.5 oder höher laufen habe brauche ich kein mysql_real_escape_string

              Nein, das heißt, wie ich bereits schrieb, dass die gesamte mysql-Extension (sprich: alle Funktionen, die mit mysql_ beginnen) veraltet ist. Nimm mal lieber PDO. Eine Maskierfunktion kannst du dir nur dann sparen, wenn du Daten nicht mehr in Statements einbetten musst. Prepared Statements wäre eine Methode, bei der man das nicht braucht, weil die Daten separat übergeben werden und im Statement nur noch Platzhalter stehen. Die gibt es in PDO und auch in mysqli, aber noch nicht in mysql.

              dedlfix.

          2. Tach!

            Wie schaust du denn in die Datenbank rein?

            mit dem phpMyAdmin.

            $SQLString = "INSERT INTO table010 (inhalt) VALUES ('".mysql_real_escape_string($string)."')";
            $Ergebnis = mysql_query($SQLString);

            Soweit so gut. Aber dann sind deine Daten wohl anscheinend schon vorher maskiert. Schau doch mal, was echo urlencode($string); anzeigt. (urlencode() ist eigentlich keine Debug-Funktion, kann aber besser als bin2hex() für diesen Zweck verwendet werden.)

            dedlfix.

            1. echo urlencode($string);

              Sch....e

              Ja, ich habe den String wirklich zweimal mit mysql_real_escape_string behandelt.... IHR HABT ALLE RECHT GEHABT:

              Doch nun ist alles korrekt in der Datenbank, wenn ich es nun ausgeben

              htmlspecialchars($string);

              habe ich aber keinenZeilenvorschub.

              nl2br(htmlspecialchars($string));

              muss ich dann wohl doch noch den string mit nl2br

              behandeln.

              1. Tach!

                wenn ich es nun ausgeben

                htmlspecialchars($string);

                habe ich aber keinenZeilenvorschub.

                Doch, den hast du. In der Quelltextansicht im Browser siehst du sie alle. Der Browser zeigt sie aber nicht an, wenn man das nicht richtig stylet (beispielsweise mit der CSS-Eigenschaft: white-space) oder auszeichnet (<pre>…</pre>).

                muss ich dann wohl doch noch den string mit nl2br behandeln.

                Das geht auch, nur werden da die Semantiker Bedenken äußern. Das ist aber abhängig vom Anwendungsfall zu beurteilen.

                dedlfix.

              2. Hi,

                habe ich aber keinenZeilenvorschub.

                nl2br(htmlspecialchars($string));

                muss ich dann wohl doch noch den string mit nl2br behandeln.

                ja, das auf jeden Fall. Ein normaler Zeilenumbruch gilt im HTML-Quelltext als Whitespace, wird also genauso behandelt wie ein Leerzeichen.

                So long,
                 Martin

                --
                Bei der Umsetzung von guten Ideen hapert es meist viel mehr an der Wolle als an der Könne.
      2. Tach,

        Wenn ich den String in die Datenbank einfüge

        $test=array(' ','ö','ä','ü','Ö','Ä','Ü','ß');
        so könnte es
        aussehen.
        

        mysql_real_escape_string($string);

        dann steht es so in der Datenbank

        $test=array(\' \',\'ö\',\'ä\',\'ü\',\'Ö\',\'Ä\',\'Ü\',\'ß\');\r\nso könnte es\r\naussehen.
        

        nein, das würde nur so in der Datenbank landen, wenn zweimal mysql_real_escape_string (o.ä.) darauf ausgeführt wird.

        und wenn ich es auslese, steht es auch genaus so da:

        $test=array(\' \',\'ö\',\'ä\',\'ü\',\'Ö\',\'Ä\',\'Ü\',\'ß\');\r\nso könnte es\r\naussehen.
        

        Wie bekomme ich den die maskierung wieder weg und den Zeilenvorschub richtig angezeigt

        Falls das in der Datenbank tatsächlich (wie genau hast du das überprüft?) so drin steht, wird beim Schreiben in die Datenbank einmal zu viel escaped; wie sieht dein kompletter Prozess für das Schreiben in die DB aus?

        mfg
        Woodfighter