5 Vorlesung und Übung Dr. Peter Pfahler Institut für Informatik Universität Paderborn 7 © Peter Pfahler, Michael Thies, Universität Paderborn 7. Datenbank-Zugriff Zum Beispiel aus PHP-Skripten: Client © Peter Pfahler, Michael Thies, Universität Paderborn 7-2 Struktur einer Datenbank © Peter Pfahler, Michael Thies, Universität Paderborn 7-3 Erzeugen von Datenbanken Auf mysql.cs.uni­paderborn.de durch den Administrator © Peter Pfahler, Michael Thies, Universität Paderborn 7-4 Erzeugen von Tabellen Z. B. durch SQL-Skripte: Anlegen einer Tabelle: CREATE TABLE dozent ( Id INT NOT NULL AUTO_INCREMENT, Vorname VARCHAR(36) NOT NULL, Nachname VARCHAR(36) NOT NULL, Titel VARCHAR(12), PRIMARY KEY (Id) ); Andere Spaltentypen: Ganze Zahlen TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT Gleitpunktzahlen FLOAT, DOUBLE Dezimalzahlen DECIMAL(M,D) Strings CHAR(M), VARCHAR(M), TEXT Datum, Zeit DATE, TIME, DATETIME, TIMESTAMP, YEAR, ... Aufzählungen ENUM('value1','value2',...) Mengen SET('value1','value2',...) © Peter Pfahler, Michael Thies, Universität Paderborn 7-5 Einfügen, Ändern und Löschen von Datensätzen Einfügen durch explizites Angeben der Spalten: INSERT INTO dozent (Vorname, Nachname) VALUES('Erika', 'Mustermann'); Einfügen von vollständigen Datensätzen: INSERT INTO dozent VALUES(NULL, 'Erika', 'Mustermann', 'Prof. Dr.'); Ändern von Datensätzen: UPDATE dozent SET Titel='Prof. Dr.' WHERE Id=5; UPDATE dozent SET Nachname='Meier' WHERE Nachname='Meyer'; Löschen von Datensätzen: DELETE FROM dozent WHERE Vorname='Erika'; Ohne WHERE­Klausel werden alle Datensätze gelöscht! © Peter Pfahler, Michael Thies, Universität Paderborn 7-6 Zugriff auf Datensätze Allgemeine Form: SELECT Spalten FROM Tabellen WHERE Bedingungen Alles auswählen: SELECT * FROM dozent; Bestimmte Spalten auswählen: SELECT Titel, Nachname FROM dozent; Bestimmte Zeilen auswählen: SELECT * FROM dozent WHERE LEFT(Nachname, 1) = 'M'; liefert: 7-7 © Peter Pfahler, Michael Thies, Universität Paderborn Sortierung SELECT Vorname, Nachname, GebTag FROM friends ORDER BY GebTag; Nach mehreren Werten SELECT * FROM dozent ORDER BY Nachname, Vorname; Nach berechneten Werten: SELECT name, birth, death, (YEAR(death) ­ YEAR(birth)) ­ (DAYOFYEAR(death) < DAYOFYEAR(birth)) AS age FROM pet WHERE death IS NOT NULL ORDER BY age; liefert: © Peter Pfahler, Michael Thies, Universität Paderborn 7-8 7.1. PHP und MySQL Aufbau der Verbindung zum Datenbank-Server <?php $link = mysql_pconnect("host[:port]", "user", "passw"); ?> Beispiel function connect_to_dbserver() { $link = mysql_pconnect("mysql.cs.uni­paderborn.de, "otto", "geheim"); if (! $link) { echo "Keine Verbindung zum MySQL­Server!"; exit; } } mysql_pconnect() (mit p vor dem connect) erzeugt persistente Verbindungen, die der Web-Server mehrfach verwenden kann und automatisch schliesst. Sie können nicht per mysql_close() im Skript geschlossen werden. © Peter Pfahler, Michael Thies, Universität Paderborn 7-9 PHP und MySQL Auswahl einer Datenbank <?php $res = mysql_select_db($dbname, $link); if (! $res) { echo "Kein Zugriff auf $dbname"; exit; } alternativ mit boolescher Kurzauswertung: mysql_select_db($dbname, $link) or die("Kein Zugriff auf $dbname"); Die Angabe der Datenbankverbindung $link ist optional. Standardmäßig wird die zuletzt geöffnete Verbindung verwendet. © Peter Pfahler, Michael Thies, Universität Paderborn 7-10 PHP und MySQL Queries $query = "irgendeine SQL­Anfrage"; $result = mysql_query($query, $link); Beispiel function teachername($index) { $query = "SELECT * FROM dozent WHERE Id='$index'"; $result = mysql_query($query); if(! $result) { echo "Error in SQL statement!"; exit; } … mysql_free_result($result); } SELECT-Anfragen liefern Tabellen zurück, mit mysql_free_result() werden diese Tabellen am Ende freigegeben. © Peter Pfahler, Michael Thies, Universität Paderborn 7-11 PHP und MySQL Zugriff auf Anfrage-Ergebnisse Anzahl der Ergebniszeilen $num = mysql_num_rows($result); Anzahl der Ergebnisspalten $num = mysql_num_fields($result); Name einer Ergebnisspalte $name = mysql_field_name($result, $index); Eine Zeile als indiziertes Array (Iterator) $row = mysql_fetch_row($result); Eine Zeile als assoziatives Array (Iterator) $row = mysql_fetch_array($result); © Peter Pfahler, Michael Thies, Universität Paderborn 7-12 PHP und MySQL: Vollständiges Beispiel <?php $db=mysql_pconnect("mysql.cs.uni­paderborn.de", "peter", "geheim"); if (!$db) { echo ("Verbindung zur Zeit nicht moeglich"); exit(); } if (!mysql_select_db("petertest")) { echo ("Verbindung zu petertest nicht moeglich"); exit(); } $result = mysql_query("select * from tier"); while ($row = mysql_fetch_array($result)){ echo $row["id"] . "\t" . $row["name"] . "\t" . $row["preis"] . "<br>\n"; } ?> © Peter Pfahler, Michael Thies, Universität Paderborn 7-13 7.2. Perl und MySQL am Beispiel #!/usr/bin/perl use DBI; use CGI ":standard"; print header(), start_html(­title=>'Ergebnisse'); $db_handle = DBI­>connect("dbi:mysql:database=sks09_peter;" . "host=mysql.cs.uni­paderborn.de;user=xxx;password=yyy") or die "Couldn't connect to database: $DBI::errstr\n"; $sql = "SELECT * FROM noten"; $statement = $db_handle­>prepare($sql) or die "Couldn't prepare query '$sql': $DBI::errstr\n"; $statement­>execute() or die "Couldn't execute query '$sql': $DBI::errstr\n"; while ($row_ref = $statement­>fetchrow_hashref()) { print "<b>$row_ref­>{vname} $row_ref­>{nname}</b> ", " hat die Note <b>$row_ref­>{note}</b>.<br>"; } $db_handle­>disconnect(); print end_html(); © Peter Pfahler, Michael Thies, Universität Paderborn 7-14