Begleitskript zum PHP/MySQL Kurs c 2004 Jochen Grundmann http://www.online-platform.net Dieser Text unterliegt der GNU General Public License. Er darf als ganzes oder in Auszügen kopiert werden, vorausgesetzt, dass sich dieser Copyright Vermerk auf jeder Kopie befindet. PHP/MySQL Seite 2 Inhaltsverzeichnis 1 MySQL 1.1 Datenbanken . . . . . . . . . . . . . . . . 1.1.1 Verbindung zum Datenbankserver . 1.1.2 Datenbank anlegen . . . . . . . . . 1.1.3 Datenbanken anzeigen . . . . . . . 1.1.4 Datenbank verwenden und wechseln 1.1.5 Datenbank löschen . . . . . . . . . 1.2 Tabellen . . . . . . . . . . . . . . . . . . 1.2.1 Tabellen anlegen . . . . . . . . . . 1.2.2 Tabellen anzeigen . . . . . . . . . 1.2.2.1 Felddatentypen . . . . . 1.2.2.2 Primärschlüssel . . . . . 1.2.2.3 Auto Increment . . . . . 1.2.3 Tabellen bearbeiten . . . . . . . . 1.2.3.1 Tabellen umbenennen . . 1.2.3.2 Spalten löschen . . . . . 1.2.3.3 Spalten hinzufügen . . . 1.2.3.4 Felddatentyp ändern . . . 1.2.4 Tabellen löschen . . . . . . . . . . 1.3 Datensätze . . . . . . . . . . . . . . . . . 1.3.1 Datensätze hinzufügen . . . . . . . 1.3.2 Abfragen . . . . . . . . . . . . . . 1.3.2.1 Datensätze sortieren . . . 1.3.3 Datensätze löschen . . . . . . . . 1.3.4 Datensätze aktualisieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 PHP 2.1 Erstellen einer Verbindung zum Datenbankserver 2.2 Auswahl der Datenbank . . . . . . . . . . . . . 2.3 Verbindung zur Datenbank schließen . . . . . . 2.4 Anfragen an den Datenbankserver . . . . . . . . 2.5 Daten hinzufügen . . . . . . . . . . . . . . . . 2.6 Daten ausgeben . . . . . . . . . . . . . . . . . 2.6.1 mysql_num_rows . . . . . . . . . . . . 2.6.2 mysql_fetch_object . . . . . . . . . . . 2.6.3 mysql_fetch_array . . . . . . . . . . . 2.6.4 mysql_field_name . . . . . . . . . . . . c 2004 Jochen Grundmann . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 3 3 4 5 5 6 6 6 7 7 9 9 10 10 10 10 11 11 11 11 12 12 13 13 . . . . . . . . . . 15 15 15 16 16 17 18 19 19 20 20 PHP/MySQL Seite 3 1 MySQL MySQL ist ein relationales Datenbanksystem (RDBMS) mit einer Client/Server Struktur. Auf dem Datenbankserver können beliebig viele Datenbanken implementiert sein, ebenso können beliebig viele Clients gleichzeitig auf den Server zugreifen. Grenzen setzt hier nur die eingesetzte Hardware. 1.1 Datenbanken Zusammengehörige Daten werden in einer Datenbank gespeichert. 1.1.1 Verbindung zum Datenbankserver Um eine Verbindung zum Datenbankserver aufzubauen werden ein Benutzername und dazugehöriges Kennwort sowie der Name oder die IP-Adresse des Servers benötigt. MySQL besitzt keine grafische Benutzeroberfläche. Die Bedienung erfolgt unter Windows über die DOS Eingabeaufforderung, unter Linux über eine Shell. Syntax mysql -hhostname -ubenutzername -ppasswort Beispiel mysql -hwin2k-file -uroot -p c 2004 Jochen Grundmann PHP/MySQL Seite 4 Nach dieser Eingabe wird das Passwort verlangt. Der Benutzer root ist der Standardbenutzer eines MySQL Datenbanksystems und verfügt über Administratorrechte, das Passwort ist standardmäßig leer. Nach erfolgreicher Anmeldung meldet sich MySQL mit dem folgenden MySQL Prompt: Auf einem Standalone Rechner ist diese ausführliche Anmeldung nicht zwingend notwendig, hier reicht die Eingabe mysql aus, um sich am Server anzumelden. Um sich am Datenbankserver wieder abzumelden wird der Befehl exit verwendet. Anmerkung: MySQL Befehle werden immer mit einem Semikolon abgeschlossen. Es gibt zwar einige Ausnahmen, bei denen das Semikolon auch weggelassen werden kann, aber am einfachsten ist es, es immer einzugeben. 1.1.2 Datenbank anlegen Eine Datenbank wird mit dem Befehl create database angelegt. Syntax CREATE DATABASE Datenbankname c 2004 Jochen Grundmann PHP/MySQL Seite 5 Beispiel create database guestbook; Das erfolgreiche Anlegen wird mit der folgenden Meldung bestätigt: 1.1.3 Datenbanken anzeigen Welche Datenbanken auf dem Server vorhanden sind kann man sich mit dem Befehl show databases anzeigen lassen. Beispiel show databases; Das Ergebnis könnte ungefähr so aussehen: 1.1.4 Datenbank verwenden und wechseln Bevor auf eine Datenbank zugegriffen werden kann, muss diese mit dem Befehl use aktiviert werden. Syntax USE Datenbankname c 2004 Jochen Grundmann PHP/MySQL Seite 6 Beispiel use guestbook; Der Erfolg wird mit der folgenden Meldung bestätigt: 1.1.5 Datenbank löschen Datenbanken werden mit dem Befehl drop database gelöscht. Syntax DROP DATABASE Datenbankname Beispiel drop database guestbook; 1.2 Tabellen Die Daten einer Datenbank werden in Tabellen gespeichert. 1.2.1 Tabellen anlegen Eine Tabelle wird mit dem Befehl create table angelegt. Dann erfolgt die in Klammern die Angabe des Feldnamens und des Felddatentyps. Die einzelnen Felder werden durch Kommata getrennt. Wenn man eine Tabelle anlegt, sollte man genau wissen, welche Daten gespeichert werden sollen und welche Felddatentypen für die entsprechenden Daten gewählt werden sollen (Text, Zahlen, Datum, ...). Syntax CREATE TABLE Tabellenname (Feld1 Datentyp, Feld2 Datentyp, ...) Beispiel create table adressen( id int, vorname varchar(50), name varchar(50), ort varchar(50)); c 2004 Jochen Grundmann PHP/MySQL Seite 7 Das erfolgreiche Anlegen einer Tabelle wird mit einer Erfolgsmeldung bestätigt. 1.2.2 Tabellen anzeigen Welche Tabellen in einer Datenbank vorhanden sind kann man sich mit dem Befehl show tables anzeigen lassen. Beispiel show tables; Das Ergebnis könnte so aussehen: Anmerkung: Zuvor muss mit dem Befehl use eine Datenbank ausgewählt worden sein. 1.2.2.1 Felddatentypen MySQL stellt eine Vielzahl von Felddatentypen zur Verfügung. Die folgende Darstellung gibt einen Überblick. c 2004 Jochen Grundmann PHP/MySQL Seite 8 Abbildung 1.1: MySQL Felddatentypen c 2004 Jochen Grundmann PHP/MySQL Seite 9 Im Folgenden sollen nur die wichtigsten Felddatentypen kurz vorgestellt werden. Datentyp Varchar Text Int Date Time Timestamp Definition Text, max. 255 Zeichen Text, max. <216 Zeichen Zahl, von -2147483648 bis +2147483648 Datum, Format YYYY-MM-DD Zeit, Format HH:MM:SS Datum und Zeit, Format YYYYMMDDHHMMSS, wird bei Einfüge- und Aktualisierungsvorgängen automatisch eingetragen. Von mehreren Timestampfeldern wird immer nur das erste aktualisiert. 1.2.2.2 Primärschlüssel Damit ein Datensatz eindeutig wird, muss ein Feld mit einem Primärschlüssel werden. Dies erfolgt durch den Zusatz primary key (Feldname) beim Erstellen einer Tabelle. Beispiel create table adressen( id int, vorname varchar(50), name varchar(50), ort varchar(50), primary key(id)); In diesem Beispiel wird das Feld id als Primärschlüssel definiert. 1.2.2.3 Auto Increment Da ein Wert im Primärschlüssel nur einmal vorkommen darf, empfiehlt es sich diesen Wert von MySQL automatisch vergeben zu lassen. Dies geschieht durch den Zusatz auto_increment bei dem Feld, das Primärschlüssel werden soll. Beispiel create table adressen( id int not null auto_increment, vorname varchar(50), name varchar(50), ort varchar(50), primary key(id)); c 2004 Jochen Grundmann PHP/MySQL Seite 10 Damit das Primärschlüsselfeld immer einen Wert bekommt, sollte man dieses auch noch so definieren, dass es nicht leer bleiben darf. Dies geschieht durch den Zusatz not null. 1.2.3 Tabellen bearbeiten Vorhandene Tabellen können jederzeit geändert werden wie z.B. löschen oder hinzufügen von Spalten oder Änderung des Felddatentyps. Dazu wird der Befehl alter table verwendet. 1.2.3.1 Tabellen umbenennen Syntax ALTER TABLE Tabellenname RENAME neuer_Tabellenname Beispiel alter table adressen rename anschriften; Diese Beispiel benennt die Tabelle adressen in anschriften um. 1.2.3.2 Spalten löschen Syntax ALTER TABLE Tabellenname DROP Spaltenname Beispiel alter table adressen drop ort; In diesem Beispiel wird die Spalte ort aus der Tabelle adressen gelöscht. 1.2.3.3 Spalten hinzufügen Syntax ALTER TABLE Tabellenname ADD Erstellungsanweisung, ... Beispiel alter table adressen add plz int; Dieses Beispiel fügt der Tabelle adressen das Feld plz vom Datentyp int hinzu. c 2004 Jochen Grundmann PHP/MySQL Seite 11 1.2.3.4 Felddatentyp ändern Syntax ALTER TABLE Tabellenname CHANGE Spaltenname Erstellungsanweisung Beispiel alter table adressen change name varchar (100); In diesem Beispiel wird der Datentyp des Feldes name in varchar geändert. 1.2.4 Tabellen löschen Tabellen werden mit dem Befehl drop table gelöscht. Syntax DROP TABLE Tabellenname Beispiel drop table adressen; 1.3 Datensätze Ein Datensatz enthält immer einen Satz von zusammengehörigen Informationen. Er entspricht einer Zeile in einer Tabelle. 1.3.1 Datensätze hinzufügen Datensätze werden mit dem Befehl insert into in eine Tabelle eingetragen. Syntax INSERT INTO Tabellenname (Spaltenname, ...) VALUES (Wert, ...) Beispiel insert into adressen (vorname, name, ort) values (’Hans’, ’Meier’, ’Hagen’); c 2004 Jochen Grundmann PHP/MySQL Seite 12 Dieses Beispiel fügt einen Datensatz in die Tabelle adressen ein. Wenn mehrere Datensätze eingetragen werden sollen, sieht das Beispiel wie folgt aus: Beispiel insert into adressen (vorname, name, ort) values (’Hans’, ’Meier’, ’Hagen’) (’Paul’, ’Müller’, ’Hagen’); 1.3.2 Abfragen Die Inhalte von Tabellen können mit dem Befehl select angezeigt werden. Syntax SELECT Spaltenname, ... FROM Tabellenname WHERE Auswahlbedingung Beispiel select * from adressen; Dieses Beispiel zeigt alle Datensätze der Tabelle adressen an. Das Sternchen hat hier die Funktion eines Platzhalters. Beispiel select name, ort from adressen where id=1; Bei diesem Beispiel werden nur die Spalten name und ort des ersten Datensatzes angezeigt. 1.3.2.1 Datensätze sortieren Neue Datensätze werden immer am Ende einer Tabelle eingefügt. Wenn Datensätze gelöscht werden, werden diese entstandenen Lücken erst durch neue Datensätze gefüllt. Das bedeutet, dass die Daten in der Tabelle unsortiert vorliegen. Die Sortierung erfolgt indem man den c 2004 Jochen Grundmann PHP/MySQL Seite 13 select Befehl um den Zusatz order by erweitert. Die Sortierung ist immer aufsteigend, wenn absteigend sortiert werden soll, erweitert man den Befehl um den Zusatz desc. Beispiel select * from adressen order by name desc; Dieses Beispiel gibt die Inhalte sortiert nach dem Namen in absteigender Reihenfolge aus. 1.3.3 Datensätze löschen Datensätze löscht man mit dem Befehl delete. Syntax DELETE FROM Tabellenname WHERE Auswahlbedingung Welche Datensätze aus einer Tabelle gelöscht werden ergibt sich aus der Auswahlbedingung. Beispiel delete from adressen; Dieses Beispiel würde alle Datensätze der Tabelle adressen löschen, da keine Auswahlbedingung angegeben wurde. Beispiel delete from adressen where name=’Meier’; Dieses Beispiel löscht alle Datensätze bei denen im Feld name der Wert Meier steht. 1.3.4 Datensätze aktualisieren Datensätze werden mit dem Befehl update aktualisiert. Syntax UPDATE Tabellenname SET Spaltenname=Ausdruck, ... WHERE Auswahlbedingung Beispiel update adressen set ort=’Köln’ where name=’Meier’; c 2004 Jochen Grundmann PHP/MySQL Seite 14 Dieses Beispiel ändert bei allen Datensätzen, bei denen der Name Meier lautet, den Ort in Köln. c 2004 Jochen Grundmann PHP/MySQL Seite 15 2 PHP PHP stellt eine Reihe von Befehlen zur Zusammenarbeit mit MySQL Datenbanken zur Verfügung. 2.1 Erstellen einer Verbindung zum Datenbankserver Wie bereits oben erwähnt wird zum Herstellen der Verbindung der Name des Datenbankservers, der Benutzername und ein Kennwort benötigt. von PHP aus wird die Verbindung mit dem Befehl mysql_connect hergestellt. Syntax mysql_connect (host, user, passwort) Beispiel $host="127.0.0.1"; $user="root"; $passwort=""; mysql_connect($host, $user, $passwort) or die ("Verbindung zur Datenbank nicht möglich"); Falls die Verbindung nicht hergestellt werden kann, sollte das Script an dieser Stelle sofort abgebrochen werden. Die in dem Beispiel verwendeten Angaben zu Host, User und Passwort gelten für einen Standalone Rechner. 2.2 Auswahl der Datenbank Nachdem die Verbindung zum Server hergestellt wurde, muss eine Datenbank ausgewählt werden. Dies geschieht über den Befehl mysql_select_db. Syntax mysql_select_db (Datenbankname) c 2004 Jochen Grundmann PHP/MySQL Seite 16 Beispiel $host="127.0.0.1"; $user="root"; $passwort=""; mysql_connect($host, $user, $passwort) or die ("Verbindung zur Datenbank nicht möglich"); $db_name = "guestbook"; mysql_select_db ($db_name); 2.3 Verbindung zur Datenbank schließen Wenn die Verbindung zur Datenbank nicht mehr benötigt wird, sollte diese geschlossen werden. Dazu wird der Befehl mysql_close verwendet. Syntax mysql_close () Beispiel $host="127.0.0.1"; $user="root"; $passwort=""; $db_name = "guestbook"; mysql_connect($host, $user, $passwort) or die ("Verbindung zur Datenbank nicht möglich"); mysql_select_db ($db_name); echo "Verbindung hergestellt.<br>" ; mysql_close(); echo "Verbindung geschlossen."; 2.4 Anfragen an den Datenbankserver Um Anfragen jeglicher Art an den Datenbankserver richten zu können, wird der Befehl mysql_query verwendet. über diese Funktion wird ein SQL Befehl an den Server gesendet. Dieser SQL Befehl kann sowohl eine Aktualisierungsanfrage an die Tabelle als auch eine Auswahloder Einfügeanfrage sein. Syntax mysql_query (Anfrage) c 2004 Jochen Grundmann PHP/MySQL Seite 17 Beispiel $host="127.0.0.1"; $user="root"; $passwort=""; $db_name = "guestbook"; mysql_connect($host, $user, $passwort) or die ("Verbindung zur Datenbank nicht möglich"); mysql_select_db ($db_name); echo "Verbindung hergestellt.<br>" ; $sql = "select * from adressen"; mysql_query ($sql); Dieser Befehl sendet nur die Anfrage, es werden damit noch keine Daten aus der Datenbank ausgegeben. 2.5 Daten hinzufügen Um Daten in eine Datenbanktabelle einzufügen verwendet man den SQL Befehl insert into. Dieser Befehl wird, wie bei jeder Anfrage, mit der Funktion mysql_query an den Datenbankserver gesendet. Beispiel $host="127.0.0.1"; $user="root"; $passwort=""; $db_name = "guestbook" ; mysql_connect($host, $user, $passwort) or die ("Verbindung zur Datenbank nicht möglich"); mysql_select_db ($db_name); echo "Verbindung hergestellt.<br>"; $sql_entry = "insert into adressen (vorname, name, ort) values(’Fritz’,’Müller’,’Köln’)"; $entry = mysql_query ($sql_entry); echo "Die Daten wurden eingetragen.<br>"; mysql_close(); echo "Verbindung geschlossen."; Dieses Beispiel würde immer eine Erfolgsmeldung ausgeben, auch wenn das Eintragen fehlgeschlagen ist. Die folgende Codeänderung berücksichtigt auch diesen Fall. if ($entry) echo "Die Daten wurden eingetragen.<br>"; else echo "Eintragung fehlgeschlagen.<br>"; c 2004 Jochen Grundmann PHP/MySQL Seite 18 Im obigen Beispiel werden die Daten noch fest vorgegeben. Im Normalfall werden die Daten aus einem Formular kommen. Das Formular könnte ungefähr so aussehen. Beispiel <form action="db_form_auswertung.php" method="post"><br><br> Nachname<input type="text" name="nachname" size="50"><br><br> Vorname<input type="text" name="vorname" size="50" ><br><br> Ort<input type="text" name="ort" size="50" ><br><br> <input type="submit" name="senden" value="Senden"><br><br> </form> In diesem Formular werden drei Werte an die Datei db_form_auswertung.php übergeben. Um diese Daten in die Datenbank einzutragen, muss folgende Codeänderung vorgenommen werden. Beispiel $host="127.0.0.1"; $user="root"; $passwort=""; $db_name = "guestbook"; mysql_connect($host, $user, $passwort) or die ("Verbindung zur Datenbank nicht möglich"); mysql_select_db ($db_name); echo "Verbindung hergestellt.<br>"; $sql_entry = "insert into adressen (vorname, name, ort) values(’$_POST[vorname]’,’$_POST[name]’,’$_POST[ort]’); $entry = mysql_query ($sql_entry); if ($entry) echo "Die Daten wurden eingetragen.<br>"; else echo "Eintragung fehlgeschlagen.<br>"; mysql_close(); echo "Verbindung geschlossen."; Natürlich sollten alle Felder vor dem Eintragen auf ihre Richtigkeit hin überprüft werden. 2.6 Daten ausgeben Um die Ergebnisse einer Anfrage auf dem Bildschirm auszugeben, stellt PHP eine Reihe von Befehlen zur Verfügung. c 2004 Jochen Grundmann PHP/MySQL Seite 19 2.6.1 mysql_num_rows Mit der Funktion mysql_num_rows kann die Anzahl der Datensätze einer Abfrage ermittelt werden. Syntax mysql_num_rows (result_id) Beispiel $host="127.0.0.1"; $user="root"; $passwort=""; $db_name = "guestbook"; mysql_connect($host, $user, $passwort) or die ("Verbindung zur Datenbank nicht möglich"); mysql_select_db ($db_name); echo "Verbindung hergestellt.<br>"; $sql = "select * from adressen"; $result = mysql_query ($sql); echo " Die Abfrage enthält ".mysql_num_rows($result)." Datensätze."; mysql_close(); echo "Verbindung geschlossen."; 2.6.2 mysql_fetch_object Mit der Funktion mysql_fetch_object kann ein einzelner Datensatz aus einem Abfrageergebnis ausgelesen und weiterverarbeitet oder am Bildschirm ausgegeben werden. Syntax mysql_fetch_object (result_id) Beispiel $host="127.0.0.1"; $user="root"; $passwort=""; $db_name = "guestbook"; mysql_connect($host, $user, $passwort) or die ("Verbindung zur Datenbank nicht möglich"); mysql_select_db ($db_name); echo "Verbindung hergestellt.<br>"; $sql = "select * from adressen"; $result = mysql_query ($sql); c 2004 Jochen Grundmann PHP/MySQL Seite 20 while ($row = mysql_fetch_object($result)) { echo $row->vorname," " , $row->name," " ,$row->ort," " ,$row->plz; } mysql_close(); echo "Verbindung geschlossen."; 2.6.3 mysql_fetch_array Die Funktion mysql_fetch_array legt einen Datensatz aus einem Abfrageergebnis in einem Array ab. Die einzelnen Daten werden über ihren Feldnamen angesprochen. Syntax mysql_fetch_array (result_id) Beispiel $host="127.0.0.1"; $user="root"; $passwort=""; $db_name = "guestbook"; mysql_connect($host, $user, $passwort) or die ("Verbindung zur Datenbank nicht möglich"); mysql_select_db ($db_name); echo "Verbindung hergestellt.<br>"; $sql = "select * from adressen"; $result = mysql_query ($sql); while ($row = mysql_fetch_array($result)) { echo $row["vorname"]," ",$row["name"]," ",$row["ort"]," ",$row["plz"]; } mysql_close(); echo "Verbindung geschlossen."; 2.6.4 mysql_field_name Mit der Funktion mysql_field_name kann man die Feldnamen einer Tabelle auslesen. Syntax mysql_field_name (result_id, field_number) c 2004 Jochen Grundmann PHP/MySQL Seite 21 Beispiel $host="127.0.0.1"; $user="root"; $passwort=""; $db_name = "guestbook" ; mysql_connect($host, $user, $passwort) or die ("Verbindung zur Datenbank nicht möglich"); mysql_select_db ($db_name); echo "Verbindung hergestellt.<br>"; $sql = "select * from adressen"; $result = mysql_query ($sql); $num_rows = mysql_num_rows($result); $count = 0; while ($count < $num_rows) { echo mysql_field_name($result,$count)."<br>"; $count++; } mysql_close(); echo "Verbindung geschlossen."; Um die Spaltennamen ausgeben zu können muss zuvor die Anzahl der Spalten in der Tabelle ermittelt werden. Dies geschieht mit der Funktion mysql_num_rows. Die ermittelte Zahl wird gleichzeitig zur Abbruchbedingung der while-Schleife, mit der die Spaltennamen ausgelesen werden. Die Funktion mysql_field_name bekommt als zusätzlichen Parameter die Nummer der Spalte, deren Name ausgegeben werden soll. Anmerkung: MySQL beginnt beim Zählen der Spalten immer bei 0. c 2004 Jochen Grundmann