Mawis

Well-known member
ID: 216630
L
28 April 2006
800
19
Hi,
ich habe schon seit längerer Zeit ein Problem, für das ich bis jetzt leider noch keine optimal Lösung gefunden habe...
Es geht um die Ausgabe von Text aus der Datenbank, der vorher per Textarea eingegeben wurde.
Das Problem besteht darin, dass das Textarea den Text umbricht, so dass er schön reinpasst.
Sprich: Ich schreibe eine Zeile und sobald das Wort nich mehr in die Zeile passt, springt der Text in die nächste Zeile (genau wie hier im Forum beim Antworten).
Diese Info wird aber leider nicht mit in die Datenbank gespeichert.
Jetzt gibt es die Möglichkeit, das Ganze mit nl2br() auszugeben, leider passiert da nichts...
Jetzt gibt es noch die Funktion wordwrap(), die eigentlich genau das macht was ich will. Dummerweise splittet die Funktion auch leerzeichen. Das bedeutet sobald die Funktion auf ein Leerzeichen trifft und umbrechen will zerlegt es dieses Leerzeichen in   und gibt es auch. Sieht auch ziemlich unschön aus...

Ich weiß nicht genau, warum das nl2br nicht funktioniert, ich habe den Text in der Datenbank als Typ "Text" gespeichert. Sollte man da lieber Varchar oder string nehmen? Ich kenne den Unterschied leider nicht...

Hier noch ein paar Screens um das Problem zu verdeutlichen...
zeilenumbruch1.png

Hier sieht man, dass der Text das Layout sprengt und rechts aus dem Bild läuft.

zeilenumbruch2.png

Hier das Ganze nachdem wordwrap angewendet wurde. Leider trennt er da die Leerzeichen...

Für Hilfe bin ich euch dankbar :)
Viele Grüße
 
Das macht man mit CSS :!:

Mit PHP etc. is das unmöglich, weil du nie weißt, mit welcher Schriftart oder Schriftgröße der Benutzer den Text anzeigt und folglich niemals eine genaue Pixelzahl von Breite/Höhe hast.
Vergiss also deine bisherigen Überlegungen und mach dein Layout ordentlich. Anders kannst du das Problem nicht lösen. Oder anders ausgedrückt: Wieso nicht - wie jeder andere auch - einfach machen, statt umständlich?
 
Hi,

theHacker hat recht, mach es mit css.

Aber um dennoch deine Frage zu beantworten:
Der Typ "text" sollte schon korrekt sein, zumal varchar z.B. eine wesentlich geringere Inhaltsgröße hat.

Die Funktion "nl2br" wandelt vorkommende (!) Zeilenumbrüche aus Textfeldern in die HTMl-Formation "</br>" um, wenn du aber einen Text als Fließtext (also ohne selbst einen Zeilenumbruch durch Return) eingibst, hast du auch keine "new line" - ergo kann die Funktion "nl2br" dir nicht das gewünschte Ergebnis liefern.

Ferner scheinst du brav die vorkommenen Leerzeichen in deinem Textfeld vor dem speichern in der db in entsprechende HTML-Codes umzuwandeln (d.h. aus "Das ist ein Test" wird "Das ist ein Test").

Nun kann wordwrap aber nicht erkennen, ob " " ein Wort oder ein HTML-Code ist, daher das unschöne "abschnipseln".

Jetzt kann man höchstens den Text vor der Ausgabe bearbeiten um so diesen Effekt zu umgehen.

Das geht z.B. so (sehr quick und sehr dirty):
PHP:
$string = "Das ist der Text aus der Datenbank";
$neustring = ereg_replace(" "," ",$string);
$neustring enthält dann deinen Text ohne " " - diesen kannst du dann mit wordwrap weiterbehandeln.
Aber wie gesagt: theHacker hat Recht! Soetwas löst man per CSS bei der Ausgabe - natürlich geht das aber auch nur, wenn die db-Ausgabe das auch hergibt.

Gruss
ITCF
 
