Timbugtu: Datenbank für GB

Hallo,
hab nicht allzu viel erfahrung in PHP hab es aber trotzdem zu einem GB für meine Seite geschafft, doch nun hab ich das Problem, dass die Alten Einträge zuerst erscheinen, weil die neuen Einträge immer ans Ende der Datenbank geschrieben werden, wie kann ich das ändenr?
mfg

if ($_POST[name]=="" || $_POST[email]=="" || $_POST[eintrag]=="") {

echo "<h2>Bitte alle Felder ausfüllen!</h2>";

include "http://sthedwig-koblenz.de/Pfarrei/EintragenNeu.php";

} else {

echo "<h2>Eintrag erfolgreich!</h2>";

$eintrag = $_POST [eintrag];

$eintrag = str_replace("<","",$eintrag);
$eintrag = str_replace(">","",$eintrag);

$date_aktuell = strftime("%d.%m.%Y %H:%M");

$daten= "<hr><h2><a href=mailto:".$_POST[email].">".$_POST[name]."</a>, ".$date_aktuell.":</h2><gb>".$eintrag."</gb><br><br>";

$datenbank = "daten.dat";

$datei = fopen($datenbank,"a"); // hier muss glaub ich was geändert werden

fwrite($datei, $daten);

$datenbank = "http://sthedwig-koblenz.de/Pfarrei/daten.dat"; $datei = fopen($datenbank,"r");

fpassthru($datei);

}

