Stefan: Zeilenumbruch in Gästebuchausgabe

Ich hab jetzt ein Gästebuch für meine Homepage geschrieben(in PHP), hab allerdings ein Problem:
Wenn man in der Nachricht Zeilenumbrüche schreibt, werden diese in der externen txt-Datei zwar als Zeilenumbruch gespeichert, bei der Ausgabe im Gästebuch jedoch nurnoch als Leerzeichen angezeigt.
Hier der Code:

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<table cellPadding="4" cellSpacing="2" border="0" bgcolor="#99CC66" align="center" style="border-width:medium; border-color:#0033CC; border-style:dotted; padding:5px;">
<tr>
<td><font face="Arial"><b>Name:</b></font></td>
<td><input type="text" name="name" size="25"></td>
</tr>
<tr>
<td><font face="Arial"><b>Email:</b></font></td>
<td><input type="text" name="email" size="25"></td>
</tr>
<tr>
<td><font face="Arial"><b>Betreff:</b></font></td>
<td><input type="text" name="betreff" size="25"></td>
</tr>
<tr>
<td valign="top"><font face="Arial"><b>Text:</b></font></td>
<td><textarea name="nachricht" cols="35" rows="6"></textarea></td>
</tr>
<tr>
  <td>&nbsp;</td>
  <td>
<div align="right">
<input name="reset" type="reset" value="Löschen" />&nbsp;<input type="submit" name="submit" value="Senden"></div>
</td>
</tr>
</table>
</form>
</br>

