Christian: Zeilenumbruch in Textarea

Hallo Leute!

Hab ein kleines Problem. Es wurde zwar schon in dutzenden Foren diskutiert
und auch schon massenweise Lösungen angeboten, aber es funzt trotzdem nicht!
Will in einem Gästebuch (Eingabe mit Textarea) Einträge in eine MySQL DB
machen! Klappt auch wunderbar, bis auf die Ausgabe.
Dort stellt er mir das Textfeld immer ohne Zeilenumbrüche dar, was
meine Tabelle in der es dargestellt werden soll natürlich unendlich breit
macht!
Hier mein Code:

EINGABE:
<textarea name="kommentar" rows="6" cols="40" wrap="physical"></textarea>

SCHREIBEN IN DIE DB:
<?
mysql_connect("localhost","XXXX","XXXX");
$aktiv="1";
$datum=date("d.m.Y");
$result=mysql_db_query("usr_n4b19_1", "INSERT INTO gaestebuch VALUES(NULL,'$datum','$aktiv','$name','$email','$http','$kommentar')");
if (mysql_errno() == 0)
{
    print "Ihr Eintrag wurde übernommen.";
}
else
{
    print "Ein Fehler ist aufgetreten!<br>Sorry!";
}
?>

AUSWERTUNG/DARSTELLUNG:
<?
mysql_connect("localhost","XXXX","XXXX");
$result=mysql_db_query("usr_n4b19_1", "SELECT * FROM gaestebuch ORDER BY id DESC");
$anzahl=mysql_num_rows($result);
if ($anzahl == 0)
{
  echo "Es liegen bisher keine Einträge vor";
}
else
{
  for ($i=0;$i<$anzahl;$i++)
  {
   $id=mysql_result($result, $i, "id");
   $datum=mysql_result($result, $i, "datum");
   $aktiv=mysql_result($result, $i, "aktiv");
   $name=mysql_result($result, $i, "name");
   $email=mysql_result($result, $i, "email");
   $http=mysql_result($result, $i, "http");
   $kommentar=mysql_result($result, $i, "kommentar");
   str_replace("\n","<br>",$kommentar);
   //nl2br($kommentar);
   if ($aktiv==1)
   {
    print "<table border="1" cellspacing="0" cellpadding="0"bordercolor="#0066ff" width="70%">";
    print "<tr><td width="100" bgcolor="#99ccff" align="center">";
    print "<span class="ueberschrift_klein"> Name: </span>";
    print "<td colspan="3" align="center"><span class="ueberschrift_klein"> $name </span></td></tr>";
    print "<tr><td width="100" bgcolor="#99ccff" align="center"> eMail: ";
    print "<td align="center"> <a href="mailto:$email">$email</a> ";
    print "<td width="100" bgcolor="#99ccff" align="center"> Homepage: ";
    print "<td align="center"> <a href="http://$http" target="new">$http</a> </td></tr>";
    print "<tr><td height="40" colspan="4" align="center">$datum</td></tr>";
    print "<tr><td bgcolor="#99ccff" align="center" colspan="4"> Kommentar: </td></tr>";
    print "<tr><td colspan="4"> $kommentar </td></tr></table><br><hr width="90%"><br>";
   }
  }
}
?>

Kann mir irgendjemand sagen was ich falsch mache???
BIIIITTTTTEEEE!! *amverzweifelnbin*

