PHP Tutorials, PHP lernen, PHP Forum, PHP Community and more ... MyWebsolution.de!

Sidebar

Home News Tutorials Workshops Tipps Artikel Gästebuch Sitemap Unicode Shopping

Suche

Members

Forum Login Registrierung

Statistik

Statistikbereich
Jetzt1
Heute115
Gestern232
Gesamt1669000

PHP Blätterfunktion - Gliederung in Seiten

Autor Flitze
Klicks 57312
Rating für PHP Blätterfunktion
  7.5 von 10
Bewertungen44
Stand 08.07.2010
Keywords:
Blätterfunktion, PHP Blätterfunktion, PHP Seitenzahlen, Seitenzahlen Tutorial, Seiten blättern, pagebreak, Gliederung, Aufteilung, Seiten, Seitenzahlen

Amazon: PHP 5.3 und MySQL 5.1
Breadcrumb:
Tutorials » PHP Blätterfunktion » PHP Blätterfunktion - Gliederung in Seiten
Seite : 1 2 3 4 Bewerten
Article Wizard - deutscher Article Spinner

2. Datensätze in Seiten gliedern


Bei den Datensätzen beziehe ich mich auf die Daten einer MYSQL-Datenbank. Als erstes wird die Anzahl der entsprechenden Datensätze ermittelt. Dazu führt man folgenden Query aus:

PHP:
<?php
    $sql 
"SELECT
                COUNT(*)
            FROM
                Tabelle
           "
;
    
$result mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error());
    
$anzahl mysql_result($result0);

    if (!
$anzahl) {
        echo 
"Es befinden sich keine Daten in der Tabelle.\n";
    }
    else {
    
// ...
    
}
?>


COUNT ist eine Gruppenfunktion, die alle Einträge der Tabelle zählt, deren Wert ungleich null ist. COUNT(*) sagt dabei, dass alle Spalten der Tabelle berücksichtigt werden sollen. Es werden also alle Datensätze gezählt, in denen der Wert mindestens einer Spalte ungleich null ist.

Da wir als Ergebnis keine verschiedenen Daten erhalten, sondern lediglich genau eine Zahl, können wir auf dieses Ergebnis mittels mysql_result zugreifen. Dabei wähle ich aus Gründen der Performance den numerischen Index 0 (siehe dazu auch die Doku).

Nun überprüfe ich, ob überhaupt Datensätze existieren. Ist dies nicht der Fall, wird eine entsprechende Meldung ausgegeben. Ansonsten werden die Daten weiterverarbeitet und die Seitenzahlen errechnet. Das könnte folgendermaßen aussehen:

PHP:
<?php
...
else {
    
// Festlegen der aktuellen Seite
    
$start = isset($_GET['page_number'])?(int)$_GET['page_number']:1;
    
// Festlegen der Anzahl der angezeigten Datensätze
    
$per_page = isset($_GET['per_page'])?(int)$_GET['per_page']:10;
    if (
$per_page != AND $per_page != 10 AND $per_page != 20)
        
$per_page 10 
    
// Berechnung der Seitenzahlen = Alle Datensätze geteilt durch Datensätze pro Seite
    
$num_pages ceil($anzahl/$per_page);

    
// Überprüft, ob eine mögliche Seitenzahl übergeben wurde
    
if ($start 1)
        
$start 1;
    if (
$start $num_pages)
        
$start $num_pages;
    
// ...
?>


Wie man sieht arbeite ich mit den $_GET-Parametern $_GET['page_number'] und $_GET['per_page']. Die entsprechenden Daten werden also per URL ermittelt.

$_GET['page_number'] enthält die Nummer der Seite, die ich gerade betrachte und
$_GET['per_page'] die Anzahl der Datensätze, die pro Seite angezeigt werden.
Um im späteren Verlauf nicht mehr ständig mit den $_GET-Parametern arbeiten zu müssen, speichere ich sie in anderen Variablen.
$_GET['page_number'] in $start
$_GET['per_page'] in $per_page

Dabei fällt das etwas seltsame Sprachkonstrukt auf:

PHP:
<?php
$start 
= isset($_GET['page_number'])?(int)$_GET['page_number']:1;
?>


Das ist eine sog. cond ? value-true : value-false Struktur.
Das (int) ist ein Typecast, der sicherstellt, dass der $_GET-Parameter auch wirklich eine Zahl ist.

Das bedeutet im Prinzip nichts anderes als folgende if-Bedingung

PHP:
<?php
    
if(isset($_GET['page_number']))
        
$start = (int)$_GET['page_number'];
    else
        
$start 1;
?>


Allerdings spart man dabei 3 Zeilen Quellcode ;)

Mit $_GET['per_page'] gebe ich dem User die Möglichkeit, die Anzeige seinen Wünschen anzupassen, da es Leute gibt, die ungern Scrollen und deshalb wenige Einträge pro Seite bevorzugen. Allerdings gibt es aber auch andere, die gern viel auf einer Seite haben, um nicht ständig blättern zu müssen.

