Beispiel einer Web-Anwendung
Willemers Informatik-Ecke

Übersicht

Eine Webanwendung besteht aus drei Teilen: Die Ein- und Ausgabe wird durch einfache Webseiten in HTML realisiert. Die Daten werden in einer Datenbank abgelegt und als Verbindungsglied werden CGI-Programme verwendet, die die Anfragen, die über den Browser ankommen, umformulieren und an die Datenbank senden. Das Ergebnis stellen diese CGI-Programme wieder in HTML im Browser dar.

Als Beipiel wird die Grundlage zur Programmierung eines Systems zur Reservierung von Ferienwohnungen dargestellt. Als Basis wird in den Beispielen Linux, MySQL und Perl verwendet. Als Webserver dient der Apache. Dabei dürfte der Wechsel von Betriebssystem oder Webserver wenig Einfluss auf die hier vorgestellten Programme haben, dafür aber auf Ihr Budget und die Zuverlässigkeit Ihrer Anwendung.

Datenbank anlegen

Sie brauchen mindestens drei Tabellen um die Buchung von Ferienwohnungen zu realisieren. Die beiden ersten Tabellen enthalten die Stammdaten: Eine Tabelle für die Wohnungen und eine Tabelle für die Gäste. Die dritte Tabelle stellt die Buchung dar. Jede Buchung bezieht sich auf einen Gast, eine Wohnung und den Zeitraum, in dem der Gast die Wohnung belegt.

Zuerst allerdings muss der MySQL-Dämon gestartet werden, ansonsten sind keinerlei Zugriffe auf die Datenbank möglich:

safe_mysqld &

Es wird die Datenbank fewo erzeugt und es müssen die drei Tabellen angelegt werden:

gaston> mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1 to server version: 3.23.41-log

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> create database fewo;
Query OK, 1 row affected (0.00 sec)
mysql> create table wohnung (
    -> id int unique, bez char(12), bem text,
    -> maxerw int, maxkinder int, preis real);
Query OK, 0 rows affected (0.00 sec)
mysql> create table gast(id int unique, name char(40), adr char(40),
    -> plzort char(40), bem text);
Query OK, 0 rows affected (0.00 sec)
mysql> create table buchen (wngid int, gastid int, begin date, end date,
    -> status char);
mysql>

Von diesem Prompt kann mit einfachen SQL-Kommandos überprüft werden, ob die Perlprogramme einwandfrei laufen.

Mit dem nachfolgenden Befehl kann dem MySQL-Dämon signalisiert werden, dass er sich beenden soll.

mysqladmin -u root shutdown

Formular erstellen

Im nächsten Schritt wird die Eingabemaske und damit die Benutzeroberfläche gestaltet. Das geschieht einfach per HTML.

<FORM ACTION="/cgi-bin/insert.pl" METHOD="POST">
<input type=hidden Name="table" Value="wohnung">
<TABLE >
<tr><td> Wohnung: </td><td> <INPUT NAME="Bez" VALUE="EGlinks" SIZE=12> </td></tr>
<tr><td> Max. Anzahl Erwachsene: </td><td> <INPUT NAME="maxerw" VALUE="4" SIZE=3> </td></tr>
<tr><td> Max. Anzahl Kinder: </td><td><INPUT NAME="maxkinder" VALUE="4" SIZE=3>
</td></tr>
<tr><td> Preis: </td><td> <INPUT NAME="preis" VALUE="25.00" SIZE=7> </td></tr>
<tr><td> Bemerkungen:</td><td>
<TEXTAREA Name="bem" ROWS=5 COLS=60>
Wunderschöne Wohnung unter Reetdach.
</TEXTAREA> </td></tr>
</table>
<INPUT TYPE="SUBMIT" VALUE="Anlegen">
</FORM>

Das Formular erscheint wie folgt auf dem Bildschirm:


Wohnung:
Max. Anzahl Erwachsene:
Max. Anzahl Kinder:
Preis:
Bemerkungen:

Im Rahmen der <FORM> wird festgelegt, dass das Perlskript insert.pl die Daten der Maske auswerten soll. Dieses Skript ist so geschrieben, dass es fast beliebige Masken in beliebige Datenbanken einfügen kann. Damit das Skript erfährt, in welche Tabelle es schreiben soll, wird ein Dummy-Eingabefeld definiert, das versteckt ist und keinen anderen Zweck hat, als dem Perlskript mitzuteilen, wie die richtige Tabelle heißt.

Einfügen mit Perl

#!/usr/bin/perl -w
use strict;
use DBI;

my %input;
my $line;
my $zeile; my $key; my $wert;
my @zuweisungen; my @neu;
# Die Variablen fuer die Datenbankansteuerung
my $fields;
my $values;
my $table;

# Hole die per CGI uebergebene Zeile aus der Standardeingabe
$line = <STDIN>;
if (not $line) { exit; }
# Splitte Sie an den Stellen auf, an denen ein & erscheint
# und fuelle damit ein Array
@zuweisungen = split("&", $line);
# Nun werden die Zuweisungen in Variable (key) und Wert (wert)
# aufgespalten und einem Hash zugeordnet
while (@zuweisungen) {
    ($zeile, @neu) = @zuweisungen;
    ($key, $wert) = split("=", $zeile);
    $wert =~ s/\+/ /g;       # + durch leer ersetzen!
    $input{$key} = $wert;
    # DB-INSERT vorbereiten: Feldliste und VALUES-Liste
    if ($key ne "table") {
      $fields = $fields . $key . ",";
      $values = $values . "\'$wert\'" . ",";
    }
    @zuweisungen = @neu;
}
chop($fields); # letztes Komma loeschen
chop($values); # letztes Komma loeschen
# Die Tabelle aus dem Wert des hidden Inputs ermitteln
$table = $input{'table'};
delete( $input{'table'});

# Vorbereitung der Ausgabe auf dem Browser
print "Content-type: text/html\n\n<html><body>";

# Ab in die Datenbank
my $dbh = DBI->connect('dbi:mysql:dbname=fewo', 'root', '')
          or print("<H2>Fehler: Keine Verbindung zur Datenbank</H2>");
if ($fields ne '') {
  $dbh->do("INSERT INTO $table ($fields) VALUES($values);");
}
$dbh->disconnect;

print "Die Daten wurden eingefügt. Danke!";
print "<p></body></html>";