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.