Ferner scheinst du brav die vorkommenen Leerzeichen in deinem Textfeld vor dem speichern in der db in entsprechende HTML-Codes umzuwandeln (d.h. aus "Das ist ein Test" wird "Das ist ein Test").
Das is aber Quark.   ist nicht die Entität für ein Leerzeichen, sondern das is ein geschütztes Leerzeichen.
Wenn man natürlich dieses Zeichen verwendet, dann is das Verhalten wie in Post #1 völlig normal. Die Aufgabe von   is ja grad, eben keinen Umbruch zu erzeugen. Da würde man nicht mal mit ordentlichen Layout n Umbruch reinkriegen.

  nur da verwenden, wo es auch richtig is, z.B. in Abkürzungen mit mehreren Wörtern oder zum Abtrennen von Einheiten etc.
 
Das is aber Quark.   ist nicht die Entität für ein Leerzeichen, sondern das is ein geschütztes Leerzeichen.

Jep, hast natürlich recht, aber ich denke mal das der Threatstarter nicht gerade der perfekte Progger, daher wollte ich es einfach (ja, auch wenn dadurch nicht absolut korrekt) darstellen.
Du wirst mir aber sicher rechtgeben, das allein ein "INSERT INTO" aus einem Leerzeichen in einer Textfeldeingabe nicht vollautomatisch ein geschütztes Leerzeichen baut - und das muß ja geschehen, denn sonst hätte er selbiges ja nicht in der db stehen...

Gruss
ITCF
 
Das macht man mit CSS :!:

Mit PHP etc. is das unmöglich, weil du nie weißt, mit welcher Schriftart oder Schriftgröße der Benutzer den Text anzeigt und folglich niemals eine genaue Pixelzahl von Breite/Höhe hast.
Vergiss also deine bisherigen Überlegungen und mach dein Layout ordentlich. Anders kannst du das Problem nicht lösen. Oder anders ausgedrückt: Wieso nicht - wie jeder andere auch - einfach machen, statt umständlich?

Danke erstmal für eure schnellen Antworten.
Wie genau kann ich das mit CSS realisieren? habe damit auch schon rumprobiert, irgendwie eine fest breite zu definieren... Die hat er aber nie umgesetzt und das Feld wieder so breit gemacht.

Hatte es auch in einem <p> Feld mit entsprechender Width-Angabe, aber auch da nichts...

Für nen kleinen Hinweis wäre ich dankbar, muss ja keine komplette Lösung sein ;)

Viele Grüße und danke nochmal
 
Hatte es auch in einem <p> Feld mit entsprechender Width-Angabe, aber auch da nichts...
Richtig, das genügt schon.

Bedenke aber, dass der Browser nur an Wortgrenzen umbrechen kann. Gibst du ihm ein Wort, was länger is, als die width-Angabe, wird er das Element sprengen.
 
So habe es gelöst.
Es wurden tatsächlich alle Leerzeichen durch   ersetzt beim eintragen in die Datenbank... Frag mich nicht wieso, mein Kumpel hat das so gemacht (kommt davon wenn man zu zweit an einem Projekt arbeitet^^)
Hab die zeile jetzt auskommentiert und dann gehts.

Beim Eintragen hat er wohl aus:
eins zwei
eins zwei
gemacht und somit ist es ein Wort und das schiebt er logischerweise nach rechts aus dem Layout.

Danke für eure Hilfe! :)
 
...Bedenke aber, dass der Browser nur an Wortgrenzen umbrechen kann. Gibst du ihm ein Wort, was länger is, als die width-Angabe, wird er das Element sprengen.

Jep, ganz genau das war ja mein Denkansatz, denn wie der TH-Starter ja schreibt, umbricht wordwrap ja " " - und das kann ja nur geschehen, wenn so die Ausgabe aussieht, d.h. nach meiner Meinung hapert es ja schon hieran.

Gruss
ITCF
 
Um dennoch vor übergroßen Inhalten das gewünschte Verhalten hinzubekommen, kann man noch die CSS-Eigenschaft overflow benutze ;)
Eventuell kannst du sie ja gebrauchen.. wobei man da dann, je nachdem was man damit einstellt, auch Nachteile bei übergroßen Inhalten haben kann (z.B. kann man nicht alles lesen).