Ausgabe der Daten
Jetzt können wir die Daten ausgeben – dazu gibt es verschiedene Möglichkeiten beim mysqli
Ergebnisobjekt. Uns stehen verschiedene Möglichkeiten zur Verfügung.
$datensatz = $erg->fetch_assoc();
Über diese Anweisung fetch_assoc
erhalten wir ein assoziatives Array – sprich ein Array mit sprechenden Namen als Keys. Ein „normales“ Array hat als Keys einfach Nummern von 0 angefangen. Unser Array bekommt als Keys die Namen der Tabellenspalten zugewiesen und ist somit wesentlich handlicher.
Für eine übersichtlichere Ausgabe lassen wir vor dem print_r($datensatz);
noch ein über HTML ein <pre>
ausgeben.
<?php
require 'inc/db.php';
echo "<h1>Programm Adressbuch</h1>";
$erg = $db->query("SELECT id, vorname, nachname FROM kontakte")
or die($db->error);
print_r($erg);
if ($erg->num_rows) {
echo "<p>Daten vorhanden: Anzahl ";
echo $erg->num_rows;
}
$datensatz = $erg->fetch_assoc();
echo "<pre>";
print_r($datensatz);
echo "</pre>";
?>
Als Ergebnis sehen wir eine saubere Ausgabe:
Wir erhalten nur den ersten Datensatz angezeigt über fetch_assoc();
Wenn wir unsere Tabelle ansehen, ist klar, dass wir mehr als einen Datensatz haben.
Die Anweisung fetch_assoc()
bringt uns nur einen Datensatz – fetch_all() gibt uns alle Datensätze.
$datensatz = $erg->fetch_all();
Wir haben dadurch jetzt zwar alle Daten, allerdings haben wir kein assoziatives Array mehr:
Die Anweisung fetch_all();
kann mit Parameter erweitert werden – wird fetch_all(MYSQLI_ASSOC)
genutzt, erhalten wir wieder unser assoziatives Array und alle Daten:
Exkursion Umlaute fehlen bei Datenbankausgabe
Aber vorab noch die Umlautgeschichte. In der letzten Beispielausgabe sehen wird in dem Screenshot anstelle des „ü“ bei dem Nachnamen „Müller“ eine Raute mit Fragezeichen. Hier fehlt nur die Anweisung, dass bei unserer Datenbank mit UTF-8 gearbeitet wird.
Daher wird die Datei „inc/db.php“ ergänzt durch:
$db->set_charset('utf8');
Alle Daten der Datenbank sauber ausgeben
Wir haben nun alle Datensätze über die Anweisung fetch_all(MYSQLI_ASSOC)
in einem Array gespeichert. Diese Daten können wir nun über eine foreach
-Schleife ausgeben.
$datensatz = $erg->fetch_all(MYSQLI_ASSOC);
foreach($datensatz as $zeile) {
echo '<br>';
echo '<br>' . $zeile['vorname'];
}
Oder weitere Daten ausgeben über die Punkt-Anweisung verkettet:
foreach($datensatz as $zeile) {
echo '<br>';
echo '<br>' . $zeile['vorname'] .' '. $zeile['nachname'] ;
}
Warum also nicht immer einfach fetch_all()
nutzen? Je größer der Datenbestand ist und je öfters die Datenbank abgefragt (sprich Anzahl der Nutzer pro Sekunde), desto heftiger wird der Speicherverbrauch und irgendwann geht der beste Server in die Knie. Daher wird gerne fetch_assoc()
und für die vollständige Ausgabe eine while
-Schleife genutzt.
Also machen wir aus unsere foreach
-Schleife eine while
-Schleife und machen direkt die Zuweisung zu $zeile
<?php
require 'inc/db.php';
echo "<h1>Programm Adressbuch</h1>";
$erg = $db->query("SELECT id, vorname, nachname FROM kontakte")
or die( $db->error);
print_r($erg);
if ($erg->num_rows) {
echo "<p>Daten vorhanden: Anzahl ";
echo $erg->num_rows;
}
while ($zeile = $erg->fetch_assoc()) {
echo '<br>' . $zeile['vorname'] .' '. $zeile['nachname'] ;
}
?>
Und jetzt nutzen wir die objektorientierte Schreibweise – somit bekommen wir es noch übersichtlicher!
<?php
require 'inc/db.php';
echo "<h1>Programm Adressbuch</h1>";
$erg = $db->query("SELECT id, vorname, nachname FROM kontakte")
or die( $db->error);
print_r($erg);
if ($erg->num_rows) {
echo "<p>Daten vorhanden: Anzahl ";
echo $erg->num_rows;
}
// while ($zeile = $erg->fetch_assoc()) {
while ($zeile = $erg->fetch_object()) {
echo '<br>'. $zeile->vorname;
}
?>
Jetzt haben wir keinerlei Array mehr, sondern müssen auch hier die objektorientierte Schreibweise nutzen.
Anstelle von $zeile['vorname']
wird es dann $zeile->vorname
Als Ausgabe im Browser ändert sich nichts – es werden weiterhin alle Namen angezeigt. Unser Quellcode ist übersichtlicher geworden!
Und nun räumen wir noch hinter uns auf. Der Speicherplatz kann nach der Ausgabe wieder freigegeben werden. Wir wollen ja nichts weiter bisher mit unserer Datenbankabfrage machen.
$erg->free();
$db->close();
Wenn Sie einen Fehler finden, bitte mitteilen (egal ob Schreibfehler oder inhaltlicher Fehler).
Mit Maus fehlerhafte Stelle markieren und übernehmen mit folgendem Button: