• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Gästebuch, Einträge werden Doppelt eingetragen

Basti225

Neues Mitglied
Hallo,
ich habe mit Hilfe eines Tut's ein Gästebuch mit php gemacht.
Jetzt besteht folgendes Problem:
Wenn ich einen Eintrag schreibe, wird der eintrag 2mal angezeigt.
Kann mir da jemand weiterhelfen?

Das Gästebuch
Code:
<?php
$beitrag = file("gaestebuch.txt");
krsort($beitrag);

foreach($beitrag as $ausgabe)
   {
   $ausgabe = stripslashes($ausgabe);
   $zerlegen = explode("|", $ausgabe);

   echo "
   <table>
   <tr>
   <td>
  Von <a href=\"mailto:$zerlegen[0]\">$zerlegen[1]</a>
  am $zerlegen[2]
   </td>
   </tr>
   <tr>
   <td>
   $zerlegen[3]
   </td>
   </tr>
   </table><br>
   ";
   }
?>

Neue Einträge:
Code:
<?php
$user = $_POST["Name"];
$user = htmlentities($user);

$inhalt = $_POST["inhalt"];
$inhalt = htmlentities($inhalt);
$inhalt = str_replace("\n", "<br>", $inhalt);

$email = $_POST["EMail"];
$email = htmlentities($email);

if ($inhalt == "" or $user == "")
   {
   echo "Sie müssen das Feld \"Namen\"
   und \"Text\" 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";
   }
?>

Gruß Basti

PS: Bin noch ein richtiger Anfänger in PHP!
 
Werbung:
Ein Eintrag wird nach dem gezeigten Code nicht zweimal ausgegeben, es wird lediglich von file() eine leere Zeile am Dateiende (die du beim Hinzufügen mit "\n" erzeugst) mit in das Array geschrieben.

Quick and dirty Fix: Füge die folgende Überprüfung auf leere Eingabe ganz oben in die foreach-Schleife ein:

PHP:
   if (trim($ausgabe) === '') {
       continue;
   }
 
Hmm,
wenn ich den Code in die foreach-Schleife schreibe, sollte das doch so aussehen oder?
Code:
<?php
$beitrag = file("gaestebuch.txt");
krsort($beitrag);

