Bearbeitungszeit: Bis Dienstag, 25.5.2004, 17:30 Uhr
Datenbanken sind organisierte Ansammlungen von Daten, die mit bestimmten Befehlen (englisch queries, also Anfragen) gelesen und verändert werden können. Diese Befehle bilden eine Sprache, welche durch genaue Regeln definiert ist.
Die Standard-Sprache für Datenbankabfragen ist die Structured Query Language, kurz SQL. Sie wird von allen ernst zu nehmenden Datenbankprogrammen benutzt. Allerdings ist SQL, das mittlerweile in seiner dritten Version (SQL3) daherkommt, so umfassend, dass eine volle Implementation nur für extrem grosse Datenbanken (wie sie etwa von grossen Unternehmen benötigt werden) Sinn macht. Datenbankprogramme wie Oracle oder Sybase, welche den vollen SQL-Befehlssatz unterstützen, sind extrem aufwändig und teuer und benötigen enorme Ressourcen. Zudem können solche Datenbanken nur mit Hilfe geschulter Spezialisten gewartet werden.
Für Privatanwender und kleinere Unternehmen sind so grosse Datenbankenprogramme nicht erschwinglich und auch nicht wartbar. Hier gibt es einfachere, ressourcernsparendere und vor allem günstigere Produkte. Das am weitesten verbreitete Produkt ist MySQL, das frei und auch im Quelltext erhältlich ist. Auf unserem Rechner Paris läuft MySQL4.0.17.
MySQL kann von PHP problemlos angesprochen werden. Das ist einer der Gründe dafür, dass MySQL das beliebteste Datenbankprogramm für die Internet-Programmierung darstellt.
Informationsmaterial über MySQL und PHP erhalten Sie in einer Einführung von Christoph Reeg und Jens Hatlag. Die Aufgaben dieser Woche können auch ohne diese Informationen gelöst werden; falls Sie einmal selbst mit MySQL arbeiten, werden Sie aber an der Lektüre dieses oder eines anderen Dokuments nicht vorbeikommen.
Sie erzeugen selbst eine Datenbank, indem Sie sich via Terminal auf dem Paris anmelden
(ssh paris) und dort den Befehl
mysql -h paris -u test
eingeben. Sie sind dann mit dem MySQL-Server verbunden. Der Parameter -u test
legt fest, dass Sie sich als Testbenutzer anmelden. Testbenutzer können nur Datenbanken
erzeugen, deren Name mit test_ beginnt, und sie können ihre Datenbanken
nicht mit einem Passwort schützen. Da es nur um eine Übung geht, ist das für
diese Aufgabe ausreichend. Falls Sie in Ihrem Projekt MySQL verwenden werden, bekommen Sie
selbstverständlich einen MySQL-Account.
Erzeugen Sie nun eine Datenbank, deren Name sich aus test_ und Ihrem
Unix-Accountnamen zusammensetzt. Wenn Ihr Accountname hansli ist, ist der
Befehl dazu
create database test_hansli;
Vergessen Sie den Strichpunkt nicht!
Sie können von nun an sämtliche Arbeit
an Ihrer Datenbank über den Webclient durchführen. Beenden Sie also die
Terminalverbindung zu MySQL mit quit und die Verbindung zu Paris mit
exit.
Am Webclient melden Sie sich als Benutzer
test ohne Passwort an. Ihre zuvor erzeugte Datenbank können Sie aus der
Liste wählen, die erscheint, wenn Sie in das Feld oben links klicken.
Im folgenden Beispiel erzeugen Sie nun eine Datenbank, die Sie für ein webbasiertes Gästebuch brauchen können. Führen Sie dazu die folgenden Schritte aus:
gaestebuch, die 5 Felder hat
(für Nummer, Absender, Datum, Betreff und Inhalt).Nummer, setzen Sie den Typ auf INT,
die Attribute auf UNSIGNED und Extra auf auto increment. Wählen
Sie dieses Feld als Primärschlüssel.Absender und setzen Sie den Typ auf
TINYTEXT.Datum und setzen Sie den Typ auf
DATETIME.Betreff und setzen Sie den Typ auf
TEXT.Inhalt und setzen Sie den Typ auf
TEXT.Speichern.Schreiben Sie eine PHP-Datei, die HTML-Eingabefelder für einen Namen, ein Betreff und einen Text (letzteres am besten mehrzeilig) enthält, sowie einen Knopf, mit dem sich die Datei selbst aufruft.
Bei einem Aufruf soll die Datei folgendes machen:
Der folgende PHP-Code führt diese Aufgaben aus. Die Erklärung der Befehle steht
jeweils im Kommentar vor oder rechts vom Code. Sie können diesen Code direkt
übernehmen, lediglich den Formularteil müssen Sie selbst schreiben.
Hinweis: Offenbar funktioniert das Kopieren und Einfügen des Quellcodes nur mit Mozilla!
<?php
# Bei MySQL anmelden: Die Felder sind der Rechnername, der Account und das Passwort
$db = mysql_pconnect('paris.gymmuenchenstein.ch', 'test', '') or
die('<h3>Fehler</h3>Die Verbindung konnte nicht hergestellt werden</body></html>');
# Datenbank oeffnen. Verwenden Sie bitte nicht test_hansli.
mysql_select_db('test_hansli') or
die('<h3>Fehler</h3>Die Datenbank ist nicht zugriffsbereit</body></html>');
# Falls alle Variablen gesetzt sind, den neuen Beitrag einfuegen
if(isset($Absender) && isset($Betreff) && isset($Inhalt)) {
$time = strftime('%Y-%m-%d %H:%M:%S'); # siehe PHP-Manual
$Absender = addslashes($Absender); # zum auskommentieren von SQL-Befehlen
$Betreff = addslashes($Betreff); # (Sicherheit gegen Hacker)
$Inhalt = addslashes($Inhalt);
# Nun wird die Anfrage in SQL formuliert: Fuege in die Tabelle gaestebuch die Werte
# NULL (d.h.: autoincrement) und der Variablen $Absender, $time, $Betreff und $Inhalt ein.
# Der Text der Anfrage wird in der Variablen $query gespeichert.
$query = "insert into gaestebuch values (NULL, '$Absender', '$time', '$Betreff', '$Inhalt')";
# Die eigentliche Anfrage macht der mysql_query-Befehl.
$result = mysql_query($query) or
die('<h3>Fehler</h3>Der Beitrag konnte nicht gespeichert werden.</body></html>');
}
# Nun werden die bereits bestehenden Eintraege im Gaestebuch angezeigt. Wieder
# wird der SQL-Befehl dazu formuliert.
$query = "select Absender, Datum, Betreff, Inhalt from gaestebuch order by Datum";
# Nun kommt die eigentliche Abfrage
$result = mysql_query($query);
# Kryptisch: falls $result ungleich null ist, setzte $num auf die Anzahl Datensaetze, die
# bei der letzten MySQL-Anfrage gefunden wurden, sonst auf 0
$num = $result ? mysql_num_rows($result) : 0;
# Fuer jeden gefundenen Datensatz...
for($i = 0; $i < $num; $i++) {
# Speichere den Datensatz in $row
$row = mysql_fetch_array($result);
echo "<hr>\n";
# Gib den Absender aus ($row["Absender"] enthaelt diesen, stripslashes macht die
# Wirkung von addslashes (s.o.) rueckgaengig
echo '<p><b>Von: </b> '.stripslashes($row["Absender"]).'<br>'."\n";
# entsprechend fuer Betreff und Datum
echo '<b>Betreff: </b> '.stripslashes($row["Betreff"]).'<br>'."\n";
echo '<b>Datum: </b> '.stripslashes($row["Datum"]).'</p>'."\n";
# Text wird in einem div ausgegeben, und wir sorgen dafuer, dass die urspruenglich
# eingegebenen Zeilenumbrueche erhalten bleiben, dazu werden sie durch <br> dargestellt.
# \012 und \015 sind die (oktalen) ASCII-Codes von LineFeed und CarriageReturn
echo '<div style="width:100%; overflow:hidden">';
$row["Inhalt"] = str_replace("\015\012", "<br>", $row["Inhalt"]); # DOS und Windows
$row["Inhalt"] = str_replace("\015", "<br>", $row["Inhalt"]); # Mac (CR)
$row["Inhalt"] = str_replace("\012", "<br>", $row["Inhalt"]); # Unix (LF)
$row["Inhalt"] = str_replace("<br>", "<br>\n", $row["Inhalt"]); # Kosmetik: Linebreaks
echo stripslashes($row["Inhalt"]);
echo '</div></p>'; # Ende der Ausgabe
}
?>
Verschönern Sie Ihr Gästebuch!