Abruf von Daten aus einer Tabelle (ohne die Relationstabellen mit zu beachten)
Code | Erklärung |
---|---|
<!DOCTYPE html> <html> <head> <meta charset=“utf-8″> <title>Ausgabe</title> <link rel=“stylesheet“ type=“text/css“ href=“DataTables-1.10.18/css/jquery.dataTables.min.css“/><script type=“text/javascript“ src=“jQuery-3.3.1/jquery-3.3.1.min.js“></script> <script type=“text/javascript“ src=“DataTables-1.10.18/js/jquery.dataTables.min.js“></script> <script type=“text/javascript“> $(document).ready( function () { $(‚#ausgabetab‘).DataTable({ paging: true, }); |
Ich beginne mit einem html-Dokument. Es wird das Zeichset gesetzt und ein Titel gegeben. Dann binde ich ein Sytlesheet und zwei Java-Scripte ein, die später die Tabelle schön formatieren und durchsuchbar machen. (Das habe ich nicht selbst geschrieben, sondern aus dem Netz genommen.) |
<body> <h1> Ernährungstagebuch</h1> <?phperror_reporting ( E_ALL & ~ E_NOTICE ); ini_set ( ‚display_errors‘, ‚1‘ ); $host = ‚localhost‘; |
Im Body-Element des html-Dokumentes rufe ich dann php auf. Es wird eine Funktion aufgerufen, die alle Fehler logt – die ist zum Gebrauch der Seite unnötig, aber hilft bei der Fehlersuche, wenn etwas nicht klappt. Zunächst definiere ich einige Variablen, die ich im weiteren brauchen werde. (Natürlich mit den echten Werten, nicht nur blafa.) |
$dsn = sprintf ( ‚mysql:host=%s;dbname=%s;charset=%s‘, $host, $name, $charset ); try { |
Jetzt wird die Variable dsn gesetzt. Der Befehl sprintf gibt einen formatierten String aus. Es setzt die Variablen korrekt in den String ein und stellt so sicher, dass es ein hübsch formatierter String ist. Für das erste %s wird der erste Parameter als String eingesetzt, für das zweite der zweite usw. – wenn in den Variablen nicht sauber strings (ich also oben Blödsinn getippt habe) stehen, gibt es einen Fehler. Anschließend wird eine langes try gestartet. (Es endet unten, beim catch. Ich versuche also was, und wenn es nicht klappt, greift die catch-Funktion.) |
$pdo = new PDO ( $dsn, $user, $pass, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ] ); |
Zunächst weise ich der Variable pdo ein neues Objekt vom Typ pdo zu. (Es ist quasi so, als ob ich mir einen bestimmten Schüler mit einigen Eigenschaften schaffe, der nun einen Tisch in meinem Speicher-Klassenraum belegt und Dinge erledigen kann.) |
$query = ‚SELECT * FROM ernaehrungstagebuch‘; $statement = $pdo->prepare ( $query ); if (! $statement->execute ()) { } |
Nun wird die Variable query gefüllt mit einem Datenbankbefehl – rufe alles (*) aus der Tabelle „ernaehrungstagebuch“ ab. Die Variable statement bekommt den Wert der Funktionsausführung prepare, die dabei die Variabele query nutzt. Wenn der Befehl also funktioniert, ist wird statement-execute funktionieren und die if-Abfrage auf true gesetzt – hat die Datenbankabfrage nicht funktioniert, ist die Abfrage false. Das ! negiert den Wert der Abfrage – also im Fehlerfalle von false auf true. Die if-Abfrage kann noch gefüllt werden, um dann Fehlermeldungen auszuwerfen. Jetzt ist sie leer. |
. echo „<table id=’ausgabetab‘ class=’cell-border compact stripe‘>“; echo „<thead><tr> <th>Zeit</th> <th>Ort</th> <th>Mahlzeit</th> <th>Besonderheiten</th> </tr></thead>“; while ( $row = $statement->fetch ( PDO::FETCH_ASSOC ) ) { echo „<tr>“; echo „<td>“; echo $row [‚time‘]; echo „</td>“; echo „<td>“; echo $row [‚place‘]; echo „</td>“; echo „<td>“; echo $row [‚meal‘]; echo „</td>“; echo „<td>“; echo $row [’special‘]; echo „</td>“; echo „</tr>“; } echo „</table>“; } catch ( PDOException $e ) { var_dump ( $e ); } ?> </body> </html> |
Ist der if-Fall nicht eingetreten, hat die Datenbankabfrage also funktioniert, baue ich mir nun zunächst den Kopf meiner Tabelle. Man hätte das auch in einem einzigen echo-Befehl tun können, aber so ist es sauberer zum nachlesen. Anschließend starte ich eine while-Schleife, die so oft durchlaufen wird, wie Zeilen in der Tabelle sind, und der die Inhalte jeder Zeile abruft. In jedem Durchlauf erzeuge ich dann mit echo-Befehlen die Zeile und Spalten der Tabelle und schreibe in die Spalten den Inhalt der jeweiligen Datenbankspalte. Die Variable row ist nämlich ein array, und mit $row[name] rufe ich den entsprechend benannten Teil des arrays auf. Der letzte echo-Befehl schließt die Tabelle.Anschließend folgt die schließende Klammer vom try und ein catch-Befehl, der für den Fall, dass der try-Befehl fehlschlägt, eine Fehlermeldung protokolliert. Mit dem dort eingeschriebenen var_dump-Befehl lasse ich mir die Fehlermeldung im Brwoser anzeigen – das würde man im normalen Betrieb nicht machen, ist aber gut zur Fehlersuche und zum debuggen. Dann schließe ich den php-Block mit ?> und beende dann noch sauber das html-Dokument. |
Ich bin mir bei diesem Code noch unsicher mit den Teilen „PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION“ und „while ( $row = $statement->fetch ( PDO::FETCH_ASSOC )“. Die reinen pdo-Befehle interessieren mich dabei gerade noch nicht so. (pdo ist die abstrahierte Sprache für den Zugriff auf php-basierte Datenbanken, die ich nutze. Es stellt eine objektorientierten Zugang zur Datenbank dar, im Gegensatz zu MYSQLi, das prozedural ist. Welche der beiden Zugriffssprachen man nutzt, hängt vom Projekt ab – ich interessiere mich gerade mehr für objektorientiertes Programmieren, weil ich das nicht kann.)
Ich würde gerne die while-Schleife und ihre Syntax genauer verstehen und wissen, was der -> und das = in php bewirken. Die Sache mit der if-Schleife ist auch noch unklar. Ich habe folgende Seite dazu gefunden: http://kushellig.de/prepared-statements-php-data-objects-pdo/
Das würde auch noch mehr Verständnis für die Sache mit dem query hervorrufen, vermute ich. Auch da bin ich noch unsicher, vermute aber, dass ich diesen Bereich mit den Datenbankbefehlen besser verstehen werde, wenn ich die weiteren Tabellen mit in die Ausgabe einbinden oder nachher das Eingabe-Formular erstelle.