{"id":21,"date":"2018-08-26T14:42:13","date_gmt":"2018-08-26T14:42:13","guid":{"rendered":"https:\/\/math-brownies.de\/?p=21"},"modified":"2018-09-08T21:44:42","modified_gmt":"2018-09-08T21:44:42","slug":"eine-tabelle-abrufen-datenbank","status":"publish","type":"post","link":"https:\/\/math-brownies.de\/index.php\/2018\/08\/26\/eine-tabelle-abrufen-datenbank\/","title":{"rendered":"Eine Tabelle abrufen (Datenbank)"},"content":{"rendered":"<h5>Abruf von Daten aus einer Tabelle (ohne die Relationstabellen mit zu beachten)<\/h5>\n<div>\n<table>\n<thead>\n<tr>\n<th style=\"width: 40%;\" scope=\"col\">Code<\/th>\n<th style=\"width: 40%;\" scope=\"col\">Erkl\u00e4rung<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"width: 40%;\">&lt;!DOCTYPE html&gt;<br \/>\n&lt;html&gt;<br \/>\n&lt;head&gt;<br \/>\n&lt;meta charset=&#8220;utf-8&#8243;&gt;<br \/>\n&lt;title&gt;Ausgabe&lt;\/title&gt;<br \/>\n&lt;link rel=&#8220;stylesheet&#8220; type=&#8220;text\/css&#8220; href=&#8220;DataTables-1.10.18\/css\/jquery.dataTables.min.css&#8220;\/&gt;&lt;script type=&#8220;text\/javascript&#8220; src=&#8220;jQuery-3.3.1\/jquery-3.3.1.min.js&#8220;&gt;&lt;\/script&gt;<br \/>\n&lt;script type=&#8220;text\/javascript&#8220; src=&#8220;DataTables-1.10.18\/js\/jquery.dataTables.min.js&#8220;&gt;&lt;\/script&gt;<br \/>\n&lt;script type=&#8220;text\/javascript&#8220;&gt;<br \/>\n$(document).ready( function () {<br \/>\n$(&#8218;#ausgabetab&#8216;).DataTable({<br \/>\npaging: true,<\/p>\n<p>});<br \/>\n} );<br \/>\n&lt;\/script&gt;<br \/>\n&lt;\/head&gt;<\/td>\n<td style=\"color: #008000; width: 40%;\">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\u00e4ter die Tabelle sch\u00f6n formatieren und durchsuchbar machen. (Das habe ich nicht selbst geschrieben, sondern <a href=\"https:\/\/datatables.net\/\" target=\"_blank\" rel=\"noreferrer noopener\">aus dem Netz genommen.<\/a>)<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 40%;\">&lt;body&gt;<br \/>\n&lt;h1&gt; Ern\u00e4hrungstagebuch&lt;\/h1&gt;<br \/>\n&lt;?phperror_reporting ( E_ALL &amp; ~ E_NOTICE );<br \/>\nini_set ( &#8218;display_errors&#8216;, &#8218;1&#8216; );<\/p>\n<p>$host = &#8218;localhost&#8216;;<br \/>\n$user = &#8218;blafa&#8216;;<br \/>\n$pass = &#8218;blafa;<br \/>\n$name = &#8218;blafa&#8216;;<br \/>\n$charset = &#8218;utf8&#8216;;<\/td>\n<td style=\"color: #008000; width: 40%;\">Im Body-Element des html-Dokumentes rufe ich dann php auf. Es wird eine Funktion aufgerufen, die alle Fehler logt &#8211; die ist zum Gebrauch der Seite unn\u00f6tig, aber hilft bei der Fehlersuche, wenn etwas nicht klappt.<br \/>\nZun\u00e4chst definiere ich einige Variablen, die ich im weiteren brauchen werde. (Nat\u00fcrlich mit den echten Werten, nicht nur blafa.)<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 40%;\">$dsn = sprintf ( &#8218;mysql:host=%s;dbname=%s;charset=%s&#8216;, $host, $name, $charset );<br \/>\ntry {<\/td>\n<td style=\"color: #008000; width: 40%;\">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\u00fcbsch formatierter String ist.\u00a0 F\u00fcr das erste %s\u00a0 wird der erste Parameter als String eingesetzt, f\u00fcr das zweite der zweite\u00a0 usw. &#8211; wenn in den Variablen nicht sauber strings (ich also oben Bl\u00f6dsinn getippt habe) stehen, gibt es einen Fehler.<br \/>\nAnschlie\u00dfend wird eine langes try gestartet. (Es endet unten, beim catch. Ich versuche also was, und wenn es nicht klappt, greift die catch-Funktion.)<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 40%;\">\u00a0$pdo = new PDO ( $dsn, $user, $pass, [<br \/>\nPDO::ATTR_ERRMODE =&gt; PDO::ERRMODE_EXCEPTION<br \/>\n] );<\/td>\n<td style=\"color: #008000; width: 40%;\">Zun\u00e4chst weise ich der Variable pdo ein neues Objekt vom Typ pdo zu. (Es ist quasi so, als ob ich mir einen bestimmten Sch\u00fcler mit einigen Eigenschaften schaffe, der nun einen Tisch in meinem Speicher-Klassenraum belegt und Dinge erledigen kann.)<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 40%;\">\u00a0$query = &#8218;SELECT * FROM ernaehrungstagebuch&#8216;;<br \/>\n$statement = $pdo-&gt;prepare ( $query );<br \/>\nif (! $statement-&gt;execute ()) {<br \/>\n}<\/td>\n<td style=\"color: #008000; width: 40%;\">Nun wird die Variable query gef\u00fcllt mit einem Datenbankbefehl &#8211; rufe alles (*) aus der Tabelle &#8222;ernaehrungstagebuch&#8220; ab. Die Variable statement bekommt den Wert der Funktionsausf\u00fchrung prepare, die dabei die Variabele query nutzt. Wenn der Befehl also funktioniert, ist wird statement-execute funktionieren und die if-Abfrage auf true gesetzt &#8211; hat die Datenbankabfrage nicht funktioniert, ist die Abfrage false. Das ! negiert den Wert der Abfrage &#8211; also im Fehlerfalle von false auf true. Die if-Abfrage kann noch gef\u00fcllt werden, um dann Fehlermeldungen auszuwerfen. Jetzt ist sie leer.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 40%;\">.\u00a0\u00a0\u00a0 echo &#8222;&lt;table id=&#8217;ausgabetab&#8216; class=&#8217;cell-border compact stripe&#8216;&gt;&#8220;;<br \/>\necho &#8222;&lt;thead&gt;&lt;tr&gt;<br \/>\n&lt;th&gt;Zeit&lt;\/th&gt;<br \/>\n&lt;th&gt;Ort&lt;\/th&gt;<br \/>\n&lt;th&gt;Mahlzeit&lt;\/th&gt;<br \/>\n&lt;th&gt;Besonderheiten&lt;\/th&gt;<br \/>\n&lt;\/tr&gt;&lt;\/thead&gt;&#8220;;<br \/>\nwhile ( $row = $statement-&gt;fetch ( PDO::FETCH_ASSOC ) ) {<br \/>\necho &#8222;&lt;tr&gt;&#8220;;<br \/>\necho &#8222;&lt;td&gt;&#8220;;<br \/>\necho $row [&#8218;time&#8216;];<br \/>\necho &#8222;&lt;\/td&gt;&#8220;;<br \/>\necho &#8222;&lt;td&gt;&#8220;;<br \/>\necho $row [&#8218;place&#8216;];<br \/>\necho &#8222;&lt;\/td&gt;&#8220;;<br \/>\necho &#8222;&lt;td&gt;&#8220;;<br \/>\necho $row [&#8218;meal&#8216;];<br \/>\necho &#8222;&lt;\/td&gt;&#8220;;<br \/>\necho &#8222;&lt;td&gt;&#8220;;<br \/>\necho $row [&#8217;special&#8216;];<br \/>\necho &#8222;&lt;\/td&gt;&#8220;;<br \/>\necho &#8222;&lt;\/tr&gt;&#8220;;<br \/>\n}<br \/>\necho &#8222;&lt;\/table&gt;&#8220;;<br \/>\n} catch ( PDOException $e ) {<br \/>\nvar_dump ( $e );<br \/>\n}<br \/>\n?&gt;<br \/>\n&lt;\/body&gt;<br \/>\n&lt;\/html&gt;<\/td>\n<td style=\"color: #008000; width: 40%;\">Ist der if-Fall nicht eingetreten, hat die Datenbankabfrage also funktioniert, baue ich mir nun zun\u00e4chst den Kopf meiner Tabelle. Man h\u00e4tte das auch in einem einzigen echo-Befehl tun k\u00f6nnen, aber so ist es sauberer zum nachlesen.<br \/>\nAnschlie\u00dfend 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\u00e4mlich ein array, und mit $row[name] rufe ich den entsprechend benannten Teil des arrays auf. Der letzte echo-Befehl schlie\u00dft die Tabelle.Anschlie\u00dfend folgt die schlie\u00dfende Klammer vom try und ein catch-Befehl, der f\u00fcr den Fall, dass der try-Befehl fehlschl\u00e4gt, eine Fehlermeldung protokolliert. Mit dem dort eingeschriebenen var_dump-Befehl lasse ich mir die Fehlermeldung im Brwoser anzeigen &#8211; das w\u00fcrde man im normalen Betrieb nicht machen, ist aber gut zur Fehlersuche und zum debuggen.<\/p>\n<p>Dann schlie\u00dfe ich den php-Block mit ?&gt; und beende dann noch sauber das html-Dokument.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<div><\/div>\n<div>Ich bin mir bei diesem Code noch unsicher mit den Teilen &#8222;PDO::ATTR_ERRMODE =&gt; PDO::ERRMODE_EXCEPTION&#8220; und &#8222;while ( $row = $statement-&gt;fetch ( PDO::FETCH_ASSOC )&#8220;. Die reinen pdo-Befehle interessieren mich dabei gerade noch nicht so. (pdo ist die abstrahierte Sprache f\u00fcr 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\u00e4ngt vom Projekt ab &#8211; ich interessiere mich gerade mehr f\u00fcr objektorientiertes Programmieren, weil ich das nicht kann.)<\/div>\n<div><\/div>\n<div>Ich w\u00fcrde gerne die while-Schleife und ihre Syntax genauer verstehen und wissen, was der -&gt; 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\/<\/div>\n<div><\/div>\n<div>Das w\u00fcrde auch noch mehr Verst\u00e4ndnis f\u00fcr 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.<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Abruf von Daten aus einer Tabelle (ohne die Relationstabellen mit zu beachten) Code Erkl\u00e4rung &lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;meta charset=&#8220;utf-8&#8243;&gt; &lt;title&gt;Ausgabe&lt;\/title&gt; &lt;link rel=&#8220;stylesheet&#8220; type=&#8220;text\/css&#8220; href=&#8220;DataTables-1.10.18\/css\/jquery.dataTables.min.css&#8220;\/&gt;&lt;script type=&#8220;text\/javascript&#8220; src=&#8220;jQuery-3.3.1\/jquery-3.3.1.min.js&#8220;&gt;&lt;\/script&gt; &lt;script type=&#8220;text\/javascript&#8220; src=&#8220;DataTables-1.10.18\/js\/jquery.dataTables.min.js&#8220;&gt;&lt;\/script&gt; &lt;script type=&#8220;text\/javascript&#8220;&gt; $(document).ready( function () { $(&#8218;#ausgabetab&#8216;).DataTable({ paging: true, }); } ); &lt;\/script&gt; &lt;\/head&gt; Ich beginne mit einem html-Dokument. Es wird das Zeichset gesetzt und [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"default","ast-site-content-layout":"","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[4,3],"tags":[],"class_list":["post-21","post","type-post","status-publish","format-standard","hentry","category-datenbanken","category-informatik"],"_links":{"self":[{"href":"https:\/\/math-brownies.de\/index.php\/wp-json\/wp\/v2\/posts\/21","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/math-brownies.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/math-brownies.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/math-brownies.de\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/math-brownies.de\/index.php\/wp-json\/wp\/v2\/comments?post=21"}],"version-history":[{"count":2,"href":"https:\/\/math-brownies.de\/index.php\/wp-json\/wp\/v2\/posts\/21\/revisions"}],"predecessor-version":[{"id":67,"href":"https:\/\/math-brownies.de\/index.php\/wp-json\/wp\/v2\/posts\/21\/revisions\/67"}],"wp:attachment":[{"href":"https:\/\/math-brownies.de\/index.php\/wp-json\/wp\/v2\/media?parent=21"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/math-brownies.de\/index.php\/wp-json\/wp\/v2\/categories?post=21"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/math-brownies.de\/index.php\/wp-json\/wp\/v2\/tags?post=21"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}