Christoph Schönfeld: GB überschreibt txt datei

Hab ein Problem:

Hab grad ein Grundgerüst für GB sozusagen geschrieben, dass Problem ist nur: Wenn ich einen Eintrag poste, dann kann ich ihn auch abrufen, klappt ja alles wunderbar, nur wenn ich dann noch einen Eintrag poste, dann überschreibt er den ersten!!!

hier mal mein gb:

gbverarbeitung.php
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Unbenanntes Dokument</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body bgcolor="#000066" text="#FFFFFF" link="#FFFFFF">
<div align="center">
  <table width="600" border="0" cellspacing="0" cellpadding="0">
    <tr>
      <td><div align="center"><font size="+2">Eintrag schreiben</font></div></td>
    </tr>
    <tr>
      <td> </td>
    </tr>
    <tr>
      <td><div align="center">

<?php
if ($name == "" || $text == "") {
     echo "Bitte alle Felder ausfüllen";
}
else {

$eintrag = "$name schrieb: <br><br> $text";

$datei = fopen("gb.txt","wr");
     fputs($datei, $eintrag);
     fclose($datei);

echo "Eintrag erfolgreich gespeichert";
}
?>

</div></td>
    </tr>
  </table>
</div>
</body>
</html>
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
gb.php
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<body bgcolor="#000066" text="#FFFFFF" link="#FFFFFF">
<div align="center">
  <table width="600" border="0" cellspacing="0" cellpadding="0">
    <tr>
      <td><div align="center"><font size="+2">Gästebuch</font></div></td>
    </tr>
    <tr>
      <td> </td>
    </tr>
    <tr>
      <td><div align="center">
          <?php include("gb.txt"); ?>
        </div></td>
    </tr>
    <tr>
      <td><a href="index.php?action=gbschreiben">Eintrag schreiben</a></td>
    </tr>
  </table>
</div>
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
gbschreiben.php
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Unbenanntes Dokument</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body bgcolor="#000066" text="#FFFFFF" link="#FFFFFF">
<div align="center">
  <table width="600" border="0" cellspacing="0" cellpadding="0">
    <tr>
      <td><div align="center"><font size="+2">Eintrag schreiben</font></div></td>
    </tr>
    <tr>
      <td> </td>
    </tr>
    <tr>
      <td><div align="center">
          <form action="index.php?action=gbverarbeitung" method="post">
            <input name="name">
        </div></td>
    </tr>
    <tr>
      <td><div align="center">
          <textarea name="text"></textarea>
        </div></td>
    </tr>
    <tr>
      <td><div align="center">
          <input type="submit" name="submit" value="posten">
          </form>
        </div></td>
    </tr>
    <tr>
      <td> </td>
    </tr>
  </table>
