Auge: Optionen in Formularfeld

Beitrag lesen

Hallo

Ziel ist es, die einzelnen Produktnamen aufzulisten. Die Erweiterung mit foreach und endeach fällt mirals Laie hierbei etwas schwer.

Ist das, was ich vorhabe, denn überhaupt möglich, bzw. stoße ich da vielleicht auch an eine Grenze eines einfachen Formulars?

Natürlich ist es möglich. Was zu tun ist, haben dir Rolf, Robert und Tabellenkalk schon geschrieben.

Da du mehrere Einträge in deinem Select haben willst, und zu jedem einzelnen Eintrag ein eigenes Option-Element gehört, musst du nur deine Logik anpassen, die im deinem Beispielcode einem Fehlschluss folgt.

Ich verkürze mal:

<label for="produkt">Produktauswahl</label>
<select>
<option>

<?php
// Erstellung des Datenbank-Queries und dann …
	if($res = $con->query($sql))
{
	while ($dsatz = $res->fetch_assoc())
	 echo $dsatz["Produktname"]   . "<br>";
	//. $dsatz["Bezeichnung"] . "<br>";

	$res->close();
}
	else
	exit("Fehler bei Abfrage");
?>
</option>
</select>

Du erstellst ein Option-Element für alle Ergebniszeilen deiner Abfrage, wo du doch für jedes einzelne Ergebnis auch jeweils ein eigenes Option-Element benötigst. Das ist der Logikfehler, der (neben anderen Fehlern) behoben werden muss.

<label for="produkt">Produktauswahl</label>
<!--
Wenn das Label für das Select vorgesehen ist
und dieses nicht umschließt, verweist das
for-Attribut auf die ID des Selects.

Weiterhin braucht das Select einen Namen,
damit sein Wert bei der Auswertung der Eingabe
wiedererkannt werden kann.
Der kann identisch mit der ID sein.
-->
<select id="produkt" name="produkt">
<?php
// Erstellung des Datenbank-Queries und dann …
if ($res = $con->query($sql)) {
	while ($dsatz = $res->fetch_assoc()) {
    // Aufbereitung der aus der Datenbank stammenden Wertes
    // für die Ausgabe in HTML mit htmlspecialchars
    echo "<option>". htmlspecialcars($dsatz["Produktname"]) ."</option>";
  }
	//echo $dsatz["Produktname"]   . "<br>";
	//. $dsatz["Bezeichnung"] . "<br>";

	$res->close();
}
// Du brauchst hier keinen Else-Zweig.
?>
</select>

Falls sich der mit dem Formular zu übergebende Wert von jenem, der im Formular angezeigt wird, unterscheiden soll (zum Beispiel Übergabe: ID des Produkts, Anzeige: Name des Produkts), kann der zu übergebende Wert in das Value-Attribut des Option-Elements verpackt werden. Damit ist das Formularelement sowohl menschenlesbar (Produktname) als auch dessen Auswahl einfach maschinenverarbeitbar (Produkt-ID).

echo "<option value='". htmlspecialcars($dsatz["ProduktID"]) ."'>". htmlspecialcars($dsatz["Produktname"]) ."</option>";

Es gibt aber noch weiteres Verbesserungspotential. So wird das Select auf jeden Fall ins Formular eingebettet, auch wenn es eventuell überhaupt keine auswähöbaren Datensätze darin gibt. Weiterhin ist das Hin-und-Herspringen zwischen HTML und PHP-Kontext nicht so der Bringer. Es gibt mehrere Möglichkeiten, damit umzugehen.

Zum Beispiel könntest du statt des bisher verwendeten Weges mit HTML im PHP-Kontext auch die alternative Syntax mit primärer Verwendung des HTML-Kontexts und darin eingebettetem PHP gehen.

<?php
// Erstellung des Datenbank-Queries und dann …
if ($res = $con->query($sql)): ?>
<label for="produkt">Produktauswahl</label>
 <select id="produkt" name="produkt">
<? while ($dsatz = $res->fetch_assoc()): ?>
  <option value="<?php echo htmlspecialcars($dsatz["ProduktID"]); ?>"><?php echo htmlspecialcars($dsatz["Produktname"]); ?></option>
<?php endwhile; ?>
</select>
<?php
$res->close();
// weiterer Code
?>

Tschö, Auge

--
200 ist das neue 35.