![]() |
PHP:
|
|
| |
| E-Mail: | |
|---|---|
| Homepage-URL: |
Bei Fragen zu diesem Beitrag bitte den Autor des Beitrags kontaktieren!
In der FAQ der Newsgroup de.comp.lang.php wird ein Ansatz beschrieben, wie mit PHP eine Auswahlliste dynamisch aus den Einträgen einer Datenbanktabelle erstellt werden kann (10.7. Wie kann ich aus einer Datenbanktabelle einen "select" erzeugen?, http://www.php-faq.de/q-formular-select.html). Die dort vorgestellte Lösung setzt jedoch PHPLIB voraus. Hier soll ein Ansatz vorgstellt werden, der ohne PHPLIB auskommt und daher auch auf Servern einsetzbar ist, auf denen PHPLIB eben nicht verfügbar ist.
Die Lösung wird anhand eines konkreten Beispiels vorgestellt. Dieses mag ein wenig konstruiert wirken, stammt aber aus einer kleineren Anwendung, die ich entwickelt habe.
Es wird eine Auswahlliste erzeugt, die an zwei verschiedenen Stellen eingesetzt wird. Zunächst um einen Mitarbeiter, der neu in der Datenbank angelegt werden soll, einer Kostenstelle zuzuordnen, ein anderes Mal in einer Änderungsmaske. In dieser Maske soll dem Anwender zunächst angezeigt werden, in welcher Kostenstelle der Mitarbeiter ursprünglich angelegt wurde, dann aber soll er gegebenenfalls eine andere Kostenstelle auswählen können. Da der bisherige Eintrag an erster Stelle der Auswahlliste angezeigt wird, ist er zum einem für den Anwender sichtbar, was weniger irritierend wirken dürfte, als wenn er bei einer Abfrage- und Änderungsoperation einen Eintrag "Bitte auswählen" in der Auswahlliste zu sehen bekommt und es führt nicht zu Fehlern, wenn unbeabsichtigt "Enter" gedrückt wird und versucht wird, eben diesen Text als Eintrag in die Datenbanktabelle zu schreiben.
Die Auswahlliste wird mittels eines Includes erzeugt, der an benötigter Stelle eingebunden wird. Je nachdem ob es sich also um eine Neuanlage handelt oder um eine Änderung, sieht sie aber ganz anders aus.
So nämlich bei einer Neuanlage eines Mitarbeiters in der Datenbank:
Und so sähe die über den gleichen Include erzeugte Auswahlliste bei einer Änderung aus, wenn der Mitarbeiter bisher in der Kostenstelle 122 eingesetzt war:
Zum Verständnis hier noch die der Auswahlliste zugrundeliegende Datenbanktabelle costcenter, die die möglichen Kostenstellen (und eine per auto-increment erzeugte ID) beinhaltet:
+-----------+-----------+ | cc_id | cc_no | +-----------+-----------+ | 1 | 121 | | 2 | 122 | | 3 | 123 | +-----------+-----------+
Wenn ein Mitarbeiter geändert werden soll, kann sich der Anwender zunächst eine Liste von Mitarbeiter anzeigen lassen (z. B. alle die "Meier" heißen) und dann per Radiobutton einen Mitarbeiter zur Änderung markieren. Der Radiobutton übermittelt eine Variable radio (weil die Radiobuttons explizit mit <input type=\"radio\" name=\"radio\" ...> benannt worden sind) trägt und übermittelt einen Wert als Inhalt dieser Variablen. Der Wert wird hier D-User genannt, es handelt sich um eine Art Personalnummer, die eindeutig und daher als Schlüssel geeignet ist. Wenn ein neuer Mitarbeiter angelegt werden soll, dann wurde natürlich kein Mitarbeiter vorher zur Änderung markiert und die Variable radio ist leer bzw. in PHP-Logik "boole(false)".
Im folgenden Insert- oder Update-Statement kann dann die Kostenstelle als Inhalt der Varibale costcenter, dem Namen der Auswahlliste, in die Datenbanktabelle geschrieben werden.
Das soll hier reichen, weitere Erläuterungen können Sie den Kommentaren im abgebildeten Quelltext entnehmen.
<!--%%form_new_user.php%%-->
<?php
/*Hier steht ganz viel Quelltext*/
echo "<table>
<TR><TD>Kostenstelle</TD>
<TD>"; include ("lov_costcenter.php"); #So würde die folgende Datei als Include
echo " </TD> #in eine Tabelle eingebunden. Zu sehen ist
</tr> #eben eine Auswahlliste in einer
</table"; #Tabellenzelle.
/*Hier steht wieder ganz viel Quelltext*/
?>
<!--%%lov_costcenter.php%%-->
<?php
/*Und jetzt kommt der eigentlich spannende Teil:*/
/* Die Verbindung zur Datenbank besteht schon und wird hier vorausgesetzt. */
if ($radio != "NULL") { #Dieser Check dient dazu, um zu differenzieren, ob ein neuer
#Mitarbeiter angelegt ($radio = NULL) oder ein
#bestehender Mitarbeiter geändert werden soll,
#im letzten Fall (if-Bedingung erfüllt) soll die bisherige
#Kostenstelle des Mitarbeiters aus der Tablle "user" ermittelt werden.
#Der "duser" ist der Schlüssel, über den der User identifiziert wird.
$user_costcenter="SELECT costcenter FROM user WHERE duser='$radio';";
$result_user_costcenter=mysql_query($user_costcenter) or die;
$user_cc = mysql_fetch_row($result_user_costcenter);
}
#Unabhängig ob neuer oder bestehender Mitarbeiter brauchen wir alle
#Kostenstellen, um die Auswahloptionen zu bekommen.
$lov_costcenter="SELECT cc_id, cc_no FROM costcenter ORDER BY cc_no;";
$result_lov_costcenter=mysql_query($lov_costcenter) or die;
/*Und jetzt wird die eigentlich Auswahlbox geschrieben.*/
echo "<select name='costcenter' size='1'>"; #Sie wird immer
#geöffnet.
if ($user_cc != false) { #bestehender
#Mitarbeiter
echo "<option value='$user_cc[0]'>$user_cc[0]</option>"; #bisherige
#Kostenstelle
echo "<option value='0'>Andere Kostenstelle bitte auswählen</option>";
}
else { #neuer Mitarbeiter
echo "<option value='0'>Bitte auswählen</option>";
}
while ($row=mysql_fetch_row($result_lov_costcenter)) #Hier werden nach und
{ #nach alle
echo "<option value='$row[1]'>".$row[1]."</option>"; #Kostenstellen
} #ausgegeben.
echo "</select>"; #Schließen der
#Auswahlliste
/*Ergebnis und Link zur Datenbank freigeben, um Ressourcen zu schonen*/
mysql_free_result($result_lov_costcenter); mysql_close($link_lov_costcenter);
?>
Die folgenden Stellen werden empfohlen, um das obige Beispiel besser zu verstehen, oder um weitere Möglichkeiten und Details zu erfahren.
FAQ von de.comp.lang.php
PHP-FAQ: Select erzeugen
PHP-FAQ: Radiobuttons verarbeiten
de.comp.lang.php über Google-Groups
Auswahllisten und Radiobuttons