Text eines textarea in Datenbank speichern
Torsten
- php
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
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
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
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
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
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
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
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
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
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
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
Ich denke was du suchst ist nl2br um den Text bei der Ausgabe wieder umzubrechen. Gruß Kai.
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
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
Danke Gerhard!!
jetzt hab auch ich es verstanden...
Gruß
Torsten
Das ganze habe ich doch auch geschrieben gehabt nl2br bei der Text ausgabe...
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
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.
Dafür sind wir doch da!
lg Gerhard
Dafür sind wir doch da!
schön das es hier noch ein paar normale leute gibt ;-)
gruß
torsten
Das ganze habe ich doch auch geschrieben gehabt nl2br bei der Text ausgabe...
stimmt Kai, dass hatte ich übersehen, sorry!
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
Hi Tom,
mag ja alles sein, aber so wie es Gerhard mir erklärt hat, so funzt es auch.
Gruß
Torsten
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