Maik: Text aus Textarea speichern und laden - genauso wie gespeichert

Hallo,

auch nach längerem Probieren und Studieren von Forenbeiträgen bin ich nicht dahintergekommen, wie man es hinbekommt, dass man einen Text aus einer Textarea, der Zeilenumbrüche enthalten kann, in einer Datenbank speichert und ihn später wieder so in diese Textarea reinlädt, dass er genauso ausschaut wie vorher.

Ich möchte dabei eigentlich keinen HTML-Code in die Datenbank kriegen.

Mit stripslashes, urlencode, urldecode, nl2br, usw. hab ich es bisher nicht hinbekommen, vielleicht falsche Reihenfolge...?

Welche Reihenfolge von welchen Funktionen auf den jeweiligen POST-String angewandt empfehlt Ihr?

Gruß Maik

  1. Welche Reihenfolge von welchen Funktionen auf den jeweiligen POST-String angewandt empfehlt Ihr?

    Gruß Maik

    Gar keine. Der Browser sendet (je nach BS) \r\n oder \n für einen Zeilenumbruch. Das kannst Du so direkt in der DB speichern und später wieder in einer Textarea ausgeben. HTML-Entitäten funktionieren da nicht (also einfach so ausgeben, wie´s in der DB steht).

    1. Welche Reihenfolge von welchen Funktionen auf den jeweiligen POST-String angewandt empfehlt Ihr?

      Gar keine. Der Browser sendet (je nach BS) \r\n oder \n für einen Zeilenumbruch. Das kannst Du so direkt in der DB speichern und später wieder in einer Textarea ausgeben. HTML-Entitäten funktionieren da nicht (also einfach so ausgeben, wie´s in der DB steht).

      Die Idee hatt ich auch schon :), aber was beim Eingeben wie ein Zeilenumbruch ausschaut, schaut beim Wiedereinlesen und Ausgeben in der Textarea aus wie "\r\n".

      Alles Herumbasteln mit add- und stripslashes half so weit noch nichts.

      Diesbezüglich hoff ich noch auf einen Trick-Tip... ;)

      1. Welche Reihenfolge von welchen Funktionen auf den jeweiligen POST-String angewandt empfehlt Ihr?

        Gar keine. Der Browser sendet (je nach BS) \r\n oder \n für einen Zeilenumbruch. Das kannst Du so direkt in der DB speichern und später wieder in einer Textarea ausgeben. HTML-Entitäten funktionieren da nicht (also einfach so ausgeben, wie´s in der DB steht).

        Die Idee hatt ich auch schon :), aber was beim Eingeben wie ein Zeilenumbruch ausschaut, schaut beim Wiedereinlesen und Ausgeben in der Textarea aus wie "\r\n".

        Alles Herumbasteln mit add- und stripslashes half so weit noch nichts.

        Diesbezüglich hoff ich noch auf einen Trick-Tip... ;)

        Wenn magic quotes an sind, mußt Du stripslashes anwenden, sonst Du hast solche Einträge \r (also ein Slash zuviel).

    2. hi,

      Der Browser sendet (je nach BS) \r\n oder \n für einen Zeilenumbruch. Das kannst Du so direkt in der DB speichern und später wieder in einer Textarea ausgeben. HTML-Entitäten funktionieren da nicht (also einfach so ausgeben, wie´s in der DB steht).

      Nein, nicht "einfach so" ausgeben - sondern _wie immer_ die Kodierung/Maskierung vornehmen, die der jeweilige Kontext, in den die Daten überführt werden sollen, erfordert.

      Wenn du HTML-eigene Zeichen unbehandelt in einer Textearea ausgibst, schaust du nämlich dumm aus der Wäsche, wenn ein Nutzer in seinem Text </textarea> verwendet.

      gruß,
      wahsaga

      --
      /voodoo.css:
      #GeorgeWBush { position:absolute; bottom:-6ft; }
  2. Hiho!

    auch nach längerem Probieren und Studieren von Forenbeiträgen bin ich nicht dahintergekommen, wie man es hinbekommt, dass man einen Text aus einer Textarea, der Zeilenumbrüche enthalten kann, in einer Datenbank speichert und ihn später wieder so in diese Textarea reinlädt, dass er genauso ausschaut wie vorher.

    Hm. Ich wuerd ihn einfach speichern und wieder rausholen. Natuerlich gibts da ein paar Sachen zu beachten. dazu spaeter.

    Ich möchte dabei eigentlich keinen HTML-Code in die Datenbank kriegen.

    Gibt es dafuer nen Grund? Darf ich dann in die Textbox keinen HTML Code schrieben?

    Mit stripslashes, urlencode, urldecode, nl2br, usw. hab ich es bisher nicht hinbekommen, vielleicht falsche Reihenfolge...?

    Erklaer doch mal genau was Dein Problem ist. Das einzige Problem, das mir Spontan einfaellt sind Anfuehrungsstriche. Also " und '. Die muesstest Du maskieren. also spaetestens bei der Ausgabe viellicht in HTML codes umwandeln.

    Welche Reihenfolge von welchen Funktionen auf den jeweiligen POST-String angewandt empfehlt Ihr?

    Zum speichern? Was willst Du denn da filtern, ausser vielleicht wieder die " und ' zu maskieren.

    1. Evtl. magic quotes entfernen. Dann mit mysql_real_escape_string() maskieren.

    2. Zum speichern? Was willst Du denn da filtern, ausser vielleicht wieder die " und ' zu maskieren.

      Ich möcht in der Textarea einen vorher eingegebenen Zeilenumbruch eben wieder als solchen bekommen und nicht als \r\n. ;)

      1. Zum speichern? Was willst Du denn da filtern, ausser vielleicht wieder die " und ' zu maskieren.

        Ich möcht in der Textarea einen vorher eingegebenen Zeilenumbruch eben wieder als solchen bekommen und nicht als \r\n. ;)

        Steht denn da "\r\n" in dem Text?

        1. Zum speichern? Was willst Du denn da filtern, ausser vielleicht wieder die " und ' zu maskieren.

          Ich möcht in der Textarea einen vorher eingegebenen Zeilenumbruch eben wieder als solchen bekommen und nicht als \r\n. ;)

          Steht denn da "\r\n" in dem Text?

          Nach dem Reinladen aus der Datenbank und dem Schreiben in die Textarea schon, das ist im Moment mein Problem. Ich komm nicht dahinter, welche Funktion an welcher Stelle da die richtige wär. ;)

  3. Moin!

    Welche Reihenfolge von welchen Funktionen auf den jeweiligen POST-String angewandt empfehlt Ihr?

    Die Sache ist eigentlich sehr simpel. Den Kreislauf beginne ich nach dem Absenden einer gefüllten Textarea:

    Der Inhalt einer Textarea kommt dir in $_POST['text'] entgegen.

    Du mußt prüfen, ob magic_quotes_gpc aktiviert sind. Ist das der Fall, mußt du stripslashes() auf $_POST['text'] anwenden:

      
    if (get_magic_quotes_gpc()) { $_POST['text']=stripslashes($_POST['text']); }  
    
    

    Dann muß der Text in die Datenbank. Dazu ist zwingend mysql_real_escape_string() oder mysqli_escape_string() (je nachdem, welche MySQL-Bibliothek verfügbar ist) zu verwenden:

      
    $sql = "INSERT INTO tabelle ('textareafeld') VALUES ('".mysql_real_escape_string($_POST['text'])."')";  
    mysql_query($sql);  
    
    

    Damit endet der erste Teil, die Daten sind gesichert.

    Auslesen aus der Datenbank geht wie bekannt:

      
    $sql = "SELECT textareafeld FROM tabelle LIMIT 1";  
    mysql_query($sql);  
    $daten = mysql_fetch_assoc(...);  
    
    

    Damit steckt dein Text in $daten['textareafeld'].

    Die Ausgabe in eine Textarea in HTML erfordert htmlspecialchars() zur Maskierung der HTML-eigenen Zeichen <, > und &, die eventuell im Text enthalten sein könnten:

      
    echo "<textarea name='text' cols='20' rows='20'>";  
    echo htmlspecialchars($daten['textareafeld']);  
    echo "</textarea>";  
    
    

    Und schon steht der Text wieder genauso in der Textarea, wie er vorher eingegeben wurde - inklusive aller Zeilenumbrüche.

    Wenn du diese Textarea jetzt wieder an das Speicherskript schickst, schließt sich der Kreislauf (wobei Speicherung auch als UPDATE laufen kann, um den alten Zustand zu überschreiben).

    Ein Wort zur Zeichencodierung: Wenn du überall, also auf allen HTML-Seiten und in der Datenbank, UTF-8 als Codierung benutzt, ist der dargestellte Kreislauf wirklich universell für alle eingebbaren Zeichen der Welt. Wenn du hingegen eine vom Zeichenumfang eingeschränktere Codierung wie ISO-8859-1 benutzt (hat kein Eurozeichen!), werden dir alle Zeichen verloren gehen, die mit dieser Codierung nicht dargestellt werden können - und du kannst dagegen nicht das geringste tun! UTF-8 ist daher extrem empfehlenswert.

    - Sven Rautenberg

    --
    "Love your nation - respect the others."