VSIS: Arbeitsgruppe Verteilte Systeme und Informationssysteme prInt: Das Praktikum Internet-Werkzeuge  Praktikum Internet-Werkzeuge   Fachbereich
  Aufgaben  Dokus  Links   Universität Hamburg
Datenbankzugriff mit PHP3
am Beispiel von MySQL

Nach der Einführung in die Grundlagen von PHP3 ist dieses Mal die Anbindung des Schwarzen Brettes an eine Datenbank das Ziel. Dazu werden die Datenbank-Funktionen von PHP3 vorgestellt, mit denen man in diesem Falle auf den MySQL-Datenbankserver zugreifen kann.
Als erstes folgt ein Überblick über den Ablauf einer Datenbank-Abfrage mit den einzelnen Schritten. Im Anschluss werden die einzelnen Funktionen von PHP3 vorgestellt, die in den Schritten benötigt werden. Zum Schluss folgen noch einige Beispiele zur Programmierung.

 Eine Abfrage im Überblick

Wenn eine PHP-Seite Daten aus einer Datenbank abrufen soll oder auch dort verändern soll, müssen prinzipiell vier Schritte durchlaufen werden:

  1. Verbindung zum MySQL-Server herstellen
  2. Datenbank auswählen
  3. SQL-Query abschicken
  4. Ergebnis der Query verarbeiten

 Verbindung herstellen

Bevor eine SQL-Abfrage gestartet werden kann, muss eine Verbindung zum Datenbankserver aufgebaut werden. PHP3 verwaltet persistente Verbindungen, so dass diese sehr schnell zur Verfügung stehen, wenn sie benötigt werden. Es ist daher auch nicht nötig, am Ende der Seite die Verbindung wieder zu schließen.

Um eine Verbindung aufzubauen, muss man in der Regel drei Sachen wissen: den Namen und Port des Rechners, auf dem der Datenbankserver läuft, eine Benutzerkennung und das dazugehörige Passwort. War die Verbindung erfolgreich, bekommt man von PHP3 einen sogenannten "link identifier" zurück, den man bei Operationen auf der Datenbank mit übergeben muss.

<?
$link = mysql_pconnect("host:port","username","password");
?>

 Datenbank auswählen

Ein Datenbanksystem verwaltet normalerweise mehrere Datenbanken. SQL-Anfragen beziehen sich jedoch immer nur auf eine ausgewählte davon. Damit MySQL weiß, welche Datenbank gerade gefragt ist, muss zuerst eine ausgewählt werden. Alle folgenden Queries beziehen sich dann darauf, bis eine neue Datenbank ausgewählt wird.

<?
mysql_select_db("database",$link);
?>

 SQL-Query abschicken

Ist eine Verbindung hergestellt und eine Datenbank ausgewählt, kann eine Abfrage losgeschickt werden. Dazu formuliert man zuerst eine SQL-Abfrage und schickt diese dann ab. Als Ergebnis bekommt man einen sog. "result identifier" zurück, über den dann im folgenden die Werte des Ergebnisses abgefragt werden können.

<?
$query = "select name, vorname from tabelle where id > 10";
$result = mysql_query($query,$link);
?>

Konnte die Abfrage nicht ausgeführt werden, enthält $result einen negativen Wert.

 Ergebnis verarbeiten

War die Abfrage erfolgreich, können nun über den result identifier die zurückgelieferten Werte ausgewertet werden. SELECT-Abfragen liefern Tabellen zurück, die nun in einer Schleife Zeile für Zeile abgerufen werden können. Dazu sollte man zuerst feststellen, wie viele Zeilen das Ergebnis enthält und dann in einer Schleife jede Zeile einzeln abrufen. Am einfachsten ist es, die komplette Zeile als Array abzufragen. Der Index der Array-Felder entspricht den Spaltennamen in der SELECT-Abfrage.

<?
$num = mysql_numrows($result);
for ($i = 0; $i < $num; $i++) {
	$row = mysql_fetch_array($result);
	echo "Name : $row[name], Vorname: $row[vorname]<br/>";
}
?>

 Die Funktionen im Einzelnen