?>

  1. Hello,

    hab nicht allzu viel erfahrung in PHP hab es aber trotzdem zu einem GB für meine Seite geschafft, doch nun hab ich das Problem, dass die Alten Einträge zuerst erscheinen, weil die neuen Einträge immer ans Ende der Datenbank geschrieben werden, wie kann ich das ändenr?

    Da gibt es noch mehr Probleme!

    1. Du hast einen Spammailer gebaut
    2. Du bringst namens- und handlebasierte Dateifunktionen durcheinander
    3. Du hast Dich nicht um den konkurrierenden Betrieb gekümmert (-> File locking)
    4. Du kümmerst Dich nicht um den Kontext, in dem ausgegeben wird.
    5. Du hast das Formular nicht benutzerfreundlich aufgebaut, -> Affenformular
       solange die Einträge nicht korrekt sind, werden sie dem Benutzer immer wieder
       vorgelegt, damit er nicht immer alles neu tippen muss.
    6. Array-Element-Bezeichner sind Literale (Strings) oder Variablen, aber keine Konstanten
       Du hast die Häkchen vergessen, um ein Literal von einer Konstante zu unterscheiden
    7. Du greifst auf Elemente desdes $_POST-Arrays zu, ohne vorher zu prüfen, ob diese auch
       vorhanden sind. Robots senden nicht immer alle Formular-Paramter zurück oder auch mal
       mehr, als ein human user. Das solltest Du nutzen für deinen eigenen Spamschutz

    Das Problem mit der Reihenfolge der Ausgabe ist da das geringste.
    Außerdem würde ich bei aller Großzügigkeit eine einzelne Datei nicht als Datenbank bezeichnen, womit wir aber bei deinem Thema sind. Wie macht man das, dass ältere Einträge zuerst ausgegeben werden?

    Dafür gibt es verschiedene Konzepte.
    Entweder man benutzt tatsächlich eine Datenbank und halst dieser das Problem auf. Das halte ich aber angesichts der Größe des Projektes (kleiner geht es fast nicht mehr) für übertrieben und außerdem lernst Du nichts dabei. Dass Du das aber willst, nehem ich stark an, denn sonst hättest Du ja ein fertiges Script benutzt.

    Mach weiter so! :-)

    Zweite Möglichkeit ist, ide Datei so aufzubauen, dass sie komplett in den Speicher passt. Dann kann man die Datensätze der Datei umsortieren nach jedem gewünschten Feld und erst dann ausgeben.

    Dritte Möglichkeit, und die halte ich für die eleganteste für die Praxis und zum Lernen: man baut sich einen Index auf, in dem nur die Metadaten und die kumulierten Daten (Nummer, Poster, Zeit, Subject, Dateiname) drinstehen und legt den eigentlichen Eintrag als Datei im Dateisystem ab.

    Das hat den Vorteil, dass der Index klein bleibt, einfach aufgebaut bleiben kann (Liste genügt) und daher auch wieder in den Speicher passt. Dort kann er bequem umsortiert werden und dann seiten- oder auch auszugsweise ausgegeben udn mit den dazugehörigen Dateien ergänzt werden.

    Das hat den Vorteil, dass man auch bequem Antworten auf Einträge schreiben kann. Man muss dann nur im Index eine Zeile einfügen, was aber sehr leicht möglich ist, weil er ja in den Speicher passt.

    Wenn Du diesen Weg gehen möchtest, können wir das gerne zusammen tun.

    Eine vierte Möglichkeit ist es, immer eine neue Datei aufzumachen, in die der neue Eintrag geschrieben wird und die alte dann anschließend hinten anzuhängen. Dann wird die alte Datei gelöscht (oder umbenannt auf *.BAK und die neue umbenannt auf den Namen der alten.

    Dabei muss man aber bei den unterschiedlichen Betriebssystemen (meistens Linux / manchmal Windows) auf die unterschiedliche Handhabung des Dateisystems achten. Es gibt große Unterschiede aufgrund des unterschiedlich voreingestellten Sperrverhaltens usw. der Systeme.

    if (empty($_POST['name']) or empty($_POST['email']) or empty($_POST['eintrag']))
    {
       echo "<p class="message">Bitte alle Felder ausfüllen!</p>";

    So wäre es besser. Allerdings darf 0 (numerisch oder digital Null) kein gewünschter wert sein dabei, denn das würde ebenfalls unter "empty" fallen.

    Liebe Grüße aus Syburg bei Dortmund

    Tom vom Berg

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

    hab nicht allzu viel erfahrung in PHP hab es aber trotzdem zu einem GB für meine Seite geschafft, ...

    GB? Gigabyte?

    doch nun hab ich das Problem, dass die Alten Einträge zuerst erscheinen, weil die neuen Einträge immer ans Ende der Datenbank geschrieben werden

    also so, wie es sich eigentlich intuitiv gehört: Die Liste wird von oben nach unten kontinuierlich fortgeschrieben. Die umgekehrte Reihenfolge, die man oft antrifft, kommt mir widernatürlich vor.
    Aber da du (wie ich weiter unten sehe) gar keine Datenbank verwendest, sondern einfach eine Datei, an die die Einträge immer nur angehängt werden, ist dieses Verhalten völlig logisch.

    if ($_POST[name]=="" || $_POST[email]=="" || $_POST[eintrag]=="")

    Diese Zeile müsste drei Fehlermeldungen (Notices) produzieren, weil du vermutlich keine Konstanten mit den Namen name, email und eintrag definiert hast. Du meinst eigentlich

    $_POST['name'], $_POST['email'], $_POST['eintrag']

    echo "<h2>Bitte alle Felder ausfüllen!</h2>";

    Ist eine solche Aufforderung eine Überschrift zweiter Ordnung? Das passt irgendwie nicht in meine Vorstellung einer schlüssigen Dokumentstruktur.

    include "http://sthedwig-koblenz.de/Pfarrei/EintragenNeu.php";

    Das ist vermutlich aus zwei Gründen falsch: Die eingefügte Ressource EintragenNeu.php liegt doch bestimmt auf demselben Server wie das übergeordnete Script. Dann ist es Unsinn, ein weiteres Script per HTTP einzubinden. Das hat vor allem den Nebeneffekt, dass die zwei Scripte keinen gemeinsamen Kontext haben, weil EintragenNeu.php isoliert als eigenständiger Aufruf ausgeführt wird und nur *dessen Ausgabe* wieder eingebunden wird.
    Wahrscheinlich willst du EintragenNeu.php einfach als Datei einbinden.

    Nebenbei bemerkt ist es gefährlich, gemischte Groß- und Kleinschreibung zu verwenden. Unix-basierte Systeme, unter denen die meisten Webserver laufen, unterscheiden bei Dateinamen peinlich genau zwischen Groß- und Kleinschreibung; als jahrelanger Windows-User, der das nicht gewöhnt ist, schießt man sich damit leicht ins Knie. Es hat sich (auch aus diesem Grund) als Konvention etabliert, Datei- und Verzeichnisnamen konsequent in Kleinbuchstaben zu schreiben.

    echo "<h2>Eintrag erfolgreich!</h2>";

    Siehe oben.

    $eintrag = $_POST [eintrag];

    Siehe oben.

    $eintrag = str_replace("<","",$eintrag);
    $eintrag = str_replace(">","",$eintrag);

    Warum willst du hier (VOR dem Speichern) die Symbole '<' und '>' löschen? Das wäre erst sinnvoll, wenn du die Einträge wieder im HTML-Kontext ausgibst. Und dann wäre die PHP-Funktion htmlspecialchars() anstelle dieser beiden replace-Aufrufe dein Freund, denn damit bleiben diese Zeichen im Text erhalten und werden nur HTML-konform maskiert.
    An dieser Stelle musst du die Daten nur für den Kontext maskieren bzw. umcodieren, in den du sie bringen willst. Für das Eintragen in eine MySQL-Datenbank wäre z.B. mysql_real_escape_string() angebracht. Da du aber eine gewöhnliche Textdatei verwendest, die so ziemlich alles enthalten darf, hängt die richtige Maskierung davon ab, wie du selbst deine Daten in dieser Datei strukturierst. Beispielsweise könnte es günstig sein, alle Zeilenumbrüche "\n" im Eingabetext durch die Zeichenfolge '\n' zu ersetzen und dann für jeden Eintrag eine Zeile vorzusehen.

    $date_aktuell = strftime("%d.%m.%Y %H:%M");

    $daten= "<hr><h2><a href=mailto:".$_POST[email].">".$_POST[name]."</a>, ".$date_aktuell.":</h2><gb>".$eintrag."</gb><br><br>";

    $datenbank = "daten.dat";

    $datei = fopen($datenbank,"a"); // hier muss glaub ich was geändert werden

    fwrite($datei, $daten);

    Dein ungünstiges Konzept setzt sich fort: Du speicherst alle Einträge als fertig aufbereitetes HTML. Was ist, wenn sich die Art der Darstellung mal ändern soll? Oder die Einträge gar nicht als HTML, sondern z.B. als Excel-Tabelle aufbereitet werden sollen? Dann sind die Einträge in ihrer momentanen Form unbrauchbar bzw. müssen erst wieder aufwendig analysiert und umcodiert werden.
    Versuche grundsätzlich, wo immer möglich deine Daten in einem neutralen Format zu speichern. Hier würde sich, wenn man schon eine einfache Textdatei anstatt einer "richtigen" Datenbank nehmen möchte, wirklich Plain-Text anbieten. Ein Eintrag pro Zeile, jede Zeile nach dem Muster

    Timestamp [Trennzeichen] Mailadresse [Trennzeichen] Name [Trennzeichen] Text

    Dann musst du nur dafür sorgen, dass der Zeilenumbruch nicht im Text vorkommt, wie ich oben schon schrieb.

    Die geeignete Aufbereitung für die *Anzeige* der Daten machst du dann erst beim Auslesen der gespeicherten Einträge.

    $datenbank = "http://sthedwig-koblenz.de/Pfarrei/daten.dat";
    $datei = fopen($datenbank,"r");

    Auch hier wieder: Nicht über HTTP zugreifen (ist in vielen PHP-Installationen sogar blockiert), sondern direkt auf Dateiebene.

    fpassthru($datei);

    Und dann fehlt ein fclose($datei). Das erledigt PHP zwar für dich, wenn das Script beendet wird; es gehört sich aber im Interesse "sauberer" Programmierung, selbst für solche Aufräumarbeiten zu sorgen.

    Übrigens gibt es noch die Funktion readfile(), die genau diese Kombination von fopen(), fpassthru() und fclose() in einem Aufwasch macht.

    Also, denk nochmal über das grundsätzliche Konzept nach und versuche, etwas mehr System hineinzubringen. Wenn's irgendwo hakt, kannst du gern nochmal hier nachfragen - wir freuen uns, wenn jemand bereitwillig mitmacht und etwas dabei lernen möchte.

    Schönes Wochenende noch,
     Martin

    --
    Heutzutage gilt ein Mann schon dann als Gentleman, wenn er wenigstens die Zigarette aus dem Mund nimmt, bevor er eine Frau küsst.
      (Barbra Streisand, US-Schauspielerin)
    1. Hello Martin,

      An dieser Stelle musst du die Daten nur für den Kontext maskieren bzw. umcodieren, in den du sie bringen willst. Für das Eintragen in eine MySQL-Datenbank wäre z.B. mysql_real_escape_string() angebracht. Da du aber eine gewöhnliche Textdatei verwendest, die so ziemlich alles enthalten darf, hängt die richtige Maskierung davon ab, wie du selbst deine Daten in dieser Datei strukturierst.

      Eine (My)SQL-Datenbank darf auch so ziemlich alles enthalten, genauso wie eine Textdatei.
      Nur die _Schnittstelle_ zur SQL-Datenbank kann das oft nicht, je nachdem, ob man eine textbasierte (mixed stream) oder eine blockbasierte (eine mit predefined Statements) benutzt.

      Liebe Grüße aus Syburg bei Dortmund

      Tom vom Berg

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

      hab nicht allzu viel erfahrung in PHP hab es aber trotzdem zu einem GB für meine Seite geschafft, ...

      GB? Gigabyte?

      Also mal ehrlich - wie lange bist Du hier aktiv?
      Das ist ja wohl klar, dass der OP GrauBrot meinte oder?

      off:PP

    3. GB? Gigabyte?

      Ich meinte Gästebuch ;-)

      Diese Zeile müsste drei Fehlermeldungen (Notices) produzieren, weil du vermutlich keine Konstanten mit den Namen name, email und eintrag definiert hast. Du meinst eigentlich

      $_POST['name'], $_POST['email'], $_POST['eintrag']

      Es komtm aber keine Fehlermeldung, fuktioniert tadelos...

      echo "<h2>Bitte alle Felder ausfüllen!</h2>";

      Ist eine solche Aufforderung eine Überschrift zweiter Ordnung? Das passt irgendwie nicht in meine Vorstellung einer schlüssigen Dokumentstruktur.

      Hab in einer CSS-Style datei h2 definirt gahebt und dieses Aussehn passte ganz gut dahin, deshalb die Überschrift zweiter Ordnung... aber macht man wahrscheinlcih dann normalerweise anders oder?^^

      include "http://sthedwig-koblenz.de/Pfarrei/EintragenNeu.php";

      Nebenbei bemerkt ist es gefährlich, gemischte Groß- und Kleinschreibung zu verwenden. Unix-basierte Systeme, unter denen die meisten Webserver laufen, unterscheiden bei Dateinamen peinlich genau zwischen Groß- und Kleinschreibung; als jahrelanger Windows-User, der das nicht gewöhnt ist, schießt man sich damit leicht ins Knie. Es hat sich (auch aus diesem Grund) als Konvention etabliert, Datei- und Verzeichnisnamen konsequent in Kleinbuchstaben zu schreiben.

      Das war mir in der Tat nciht bewusst-

      $eintrag = str_replace("<","",$eintrag);
      $eintrag = str_replace(">","",$eintrag);

      Warum willst du hier (VOR dem Speichern) die Symbole '<' und '>' löschen? Das wäre erst sinnvoll, wenn du die Einträge wieder im HTML-Kontext ausgibst. Und dann wäre die PHP-Funktion htmlspecialchars() anstelle dieser beiden replace-Aufrufe dein Freund, denn damit bleiben diese Zeichen im Text erhalten und werden nur HTML-konform maskiert.
      An dieser Stelle musst du die Daten nur für den Kontext maskieren bzw. umcodieren, in den du sie bringen willst. Für das Eintragen in eine MySQL-Datenbank wäre z.B. mysql_real_escape_string() angebracht. Da du aber eine gewöhnliche Textdatei verwendest, die so ziemlich alles enthalten darf, hängt die richtige Maskierung davon ab, wie du selbst deine Daten in dieser Datei strukturierst. Beispielsweise könnte es günstig sein, alle Zeilenumbrüche "\n" im Eingabetext durch die Zeichenfolge '\n' zu ersetzen und dann für jeden Eintrag eine Zeile vorzusehen.

      Also, denk nochmal über das grundsätzliche Konzept nach und versuche, etwas mehr System hineinzubringen. Wenn's irgendwo hakt, kannst du gern nochmal hier nachfragen - wir freuen uns, wenn jemand bereitwillig mitmacht und etwas dabei lernen möchte.

      Könntest du mir vielleciht mal einen Code vorschlag schreiben udn den kommentieren, ich glaub nicht, dass ich diese Änderungen auch nur im entferntesten alle alleine hinbekomme...danke schon mal für die Tippes

      1. Hallo,

        GB? Gigabyte?
        Ich meinte Gästebuch ;-)

        ja, aus dem Kontext war das leicht zu erraten. Ich wollte dich nur darauf hinweisen, dass die Abkürzung meiner Ansicht nach weder selbstverständlich noch allgemein bekannt ist.

        Diese Zeile müsste drei Fehlermeldungen (Notices) produzieren, weil du vermutlich keine Konstanten mit den Namen name, email und eintrag definiert hast. Du meinst eigentlich
          $_POST['name'], $_POST['email'], $_POST['eintrag']

        Es komtm aber keine Fehlermeldung, fuktioniert tadelos...

        Wenn keine Fehlermeldungen kommen, hast du (oder dein Webhoster) sie abgestellt. Es aber ist zumindest in der Entwicklungsphase sehr hilfreich, als erste Anweisung im Script

        error_reporting(E_ALL);

        zu setzen. Dann bekommt man nämlich alle diese kleinen "Schlampereien" auch gemeldet.
        Dass der Code trotzdem funktioniert, liegt an der Pseudo-Intelligenz von PHP, den Namen, der syntaktisch gesehen eigentlich der Name einer Konstanten wäre, stattdessen als String zu interpretieren, wenn die entsprechende Konstante nicht existiert.

        echo "<h2>Bitte alle Felder ausfüllen!</h2>";
        Ist eine solche Aufforderung eine Überschrift zweiter Ordnung?
        Hab in einer CSS-Style datei h2 definirt gahebt und dieses Aussehn passte ganz gut dahin, deshalb die Überschrift zweiter Ordnung... aber macht man wahrscheinlcih dann normalerweise anders oder?^^

        Ja. Man zeichnet den HTML-Code erst ohne Beachtung des Aussehens aus, nur nach der Bedeutung der Inhalte. Erst im zweiten Schritt gibt man den Elementen mit CSS das gewünschte Gesicht. In diesem Fall würde sich, wie Tom auch schon vorschlug, z.B. ein <p class="fehler"> anbieten.

        Nebenbei bemerkt ist es gefährlich, gemischte Groß- und Kleinschreibung zu verwenden. [...]
        Das war mir in der Tat nciht bewusst-

        Das ist nicht schlimm, solange du immer genau auf die Schreibweise achtest. Aber wie oft hatten wir schon panische Meldungen, dass z.B. bestimmte Bilder nicht gefunden würden, obwohl sie ganz bestimmt auf dem Server da wären. Tja, "bild01.jpg" ist eben nicht dasselbe wie "Bild01.jpg".

        Also, denk nochmal über das grundsätzliche Konzept nach und versuche, etwas mehr System hineinzubringen. Wenn's irgendwo hakt, kannst du gern nochmal hier nachfragen - wir freuen uns, wenn jemand bereitwillig mitmacht und etwas dabei lernen möchte.

        Könntest du mir vielleciht mal einen Code vorschlag schreiben udn den kommentieren, ich glaub nicht, dass ich diese Änderungen auch nur im entferntesten alle alleine hinbekomme...danke schon mal für die Tippes

        Ich kann dir einen Vorschlag zur Grobstruktur machen und ein paar Hinweise für die Feinheiten. :-)

        1. Initialisiere alle Variablen, die den Formularfeldern zugeordnet sind (Name, E-Mail, Nachricht). Wenn sie im Request übergeben wurden, übernimm sie von dort; andernfalls weise ihnen einen sinnvollen Defaultwert zu (z.B. einen Leerstring). Prinzip:
          $name = (isset($_POST['name']) ? $_POST['name'] : "");

        2. Prüfe, ob das Formular abgesendet wurde oder das Script direkt per URL aufgerufen wurde. Tipp: Wenn das Formular abgesendet wurde, enthält der Request das Name-Value-Pärchen des Submit-Buttons.

        3. Wenn das Formular abgesendet wurde:
        3a. Prüfe die eingegebenen Daten auf Richtigkeit nach deinen Kriterien. Überlege dabei, welche Eingaben du als falsch oder nicht erlaubt abweisen musst. Denke auch daran, dass die Eingaben nicht zwangsläufig aus deinem Formular stammen müssen; man kann den Request auch beliebig manipuliert haben.
        3b. Wenn die Prüfung erfolgreich war, schreibe die Daten in deine "Datenbank" (siehe unten) und leite per Location-Header wieder auf die ursprüngliche Script-URL zurück. Dadurch "verlierst" du die POST-Parameter, und ein versehentliches zweimaliges Eintragen durch Drücken des Reload-Buttons wird verhindert.

        4. Gib die HTML-Seite mit dem Formular aus. Trage dabei die in Schritt 1 ermittelten Werte in die Formularfelder ein. Falls du in Schritt 3a festgestellt hast, dass die Daten nicht deinen Kriterien entsprechen, gib an geeigneter Stelle einen Hinweis aus.

        5. Gib die bisherigen Einträge in deiner "Datenbank" aus.

        Das war natürlich nur eine ganz grobe Darstellung. Zwei Teile habe ich oben nur kurz gestreift, die möchte ich nochmal etwas genauer ausführen.

        Eintragen in die Textdatei:
        Du wolltest ja jeweils die neuesten Einträge oben haben, warum auch immer. Beim Lesen gehe ich daher so vor, dass ich erst die Datei komplett lese und dann in umgekehrter Reihenfolge bearbeite. Das setzt aber auch voraus, dass die Datei nicht zu groß werden darf, weil sie komplett in den Arbeitsspeicher passen muss (und PHP hat oft Limits von 8MB oder noch weniger). Du musst also ab und zu hergehen und die ältesten Einträge rauswerfen, wenn die Datei zu groß wird.

        ~~~php // Annahme: $name und $email enthalten weder Zeilenumbrüche noch "|"
         // Das wurde in der Prüfung (Schritt 3a) sichergestellt.
         // $nachricht darf Zeilenumbrüche und "|" enthalten.
         // Zeilenumbrüche werden entfernt (maskiert):
         $nachricht = str_replace("\n", '\n', $nachricht);
         sprintf($NeuerEintrag, "%u | %s | %s | %s\n", time(), $name, $email, $nachricht);
         $handle = fopen("gaestebuch.txt", "a");
         fwrite($handle, $NeuerEintrag);
         fclose($handle);

          
        So, jetzt noch das Auslesen. An dieser Stelle wird auch die Maskierung von HTML-Sonderzeichen vorgenommen, nicht schon beim Eintragen!  
          
         ~~~php
        $Eintraege = file("gaestebuch.txt");  
         // Rückwärts durchlaufen:  
         for ($i=count($Eintraege)-1; $i>=0; $i--)  
          { $data = explode(" | ", $Eintraege[$i], 4); // Zeile am " | " aufsplitten  
            echo "Zeitstempel: ", date("d-m-Y, H:i", $data[0]); // erstes Feld  
            echo "Name: ", htmlspecialchars($data[1]);  // zweites Feld  
            echo "E-Mail: ", htmlspecialchars($data[2]);  // drittes Feld  
            echo "Nachricht: ", htmlspecialchars(str_replace('\n', '<br>', $data[3])); // Rest des Eintrags  
          }
        

        Ich hoffe, dass dir diese Denkanstöße etwas weiterhelfen; ich möchte, wie gesagt, nur das Prinzip verdeutlichen. Diese Bausteine taugen nicht als fertige Lösung. Aber bestimmt wirst du die verwendeten Funktionen im PHP-Manual nachschlagen und versuchen zu verstehen, was sie machen. Mit konkreten Problemen bei der Umsetzung kannst du gern wieder vorbeikommen. ;-)

        So long,
         Martin

        --
        Mit einem freundlichen Wort und einer Waffe erreicht man mehr, als mit einem freundlichen Wort allein.
          (Al Capone, amerikanische Gangsterlegende)
        1. Hallo,
          hab versucht so viel wie möglich umzusetzten, ist mir aber nicht alles gelungen.

          Also als erstes wird guestbook.php aufgerufen:

          <div id="inhalte">

          <h1>Gästebuch</h1><br>

          <a href="eintragen.php" class="linknormal">Ins Gästebuch eintragen</a><br>

            
          <?php  
            
          $Eintraege = file("gaestebuch.txt");  
           // Rückwärts durchlaufen:  
            
           for ($i=count($Eintraege)-1; $i>=0; $i--)  
            { $data = explode(" | ", $Eintraege[$i], 4); // Zeile am " | " aufsplitten  
            
              echo htmlspecialchars($data[1]),",";  // erstes Feld  
              echo " E-Mail: ", htmlspecialchars($data[2]);  // zweites Feld  
              echo " ", date("d-m-Y, H:i", $data[0]), ":<br>"; // drittes Feld  
              echo htmlspecialchars(str_replace('\n', '<br>', $data[3])); // Rest des Eintrags  
              echo "<br><br>";  
            }  
            
            
          ?>  
          
          

          </div>

          Das klappt auch alles wunderbar :-)

          Wenn man einen Eintrag machen möchte wird dann eintragen.php aufgerufen:

          <!-- Inhalt -->

          <div id="inhalte">

          <form method="post" action="gb.php">

          Ihr Name: <BLOCKQUOTE><input type="text" name="name"><br></BLOCKQUOTE>

          E-Mail Adresse: <BLOCKQUOTE><input type="text" name="email"><br></BLOCKQUOTE>

          Ihr Eintrag: <BLOCKQUOTE><textarea name="eintrag"></textarea><br></BLOCKQUOTE>

          <input type="submit" name="Button" value="Absenden">

          </form>

          </div>

          Und dann das eigentlich gb.php:

          <div id="inhalte">

          <?php

          error_reporting(E_ALL);

          $name = (isset($_POST['name']) ? $_POST['name'] : "");
          $email = (isset($_POST['email']) ? $_POST['email'] : "");
          $eintrag = (isset($_POST['eintrag']) ? $_POST['eintrag'] : "");
          $nachricht = " ";
          $NeuerEintrag = '%u %s %s %s';
          $zeit = time();

          if ($name =="" || $email =="" || $eintrag =="") {

          echo "Bitte alle Felder korrekt ausfüllen ausfüllen!";

          // an der Stelle hatte ich vorher das formular inculded, aber das sollte //ich ändern, aber wie?

          } else {

          $eintrag = str_replace("\n", '\n', $eintrag);

          $NeuerEintrag = sprintf("%u | %s | %s | %s\n",$zeit, $name, $email, $eintrag);

          $handle = fopen("gaestebuch.txt", "a");
          fwrite($handle, $NeuerEintrag);
          fclose($handle);

          echo "Eintrag erfolgreich!";

          }
          ?>
          </div>
          Und da stellen sich mir dann noch ein paar Fragen:

          1. Prüfe, ob das Formular abgesendet wurde oder das Script direkt per URL aufgerufen wurde. Tipp: Wenn das Formular abgesendet wurde, enthält der Request das Name-Value-Pärchen des Submit-Buttons.

          Weiß nicht wie das gehn soll...

          1. Wenn das Formular abgesendet wurde:
            3a. Prüfe die eingegebenen Daten auf Richtigkeit nach deinen Kriterien. Überlege dabei, welche Eingaben du als falsch oder nicht erlaubt abweisen musst. Denke auch daran, dass die Eingaben nicht zwangsläufig aus deinem Formular stammen müssen; man kann den Request auch beliebig manipuliert haben.

          Da hab ich jetzt das Problem dass ich nciht weiß nach was ich die denn überhaupt prüfen soll.

          1. Gib die HTML-Seite mit dem Formular aus. Trage dabei die in Schritt 1 ermittelten Werte in die Formularfelder ein. Falls du in Schritt 3a festgestellt hast, dass die Daten nicht deinen Kriterien entsprechen, gib an geeigneter Stelle einen Hinweis aus.

          Was is damit gemeint?

          // Annahme: $name und $email enthalten weder Zeilenumbrüche noch "|"  
          
          >  // Das wurde in der Prüfung (Schritt 3a) sichergestellt.  
          >  // $nachricht darf Zeilenumbrüche und "|" enthalten.  
          >  // Zeilenumbrüche werden entfernt (maskiert):  
          >  $nachricht = str_replace("\n", '\n', $nachricht);  
          >  sprintf($NeuerEintrag, "%u | %s | %s | %s\n", time(), $name, $email, $nachricht);  
            
          // das hat bei mir nur so geklappt:  
          //$NeuerEintrag = sprintf("%u | %s | %s | %s\n",$zeit, $name, $email, //$eintrag);  
            
          
          >  $handle = fopen("gaestebuch.txt", "a");  
          >  fwrite($handle, $NeuerEintrag);  
          >  fclose($handle);
          
          

          Das Auslesen hat auf Anhieb direkt geklappt.
          Vielen Dank nochmal für die ausführlichen Antworten und für die, die da villeicht noch kommen.

          mfg markus

  3. Hallo,
    viel Dank erstmal für die schnellen Antworten! So wie es aus sieht muss ich dann wohl das ganze Gästebuch neu aufbauen, wenn Ihr mir dabei villeicht den Ansatz als Code geben könntet wäre das super, denn bei den ganzen Verbesserungsvorschlägen denke ich, dass ich ein koplett neues Gästebuch schreiben werde, hab aber wie gesagt nicht viel Erfahrenung ist meine erstes Hompageprojekt und hab mir alles nur im Internet angelesen...und wie Tom geschrieben hat möchte ich wirklich kein fertiges Scrip benutzen, dann ich will wirklich dahinter schauen^^.
    mfg

    1. Hello,

      viel Dank erstmal für die schnellen Antworten! So wie es aus sieht muss ich dann wohl das ganze Gästebuch neu aufbauen, wenn Ihr mir dabei villeicht den Ansatz als Code geben könntet wäre das super, denn bei den ganzen Verbesserungsvorschlägen denke ich, dass ich ein koplett neues Gästebuch schreiben werde, hab aber wie gesagt nicht viel Erfahrenung ist meine erstes Hompageprojekt und hab mir alles nur im Internet angelesen...und wie Tom geschrieben hat möchte ich wirklich kein fertiges Scrip benutzen, dann ich will wirklich dahinter schauen^^.

      Dann solltest Du Dich als erstes für ein Konzept entscheiden.

      Möchtest Du

      [ ] alle Daten in einer Datei halten
        [ ] oder würden Dir auch mehrere zusagen?  (empfohlen)

      [ ] das Script in einer Datei halten (empfohlen)
        [ ] oder auf mehrere Einzelscripte aufteilen?

      Wie hoch schätzt Du Dein Datenaufkommen ein (ohne Bilder)?

      [ ] 0 - 1kByte am Tag
        [ ] 1kByte bis 10kByte am Tag
        [ ] 10 bis 100kByte am Tag
        [ ] wesentlich höher

      usw.

      Das bedeutet, je klarer Du vorher Deine Wünsche definierst und je klarer Du die dann in Einzelaufgaben aufspalten kannst, desto einfacher wird die Abarbeitung der Programmieraufgabe. Sie dauert dann selbstverstöndlich immer länger, aber je besser Du die Abgrenzug der einzelnen Aufgaben voneinenader hinbekommst, desto besser kannst Du später die entstehenden Codeteile für andere Projekte wiederverwenden.

      Dabei ist es ziemlich egal, ob Du eine saubere prozedurale Programmierweise oder eine objektorientierte wählst.

      Liebe Grüße aus Syburg bei Dortmund

      Tom vom Berg

      --
      Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
    2. Liebe(r) Timbugtu,

      nimm doch zuerst eine XML-Datei zum Speichern Deiner GB-Daten, denn eine solche finde ich für diesen Zweck am besten. Und mit PHP gibt es eine Menge an Möglichkeiten, mit XML-Dateien umzugehen, z.B. um die in der XML-Datei abgelegten Daten in ein Array umzuwandeln...

      Liebe Grüße aus Ellwangen,

      Felix Riesterer.

      --
      ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)