Ausgabe der Daten

Jetzt können wir die Daten ausgeben – dazu gibt es verschiedene Möglichkeiten beim mysqli Ergebnisobjekt. Wir haben ein 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:

erster Datensatz aus Datenbank ausgelesen
erster Datensatz aus Datenbank ausgelesen

Wir erhalten nur den ersten Datensatz angezeigt über fetch_assoc();

Wenn wir unsere Tabelle ansehen, ist klar, dass wir mehr als einen Datensatz haben.

allerdings mehr als ein Datensatz in der Datenbank vorhanden!
allerdings mehr als ein Datensatz in der Datenbank vorhanden!

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:

alle Datensatz aus Datei auslesen
alle Datensatz aus Datei auslesen

Die Anweisung fetch_all(); kann mit Parameter erweitert werden – wird fetch_all(MYSQLI_ASSOC) genutzt, erhalten wir wieder unser assoziatives Array und alle Daten:

alle Datensatz aus Datei auslesen über ein assoziatives Array
alle Datensatz aus Datei auslesen über ein assoziatives Array

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 Datensatz aus Datei auslesen mit korrekter Zeichenkodierung in assoziatives Array
alle Datensatz aus Datei auslesen mit korrekter Zeichenkodierung in assoziatives Array

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'] ;
}
[bild[alle Datensatz aus Datei auslesen und anzeigen mit korrekter Zeichenkodierung]]

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() genutzt für die vollständige Ausgabe wird 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 objektorientieren 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();