mysql_pconnect(host,user,password)
Funktion:
Stellt eine Verbindung zum MySQL-Server her
Parameter:
host: IP-Adresse oder DNS-Name des Servers, evtl. mit Port
user: MySQL-Username
password: zum Usernamen passendes Passwort
Rückgabe:
link identifier
mysql_select_db(database,link)
Funktion:
Wählt eine Datenbank aus, die über diesen link identifier angesprochen wird
Parameter:
database: Name der auszuwählenden Datenbank
link: ein von mysql_pconnect() zurückgelieferter link identifier
Rückgabe:
keine
mysql_query(query,link)
Funktion:
sendet über einen vorher geöffneten link eine SQL-Abfrage an den Datenbankserver
Parameter:
query: String, der die SQL-Abfrage enthält
link: ein von mysql_pconnect() zurückgelieferter link identifier
Rückgabe:
ein result identifier, über den auf das Ergebnis der Abfrage zugegriffen werden kann
mysql_numrows(result)
Funktion:
liefert die Anzahl von Zeilen, die von einer SELECT-Anfrage zurückgegeben wurden
Parameter:
result: der result identifier der Abfrage, die untersucht werden soll
Rückgabe:
die Anzahl der Zeilen
mysql_fetch_array(result)
Funktion:
liefert eine Zeile (einen Datensatz) aus einem Ergebnis einer SELECT-Abfrage und springt danach zur nächsten Zeile
Parameter:
result: der result identifier der Abfrage, die untersucht werden soll
Rückgabe:
ein Array, das die Werte der Zeile enthält. Die Schlüssel des Arrays entsprechen dabei den im SELECT verwendeten Spaltennamen.

 Ein größeres Beispiel

Um das ganze noch einmal anschaulicher zu machen, hier ein umfangreicheres Beispiel, das die Verwendung aller vorgestellten Funktionen noch einmal zeigt.

<? require("kopf.phtml"); ?>

<h1>Liste der Kategorien</h1>
<table>
<tr><th>Id</th><th>Bezeichnung</th></tr>
<?
   $link = mysql_pconnect("localhost","print","trimp");
   mysql_select_db("printwww",$link);

   $query = "select * from kategorie";
   $result = mysql_query($query,$link);
   $num = mysql_numrows($result);
   
   for ($i = 0; $i < $num; $i++) {
      $row = mysql_fetch_array($result);
      echo "<tr><td>$row[id]</td><td>$row[bezeichnung]</td></tr>";
   }
?>
</table>

<? require("fuss.phtml"); ?>

 Tipps und Tricks

Werden in SQL Strings angegeben, müssen sie immer in einfachen Quotes stehen, also z.B.

$wert1="hallo";
$wert2="huhu";
$query = "INSERT INTO test VALUES(null,'$wert1','$wert2')";

Werden Spalten angefordert wie UNIX_TIMESTAMP(a.datum), so müssen sie auch unter diesem Namen abgefragt werden. Werden Spalten angefordert wie a.id und b.id können sie nicht unter a.id bzw b.id angefordert werden, sondern nur unter id. Um beide Werte anforden zu können, muß der Umstand ausgenutzt werden, daß die Spalten von 0 bis n durchnummeriert werden. Eine Abfrage wie diese:

$query = "SELECT a.id,b.id,a.verfasser,UNIX_TIMESTAMP(a.datum),b.bezeichnung FROM anzeigen a,kategorie b WHERE a.kategorie=b.id";
$result = mysql_query($query,$link);

Schreibt beispielsweise für den ersten Record die folgenden Werte in das Array $row:

Key => Value

id  => 5			Wert von b.id
0   => 1			Wert von a.id
1   => 5			Wert von b.id
verfasser => harald
2   => harald
UNIX_TIMESTAMP(a.datum) => 925730559
3   => 925730559
bezeichnung => Software
4   => Software

Auf a.id kann also nur über $row[0] zugegriffen werden.

 Fehlerkontrolle

Ganz wichtig: Fangt Fehler ab. Es wäre doch sehr schade, wenn euer Script ausgibt, dass ein Satz in die Datenbank eingefügt wurde, obwohl sie gerade gar nicht lief. Die einfachsten Möglichkeiten zur Kontrolle sind die folgenden:

mysql_query(): Wenn Ihr eine UPDATE- , INSERT- oder DELETE- Abfrage abschickt, ergibt diese Funktion eine 1 bei Erfolg, einen leeren String bei einem Misserfolg.

mysql_affected_rows($link) ergibt die Anzahl der betroffenen Records nach dem letzten INSERT, UPDATE oder DELETE. Übergebt ein $link, und kein $result!

Autor: Marco Kaiser. Überarbeitet von Martin Husemann.

Mi 12-16 Uhr Raum: B-201 und RZ Start: 05.04.2006
Eine Veranstaltung des Arbeitsbereichs Verteilte Systeme und Informationssysteme (VSIS)

Letzte Änderung : 02.05.2005 - 15:14
EMail: prInt06@vsis.informatik.uni-hamburg.de