PHP/HTML - Wie kann ich in jeder Zelle meiner Tabelle ein Dropdownmenü ausgeben?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

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)