Sarah: Nur den letzten Eintrag anzeigen

Hi!

Ich habe auf

http://tipps.project-smooth.com/programmieren/php-gaestebuch-textdatei

einen recht praktischen Script für ein primitives Gästebuch gefunden.
Im "zweiten Teil" des Scripts werden die Einträge mittels array_reverse sozusagen umgekehrt geordnet.
Meine Frage: kann man diesen Script auch (möglichst primitiv) so umschreiben, dass nur der jeweils letzte Eintrag in der .txt Datei angezeigt wird?

Vielen Dank für die Hilfe!
Sarah

  1. hi,

    http://tipps.project-smooth.com/programmieren/php-gaestebuch-textdatei
    Meine Frage: kann man diesen Script auch (möglichst primitiv) so umschreiben, dass nur der jeweils letzte Eintrag in der .txt Datei angezeigt wird?

    Du müsstest einfach statt der Zeile
    $daten = array_reverse($daten);
    die neue Zeile
    $daten = $daten[count($daten)];
    ersetzten. Somit wird eben immer nur der neueste Eintrag angezeigt..

    lg JeSchnell

    PS: Ich würde dir empfehlen zu einem anderen Tutorial zu greifen (z.B. http://www.tutorials.de/forum/php-tutorials/6538-php-dateibasiertes-gaestebuch.html), da dieses ziemlich viele Bugs (z.B. Emaillinks werden ohne Protokollangabe - "mailto:" - geschrieben und Browser glauben, dies ist eine http-Adresse) hat.

    1. Super! Ich dachte mir schon, dass es da eine einfache Lösung geben muss! Vielen Dank JeSchnell!

    2. Hello,

      Du müsstest einfach statt der Zeile
      $daten = array_reverse($daten);
      die neue Zeile
      $daten = $daten[count($daten)];
      ersetzten. Somit wird eben immer nur der neueste Eintrag angezeigt..

      Fast getroffen ist auch daneben :-)

      Wenn das Array zwei Datensätze enhält, haben diese die numerischen Indexe 0 und 1
      Man müsste also abfragen, wieviele Datensätze das Array enthält und wenn es mehr als Null sind, auf den Datensatz temp[0] für den ersten oder $temp[count(temp)-1] für den letzten zugreifen.

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
       ☻_
      /▌
      / \ Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
      1. Danke Leute für die Hilfe, aber wie Tom schon bemerkt hat funktioniert das doch nicht sooo einfach...

        Fast getroffen ist auch daneben :-)

        Heißt das der Tip mit
        $daten = $daten[count($daten)];
        stimmt schon ist aber noch zu wenig oder?

        Wenn das Array zwei Datensätze enhält, haben diese die numerischen Indexe 0 und 1
        Man müsste also abfragen, wieviele Datensätze das Array enthält und wenn es mehr als Null sind, auf den Datensatz temp[0] für den ersten oder $temp[count(temp)-1] für den letzten zugreifen.

        Ich habe Den Script jetzt so weit modifiziert, dass es nur noch ein Formularfeld gibt. (Damit kann eine Freundin dann selber Öffnungszeiten bekannt geben). Ich möchte eben, dass jedes Mal wenn sie im Formular eine neue Öffnungszeit eingibt und an an die *.txt Datei am Server sendet nur dieser Letzte Eintrag auf der Homepage angezeigt wird.

        Hier der Script vom Formular:

        <form action="../../aktuelles.php" method="post" name="form" id="form">
        <div style="width: 100%; padding-top: 40px;" align="center">
        <table width="400" style="font-weight: bold; margin: 0px auto;">
        <tr>
        <td height="272" valign="top" bgcolor="#FFFFFF">
        Nachricht:
        </td>
        <td>
        <textarea class="textfeld" name="offen" cols="85" rows="20"></textarea>
        </td>
        </tr>
        <tr bgcolor="#FFFFCC">
        <td height="51" colspan="2">
        <div align="center">
          <input name="123" type="submit" id="123" style="border: 1px solid white; margin:4px; color: #0f0157; font-weight: bold;" value="senden" /></div>
        </td>
        </table>
        </div></form>

        Auf der PHP Seite stehen dann folgende Codes:

        Ganz oben:
        <?php
        $timestamp = time();
        if($_POST["123"] == "senden"){
        $temp = "\n".date("d-m-Y - H:i",$timestamp). " :: " .str_replace("\r\n", "", nl2br(stripslashes($_POST["offen"])))."";
        $fh = fopen('sites/admin/offen.txt',"a");
        fputs($fh,$temp);
        fclose($fh);
        }
        ?>

        Im Div wo die Öffnungszeit eingefügt wird steht folgendes (und hier liegt irgendwo das Problem):

        <?php
        // Dateiformat: date :: nachricht
        $daten = file('sites/admin/offen.txt');
        $daten = $daten[count($daten)];
        foreach($daten as $temp){
        $temp = split(' :: ', $temp);
        echo '<p>';
        echo $temp[count(temp)-1], '</p>';
        }
        ?>

        Nichts desto trotz bekomm ich nur eine "Invalid argument supplied for foreach()" Meldung...

        Warum muss immer alles so komliziert sein ?! ;-)

        1. Hello,

          Im Div wo die Öffnungszeit eingefügt wird steht folgendes (und hier liegt irgendwo das Problem):

          <?php
          // Dateiformat: date :: nachricht
          $daten = file('sites/admin/offen.txt');

          #> $daten = $daten[count($daten)];    ## (n+1)-Problem!
          #> foreach($daten as $temp){          ## keine Schleife mehr notwendig

          $zeiten = 'keine Zeiten bekannt';   ## prophilaktisch

          if (count($daten) > 0)              ## ist überhaupt ein Datensatz vorhanden?
            {
                $recordstr = $daten[count($daten)-1];    ## auf den letzten DS zugreifen
                $temp = split(' :: ', $recordstr);       ## wir splitten im Vertrauen darauf, dass
                                                         ## in den Daten kein '::' enthalten ist.
                if (count($temp) > 1)
                {
                    $zeiten = $temp[1];
                }
            }

          echo '<p>' . htmlspecialchars($zeiten) . '</p>';

          ?>

          Liebe Grüße aus dem schönen Oberharz

          Tom vom Berg

          --
           ☻_
          /▌
          / \ Nur selber lernen macht schlau
          http://bergpost.annerschbarrich.de
  2. Hello,

    Ich habe auf

    http://tipps.project-smooth.com/programmieren/php-gaestebuch-textdatei

    einen recht praktischen Script für ein primitives Gästebuch gefunden.

    Das ist aber wirklich sehr primitiv gehalten.

    <?php
        $timestamp = time();
        if($_POST["xyz"] == "senden")
        {
            $web = $_POST["web"];
            $email = $_POST["email"];
    ##      Das Umkopieren der Array-Elemeten in "lose" Variablen ist unnötig und sogar
    ##      kontraproduktiv, weil man dann nicht mehr sofort sehen kann, woher die Werte stammen

    if(ereg("http://", $web) == FALSE)
            {
                $web = "http://" . $web;
            }

    if(ereg(".", $web) == FALSE)
            {
                $web = "";
            }

    if(ereg("@", $email) == FALSE)
            {
                $email = "";
            }

    $temp = "\n".date("Y-m-d - H:i",$timestamp). " :: " .$_POST["name"]. " :: "
                  . $email . " :: " .$web. " :: "
                  . str_replace("\r\n", "", nl2br(stripslashes($_POST["message"]))) . "";

    ##      Der Trenner für die Felder wird in den übersandten Daten nicht
    ##      nicht aufgeprüft und ggf. entfern/ersetzt.
    ##      stripslashes() muss nur benutzt werden, wenn magic_quotes_gpc eingeschaltet
    ##      war. http://de.php.net/manual/en/function.get-magic-quotes-gpc.php und
    ##      sollte dann auch auf alle Elemente des Post-Arrays angewandt werden.
    ##      Das Entfernen von nur "\r\n" kann bei gammeligen Browsern oder gefakten
    ##      Posts zu Problemen führen. Du solltest "\r\n", "\r", "\n" entfernen lassen,
    ##      oder aber anders speichern (serialisiertes Array oder CSV-Datei)

    ##      Die Post-Parameter können HTML, JavaScript enthalten -> siehe Ausgabe

    $fh = fopen('guestbook.txt',"a");

    ##      es fehlt die Abfrage, ob fopen() erfolgreich war

    fputs($fh,$temp);
            fclose($fh);
        }
    ?>

    #--- Ausgabe

    <?php
        // Dateiformat: date :: name :: email :: website :: nachricht

    $daten = file('guestbook.txt');
        $daten = array_reverse($daten);

    foreach($daten as $temp)
        {
            $temp = split(' :: ', $temp);
    ##      die Trenner können z.Zt. auch noch im Text/den Feldinhalten  enthalten sein
    ##      Du prüfst überhaupt nicht, wieviele Elemente das Array enthält.

    echo '<p>';

    if($temp[2] == "")
            {
                echo '<h3 class="gbheading">'.$temp[1].'</h3>';
            }
            else
            {
                echo '<h3 class="gbheading"><a href="'.$temp[2].'">'.$temp[1].'</a></h3>';
            }

    echo $temp[4].'</p>';

    if($temp[3] != "")
            {
                echo '<p><span class="web">website: <strong><a href="'.$temp[3].'" rel="nofollow">'
                    . str_replace("http://", "", $temp[3]).'</a></strong></span></p>';
            }
    }
    ?>

    Es werden ggf. auch HTML-Inhalte und JavaScript mit ausgegeben.
    Das ist nicht sicher, weil die Seite dadurch für Cross-Site-Scripting Attacken missbraucht werden kann.

    Zu Deiner Frage:
    Da die Datensätze bei ordnungsgemäßer Bentutzung jeweils in einem eignen Element des Arrays $temp liegen, kannst Du jeden einzeln erreichen, also auch nur den ersten, nur den letzten oder wie auch immer.

    Dies geht mit den Funktionen
    letzter Datensatz: array_pop()   http://de.php.net/manual/en/function.array-pop.php,
    erster Datensatz:   array_shift() http://de.php.net/manual/en/function.array-shift.php,
    durch direkten Zugriff über den Index

    erster Datensatz:
        if (isset($temp[0]))
        {
            ## verarbeite ersten Datensatz
            $_rec = explode('::',$temp[0]);
            print_r($_rec);
        }

    letzter Datensatz:

    if (isset($temp[count($temp)-1]))
        {
            ## verarbeite letzten Datensatz
            $_rec = explode('::',$temp[count($temp)-1]);
            print_r($_rec);
        }

    und weitere Array-Funktionen
    http://de.php.net/manual/en/ref.array.php

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de