</div>
</body>
</html>
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ihr könnt das dann auch unter www.christophschoenfeld.de.vu sehen!!! Danke für die Hilfe, die hoffentlich kommt ^^

  1. Hi Christoph,

    $datei = fopen("gb.txt","wr");

    Hier muss statt dem wr folgendes stehen: w+ (ist jedenfalls meine Empfehlung)

    Viele Grüße
    Ben

    --
    Phantasie ist wichtiger als Wissen. - Albert Einstein
    1. Hab ich in sonem tut auch ma gesehn, was bedeutet das w+?

      w+ = schreiben (hinzufügen)?

      1. Hallo Christoph.

        Näheres zu den Optionen der Funktion fopen() steht recht ausführlich in der PHP-Dokumentation: http://www.php3.de/manual/de/function.fopen.php

        Grüße aus Würzburg
        Julian

      2. Hi,

        w+ setzt den Dateianzeiger an den Anfang der Datei und fügt die neuen Inhalte also jeweils vor die alten. Da du diese Datei ja dann ausgibst, ist das so rum gut, weil dann die neuesten Einträge jeweils am Anfang der Datei stehen.

        Ansonsten ist der Link von Julian genau richtig für dich. :-)

        Viele Grüße
        Ben

        --
        Phantasie ist wichtiger als Wissen. - Albert Einstein
        1. Hallo Ben,

          Rüge an Dich, mach mal nen C-Kurs mit. Hätte da 'ne Empfehlung für Dich *gg*

          w+ setzt den Dateianzeiger an den Anfang der Datei und fügt die neuen Inhalte also jeweils vor die alten. Da du diese Datei ja dann ausgibst, ist das so rum gut, weil dann die neuesten Einträge jeweils am Anfang der Datei stehen.

          "w+" ist der Selektor für: Suchen der Datei, Wenn nicht vohanden anlegen, wenn vorhanden löschen und unter gleichem Namen neu anlegen, Den Zeiger auf Anfang (bleibt einem bei neuen Dateien auch nix anderes übrig), Schreiben erlauben,  und außerdem ist späteres Lesen (+) auch erlaubt.

          "r+" ist dagegen eine nichtzerstörende Variante.

          Diese Umsetzungen der Filemodes in C als Strings und nicht als vorbelegte Variablen sind der größte Mist. Dadurch werden die teilweise sehr viel größeren Fähigkeiten des Betriebssystems abgeschnitten. Das aber nur so nebenbei.

          Liebe Grüße aus http://www.braunschweig.de

          Tom

          --
          Intelligenz ist die Fähigkeit, aus Fehlern Anderer zu lernen und Mut die, eigene zu machen.
          1. Hallo Tom,

            Rüge an Dich, mach mal nen C-Kurs mit. Hätte da 'ne Empfehlung für Dich *gg*

            Ohje, ohje.. *schäm*

            Gehöre doch zu den Leuten, die nie Informatik hatten. Man möge mir verzeihen. Die Empfehlung sollte ich mir vielleicht mal durch den Kopf gehen lassen. Ist das denn teuer? ;-)

            Viele Grüße
            Ben

            --
            Phantasie ist wichtiger als Wissen. - Albert Einstein
            1. Hi Ben,

              Gehöre doch zu den Leuten, die nie Informatik hatten. Man möge mir verzeihen. Die Empfehlung sollte ich mir vielleicht mal durch den Kopf gehen lassen. Ist das denn teuer? ;-)

              Wenn man damit auch irgendwie Geld verdient eigentlich nicht. Die Zeit, die man durch Stochern und Fehler sonst verbringt, ist bestimmt 10-20mal so teuer, wie ein Kursus.

              Liebe Grüße aus http://www.braunschweig.de

              Tom

              --
              Intelligenz ist die Fähigkeit, aus Fehlern Anderer zu lernen und Mut die, eigene zu machen.
              1. Hallo Tom,

                naja, so wirklich verdiene ich ja nich wirklich was damit. *g* Vielleicht komme ich dann mal drauf zurück! ;-)

                Wünsche dir noch n schönes Wochenende.

                Viele Grüße
                Ben

                --
                Phantasie ist wichtiger als Wissen. - Albert Einstein
  2. Hallo,

    bitte verzeih, wenn ich falsch liege, aber hier erscheint eine grundlegende Sortierphase wichtiger zu sein, als den Rat zu geben, die Datei im Append-Mode zu öffnen.

    <?php
    if ($name == "" || $text == "") {
         echo "Bitte alle Felder ausfüllen";
    }
    else {

    $eintrag = "$name schrieb: <br><br> $text";

    $datei = fopen("gb.txt","wr");

    $datei = fopen("bg.txt","a");
    wäre hier richtiger. Aber um Himmels willen nicht sofort umsetzen!!!
                         -----------------------------------------------
    erst weiterlesen.

    fputs($datei, $eintrag);
         fclose($datei);

    echo "Eintrag erfolgreich gespeichert";
    }
    ?>

    <table width="600" border="0" cellspacing="0" cellpadding="0">

    ...

    <tr>
          <td><div align="center">
              <?php include("gb.txt"); ?>
            </div></td>
        </tr>

    in dieser Passage holst Du Deine Einträge wiedr aus der Textdatei heraus und stellst sie Deinem Script mit voller Mächtigkeit zur Verfügung. Das bedeutet aber, dass es möglich wäre, dass Dir jemand PHP-Scripte in Dein Gästebuch schreibt, die direkt Anwaeisungen an das Betriebssystem geben können oder sonst irgendwelchen Schaden anrichten können. Einziger Schutz, den ich hier vermute, ist ein eingeschaltetes "magic_quotes" auf dem Server. Dadurch werden z.B. Anführungszeichen escaped -> mit einem Backslash versehen. Es wird also etwas schwieriger, dir schädliche Funktionen ins Gästebuch zu schreiben...

    Der Befehl "include" ist grundsätzlich nicht dafür geeignet, serverfremde Dateien, also solche von Nobodies, in Dein Script einzubinden.

    Du solltest an dieser Stelle besser den Befehl readfile() benutzen, der eine gespeicherte Datei direkt auf den Browser ausgibt. Allerdings kann der dazu führen, dass der gesamte HTML-Rahmen um die Ausgabe herum zerstört wird (unbalanciert usw). Denn noch hast Du nicht geprüft, was die Benutzer gesendet haben.

    Du solltest also nichts speichern, was nicht von Dir geprüft wurde. Dafür bietet PHP verschiedene Funktionen:

    strip_tags()      entfernt html-tags mit Ausnahme der erlaubten

    htmlspecialchars()wandelt alle html-Sonderzeichen in Ersetzungsseqzenzen
                      (¨ ß etc ) um.

    stripslashes()    Um die Backslashes wieder zu entfernen; aber
                      bitte nicht ohne die anderen Prüfungen vorher

    nl2br()           wandelt Zeilenumbrüche aus einer Textarea in <br /> um
                      bei älteren PHP-Versionen nur in <br>

    Du solltest Dir ausßerdem über ein Datensatzformat Gedanken machen, dass Du dann abspeichern kannst. In so einem Datensatz könnte stehen:

    IP          des Gästebuchbenutzers
    Datum       des Eintrages
    Uhrzeit     des Eintrages
    eMail       des Eintragers wenn er sie eingetragen hat
    Website     des Eintragers, wenn er sie angegeben hat
    Titel       falls er eine Überschrift wollte
    Text        die eigentliche Message
    Antwort     Deine Erwiderung auf den Eintrag.

    Diese ganzen Daten bindest Du am besten in einem Array und verpackst sie dann mit der Funktion

    serialize() Diese Funktion verpackt ganze Datenstrukturen in Strings.

    in einem String, den Du in der Datei abspeichern kannst.

    Wenn Du später Dein Gästebuch mittels einer Schleife anzeigen lässt, entpackst Du dieses Array mit

    unserialize()

    und alle Daten stehen Dir wieder in einzelnen Array-Elementen zur Verfügung. Wie man die ausgibt, weißt Du ja schon.

    Ach, noch etwas. Um die gesamte Datei erstmal einzulesen schau Dir mal die Funktion

    file()      liest eine Textdatei vollständig ein und speichert jede Zeile
                in einem Array-Element. Am Ende des Elementes hängt noch das
                Zeilenende-Zeichen, das z.B. vor einem unserialize() abgeschnitten
                werden sollte.

    So, viel neuer Stoff. Du hast also gut zu tu, Pack es an.

    Liebe Grüße aus http://www.braunschweig.de

    Tom

    --
    Intelligenz ist die Fähigkeit, aus Fehlern Anderer zu lernen und Mut die, eigene zu machen.
    1. Hi Tom,

      schöner hättest du _mein_ Gästebuchkonzept nicht erklären können *ggg*
      Gut, das mit der Aufteilung auf mehrere Seiten fehlt noch, aber das wird ihn erst interessieren, wenn er mehr Einträge hat.

      Grüße,
      Fabian
      [scnr]