Christin: Optionen in Formularfeld

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

  1. @@Christin

    Freu mich über Ratschläge!

    Ratschlag Nummer null: Zeig, was du gemacht hast!

    😷 LLAP

    --
    „Dann ist ja auch schrecklich, dass wir in einem Land leben, in dem nicht nur Bildungswillige leben, sondern auch hinreichende Zahlen von Bekloppten. Das darf ich so locker formulieren, ich bin ja jetzt Rentner und muss nicht mehr auf jedes Wort achten.“
    — Joachim Gauck über Impfgegner
  2. 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

    --
    sumpsi - posui - obstruxi
    1. 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

      1. Hallo Robert,

        natürlich. Wenn man schnell ein Beispiel runtertippt, sollte man trotzdem auf die Basics achten…

        Rolf

        --
        sumpsi - posui - obstruxi
    2. Hallo Rolf,

      recht herzlichen Dank dir! Das hilft mir schon einmal weiter.

      Liebe Grüße Christin

      1. 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>
        
        1. 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

        2. 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.
    3. Dieser Beitrag wurde gelöscht: Der Beitrag ist ein Duplikat eines anderen Beitrags.