Enrico: Blätter-Funktion in PHP

Hallo,

Ich habe - unter Zuhilfenahme einiger Tutorials - das Grundgerüst eines Gästebuches in PHP programmiert, das so auch schon wunderbar funktioniert, worauf ich stolz bin (bin absoluter, aber begeisterter PHP-Anfänger).

Nun stehe ich aber vor dem - für mich riesigen - Problem, eine dynamische Steuerungs-Funktion zum Vor-und Zurückblättern einzubauen. Ich habe mir diesbezüglich schon etliche Gästebücher angeschaut, konnte aber die Vorgehensweise leider nicht "herausfiltern".

Die Anzeige soll folgendermassen aussehen:

Erste Seite | Zurück | 6 | 7 | 8 | 9 | 10 | Vor | Letzte Seite

"Zurück": 5 Seiten zurückblättern
"Vor":    5 Seiten vorblättern

Die Anzeige der Steuerung soll natürlich in Abhängigkeit der tatsächlich vorhandenen Einträge in Verbindung der Anzahl der Seiten erfolgen, d.h. alle Einträge sollen auf x Seiten verteilt werden. Befindet man sich auf der ersten Seite unseres Gästebuches, dann machen die Links "Erste Seite" und "Zurück" keinen Sinn. Analog dazu sollen die Links "Vor" und "Letzte Seite" nicht angezeigt werden, wenn man sich auf der letzten Seite befindet.

Die von mir verwendeten Variablen lauten folgendermassen:

$anzahl              = file("CSV_gaestebuch_eintraege.csv");
$temp                = count($anzahl)-1;
$eintraege_pro_seite = 10;

Könnt Ihr mir da bitte weiterhelfen ?

MfG, Enrico

  1. Hallo Enrico,

    (bin absoluter, aber begeisterter PHP-Anfänger).

    Tja, infiziert. Zu spät. ;)

    Könnt Ihr mir da bitte weiterhelfen ?

    Ist mit mySQL gemacht, aber das Prinzip ist immer das gleiche: http://www.dclp-faq.de/q/q-mysql-seitenweise.html

    Gruß, Thoralf

    --
    Sic Luceat Lux!
    1. Hallo Thoralf,

      Wenn Du noch so freundlich wärst und mir erklären könntest, wie ich die SQL-Anweisungen als "Nicht-SQL'ler" in normalen PHP-Code umsetzen kann :o)

      Gruss, Enrico

      1. Hallo Enrico,

        Wenn Du noch so freundlich wärst und mir erklären könntest, wie ich die SQL-Anweisungen als "Nicht-SQL'ler" in normalen PHP-Code umsetzen kann :o)

        den SQL-Teil brauchst Du gar nicht. Interessant für Dich ist nur der letzte Abschnitt.

        // Datendefinition für die Clientausgabe
        $start = (isset($start)) ? abs((int)$start) : 0;
        $limit = 10;                     // Datensätze pro Ausgabeseite

        Vorgaben, und Voreinstellung, wenn die Seite ohne Parameter aufgerufen wird. Dann geht es vorn los.

        // Ggf. $start korrigieren (falls Parameter in
        // der URL manipuliert wurde)
        $start    = ($start >= $total) ? $total - $limit : $start;

        Was diese Zeile macht, steht im Kommentar. ;)

        // Zurück- und Vorblättern
        if ($start > 0)
        {
          $newStart = ($start - $limit < 0) ? 0 : ($start-$limit);
          echo "<a href=".$_SERVER['PHP_SELF']."?start=".$newStart
              ."><< zurück</a>";
        }

        Hier wird verglichen, ob schon am Anfang oder noch nicht und wenn noch Blättern möglich ist, dann wird der Zurück-Link eingebaut.

        if ($start + $limit < $total)
        {
          $newStart = $start + $limit;
          echo " <a href=".$_SERVER['PHP_SELF']."?start=".$newStart
              .">vor >></a>";
        }

        Das gleiche für's Ende.

        Du musst jetzt eben nur schauen, dass Du aus Deinem Array mit den Zeilen die jeweilgen Zeilen von Start bis Limit ausgibst. Ist nicht sonderlich performant, weil Du jedesmal die ganze Datei einliest. Aber PHP is mit Dateien eh nich sonderlich schnell, da spielt das erstmal keine Rolle.

        Gruß, Thoralf

        --
        Sic Luceat Lux!
        1. Nochmals ein freundliches Hallo :-)

          Sodalla, bin zwischenzeitlich auch nicht auf meiner faulen Haut gelegen, und habe zig, wirklich zig Links im I-Net durchsucht und bin auch fündig geworden.

          Mein Code sieht nun folgendermassen aus (gekürzt):

          <html>
            <head>
              [...]
            </head>
            <body>
              <?php
                $datei               = file("CSV_gaestebuch_eintraege.csv");
                $anzahl              = count($datei);
                $eintraege_pro_seite = 10;

          [1]   if (isset($_GET["von"]))
                  $von = $_GET["von"];
                else
                  $von = 0;

          [2]   if ($von > 0)
                {
                  $start = $von - $eintraege_pro_seite;
                    echo "<a href="gb.php?from=$start">Zurück</a>\n";
                }

          [3]   if (($von + $eintraege_pro_seite) < $anzahl)
                {
                  $start = $von + $eintraege_pro_seite;
                    echo "<a href="gb.php?from=$start">Weiter</a>\n";
                }

          for($i = $von; $i < $von + $eintraege_pro_seite; $i++)
                {
          [4]     if ($i < $anzahl)
                  {
                    $data = explode('|',$anzahl[$i]);
                    [...]
                    Ausgabe in Tabellenform
                    [...]
                  }
                }
              ?>
            </body>
          </html>

          Ansich sieht der Code soweit schon ganz vernünftig aus, allerdings weiss ich nicht, wie ich die $_GET-Anweisungen (siehe [1]) innerhalb der Schleife (siehe [4]) einbauen muss. Desweiteren vermute ich, dass die Abfragen [2] und [3] auch in die Schleife [4] aufgenommen werden müssen *kopf-rauch*.

          Erbitte Hilfe :-)

          Gruss, Enrico

          1. N'Abend,

            eins vorweg, für einen Anfänger ist das auffallend gute Code. Keine typischen Anfängerfehler und wenig Performancemissbrauch. :)

            $datei               = file("CSV_gaestebuch_eintraege.csv");

            Hier empfiehlt es sich, ' statt " zu verwenden, die Strings müssen ja nicht auf Variablen geparst werden.

            [1]   if (isset($_GET["von"]))
                    $von = $_GET["von"];
                  else
                    $von = 0;

            Hier solltest Du noch prüfen, ob der übergebene Parameter plausibel ist, damit Dir nicht völlig unsinnige Zahlen untergeschoben werden können die Dir dann unter [5] auf die Füße fallen.

            for($i = $von; $i < $von + $eintraege_pro_seite; $i++)

            [5]

            {
            [4]     if ($i < $anzahl)
                    {
                      $data = explode('|',$anzahl[$i]);

            Das sollte soweit gehen, nur dass bei Dir oben $anzahl wirklich die Anzahl ist und das Array in $datei liegt.

            Wenn ich jetzt was übersehen habe, ich klopp mich hier grad mit Serialization und Forms-Array-Abgleichung, dann gib mal einen Link zu einem Beispiel oder poste eine Fehlermeldung.

            Gruß, Thoralf

            --
            Sic Luceat Lux!