Verbindungsaufbau zur Datenbank

Jetzt kommen wir zum ersten Einsatz von PHP und dem einbinden der Datenbank in unserer Web-App-Anwendung.

Dazu benötigen wir die Zugangsdaten von unserem Offline-Server und dem Online-Server. Für die Zugangsdaten sind 4 Daten notwendig:

  • Server-URL
  • Benutzername
  • Benutzerkennwort
  • Datenbankname

Offline ist das kein größeres Thema, wenn wir eine Standard-Installation haben. Dann wird der Server i.d.R. „localhost“ sich nennen. Der Benutzername ist „root“. Das Benutzerkennwort ist entweder auch „root“ oder einfach keines – das ist abhängig von der Installation (Unterschiede gibt es bei der Version und Windows und Mac sind da leicht unterschiedlich). Einfach testen!

Unserer Datenbank haben wir „musiker“ genannt.

Wollen wir die Daten „online“ erhalten, müssen wir diese von unserem Provider in dessen Verwaltungsoberfläche abfragen bzw. wird beim Anlegen der MySQL-Datenbank und Tabelle diese Zugangsdaten angezeigt bzw. das Kennwort kann von Ihnen vergeben werden. Daher können die folgenden Online-Beispieldaten auch nur Beispieldaten sein!

Für den Verbindungsaufbau sieht in PHP dann der Code wie folgt aus:

// Offline
$db = new mysqli('localhost', 'root', 'root', 'musiker');

Und in der Online-Variante (wie oben gesagt beispielhaft):

// Online
$db = new mysqli('axel.mobi', 'abc5555we', 'kennwortgeheim', 'dbname'); 

Jetzt ist natürlich die Frage, wie wir am besten beide Server-Zugänge in unserem PHP-Code integrieren. Wie benötigen beide, da wir unsere Anwendung Offline entwickeln und offline testen wollen und beim hochladen nicht mehr daran denken wollen, die Zugangsdaten für Online zu aktiveren.

Dazu gibt es einen einfachen Kniff. Wir fragen über PHP ab, wo gerade unserer PHP-Programm ausgeführt wird. In der $_SERVER-Variablen mit „SERVER_NAME“ steht bei Offline-Nutzung dann „localhost“.

Über eine einfach IF-Abfrage können wir somit beide Zugangsdaten in unserem PHP-Programm hinterlegen:

if ( $_SERVER['SERVER_NAME'] == 'localhost' )
{
    // Offline
    $db = new mysqli('localhost', 'root', 'root', 'musiker');
}
else
{
    // Online
    $db = new mysqli('axel.mobi', 'abc5555we', 'kennwortgeheim', 'dbname');
}

Jetzt haben wir fast schon alle wichtigen Daten für unsere PHP-Programm mit dem Verbindungsaufbau zur Datenbank.

Diese speichern wir in der Datei „db.php“ ab.

Um Probleme auf einem Server zu umgehen, ist es ratsam unsere verwendete Zeitzone über date_default_timezone_set festlegen. Wir sollten auf jeden Fall noch in unserer Verbindungsaufbaudatei hinterlegen, dass wir auch für Datenbankzugriffe UTF8 verwenden wollen. Dies geschieht über set_charset:

date_default_timezone_set('Europe/Berlin');
if ( $_SERVER['SERVER_NAME'] == 'localhost' )
{
    // Offline
    $db = new mysqli('localhost', 'root', 'root', 'musiker');
}
else
{
    // Online
    $db = new mysqli('axel.mobi', 'abc5555we', 'kennwortgeheim', 'dbname');
}
$db->set_charset('utf8');