<?php
$name = $HTTP_POST_VARS['name'];
$email = $HTTP_POST_VARS['email'];
$betreff = $HTTP_POST_VARS['betreff'];
$nachricht = $HTTP_POST_VARS['nachricht'];
if($submit)
{
if(($name == "") || ($email == "") || ($betreff == "") || ($nachricht == ""))
echo "</br><p align='center'><b>Alle Felder müssen ausgefüllt werden!</b></p></br>";
else
{
$x = 0;
$dateiname = "gast.txt";
$datei = fopen($dateiname, "r");
while (!feof($datei)) {
$x++;
$saved[$x] = fgets($datei, 1024);
}
$datum = date("d.m.Y");
$zeit = date("H:i");
$datei=fopen("gast.txt", "w");
$text=strip_tags($text);
fwrite($datei,"<table align=center width=500 cellspacing=1 cellpadding=3><tr>
<td bgcolor='#99CC66'; style='border-width:medium; border-color:#0033CC; border-style:dotted; padding:5px;'><a href="mailto:$email"><b>$name</b></a> schrieb am $datum um $zeit Uhr</td></tr>
<tr><td bgcolor=#DAF9B7 style='border-width:medium; border-color:#99CC66; border-style:dotted; padding:5px;'>$betreff</td></tr><tr>
<td bgcolor='#99CC66'; style='border-width:medium; border-color:#0033CC; border-style:dotted; padding:5px;'>$nachricht</font></td></tr></table></br></br>\n");
for ($i=1;$i <= $x; $i++) {
fwrite($datei, "$saved[$i]");
}
fclose($datei);
}
}
$dateiname = "gast.txt";
$datei = fopen($dateiname, "r");
fpassthru($datei);
?>

Kann mir jemand beim Beheben des Problems helfen?

  1. Hello,

    Kann mir jemand beim Beheben des Problems helfen?

    Dein unmittelbares Problem wird gelöst durch nl2br. Aber an der Stelle darfst du nicht aufhören. Hast du an kontextspezifisches Maskierung gedacht, sprich was passiert, wenn ein Benutzer "a < b" eingibt? Nein? htmlspecialchars
    Hast du daran gedacht zu überprüfen, ob der Benutzer dir anderes, möglicherweis schädigendes Zeug unterschiebt?

    MfG
    Rouven

    --
    -------------------
    sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
    We found ourselves looking upon a familiar sight. We were home. How do you pick up the threads of an old life? How do you go on... when in your heart you begin to understand... there is no going back? There are somethings that time cannot mend... some hurts that go too deep... that have taken hold.  --  The Lord of the Rings: The Return of the King (Peter Jackson)
    1. Danke für die Hilfe!

      Hast du daran gedacht zu überprüfen, ob der Benutzer dir anderes, möglicherweis schädigendes Zeug unterschiebt?

      Nein, hab ich nicht, hab nicht mal gedacht, dass das so einfach geht, wenn ich den Text nur in einer txt-Datei speichere. (Hab übrigens noch nicht so viel Programmier-Erfahrung...)

      MfG,
      Stefan

      1. Hello,

        Hast du daran gedacht zu überprüfen, ob der Benutzer dir anderes, möglicherweis schädigendes Zeug unterschiebt?

        Nein, hab ich nicht, hab nicht mal gedacht, dass das so einfach geht, wenn ich den Text nur in einer txt-Datei speichere. (Hab übrigens noch nicht so viel Programmier-Erfahrung...)

        Und auf die richtige Reihenfolge beid er Anwendung der Funktionen kommt es auch noch an.

        - wordwrap()         http://www.php.net/manual/de/function.wordwrap.php
            (hier fehlt mMn die Funktion mb_wordwrap())

        - htmlspecialchars() http://www.php.net/manual/de/function.htmlspecialchars.php

        - nl2br()            http://www.php.net/manual/de/function.nl2br.php

        also

        echo nl2br(htmlspecialchars(wordwrap( ...)))

        Und wordwrap() kann mMn nur für Single-Byte-Codierungen richtig funktionieren, muss also für UTF-8-Codierung z. Zt. noch selber geschrieben werden. Viel Spaß dabei ;-)

        Liebe Grüße aus Syburg bei Dortmund

        Tom vom Berg

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

    Ich hab jetzt ein Gästebuch für meine Homepage geschrieben(in PHP), hab allerdings ein Problem:

    nicht nur dieses eine...

    <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">

    $_SERVER['PHP_SELF'] ist manipulierbar.

    <td><font face="Arial"><b>Name:</b></font></td>
    <td><input type="text" name="name" size="25"></td>

    funktioniert zwar, ist aber unschön und antiquitiert. Es existiert <label> und CSS.

    $name = $HTTP_POST_VARS['name'];

    oops - hast Du wirklich noch so eine uralte PHP-Version auf dem Server?
    Abgesehen davon: wieso dieses Umkopieren?

    if($submit)

    Ohje! Du spekulierst auf register_globals und deaktiviertes error_reporting.

    $text=strip_tags($text);

    übel, wenn jemand ein ganz normales Wort in <> setzt...

    fwrite($datei,"<table align=center width=500 cellspacing=1 cellpadding=3><tr>

    was soll denn das? Du solltest die Daten speichern und keinen (zudem schlechten) HTML-Code.

    for ($i=1;$i <= $x; $i++) {
    fwrite($datei, "$saved[$i]");
    }

    schonmal überlegt, was passiert, wenn während dieser Aktion ein weiterer Eintrag geschrieben wird?

    Von diesen ganzen Problemen abgesehen: richte Dich auf das nächste ein, sobald das Script läuft und das Gästebuch von Google indiziert ist: SPAM. ;-)

    freundliche Grüße
    Ingo

  3. Mahlzeit Stefan,

    abgesehen von all den anderen Hinweisen hätte ich auch noch ein paar Anmerkungen:

    <table cellPadding="4" cellSpacing="2" border="0" bgcolor="#99CC66" align="center" style="border-width:medium; border-color:#0033CC; border-style:dotted; padding:5px;">

    Einige Dich mit Dir selbst auf die Verwendung von HTML oder CSS zu Layoutzwecken - wobei ich letzteres empfehlen würde ... ein derartiges Kuddelmuddel ist extrem schlecht wartbar.

    <input name="reset" type="reset" value="Löschen" />&nbsp;<input type="submit" name="submit" value="Senden">

    Also was jetzt: HTML oder XHTML? Einige Dich auch hier. Ich würde Dir - zur Zeit - valides HTML 4.01 empfehlen.

    <?php

    Grundsätzlich würde ich Dir die Beachtung des EVA-Prinzips empfehlen: (E)ingabe -> (V)erarbeitung -> (A)usgabe. Du solltest also erst die übergebenen Parameter auswerten, anschließend mit ihnen irgendwas anfangen (z.B. Gästebuch ggf. schreiben und dann lesen) und erst am Schluss die in den ersten beiden Schritten vorbereiteten Ausgaben zusammen mit dem Rest der Seite ausgeben.

    fwrite($datei,"<table align=center width=500 cellspacing=1 cellpadding=3><tr>

    Hier kann ich nur wiederholen: dieses Vorgehen ist seeehhhr schlecht - speicher nur (Roh-)Daten, sonst nichts!

    MfG,
    EKKi

    --
    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|