Um sicherzustellen, dass der User keinen Unfug mit dieser Variablen anstellt (also sinnlose Parameter an die URL anhängen kann), gebe ich ihm nur die Auswahlmöglichkeiten zwischen 5, 10 und 20 Datensätzen pro Seite. Beim ersten Aufruf der Seite existiert noch kein $_GET['per_page'], deshalb wird der Wert 10 als Standardwert festgelegt. Das Gleiche passiert, wenn ein Wert übergeben wird, der weder 5 noch 10 noch 20 ist.

PHP:
<?php
    $per_page 
= isset($_GET['per_page'])?(int)$_GET['per_page']:10;
    if (
$per_page != AND $per_page != 10 AND $per_page != 20)
        
$per_page 10 
?>


Nun aber zurück zum eigentlichen Problem, der Berechnung der Seitenzahlen. Mit der Information, wie viele Einträge pro Seite angezeigt werden sollen, kann man nun die maximale Seitenzahl errechnen

PHP:
<?php
    $num_pages 
ceil($anzahl/$per_page);
?>


Da der User auch auf $_GET['page_number'] Einfluss nehmen kann, muss ich auch diese Eingabe auf ihre Richtigkeit prüfen. Dabei darf die Seite nicht kleiner als 1 sein (logisch, es gibt ja keine Seite 0) und nicht größer als die maximale Seitenzahl.

PHP:
<?php
    
if ($start 1)
        
$start 1;
    if (
$start $num_pages)
        
$start $num_pages;
?>


Nachdem wir nun die Berechnung abgeschlossen haben und sämtliche eventuelle Manipulierungsmöglichkeiten des Users entschärft haben, kommen wir nun zur Anzeige der Seitenzahlen als Links

PHP:
<?php
    
echo "<table>\n";
    echo 
" <tr>\n";
    echo 
"  <td style=\"text-align:left\">\n";
    echo 
"<b>Es sind ".$anzahl." Daten in der Datenbank</b>\n";
    echo 
"  </td>\n";
    
// Daten pro Seite
    // Für die aktuelle 'Daten-pro-Seite'-Zahl wird kein Link erzeugt
    
echo "  <td style=\"text-align:right\">\n";
    echo 
"Daten pro Seite: ";
    if (
$per_page != 5)
        echo 
"<a href=\"daten.php?per_page=5&page_number=".$start."\">5</a> \n";
    else
        echo 
"5\n";
    if (
$per_page != 10)
        echo 
"<a href=\"href=\"daten.php?per_page=10&page_number=".$start."\">10</a> \n";
    else
        echo 
"10\n";
    if (
$per_page != 20)
        echo 
"<a href=\"href=\"daten.php?per_page=20&page_number=".$start."\">20</a> \n";
    else
        echo 
"20\n";
    echo 
"  </td>\n";
    echo 
" </tr>\n";
    echo 
"</table>\n";

    
// Seitenzahlen
    
echo "<table>\n";
    echo 
" <tr>\n";
    echo 
"  <td style=\"width:50px;\">\n";
    echo 
"Seite: \n";
    echo 
"  </td>\n";
    echo 
"  <td>\n";
    
// Prüft, ob die Anzeige von "<" sinnvoll ist
    
if ($start != 1)
        echo 
"<a href=\"daten.php?per_page=".$per_page."&page_number=".($start-1)."\">&lt;</a>&nbsp\n";
    for(
$i=1$i<=$num_pages$i++) {
        
// Für die aktuelle Seite wird kein Link erzeugt..
        
if ($i==$start)
            echo 
$i."\n";
        
// Für alle anderen schon.
        
else
            echo 
"<a href=\"daten.php?per_page=".$per_page."&page_number=".$i."\">".$i."</a>\n";
    }
    
// Prüft, ob die Anzeige von ">" sinnvoll ist
    
if ($start != $num_pages)
        echo 
"&nbsp<a href=\"daten.php?per_page=".$per_page."&page_number=".($start+1)."\">&gt;</a> \n";
    echo 
"  </td>\n";
    echo 
" </tr>\n";
    echo 
"</table>\n";
?>


Als erstes zeigen wir an, wie viele Datensätze insgesamt vorhanden sind

PHP:
<?php
    
echo "<b>Es sind ".$anzahl." Daten in der Datenbank</b>\n";
?>


Dann erzeuge ich die Links zum Einstellen der Datensätze, die pro Seite angezeigt werden sollen

PHP:
<?php
    
if ($per_page != 5)
        echo 
"<a href=\"daten.php?per_page=5&page_number=".$start."\">5</a> \n";
    else
        echo 
"5\n";
    
//...
?>


Dabei wird die aktuelle Auswahl, also der aktuelle $per_page-Wert, überprüft. Falls es sich um die aktuelle Auswahl handelt, muss kein Link erzeugt werden, ansonsten eben schon. Bei der Erzeugung des Links muss man darauf achten, dass man die gleiche Seite (samt Parametern) erneut aufruft. Deshalb wird als page_number die aktuelle Seitenzahl übergeben.

