{"id":8201,"date":"2021-12-27T00:50:20","date_gmt":"2021-12-26T22:50:20","guid":{"rendered":"https:\/\/u-labs.de\/portal\/?p=8201"},"modified":"2022-12-12T18:22:17","modified_gmt":"2022-12-12T16:22:17","slug":"mit-php-zu-einer-mysql-datenbank-verbinden-fuer-anfaenger-erklaert","status":"publish","type":"post","link":"https:\/\/u-labs.de\/portal\/mit-php-zu-einer-mysql-datenbank-verbinden-fuer-anfaenger-erklaert\/","title":{"rendered":"Mit PHP zu einer MySQL-Datenbank verbinden f\u00fcr Anf\u00e4nger erkl\u00e4rt"},"content":{"rendered":"<p>In einem vorherigen Beitrag habe ich gezeigt, wie man Apache mit PHP und MySQL auf dem Raspberry Pi installiert. Heute m\u00f6chte ich auf den Einstieg in die Webentwicklung mit PHP eingehen: Wir verbinden uns auf die Datenbank, die wir zuvor angelegt haben.<\/p>\n<h2 class=\"wp-block-heading\">Setzen eines Passwortes<\/h2>\n<p>Die Standard-Installation von MariaDB erlaubt den Zugriff ohne Passwort \u00fcber den Linux-Nutzer root. Damit verbinden wir uns und setzen ein Passwort, welches wir sp\u00e4ter in PHP verwenden k\u00f6nnen:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nsudo mysql -u root\n\nSET PASSWORD FOR &#039;root&#039;@localhost = PASSWORD(&quot;1234&quot;);\nFLUSH PRIVILEGES;\n<\/pre>\n<\/div>\n<p>Das Passwort f\u00fcr den MySQL-Root Benutzer ist in diesem Beispiel nun auf <strong>1234 <\/strong>gesetzt. Dies ist nicht zu verwechseln mit dem gleichnamigen root-Benutzer des Linux-Betriebssystemes! MySQL hat eine eigene Benutzerverwaltung. <\/p>\n<p>Um eigene Tabellen erstellen zu k\u00f6nnen, wird eine Datenbank ben\u00f6tigt. Beispielhaft legen wir eine Namens <strong>ulabs <\/strong>an:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nCREATE DATABASE ulabs;\n<\/pre>\n<\/div>\n<p>Anschlie\u00dfend k\u00f6nnen wir die MySQL-Konsole durch die Eingabe von <strong>exit<\/strong> und der Enter-Taste verlassen. <\/p>\n<h2 class=\"wp-block-heading\">Anlegen des PHP-Skriptes zum Verbinden mit der Datenbank<\/h2>\n<p>Nun legen wir mit einem Texteditor (Nano, vim, grafisch, &#8230;) ein neues PHP-Skript im Wurzelverzeichnis des Apache-Webservers an. Ich nenne es <strong>db.php<\/strong>, der Name ist frei w\u00e4hlbar.<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nnano \/var\/www\/html\/db.php\n<\/pre>\n<\/div>\n<p>Am Anfang steht die Verbindung mit dem Datenbankserver. In unserem PHP-Skript definieren wir dazu Variablen f\u00fcr die Verbindungsdaten:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\n&lt;?php\n\n$host = &#039;localhost&#039;;\n$benutzer = &#039;root&#039;;\n$passwort = &#039;1234&#039;;\n$datenbank = &#039;ulabs&#039;;\n<\/pre>\n<\/div>\n<p>Variablen beginnen in PHP mit einem Dollarzeichen. Die Variable <strong>$host<\/strong> wird beispielsweise auf <strong>localhost<\/strong> gesetzt. <strong>Localhost <\/strong>zeigt immer auf den eigenen PC\/Server und kann verwendet werden, wenn PHP + Datenbankserver auf dem gleichen Server liegen &#8211; das ist hier bei unserem Raspberry Pi ja der Fall.<\/p>\n<p><strong>$benutzer<\/strong> und <strong>$passwort<\/strong> sind selbsterkl\u00e4rend, das Passwort haben wir zuvor auf der Konsole gesetzt. Eben so wie <strong>$datenbank<\/strong>. Das sind alle Informationen, die wir ben\u00f6tigen, um eine Verbindung zu unserer MySQL-Datenbank herzustellen:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\n$db = new mysqli($host, $benutzer, $passwort, $datenbank);\n<\/pre>\n<\/div>\n<p>Dies ist ein einfaches Beispiel f\u00fcr objektorientierte Programmierung: Die Variable <strong>$db<\/strong> erzeugt ein neues Objekt der MySQLi-Klasse. Eine Klasse kann man sich wie eine Schablone vorstellen: Sie ist allgemein gehalten, um Daten mit einer MySQL-Datenbank auszutauschen. \u00dcber die Parameter (die wir als Variablen <strong>$host, $benutzer<\/strong> etc. angeben), wird ein Objekt erstellt. Das Objekt spezifiziert die Klasse f\u00fcr eine konkrete Datenbank, in diesem Falle also die <strong>ulabs <\/strong>Datenbank.<\/p>\n<p>Bevor wir \u00fcber die Variable <strong>$db<\/strong> mit unserer Datenbank kommunizieren, pr\u00fcfen wir, ob die Verbindung funktioniert hat. Es k\u00f6nnte ja sein, dass z.B. die Datenbank nicht l\u00e4uft, die Zugangsdaten falsch sind oder andere Fehler aufgetreten sind. Mit dem Pfeil -&gt; greifen wir auf Variablen innerhalb dieser Klasse zu. Die MySQL-Klasse schreibt in <strong>connect_errno  <\/strong>eine 0, wenn die Verbindung funktioniert hat &#8211; andernfalls einen Fehlercode.<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\nif($db-&gt;connect_errno &gt; 0) {\n        die(&#039;Fehler beim Verbinden: &#039; . $db-&gt;connect_error);\n}\n<\/pre>\n<\/div>\n<p>Die Funktion <strong>die()<\/strong> beendet das PHP-Skript sofort mit der \u00fcbergebenen Meldung. In <strong>$db-&gt;connect_error<\/strong> erh\u00e4lt man eine Fehlermeldung in Textform, sodass der Fehlercode aus <strong>connect_errno<\/strong> nicht nachgeschlagen werden muss. <\/p>\n<h2 class=\"wp-block-heading\">Unsere erste MySQL-Abfrage<\/h2>\n<p>Damit ist alles bereit, um MySQL-Anfragen an den Server zu senden und das Ergebnis mit PHP zu verarbeiten.<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\n$ergebnis = $db-&gt;query(&#039;SELECT NOW() as zeit&#039;);\necho $ergebnis-&gt;num_rows . &quot; Zeilen erhalten.&lt;br \/&gt;&quot;;\n<\/pre>\n<\/div>\n<p><strong>NOW()<\/strong> ist eine MySQL-Funktion f\u00fcr den aktuellen Zeitstempel, den wir mit der Bezeichnung <strong>zeit<\/strong> vom Server holen. Wichtig zu verstehen: Die Abfrage, welche wir an die <strong>query()<\/strong> Methode \u00fcbergeben haben, wird an die Datenbank gesendet und ausgef\u00fchrt. <\/p>\n<p>Als Ergebnis erhalten wir aber noch <strong>keine<\/strong> Datens\u00e4tze, sondern erst einmal nur Meta-Informationen, die \u00fcber die Variable <strong>$ergebnis<\/strong> bereitgestellt werden. Darunter etwa die Anzahl der Zeilen in <strong>$ergebnis-&gt;num_rows<\/strong>.  In diesem Beispiel erhalten wir nat\u00fcrlich nur eine Zeile, n\u00e4mlich Datum und Uhrzeit. Wenn wir sp\u00e4ter mit Tabellen arbeiten, sind es oft mehrere Zeilen.<\/p>\n<p>Die Daten selbst m\u00fcssen wir mit einem gesonderten Aufruf abfragen. Hier gibt es verschiedene M\u00f6glichkeiten, etwa Listen. Am praktischsten finde ich Assoziatives Arrays: Wir bekommen also eine Liste, in der wir f\u00fcr jede Zeile ein Schl\u00fcssel-Wert Paar erhalten. Der Schl\u00fcssel ist der Name der Spalte oder unser Alias, in diesem Beispiel hei\u00dft der Schl\u00fcssel <strong>zeit<\/strong>. Daf\u00fcr nutzen wir die Methode<strong> fetch_assoc()<\/strong>:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\n$daten = $ergebnis-&gt;fetch_assoc();\necho &#039;&lt;p&gt;Heute haben wir &#039; . $daten&#x5B;&#039;zeit&#039;] . &#039;.&lt;\/p&gt;&#039;;\n\n\/\/ Zur Demonstration des Arrays\nvar_dump($daten);\n<\/pre>\n<\/div>\n<p>In der Variable <strong>$daten<\/strong> liegen nun die wirklichen Daten, welche wir vom MySQL-Server haben m\u00f6chten. Mit den eckigen Klammern greifen wir auf einen Schl\u00fcssel zu. Um die Struktur besser zu verstehen, ist <strong>var_dump <\/strong>hilfreich: Dies gibt uns die Variable in einem lesbaren Format aus.<\/p>\n<p>Das gesamte Skript findet ihr zum kopieren unten. Im Browser kann man nun \u00fcber den Namen oder die IP-Adresse des Raspberry Pi unser Skript (<strong>db.php<\/strong>) aufrufen. Dort sollten wir nun drei Zeilen an Ausgaben sehen:<\/p>\n<ol class=\"wp-block-list\">\n<li>Die Anzahl der Zeilen, die wir vom MySQL-Server erhalten haben. In diesem einfachen Beispiel lediglich eine einzige.<\/li>\n<li>Das Ergebnis der <strong>MySQL NOW() <\/strong>Funktion<\/li>\n<li>Die Struktur des Arrays <strong>$daten<\/strong>. Hier sehen wir, dass dort ein Schl\u00fcssel namens <strong>zeit<\/strong>, der das Ergebnis unserer <strong>NOW()<\/strong> Funktion enth\u00e4lt. Da es sich um einen formatierten, lesbaren Zeitstempel handelt, ist es eine Zeichenkette (<em>String<\/em>).<\/li>\n<\/ol>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><a href=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/12\/grafik-54.png\"><img loading=\"lazy\" decoding=\"async\" width=\"526\" height=\"266\" src=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/12\/grafik-54.png\" alt=\"\" class=\"wp-image-8203\" srcset=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/12\/grafik-54.png 526w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/12\/grafik-54-300x152.png 300w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/12\/grafik-54-70x35.png 70w\" sizes=\"auto, (max-width: 526px) 100vw, 526px\" \/><\/a><\/figure>\n<\/div>\n<h2 class=\"wp-block-heading\">Das gesamte db.php Beispielskript zum kopieren<\/h2>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\n&lt;?php\n$host = &#039;localhost&#039;;\n$benutzer = &#039;root&#039;;\n$passwort = &#039;1234&#039;;\n$datenbank = &#039;ulabs&#039;;\n\n$db = new mysqli($host, $benutzer, $passwort, $datenbank);\nif($db-&gt;connect_errno) {\n        die(&#039;Fehler beim Verbinden: &#039; . $db-&gt;connect_error);\n}\n\n$ergebnis = $db-&gt;query(&#039;SELECT NOW() as zeit&#039;);\necho $ergebnis-&gt;num_rows . &quot; Zeilen erhalten.&lt;br \/&gt;&quot;;\n\n$daten = $ergebnis-&gt;fetch_assoc();\necho &#039;&lt;p&gt;Heute haben wir &#039; . $daten&#x5B;&#039;zeit&#039;] . &#039;.&lt;\/p&gt;&#039;;\n\nvar_dump($daten);\n<\/pre>\n<\/div>\n<h2 class=\"wp-block-heading\">Ich erhalte nur eine wei\u00dfe Seite im Browser, was tun?<\/h2>\n<p>Solltest du beim Testen im Browser keinen Text sehen wie oben gezeigt, sondern nur eine leere wei\u00dfe Seite<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><a href=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/12\/grafik-55.png\"><img loading=\"lazy\" decoding=\"async\" width=\"607\" height=\"266\" src=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/12\/grafik-55.png\" alt=\"\" class=\"wp-image-8204\" srcset=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/12\/grafik-55.png 607w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/12\/grafik-55-300x131.png 300w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/12\/grafik-55-70x31.png 70w\" sizes=\"auto, (max-width: 607px) 100vw, 607px\" \/><\/a><\/figure>\n<\/div>\n<p>Dann hat sich wahrscheinlich ein Fehler in deinem PHP-Skript eingeschlichen. Standardm\u00e4\u00dfig zeigen Apache und PHP keine Fehlermeldungen an. Um die Fehlermeldung zu sehen, gibt es zwei M\u00f6glichkeiten. Die einfachste f\u00fcr Testsysteme ist, das Anzeigen von Fehlern im PHP-Skript zu aktivieren. Dazu f\u00fcgt man folgende Zeile an den Anfang des Skriptes, direkt nach dem &lt;?php Tag:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\n&lt;?php\nini_set(&#039;display_errors&#039;, 1);\n<\/pre>\n<\/div>\n<p>Im Browser erscheint (in der Standardkonfiguration von Apache2\/PHP) nun f\u00fcr die meisten Fehlertypen eine Meldung:<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><a href=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/12\/grafik-56.png\"><img loading=\"lazy\" decoding=\"async\" width=\"607\" height=\"266\" src=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/12\/grafik-56.png\" alt=\"\" class=\"wp-image-8205\" srcset=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/12\/grafik-56.png 607w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/12\/grafik-56-300x131.png 300w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/12\/grafik-56-70x31.png 70w\" sizes=\"auto, (max-width: 607px) 100vw, 607px\" \/><\/a><\/figure>\n<\/div>\n<p>Hier wurde also die Funktion <strong>query <\/strong>bei <strong>$db-&gt;query<\/strong> falsch geschrieben, mit zwei statt einem y. Alternativ kannst du im Fehlerlog von Apache nachschauen. Diesen kannst du mit <strong>tail <\/strong>\u00f6ffnen und neue Eintr\u00e4ge automatisch anzeigen lassen (folgen mit <strong>-f<\/strong>): <\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\ntail -f \/var\/log\/apache2\/error.log\n<\/pre>\n<\/div>\n<p>Ruft man anschlie\u00dfend das Skript im Browser nochmal auf (F5), schreibt PHP den Fehler in die Log-Datei und wir sehen diesen Eintrag:<\/p>\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/12\/grafik-57.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1011\" height=\"518\" src=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/12\/grafik-57.png\" alt=\"\" class=\"wp-image-8206\" srcset=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/12\/grafik-57.png 1011w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/12\/grafik-57-300x154.png 300w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/12\/grafik-57-768x393.png 768w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/12\/grafik-57-70x36.png 70w\" sizes=\"auto, (max-width: 1011px) 100vw, 1011px\" \/><\/a><\/figure>\n<h2 class=\"wp-block-heading\">Weitere Schritte<\/h2>\n<p>Damit steht nun die Basis, um mit einer MySQL-Datenbank in PHP zu arbeiten. Als n\u00e4chstes kannst du dir nun \u00fcberlegen, welche Datenstruktur du ben\u00f6tigst und daf\u00fcr Tabellen erstellen. Daf\u00fcr dann in PHP die entsprechende Logik programmieren, um die Tabellen zu f\u00fcllen bzw. auszulesen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In einem vorherigen Beitrag habe ich gezeigt, wie man Apache mit PHP und MySQL auf dem Raspberry Pi installiert. Heute m\u00f6chte ich auf den Einstieg in die Webentwicklung mit PHP eingehen: Wir verbinden uns auf die Datenbank, die wir zuvor angelegt haben. Setzen eines Passwortes Die Standard-Installation von MariaDB erlaubt den Zugriff ohne Passwort \u00fcber &#8230;<\/p>\n","protected":false},"author":5,"featured_media":8213,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[671,61],"tags":[59,339,55,58],"class_list":["post-8201","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-raspberry-pi","category-softwareentwicklung","tag-datenbank","tag-mysql","tag-php","tag-sql"],"_links":{"self":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/8201","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/comments?post=8201"}],"version-history":[{"count":8,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/8201\/revisions"}],"predecessor-version":[{"id":9796,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/8201\/revisions\/9796"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media\/8213"}],"wp:attachment":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media?parent=8201"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/categories?post=8201"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/tags?post=8201"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}