Wenn man bei einer SQl Abfrage vor dem Problem steht, das die Liste der Datensätze, die ein SELECT Statement erzeugt, sehr lang und unübersichtlich wird, dann kann man mit dem folgenden PHP Snippet, eine handliche Blätterfunktion umsetzen. Die PHP Pagination Funktion, gibt eine definierte anzahl Ergebnisse pro Seite aus, in der man vor- und zurückblättern kann (Seite 1, Seite 2, usw.).
Teil 1: SQL Query formulieren und Ergebnisse anzeigen
Wie üblich nutze ich dafür die Datensätze der Erweiterung tt_news aus einer TYPO3 Installation.
<?php
// GET Variable
$page = '';
// Pfüft die GET Variable, ob gesetzt und vom Typ integer
if (isset($_GET['page']) && ctype_digit(strval($_GET['page']))) {
$page = $_GET['page'];
} else {
$page = 1;
}
// Ergebnisse pro Seite
$res_per_page = 10;
// Erste Seite
$start_from = ($page-1) * $res_per_page;
// echo 'LIMIT ' . $start_from . ', ' . $res_per_page; // debug SQL Limit
// SQL Verbindung
$db = new mysqli($db_host, $db_user, $db_pass, $db_name);
// Zeichenkodierung
$db->set_charset('utf8');
// Die 1. SQL Query der Datensätze pro Seite
$sql = <<<SQL
SELECT
FROM_UNIXTIME(tt_news.crdate, '%d.%m.%Y') AS 'Start',
tt_news.title AS 'Title'
FROM
tt_news
WHERE
1 AND FROM_UNIXTIME(tt_news.crdate, '%Y') >= '2016'
ORDER BY
tt_news.crdate DESC
LIMIT
$start_from, $res_per_page;
SQL;
if(!$result = $db->query($sql)) {
// Falls SQL Fehler auftaucht
die('Fehler beim Ausführen der Datenbankabfrage:<br>' . $db->error);
} else {
// SQL Query Daten ausgeben
echo '<div class="query"><h3>Php MySQL Pagination</h3>';
echo '<table><tr><td><strong>Datum</strong></td><td><strong>News Titel</strong></td></tr>';
while($row = $result->fetch_assoc()) {
echo '<tr><td>'. $row['Start']. '</td><td>' . $row['Title'] . '</td></tr>';
}
echo '</table>';
}
?>
Teil 2: SQL Abfrage für die Seitennavigation
Hier fängt der Teil der PHP Pagination Funktion an, welche für die Ausgabe der PHP Blätterfunktion benutzt wird.
<?php
// Die 2. SQL Query der Datensätze gesamt
$sql = <<<SQL
SELECT
uid
FROM
tt_news
WHERE
1 AND FROM_UNIXTIME(tt_news.crdate, '%Y') >= '2016';
SQL;
// SQL Abfrage ausführen
$result = $db->query($sql);
// Anzahl der Ergebnisse aus SQL Abfrage
$total_records = $result->num_rows;
// Ergebnisse gesamt durch Ergebnisse pro Seite teilen
$total_pages = ceil($total_records / $res_per_page);
// Erste Seite
echo "<p><a href='./'>".'[Start]'."</a> ";
// For Schleife für Seitendurchlauf
for ($i = 1; $i <= $total_pages; $i++) {
echo "<a href='?page=".$i."'>Seite ".$i."</a> ";
}
// Letzt Seite
echo "<a href='?page=$total_pages'>".'[Ende]'."</a></p>";
echo '</div>';
// Nach Anschluß alle Aufgaben, SQL Verbindung schließen
$db->close();
?>
Da es sich bei dieser Art der PHP Blätterfunktion, um ein einfaches Model handelt, gibt es sicher noch Spielraum für Optimierungen.