Danke schonmal...
Chris

  1. $kommentar=mysql_result($result, $i, "kommentar");
       str_replace("\n","<br>",$kommentar);

    versuche es ma mit *gg*
    $kommentar = str_replace("\n","<br>",$kommentar);
    gruss chris

  2. Moin!

    Hab ein kleines Problem.

    Du hast mehrere kleine Probleme, die ich dir in deinem Quelltext gerne anmerke:

    SCHREIBEN IN DIE DB:
    <?
    mysql_connect("localhost","XXXX","XXXX");
    $aktiv="1";
    $datum=date("d.m.Y");
    $result=mysql_db_query("usr_n4b19_1", "INSERT INTO gaestebuch VALUES(NULL,'$datum','$aktiv','$name','$email','$http','$kommentar')");

    Stolperfalle Nummer 1: Wenn sich die Reihenfolge der Spalten in der DB mal ändert (und dazu gibts mehr als genug Gründe), dann wirft dein SQL-Statement die Daten allesamt in die falschen Spalten. Deshalb: Bei Inserts IMMER die zu befüllenden Spalten angeben. Dann kannst du dir nämlich auch das Befüllen mit NULL sparen.

    Und als zweite Anmerkung: mysql_db_query() sollte nicht mehr verwendet, sondern durch mysql_query() und vorheriges mysql_db_select() ersetzt werden.

    if (mysql_errno() == 0)
    {
        print "Ihr Eintrag wurde übernommen.";
    }
    else
    {
        print "Ein Fehler ist aufgetreten!<br>Sorry!";
    }
    ?>

    AUSWERTUNG/DARSTELLUNG:
    <?
    mysql_connect("localhost","XXXX","XXXX");
    $result=mysql_db_query("usr_n4b19_1", "SELECT * FROM gaestebuch ORDER BY id DESC");

    Zu mysql_db_query() siehe oben...

    Außerdem: Man sollte NIEMALS mit SELECT * arbeiten. Gib die von dir benötigten Spaltennamen direkt an. Wenn sich die Datenbankstruktur mal ändert und du z.B. ein meistens unwichtiges BLOB-Feld hinzufügst, werden sinnlose Datenmengen aus der DB abgefragt, die den Vorgang nur unnötig verlangsamen.

    Außerdem kannst du mit SELECT * nicht die Reihenfolge der DB-Spalten im Ergebnis beeinflussen. Und das ist natürlich wiederum schlecht, denn wenn sich (siehe INSERT-Kommentar) die Reihenfolge mal ändert, bist du am Arsch.

    Und warum kann sich die Reihenfolge mal ändern? Z.B. durch eingespielte DB-Backups, oder bei sonstigen Änderungen (neue Spalten, neue DB-Software mit anderen Optimierungen etc.)

    $anzahl=mysql_num_rows($result);
    if ($anzahl == 0)
    {
      echo "Es liegen bisher keine Einträge vor";
    }
    else
    {
      for ($i=0;$i<$anzahl;$i++)
      {
       $id=mysql_result($result, $i, "id");
       $datum=mysql_result($result, $i, "datum");
       $aktiv=mysql_result($result, $i, "aktiv");
       $name=mysql_result($result, $i, "name");
       $email=mysql_result($result, $i, "email");
       $http=mysql_result($result, $i, "http");
       $kommentar=mysql_result($result, $i, "kommentar");

    Das ist vermutlich die allerumständlichste Methode, an die Ergebnisse der DB heranzukommen.

    Was hälst du von diesem hier:

    while ($abfrage = mysql_fetch_array($result))
    {
      print "{$abfrage['name']}...{$abfrage['email']}...."; // und so weiter
    }

    Ganz ohne Feststellung, wieviele Elemente gefunden wurden.

    str_replace("\n","<br>",$kommentar);
       //nl2br($kommentar);

    Dass nl2br() und str_replace() Funktionen sind, deren Ergebnis das gewünschte Ergebnis enthalten, welches du aber hingebungsvoll wegwirfst, wurde schon geklärt.

    if ($aktiv==1)

    MOOOOOMENT! Du willst du nicht wirklich _alle_ Datensätze der Datenbank abfragen und dann hinterher nur die aktiven Datensätze ausgeben, oder etwa doch?

    Ist ja GRAUSAM! Pack diese Abfrage doch bitte ins SQL rein:

    SELECT spalte1, spalte2 FROM tabelle WHERE aktiv=1 ORDER BY blah

    Und schon kriegst du nur noch Datensätze, die aktiv sind.

    Denn was wäre, wenn du nur inaktive Datensätze kriegen würdest? Richtig, du würdest NICHT die Fehlermeldung "Es liegen bisher keine Einträge vor" kriegen, weil ja Datensätze gefunden wurden (die inaktiv sind).

    [....]
    ?>

    - Sven Rautenberg

    --
    ss:) zu:) ls:[ fo:} de:] va:) ch:] sh:) n4:# rl:| br:< js:| ie:( fl:( mo:|