Alex: Umfassendes Paging mit PHP und MySQL

Hallo, allerseits!

Ich habe jetzt über Google ziemlich lange gesucht und auch hier im Forum, aber keine Antwort auf meine brennende Frage gefunden:

Wie richtet man ein umfassendes Paging via PHP und MySQL ein? (Sprich: xy Einträge in einer Tabelle, davon sollen pro Seite immer nur z ausgegeben werden.)

Umfassend meint: Das Paging beinhaltet nicht nur einen Link für die nächste und einen für die vorhergehende Seite, sondern zeigt überdies immer eine bestimmte Anzahl von Seiten (z.B. 1 bis 10 oder 11 bis 20, etc.) an, darüber hinaus einen Link zur ersten und zur letzten Seite und noch jeweils einen um einen 10er-Block rauf oder runter zu springen. Ist eigentlich allgemein bekannt bei professionellen Websites:

<< ... < 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 > ... >>

So ungefähr soll das dann aussehen.

Ich habe bislang aber nur Scripts gefunden, die sich mit der Light-Variante beschäftigen, also dem Blättern von immer nur einer Seite vor und zurück. Das ist für meine Anwendung jedoch leider zu wenig und zu unübersichtlich.

Deshalb meine Frage nun hier: Hat einer von Euch einen guten Link zu einem Script, das so ein Paging möglich macht?

Ich bin zwar kein absoluter PHP-Anfänger mehr, aber das vollständig selbst zu programmieren, übersteigt doch noch meinen Horizont, deshalb wäre es einfach praktisch und toll, wenn es dafür ein Script gäbe. Auch für einen Buchtipp wäre ich dankbar. ;-)

Vielen Dank schon mal vorab!

