Auswahlbox und mySQL

10 views
Skip to first unread message

Rudolf Harras

unread,
Feb 5, 2021, 6:24:51 AMFeb 5
to
Ich habe da ein Skript übernommen wo bei einer Drop-Down-Box Werte
ausgewählt werden, die dann nach dem Absenden eines Formulares in die
mySQL-Datenbank eingetragen werden.

Das ganze sieht so aus:

<select name="auswahl" id="auswhl">

<option value="Auswahl_1" <?php if($_SESSION['auswahl']){ if
($_SESSION["auswahl"]=="Auswahl_1") echo ' selected ';}?>>Auswahl_1</option>

<option value="Auswahl_2" <?php if($_SESSION['auswahl']){ if
($_SESSION["auswahl"]=="Auswahl_2") echo ' selected ';}?>>Auswahl_2</option>

</select>

Wenn ich nun 10 andere Möglichkeiten hinzufüge, gibt es da eine
elegantere Lösung als jedesmal eine ganze Zeile anzuhängen?

Claus Reibenstein

unread,
Feb 5, 2021, 6:53:05 AMFeb 5
to
Rudolf Harras schrieb am 05.02.2021 um 12:24:

> Wenn ich nun 10 andere Möglichkeiten hinzufüge, gibt es da eine
> elegantere Lösung als jedesmal eine ganze Zeile anzuhängen?

Ja: Eine Schleife.

Gruß
Claus

Arno Welzel

unread,
Feb 6, 2021, 6:20:20 AMFeb 6
to
Rudolf Harras:
Ja. Man speichert die Auswahloptionen in einer MySQL-Tabelle und baut
die <option>-Elemente in einer Schleife auf, die die Werte aus der
Tabelle als Grundlage nimmt.


--
Arno Welzel
https://arnowelzel.de

Matthias P. Würfl

unread,
Feb 6, 2021, 6:22:23 AMFeb 6
to
Rudolf Harras schrieb am Freitag, 5. Februar 2021 um 11:24:51 UTC:
> Ich habe da ein Skript übernommen wo bei einer Drop-Down-Box Werte
> ausgewählt werden, die dann nach dem Absenden eines Formulares in die
> mySQL-Datenbank eingetragen werden.
[...]
> Wenn ich nun 10 andere Möglichkeiten hinzufüge, gibt es da eine
> elegantere Lösung als jedesmal eine ganze Zeile anzuhängen?

Funktionen, Schleifen, Arrays, etc. Programmieren halt :-) - Sag Bescheid, was Du von dem Folgenden nicht verstehst und ich kann dir sagen, wo man nachlesen kann wie es funktioniert.

Grüße, Matthias


<select name="auswahl" id="auswhl">
<?php gimmeGimmeGimmeTheAuswahlAfterMidnight(4); ?>
</select>
<?php



/**
* Gibt die Optionen für Rudolfs select aus. Erstellt dazu eine Liste von Optionen, welche alle "Option_NUMMER" heißen,
* und genau den gleichen Wert haben, wie sie auch heißen. Dann lässt diese Funktion die Funktion getSelectOptions()
* die Hauptarbeit machen. Was von dort an HTML-Code zurück kommt, wird dann hier direkt ausgegeben.
*
* @param int $wieviel Anzahl der Optionen, die man ausgegeben haben möchte
*/
function gimmeGimmeGimmeTheAuswahlAfterMidnight($wieviel){
$auswahl = array();
for($nummer=1 ; $nummer <= $wieviel ; $nummer=$nummer+1){
$auswahl["Auswahl_".$nummer] = "Auswahl_".$nummer;
}
$html = getSelectOptions($auswahl, "auswahl");
echo $html;
}



/**
* Gibt den HTML-Code für die Options eines <select>s zurück
*
* Beispiel: getSelectOptions( ['m'=>'Herr','w'=>'Frau'] , 'anrede' );
*
* @param array $options Optionen - der Array-Schlüssel ist der übergebene Wert, der Array-Wert der
* @param string $name Name des <select>
*
* @return string HTML-Code - alle Options, aber kein <select>
*/
function getSelectOptions($options, $name){
$html = '';
foreach($options as $optionKey => $optionName){
$html.= '<option value="'.$optionKey.'"';
if(isset($_SESSION[$name]) AND $_SESSION[$name] == $optionKey){
$html.= ' selected';
}
$html.= '>'.$optionName.'</option>';
$html.= "\n";
}
return $html;
}

Arno Welzel

unread,
Feb 6, 2021, 6:33:40 AMFeb 6
to
Arno Welzel:
Ergänzend: die Abfragen von Dir sind auch extrem umständlich.

Auch ein if($_SESSION['auswahl']) wird eine Warnug ergeben, wenn die
Variable nicht gesetzt. Damit ist diese Abfrage überflüssig.

Wenn darum geht, Warnungen beim Zugriff auf nicht existente Variablen zu
vermeiden, genügt das hier:

if(isset($_SESSION['auswahl']) && $_SESSION["auswahl"]=="Auswahl_1")

Und wenn man einen Wert häufiger braucht, kann man auch eine neue
Variable dafür definieren.

Als grober Entwurf - allerdings ungetestet:

----------------------------------------------------

<?php
$auswahl = '';
if (isset($_SESSION['auswahl']) {
$auswahl = $_SESSION['auswahl'];
}

// Diese Liste könnte man auch aus einer Datenbank laden
// Wichtig: beim Laden aus der Datenbank unbedingt
// htmlspecialchars() für die Ausgabe der Werte oder den Aufbau des
// Arrays verwenden!

$optionen = [
'Auswahl_1',
'Auswahl_2',
'Auswahl_3',
];

// Ausgabe der Drop-Down-Liste
?>
<select name="auswahl" id="auswhl">
<?php
foreach ($optionen as $option) {
$selected = '';
if ($auswahl === $option) {
$selected = 'selected';
}
sprintf(
'<option value="%s"%s>%s</option>',
$option,
$selected,
$option);
}
?>
</select>

----------------------------------------------------

Generell empfehle ich einen Blick in die PSR - das muss man zwar nicht
zwingend befolgen, aber es hilft, Fallstricke zu vermeiden:

<https://www.php-fig.org/psr/>

Rudolf Harras

unread,
Apr 29, 2021, 5:11:27 PMApr 29
to
Irgendwie war das da alles viel zu kompliziert.

Folgendes hat geholfen und ist auch sehr einfach:

<?php foreach (array('Auswahl1', 'Auswahl2', 'usw.') as $k) echo
"<option value='$k'
".($_SESSION['name']==$k?'selected':'').">$k</option>";?>

Arno Welzel

unread,
May 2, 2021, 6:19:27 PMMay 2
to
Rudolf Harras:
Ich würde wenigstens vorher prüfen, ob $_SESSION['name'] überhaupt
gesetzt ist, sonst wird Dir evtl. das Server-Log mit Warnungen geflutet.

Außerdem:

- Zwischen "value" und "selected" muss ein Leerzeichen rein.
- In HTML sind einfache Hochkommas eher unüblich.
- Der Code ist leserlicher, wenn die Prüfung als eigenes Statement
erfolgt und PSR-12 zu beachten, kann nicht schaden
(<https://www.php-fig.org/psr/psr-12/)

Das würde ich dann eher so machen:

<?php
foreach (array('Auswahl1', 'Auswahl2', 'usw.') as $k) {
echo '<option value="$k"';
if (isset($_SESSION['name']) && $_SESSION['name'] == $k) {
echo ' selected';
}
echo '>$k</option>';
}
?>
Reply all
Reply to author
Forward
0 new messages