Daten (z.B. aus MySQL) auf mehrere Seiten verteilen

06.04.2009

Auf vielen Webseiten werden größere Datenmengen wie Gästebucheinträge oder Ergebnisse einer Suche auf mehre Seiten aufgeteilt. Wie man dies mit PHP bewerkstelligt möchte ich in diesem Artikel zeigen.

Welche Seite man anzeigen möchte wird meistens über GET-Parameter, also über die URL geregelt. Im Folgenden werde ich den GET-Parameter page verwenden. Ein Aufruf um z.B. die 5 Seite zu laden sieht dann wie folgt aus:

Zitat:
www.example.com/site.php?page=5


Aus dem Parameter page kann man dann den Offset* des ersten anzuzeigenden Eintrags bestimmen.

PHP - Code:
// z.B. 10 Einträge pro Seite
$count = 10;
$offset = ($_GET['page'] - 1) * $count;

In dem Beispiel-Code hat der erste Eintrag den Offset 0. Von $page muss man zuerst 1 abziehen, da die Seiten von 1 an gezählt werden. Zur Multiplikation kommt man dann, da pro Seite $count Einträge angezeigt werden.


Nun kann man aus der Datenbank die Einträge auslesen.

SQL - Code:
SELECT * FROM tabelle LIMIT $offset, $count

(Eine Einführung in MySQL findest du hier.) Die Anweisung LIMIT gibt an, dass nur Einträge ab dem Offset $offset geliefert werden sollen, und zwar genau $count-Stück.

Die Einträge werden wie gewohnt angezeigt. Jetzt fehlt noch die Möglichkeit zum Blättern. Dazu werden prinzipiell die Seitenzahlen einfach als Links ausgegeben.

PHP - Code:
 
// $count_entries ist die Gesamtzahl der Einträge,
// die man z.B. über
// SELECT COUNT(*) AS count_entries FROM tabelle;
// bekommt
$count_pages = ceil($count_entries / $count);
for (int $i = 1; $i <= $count_pages; $i++) {
   echo '[<a href="site.php?page=' . $i . '">' . $i . '</a>';
}
 


Um das Blättern zu erleichtern kann man noch Links zur vorherigen und zur nächsten (eventuell auch zur ersten und letzten) Seite ausgeben. Dabei muss man aber beachten, dass es möglicherweise keine vorherige oder nächste Seite gibt.

PHP - Code:
 
if ($_GET['page'] > 1) {
   echo '<a href="site.php?page=' . ($_GET[page] - 1) . '">vorherige Seite</a>';
} else {
   echo 'vorherige Seite';
}

Für die nächste Seite sieht der Code fast identisch aus, nur in der Bedingung muss überprüft werden, dass man sich noch vor $count_pages befindet.

Soweit zur Grundfunktionalität des Blätterns. Man könnte noch einbauen, dass bei sehr vielen Seiten nicht Links zu allen angezeigt werden, sondern z.B. nur zu den ersten 3, den letzten 3 und zur vorherigen, sowie zur nächsten Seite.

Falls du noch Fragen (auch zur konkreten Implementierung) oder Anregungen hast freue ich mich über einen Kommentar.


* der Offset ist die Nummer des Eintrags, meistens bei 0 oder 1 beginnend. Statt den Offset zu berechnen kann man ihn auch statt der Seite übergeben lassen. Allerdings ändert sich dann die Methode zum Blättern leicht.

spirit

15.02.2010
Author: spirit

super Erklärung, vielen Dank!

spirit

15.02.2010
Author: spirit

super Erklärung, vielen Dank!

thomas

19.05.2010
Author: thomas

Hallo,

eine Erklärung von tausenden, muss aber zugeben, diese hier ist auch für php-Einsteiger recht einfach zu verstehen. Aber mich würde es speziell interessieren, wie das OHNE DB zu realisieren ist. Denn die Abfragen heben sich dabei wesentlich ab, leider.
Ein tutorial dazu wäre eine Bereicherung...

Gruß

N43

22.05.2010
Author: N43

Hallo,

das hängt davon ab, wie deine Textdatei aufgebaut ist.
Wenn sie ohne besondere Formatierung aufgebaut ist, muss man Eintrag für Eintrag lesen, bis man an der gewünschten Seite angelangt ist und kann dann die folgenden Einträge ausgeben.

Eröffne am Besten einen Thread im Forum mit dem Aufbau deiner Textdatei, dann können wir das anhand derer Entwickeln und evtl. optimieren.

N43

Einen neuen Kommentar erstellen...