Und nun sollten wir noch einen Plan B haben, falls es ein Problem mit dem Datenbankserver gibt und dieser gerade aus welchen Gründen auch immer nicht erreichbar ist und keine Daten liefern kann. Und dieser Plan B sieht so aus, dass unser Programm lieber abbricht (stirbt = „die“) als unkontrolliert Chaos macht. Über die Anweisung „connect_errno“ erhalten wir eine Fehlernummer zurückgeliefert, wenn es ein Problem geben sollte. Somit können wir wieder eine if-Anweisung erstellen, die unser Programm beendet, wenn es Probleme mit dem Datenbankaufbau geben sollte.

$db->set_charset('utf8');
if ($db->connect_errno){
    die('Sorry - gerade gibt es ein Problem');
}

Hier kann innerhalb der Bedingung vor dem Abbruch auch noch eine Mail an einen selber geschrieben werden, damit man als Betreiber von Problemen auch mitbekommt. Im obigen Beispiel halten wir es noch einfach. Ansonsten einfach im Kapitel „mail“ nachschlagen, wie man eine E-Mail mit PHP erstellt.

Während der Entwicklung wollen wir von PHP auch alle Fehler und Hinweise erhalten. Daher macht es Sinn am Anfang unseres PHP-Programmes die Anweisung „error_reporting(E_ALL);“ zu bringen. Somit bekommen wir alle Hinweise. Denn je nach Einstellung des Servers können auch Fehler bzw. Warnungen bereits unterdrückt sein. Daher ist diese Zeile für die Offline-Version sinnvoll.

Unser bisher kompletter Code für die Datei „db.php“:

<?php
error_reporting(E_ALL);
date_default_timezone_set('Europe/Berlin');
if ( $_SERVER['SERVER_NAME'] == 'localhost' )
{
    // Offline
    $db = new mysqli('localhost', 'root', 'root', 'musiker');
}
else
{
    // Online
    $db = new mysqli('axel.mobi', 'abc5555we', 'kennwortgeheim', 'dbname');
}
$db->set_charset('utf8');
if ($db->connect_errno){
    die('Sorry - gerade gibt es ein Problem');
}
?>

Und nun kommt die magische Frage, wo soll denn diese Datei mit den vertraulichen MySqlServer-Zugriffdaten eigentlich gespeichert werden? Macht es Sinn, diese im Hauptverzeichnis oder in einem Unterverzeichnis zu speichern?

Pfade auf dem Webserver
Pfade auf dem Webserver

Beim ersten Nachdenken würde man sagen, dass die Datei selbst bei Kenntnis des Dateinamens einem böswilligen Besucher wenig bringt. Er könnte zwar die Datei ausführen über www.example.com/db.php - hätte aber keinerlei Feedback.

Zugriff in das Verzeichnis über die URL
Zugriff in das Verzeichnis über die URL

Läge die Datei „db.php“ nun in unserem Hauptverzeichnis, in dem auch unsere „index.php“ liegt, könnten wir von der „index.php“ über ein „require_once“ die Datei einbinden:

require_once('db.php');

ABER – hat der Server ein Problem und der Bereich für das Ausführen von PHP-Programmen hat einen „Schluckauf“ und führt womöglich PHP-Programme nicht mehr aus, sondern zeigt diese in Klartext an, wäre dies natürlich fatal. Die Zugangsdaten von unserem MySQL-Server dürfen auf keinen Fall nach außen dringen. Daher packen wir die Datei auf dem Server in ein Verzeichnis außerhalb der Zugriffsmöglichkeit der URL. Das geht und PHP kann weiterhin darauf zugreifen!

Pfad außerhalb des URL-Zugriffs aus Sicherheitsgründen
Pfad außerhalb des URL-Zugriffs aus Sicherheitsgründen

Wir speichern also unsere Datei „db.php“ im Verzeichnis unterhalb dem Verzeichnis, in dem unsere „index.php“ steckt.

Über PHP müssen wir nun einfach im Verzeichnis eine Ebene absteigen über 2 Punkte in der Pfadangabe:

<?php
require_once('../db.php');
?>
<h1>Datenbank Beispielaufbau</h1>

Das zu den kleinen Kniffen, die das Programmiererleben sicherer machen.