MB Dev .tech
Registrieren Login

PHP + DB Praxis · Pagination Basics

← Zurück zu PHP + DB Praxis

Sobald deine Tabelle mehr als „ein paar“ Einträge hat, willst du sie nicht mehr komplett auf einmal anzeigen. Stattdessen teilst du die Liste in Seiten auf. Das nennt man Pagination (Paginierung).

Merke
Pagination ist Performance + UX

Weniger Daten pro Request = schneller. Und für Benutzer ist es übersichtlicher.

1) Grundbegriffe: Seite, Limit, Offset

Die häufigste Pagination in SQL basiert auf zwei Werten:

  • LIMIT: Wie viele Zeilen pro Seite?
  • OFFSET: Wie viele Zeilen überspringen wir?

Beispiel: 10 Einträge pro Seite

  • Seite 1: LIMIT 10, OFFSET 0
  • Seite 2: LIMIT 10, OFFSET 10
  • Seite 3: LIMIT 10, OFFSET 20
Tipp
Merke dir die Formel

offset = (page - 1) * limit

2) Seite aus der URL lesen (Query-Parameter)

In Web-Apps steht die aktuelle Seite oft in der URL, z.B.: ?page=2. Wichtig: Du musst das immer prüfen und in eine Zahl umwandeln.

Page lesen + absichern

$page = (int)($_GET['page'] ?? 1);

if ($page < 1) {
    $page = 1;
}

$limit  = 10;
$offset = ($page - 1) * $limit;
Achtung
Nie blind Werte aus der URL übernehmen

Nutzer können jeden Wert eintippen (auch -999 oder abc). Deshalb immer casten und Grenzen setzen.

3) SQL: LIMIT und OFFSET nutzen

Jetzt holen wir nur die Einträge, die wir auf dieser Seite anzeigen möchten. Beispiel: eine Liste von Aufgaben aus einer Tabelle tasks.

SELECT mit Pagination

$sql = "
  SELECT id, title, created_at
  FROM tasks
  ORDER BY created_at DESC
  LIMIT :limit OFFSET :offset
";

$stmt = $pdo->prepare($sql);

// Wichtig: limit/offset als Integer binden
$stmt->bindValue(':limit',  $limit,  PDO::PARAM_INT);
$stmt->bindValue(':offset', $offset, PDO::PARAM_INT);

$stmt->execute();

$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
Merke
LIMIT/OFFSET sind Werte – also gehören sie auch als Parameter gebunden

Besonders bei Zahlen ist es wichtig, die Typen sauber zu behandeln. Mit PDO::PARAM_INT machst du klar: das ist eine Zahl.

4) Wie viele Seiten gibt es? (COUNT)

Um Links wie „Seite 1, 2, 3 …“ zu bauen, brauchst du die Gesamtanzahl der Datensätze. Das machst du meistens mit COUNT(*).

COUNT

$countStmt = $pdo->query("SELECT COUNT(*) AS cnt FROM tasks");
$countRow  = $countStmt->fetch(PDO::FETCH_ASSOC);

$totalRows  = (int)($countRow['cnt'] ?? 0);
$totalPages = (int)ceil($totalRows / $limit);
Tipp
Page begrenzen

Wenn $page größer ist als $totalPages, setze sie auf die letzte Seite. Das verhindert „leere“ Seiten durch falsche URLs.

5) Links bauen: Zurück / Weiter / Seiten

Pagination ist am Ende nur Navigation. Du kannst simpel starten:

  • „Zurück“ (wenn Seite > 1)
  • „Weiter“ (wenn Seite < totalPages)
  • Optional: Seitenzahlen
Pseudocode (Ausgabe)

// Beispiel-Logik (kein vollständiges HTML):
if ($page > 1) {
    echo "<a href='?page=" . ($page - 1) . "'>Zurück</a>";
}

echo " Seite " . $page . " von " . $totalPages . " ";

if ($page < $totalPages) {
    echo "<a href='?page=" . ($page + 1) . "'>Weiter</a>";
}
Achtung
ORDER BY ist Pflicht

Pagination ohne ORDER BY ist unzuverlässig: Die Reihenfolge kann sich ändern, und Nutzer sehen „springende“ Daten.

Fazit

Pagination bedeutet: weniger Daten pro Request und klare Navigation. Das Muster ist immer ähnlich: Seite lesen → offset berechnen → LIMIT/OFFSET query → COUNT für Seitenzahl.

Nächster Schritt
Soft Delete

Wir schauen uns an, wie du „löschen“ kannst, ohne Daten endgültig zu verlieren.