Oliver: textarea in MySQL abspeichern

Hallo
ich habe eine Frage, auf welche ich weder hier noch wo anders im Web eine Antwort gefunden habe, und hoffe, dass mir jemand weiterhelfen kann.

Ich will auf einer php Seite ein Formular haben, und den Inhalt von diesem in eine MySQL DB abspeichern. Das ist ansich einfach, aber ich schaffe es absolut nicht ein Textfeld richtig zu übermitteln.

Mein Quelltext dazu:
----------------------------
<?php

if ($_SERVER['REQUEST_METHOD'] == 'POST')
{
 $was = $_POST['was'];
 $zeile= $_POST['zeile'];
 $textfeld= $_POST['textfeld'];

if($was=='neu')
 {
  $query = "insert into tabelle values(NULL,'";
  $query .=$zeile."','";
  $query .=$textfeld."');";
  mysqli_query($link, $query);
 }
}

?>

<form action="selbe_seite.php" " method="post">
<input type="hidden" name="was" value="neu">
<input type="text" name="zeile" value="Text">
<textarea name="textfeld" cols="30" rows="3" wrap="off">Text mit Umbruch</textarea><p>
<input type="submit" value="Speichern">
</form>

----------------------------

Beschreibung:
Die Tabelle heißt tabelle und besteht aus einer fortlaufenden Nummer, einer Textzeile (zeile) und einem Textfeld (textfelt).
Die Zeile wird richtig übergeben, und richtig gespeichert, aber beim Textfeld werden die Zeilenumbrüche durch Lehrzeichen ersetzt.

Zuerst dachte ich es liegt am wrap, aber mozilla unterstützt nur "off", und das macht es auch nicht besser.

Mittlerweile habe ich keine Ahnung mehr, wie ich das richtig, oder anders lösen könnte. Darum bitte ich um eure unterstützung.

Nochmal das Problem:

  1. Bei der übergabe vom <textarea> im <form> werden die Zeilenumbrüche entfernt.
  2. Wie kann ich dass dann mit Zeilenumbrüchen in die MySQL DB abspeichern?

