PHP/HTML - Wie kann ich in jeder Zelle meiner Tabelle ein Dropdownmenü ausgeben?
Hallo zusammen,
folgendes Problem:
Ich möchte eine Tabelle haben, die in jeder Zelle ein Dropdownmenü hat. Später möchte ich die ausgewählten Werte in der Datenbank speichern.
Da die Tabelle selbst nicht statisch und aufgrund von anderen Parametern größer/kleiner, etc. ist, kann ich nicht in jede Zeile das Dropdown hineinschreiben.
Mein Dropdownmenü (welches einzeln einwandfrei funktioniert):
<form id="form" name="form" method="post">
<select Vorname2='NEW'>
<option value=""> </option>
<?php while ($cat = mysqli_fetch_array($vornamen,MYSQLI_ASSOC)):; ?>
<option value="<?php echo $cat['vorname'];?>">
<?php echo $cat['vorname'];?>
</option>
<?php endwhile; ?>
</select>
</form>
Wenn ich diesen Code zweimal verwende (auch unter anderem Namen), dann kann ich dennoch nur bei dem Menü etwas auswählen, welches zuerst im Quelltext vorkommt.
Die Wiederholungen versuche ich mit einer Loop gleichzeitig mit dem Aufbau der Tabelle zu intigrieren. In jede einzelne "Test"-Zeile soll später das Dropdownmenü.
for ($x = 0; $x < $anzahltage; $x++) {
echo "<tr>";
echo "<td>";
?>
Hier steht der Quelltext von oben
<?php
echo "</td>";
echo "<td> test 2</td>";
echo "<td> test 3</td>";
echo "<td> test 4</td>";
echo "<td> test 5</td>";
echo "<td> test 6</td>";
echo "</tr>";
}
Gibt es da bessere Ideen?
Ich bin nicht so gut im Programmieren. Ich kenne nicht alle Befehle. Also bitte nicht zu streng sein. :)
2 Antworten
Es wäre vorteilhaft, eine Funktion für die Ausgabe des Dropdowns anzulegen.
Beachte, dass ich in meinen Snippets durchgängig englische Bezeichner verwende.
function printDropdown($name, $dataTable) {
print '
<select name="' . $name . '">
<option disabled selected value=""></option>';
foreach ($dataTable as $dataRow) {
print '<option value="' . $dataRow[0] . '">' . $dataRow[0] . '</option>';
}
print '</select>';
}
Du siehst, dass ich hierbei auch einige Änderungen zu deinem Original-Code.
- Wenn dein leeres option-Element lediglich der Optik dient und ansonsten eigentlich keinen validen Wert darstellt, dann kann man es auch deaktivieren.
- Um die Funktion möglichst generisch zu halten, wird ihr ein numerisch indiziertes Array überreicht.
- Es gibt kein HTML-Attribut Vorname2. Das select-Element sollte jedoch ein name-Attribut bekommen. Andernfalls wird sein Wert bei Formularbestätigung nicht verschickt.
Wie du deine Formulare im Übrigen verschickst, sehe ich nicht. Ich würde zudem hinterfragen, ob nicht ein Formular genügt. Immerhin könntest du so auch mehrere Werte gleichzeitig abschicken.
In jedem Fall müsstest du schauen, dass die ID jedes gerenderten Formulars eindeutig sein muss. Vielleicht muss das Formular auch nie explizit angesprochen werden und man kann sich die ID sparen.
Das name-Attribut würde ich in jedem Fall entfernen. Wenn du das Formular explizit mit JavaScript ansprechen möchtest, verwende die ID. Für Styles wären Klassenselektoren die bevorzugte Wahl.
Die Ausgabe der Tabelle (mit nur einem Formularelement) könnte folgendermaßen aussehen:
<?php
$nameOptions = mysqli_fetch_row($names);
?>
<form method="post">
<table>
<?php for ($row = 0; $row < $numberOfDays; ++$row): ?>
<tr>
<?php for ($column = 0; $column < 6; ++$column): ?>
<td><?php printDropdown("name-$row-$column", $nameOptions); ?></td>
<?php endfor; ?>
</tr>
<?php endfor; ?>
</table>
</form>
Dabei gehe ich davon aus, dass du Testzelle, statt Testzeile meintest. Wenn nicht, musst du es halt noch einmal für deine Bedürfnisse anpassen.
Sofern das ein Kalender werden sollte, ist die Ausgabe übrigens falsch. Die Spaltenanzahl sollte 7 betragen und die Anzahl an Zeilen müsste mit einer Division berechnet werden. Nicht alle Felder dürften befüllt werden.
Gründsätzlich scheint das funktionieren zu müssen. Ich wüsste nicht, warum da ein Problem sein sollte. Wahrscheinlich müssten man das einfach mal sehen. Guck dir mal den ausgegebenen HTML-Code an. Entwicklerkonsole im Browser (F 12)