www

ein Webangebot von rotering-net.de

PHP-Skript: Auswahlliste dynamisch aus Datenbanktabelle generieren (PDO)

Dieses Tutorial zeigt, wie man eine HTML-Auswahlliste dynamisch mittels PDO generiert, die auf den Werten einer Spalte in einer Datenbanktabelle beruht.

Anwendungsbeispiel

Nehmen wir an, wir brauchen für ein Formular eine Auswahlliste mit allen in unserem System registrierten Benutzern. Die Benutzer stehen natürlich bereits in einer Datenbanktabelle, die wir in unserem Beispiel einmal dbt_users nennen wollen. Die Namen der Benutzer finden wir in der Spalte username und eine numerische, eindeutige ID findet sich passenderweise in der Spalte userid. Die Funktion, die wir gleich programmieren werden, soll uns allein aus diesen Angaben eine komplette Auswahlliste erzeugen, die wir in sein <select>-Element einschließen.

<select name="user" size="1"> <?php echo createOptionList('dbt_users', 'userid', 'username'); ?> </select>

Dieser kleine Code soll am Ende eine solche Auswahlliste erzeugen (mit vier Benutzern als Beispiel):

Syntax

string createOptionList ($pDatabase, $pDatabaseTable, $pValueColumn, $pLabelColumn, $pSelectedValue)

$pDatabase
Das PDO, mit dem auf die Datenbank zugegriffen werden soll.

$pDatabaseTable
Der Name der Datenbank-Tabelle.

$pValueColumn
Der Name des Tabellenspalte mit den Indexwerten.

$pLabelColumn
Der Name der Tabellenspalte mit den Beschriftungen.

$pSelectedValue
(optional) Der Indexwert der aktuellen Auswahl.

Kommentiertes Skript

Als Arbeitserleichterung basteln wir uns als erstes eine kleine Funktion, die eine Zeichenkette in Backticks einschließt. Gleichzeitig maskiert die Funktion alle eventuell in der Zeichenkette bereits vorhandenen Backticks. Durch diese Funktion können wir später alle Tabellen- und Spaltennamen schicken und vermeiden so Fehler, nur weil ein Name zufällig auch ein Schlüsselwort von MySQL ist.

function wrapInBackticks($pString) { return '`' . str_replace('`', '``', $pString) . '`'; }

In der eigentlichen Funktion überprüfen wir zunächst, ob das im Parameter $pDatabase übergebene Objekt existiert und von der Klasse PDO abgeleitet wurde. So vermeiden wir Ausnahmefehler, wenn wir später versuchen die PDO-Methoden auf einem nicht existierenden oder falschen Objekt auszuführen. Stattdessen geben wir eine Fehlermeldung als HTML-Kommentar zurück. Das stört den übrigen Aufbau der Webseite nicht, gibt uns aber genug Hinweise für eine Fehlersuche im Fall der Fälle.

if ($pDatabase == null || !is_a($pDatabase, 'PDO')) { return '<!-- Fehler: $pDatabase existiert nicht oder ist kein Objekt der Klasse PDO. -->'; }

Jetzt beginnen wir unsere Tabellen- und Spaltenname durch die zuvor gebastelte Funktion wrapInBackticks() zu schicken. Außerdem initialisieren wir die Variable $lOptionList, die wir später mit dem HTML-Code befüllen werden.

$lDatabaseTable = wrapInBackticks($pDatabaseTable)); $lValueColumn = wrapInBackticks($pValueColumn)); $lLabelColumn = wrapInBackticks($pLabelColumn)); $lOptionList = '';

Nun können wir unsere SQL-Anfrage zusammenstellen. Die Anfrage ist sehr einfach gehalten. Wir selektieren die Spalten mit den Werten und den zugehörigen Beschriftungen aus der übergebenen Datenbank-Tabelle. Das Ganze sortieren wir noch nach den Beschriftungen. Die Anfrage ist als Grundgerüst zu verstehen. Sie können gerne noch die Sortierung optimieren, mittels WHERE-Klausel einen Filter realisieren und so weiter. Sobald Sie jedoch Daten hinzufügen, die direkt vom Benutzer stammen, sollten Sie auf Prepared Statements umsteigen, um SQL-Injections zu verhindern.

$lQuery = 'SELECT ' . $lValueColumn . ', ' . $lLabelColumn . ' FROM ' . $lDatabaseTable . ' ORDER BY ' . $lLabelColumn;

Schließlich müssen wir noch unsere SQL-Anfrage durchführen und auswerten. Für diese einfache Anfrage nutzen wir die query()-Methode. Der Methode geben wir als ersten Parameter unsere soeben zusammengestellte SQL-Anfrage und als zweiten Parameter die Konstante PDO::FETCH_NUM mit. Letzteres bewirkt, dass die jeweils ausgewählte Datenbankzeile als numerisches Array zurückgeliefert wird, was für unsere Zwecke am praktischten ist, da wir genau wissen, in welcher Spalte wir welchen Wert erwarten können. Die query()-Methode hat außerdem den Vorteil, dass wir mit einer foreach-Schleife direkt darüber iterieren können. Beachten Sie: wenn Sie auf Prepared Statments umsteigen, müssen Sie stattdessen mit der execute()-Methode auf dem Statement arbeiten und die Ergebnisse anschließend in einer Schleife mit einer der fetch-Methoden abfragen.

Für jede Datenbankzeile erstellen wir innerhalb der Schleife dann ein neues <option>-Element. Für den Fall, dass der Wert der übergebenen Vorauswahl ($pSelectedValue) und der aktuelle Wert aus der Wertespalte übereinstimmen sollten, setzen wir das selected-Attribut, um dieses Element vorzuselektieren. Die Beschriftung schicken wir schließlich noch durch die Funktion htmlspecialchars(), um gegebenenfalls vorhandene HTML-Steuerzeichen zu maskieren. Zum Schluss nicht das Zurückgeben unseres mühsam aufgebauten HTML-Codes mittels return vergessen.

foreach ($pDatabase->query($lQuery), PDO::FETCH_NUM as $lRow) { $lOptionList .= '<option value="' . $lRow[0] . '"' . ($lRow[0] == $pSelectedValue ? ' selected="selected"' : '') . '>' . htmlspecialchars($lRow[1]) . '</option>'; } return $lOptionList;

Skript zum Herunterladen

Das Skript ist in einer Textdatei mit der Kodierung UTF-8 hinterlegt, damit es nicht vom PHP-Interpreter auf meinem Webspace ausgeführt wird und Sie es herunterladen können. Sie können den benötigten Programmcode entweder in Ihr Skript hinüberkopieren oder aber das Skript speichern und die Endung auf .php ändern.

dynamische-auswahlliste-aus-datenbank-pdo.txt