15.3 Beispiel mit Datenerfassung (objektorientiert) - siehe Kapitel 14.2

Das Beispiel ist identisch mit dem Beispiel aus Kap.14.2. Die Daten sollen jedoch diesmal nicht in einer Datei, sondern in einer MySQL-Datenbank gespeichert werden.

Der Name der Datenbank ist "schueler".
Die Datenbank enthält 1 Tabelle mit dem Namen "schueler".
Die Tabelle hat 3 Attribute: "name", "notenschnitt" und "klasse".

Die Model-Klasse (bzw. Datenklasse) Schueler (Kap.14.2.1), sowie die DAO-Klassen DAOerfassenSchueler (Kap.14.2.2.1) und DAOausgebenSchueler (Kap.14.2.2.4) können ohne Änderung direkt verwendet werden (diese 3 Klassen sind ja unabhängig von der Art der Datenspeicherung - insbesondere sind sie unabhängig von einer Datenbank), während die beiden DAO-Klassen DAOschreibenSchueler und DAOlesenSchueler, die ja für den Zugriff auf die Datenbank zuständig sind, entsprechend adaptiert werden müssen.

Bem.:
DAO steht für "Data Access Object" - siehe Kap.5.2.1.1 und 14.2.

15.3.1 Klasse DBconnection (Verbinden mit Datenbank)

Die folgende Include-Datei beinhaltet die Attribute für die Verbindung zum MySQL-Datenbank-Server. Diese Datei sollte aus Sicherheitsgründen klarererweise nicht im öffentlichen Webserverbereich gespeichert sein!

Include-Datei dbConnectDaten-oo.inc.php
<?php $this->servername = "localhost"; $this->dbBenutzer = "root"; $this->dbPasswort = ""; ?>


Die folgende Klasse DBconnection ist eine Hüllklasse für das Verbindungsobjekt $verbindung zu einer MySQL-Datenbank:

Datei DBconnection.class.php
<?php const CONNECTDATEN = "dbConnectDaten-oo.inc.php"; // Hüllklasse für das Verbindungsobjekt zu einer Datenbank. Instanzen dieser Klasse sind Attribute in DAO-Klassen. class DBconnection { // ------------------------------------------------------------------------- // Instanzattribute // Attribute für die Datenbank-Verbindung private $servername; private $dbBenutzer; private $dbPasswort; private $datenbank; // 'mysqli'-Objekt für die Verbindung zu einer DB private $verbindung; // ------------------------------------------------------------------------- // Konstruktor public function __construct($datenbank) { require_once CONNECTDATEN; $this->datenbank = $datenbank; $this->oeffnenVerbindung(); } // ------------------------------------------------------------------------- // Private Instanzmethoden // Die Verbindung zum Datenbank-Server herstellen und eine Datenbank auswählen. private function oeffnenVerbindung() { $this->verbindung = new mysqli($this->servername, $this->dbBenutzer, $this->dbPasswort, $this->datenbank); if (!$this->verbindung) { die("Die Verbindung zum MySQL-Server auf <b>$this->servername</b> " . "für Datenbank <b>$this->datenbank</b> ist fehlgeschlagen! " . $this->verbindung->error); } } // ------------------------------------------------------------------------- // Get-Methode für die DB-Verbindung public function getVerbindung() { return $this->verbindung; } // ------------------------------------------------------------------------- // Sonstige öffentliche Instanzmethoden public function schliessenVerbindung() { $this->verbindung->close(); } // ------------------------------------------------------------------------- /* 'PreparedStatement'-Objekt erzeugen für einen SQL-Befehl. Die SQL-Befehle selbst und die Parameter zu den SQL-Befehlen werden in der DAO-Klasse definiert. Diese Methode wird nur in der DAO-Klasse benötigt und sollte dort pro SQL-Befehl nur 1 einziges Mal durchgeführt werden! Parameter: $sqlBefehl SQL-Befehl für 'PreparedStatement'-Objekt return: das erzeugte 'PreparedStatement'-Objekt */ public function erzeugenPrepStatement($sqlBefehl) { $prepStatement = $this->verbindung->prepare($sqlBefehl); if (!$prepStatement) { die("Prepared-Statement konnte nicht erzeugt werden! " . $this->verbindung->error); } return $prepStatement; } } ?>


15.3.2 DAO-Klassen

15.3.2.1 Klasse DAOschreibenDBSchueler (Datensätze einfügen - INSERT)

