Archiv für Februar 2010

PHP: Verbindung zur MySQL-Datenbank (Tutorial)

Die Umsetzung eines größeren Projektes mit PHP macht es sehr oft notwendig, dass Benutzerdaten in einer Datenbank auf dem Server hinterlegt werden müssen. Das betrifft in der Regel die Daten, die man bei einer Registrierung als Nutzer hinterlegen muss, also etwa den Anmeldenamen und das dazu gehörige Passwort. Nur damit ist es möglich, eine authentifizierte Anmeldung zu realisieren und unbefugten Dritten den Zugriff zu verweigern. Während des Logins werden die in der Datenbank gespeicherten Daten mit den vom Benutzer im Login-Formular eingegebenen Daten verglichen. Sind beide Datensätze gleich, so ist der Nutzer eingeloggt.

Um die Datenspeicherung effizient und zeitnah zu realisieren und beim Vergleich der Eingaben mit dem gespeicherten Daten so geringe Scriptlaufzeiten wie möglich zu erzielen, ist eine Speicherung der Daten in einer lokalen Datei nicht ratsam.

Als deutlich reaktionsschneller zeigt sich hier eine Datenbank, mit der ein direkter Datenaustausch möglich ist. So setzt man unter ASP oftmals auf Microsoft SQL-SERVER und unter PHP auf MySQL-Server und -Datenbanken.

Nachfolgend möchten wir zeigen, wie man leicht und dennoch auch für große Projekte geeignete Verbindungen zu einer Datenbank herstellt und wie man damit Daten abruft und Datenabgleiche sowie -vergleiche realisiert.

Zuerst sollte einem PHP-Programmierer bewusst sein, dass es immer wichtig ist, den Code möglichst gut Strukturiert in einzelne Dateien ablegt. So werden auch wir zu allererst eine Konfigurationsdatei anlegen, in der alle notwendigen Angaben und Einstellungen getroffen werden. Das ist wichtig, denn so muss man bei einem Server-Umzug nicht in jeder Script-Datei Änderungen vorzunehmen, zumal man dann erst suchen müsste, an welcher Stelle im Code die Angaben stehen.

Unsere Konfigurationsdatei trägt den Namen “config.php” und liegt im Unterverzeichnis “includes”:

<?php

     /**
      * includes/config.php
      * -> Konfigurationsdatei
      */

     $_SETTINGS = array();
     $_SETTINGS['mysql_host']     = 'localhost';
     $_SETTINGS['mysql_user']     = 'username';
     $_SETTINGS['mysql_pass']     = 'password';
     $_SETTINGS['mysql_database'] = 'databasename';

?>

Wir erstellen zuerst ein Array mit dem Namen “$_SETTINGS”. Dieses Array werden wir später Global einsetzen um unsere Einstellungen jederzeit abzurufen. Diese Einstellungen legen wir jedoch bereits in unserer “config.php” fest. Der Logische Aufbau hierbei ist, dass wir für jedes Array-Element einen festen und eindeutigen Namen als Index einsetzen. Der Index-Name beginnt immer mit dem einem Wort, welches den Bereich festlegt, danach folgt ein Unterstrich: “_” und dann ein weiteres Wort für die einzelne Einstellung. Bis jetzt haben wir nur Einstellungen für die Verbindung zu einer MySQL-Datenbank hinterlegt, also fangen alle Index-Namen mit “mysql” an. Da wir einmal die Adresse des MySQL-Servers, einmal den Benutzernamen, das Passwort und letztlich den Namen der Datenbank hinterlegen möchten, erstellen wir 4 solcher Index-Namen mit den Endungen “_host”, “_user”, “_pass” und “_database”. Man kann hier natürlich auch deutsche namen verwenden, doch erfahrungsgemäß sind englische Titel strikt kürzer.

Als nächstes sollten wir uns eine Script-Datei anlegen, in der wir Funktionen und automatisierte Abläufe ablegen, die wir später immer und immer wieder benötigen.

Wir nennen diese Datei “functions.php” und legen diese ebenfalls im Unterverzeichnis “includes” ab:

<?php

     /**
      * includes/functions.php
      * -> Funktionensammlung und Automatisierte Vorgänge
      */

     function ConnectToDatabase() {
          global $_SETTINGS;
          @mysql_connect($_SETTINGS['mysql_host'], $_SETTINGS['mysql_user'], $_SETTINGS['mysql_pass']) OR
               die ("Datenbankfehler in Functions.php (ConnectToDatabase::1): ".mysql_error());
          if (!mysql_select_db($_SETTINGS['mysql_database'])
               die ("Datenbankfehler in Functions.php (ConnectToDatabase::2): ".mysql_error());
          return true;
     } 
?>

Eigentlich sollte man eine Funktion so aufbauen, dass diese Eingabewerte erwartet, dann eine Aufgabe (zum Beispiel: Berechnung) durchführt und einen Wert zurückliefert. Wir halten uns in diesem Falle nicht ganz an dieses Muster, den wir nutzen unsere erste Funktion nur zur Vereinfachung der Verbindungsherstellung zum Datenbankserver.

Dabei kommen zwei PHP-Funktionen zum Einsatz, zum einen “mysql_connect” und zum anderen “mysql_select_db”. Genau genommen ist auch “die” und “mysql_error” eine PHP-Funktion, auf die ich jetzt aber erstmal nicht eingehe. Mit “mysql_connect” stellt PHP eine Verbindung zum Datenbank-Server her, vorausgesetzt, dass man dieser Funktion die Adresse (URL) des Servers mitteilt und für die Authentifizierung einen Benutzernamen und dass dazugehörige Passwort angibt. Mit “mysql_select_db” wählen wir eine zuvor manuell oder durch den Serveranbieter angelegte Datenbank aus. Dabei müssen wir der Funktion natürlich den Namen der Datenbank mitteilen.

Nun möchte ich erstmal etwas zu dem “@”-Zeichen vor “mysql_connect” etwas sagen: Normalerweise gibt PHP (je nach Server-Einstellungen) an dieser Stelle eine Meldung aus, wenn der Verbindungsaufbau gescheitert ist. Leider sind die Informationen dabei nicht sehr Detailreich und wir haben uns dafür entschieden mit der “die”-Funktion eine eigene Fehlerbehandlung zu erstellen. Da dadurch die Fehlermeldung einmal durch PHP und einmal durch uns (“die”) ausgegeben würde, schalten wir die PHP-Fehlerausgabe mit dem “@”-Zeichen vor der Funktion ab. Somit würde “Datenbankfehler in…” ausgegeben werden, wenn ein Fehler passiert, bzw. die Verbindung scheitert. Die Funktion “mysql_error” liefert hierbei Detaillierte Informationen zum Fehler als String (Zeichenkette) zurück. Diese Informationen werden in der Regel vom MySQL-Server selbst ausgegeben, doch damit wir dies lesen können, hängen wir diese Fehlerausgabe an unsere Fehlerbehandlung an: “die (‘Datenbankfehler in … : ‘.mysql_error()”. Da bei einem Fehler das Script durch “die” sofort gestoppt und beendet werden würde, können wir problemlos mit “return true;” die Funktion als “erfolgreich abgeschlossen” deklarieren, da diese Stelle nur erreicht werden würde, wenn kein Fehler passiert.


Newsletter
Kalender
Februar 2010
M D M D F S S
« Jan   Mai »
1234567
891011121314
15161718192021
22232425262728