Letztendlich erzeuge ich noch die Links, mit denen man zwischen den Seiten navigieren kann

PHP:
<?php
    
if ($start != 1)
        echo 
"<a href=\"daten.php?per_page=".$per_page."&page_number=".($start-1)."\">&lt;</a>&nbsp\n";
    for(
$i=1$i<=$num_pages$i++) {
        if (
$i==$start)
            echo 
$i."\n";
        else
            echo 
"<a href=\"daten.php?per_page=".$per_page."&page_number=".$i."\">".$i."</a>\n";
    }
?>


Ist nicht Seite 1 gewählt, wird '<' angezeigt, um genau eine Seite zurückzugehen. Das gleiche gilt für die letzte Seite. Die einzelnen Seiten werden in der For-Schleife erzeugt, in der ( wie auch bei den 'Daten-pro-Seite' ) verglichen wird, ob es sich bei der zu prüfenden Zahl um die aktuelle Seitenzahl handelt. Wenn dies nicht der Fall ist, muss wieder ein Link erzeugt werden, mit dem man zu der entsprechenden Seite gelangt. Diesmal muss man darauf achten, dass der per_page Wert als Parameter auch mit übergeben wird.

Nachdem wir nun die Anzeige der Seitenzahlen soweit entwickelt haben, kommen wir zum wichtigsten Part der ganzen Sache, der Ausgabe der ensprechenden Daten. Diese wird so realisiert

PHP:
<?php
    $offset 
= ($start-1)*$per_page;

    
$sql "SELECT
                    ID,
                    Titel,
                    Datum,
                    Name,
                    Nachricht
            FROM
                    Tabelle
            ORDER BY
                    Datum DESC
            LIMIT
                    "
.$offset.",".$per_page."
           "
;
    
$result mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error());
    while(
$row mysql_fetch_assoc($result)) {
    
// Daten anzeigen
    
}
?>


Entscheidend bei der Abfrage der Daten sind die ORDER BY und die LIMIT Expression. Als erstes müssen die Daten irgendwie geordnet werden, damit sie auch der Reihe nach abrufen kann. Im o.g. Beispiel werden die Daten absteigend nach dem Datum geordnet, also letzte Daten zuerst. Die LIMIT Bedingung erwartet mindestens einen Parameter, kann aber auch 2 verarbeiten. Der erste Parameter, in diesem Fall $offset, gibt an ab wo und der zweite wie viele Datensätze ausgelesen werden. Dabei muss man dazusagen, dass der erste Datensatz den Index '0' hat. Wir haben jedoch keine Seite '0', deshalb muss von $start, das die aktuelle Seite repräsentiert, noch 1 subtrahiert werden. Ein kleines Rechenbeispiel zur Veranschaulichung:

Anzahl aller Datensätze: 45

Anzahl der Datensätze pro Seite: 10

Daraus ergibt sich eine maximale Seitenzahl: 5

wir befinden uns auf Seite: 1

So sieht dann der Query aus

PHP:
<?php
    $offset 
= (1-1)*10;
    
// $offset = 0

    
$sql "SELECT
                    ID,
                    Titel,
                    Datum,
                    Name,
                    Nachricht
            FROM
                    Tabelle
            ORDER BY
                    Datum DESC
            LIMIT
                    0, 10
           "
;
?>


Auf Seite 1 werden also alle Datensätze von 0 bis 9 angezeigt. Das ganze mal equivalent für Seite 2:

PHP:
<?php
    $offset 
= (2-1)*10;
    
// $offset = 10

    
$sql "SELECT
                    ID,
                    Titel,
                    Datum,
                    Name,
                    Nachricht
            FROM
                    Tabelle
            ORDER BY
                    Datum DESC
            LIMIT
                    10, 10
           "
;
?>


Auf Seite 2 werden also alle Datensätze von 10 bis 19 angezeigt.
Dementsprechend auf Seite 3 alle Datensätze von 20 bis 29,
auf Seite 4 30 bis 39 und auf Seite 5 theoretisch 40 - 49.

Da wir jedoch nur 45 Datensätze haben, werden auch nur 5 zurückgeliefert.

Ein praktisches Beispiel, bei dem diese Art der Seitenzahlen zum Einsatz kommen, ist z.B. mein News-System oder das Gästebuch

Zurück zur vorigen Seite:
PHP Blätterfunktion
Weiter zur nächsten Seite:
PHP Blätterfunktion - Eine Bildergalerie

»» Zurück zum Menu

Suchmaschinenoptimierung

Suchmaschinenoptimierung (SEO - Search Engine Optimization)

Ranking

Tutorials (13)

8.6
8.4
8.1

Workshops (3)

8.8
8.7
7.6

Tipps (13)

7.2
6.7
6.5

Artikel (30)

8.4
7.2
6.6

RSS Feeds

Full Feed Tutorials Workshops Tipps Artikel

Twitter

Follow me on Twitter

Partner & Links


Valid HTML 4.01 Transitional
Valid CSS
nach oben

Diese Seiten unterstützen MyWebsolution:
 
© MyWebsolution.de
2006-2017