Ankündigung

Einklappen
Keine Ankündigung bisher.

Select Anweisung dynamisch mit PHP erstellen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Select Anweisung dynamisch mit PHP erstellen

    Hallo Community,

    in einem anderen Forum habe ich gelesen, wie man ein Formular mit Dropdown-Menü dynamisch erstellen lassen kann.
    Der Code dafür lautet wie folgt:

    PHP-Code:
      $user 'bob';
    $users = array('helen''alan''bob''michelle''sarah''anna');

    $select "<select name='user'>\ ";
    foreach(
    $users as $u) {
       
    $s = ($u == $user) ? 'selected' '';    
    $select .= "<option value='$u$s>$u</option>\ "; }
    echo 
    $select "</select>"
    Das Ergebnis sieht sehr vielversprechend aus. Allerdings möchte ich gerne, dass sich das Array mit einem Datenbank-Select automatisch befüllt á la

    PHP-Code:
    $sql "SELECT name FROM users";
    $select $pdo->query($sql)->fetch();

    $select "<select name='user'>\
    "
    ;
    foreach(
    $select as $u) {
    $s = ($u == $user) ? 'selected' '';
    $select .= "<option value='$u$s>$u</option>\
    "
    ;
    }
    echo 
    $select "</select>"
    Wenn ich den Code wie o.a. abändere, bekomme ich allerdings immern nur das erste Element des abgefragten Arrays. Weiß aber nicht warum. Wie kann ich das Dropdown mit allen in der Tabelle users befindlichen Namen erstellen?

  • #2
    Du überschreibst $select

    Schau mal den Code hier an, der scheint mir aufgeräumter: https://php-de.github.io/jumpto/ausw...achauswahlen-2
    The string "()()" is not palindrom but the String "())(" is.

    Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
    PHP.de Wissenssammlung | Kein Support per PN

    Kommentar


    • #3
      Hallo hausl,

      Danke für den Querverweis.
      Habe den Code ausprobiert. Leider bleibt mein Dropdown leer, obwohl ich weiß, dass in der Tabelle users eine Spalte mit Namen (= name) stehen. Ich vermute mal, dass $options noch manuell gepflegt werden müssen. Allerdings will ich das ja genau nicht. Sondern, dass sich das Dropdown mit den Elementen des abgefragten Arrays, sprich den Namen der Users aufbaut.
      Hier der Code:

      PHP-Code:

      <select name="Auswahl">
        <?php

      $sql 
      "SELECT name FROM users";
      $selectedValue $pdo->query($sql)->fetch();

        
      // gegebene Selectionwerte als Array  value => Beschreibung
        
      $options = array (
                         
      'value1' => 'Eintrag 1' ,
                         
      'value2' => 'Eintrag 2' ,
                         );

        foreach (
      $options as $value => $description) {

           
      // Prüfung, ob selektierter Wert, man beachte das Leerzeichen
           
      $attribute = ($value == $selectedValue) ? ' selected="selected"' '';

           
      // Ausgabe des <option> Elements
           
      sprintf (
                   
      '<option value="%s"%s>%s</option>' ,
                   
      $value ,
                   
      $attribute ,
                   
      $description
                   
      );
        }
        
      ?>
      </select>
      Fällt noch jemandem was ein, wie ich das am besten hinbekomme?
      Danke vorab.

      Kommentar


      • #4
        Vergiss $options, das ist ja nur die Datenbasis in dem Beispiel weil es da keine DB gibt.

        Du musst durch dein DB Ergebnis "loopen" (iterieren). Das heißt bei dir übrigens $selectedValue, was echt kein guter Name ist.

        Schau dir mal das ( https://php-de.github.io/jumpto/pdo/#no-param ) an, wegen der Schlefie und dem Fetch, du brauchst eher fetchAll, oder du itersierst mit fetch() bis kein Datensatz mehr da ist.

        The string "()()" is not palindrom but the String "())(" is.

        Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
        PHP.de Wissenssammlung | Kein Support per PN

        Kommentar


        • #5
          Hallo Hausl,

          Danke für den Hinweis.

          Habe den Code wie folgt nun abgeändert:

          PHP-Code:
          <?php
          $sql 
          "SELECT name FROM users";
          $stmt $pdo->prepare($sql);
          $stmt->execute();
          $arr $stmt->fetchAll();
          print_r($arr);
          ?>
          <select name="Auswahl">
            <?php

            
          // gegebene Selectionwerte als Array  value => Beschreibung
            
          $options = array (
                             
          'value1' => 'Eintrag 1' ,
                             
          'value2' => 'Eintrag 2' ,
                             );

            foreach (
          $options as $value => $description) {

               
          // Prüfung, ob selektierter Wert, man beachte das Leerzeichen
               
          $attribute = ($value == $arr) ? ' selected="selected"' '';

               
          // Ausgabe des <option> Elements
               
          sprintf (
                       
          '<option value="%s"%s>%s</option>' ,
                       
          $value ,
                       
          $attribute ,
                       
          $description
                       
          );
            }
            
          ?>
          </select>
          Wenn ich $arr mit print_r ausgebe, werden die usernamen auch ausgegeben im Array-Format. Das Dropdown bleibt allerdings trotzdem leer.

          Kommentar


          • #6
            Du nimmst auch nach wie vor $options für die foreach-Schleife, welche das Dropdown kreiert. Dort müsstest du Deinen Array aus der Datenbank nehmen.

            Kommentar


            • #7
              Ich kann nur immer wieder empfehlen für dynamische Selects eine Funktion zu schreiben. Diese Funktion sollte über folgende Eigenschaften verfügen:
              • Keine Ausgabe (echo) enthalten
              • das fertige HTML als String ausliefern (kann so überall eingebaut werden, z.B. in Templates)
              • Vorgabe der Options durch ein Array mit value => caption
              • Über eine Möglichkeit zur Vorbelegung der Auswahl verfügen (Stichwort selected)
              • Den Kontextwechsel nach HTML behandeln
              • Die Vergabe eines CSS-Klassennamens per Parameter für ein Design mit CSS ermöglichen
              • Die Möglichkeit weitere Attribute wie size per Parameter zu setzen
              Habe dafür mal einen alten Beitrag rausgesucht, der einen Ansatz für eine solche Funktion zeigt. Diesen Ansatz habe ich über Jahre weiterentwickelt und meinen Bedürfnissen angepasst. Aktuell ist auch nicht mehr die globale Variable $_POST in der Funktion. Im alten Beitrag wird auch der Kontextwechsel nach HTML nicht behandelt.

              Kommentar


              • #8
                jspit
                Guter Ansatz aber schon eine Ebene zu hoch für unseren Fragesteller, Er bekommt ja nicht mal die Variablen ersetzt. Meiner Meinung nach fehlen hier Grundlagen und das Verständnis der ersten PHP Stunde.
                Daher erst mal die Grundlagen von PHP beherrschen, HTML und CSS setze ich mal als gegeben voraus, Dann SQL und ein Tutorial dazu wie sich Abfragen machen lassen.
                In der Wissenssammlung (Link oben) finden sich Links und gute Hinweise.


                Kommentar


                • #9
                  Zitat von protestix Beitrag anzeigen
                  jspit
                  Guter Ansatz aber schon eine Ebene zu hoch für unseren Fragesteller, ...
                  Hallo, Underhill, laß dich nicht entmutigen. Ich weiß nicht, warum Protestix das immer macht, aber wahrscheinlich muß er. Dein 1. Codeabschnitt funktioniert. Dein SQL gibt exakt solch ein Array aus, wie du es hast. Du mußt also nur das Ergebnis des Query in eine Variable speichern, die nicht "$select" heißt, oder für den entgültigen html-Text eine andere Variable wählen. An die Stelle deiner foreach-Schleife tritt eine While-Schleife.

                  So würde der Code im prozeduralen Stil aussehen:
                  PHP-Code:
                  <?php
                  ...
                  # -- DATENBANKVERBINDUNG ---------------------------------------------------------
                    
                  $dbcon mysqli_connect($myserver$myUser$MyPassword);
                    
                  mysqli_select_db($dbcon$myDB);
                    
                  mysqli_query($dbcon"SET NAMES 'utf8'");

                  # -- DATEN ABRUFEN ---------------------------------------------------------------
                    // SQL-Query-String erzeugen ---------------------------------------------------
                    
                  $StrSQL 'SELECT uname FROM users';

                    
                  //-- AUSFÜHREN & AUSWERTEN -----------------------------------------------------
                    
                  $result mysqli_query($dbcon$StrSQL);
                    
                  $user 'bob';
                    
                  $str_select "<select name='user'> ";
                    while (
                  $row mysqli_fetch_array($result)) {

                    
                  $s = ($row[0] == $user) ? 'selected' '';
                    
                  $str_select .= "<option value='".$row[0]."' ".$s.">".$row[0]."</option>\
                    "
                  ;
                    }
                  echo 
                  $str_select "</select>";  
                  ?>
                  Natürlich hat protestix recht damit, daß dir so ziemlich alles fehlt. Die Frage ist nur: Wo anfangen?

                  Ich halte es für besser, erstmal deine ursprüngliche Idee zu verwirklichen. So sollte es weitergehen:
                  1. Versuche alles, was in meinem Code-Beispiel steht, zu verstehen. Wenn Fragen, dann fragen.
                  2. Versuche es in den Objektorientierten Stil umzuschreiben. Gelingt das nicht, stelle es zurück.
                  3. Arbeite Schritt für Schritt aus jspit's Beitrag ab.
                  4. Hole Schritt 2 nach, falls es nicht geklappt hat.

                  Läßt du Schritt 3. und 4. (bzw. 2.) weg, schadest du dir selbst!!! (Und Protestix hat vollumfänglich recht, auch mit der Stoßrichtung seines Beitrages, daß du jetzt hier erstmal alles liegen läßt und "die Schulbank drückst"!)

                  Kommentar


                  • #10
                    PHP-Code:
                      $str_select .= "<option value='".$row[0]."' ".$s.">".$row[0]."</option>\ 
                    Und htmlspecialchars() bitte nicht vergessen!
                    The string "()()" is not palindrom but the String "())(" is.

                    Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                    PHP.de Wissenssammlung | Kein Support per PN

                    Kommentar


                    • #11
                      Zitat von hausl Beitrag anzeigen

                      Und htmlspecialchars() bitte nicht vergessen!
                      Richtig. Hatte aber jspit bereits als Punkt 5. auf seiner Liste.

                      Wie es aussieht, ist es aber protestix gelungen, den TE zu vergraulen. Ich verstehe nicht, warum ihm nicht mal einer auf die Finger haut. Welche Befriedigung er dabei hat, laufend Leute als blutige Anfänger zu qualifizieren und ihnen zu empfehlen, erstmal ein halbes Dutzend Handbücher und Tutorials durchzuforsten und erst bitteschön danach wieder hier aufzutauchen, kann ich nicht sagen, interessiert mich auch nicht. Er sollte es aber m.E. unterlassen.

                      Kommentar


                      • #12
                        Zitat von Alf2016 Beitrag anzeigen
                        Wie es aussieht, ist es aber protestix gelungen, den TE zu vergraulen. Ich verstehe nicht, warum ihm nicht mal einer auf die Finger haut.
                        Weil protestix niemanden vergrault hat und auch nichts getan oder geschrieben hat, was den TE oder jemand anderen zu Nahe gehen sollte.

                        Zitat von Alf2016 Beitrag anzeigen
                        Welche Befriedigung er dabei hat, laufend Leute als blutige Anfänger zu qualifizieren und ihnen zu empfehlen, erstmal ein halbes Dutzend Handbücher und Tutorials durchzuforsten und erst bitteschön danach wieder hier aufzutauchen, kann ich nicht sagen, interessiert mich auch nicht. Er sollte es aber m.E. unterlassen.
                        Meiner Meinung nach sollte er das nicht unterlassen! Solange er das in der bewährten Ausdrucksweise wie bisher macht, bleibt das auf sachlicher Ebene und wird nicht automatisch aufgrund von Fakten unfair oder gemein.

                        Dies ist ein Fachforum und keine Grundlagen-Community! Wir bieten Hilfe zur Selbsthilfe, d.h., wer hier fragt, muss das Problem mit den Hilfestellungen hier selber lösen!
                        Voraussetzung dafür ist, dass man sich mit den Grundlagen befasst. Das erwarten wir einfach.

                        Ich möchte Dich bitten, Deine verurteilenden Beiträge gegenüber anderen Mitgliedern hier zukünftig zu unterlassen.

                        Danke

                        Competence-Center -> Enjoy the Informatrix
                        PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                        Kommentar


                        • #13
                          Danke an alle für eure Hilfe!

                          Habe den Wink verstanden und werde erstmal die Grundlagen lernen, bevor ich hier im Forum weitere Fragen stelle. Ich hoffe, dass ich somit niemandem mehr "zur Last" falle.

                          Schade nur, dass man im "PHP Einsteiger"-Forum keine Einsteiger-Fragen stellen darf, ohne dafür nicht gleich bloßgestellt zu werden. Ich dachte immer, dass Fachforen grundsätzlich erstmal dafür geeignet sind auch Anfängern helfen zu können.
                          Btw. Anfänger stellen immer erstmal "dumme" Fragen bzw. machen Fehler die aus Sicht eines Fortgeschrittenen erstmal für völlig diletantisch wahrgenommen werden. Umso schöner ist es hier eine Rubrik "PHP-Einstieger" vorzufinden. ...dachte ich jedenfalls.
                          Aber es gibt in allen Foren gleich welcher Kategorie oder Thema immer Leute, die eine gewisses "Hoheitswissen" angereichert haben und das dann gegenüber Anfängern entsprechend raushängen lassen.
                          Naja, wünsche allen frohe Weihnachten...

                          Kommentar


                          • #14
                            Zitat von Underhill Beitrag anzeigen
                            Schade nur, dass man im "PHP Einsteiger"-Forum keine Einsteiger-Fragen stellen darf, ohne dafür nicht gleich bloßgestellt zu werden.
                            Und wer hat das getan? Ihr müsst nicht alles immer gleich persönlich nehmen. Grundlagen zu lernen hilft jedem weiter, der etwas erreichen will.
                            Darauf hinzuweisen ist alles andere als bloßstellen.

                            Zitat von Underhill Beitrag anzeigen
                            Ich dachte immer, dass Fachforen grundsätzlich erstmal dafür geeignet sind auch Anfängern helfen zu können.
                            Richtig, aber man sollte das Ziel haben, das Problem selbst zu lösen, mit den Tipps, die man hier für lau bekommt.

                            Zitat von Underhill Beitrag anzeigen
                            Btw. Anfänger stellen immer erstmal "dumme" Fragen bzw. machen Fehler die aus Sicht eines Fortgeschrittenen erstmal für völlig diletantisch wahrgenommen werden. Umso schöner ist es hier eine Rubrik "PHP-Einstieger" vorzufinden. ...dachte ich jedenfalls.
                            Aber es gibt in allen Foren gleich welcher Kategorie oder Thema immer Leute, die eine gewisses "Hoheitswissen" angereichert haben und das dann gegenüber Anfängern entsprechend raushängen lassen.
                            Profitiere davon, anstatt Dich entmutigen zu lassen. Wie Du es für Dich umsetzt, liegt an Dir und nicht an den Helfern, die bereit sind, ihr Wissen mit Dir zu teilen.

                            Zitat von Underhill Beitrag anzeigen
                            Naja, wünsche allen frohe Weihnachten...
                            Das wünschen wir Dir auch.

                            Competence-Center -> Enjoy the Informatrix
                            PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                            Kommentar

                            Lädt...
                            X