# Drop-Down Liste mit Items aus Datenbank befüllen



## queensophia (9. September 2016)

Hallo Leute,

Ich möchte eine Drop-Down Liste mit den Einträgen meiner Datenbank befüllen.

Den Code dazu habe ich soweit fertig, jedoch stehe ich vor dem Problem, dass nicht alle Pizzen aus der Datenbank im Drop-Down angezeigt werden, sondern immer nur genau *ein *Item.

Genau genommen wird immer nur die Pizza im Drop-Down angezeigt, die zu letzt in der Datenbank angelegt wurde. Die davor werden nicht angezeigt.  Sprich das Drop-Down Menü bietet nur "Salami-Pizza" zur Auswahl (weil ich diese zuletzt angelegt habe), nicht aber "Schinken-Pizza", "Vegetarische Pizza" etc....

Vielen Dank für eure Hilfe, eure Sophia 

Hier mein Code.


```
<html>
<head>
    <title>Dropdown</title>
</head>
<body>
<div class="pizza">
<label>Pizza</label>
    <select name="pizza" onchange="getId(this.value);">
        <option value="">Wähle die Pizza</option>
        <?php
        $query = "SELECT * FROM pizza";
        $results = mysqli_query($con, $query);
        foreach ($results as $pizza) 
        ?>
        <option value="<?php echo $pizza["brancheID"]; ?>"><?php echo $pizza["pizza"]; ?></option>
       </select>
</div>
</body>
</html>
```


----------



## FranzV (11. September 2016)

Hallo Sophia,
deine  foreach sieht mir nicht korrekt aus.    Lautet das nicht normalerweise..
foreach (...) { ......  } ;
aber, probier doch mal das: (ab dem <?php statement )
...
    <?php
    $query = "SELECT * FROM pizza";
        $results = mysqli_query($con, $query);
         while($rowr = mysql_fetch_assoc($results)) {
                 $pizza  = $rowr["brancheID"]; 
                 echo "<option value= $brancheID>" . $rowr["pizza"] .  "</option>";
        }  ?>
 </select>


----------



## merzi86 (11. September 2016)

Wenn in der Schleife nur eine Anweisung ausgeführt wird, dann diese ohne geschweifte Klammer geschrieben werden.


```
while($pizzas = mysqli_fetch_assoc($results))
   printf("<option value='%s'>%s</option>", $pizza["brancheID"], $pizza["pizza"]);
```

