Über PHP auf Datenbank zugreifen

Als ersten müssen wir eine Verbindung schaffen zwischen unserem PHP-Programm und dem Datenbankserver. Der Datenbankserver kann auch auf einem komplett anderen Computersystem laufen, muss es aber nicht.

Der Aufbau ist immer wieder dasselbe – daher werden wir ein wiederverwendbarer Aufbau in mehreren Daten erstellen.

Daher werden wir gleich von Anfang an 2 Dateien haben:

  • index.php
  • inc/db.php
Verzeichnis vorbereiten – unsere Ordner und Dateien für die Datenbank-Anwendung
Verzeichnis vorbereiten – unsere Ordner und Dateien für die Datenbank-Anwendung

Aus Sicherheitsgründen (später kann das komplette Verzeichnis „inc“ verschoben werden – was später klar wird, wenn es um Sicherheit geht) legen wir den Datenbankaufbau in das Verzeichnis „inc“.

In der Datei „db.php“ im Verzeichnis „inc“ werden wir alle für die Datenbank relevanten Funktionen unterbringen.

Um die Datei „db.php“ in der „index.php“ nutzen zu können muss diese „dazugeladen“ werden. Dies geschieht über die require-Funktion (ist auch über die PHP-Funktion include möglich, aber wir wollen einen Programmabbruch, wenn der Dateizugriff und somit die Datenbank nicht zur Verfügung steht).

Inhalt der Datei „index.php“:

<?php
require 'inc/db.php';
?>

Inhalt der Datei „inc/db.php“:

<?php
echo date("H:i:s");
?>

Zum Testen kann nun die „index.php“ im Browser aufgerufen werden (wir machen im Browser einen neuen Reiter auf damit wir später schnell zu phpMyAdmin wechseln können).

Über die URL http://localhost:8888/adressbuch/index.php rufen wir unser Programm auf.

Kontrollausgabe – die Startdatei lädt die db.php nach
Kontrollausgabe – die Startdatei lädt die db.php nach

Es erscheint die Uhrzeit. Macht man einen Reload, ändert sich die Uhrzeit. Somit wissen wir, dass die Verbindung zwischen der „index.php“ und der „inc/db.php“ klappt.

In der Datei „inc/db.php“ werden im Folgenden dann die Zugriffsdaten für die Datenbank gespeichert.

Der Aufbau ist objekt-orientiert, da dies eine wesentlich saubere Darstellung und somit dies einfacher begreif- und lernbar wird. Die Anweisungen können auch in Prozeduralen Stil gemacht werden – in http://php.net werden immer beide Möglichkeiten bei Datenbankzugriffen gezeigt.

Im ersten Schritt müssen wir eine neue Instanz des Objekts mysqli bilden. Hört sich wilder an, wie es ist:

$db = new mysqli();

Über mysqli() können verschiedene Parameter übergeben werden, um die Verbindung zur Datenbanksystem herzustellen:

  • Server
  • Benutzername
  • Kennwort
$db = new mysqli('localhost', 'root', 'root');

Zusätzlich kann den Namen der Datenbank angegeben werden, mit der gearbeitet werden soll. Zusätzlich deshalb, da ja man mehreren verschiedenen Datenbanken gearbeitet werden kann. Das wird am Anfang definitiv nicht der Fall sein – somit geben wir unsere Datenbank an. Diese ist unserem Beispiel „adressbuch“:

$db = new mysqli('localhost', 'root', 'root', 'adressbuch');

Jetzt möchten wir natürlich wissen, ob der Verbindungsaufbau erfolgreich war oder nicht.

Wenn wir unser bisheriges Programm im Browser aufrufen, passiert nichts, außer das die Uhrzeit sich ändert.

war der Verbindungsaufbau zu Datenbank erfolgreich?
war der Verbindungsaufbau zu Datenbank erfolgreich?

Erst wenn die Datenbank z.B. nicht existiert oder ein Fehler im Benutzername oder Kennwort vorliegt, kommt eine Fehlermeldung.

Fehlermeldung der Datenbank wegen falschen Passwort
Fehlermeldung der Datenbank wegen falschen Passwort

Es kommt eine Warnung von PHP. Wichtig ist, dass es kein „fatal-error“ ist. Sprich, das Programm bricht nicht ab, was natürlich ins Chaos führen kann. Das Programm führt alle weiteren Anweisungen aus, ohne auf die Datenbank zugreifen zu können. Das ist natürlich unerwünscht!

Aus diesem Grund soll der Fehler abgefangen werden!

Im Regelfall wird in der Produktivumgebung die Fehlermeldungen ausgeschaltet werden, da diese eine Sicherheitsrisiko darstellen. In der jetzigen Fehlermeldung ist der Datenbankname sichtbar und Verzeichnisnamen und Dateinamen. Nichts, was wir der Welt eigentlich mitteilen wollen!

Also schalten wir alle Fehlermeldungen vom System aus über:

<?php
error_reporting(0);

Während der Entwicklung wird man die Fehlerberichte von PHP einschalten um nicht verwirrt zu werden, wenn nichts passiert und nichts tut und keinerlei Fehlermeldung kommt.

<?php
error_reporting(E_ALL);

Um den Fehler anzufangen (catch) müssen wir abfragen, ob die Verbindung erfolgreich war.

Hierzu gibt es die Anweisung connect_error

<?php
// error_reporting(E_ALL);
error_reporting(0);
$db = new mysqli('localhost', 'root', 'root2', 'adressbuch');
print_r ($db->connect_error);
?>
Fehlermeldung der Datenbank im Klartext über connect_error
Fehlermeldung der Datenbank im Klartext über connect_error

Das bringt uns im Klartext das Problem – für die Abfrage reicht uns die Fehlernummer. Darauf haben wir mit connect_errno Zugriff. Ist alles Ok, gibt es als Fehlernummer „0“.

Liegt ein Fehler vor, wollen wir dem Nutzer sagen, dass es gerade nicht geht. Also geben wir unserem Programm die entsprechende Ausgabe:

<?php
// error_reporting(E_ALL);
error_reporting(0);
$db = new mysqli('localhost', 'root', 'root', 'adressbuch');
print_r ($db->connect_error);

if ($db->connect_errno) {
    die('Sorry - gerade gibt es ein Problem');
}
?>
Fehlermeldung für Benutzer durch Programm
Fehlermeldung für Benutzer durch Programm

Klappt alles, dann erhalten wir den Text von index.php, der nach dem Datenbankaufbau kommt.

bei erfolgreichem Verbindungsaufbau läuft das Programm weiter
bei erfolgreichem Verbindungsaufbau läuft das Programm weiter