foreach($beitrag as $ausgabe)
[B]   if (trim($ausgabe) === '') {
       continue;
   }  [/B]
   {
   $ausgabe = stripslashes($ausgabe);
   $zerlegen = explode("|", $ausgabe);

   echo "
Wenn ich es so schreibe, macht er garkeinen Eintrag mehr?
Und wenn ich es weg lasse, bleibt wie folgt, das jeder Eintrag 2mal angezeigt wird.
Gruß Basti
 
Werbung:
Wenn ich es so schreibe, macht er garkeinen Eintrag mehr?
Und wenn ich es weg lasse, bleibt wie folgt, das jeder Eintrag 2mal angezeigt wird.
Gruß Basti

Dann hast du nicht den richtigen oder nicht den vollständigen Code gezeigt.

Hier ein bei mir lauffähiges Beispiel:

PHP:
<?php

function ausgabe()
{
    $ret = '';

    if (!file_exists('gaestebuch.txt')) {
        return '';
    }

    $beitrag = file("gaestebuch.txt");
    krsort($beitrag);

    foreach($beitrag as $ausgabe) {
        if (trim($ausgabe) === '') {
            continue;
        }

        $ausgabe = stripslashes($ausgabe);
        $zerlegen = explode("|", $ausgabe);

        $ret .= "
   <table>
   <tr>
   <td>
  Von <a href=\"mailto:$zerlegen[0]\">$zerlegen[1]</a>
  am $zerlegen[2]
   </td>
   </tr>
   <tr>
   <td>
        $zerlegen[3]
   </td>
   </tr>
   </table><br>
        ";
    }

    return $ret;
}

function neu()
{
    $msg = '';

    $user = $_POST["Name"];
    $user = htmlentities($user);

    $inhalt = $_POST["inhalt"];
    $inhalt = htmlentities($inhalt);
    $inhalt = str_replace("\n", "<br>", $inhalt);

    $email = $_POST["EMail"];
    $email = htmlentities($email);

    if ($inhalt == "" or $user == "") {
        $msg = 'Sie müssen das Feld "Namen" und "Text" 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);

        $msg = "Ihr Eintrag wurde erfolgreich gespeichert";
    }

    return $msg;
}

error_reporting(E_ALL | E_STRICT);

$output = '';

if (isset($_POST['form_id'])) {
    if ($_POST['form_id'] === 'add_entry') {
       $output = neu();
    }
}

?><!DOCTYPE html>

<html>

    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>GB-Demo</title>
    </head>

    <body>

        <?php if ($output !== '') {
            echo $output;
            echo '<hr />';
        } ?>

        <?php echo ausgabe(); ?>

        <hr />

        <form method="post" action="">

            <p>Neuen Eintrag hinzufügen:</p>

            <p>Name: <input type="text" name="Name" /></p>
            <p>E-Mail: <input type="text" name="EMail" /></p>
            <p>Inhalt: <input type="text" name="inhalt" /></p>

            <p><input type="hidden" name="form_id" value="add_entry" />
                <input type="submit" /></p>
        </form>

    </body>

</html>
 
Hmm :D
Weiß zwar nicht wo der Fehler war aber danke ^.^
Jetzt funktioniert es.
 
Zuletzt bearbeitet:
Bis auf eine Sache!
Wenn ein Sonderzeichen oder z.b. ein Ü Ö oder Ä geschrieben wird, kommt ein "?".
Normal kann man dann ja: schreiben, aber wie mach ich das jetzt bei einem Gästebuch?
Gruß Basti
 
Werbung:
Dann musst Du dafür sorgen, dass alle Texte in dem Zeichensatz ausgegeben werden indem sie auch gespeichert werden. Da Du diese in einer Textdatei speicherst kann zudem auch der Zeichensatz des Dateisystems eine Rolle spielen.
 
Versuchs mal mit foplgendem code um ä ö ü und so umzuwandeln

PHP:
           $save=$_POST['text'];
           // umlaute_replace und save als txt
           $save = ereg_replace("ä","&auml;",$save);
           $save = ereg_replace("Ä","&Auml;",$save);
           $save = ereg_replace("ö","&ouml;",$save);
           $save = ereg_replace("Ö","&Ouml;",$save);
           $save = ereg_replace("ü","&uuml;",$save);
           $save = ereg_replace("Ü","&Uuml;",$save);
           $save = ereg_replace("ß","&szlig;",$save);
           $save = str_replace("\"","&quot;",$save);
           $save= stripslashes($save);
           $save_1 = "$save";
 
Dazu müsstest Du aber noch erwähnen, dass es nur die Umlaute in dem Zeichensatz ersetzt indem die Datei geschrieben wurde. Wenn der Server einen anderen Zeichensatz verwendet wird das wohl nichts. Zudem solltest Du noch erwähnen, dass sie durch die dazugehörige HTML-Kodierungen ersetzt werden.
 
Werbung:
ereg_replace ist veraltet und sollte nicht mehr verwendet werden (wird in einer der nächsten PHP-Versionen unter Umständen wegfallen). In dem Code reicht überall str_replace.

Ein weiteres Problem beim Originalscript tritt übrigens auf, wenn ein "|" eingetippt wird.

Probleme mit Sonderzeichen sind vermeidbar, wenn konsequent UTF-8 als Kodierung genutzt wird. Umformungen wie ä -> &auml; usw. sind eigentlich nicht mehr nötig.

Die sicherste Möglichkeit, eine Seite als UTF-8 auszugeben, ist das Setzen eines Headers ganz oben im PHP-Script:

PHP:
<?php

header('Content-Type: text/html; charset=utf-8');

?><!DOCTYPE ...

Eigentlich stehen im Script übrigens bereits Zeilen zur Umformung von Sonderzeichen:

PHP:
$inhalt = htmlentities($inhalt);

Die Fehlerbeschreibung in #6 ergibt vor diesem Hintergrund nicht ganz viel Sinn. Poste im Zweifel noch mal deinen aktuellen Code, Basti225.
 
Zurück
Oben