kostenloser Webspace werbefrei: lima-city


PHP-Fehler im Gästebuch Code

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    david-tiede

    david-tiede hat kostenlosen Webspace.

    Hallo,

    ich habe ein Gästebuch mit PHP erstellt. Die Beiträge werden in einem Textdokument gespeichert. Das Gästebuch besitzt auserdem noch einen Blätterfunktion und einen Spamschutz. Es funktioniert eigentlich, nur das Sonderzeichen (ö,ä,ü,..) nicht richtig mit htmlentities in entsprechende HTML-Codes umgewandelt werden (siehe Dateien)!
    gaestebuch.php:
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
    
    <head>
    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
    <meta content="de" http-equiv="Content-Language" />
    <title>Gästebuch</title>
    <link href="style.css" rel="stylesheet" type="text/css" />
    </head>
    
    <body>
    <h2>Gästebuch</h2>
    Wollen Sie einen Beitrag hinzufügen?<br />
    <form action="neuerbeitrag.php" method="post">
    <table style="width: 746px">
    	<tr>
    	<td style="width: 334px">Ihr Name:<br />
    		<input name="eman" size="40" style="width: 240px" />
    		<input class="input" name="name" style="width: 70px" type="text" />
    	</td>
    	<td style="width: 362px">E-Mail:<br />
    		<input name="liame" size="40" style="width: 240px" />
    		<input class="input" name="email" style="width: 70px" type="text" />
    	</td>
    	</tr>
    	<tr>
    	<td colspan="2">Inhalt:<br />
    		<textarea name="tlahni" style="width: 598px; height: 60px;"></textarea>
    		<textarea class="input" name="inhalt" style="width: 72px; height: 60px"></textarea><br /><br />
    		<input type="submit" value="Absenden" /></td>
    	</tr>
    </table>
    </form>
    <hr />
    
    <?php
    $seite = $_GET["seite"];
    if(!isset($seite))
    	{
    	$seite = 1;
    	}
    $eintraege_pro_seite = 10;
    $beitrag = file("gaestebuch.txt");
    $a =count($beitrag)-($seite-1)*$eintraege_pro_seite-1;
    $b=$a-$eintraege_pro_seite;
    for($a;$a>-1 AND $a > $b ; $a--)
    	{
    //Ich denke, hier liegt das Problem
    	$beitrag[$a] = htmlentities($beitrag[$a]);
    	$zerlegen = explode("|", $beitrag[$a]);
    	echo "<br/><table style=\"border-collapse: collapse;border: 1px solid #3399FF;background-color: #99CCFF;\" width=\"746px\"><tr><td><strong>";
    	If ($zerlegen[0] == "")
    		{
    		echo "Von $zerlegen[1]";
    		}
    	else
    		{
    		echo "Von <a href=\"mailto:$zerlegen[0]\">$zerlegen[1]</a>";
    		}
    	echo " am $zerlegen[2]</strong></td></tr><tr><td>$zerlegen[3]</td></tr></table><br/>";
    	}
    echo "<div style=\"text-align:center\">";
    echo "<b>Seite:</b> ";
    for($s=0; $s < count($beitrag)/$eintraege_pro_seite; $s++)
    	{
    	$b = $s + 1;
    	if($seite == $b)
    		{
    		echo "  <b>$b</b> ";
    		}
    	else
    		{
    		echo "  <a href=\"?seite=$b\">$b</a> ";
    		}
    	}
    echo "</div>";
    ?>
    </body>
    </html>

    style.css:
    .input {
    	display:none
    }

    neuerbeitrag.php:
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
    
    <head>
    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
    <meta content="de" http-equiv="Content-Language" />
    <title>Gästebuch - Eintrag - Kirchgemeinde Pobershau</title>
    </head>
    
    <body>
    <h2>Gästebuch - Neuer Beitrag</h2>
    <?php
    $spam=$_POST['name'].$_POST['email'].$_POST['inhalt'];
    if (!$spam=="")
    	{
    	echo "Sie sind ein Spammer!";
    	}
    else
    	{
    	$user = htmlentities($_POST["eman"]);
    	$inhalt = htmlentities($_POST["tlahni"]);
    	$inhalt = str_replace("\n", "<br>", $inhalt);
    	$email = htmlentities($_POST["liame"]);
    	if($inhalt == "" or $user == "")
    		{
    		echo "Sie müssen das Feld \"Namen\"
    		und \"Inhalt\" ausfüllen";
    		}
    	else
    		{
    		$datum= date("d.m.Y H:i:s");
    		$eintrag="$email|$user|$datum|$inhalt";
    		$datei = fopen("gaestebuch.txt", "a");
    		fwrite($datei, "\n".$eintrag);
    		fclose($datei);
    		echo "Ihr Eintrag wurde erfolgreich gespeichert!";
    		}
    	}
    ?>
    <br/><br/>
    <a href="gaestebuch.php">Zurück zum Gästebuch</a>
    </body>
    </html>

    Diese 2 Beiträge habe ich als Beispiel eingegeben:
    Mustermann, muster@muster.de, Musterbeitrag
    Müstermann. müster@müster.de, Ich habe alle ü´s in Muster durch ü ersetzt!
    Das ist daraus geworden:
    gaestebuch.txt:
    muster@muster.de|Mustermann|31.12.2010 10:16:37|Musterbeitrag
    m&Atilde;&frac14;ster@m&Atilde;&frac14;ster.de|M&Atilde;&frac14;stermann|31.12.2010 10:19:03|Ich habe alle u&Acirc;&acute;s in Muster durch &Atilde;&frac14; ersetzt!

    Es wäre sehr schön, wenn jemand den Fehler oder das Problem finden würde! Danke!
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Der (bzw. die) Fehler ist/sind recht einfach:

    1. du darfst htmlentities() nicht 2 mail anwenden - entweder in gaeatebuch.php oder in neuereintrag.php
    2. du verwendest den Zeichensatz UTF-8, Standard ist jedoch ISO-8859-1. Gib den Zeichensatz zB so an:
    $beitrag[$a] = htmlentities($beitrag[$a], ENT_COMPAT, "UTF-8");
    (mehr Details in der PHP-Doku)

    Noch ein paar Verbesserungsvorschläge:
    - Die Methode nl2br() erleichtert es, Zeilenumbrüche einzusetzen
    - 'AND' und 'OR' sind als logische Operatoren nicht mehr sehr gebräuchlich; '&&' '||' haben sich da mehr durchgesetzt
    - Du solltest in den Beiträgen dass '|' codieren, da sonst deine Dateistruktur durcheinander kommt, wenn jemand dieses Zeichen verwendet (die Verwendung einer Datenbank wäre noch besser)
    - Es wäre sauberer, wenn du auch deine Formularbeschriftungen mit Entitäten codierst (zB <h2>G&auml;stebuch</h2>)
  4. Autor dieses Themas

    david-tiede

    david-tiede hat kostenlosen Webspace.

    Vielen Dank!

    Eine Datenbank habe ich nicht benutzt, weil ich die bei meinen Webspace nicht dabei habe.

    Falls jemand weitere Verbesserungsvorschläge hat können die gerne gepostet werden.
  5. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!