PHP-Skript: Auswahlliste dynamisch aus Datenbanktabelle generieren
Veraltetes Tutorial:
Dieses Tutorial nutzt noch die alten mysql_*-Funktionen, die seit PHP 5.5 nicht mehr verwendet werden sollten und ab PHP 7 nicht mehr zur Verfügung
stehen. Sie finden eine aktualisierte Version dieses Tutorials basierend auf PDO hier:
Auswahlliste dynamisch aus Datenbanktabelle generieren (PDO).
Dieses Tutorial zeigt, wie man eine HTML-Auswahlliste dynamisch 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 create_optionlist('dbt_users', 'userid', 'username'); ?>
</select>
Dieser kleine Code soll am Ende eine solche Auswahlliste erzeugen (mit vier Benutzern als Beispiel):
Syntax
string create_optionlist ($pDatabaseTable, $pValueColumn, $pLabelColumn, $pSelectedValue)
$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 einen String in Backticks einschließt. Durch diese 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 mysql_backticks ($pString) {
return '`' . $pString . '`';
}
In der eigentlichen Funktion beginnen wir damit, die Eingangsvariablen, die nachher in unserem SQL-Statement landen, umfassend zu maskieren. Die Funktion mysql_real_escape_string maskiert alle eventuell vorhandenen SQL-Steuerzeichen; mysql_backticks ist unsere eigene Funktion, deren Zweck ich oben bereits erläutert habe. Anschließend können wir sicher sein, dass selbst die verrücktesten Tabellen- oder Spaltennamen keine Probleme mehr bereiten. Außerdem wird die Variable $pSelectedValue zwangweise in eine Ganzzahl konvertiert (nur für den Fall, dass dort irgendein Quatsch übergeben wird) und schließlich die spätere Ausgabevariable $lOptionList initialisiert.
function create_optionlist ($pDatabaseTable, $pValueColumn,
$pLabelColumn, $pSelectedValue = 0) {
$lDatabaseTable = mysql_backticks(mysql_real_escape_string(
$pDatabaseTable));
$lValueColumn = mysql_backticks(mysql_real_escape_string(
$pValueColumn));
$lLabelColumn = mysql_backticks(mysql_real_escape_string(
$pLabelColumn));
$lSelectedValue = (int)$pSelectedValue;
$lOptionList = '';
Nun basteln wir uns unser SQL-Statement zusammen und führen es anschließend aus. Das Statement 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. Das Statement ist als Grundgerüst zu verstehen. Sie können gerne noch die Sortierung optimieren, mittels WHERE-Klausel einen Filter realisieren und so weiter. Die dritte Zeile sorgt im Falle eines Fehler für eine aussagekräftige Fehlermeldung.
$lQuery = 'SELECT ' . $lValueColumn . ', ' . $lLabelColumn .
' FROM ' . $lDatabaseTable . ' ORDER BY ' . $lLabelColumn;
$lResult = mysql_query($lQuery);
if (!$lResult) {
exit('Datenbankfehler in der Funktion create_optionlist():' .
mysql_error());
}
Schließlich müssen wir unser MySQL-Ergebnis noch auswerten und die Auswahlliste zusammensetzen. Da es in jeder Ergebniszeile nur zwei Werte gibt, deren Reihenfolge wir genau kennen, benutzen wir diesmal die Funktion mysql_fetch_row, die für jede Zeile ein indiziertes Array zurückliefert, da sie am performantesten arbeitet. Für jede Ergebniszeile erstellen wir ein neues <option>-Element. Für den Fall, dass der Wert der übergebenen Vorauswahl ($lSelectedValue) 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.
while ($lRow = mysql_fetch_row($lResult)) {
$lOptionList .= '<option value="' . $lRow[0] . '"' .
($lRow[0] == $lSelectedValue ? ' 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.