Mit PHP zu einer MySQL-Datenbank verbinden für Anfänger erklärt

Als Video ansehen
Bereitgestellt über YouTube

Mit PHP zu einer MySQL-Datenbank verbinden für Anfänger erklärt

In einem vorherigen Beitrag habe ich gezeigt, wie man Apache mit PHP und MySQL auf dem Raspberry Pi installiert. Heute möchte 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 über den Linux-Nutzer root. Damit verbinden wir uns und setzen ein Passwort, welches wir später in PHP verwenden können:

sudo mysql -u root

SET PASSWORD FOR 'root'@localhost = PASSWORD("1234");
FLUSH PRIVILEGES;

Das Passwort für den MySQL-Root Benutzer ist in diesem Beispiel nun auf 1234 gesetzt. Dies ist nicht zu verwechseln mit dem gleichnamigen root-Benutzer des Linux-Betriebssystemes! MySQL hat eine eigene Benutzerverwaltung.

Um eigene Tabellen erstellen zu können, wird eine Datenbank benötigt. Beispielhaft legen wir eine Namens ulabs an:

CREATE DATABASE ulabs;

Anschließend können wir die MySQL-Konsole durch die Eingabe von exit und der Enter-Taste verlassen.

Anlegen des PHP-Skriptes zum Verbinden mit der Datenbank

Nun legen wir mit einem Texteditor (Nano, vim, grafisch, …) ein neues PHP-Skript im Wurzelverzeichnis des Apache-Webservers an. Ich nenne es db.php, der Name ist frei wählbar.

nano /var/www/html/db.php

Am Anfang steht die Verbindung mit dem Datenbankserver. In unserem PHP-Skript definieren wir dazu Variablen für die Verbindungsdaten:

<?php

$host = 'localhost';
$benutzer = 'root';
$passwort = '1234';
$datenbank = 'ulabs';

Variablen beginnen in PHP mit einem Dollarzeichen. Die Variable $host wird beispielsweise auf localhost gesetzt. Localhost zeigt immer auf den eigenen PC/Server und kann verwendet werden, wenn PHP + Datenbankserver auf dem gleichen Server liegen – das ist hier bei unserem Raspberry Pi ja der Fall.

$benutzer und $passwort sind selbsterklärend, das Passwort haben wir zuvor auf der Konsole gesetzt. Eben so wie $datenbank. Das sind alle Informationen, die wir benötigen, um eine Verbindung zu unserer MySQL-Datenbank herzustellen:

$db = new mysqli($host, $benutzer, $passwort, $datenbank);

Dies ist ein einfaches Beispiel für objektorientierte Programmierung: Die Variable $db 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. Über die Parameter (die wir als Variablen $host, $benutzer etc. angeben), wird ein Objekt erstellt. Das Objekt spezifiziert die Klasse für eine konkrete Datenbank, in diesem Falle also die ulabs Datenbank.

Bevor wir über die Variable $db mit unserer Datenbank kommunizieren, prüfen wir, ob die Verbindung funktioniert hat. Es könnte ja sein, dass z.B. die Datenbank nicht läuft, die Zugangsdaten falsch sind oder andere Fehler aufgetreten sind. Mit dem Pfeil -> greifen wir auf Variablen innerhalb dieser Klasse zu. Die MySQL-Klasse schreibt in connect_errno eine 0, wenn die Verbindung funktioniert hat – andernfalls einen Fehlercode.

if($db->connect_errno > 0) {
        die('Fehler beim Verbinden: ' . $db->connect_error);
}

Die Funktion die() beendet das PHP-Skript sofort mit der übergebenen Meldung. In $db->connect_error erhält man eine Fehlermeldung in Textform, sodass der Fehlercode aus connect_errno nicht nachgeschlagen werden muss.

Unsere erste MySQL-Abfrage

Damit ist alles bereit, um MySQL-Anfragen an den Server zu senden und das Ergebnis mit PHP zu verarbeiten.

$ergebnis = $db->query('SELECT NOW() as zeit');
echo $ergebnis->num_rows . " Zeilen erhalten.<br />";

NOW() ist eine MySQL-Funktion für den aktuellen Zeitstempel, den wir mit der Bezeichnung zeit vom Server holen. Wichtig zu verstehen: Die Abfrage, welche wir an die query() Methode übergeben haben, wird an die Datenbank gesendet und ausgeführt.

