Optionen in Formularfeld
Christin
- php
Hallo an alle,
ich habe ein Formular erstellt und bin gerade dabei, für das erste Feld Auswahlmöglichkeiten zu erstellen. Die Daten stammen aus einer Abfrage und werden per PHP eingebaut. Die entsprechende Auswahl wird mir auch angezeigt, nur ist die gesamte Auswahl in einer Reihe und nicht untereinander aufgelistet. Im PHP-Code habe ich schon "<br>" verwendet. Er springt dennoch nicht in die nächste Zeile.
Das Problem liegt gegebenenfalls daran, dass ich den PHP-Code in einen einzigen <option>-Tag gesetzt habe. Was könnte ich stattdessen verwenden?
Freu mich über Ratschläge!
Liebe Grüße Christin
@@Christin
Freu mich über Ratschläge!
Ratschlag Nummer null: Zeig, was du gemacht hast!
😷 LLAP
Hallo Christin,
Das Problem liegt gegebenenfalls daran, dass ich den PHP-Code in einen einzigen <option>-Tag gesetzt habe. Was könnte ich stattdessen verwenden?
Ich lese das mal so: Du hast deine PHP Seite so geschrieben, dass dein PHP Code alle Auswahlmöglichkeiten in ein einziges option-Element setzt.
Der Unterschied Element und Tag ist: Ein Element wird von einem öffnenden Tag und einem schließenden Tag gebildet. Dazwischen steht der Elementinhalt. Es gibt Ausnahmen, einige Elemente haben kein schließendes Tag. <option> gehört nicht dazu.
Für eine Auswahlliste muss jeder Auswahlwert in einem eigenen <option>-Element stehen.
Typischerweise baut man das so auf:
<label for="werteliste">Auswahl: </label>
<select id="werteliste" name="werteliste">
<?php
foreach($auswahlliste as $id=>$auswahl):
?>
<option value="<?= htmlspecialchars($id) ?>"><?= htmlspecialchars($auswahl) ?></option>
<?php
endforeach;
?>
</select>
(Edit: htmlspecialchars hinzugefügt)
Du kannst auf das value-Attribut verzichten, dann bekommst Du vom select-Element den Optionstext zurück. Das ist nicht unbedingt die schlaue Lösung; die Optionstexte könnten unhandlich sein bzw. sie sind eventuell lokalisiert. Eine ID, die man ins value-Attrbut setzt, macht Dich bei der Abfrage der Auswahl vom konkreten Text unabhängig. Ob das für dich praktikabel ist, hängt von deinen Daten ab.
Ob Du die Schleife nun über ein Array mit keys und values laufen lassen musst, weiß ich natürlich nicht. Eventuell kommen deine Options aus einer Datenbankabfrage, oder aus einer anders gearteten Datenstruktur, dann muss die Schleife anders aussehen.
Zu empfehlen ist auf jeden Fall die "alternative Syntax" für foreach - keine geschweiften Klammern, sondern Doppelpunkt und endforeach. Die geschweiften Klammern gehen im Getöse von ?> und <?php nämlich gerne optisch unter.
Rolf
Moin Rolf,
Typischerweise baut man das so auf:
<label for="werteliste">Auswahl: </label> <select id="werteliste" name="werteliste"> <?php foreach($auswahlliste as $id=>$auswahl): ?> <option value="<?=$id?>"><?= $auswahl?></option> <?php endforeach; ?> </select>
… unter der Annahme, dass sowohl $id
als $auswahl
bereits im HTML-Kontext sind, ansonsten muss natürlich der Kontextwechsel berücksichtigt und htmlspecialchars
verwendet werden.
Viele Grüße
Robert
Hallo Robert,
natürlich. Wenn man schnell ein Beispiel runtertippt, sollte man trotzdem auf die Basics achten…
Rolf
Hallo Rolf,
recht herzlichen Dank dir! Das hilft mir schon einmal weiter.
Liebe Grüße Christin
Hallo,
nun muss ich doch noch einmal nachfragen, denn das Einfügen des Codes funktioniert bei mir bei dem PHP-Code, den ich bereits habe, leider nicht.
Meine Ausgangsposition ist Folgende: Ich habe ein Formular in HTML aufgebaut und möchte nun im ersten Feld Daten aus einer Datenbank ziehen (erstellt über phpMyAdmin). Das Problem hierbei ist wohl <option>, denn es entsteht ein Einzeiler, da ich auch nur einmal <option> verwende. 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?
Freue mich immer über eure Hilfestellungen!
Anbei ein Auszug meines Codes:
<!-- Content -->
<div class="wrapper">
<div class="col_2_3">
<form action="formular.php" method="post">
<p>D
<label for="produkt">Produktauswahl</label>
<select>
<option>
<?php
$HostName = '0';
$con = @new mysqli($HostName,"root","","test");
if($con->connect_error)
exit("Fehler bei Verbindung");
$Name = 'abc';
//$sql = "SELECT Produktname FROM label WHERE num = 'ABC' ORDER BY Produktname";
$sql = "SELECT Produktname FROM label WHERE num = '$Name' ORDER BY Produktname";
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>
</p>
Hallo,
Das Problem hierbei ist wohl <option>, denn es entsteht ein Einzeiler, da ich auch nur einmal <option> verwende.
Ja, weil du nur einmal option
durch deinen Code produzierst. (Quasi hardcodiert).
Lass PHP das option-Element mit in der Schleife erzeugen
Gruß
Kalk
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