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:
- Verbindung zum MySQL-Server herstellen
- Datenbank auswählen
- SQL-Query abschicken
- Ergebnis der Query verarbeiten
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");
?>
|
|
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);
?>
|
|
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.
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.
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"); ?>
|
|
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.
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