Zusammenführen als kleines Programm zur Datenpflege

Jetzt führen wir unser neues Wissen zusammen und erstellen ein PHP-Programm zum Anzeigen und Pflegen der Daten. Es wird alles auf einer Seite erstellt.

Als erstes erfolgt eine Auflistung und danach ein Formular zur Pflege bzw. zum Anlegen von neuen Datensätzen.

Wir fangen mit unserem PHP-Programm von vorne an.

<?php
require 'inc/db.php';
?>

Unserer Datei „db.php“ im Verzeichnis „inc/“ hat folgenden Inhalt, um den Aufbau zur Datenbank zu erstellen:

<?php
// error_reporting(E_ALL);
error_reporting(0);
$db = new mysqli('localhost', 'root', 'root', 'adressbuch');

if ($db->connect_errno) {
    die('Sorry - gerade gibt es ein Problem');
}
?>

Im ersten Schritt sammeln wir alle Daten, die wir aus der Datenbank abgefragt haben in einem ARRAY. Dieses Array bekommt den Namen $daten

<?php
require 'inc/db.php';
$daten = array();

Jetzt erfolgt die SQL-Abfrage für alle Daten aus der Datenbank:

<?php
require 'inc/db.php';
$daten = array();
$erg = $db->query("SELECT * FROM kontakte");

Allerdings soll nur eine Anzeige erfolgen, wenn die Abfrage erfolgreich war. Daher wird die SQL-Query in eine if-Bedingung gepackt. Ist diese Erfolgreich gewesen, wird eine 1 für true zurückgeliefert.

<?php
require 'inc/db.php';
$daten = array();
if ($erg = $db->query("SELECT * FROM kontakte")) {
}

Bitte darauf achten, dass das Semikolon nach der SQL-Anweisung jetzt der Klammer der if-Bedingung gewichen ist. Vergisst man hier versehentlich das Semikolon, wird nie die if-Bedingung ausgeführt und man wundert sich heftig .

Die if-Abfrage stellt nur sicher, dass die SQL-Anweisung ausgeführt werden konnte. Allerdings kann es sein, dass keine Datensätze vorliegen. Somit wäre auch das Sammeln und Ausgeben der Daten nicht wirklich sinnvoll. Daher hier noch die Abfrage der Anzahl der Datensätze über num_rows

<?php
require 'inc/db.php';
$daten = array();
if ($erg = $db->query("SELECT * FROM kontakte")) {
    if ($erg->num_rows) {
    }	
}

Das Ergebnis von num_rows liefert entweder 1 oder mehr Datensätze, dann ist die if-Bedingung war und wird ausgeführt oder 0 Datensätze – dann wird die if-Bedingung nicht ausgeführt.

Wir gehen jetzt mit einer while-Schleife durch die von der Datenbank zurückgelieferten Ergebnisse, die im ersten Schritt $datensatz zugewiesen wird.

Und innerhalb der while-Schleife dann unserem Array $daten angehängt wird. Dieses Anhängen geschieht durch die leeren eckigen Klammern.

if ($erg = $db->query("SELECT * FROM kontakte")) {
    if ($erg->num_rows) {
        while($datensatz = $erg->fetch_object()) {
            $daten[] = $datensatz;
        }
    }	
}

Damit es einfach zum Begreifen ist, wurde hier eine längere Schreibweise gewählt. Man kann es genauso in einer Zeile schreiben:

        while($daten[]= $erg->fetch_object()) {
        }

Für einen guten Stil können wir nun noch den Speicher freigeben, der durch die Datenbank-Abfrage belegt wurde. Dies läuft über $erg->free();

<?php
require 'inc/db.php';
$daten = array();
if ($erg = $db->query("SELECT * FROM kontakte")) {
    if ($erg->num_rows) {
         while($datensatz = $erg->fetch_object()) {
            $daten[] = $datensatz;
        }
        $erg->free();
    }	
}

Jetzt haben wir die Daten vorliegen in $daten. Zum Test können wir diese nach unserem Einsammeln der Daten ausgeben lassen.

<?php
require 'inc/db.php';
$daten = array();
if ($erg = $db->query("SELECT * FROM kontakte")) {
    if ($erg->num_rows) {
         while($datensatz = $erg->fetch_object()) {
            $daten[] = $datensatz;
        }
        $erg->free();
    }	
}
echo "<pre>";
print_r ($daten);
?>

Wir sehen den Inhalt vom $daten. Auf diese können wir nun in der objektorientierten Schreibweise zugreifen.

Über count($daten) erhalten wir schnell Auskunft, wie viele Datensätze vorhanden sind bzw. ob überhaupt Daten vorliegen. Liegen keine Daten vor (!count ergibt dann true und if-Bedingung wird ausgeführt), geben wir auf dem Bildschirm die entsprechende Nachricht aus. Ansonsten zeigen wir die Daten an.

<?php
require 'inc/db.php';
$daten = array();
if ($erg = $db->query("SELECT * FROM kontakte")) {
    if ($erg->num_rows) {
         while($datensatz = $erg->fetch_object()) {
            $daten[] = $datensatz;
        }
        $erg->free();
    }	
}
if (!count($daten)) {
    echo "<p>Es liegen keine Daten vor :(</p>";
}