Als Ergebnis erhalten wir aber noch keine Datensätze, sondern erst einmal nur Meta-Informationen, die über die Variable $ergebnis bereitgestellt werden. Darunter etwa die Anzahl der Zeilen in $ergebnis->num_rows. In diesem Beispiel erhalten wir natürlich nur eine Zeile, nämlich Datum und Uhrzeit. Wenn wir später mit Tabellen arbeiten, sind es oft mehrere Zeilen.

Die Daten selbst müssen wir mit einem gesonderten Aufruf abfragen. Hier gibt es verschiedene Möglichkeiten, etwa Listen. Am praktischsten finde ich Assoziatives Arrays: Wir bekommen also eine Liste, in der wir für jede Zeile ein Schlüssel-Wert Paar erhalten. Der Schlüssel ist der Name der Spalte oder unser Alias, in diesem Beispiel heißt der Schlüssel zeit. Dafür nutzen wir die Methode fetch_assoc():

$daten = $ergebnis->fetch_assoc();
echo '<p>Heute haben wir ' . $daten['zeit'] . '.</p>';

// Zur Demonstration des Arrays
var_dump($daten);

In der Variable $daten liegen nun die wirklichen Daten, welche wir vom MySQL-Server haben möchten. Mit den eckigen Klammern greifen wir auf einen Schlüssel zu. Um die Struktur besser zu verstehen, ist var_dump hilfreich: Dies gibt uns die Variable in einem lesbaren Format aus.

Das gesamte Skript findet ihr zum kopieren unten. Im Browser kann man nun über den Namen oder die IP-Adresse des Raspberry Pi unser Skript (db.php) aufrufen. Dort sollten wir nun drei Zeilen an Ausgaben sehen:

  1. Die Anzahl der Zeilen, die wir vom MySQL-Server erhalten haben. In diesem einfachen Beispiel lediglich eine einzige.
  2. Das Ergebnis der MySQL NOW() Funktion
  3. Die Struktur des Arrays $daten. Hier sehen wir, dass dort ein Schlüssel namens zeit, der das Ergebnis unserer NOW() Funktion enthält. Da es sich um einen formatierten, lesbaren Zeitstempel handelt, ist es eine Zeichenkette (String).

Das gesamte db.php Beispielskript zum kopieren

<?php
$host = 'localhost';
$benutzer = 'root';
$passwort = '1234';
$datenbank = 'ulabs';

$db = new mysqli($host, $benutzer, $passwort, $datenbank);
if($db->connect_errno) {
        die('Fehler beim Verbinden: ' . $db->connect_error);
}

$ergebnis = $db->query('SELECT NOW() as zeit');
echo $ergebnis->num_rows . " Zeilen erhalten.<br />";

$daten = $ergebnis->fetch_assoc();
echo '<p>Heute haben wir ' . $daten['zeit'] . '.</p>';

var_dump($daten);

Ich erhalte nur eine weiße Seite im Browser, was tun?

Solltest du beim Testen im Browser keinen Text sehen wie oben gezeigt, sondern nur eine leere weiße Seite

Dann hat sich wahrscheinlich ein Fehler in deinem PHP-Skript eingeschlichen. Standardmäßig zeigen Apache und PHP keine Fehlermeldungen an. Um die Fehlermeldung zu sehen, gibt es zwei Möglichkeiten. Die einfachste für Testsysteme ist, das Anzeigen von Fehlern im PHP-Skript zu aktivieren. Dazu fügt man folgende Zeile an den Anfang des Skriptes, direkt nach dem <?php Tag:

<?php
ini_set('display_errors', 1);

Im Browser erscheint (in der Standardkonfiguration von Apache2/PHP) nun für die meisten Fehlertypen eine Meldung:

Hier wurde also die Funktion query bei $db->query falsch geschrieben, mit zwei statt einem y. Alternativ kannst du im Fehlerlog von Apache nachschauen. Diesen kannst du mit tail öffnen und neue Einträge automatisch anzeigen lassen (folgen mit -f):

tail -f /var/log/apache2/error.log

Ruft man anschließend das Skript im Browser nochmal auf (F5), schreibt PHP den Fehler in die Log-Datei und wir sehen diesen Eintrag:

Weitere Schritte

Damit steht nun die Basis, um mit einer MySQL-Datenbank in PHP zu arbeiten. Als nächstes kannst du dir nun überlegen, welche Datenstruktur du benötigst und dafür Tabellen erstellen. Dafür dann in PHP die entsprechende Logik programmieren, um die Tabellen zu füllen bzw. auszulesen.

Leave a Reply