Eine MySQL-Tabelle über Links sortieren
![[Bildschirmfoto]
Eine MySQL-Tabelle über Links sortieren [Bildschirmfoto]
Eine MySQL-Tabelle über Links sortieren](scripts/tabelle_sortieren/tabelle_sortieren.png)
Tabellen haben oft den Nachteil das diese nicht vom Benutzer sortiert werden können, dabei ist es eigentlich ganz einfach, an PHP wird über einem Link nur der Name der DB-Tabellenspalte gesendet und ob diese aufsteigend oder absteigend sortiert werden soll.
Der Link dazu sieht etwa so aus:
datei.php?spalte=datum&sort=asc
Damit nun keine gefährlichen Anweisungen über den Link in unsere DB-Tabelle eingeschleust werden können, nehmen wir ein Array zu Hilfe in dem alle Spalten darin stehen die angezeigt und sortiert werden sollen:
$spalten = array( 'titel', 'autor', 'nachricht', 'datum', );
Nun müssen wir einen Default-Wert für die Spalte $spalte (PHP-Variable) setzen wenn noch nichts über dem Link gesendet wurde:
$spalte = isset($_GET["spalte"]) ? $_GET["spalte"] : 'datum'; // Default-Wert
Dabei ist hier 'datum'
der Default-Wert für die Spalte.
➤
Jetzt überprüfen wir zur Sicherheit ob der gesendete Wert $spalte sich in unserem Array
$spalten befindet, wenn "false" von der in_array()
-Funktion
zurück gegeben wurde, wird der Default-Wert gesetzt:
if (!in_array($spalte, $spalten)) { $spalte = 'datum'; // Default-Wert }
Das gleiche machen wir nun mit $sort, also mit dem die Tabelle aufsteigend oder
absteigend sortiert werden kann. Da es nur zwei Möglichkeiten (asc
und desc
) gibt, schreiben wir das
Array direkt in die Abfrage:
$sort = isset($_GET["sort"]) ? $_GET["sort"] : 'desc'; if (!in_array($sort, array('asc', 'desc'))) { $sort = 'desc'; // Default-Wert }
Jetzt lesen wir die Datensätze von der DB-Tabelle aus, dieses wird hier über die PDO-Schnittstelle gemacht, weitere Infos zu PDO und der MySQL-Datenbank unter » Erster Eintrag in eine MySQL-Datenbank mit PDO
In der Anweisung fügen wir nachORDER BY
die Variablen $spalte und
$sort hinzu.
$db = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', ''); $select = $db->query("SELECT `titel`, `autor`, `nachricht`, `datum` FROM `nachrichten` ORDER BY `" . $spalte . "` " . $sort); $nachrichten = $select->fetchAll(PDO::FETCH_OBJ);
Mit dem folgenden Anweisungen erzeugen wir nun die Links um die Tabelle zu sortieren.
Dabei lesen wir das Array $spalten über eine foreach
-Schleife
aus und verknüpfen die Variablen und die Spalten-Namen zu einem Link.
echo '<table border="1"><tr>'; foreach ($spalten as$spalte) { echo '<th>' . ucfirst($spalte) . ' <a href="?spalte=' .$spalte. '&sort=asc" title="Aufsteigend sortieren">▲</a>' . '<a href="?spalte=' .$spalte. '&sort=desc" title="Absteigend sortieren">▼</a>' . '</th>'; } echo '</tr>';
Nun werden die Daten der sortierten Tabelle noch ausgegeben:
foreach ($nachrichten as $nachricht) { echo '<tr><td>' . $nachricht->titel . '</td>' . '<td>' . $nachricht->autor . '</td>' . '<td>' . $nachricht->nachricht . '</td>' . '<td>' . $nachricht->datum . '</td></tr>'; } echo '</table>';
Demo
Und so sollte das ganze dann in etwa aussehen:
