Ausgabe der Datensätze
Erste Schritte: Ausgabe der Datensätze: Tabellen, Listen und Pagination
Beim Entwickeln einer PHP‑Anwendung musst du gespeicherte Datensätze ansprechend und übersichtlich darstellen.
Typische Varianten sind:
- Tabellen für strukturierte Daten (z. B. Produkttabellen)
- Listen für Aufzählungen (News, Gästebucheinträge)
- Pagination, wenn es zu viele Einträge für eine einzige Seite gibt
1. Datensätze als HTML‑Tabelle ausgeben
Angenommen, du hast eine Tabelle artikel (id, titel, erstellt_am).
So baust du eine HTML‑Tabelle in artikel_table.php:
$pdo = new PDO("mysql:host=localhost;dbname=deinedb;charset=utf8mb4", "user", "pass"); $sql = "SELECT id, titel, DATE_FORMAT(erstellt_am, '%d.%m.%Y') AS datum FROM artikel ORDER BY erstellt_am DESC"; $res = $pdo->query($sql); echo '<table border="1" cellpadding="5">'; echo '<tr><th>ID</th><th>Titel</th><th>Datum</th></tr>'; foreach ($res as $row) { echo '<tr>'; echo '<td>' . $row['id'] . '</td>'; echo '<td>' . htmlspecialchars($row['titel']) . '</td>'; echo '<td>' . $row['datum'] . '</td>'; echo '</tr>'; } echo '</table>';
- DATE_FORMAT formatiert das Datum bereits im SQL.
- htmlspecialchars verhindert XSS beim Titel.
2. Datensätze als ungeordnete Liste
Wenn du Blog‑Posts oder einfache Nachrichten zeigen willst, reicht meist eine Liste – z. B.:
$pdo = new PDO("mysql:host=localhost;dbname=deinedb;charset=utf8mb4", "user", "pass"); $res = $pdo->query("SELECT id, titel FROM artikel ORDER BY erstellt_am DESC LIMIT 10"); echo '<ul>'; foreach ($res as $row) { echo '<li>'; echo '<a href="artikel_detail.php?id=' . $row['id'] . '">'; echo htmlspecialchars($row['titel']); echo '</a>'; echo '</li>'; } echo '</ul>';
Der Titel wird als Link zum Detail‑View ausgegeben –
dort kannst du dann den vollständigen Beitrag laden.
3. Pagination (Seitennummerierung)
Hat deine Tabelle hunderte Einträge, zeigst du besser nur einen Teil pro Seite.
Das Stichwort lautet LIMIT … OFFSET in SQL.
Ein Basis‑Workflow:
/* Parameter & Defaults */ $proSeite = 5; // Einträge pro Seite $seiteAktiv = max(1, (int)($_GET['page'] ?? 1)); $offset = ($seiteAktiv - 1) * $proSeite; /* Gesamtzahl bestimmen */ $pdo = new PDO("mysql:host=localhost;dbname=deinedb;charset=utf8mb4", "user", "pass"); $totalStmt = $pdo->query("SELECT COUNT(*) FROM artikel"); $gesamt = (int)$totalStmt->fetchColumn(); $seitenMax = ceil($gesamt / $proSeite); /* Daten für aktuelle Seite holen */ $sql = "SELECT id, titel, DATE_FORMAT(erstellt_am,'%d.%m.%Y') AS datum FROM artikel ORDER BY erstellt_am DESC LIMIT :lim OFFSET :off"; $stmt = $pdo->prepare($sql); $stmt->bindValue(':lim', $proSeite, PDO::PARAM_INT); $stmt->bindValue(':off', $offset, PDO::PARAM_INT); $stmt->execute(); $daten = $stmt->fetchAll(PDO::FETCH_ASSOC); /* Tabelle ausgeben */ echo '<table border="1"><tr><th>Titel</th><th>Datum</th></tr>'; foreach ($daten as $row) { echo '<tr>'; echo '<td>' . htmlspecialchars($row['titel']) . '</td>'; echo '<td>' . $row['datum'] . '</td>'; echo '</tr>'; } echo '</table>'; /* Pagination‑Links */ echo '<div style="margin-top:1em;">'; for ($p = 1; $p <= $seitenMax; $p++) { if ($p == $seiteAktiv) { echo '<strong>' . $p . '</strong> '; } else { echo '<a href="?page='.$p.'">'.$p.'</a> '; } } echo '</div>';
- LIMIT :lim OFFSET :off liefert nur den Ausschnitt für die gewünschte Seite.
- $gesamt per COUNT(*) ergibt die Gesamtanzahl, $seitenMax berechnet die Anzahl Seiten.
- Die for‑Schleife erzeugt einfache Links 1 … n.
Du kannst sie bei Bedarf durch « Vorherige / Nächste » erweitern.
4. Design‑Varianten
- Tabellen: Gut bei vielen Spalten. Nutze <thead>/<tbody>,
Bootstrap‑ oder Tailwind‑Klassen für responsives Design. - Listen + Cards: Für Blog‑Artikellisten, FAQ, Gästebücher –
oft besser mit flexiblerem Layout + CSS‑Grid/Flexbox. - Pagination: Kannst du auch per Ajax/Fetch nachladen
(infinite scroll) – das Grundprinzip (LIMIT/OFFSET) bleibt gleich.
Fazit
Mit wenigen Zeilen PHP + SQL bringst du deine gespeicherten Daten übersichtlich auf die Seite:
eine Tabelle für strukturierte Infos,
eine ungeordnete Liste für klickbare Einträge
und Pagination, um bei vielen Datensätzen nicht die ganze Tabelle auf einmal zu laden.
Dank LIMIT/OFFSET und Prepared Statements behält dein Code Sicherheit und Performance,
während htmlspecialchars alle Ausgaben vor XSS schützt.