PHP Codeschnipsel

Hier werden PHP Snippets zur praktischen Anwendung bereit gestellt.

PHP MySQL Pager

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.