Aufgaben vom 19.5.2004 (Woche 11)

Bearbeitungszeit: Bis Dienstag, 25.5.2004, 17:30 Uhr

Aufgabe 1: Anlegen einer Datenbank mit MySQL

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.

Ihre Aufgabe

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:

  1. Erzeugen Sie eine Tabelle namens gaestebuch, die 5 Felder hat (für Nummer, Absender, Datum, Betreff und Inhalt).
  2. Benennen Sie das erste Feld 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.
  3. Benennen Sie das zweite Feld Absender und setzen Sie den Typ auf TINYTEXT.
  4. Benennen Sie das dritte Feld Datum und setzen Sie den Typ auf DATETIME.
  5. Benennen Sie das vierte Feld Betreff und setzen Sie den Typ auf TEXT.
  6. Benennen Sie das fünfte Feld Inhalt und setzen Sie den Typ auf TEXT.
  7. Kicken Sie auf Speichern.

Aufgabe 2: Benutzen der Datenbank mit PHP zur Erstellung eines Gästebuchs

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:

  1. Testen, ob die Variablen Absender, Betreff und Inhalt gesetzt sind
  2. Wenn ja, einen neuen Eintrag in der Gästebuchdatenbank erstellen
  3. Die Gästebuchdatenbank öffnen und den Inhalt in einer Tabelle darstellen.

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
}
?>

Aufgabe 3: Verschönerung des Gästebuchs

Verschönern Sie Ihr Gästebuch!

Valid XHTML 1.1! Valid CSS!