Falls mir jemand weiter helfen kann, bitte ich um eine Antwort.

  1. Hallo,

    Ich würde mal die Benutzereingaben escapen, sonst gibt`s SQL-Injections.

    Gruß

    1. danke josh,

      ich habe von dieser Sicherheitslücke noch nicht gehört, werde aber in Zukunft darauf achten, und die eingabe von $was so umändern:

      $was=htmlspecialchars($_GET['was']);

      hoffe, dass stimmt so.

  2. Nochmal das Problem:

    1. Bei der übergabe vom <textarea> im <form> werden die Zeilenumbrüche entfernt.
    2. Wie kann ich dass dann mit Zeilenumbrüchen in die MySQL DB abspeichern?

    Wie hast du festgestellt, dass die Zeinenumbrüche weg sind?
    Gib mal den Inhalt, der in der Datenbank gespeichert wurde / werden soll in einem <pre>-Element aus.
    Ich bezweifle, dass die Zeilenumbrüche einfach weg sind.

    Ausserdem solltest du wie schon gesagt mysql_real_escape_string() verwenden.

    --
    LG,
    Snafu
  3. Hi,

    $query = "insert into tabelle values(NULL,'";

    ----------------------------------^
    Hier fehlt die Angabe der Spalten, die verwendet werden.
    (Es mag zwar auch ohne funktionieren, aber sobald was an der Tabellenstruktur geändert wird, kann's schiefgehen)

    1. Bei der übergabe vom <textarea> im <form> werden die Zeilenumbrüche entfernt.

    Echte Zeilenumbrüche oder das zufällige Umbrechen durch word-wrapping?

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
    1. Hallo MudGuard,

      Danke für die Antwort.

      Echte Zeilenumbrüche werden abgeschnitten.

      Also alles was ich will, ist wie in einem Forum einen Text verfassen zu können, und diesen dann in eine MySQL DB abspeichern, damit ich den Text dannach genau so wie er geschrieben wurde wieder ausgeben kann.

      Bitte nochmals um eine Antwort.

      1. Hi,

        Echte Zeilenumbrüche werden abgeschnitten.

        Das glaube ich dir nicht.

        Ich glaube eher, dass dir, wie so viele anderen vor dir, die diese Frage gestellt haben, einfach nicht bewusst ist [1], dass einfache "Zeilenumbrueche" in den meisten HTML-Elementen nur als ein Leerzeichen dargestellt werden - fuer Zeilenumbrueche in normalem Fliesstext ist das BR-Element zustaendig. Also musst du die Zeilenumbrueche in dieses Element umwandeln - dafuer gibt's in PHP die Funktion nl2br() [2].

        [1] Erst mal mit HTML umgehen lernen, Kids - und dann mit PHP anfangen ...
        [2] nl2br "wandelt" nicht wirklich um, sondern ergaenzt ein <br /> vor den Zeilenumbruchzeichen.

        MfG ChrisB

        --
        "The Internet: Technological marvel of marvels - but if you don't know *what* you're lookin' for on the Internet, it is nothing but a time-sucking vortex from hell."
        1. Hi,

          Echte Zeilenumbrüche werden abgeschnitten.

          Das glaube ich dir nicht.

          Ich glaube eher, dass dir, wie so viele anderen vor dir, die diese Frage gestellt haben, einfach nicht bewusst ist [1], dass einfache "Zeilenumbrueche" in den meisten HTML-Elementen nur als ein Leerzeichen dargestellt werden - fuer Zeilenumbrueche in normalem Fliesstext ist das BR-Element zustaendig. Also musst du die Zeilenumbrueche in dieses Element umwandeln - dafuer gibt's in PHP die Funktion nl2br() [2].

          Ich es zwar gut, dass du die Funktion nl2br() erklärst,

          [1] Erst mal mit HTML umgehen lernen, Kids - und dann mit PHP anfangen ...

          aber du musst ja nicht so tun als wärst du Gott und wüsstest alles.

          [2] nl2br "wandelt" nicht wirklich um, sondern ergaenzt ein <br /> vor den Zeilenumbruchzeichen.

          MfG ChrisB

        2. Danke, nl2br() funktioniert sehr gut.
          Aber ich habe jetzt das weitere Problem, dass ich den Text nachträglich nicht mehr ändern kann.

          Also wenn ich die Textvariable aus der DB, nicht normal, sondern wieder in eine Textarea lade, dann ist der Quellcode ausgeschrieben(also <br /> sichtbar). wenn ich es dann neu speichere, wird bei einer neuen normalen ausgabe immer nurmehr der Quellcode ausgegeben.

          Bitte nochmals um eine Hilfe.

          1. Hello,

            Danke, nl2br() funktioniert sehr gut.

            Das wendet man aber erst bei der Ausgabe des Textes im normalen HTML-Context an, also nicht in in Textareas!

            In der Datenbank solltet Du nur die Rohdaten speichern und nicht die für einen bestimmten Kontext manipulierten.

            Ein harzliches Glückauf

            Tom vom Berg

            --
            Nur selber lernen macht schlau
            http://bergpost.annerschbarrich.de
  4. Hello Oliver,

    if(isset($_POST['was'] and $_POST['was'] == 'neu'))
    {

    }

    1. Verbindung zum Datenbankserver aufbauen
    2. Datenbank auswählen
    3. Werte für den Einbau ins Query vorbereiten!
       Dazu benutzt Du in diesem Fall

    $textfeld = mysql_real_escape_string($_POST['textfeld'],$con);

    Das Textfeld MUSS vor der Übergabe an das Query (Textschnittstelle)
       vorbereitet werden, sonst machen Dir die Zeilenumbrüche oder andere
       Sonderzeichen das Query kaputt.

    4. Bei der spräteren Ausgabe in einem value-Attribug eines Dialogelementes
       muss die Vorbereitung für HTML durchgeführt werden.
       Alle HTML-typischen Zeichen müssen codiert werden -> htmlspecialchars()
       Der String muss auf jeden Fall in Häkchen eingeschlossen werden, da seine
       Whitespaces (zeilenumbrüche) sonst den HTML-Kontext stören.

    Ein harzliches Glückauf

    Tom vom Berg

    --
    Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de