PHP Blätterfunktion - Gliederung in Seiten
Autor
Flitze
Klicks 80860
Keywords:
Blätterfunktion, Seitenzahlen erstellen, [page]-Tags, pagebreak, Gliederung, Aufteilung, Seiten, Seitenzahlen
Klicks 80860
Rating für PHP Blätterfunktion
7.4 von 10
Bewertungen45
Stand
08.07.2010
7.4 von 10
Bewertungen45
Keywords:
Blätterfunktion, Seitenzahlen erstellen, [page]-Tags, pagebreak, Gliederung, Aufteilung, Seiten, Seitenzahlen
Breadcrumb:
Tutorials » PHP Blätterfunktion » PHP Blätterfunktion - Gliederung in Seiten
2. Datensätze in Seiten gliedern
[ADSENSE_LINE]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($result, 0);
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 != 5 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 != 5 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)."\"><</a> \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 " <a href=\"daten.php?per_page=".$per_page."&page_number=".($start+1)."\">></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)."\"><</a> \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