Und über else geben wir die Daten in Form einer Tabelle aus. Hier kommen die HTML-Befehle für Tabellen zu Einsatz:

<?php
require 'inc/db.php';
$daten = array();
if ($erg = $db->query("SELECT * FROM kontakte")) {
    if ($erg->num_rows) {
         while($datensatz = $erg->fetch_object()) {
            $daten[] = $datensatz;
        }
        $erg->free();
    }	
}
if (!count($daten)) {
    echo "<p>Es liegen keine Daten vor :(</p>";
} else {
?>

<?php	
}
echo "<pre>";
print_r ($daten);
?>

Wir können innerhalb von else auch den PHP-Bereich beenden und einfach HTML-Befehle nun in unser Programm aufnehmen. Das kann deutlich übersichtlicher werden also jeweils die HTML-Befehle in ein echo '<HTML-Befehl>'; zu packen.

if ($erg = $db->query("SELECT * FROM kontakte")) {
    if ($erg->num_rows) {
         while($datensatz = $erg->fetch_object()) {
            $daten[] = $datensatz;
        }
        $erg->free();
    }	
}
if (!count($daten)) {
    echo "<p>Es liegen keine Daten vor :(</p>";
} else {
?>
    <table>
        <thead>
            <tr>
                <th>ID</th>
                <th>Vorname</th>
                <th>Nachname</th>
                <th>Anmerkungen</th>
                <th>erstellt</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>Hier dann ID</td>
                <td>Hier dann Vorname</td>
                <td>Hier dann Nachname</td>
                <td>Hier dann Anmerkungen</td>
                <td>Hier dann erstellt</td>
            </tr>
        </tbody>
    </table>
<?php	
}
echo "<pre>";
print_r ($daten);
?>

Jetzt können wir in einer Schleife den Bereich innerhalb von tbody durchlaufen und dort unsere Daten ausgeben lassen:

if (!count($daten)) {
    echo "<p>Es liegen keine Daten vor :(</p>";
} else {
?>
    <table>
        <thead>
            <tr>
                <th>ID</th>
                <th>Vorname</th>
                <th>Nachname</th>
                <th>Anmerkungen</th>
                <th>erstellt</th>
            </tr>
        </thead>
        <tbody>
            <?php
            foreach ($daten as $inhalt) {
            ?>			
                <tr>
                    <td>Hier dann ID</td>
                    <td>Hier dann Vorname</td>
                    <td>Hier dann Nachname</td>
                    <td>Hier dann Anmerkungen</td>
                    <td>Hier dann erstellt</td>
                </tr>
            <?php
            }
            ?>			
        </tbody>
    </table>
<?php	
}

Und noch die Daten selber ausgeben:

if (!count($daten)) {
    echo "<p>Es liegen keine Daten vor :(</p>";
} else {
?>
    <table>
        <thead>
            <tr>
                <th>ID</th>
                <th>Vorname</th>
                <th>Nachname</th>
                <th>Anmerkungen</th>
                <th>erstellt</th>
            </tr>
        </thead>
        <tbody>
            <?php
            foreach ($daten as $inhalt) {
            ?>			
                <tr>
                    <td><?php echo $inhalt->id; ?></td>
                    <td><?php echo $inhalt->vorname; ?></td>
                    <td><?php echo $inhalt->nachname; ?></td>
                    <td><?php echo $inhalt->anmerkungen; ?></td>
                    <td><?php echo $inhalt->erstellt; ?></td>
                </tr>
            <?php
            }
            ?>			
        </tbody>
    </table>
<?php	
}

Wir werden später nochmals die Ausgabe gegen Vandalismus absichern – dass aber später, wenn verständlich wird, wo das Problem sitzt.

kompletter Quellcode aus diesem Kapitel

Datei db.php für den Ordner inc

<?php
// error_reporting(E_ALL);
error_reporting(0);
$db = new mysqli('localhost', 'root', 'root', 'adressbuch');
print_r ($db->connect_error);

if ($db->connect_errno) {
    die('Sorry - gerade gibt es ein Problem');
}
?>

Und für die Datei index.php:

<?php
require 'inc/db.php';
$daten = array();
if ($erg = $db->query("SELECT * FROM kontakte")) {
	if ($erg->num_rows) {
		while($datensatz = $erg->fetch_object()) {
			$daten[] = $datensatz;
		}
		$erg->free();
	}	
}
if (!count($daten)) {
    echo "<p>Es liegen keine Daten vor :(</p>";
} else {
?>
    <table>
        <thead>
            <tr>
                <th>ID</th>
                <th>Vorname</th>
                <th>Nachname</th>
                <th>Anmerkungen</th>
                <th>erstellt</th>
            </tr>
        </thead>
        <tbody>
            <?php
            foreach ($daten as $inhalt) {
            ?>			
                <tr>
                    <td><?php echo $inhalt->id; ?></td>
                    <td><?php echo $inhalt->vorname; ?></td>
                    <td><?php echo $inhalt->nachname; ?></td>
                    <td><?php echo $inhalt->anmerkungen; ?></td>
                    <td><?php echo $inhalt->erstellt; ?></td>
                </tr>
            <?php
            }
            ?>			
        </tbody>
    </table>
<?php	
}
?>