Ansonsten hat Franz schon deinen Fehler entdeckt und "behoben" dir hat das auslesen der Ressource gefehlt (hier durch mysqli_fetch_assoc.

An Franz bitte aufpassen mysql_* Funktionen haben nichts mit mysqli zutun.
Außerdem sind die mysql_* Funktionen deprecated und werden demnächst komplett aus PHP entfernt.


----------



## FranzV (11. September 2016)

@merzi86   Danke für deinen Hinweis bzgl mysql & mysqli. Hatte ich glatt übersehen. Ich frage mich nur, wie das funtkionieren soll, wenn alle Hoster nur noch die php Versionen zur Verfügung stellen, die das alte mysql nicht mehr unterstützen. MySql_ in php ist doch sicher ohne Ende eingesetzt, bis das lles umgeschrieben ist....


----------



## merzi86 (11. September 2016)

Deshalb arbeiten viele mit Datenbanken Klassen, wo sie dann nur noch an einer Stelle diese Funktionen raus hauen müssen und nicht alle x Tausend Skripte nach mysql_* Funktionen durchsuchen müssen.

In PHP7 ist das schon so, dass diese Funktionen entfernt wurden.
Bitte jetzt nicht schreiben PHP7 bietet noch kein Provider an, dass ist falsch.
Es schon genug Provider die es anbieten, es ist eher schwer einen zu finden, der es nicht anbietet.


----------



## FranzV (11. September 2016)

ähm, hab ich ja nicht angezweifelt. Aber erst wenn die Hoster *nur noch* php ab Version 7 anbieten, wird sich zeigen, wo noch nachgearbeitet werden muss. Und das wird whs einiges sein. Mancher eingesetzter Code ist schon viele Jahre alt, wohl eher sehr viel davon.  Hat aber mit dem aktuellen Thread nichts zu tun.


----------



## mermshaus (11. September 2016)

merzi86 hat gesagt.:
			
		

> Ansonsten hat Franz schon deinen Fehler entdeckt und "behoben" dir hat das auslesen der Ressource gefehlt (hier durch mysqli_fetch_assoc.



Das ist nicht die Ursache. Die Rückgabe von mysqli_query ist seit PHP 5.4 iterierbar, kann also direkt in foreach genutzt werden. Das war mir auch neu.

- http://de2.php.net/manual/en/class.mysqli-result.php

Der gezeigte Code gibt nur die letzte Pizza aus, weil in der Tat mit der foreach-Schleife was nicht stimmt.

Es steht dort vom Prinzip her das hier:


```
<?php

$values = array(1, 2, 3, 4, 5);

foreach ($values as $v) ?>

<p><?php echo $v; ?></p>
```

Diese Code liefert "<p>5</p>", also den letzten Wert des Arrays.

Anschaulich kann man sich das so vorstellen, dass PHP hinter dem foreach-Statement und vor dem schließenden Tag "?>" automatisch ein Semikolon (bzw. ein Statement-Ende) annimmt/hinzufügt.

Die foreach-Schleife läuft dann einmal komplett „trocken“ durch:


```
$values = array(1, 2, 3, 4, 5);

foreach ($values as $v);

echo $v;
```

$v wird nacheinander auf die Werte 1, 2, 3, 4 und 5 gesetzt und hat nach der Schleife, wenn es an die Ausgabe geht, eben den Wert 5.

* * *​
So wird ein Schuh draus:


```
<?php

$query = "SELECT * FROM pizza";
$results = mysqli_query($con, $query);

?><html>
<head>
    <title>Dropdown</title>
</head>
<body>
<div class="pizza">
    <label>Pizza</label>
    <select name="pizza" onchange="getId(this.value);">
        <option value="">Wähle die Pizza</option>
        <?php foreach ($results as $pizza) : ?>
            <option value="<?php echo $pizza["brancheID"]; ?>"><?php echo $pizza["pizza"]; ?></option>
        <?php endforeach; ?>
    </select>
</div>
</body>
</html>
```

Zu anderen Aspekten gleich noch mal in einem neuen Post mehr.


----------



## mermshaus (11. September 2016)

Warum die Query nach vorne in die Datei gezogen?

Das nennt sich EVA-Prinzip (http://php-de.github.io/jumpto/eva-prinzip/). Hier in sehr kleinem Umfang. Die Idee ist, mit der (HTML-)Ausgabe erst dann zu beginnen, wenn aller Code, der nicht unmittelbar für die Generierung der Ausgabe zuständig ist, durchlaufen ist. Das hat den Vorteil, dass beispielsweise auftretende Fehler (DB-Verbindung funktioniert nicht oder dergleichen) nicht erst dann bemerkt werden, wenn schon eine halbe „normale“ Seite ausgegeben wurde. So kann sauber eine spezielle Fehlerseite generiert werden. Zudem ist mit der EVA-Vorgehensweise der PHP-Code besser vom HTML-Code getrennt, was die Übersicht erleichtert. Oder den Gedanken noch etwas ausgeführt: Vielleicht sollen die Daten auch mal dazu genutzt werden, ein PDF-Dokument oder dergleichen zu generieren. In diesem Fall könnte der Verarbeitungsteil gleich bleiben und es müsste nur der Ausgabe-Teil ausgetauscht werden.

Warum foreach <Doppelpunkt> und endforeach statt geschweiften Klammern?

Das ist die alternative Syntax für Kontrollstrukturen (http://php.net/manual/en/control-structures.alternative-syntax.php). In normalem Code verwendet man die in der Regel nicht, aber bei der Generierung von HTML-Ausgabe kommt sie häufig zum Einsatz. Einerseits deshalb, um zu verdeutlichen, dass PHP dann als Template-Sprache verwendet wird (mit der gleichen Funktion wie etwa Smarty oder Twig), und andererseits, weil ein endforeach; oder ein endif; im Wirrwarr komplexerer HTML-Strukturen einfach aussagekräftiger und besser zuzuordnen ist als ein "}", das zu jeder Kontrollstruktur gehören könnte. Diese Nutzung der alternativen Syntax ist kein Muss, aber etliche Frameworks und Entwickler machen das ganz gerne so.

Kontextwechsel

Im Code fehlt die Behandlung von Kontextwechseln, um Cross-Site-Scripting zu vermeiden. Details dazu hier: http://wiki.selfhtml.org/wiki/PHP/Anwendung_und_Praxis/Kontextwechsel Dynamische Ausgaben, die von PHP aus in HTML-Code eingefügt werden, sollten immer mit htmlspecialchars behandelt werden.

mysql und PHP 7

Die mysql-Erweiterung in PHP (das meint nicht mysqli oder das Datenbanksystem MySQL als solches) ist seit längerer Zeit als deprecated (grob: zur Entfernung vorgesehen) markiert. Längere Zeit wie in „8 Jahre“ oder so. Ich habe es gerade nicht im Kopf, aber es ist wirklich schon sehr lange der Fall. Entsprechender Code muss auf mysqli oder PDO umgeschrieben werden. Ansonsten wird er mit PHP 7 nicht mehr funktionieren. (Zumindest nicht ohne sehr große und eher alberne Verrenkungen. Wenn überhaupt.) Wie gesagt, das ist seit Ewigkeiten bekannt. Es gab reichlich Zeit dazu. (Etwa auf phpforum.de gibt es seit über 5 Jahren eine entsprechende Standardantwort, die jedem um die Ohren gehauen wurde und wird, der noch mysql-Funktionen nutzt. ) Wer seinen Code immer noch nicht entsprechend aktualisiert hat… Na ja, irgendwann gehen einfach mal die Lichter aus. Eine PHP-Version, die die alten mysql-Funktionen unterstützt, dürfte aber noch bis etwa 2019 oder 2020 mehr oder weniger problemlos verfügbar sein. Der offizielle Support für PHP 5.6 läuft bis Ende 2018, aber LTS-Linux-Distributionen, die noch länger laufen, werden sie auch danach noch mehr oder weniger gut pflegen. Das ist freilich kein Grund, mit einer Code-Aktualisierung noch länger zu warten. Der beste Zeitpunkt dafür ist jetzt.


----------