Datei DAOschreibenDBSchueler.class.php
<?php require_once PFAD . "ooSkripte/DBconnection.class.php"; require_once PFAD . "ooSkripte/modelKlassen/Schueler.class.php"; class DAOschreibenDBSchueler { // ------------------------------------------------------------------------- // Klassenkonstante const DATENBANK = "schueler"; // ------------------------------------------------------------------------- // Instanzattribute // Datenobjekt für die zu schreibenden Daten private $schueler; // Verbindungsobjekt zur Datenbank ('mysqli'-Objekt) private $datenbank; // 'String'-Objekt für SQL-Befehl mit zugehörigem 'PreparedStatement'-Objekt private $sqlInsertSchueler; private $prepStatInsertSchueler; // ------------------------------------------------------------------------- // Konstruktor public function __construct() { $this->datenbank = new DBconnection(self::DATENBANK); $this->definierenSQLBefehle(); } // ------------------------------------------------------------------------- // Private Instanzmethoden private function definierenSQLBefehle() { $this->sqlInsertSchueler = "INSERT INTO schueler " . "(name, notenschnitt, klasse) " . "VALUES (?, ?, ?) "; $this->prepStatInsertSchueler = $this->datenbank->erzeugenPrepStatement($this->sqlInsertSchueler); } // ------------------------------------------------------------------------- // Zugriffsmethoden (Get- und Set-Methoden) public function setSchueler(Schueler $schueler) { $this->schueler = $schueler; } // ------------------------------------------------------------------------- // Öffentliche Instanzmethoden public function schreiben() { /* Parameter setzen. Bei mehreren Parametern ist die Reihenfolge der Argumente wesentlich! Die Reihenfolge entspricht genau der Reihenfolge der ?-Parameter im entsprechenden SQL-Befehl. */ $this->prepStatInsertSchueler->bind_param("sds", $this->schueler->getName(), $this->schueler->getNotenschnitt(), $this->schueler->getKlasse()); // SQL-Befehl durchführen $ok = $this->prepStatInsertSchueler->execute() or die("Die Anfrage ist fehlgeschlagen! " . $this->datenbank->getVerbindung()->error); } // ------------------------------------------------------------------------- public function schliessenVerbindung() { $this->datenbank->schliessenVerbindung(); } } ?>


15.3.2.2 Klasse DAOlesenDBSchueler (Datensätze auswählen - SELECT)

Datei DAOlesenDBSchueler.class.php
<?php require_once PFAD . "ooSkripte/DBconnection.class.php"; require_once PFAD . "ooSkripte/modelKlassen/Schueler.class.php"; class DAOlesenDBSchueler { // ------------------------------------------------------------------------- // Klassenkonstante const DATENBANK = "schueler"; // ------------------------------------------------------------------------- // Instanzattribute // Verbindungsobjekt zur Datenbank ('mysqli'-Objekt) private $datenbank; // 'String'-Objekte für SQL-Befehl mit zugehörigen 'PreparedStatement'-Objekten private $sqlSelAlleSchueler; private $prepStatSelAlleSchueler; private $sqlSelSchuelerKlasse; private $prepStatSelSchuelerKlasse; // ------------------------------------------------------------------------- // Konstruktor public function __construct() { $this->datenbank = new DBconnection(self::DATENBANK); $this->definierenSQLBefehle(); } // ------------------------------------------------------------------------- // Private Instanzmethoden private function definierenSQLBefehle() { $this->sqlSelAlleSchueler = "SELECT name, notenschnitt, klasse FROM schueler "; $this->sqlSelSchuelerKlasse = "SELECT name, notenschnitt, klasse FROM schueler " . "WHERE klasse = ? "; $this->prepStatSelAlleSchueler = $this->datenbank->erzeugenPrepStatement($this->sqlSelAlleSchueler); $this->prepStatSelSchuelerKlasse = $this->datenbank->erzeugenPrepStatement($this->sqlSelSchuelerKlasse); } // ------------------------------------------------------------------------- // Verschiedene Methoden für SQL-SELECT-Befehle // Liefert alle Schüler als Zeichenketten. public function selAlleSchuelerStr() { // SQL-Befehl durchführen $ok = $this->prepStatSelAlleSchueler->execute() or die("Die Anfrage ist fehlgeschlagen! " . $this->datenbank->getVerbindung()->error); // Selektierte Spalten an Variable binden (Zuordnung: Spalte - Variable) $this->prepStatSelAlleSchueler->bind_result($name, $notenschnitt, $klasse); // Alle Zeilen lesen und aufbereiten $ok = $this->prepStatSelAlleSchueler->fetch(); while ($ok != NULL && $ok) { $ergebnis[] = $name . " " . $notenschnitt . " " . $klasse; $ok = $this->prepStatSelAlleSchueler->fetch(); } if (empty($ergebnis)) { return NULL; } return $ergebnis; } // ------------------------------------------------------------------------- // Liefert alle Schüler als 'Schueler'-Objekte. public function selAlleSchueler() { // SQL-Befehl durchführen $ok = $this->prepStatSelAlleSchueler->execute() or die("Die Anfrage ist fehlgeschlagen! " . $this->datenbank->getVerbindung()->error); // Selektierte Spalten an Variable binden (Zuordnung: Spalte - Variable) $this->prepStatSelAlleSchueler->bind_result($name, $notenschnitt, $klasse); // Alle Zeilen lesen und aufbereiten $ok = $this->prepStatSelAlleSchueler->fetch(); while ($ok != NULL && $ok) { $schueler = new Schueler(); $schueler->setName($name); $schueler->setNotenschnitt($notenschnitt); $schueler->setKlasse($klasse); $ergebnis[] = $schueler; $ok = $this->prepStatSelAlleSchueler->fetch(); } if (empty($ergebnis)) { return NULL; } return $ergebnis; } // ------------------------------------------------------------------------- // Liefert alle Schüler einer ausgewählten Klasse als 'Schueler'-Objekte. public function selSchuelerKlasse($klasse) { /* Parameter setzen. Bei mehreren Parametern ist die Reihenfolge der Argumente wesentlich! Die Reihenfolge entspricht genau der Reihenfolge der ?-Parameter im entsprechenden SQL-Befehl. */ $this->prepStatSelSchuelerKlasse->bind_param("s", $klasse); // SQL-Befehl durchführen $ok = $this->prepStatSelSchuelerKlasse->execute() or die("Die Anfrage ist fehlgeschlagen! " . $this->datenbank->getVerbindung()->error); // Selektierte Spalten an Variable binden (Zuordnung: Spalte - Variable) $this->prepStatSelSchuelerKlasse->bind_result($name, $notenschnitt, $klasse); // Alle Zeilen lesen und aufbereiten $ok = $this->prepStatSelSchuelerKlasse->fetch(); while ($ok != NULL && $ok) { $schueler = new Schueler(); $schueler->setName($name); $schueler->setNotenschnitt($notenschnitt); $schueler->setKlasse($klasse); $ergebnis[] = $schueler; $ok = $this->prepStatSelSchuelerKlasse->fetch(); } if (empty($ergebnis)) { return NULL; } return $ergebnis; } // ------------------------------------------------------------------------- public function schliessenVerbindung() { $this->datenbank->schliessenVerbindung(); } } ?>


15.3.3 Anwendungsprogramme

Während die Anwendungen "Daten erfassen und speichern" für eine Datei (siehe Kap.‎14.2.3) und für eine Datenbank einander sehr ähnlich sind (in beiden Fällen erfolgt ja das Speichern der Datensätze einzeln), unterscheiden sich die entsprechenden Anwendungen "Daten lesen und ausgeben" für eine Datei (siehe Kap.‎14.2.3.1) und für eine Datenbank sehr, weil - wie zuvor erwähnt - das Lesen aus einer Datenbank immer eine Menge von Datensätzen liefert.

15.3.3.1 Daten erfassen und speichern

Datei pErfassenSchreibenDB.php
<!doctype html> <!-- Programm "pErfassenSchreibenDB.php" --> <html> <head> <meta charset="iso-8859-1" /> <meta name="author" content="Beringer Alfred" /> <meta name="description" content="Programmieren mit PHP 5" /> <title>Daten erfassen und speichern in einer Datenbank</title> </head> <body>
<?php const ENDESEITE = "pLesenDBAusgeben.php"; // Pfad zum privaten Projektverzeichnis (siehe Kap.16.1.2) require_once "projektpfad.inc.php"; require_once PFAD . "ooSkripte/daoKlassen/DAOerfassenSchueler.class.php"; require_once PFAD . "ooSkripte/daoKlassen/DAOschreibenDBSchueler.class.php"; // ----------------------------------------------------------------------------- $eingabedaten = new DAOerfassenSchueler(); $adaten = new DAOschreibenDBSchueler(); if (isset($_POST['fButGesendet'])) { // Eingabedaten aus dem Formular übernehmen $eingabe = new stdClass(); $eingabe->name = $_POST['fTxfName']; $eingabe->notenschnitt = $_POST['fTxfNotenschnitt']; $eingabe->klasse = $_POST['fTxfKlasse']; // Eingabedaten aufbereiten und in die Datei schreiben $ok = $eingabedaten->aufbereitenDaten($eingabe); if ($ok) { $ausgabedaten->setSchueler($eingabedaten->getSchueler()); $ausgabedaten->schreiben(); // Zähler erhöhen $i = $_POST['fHidZaehler'] + 1; } else { print("<p>Fehler in den Eingabedaten!!!</p>"); // Zähler nicht erhöhen $i = $_POST['fHidZaehler']; } } else { // Zähler initialisieren $i = 0; } // ----------------------------------------------------------------------------- ?>
<p> Bitte geben Sie die Daten des Sch&uuml;lers bzw. der Sch&uuml;lerin ein: </p> <form name="formEingabe" action="<?php echo $_SERVER["PHP_SELF"]; ?>" method="post" accept-charset="iso-8859-1"> <table> <tr> <td><b>Name:</b></td> <td><input type="text" name="fTxfName" size="20" /></td> </tr> <tr> <td><b>Notenschnitt:</b></td> <td><input type="text" name="fTxfNotenschnitt" size="4" /></td> </tr> <tr> <td><b>Klasse:</b></td> <td><input type="text" name="fTxfKlasse" size="8" /></td> </tr> </table> <p> <input type="submit" name="fButGesendet" value=" Senden " /> <input type="reset" name="fButReset" value="Zur&uuml;cksetzen" /> </p> <input type="hidden" name="fHidZaehler" value="<?php echo $i; ?>" /> </form> <p>
<?php if ($i == 1) { $textbaustein = "Datensatz"; } else if ($i > 1) { $textbaustein = "Datens&auml;tze"; } if ($i >= 1) { print("<p>Bisher $i $textbaustein geschrieben.</p><p> Letzte Eingabe: $eingabe->name $eingabe->notenschnitt $eingabe->klasse </p>"); } ?>
</p> <form name="formEnde" action="<?php echo ENDESEITE; ?>" method="post" accept-charset="iso-8859-1"> <input type="submit" name="fButEnde" value="Ende der Datenerfassung" /> <input type="hidden" name="fHidZaehler" value="<?php echo $i; ?>" /> </form> <p> </p><hr /><p> </p> <footer> <address id="ende"> Copyright &#169; 2009<br /> Letzte Aktualisierung: 2013-10-30<br /> Beringer Alfred<br /> Wögerer Wolfgang </address> </footer> </body> </html>


15.3.3.2 Daten lesen und ausgeben

Dieses Programm entspricht im Wesentlichen dem Programm pLesenAusgeben.php (siehe Kap.14.2.3.2) - enthält aber zur Demonstration mehrere Arten der Ausgabe. Zum Testen der Methode 'selSchuelerKlasse' aus der DAO-Klasse 'DAOlesenDBSchueler' wird der Parameter für die Auswahl der Klasse der Einfachheit halber fix vorgegeben.

Datei pLesenDBAusgeben.php
<!doctype html> <!-- Programm "pLesenDBAusgeben.php" --> <html> <head> <meta charset="iso-8859-1" /> <meta name="author" content="Beringer Alfred" /> <meta name="description" content="Programmieren mit PHP 5" /> <title>Daten von einer Datenbank lesen und ausgeben</title> </head> <body> <pre>
<?php // Pfad zum privaten Projektverzeichnis (siehe Kap.16.1.2) require_once "projektpfad.inc.php"; require_once PFAD . "ooSkripte/daoKlassen/DAOlesenDBSchueler.class.php"; require_once PFAD . "ooSkripte/daoKlassen/DAOausgebenSchueler.class.php"; // ----------------------------------------------------------------------------- // Parameter für die Auswahl einer Klasse // (zum Testen der Methode 'selSchuelerKlasse' der Einfachheit halber fix angegeben): $KLASSE = "2AKIF "; // ----------------------------------------------------------------------------- if (isset($_POST['fButEnde'])) { $i = $_POST['fHidZaehler']; if ($i == 0) { print("<p>Sie haben keine Datens&auml;tze eingegeben.</p>"); } else if ($i == 1) { print("<p>Sie haben 1 Datensatz eingegeben.</p>"); } else { print("<p>Sie haben $i Datens&auml;tze eingegeben."); } } // ***************************************************************************** $datenbank = new DAOlesenDBSchueler(); // ----------------------------------------------------------------------------- // SQL-Befehle ausführen und ausgeben (mehrere Varianten) // ------------------------------------------------------------------- print("<hr size='10' color='#000000' />"); // SELECT-Ergebnis ist ein Array von 'Schueler'-Objekten // Ausgabe mittels DAO-Klasse 'DAOausgebenSchueler' (1 Zeile pro 'Schueler'-Objekt) $ausgabedaten = new DAOausgebenSchueler(); $ergebnis = $datenbank->selAlleSchueler(); if (!$ergebnis) { print("<p>Keine Zeilen gefunden!</p>"); } else { foreach ($ergebnis as $schueler) { $ausgabedaten->setSchueler($schueler); $ausgabedaten->schreibenZeile(); } } // ------------------------------------------------------------------- print("<hr size='10' color='#000000' />"); // SELECT-Ergebnis ist ein Array von Zeichenketten // Ausgabe direkt ohne DAO-Klasse (1 Zeile pro Schüler-Zeichenkette) $ergebnis = $datenbank->selAlleSchuelerStr(); if (!$ergebnis) { print("<p>Keine Zeilen gefunden!</p>"); } else { print("<h2>Sch&uuml;lerliste</h2>"); foreach ($ergebnis as $schueler) { print("$schueler<br />"); } } // ----------------------------------------------------------------------------- print("<hr size='10' color='#000000' />"); print("<hr /><h2>Testen der Methode 'selSchuelerKlasse':</h2>"); // SELECT-Ergebnis ist ein Array von 'Schueler'-Objekten // Ausgabe zweifach: // mittels DAO-Klasse 'DAOausgebenSchueler' (1 Zeile pro 'Schueler'-Objekt) und // mittels magischer Methode __toString (1 Absatz pro 'Schueler'-Objekt) $ausgabedaten = new DAOausgebenSchueler(); $ergebnis = $datenbank->selSchuelerKlasse($KLASSE); if (empty($ergebnis)) { print("<p>Keine Zeilen gefunden!</p>"); } else { print("<h2>Sch&uuml;lerliste der Klasse $KLASSE</h2>"); foreach ($ergebnis as $schueler) { $ausgabedaten->setSchueler($schueler); $ausgabedaten->schreibenZeile(); } print("<hr size='4' color='#000000' /> <h2>Noch einmal mit magischer Methode __toString</h2>"); foreach ($ergebnis as $schueler) { print("<p>$schueler</p>"); } } // ----------------------------------------------------------------------------- // Verbindung zur Datenbank schließen $datenbank->schliessenVerbindung(); ?>
</pre> <p> </p><hr /><p> </p> <footer> <address id="ende"> Copyright &#169; 2009<br /> Letzte Aktualisierung: 2013-10-30<br /> Beringer Alfred<br /> Wögerer Wolfgang </address> </footer> </body> </html>



Weiter zu
Kapitel 16.1.2 - Projektpfad - Include-Datei "projektpfad.inc.php"
Zurück
zum Anfang dieses Kapitels
zu Kapitel 3.2.1.2 - Programm 1 (prozedural)
zu Kapitel 3.2.2.2 - Programm 2 (prozedural)
zu Kapitel 3.2.3.2 - Programm 3 (prozedural)
zu Kapitel 4.2.1.2 - Programm 1 (objektorientiert)
zu Kapitel 4.2.2.2 - Programm 2 (objektorientiert)
zu Kapitel 4.2.3.2 - Programm 3 (objektorientiert)
zu Kapitel 8.7.1 - Demo-Programm (Werte- und Referenztypen)
zu Kapitel 9.1.4 - Demo-Programm (Parameterübergabe)
zu Kapitel 14.2 - Beispiel mit Datenerfassung (Dateien, objektorientiert)
zu Kapitel 15.1.1 - SQL-Skript
zu Kapitel 15.2 - Einführende Beispiele (Datenbanken, prozedural)
zum Inhaltsverzeichnis