Torsten: Text eines textarea in Datenbank speichern

Hallo,

wie ist es möglich, einen Text mit Zeilenumbruch das über ein textarea eingegeben wurde auch mit Zeilenumbruch in der Datenbank zu speichern?

Wie ich die Daten in die Datenbank bekomme ist mir klar, die Frage bezieht sich lediglich auf die Zeilenumbrüche.

Gruß
Torsten

  1. Hi,

    wie ist es möglich, einen Text mit Zeilenumbruch das über ein textarea eingegeben wurde auch mit Zeilenumbruch in der Datenbank zu speichern?

    ohne Zutun.

    Wie ich die Daten in die Datenbank bekomme ist mir klar, die Frage bezieht sich lediglich auf die Zeilenumbrüche.

    Wieso glaubst Du, es bestünde ein Problem?

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hi,

      Wieso glaubst Du, es bestünde ein Problem?

      ich habe nicht gesagt das ich ein Problem habe.
      Die Sache ist nur die, Eingabe im textarea:

      hallo,
      viel viel viel
      viel viel viel
      text

      Ablage in der Datenbank:

      hallo, viel viel viel viel viel viel text

      Ich wollte eigentlich nur wissen wie ich Zeilenumbrüche mit in die Datenbank schicke.

      Gruß
      Torsten

      1. Hello,

        Ich wollte eigentlich nur wissen wie ich Zeilenumbrüche mit in die Datenbank schicke.

        Indem Du sie passend für die gewählte Schnittstelle zur Datenbank maskierst.
        Da es sich z.B. bei einer MySQL-Datenbank, die man mittels der üblichen PHP-API für MySQL bedient, über eine _Textschnittstelle_ handelt, müssen Sonderzeichen (Steuerzeichen) eben speziell vorbehandelt werden.

        Wenn Du eine Requester-API benutzen würdest, in der direkt (unter Umgehung der Textschnittstelle) in die DB geschrieben werden würde, dann wäre das nicht notwendig. Dort müsste nur der RAW-Bytestream abgeliefert werden, so wie es auch bei "Flatfiles" ist.

        Aber SQL ist nun mal eine Textschnittstelle.

        Daher müssen ja auch Bilder, die man in die DB insertieren will, vorher escaped werden!

        Harzliche Grüße vom Berg
        esst mehr http://www.harte-harzer.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
        1. Hallo Tom,

          also ehrlich gesagt habe ich jetzt überhaupt nichts von dem verstanden was Du mir versucht hast zu erklären.

          Den Text den ich über das textarea eingebe, anschließend abschicke, ist ein String von beliebiger Länge.

          Ich muss doch irgendwie dem String Zeilenumbrüche(<br> würde schon reichen) an beliebiger Stelle übergeben können. Wie?

          Gruß
          Torsten

          1. Hello Torsten,

            also ehrlich gesagt habe ich jetzt überhaupt nichts von dem verstanden was Du mir versucht hast zu erklären.

            Den Text den ich über das textarea eingebe, anschließend abschicke, ist ein String von beliebiger Länge.

            Ich muss doch irgendwie dem String Zeilenumbrüche(<br> würde schon reichen) an beliebiger Stelle übergeben können. Wie?

            Was haben denn die <br>-Tags in der Datenbank zu suchen?
            Die textarea _kann_ bei entsprechender Einstellung (wrap="virtual") und einem Browser, der das überhaupt macht, die eingegebenen Zeilenumbrüche mitsenden.

            Da stehen dann also nach HTTP-Spezifikation CRLF (\r\n) im Text drin, also die beiden Codes 13 dezimal und 10 dezimal. Das nennt man dann Zeilenumbruch.

            Die Textschnittstelle einer SQL-Datenbank verträgt diese Zeilenumbrüche innerhalb eines Wertes aber nicht, sondern verlangt nach einer Maskierung. Bei MySQL/PHP hilft da mysql_[real_]escape_string()
            http://de2.php.net/manual/de/function.mysql-escape-string.php. Und Textstrings natürlich in Häkchen übergeben!

            Nun lässt sich die DB-Schnittstelle den String gefallen und trägt ihn ein. In der Datenbank steht dann wieder nur der nackte String. Die Maskierungen gehen in der Schnittstelle wieder verloren.

            Da aber PHP ggf. schon eine Maskierung mittels "eingebautem" addslashes()
            http://de2.php.net/manual/de/function.addslashes.php durchgeführt hat, muss man diese erst wieder entfernen, bevor man mysql_[real_]escape_string() benutzt. Anderenfalls hat man in der DB verfremdete Werte stehen.

            Wenn man nun die Werte mittels Select wiederholt, muss man sie passend zum Ausgabemedium vorbereiten. Soll in der Textarea eines Browsers ausgegeben werden, muss man nur die HTML-Entitäten behandeln und ggf. auf den passenden Zeichensatz für die Ausgabe umcodieren (ASCII --> UTF-8), wenn dies gewünscht ist. Hat man die Zeichen schon in UTF-8 empfangen, und auch so abgespeichert, ist das natürlich nicht notwendig. Man muss sich also ein wenig mit dem Zustand seiner Daten in jedem Moment der Übertragungskette beschäftigen und darf nicht einfach irgendwo etwas verkurbeln.

            Wenn man die Werte in einem HTML-Bereich des Browsers ausgeben lassen will, muss man die im String enthaltenen Zeilenumbrüche erst noch durch die von Browsern verständlichen ergänzen, also den wie für die Textarea aufbereiteten String nochmals mit nl2br() behandeln.

            Ich hoffe, nun hast Du alles verstanden.

            Harzliche Grüße vom Berg
            esst mehr http://www.harte-harzer.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau
            1. Hi,

              Die textarea _kann_ bei entsprechender Einstellung (wrap="virtual") und einem Browser, der das überhaupt macht, die eingegebenen Zeilenumbrüche mitsenden.

              Falsch. Ein wrap-Attribut gibt es für textarea nicht.
              Siehe http://www.w3.org/TR/html401/interact/forms.html#h-17.7

              Vom User eingegebene Zeilenumbrüche müssen immer übertragen werden (denn sonst wäre es ja nicht ein "multiline text input control", sondern ein "under some circumstances which are not specified multiline otherwise single line text input control".

              Es steht nirgends im HTML-Standard, daß aus dem eingegebenen Text Zeilenumbrüche entfernt werden dürfen (es heißt: "the input text becomes the control's current value" - es heißt nicht: "the input text minus line-breaks becomes ...")

              Da stehen dann also nach HTTP-Spezifikation CRLF (\r\n) im Text drin,

              HTTP hat wenig damit zu tun. Das steht für application/x-www-form-urlencoded direkt im HTML-Standard (17.13.4, gleiche Seite wie oben verlinkt)
              Zur Kodierung von Zeilenumbrüchen bei multipart/form-data wird gar nichts gesagt - da dies dann im jeweiligen Mime-Type für den einzelnen Teil definiert ist.

              cu,
              Andreas

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

                Die textarea _kann_ bei entsprechender Einstellung (wrap="virtual") und einem Browser, der das überhaupt macht, die eingegebenen Zeilenumbrüche mitsenden.

                Falsch. Ein wrap-Attribut gibt es für textarea nicht.
                Siehe http://www.w3.org/TR/html401/interact/forms.html#h-17.7

                Das ist unter Berücksichtigung der Realität Unsinn!
                Aber das weißt Du doch selber.

                Vom User eingegebene Zeilenumbrüche müssen immer übertragen werden (denn sonst wäre es ja nicht ein "multiline text input control", sondern ein "under some circumstances which are not specified multiline otherwise single line text input control".

                Das wiederum mag ich so hinnehmen.
                Es können aber in real existenten Browsern locker welche hinzukommen

                Harzliche Grüße vom Berg
                esst mehr http://www.harte-harzer.de

                Tom

                --
                Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                Nur selber lernen macht schlau
                1. Moin!

                  Deine Aussage:

                  Die textarea _kann_ bei entsprechender Einstellung (wrap="virtual") und einem Browser, der das überhaupt macht, die eingegebenen Zeilenumbrüche mitsenden.

                  Mudguard:

                  Falsch. Ein wrap-Attribut gibt es für textarea nicht.
                  Siehe http://www.w3.org/TR/html401/interact/forms.html#h-17.7

                  Deine Aussage:

                  Das ist unter Berücksichtigung der Realität Unsinn!
                  Aber das weißt Du doch selber.

                  Deine erste Aussage ist wirklich falsch. Eine Textarea "kann" es sich nicht irgendwie aussuchen, ob sie die eingegebenen Zeilenumbrüche sendet oder nicht, sie ist dazu verpflichtet, es zu tun. Und alle Browser tun das auch so.

                  Das wrap-Attribut ist im HTML-Standard nicht existent. Einige Browser beachten es, weil sich irgendwer irgendwann einmal überlegt hat, dass es ganz nett wäre, wenn der Browser dem Textarea-Text noch zusätzliche Zeilenumbrüche hinzufügt oder auch den Textumbruch im Anzeigebereich eigenständiger regeln kann. Dieses Attribut macht die ganze Zeilenumbruchsgeschichte aber noch viel viel unübersichtlicher, und es ist faktisch eigentlich nur noch für den Netscape 4 von Interesse (aber nicht zwingend notwendig, der Browserbenutzer hat dann halt mit einer etwas nervigeren Textarea zu leben, die eine neue Zeile erst dann beginnt, wenn Return gedrückt wird - ansonsten scrollt man halt horizontal.

                  Bleibt also festzuhalten:
                  1. wrap ist überflüssig, man lasse es bitte weg.
                  2. Jeder Browser sendet eingegebene Zeilenümbrüche einer Textarea mit, immer. Nicht "kann".

                  Vom User eingegebene Zeilenumbrüche müssen immer übertragen werden (denn sonst wäre es ja nicht ein "multiline text input control", sondern ein "under some circumstances which are not specified multiline otherwise single line text input control".

                  Das wiederum mag ich so hinnehmen.
                  Es können aber in real existenten Browsern locker welche hinzukommen

                  Nur, wenn das wrap-Attribut benutzt wird - und solche unabsichtlichen Zeilenumbrüche sind dann ein PITA.

                  - Sven Rautenberg

                  1. Hello,

                    Nur, wenn das wrap-Attribut benutzt wird - und solche unabsichtlichen Zeilenumbrüche sind dann ein PITA.

                    Ich bin gut konditioniert; also frage ich jetzt: was ist ein PITA?

                    Untersteh Dich, und verweise auf Google & Co.
                    Hier gehts schließlich nur um gute Archiv-Qualität ;-)

                    Harzliche Grüße vom Berg
                    esst mehr http://www.harte-harzer.de

                    Tom

                    --
                    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                    Nur selber lernen macht schlau
                    1. Hi,

                      Nur, wenn das wrap-Attribut benutzt wird - und solche unabsichtlichen Zeilenumbrüche sind dann ein PITA.

                      Pita: griechisches Fladenbrot. ;-)

                      "Pain in the ass" ist aber hier wahrscheinlicher ;-)

                      cu,
                      Andreas

                      --
                      Warum nennt sich Andreas hier MudGuard?
                      Schreinerei Waechter
                      Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
  2. Ich denke was du suchst ist nl2br um den Text bei der Ausgabe wieder umzubrechen. Gruß Kai.

  3. Hello,

    wie ist es möglich, einen Text mit Zeilenumbruch das über ein textarea eingegeben wurde auch mit Zeilenumbruch in der Datenbank zu speichern?

    Wie ich die Daten in die Datenbank bekomme ist mir klar, die Frage bezieht sich lediglich auf die Zeilenumbrüche.

    Vier Schritte:

    Text erfassen und posten
      Eventuell von PHP automatisch gesetzte Escapes wieder entfernen
      Das zur DB-Schnittstelle passende Escaping durchführen
        und Werte eintragen
      Werte wieder auslesen und passend zum Ausgabekontext wieder codieren
        Bei Ausgabe in einer Textarea also mittels htmlspecialchars()
        Bei Ausgabe in einem HTML-Bereich also mit nl2br(htmlspecialchars(wordwrap()))

    Wordrap nur für den Fall, dass Ausdrücke in der Ausgabe nicht zu lang werden dürfen und daher Zwangsumbruch erwünscht ist.

    Harzliche Grüße vom Berg
    esst mehr http://www.harte-harzer.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
  4. Du brauchst beim Einfügen die Umbrüche noch nicht berücksichtigen, diese werden (auch wenn du das nicht sehen kannst) von alleine mit in die Datenbank geschrieben.
    Jedoch wenn du die Daten wieder zur Ausgabe aus der DB holst, solltest du die Funktion nl2br() nutzen, welche alle '\n' in '<br>' umwandelt.

    lg Gerhard

    1. Danke Gerhard!!

      jetzt hab auch ich es verstanden...

      Gruß
      Torsten

      1. Das ganze habe ich doch auch geschrieben gehabt nl2br bei der Text ausgabe...

        1. Ich hab dein Posting gelesen und hab mir gedacht: Es ist besser ich versuch es auch zu erklären. Frei nach dem Motto: "Doppelt hält besser"

          lg Gerhard

          1. Ja war viellicht nicht wirklich ausfürlich mein Antwort aber ich dachte die Stichwörter nl2br und Ausgabe würde reichen...
            Hauptsache wir konnten helfen,
            Gruß Kai.

            1. Dafür sind wir doch da!
              lg Gerhard

              1. Dafür sind wir doch da!

                schön das es hier noch ein paar normale leute gibt ;-)

                gruß
                torsten

        2. Das ganze habe ich doch auch geschrieben gehabt nl2br bei der Text ausgabe...

          stimmt Kai, dass hatte ich übersehen, sorry!

    2. Hello,

      Du brauchst beim Einfügen die Umbrüche noch nicht berücksichtigen, diese werden (auch wenn du das nicht sehen kannst) von alleine mit in die Datenbank geschrieben.

      Selbstverständlich müssen Steuerzeichen behandelt werden, da die Datenbankschnittstelle diese sonst selber als Steuerzeichen interpretieren würde.

      Jedoch wenn du die Daten wieder zur Ausgabe aus der DB holst, solltest du die Funktion nl2br() nutzen, welche alle '\n' in '<br>' umwandelt.

      nl2br() wandelt sie Zeilenumbrüche nicht in <br> um, sondern setzt ein <br /> vor jeden Zeilenumbruch zusätzlich davor! Die "\r\n" bleiben also im String erhalten.

      Harzliche Grüße vom Berg
      esst mehr http://www.harte-harzer.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau
      1. Hi Tom,

        mag ja alles sein, aber so wie es Gerhard mir erklärt hat, so funzt es auch.

        Gruß
        Torsten

        1. Hello,

          mag ja alles sein, aber so wie es Gerhard mir erklärt hat, so funzt es auch.

          Was bedeutet "funzt"?

          Bitte mehr input ;-)

          Aber wenn Du meinst, dass mannicht weiter nachdenken muss, weil es in einem speziellen Anwendungsfall unter ganz bestimmten Randbedingungen zufällig wiederholt funktioniert hat, dann kennst Du das Forum noch nicht. Hier wird zum Glück auch weiter nachgefasst, und die Dinge werden meistens auch auf den Punkt gebracht. (siehe unteren Teil des Threads).

          Das ist für alle Teile von Vorteil. Man bleibt dadurch im Training und verschlampt nicht, auch oder gerade, wenn man es eigentlich genau gewußt hätte.

          Harzliche Grüße vom Berg
          esst mehr http://www.harte-harzer.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau