Oliver: Gästebuch | Script schreibt 2 mal den eintrag ?

Hallöle,

http://f1web36.frankfurt161.jkserver.info/lupinland/gbook.shtml

Ich hab da ein kleines Gästebuch erstellt. Nur dummerweise liest es die Einträge aus der gaestebuch.txt aus, setzt den neuen Eintrag hinzu und schreibt dann aber 2mal den kompletten Inhalt der gaestebuch.txt.

Anbei mal der Code:

<?php
if ($action == "add"){

if ($name == "" || $mail == "" || $text == ""){
echo "<b>Du hast nicht alle Felder ausgefüllt !</b><br>";
echo "Klicke auf den Backbutton deines Browsers";
}
else{

$fp = fopen("gaestebuch.txt","r+");

$inhalt= fread($fp,filesize("gaestebuch.txt"));

fclose($fp);

if ($www == ""){
$eintrag = "$inhalt<a href="mailto:$mail">$name</a><br>$text";
}
else{
$eintrag = "$inhalt <div class="booktext">Eintrag von: $name<br /><br />Email: <a href="mailto:$mail">$name</a>
<br /><a class="book" href="$www">$www</a><hr class="bookline">$text</div>";
}

$datei = fopen("gaestebuch.txt","a+");
fputs($datei,$eintrag);
fclose($datei);
echo "Danke <i>$name</i> für deinen Eintrag. <a href="gbook.shtml">Hier</a> geht es zurück";
}
}
else{
?>
<?php
include("gaestebuch.txt");
?>
<div style="margin-top:20px; border:0px solid #0000E1">
<b>Eintragen in mein Gästebuch</b><br>
<form action="eintragen.php?action=add" method="post">
<table>
<tr>
<td class="booktable">Dein Name:</td>
<td class="booktable"><input type="text" name="name" size="24"></td>
</tr>
<tr>
<td class="booktable">E-Mail:</td>
<td class="booktable"><input type="text" name="mail" size="24"></td>
</tr>
<tr>
<td class="booktable">Homepage:<td class="booktable"><input type="text" name="www" size="24" value="http://"></td>
</tr>
<tr>
<td class="booktable" colspan="2">Dein Eintrag:<br>
<textarea name="text" cols="35" rows="5"></textarea></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="Abschicken"></td>
</tr>
</table>
</form>
</div>
<?php
}
?>

wat is denn da nu falsch ? es kann doch nur an dem r+ und dem a+ liegen, oder ?

GRüsse
Olli

  1. hi

    Verwend doch statt;

    $datei = fopen("gaestebuch.txt","a+");
    fputs($datei,$eintrag);

    $datei = fopen("gaestebuch.txt","w+");

    weil mit "a+" wird am ende eingefügt und da du den Inhalt aus der Datei ausließt und an $eintrag anhängst ist es nicht verwunderlich das das gesamte Gästebuch wieder reingeschrieben wird *ggg*

    mgf
    DMIII

  2. Hallo.

    ...Nur dummerweise liest es...

    Jaja, wieder alles auf das arme kleine Script schieben. Es tut _genau_ das, was es tun soll: Den Inhalt auslesen, hinten den neuen Eintrag anhängen und schließlich das ganze ans Ende der txt-Datei schreiben.

    Schau Dir nochmal http://www.php3.de/manual/de/function.fopen.php an und beachte, wie (mode) Du die Datei öffnest.

    Grüße aus Würzburg
    Julian

  3. Hi Olli,
    zuerst liest du den gesammten Inhalt der Datei aus:

    $inhalt= fread($fp,filesize("gaestebuch.txt"));

    dann hängst du den neuen eintrag daran:

    $eintrag = "$inhalt <div class="booktext">Eintrag von: $name<br /><br />Email: <a href="mailto:$mail">$name</a>
    <br /><a class="book" href="$www">$www</a><hr class="bookline">$text</div>";

    d.h $eintrag enthält jetzt den gesammten inhalt und den neuen Beitrag. Danach öffnest du die datei zum ANHÄNGEN:

    $datei = fopen("gaestebuch.txt","a+");

    d.h. du hängst an den bereits vorhandenen Inhalt der Datei nochmal $eintrag an, der wie oben gesagt bereits alle alten einträge und den neuen enthält. Du fügst die alten Daten also jedesmal erneut ein....

    Lass einfach

    $fp = fopen("gaestebuch.txt","r+");
    $inhalt= fread($fp,filesize("gaestebuch.txt"));

    sowii das $inhalt aus der Zuweisung für $eintrag weg, und alles sollte funktionieren, wie du es vorgesehen hast.

    lates Cano2

  4. Ich hab da ein kleines Gästebuch erstellt. Nur dummerweise liest es die Einträge aus der gaestebuch.txt aus, setzt den neuen Eintrag hinzu und schreibt dann aber 2mal den kompletten Inhalt der gaestebuch.txt.

    $fp = fopen("gaestebuch.txt","r+");
    $inhalt= fread($fp,filesize("gaestebuch.txt"));
    fclose($fp);

    $eintrag = "$inhalt<a href="mailto:$mail">$name</a><br>$text";

    $datei = fopen("gaestebuch.txt","a+");
    fputs($datei,$eintrag);
    fclose($datei);

    wat is denn da nu falsch ? es kann doch nur an dem r+ und dem a+ liegen, oder ?

    Na, wenn Du den Fehler schon kennst, warum behebst Du ihn dann nicht? :)

    Informiere Dich nochmal über die Funktion vom Modus a (insbesondere im Gegensatz zu w, http://www.php.net/manual/de/function.fopen.php) und schau Dir den Code oben nochmal genau an und verfolge, was in $inhalt, $text und $eintrag eigentlich alles steht.

    Gruß,
      soenk.e

  5. Sammelantwort *g* :

    Hi,

    also ich habe alle Eure Tipps probiert. Doch einmal ging gar nichts mehr und die anderen Male hat das script alles gelöscht und NUR den neuesten Eintrag geschrieben oder eben das ursprüngliche Ergebnis ausgespuckt :(

    Ich glaub ICH sollte doch noch ein bisschen mehr php lesen *$selfphp 'r'* und dann erst wieder anfangen php zu schreiben *$gästebuch 'w'*
    *fg*

    Aber trotzdem Danke, ich werds heute nacht mal weiter versuchen :)

    Grüsse aus HD
    Olli

    1. also ich habe alle Eure Tipps probiert. Doch einmal ging gar nichts mehr und die anderen Male hat das script alles gelöscht und NUR den neuesten Eintrag geschrieben oder eben das ursprüngliche Ergebnis ausgespuckt :(

      Es wurden hier _zwei_ Lösungswege beschrieben. Wenn Du beide zusammen ausprobierst, geht's natürlich wie oben beschrieben in die Hose. Ändere entweder den Modus bei fopen() oder die Benutzung der Variablen - aber nicht beides.

      Gruß,
        soenk.e

      1. Hi,

        Es wurden hier _zwei_ Lösungswege beschrieben. Wenn Du beide zusammen ausprobierst, geht's natürlich wie oben beschrieben in die Hose. Ändere entweder den Modus bei fopen() oder die Benutzung der Variablen - aber nicht beides.

        natürlich hab ich jeweils nur eins versucht und NICHT beides gleichzeitig.

        Gruß,
          soenk.e

        Gruss
        Olli

      2. Naja, hab mich jetzt nochmal ne Stunde damit befasst und muss sagen, das ich nicht dahinter komme. Ich verstehe zwar den ein oder anderen Zusammenhang, aber der Grossteil bleibt mir ein Rätsel.
        Das Gästebuch ist auf jeden Fall wieder entlinkt (zumal sich einer schon nen scherz draus gemacht hat es komplett zu schliessen - toller js-künstler ! )
        Und da ich jetzt schon erhebliche Probleme bei dem läbischen gästebuch-script habe, wird es wohl auch nie grösser bzw. sicherer werden. Also glaub ich ist es das beste mein altes GB zu behalten (das geht wenigstens^^) und zu akzeptieren das es sachen gibt die ich mir halt nicht einfach mal so selbst beibringen kann.

        Gruß,
          soenk.e

        Gruß zurück
        Olli:)