Alex

  1. Geh von deiner aktuellen Seite aus. Nehmen wir mal an, wir befinden uns auf Seite 40 einer 100-seitigen Anzeige. Je nachdem wieviele Einer-Schritte du nach links und rechts machen willst, wird die erste Schleife programmiert .. die zweite Schleife überprüft, wieviel Seiten du in 10er Schritten anzeigen willst, usw. Das könnte zB so aussehen:

    <?php

    $page = 40;
    $pagesgesamt = 100;
    $ineinerschritten = 10;
    $inzehnerschritten = 5;

    for ($i=0; $i++; $i<= $ineinerschritten) {
      // seiten rechts von aktueller seite:
      if (($i+$page) <= $pagesgesamt) echo "<a href="index.php?page=" . ($i+$page) . "">" . ($i+$page) . "</a> ";
      // seiten links von aktueller seite:
      if (($page - $i) >= 1) echo "<a href="index.php?page=" . ($page-$i) . "">" . ($page+$i) . "</a> ";
    }

    ?>

    So ähnlich dann für die Zehnerschritte, nur dass du dort evtl 2 verschiedene for-Schleifen für die Seiten links und rechts brauchst, da man auch verschiedene Startwerte hat.

    1. Hi, Thomas!

      Vielen Dank für Deine Hilfe. Mein Problem beginnt allerdings schon vorher: Ich habe von der Programmierung einer Seitennavigation noch keine Ahnung. Ich bräuchte ein Script mit Erklärungen, welcher Befehl, welche Funktion was tut, was ich ändern muß, etc.

      Kennst Du dafür zufällig ein gutes Buch? Es muß doch in irgendeinem PHP-Buch eine Seitenavigation erklärt werden. Mir fehlen dafür nämlich eben noch die ganzen Grundkenntnisse der notwendigen Befehle. Deshalb helfen mir die ganzen Scripts aus dem Internet ja auch nichts.

      Vielen Dank!

      Alex

      Geh von deiner aktuellen Seite aus. Nehmen wir mal an, wir befinden uns auf Seite 40 einer 100-seitigen Anzeige. Je nachdem wieviele Einer-Schritte du nach links und rechts machen willst, wird die erste Schleife programmiert .. die zweite Schleife überprüft, wieviel Seiten du in 10er Schritten anzeigen willst, usw. Das könnte zB so aussehen:

      <?php

      $page = 40;
      $pagesgesamt = 100;
      $ineinerschritten = 10;
      $inzehnerschritten = 5;

      for ($i=0; $i++; $i<= $ineinerschritten) {
        // seiten rechts von aktueller seite:
        if (($i+$page) <= $pagesgesamt) echo "<a href="index.php?page=" . ($i+$page) . "">" . ($i+$page) . "</a> ";
        // seiten links von aktueller seite:
        if (($page - $i) >= 1) echo "<a href="index.php?page=" . ($page-$i) . "">" . ($page+$i) . "</a> ";
      }

      ?>

      So ähnlich dann für die Zehnerschritte, nur dass du dort evtl 2 verschiedene for-Schleifen für die Seiten links und rechts brauchst, da man auch verschiedene Startwerte hat.

  2. Hello,

    << ... < 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 > ... >>

    Eine Lösung für die Linkerzeugung findest Du im Thread
    https://forum.selfhtml.org/?t=163004&m=1061131
    in den Scripten für die Bildergalerie ziemlich weit unten.

    Nun müsstest Du noch nach der Datenbeschaffung mittels MySQL count() suchen.
    Wenn Du das hier eingibst in die Suche "MySQL count" findest Du bestimmt einen Beitrag aus dem letzten sechs Wochen, der Dir genau diese Lösung liefert.

    Harzliche Grüße vom Berg
    http://bergpost.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

    1. Hi, Tom!

      Kannst Du mir vielleicht sagen, was davon? Ich blick da nicht durch. Da gibt es etliche Scripts, und da ich wie gesagt Anfänger bin und mein Paging sich nicht auf Bilder aus einem Ordner bezieht, ist es für mich um so schwerer nachzuvollziehen.

      Vielen Dank!

      Alex

      Hello,

      << ... < 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 > ... >>

      Eine Lösung für die Linkerzeugung findest Du im Thread
      https://forum.selfhtml.org/?t=163004&m=1061131
      in den Scripten für die Bildergalerie ziemlich weit unten.

      Nun müsstest Du noch nach der Datenbeschaffung mittels MySQL count() suchen.
      Wenn Du das hier eingibst in die Suche "MySQL count" findest Du bestimmt einen Beitrag aus dem letzten sechs Wochen, der Dir genau diese Lösung liefert.

      Harzliche Grüße vom Berg
      http://bergpost.annerschbarrich.de

      Tom

  3. n'abend,

    Wie richtet man ein umfassendes Paging via PHP und MySQL ein? (Sprich: xy Einträge in einer Tabelle, davon sollen pro Seite immer nur z ausgegeben werden.)

    Um eine sinnvolle Seitennavigation (von mir aus können wir es auch Paging nennen, wenn denn so sehr auf komische Anglizismen steht) zu schaffen, musst du die Rahmenbedingungen kennen:

    1. Wie viele Datensätze habe ich überhaupt?
    2. Wie viele und welche Datensätze möchte ich pro Seite anzeigen?
    3. Wie viele Seiten links möchte ich denn anzeigen? Bei hunderten Seiten ist es nicht sonderlich praktisch alle Links zu jeder einzelnen Seite anzuzeigen.
    4. Nach welchem Schema möchte ich denn mein Subset an Links (was dem Gedanken 3 nach unumgänglich ist) anzeigen? Möchte ich ich »1, 2, 3, ..., 5, [6], 7, ..., 10, 11, 12« haben? oder vielleicht lieber »3, 4, 5, [6], 7, 8, 9 , 10, 11«?

    Grundsätzlich gibt es die Funktion COUNT(), um an die Gesamtzahl an Datensätzen zu gelangen. Aber zwei sehr ähnliche Abfragen auf die Datenbank zu feuern erscheint einem bei näherem Betrachten nicht ganz so optimal, zumindest dann, wenn mal SQL_CALC_FOUND_ROWS und FOUND_ROWS() kennt. Wichtig für unser Vorhaben ist auch eine Möglichkeit die Menge der zurückgelieferten Datensätze einzugränzen, was wir mit LIMIT recht einfach machen können.

    /* hole Daten für Seite $p */  
    SELECT SQL_CALC_FOUND_ROWS colum1, colum2, colum3  
    FROM table  
    WHERE colum4 = 42  
    ORDER BY column1  
    LIMIT 0, 10;  
      
    /* hole die Gesamtzahl der Datensätze */  
    SELECT FOUND_ROWS();
    

    Das könnte in PHP verpackt ungefähr so ausschauen:

    // Die Seite auf der wir uns gerade befinden (beginnend bei 1)  
    $currentPage = 2;  
      
    // Anzahl Datensätz pro Seite  
    $itemsPerPage = 15;  
      
    /*  
     * Die Datensatzlaufnummer, bei der wir anfangen wollen.  
     * Der erste Datensatz hat die Laufnummer 0, unsere Seiten  
     * fangen aber bei 1 an, weshalb wir die Seitenzahl um eins  
     * reduzieren müssen, bevor wir mittels der Multiplikation  
     * mit der Anzahl von Datensätzen pro Seite eine Sprungmarke  
     * bekommen  
     */  
    $itemOffset = ($currentPage - 1) * $itemsPerPage;  
      
    // Datensätze der aktuellen Seite ermitteln  
    $res = mysql_query( 'SELECT SQL_CALC_FOUND_ROWS colum1, colum2, colum3  
    FROM table  
    WHERE colum4 = 42  
    ORDER BY column1  
    LIMIT '. $itemOffset .','. $itemsPerPage );  
      
    // Gesamtzahl der Datensätze abfragen  
    $totalItems = mysql_fetch_row( mysql_query( 'SELECT FOUND_ROWS()' ) );  
    $totalItems = $totalItems[0];  
      
    // Gesamtzahl der Seiten ermitteln  
    $totalPages = ceil( $totalItems / $itemsPerPage );  
      
    /*  
     * Wir wissen an dieser Stelle, dass die erste mögliche Seite, die Seite 1 ist.  
     * Wir wissen, dass wir momentan Seite $currentPage geöffnet haben  
     * und unsere Datensätze auf gesamthaft $totalPages Seiten aufgeteilt haben.  
     * Wir haben an dieser Stelle also alle Grenzwerte, die wir brauchen, um eine Sinnvolle Seitennavigation zu generieren.  
     */  
      
    /*  
     * - Sind wir auf der ersten Seite?  
     * - Sind wir auf der letzten Seite?  
     * - Wo stecken wir mit $currentPage genau?  
     *     Sind wir nahe am Anfang?  
     *     Sind wir nahe am Ende?  
     * - Wie viele Links können wir in die beiden Richtungen anzeigen,  
     *   ohne den Grenzwert zu überschreiten, oder mehr Seiten-Links zu  
     *   generieren, als wir maximal anzeigen wollen?  
     *  
     * Die Beantwortung der gestelleten Fragen wird als Übungsaufgabe hinterlassen.  
     */  
      
    // Daten ausgeben  
    while( $row = mysql_fetch_assoc($res) )  
      print_r( $row );  
    
    

    Ich bin zwar kein absoluter PHP-Anfänger mehr, aber das vollständig selbst zu programmieren, übersteigt doch noch meinen Horizont, deshalb wäre es einfach praktisch und toll, wenn es dafür ein Script gäbe. Auch für einen Buchtipp wäre ich dankbar. ;-)

    Meiner Meinung nach hat das nichts mit der verwendeten Programmiersprache zu tun, diese ist immerhin nur Mittel zum Zweck. Die Fähigkeit Abläufe zu erfassen und abstrahieren zu können ist die Kunst.

    weiterhin schönen abend...

    --
    #selfhtml hat ein Forum?
    sh:( fo:# ch:# rl:| br:> n4:& ie:{ mo:} va:) de:] zu:} fl:( ss:? ls:[ js:|
  4. Ich wollte mich noch mal bei allen bedanken, die mir geholfen haben. Ich habe inzwischen ein Script gefunden, mit dem es wunderbar funktioniert und das so einfach und überschaubar ist, daß selbst ich es kapiere ...

    1. Ich wollte mich noch mal bei allen bedanken, die mir geholfen haben. Ich habe inzwischen ein Script gefunden, mit dem es wunderbar funktioniert und das so einfach und überschaubar ist, daß selbst ich es kapiere ...

      Hallo,

      bitte mal die URL angeben. Könnte sowas auch gebrauchen.

      Gruß Rainer