PHP und Datenbanken Verbindung zum Datenbankserver Um PHP mit einer MySQL-Datenbank zu verbinden, braucht man zuerst eine Verbindung zum Datenbankserver. Diese Verbindung ist Vorraussetzung, um eine bestimmte Datenbank auf dem Datenbankserver auszuwählen. Es stehen zwei Funktionen für diesen Zweck zur Verfügung: mysql_connect() und mysql_pconnect(). Der Unterschied zwischen diesen beiden Funktionen besteht darin, dass die Verbindung, die mysql_pconnect() erstellt, auch nach Ende des Programms bestehen bleibt und bei einem erneuten Aufruf von mysql_pconnect() wieder genutzt werden kann. Verbindungen, die mysql_connect() erstellt, verlieren nach Ablauf ihre Gültigkeit. Syntax: int mysql_connect(string host, string benutzer, string passwort); Der Funktion werden drei Parameter übergeben, die den Namen des Datenbankservers, den anzumeldenden Benutzer und dessen Passwort bestimmen. Der Rückgabewert ist ein sogenannter Link-Identifizierer, der für andere MySQL-Funktionen benötigt wird. Die Syntax von mysql_pconnect() ist gleich. Der Rückgabewert ist FALSE, wenn keine Verbindung zum Datenbankserver hergestellt werden konnte. Die Paramteter sind optional, Standardwerte sind host = localhost, benutzer = Benutzer und Passwort = keins. Auswählen der Datenbank Auf der Grundlage einer bestehenden Verbindung kann das PHP-Programm eine Datenbank auf dem Datenbankserver auswählen. PHP bietet für diesen Zweck die Funktion mysql_select_db(). Syntax: int mysql_select_db(string db_name [, int linkID]); Als Parameter werden der Name der Datenbank und der Rückgabewert der Funktion mysql_connect() übergeben. Diese Funktion liefert FALSE zurück, wenn die Datenbank nicht ausgewählt werden kann. Der Parameter linkID kann entfallen, PHP nutzt in diesem Fall den zuletzt erzeugten Link. Das gilt ebenso für alle anderen Funktionen, die linkID als optionalen Parameter enthalten. <?php ?> $linkID = mysql_connect("localhost", "root", ""); if (!$linkID) die("Es wurde keine Verbindung zum Datenbankserver hergestellt."); if (mysql_select_db("Personalwesen", $linkID)) echo("Die Datenbank Personalwesen wurde ausgewählt."); else die ("Fehler beim auswählen der Personalwesen!"); Befehle an die Datenbank schicken Wurde eine Verbindung zum Datenbankserver hergestellt und eine Datenbank auf diesem Server ausgewählt, können SQL-Befehle an die Datenbank geschickt werden. Für die Verwendung der Befehle INSERT, SELECT, UPDATE oder eines sonstigen SQLBefehles wird in PHP nur eine einzige Funktion verwendet. Syntax: int mysql_query(string sql [, int linkID]); Der Funktion mysql_query() werden eine SQL-Zeichenfolge und die linkID der Verbindung übergeben. Die SQL-Zeichenfolge soll aber kein abschließendes Semikolon enthalten. Der Rückgabewert ist eine ID, die Sie zum Abfragen der Ergebnismenge benutzen können. Ist die SQL-Abfrage fehlerhaft oder haben Sie keinen entsprechenden Zugriff auf die entsprechenden Tabellen, dann gibt diese Funktion den Wert FALSE zurück. Senden des SQL-Befehls SELECT name, adresse FROM Kunden: <?php $linkID = mysql_connect("localhost", "root", ""); if (!$linkID) die("Es wurde keine Verbindung zum Datenbankserver hergestellt."); if (mysql_select_db("Personalwesen ", $linkID)) echo("Die Datenbank Personalwesen wurde ausgewählt."); else die ("Fehler beim auswählen der Personalwesen!"); // SELECT-Befehl $abfrage = "SELECT * FROM job"; $resID = mysql_query($abfrage, $linkID); if (!resID) die ("Es ist ein Fehler in der SQL-Anweisung azufgetreten."); ?> Datensätze der Abfrage ermitteln Nachdem eine Abfrage an den Datenbankserver mit mysql_query() gesendet wurde, wird eine andere Funktion zum Erhalten der Daten vom Datenbankserver benötigt. Diese Funktion darf jedoch nur benutzt werden, wenn die gesendete Abfrage auch eine Ergebnismenge zurückliefert. Zum Abfragen der Daten eignet sich die Funktion mysql_fetch_array(). Syntax: Array mysql_fetch_array(int resID [, int ErgTyp]); Mysql_fetch_array() wird mit dem Rückgabewert der Funktion mysql_query() als erster Parameter aufgerufen. Der zweite optionale Parameter bestimmt, ob das Array ein indiziertes Array (MYSQL_NUM), ein assoziatives Array (MYSQL_ASSOC) oder beides (MYSQL_BOTH) ist. Der Rückgabewert der Funktion ist ein Array, das die Zelleninhalte eines Datensatzes enthält. Um mehrere Datensätze abzurufen, müssen die Funktionen erneut aufgerufen werden. Der Rückgabewert der Funktion ist FALSE, wenn kein weiterer Datensatz verfügbar ist. Bildschirmausgabe der Datensätze von SELECT name, adresse FROM Kunden. <?php $linkID = mysql_connect("localhost", "root", ""); if (!$linkID) die("Es wurde keine Verbindung zum Datenbankserver hergestellt."); if (mysql_select_db("Personalwesen ", $linkID)) echo("Die Datenbank Personalwesen wurde ausgewählt."); else die ("Fehler beim auswählen der Personalwesen!"); // SELECT-Befehl $abfrage = "SELECT * FROM job"; $resID = mysql_query($abfrage, $linkID); if (!resID) die ("Es ist ein Fehler in der SQL-Anweisung aufgetreten."); ?> // Ausgabe der Datensätze while ($zeile = mysql_fetch_array ($resID, MYSQL_BOTH)) { echo ("Name: " .$zeile[0]); echo (" - Adresse: " $zeile["adresse"] . "<br>\n"); Auf das erste Feld der Ergebnistabelle (Name) wird mit Hilfe des Index zugegriffen, auf das zweite Feld (Adresse) assoziativ. PHP-Funktionen für MySQL In diesem Kapitel werden einige wichtige PHP-Funktionen für MySQL-Datenbanken erläutert. mysql_affected_rows int mysql_affected_rows ([int resID]) Gibt eine Anzahl der Datensätze zurück, die nach einem UPDATE-, INSERT- oder DELETEBefehl betroffen waren. Der Parameter bestimmt die Ergebnis-ID von mysql_query(). mysql_close int mysql_close ([int linkID]) Schließt eine mit mysql_connect() geöffnete Verbindung. Wird die linkID weggelassen, wird die letzte geöffnete Verbindung geschlossen. Eine Verbindung eines PHP-Skripts wird jedoch automatisch geschlossen, wenn das Skript beendet ist. mysql_create_db int mysql_create_db(string dbName, [, int linkID]) Erstellen einer Datenbank mit den Namen dbName. mysql_data_seek int mysql_data_seek (int resID, int znummer) Bewegt den Datensatzzeiger der Abfrage in resID nach zNummer. mysql_db_query int mysql_db_query(string database, string abfrage [, int linkID]) Sendet einen SQL-Befehl, ermöglicht aber im Gegensatz zu mysql_query() zusätzlich die Angabe eines Datenbankservers. mysql_drop_db bool mysql_drop_db(string dbname [, int linkID]) Löscht die Datenbank dbName in der Verbindung von linkID. mysql_errno int mysql_errno([int linkID]) Gibt eine Fehlernummer der letzten MySQL-Operation der Verbindung linkID zurück. Der Rückgabewert ist 0, wenn kein Fehler auftrat. mysql_error string mysql_error([int linkID]) Gibt eine Fehlermeldung der MySQL-Operation zurück. mysql_escape_string string mysql_escape_string(string sql) Maskiert Sonderzeichen in einem SQL-Befehl. mysql_fetch_assoc Wie mysql_fetch_array, der Ergebnistyp ist aber ausschließlich ein assoziatives Array. mysql_fetch_field Object mysql_fetch_field(int resID [, int feldNr]) Mit mysql_fetch_field() kann man sich anhand der resID ein Objekt mit Feldinformationen aus einem Abfrage zurückgeben lassen. Gibt man den optionalen Parameter Feld-Offset nicht an, so werden die Informationen des nächsten Feldes geliefert, das noch nicht mit mysql_fetch_field() ausgegeben wurde. Eigenschaft Beschreibung Object->table Name der Tabelle, aus der das Feld stammt Object->max_lenght Maximale Spaltenbreite Object->not_null Enthält 1, wenn die Spalte keine NULL-Werte annehmen kann Object->primary_key Enthält 1, wenn die Spalte Primärschlüssel ist Object->unique_key Enthält 1, wenn die Spalte ein eindeutiger Schlüssel ist Eigenschaft Beschreibung Object->multiple_key Enthält 1, wenn die Spalte ein "gewöhnlicher" Schlüssel ist Object->numeric Enthält 1, wenn die Spalte numerisch ist Object->blob Enthält 1, wenn die Spalte ein BLOB ist Object->type Datentyp der Spalte Object->unsigned Enthält 1, wenn die Spalte keine negative Zahlen speichern kann Object->zerofill Enthält 1, wen die Spalte den Zusatz ZEROFILL hat mysql_fetch_object Wie mysql_fetch_array, aber der Rückgabewert besitzt eine Objektstruktur. mysql_fetch_row Wie mysql_fetch_array, aber der Rückgabewert ist ausschließlich ein indiziertes Array. mysql_insert_id int mysql_insert_id([int linkID]) Gibt den letzten eingefügten Autowert der Verbindung linkID zurück. Der Funktionsaufruf muss unmittelbar nach dem INSERT-Befehl erfolgen. Er funktioniert nicht, wenn die Autowert-Spalte den Datentyp BIGINT hat. mysql_num_fields int mysql_num_fields(int resID) Gibt die Anzahl der Spalten der Abfrage resID zurück. mysql_num_rows int mysql_num_rows(int resID) Gibt die Anzahl der Datensätze der Abfrage resID zurück, die eine SELECT-Abfrage war. Setzt man vor eine der oben angegebenen Funktionen ein „@“, dann wird die Fehlerausgabe der Funktion unterdrückt. Beispiel: <?php $linkID = mysql_connect("localhost", "root", ""); if (!$linkID) die("Es wurde keine Verbindung zum Datenbankserver hergestellt."); if (mysql_select_db("Personalwesen ", $linkID)) echo("Die Datenbank Personalwesen wurde ausgewählt."); else die ("Fehler beim auswählen der Personalwesen!"); // SELECT-Befehl $abfrage = "SELECT * FROM job"; // verursacht mysql_query einen Fehler, dann wird die Ausgabe unterdrückt $resID = @mysql_query($abfrage, $linkID); if (!resID) die ("Es ist ein Fehler in der SQL-Anweisung azufgetreten."); ?> Ein allgemeines Beispiel für PHP in Verbindung mit MySQL Datenbanken In diesem Kapitel möchte ich ein kleines PHP-Skript vorstellen, mit dem Sie Daten aus einer Tabelle ausgeben können. Das Skript greift auf die Datenbank „Personalwesen“ und die Tabelle „Job“ zu und gibt den Inhalt der Tabelle in einer HTML-Tabelle aus. <HTML><HEAD><TITLE></TITLE></HEAD> <BODY BGCOLOR="#FFFFF"> <?php // Verbidnung zu MySQL herstellen $linkID = mysql_connect("","",""); if (!$linkID) die("Es konnte keine Verbindung zu MySQL hergestellt werden."); // Datenbank "Personalwesen" auswählen if (mysql_select_db("Personalwesen", $linkID)) echo("Die Datenbank Personalwesen wurde ausgewählt."); else echo("Fehler!"); // einen SQL-Befehl an die Datenbank schicken $abfrage = "SELECT * FROM job"; $resID = mysql_query($abfrage, $linkID); if (!$resID) die ("Es ist ein Fehler in der Abfrage aufgetreten."); // Ausgabe der Datensätze in Tabellenform echo("<table border cellpadding=\"3\"><tr>"); while($field=mysql_fetch_field($resID)) echo("<th>$field->name</th>"); while ($zeile = mysql_fetch_array($resID,MYSQL_BOTH)) { echo("<tr>"); for($i=0; $i<mysql_num_fields($resID); $i++) echo("<td>".htmlentities($zeile[$i])."</td>"); echo("</tr>\n"); } echo("</table>"); ?> </BODY></HTML>