studyklar
IProg · Skript 6 · Abschnitt 5

Ergebnisse lesen: fetch_assoc, fetch_object, fetch_all

Eine SQL-Abfrage liefert mehrere Zeilen. In PHP holt man sie mit mysqli auf drei Arten ab: als Array, als Objekt oder alle auf einmal. Rechts steht jede Variante mit ihrer Ausgabe, berechnet mit Beispieldaten. Mit Weiter geht es Schritt für Schritt voran.

Worum es geht

Skript 06, Folien 21–23: DB-Zugriff mit fetch_assoc, fetch_object, fetch_all.

Ein Shop will alle Produkte der Kategorie CATS anzeigen. Die Verbindung zur Datenbank steht schon. Wie kommen die Zeilen der Abfrage in PHP-Variablen, und welche Variante passt wann?

Aus Skript 06, Folie 19: Die Verbindung: $db = new mysqli('localhost', 'user', 'pw', 'db'); In $db liegt sie für alle weiteren Aufrufe.

So gehen wir vor:

  1. Die Beispieltabelle.
  2. Die Abfrage mit query.
  3. fetch_assoc: eine Zeile, dann die Schleife, dann aufräumen.
  4. fetch_object und fetch_all.
  5. Die drei im Vergleich und eine Klausurfrage.

Die Beispieltabelle

productidnamecategoryid
FL-DSH-01ManxCATS
FL-DLH-02PersianCATS
K9-BD-01BulldogDOGS
K9-PO-02PoodleDOGS

Die Folien fragen eine Tabelle Product ab, mit Produktnummer (productid), Name und Kategorie (categoryid). Daten zeigen sie nicht; rechts stehen vier Beispielzeilen, mit denen alle Ausgaben hier berechnet sind.

Gesucht sind die Produkte der Kategorie CATS, also die ersten beiden Zeilen.

SQL als Text, query als Aufruf

$param = 'CATS';$sql = "SELECT productid, name        FROM Product WHERE categoryid = '$param'";$erg = $db->query( $sql );

Zeile 1 legt die gesuchte Kategorie fest; auf der Folie fehlt diese Zeile. Der SQL-Befehl ist für PHP nur ein String. In Zeile 2 und 3 steht er in doppelten Anführungszeichen; dort ersetzt PHP $param durch CATS. Die einfachen Hochkommas bleiben als Zeichen im Text. Daraus wird WHERE categoryid = 'CATS'.

Aus Skript 04, Folie 16: In doppelten Anführungszeichen setzt PHP Variablen ein, in einfachen nicht.

$db->query($sql) schickt den Text an die Datenbank. Zurück kommt eine Ergebnismenge (ein Objekt der Klasse mysqli_result), hier in $erg. Sie enthält die passenden Zeilen, aber noch nicht als PHP-Variablen. Die holt man mit einer der fetch-Methoden heraus (englisch fetch: holen).

Achtung: Werte so in den SQL-Text einzusetzen ist gefährlich, wenn sie vom Benutzer kommen. Warum, zeigt Skript 06, Folie 25 (SQL-Injection).

Noch 9 Schritte bis zum Ergebnis
Den ganzen Lösungsweg sehen Studierende und Lehrende der HS KL. Registriere dich mit deiner Adresse @stud.hs-kl.de oder @hs-kl.de, dann geht es hier direkt weiter.

Abbildung 1

productidnamecategoryid
FL-DSH-01ManxCATS
FL-DLH-02PersianCATS
K9-BD-01BulldogDOGS
K9-PO-02PoodleDOGS
LegendeZeilen des SchrittsDie Tabelle Product mit vier Produkten in zwei Kategorien.