1. Das HTML-Formular

Mit HTML hat man die Möglichkeit mit Hilfe spezieller Befehle Formulare zu erstellen. Der Anwender kann in Formularen Eingabefelder ausfüllen, in mehrzeiligen Textfeldern Text eingeben, aus Listen Einträge auswählen, Felder ankreuzen und Buttons anklicken. Das Formular wird abgesendet indem der Anwender auf einen Button klickt.


1.1. Verwendung

HTML-Formulare werden u.a. verwendet um
Wichtig für dieses Thema ist das Abfragen von Datenbanken.


1.2.1. Beispiele im Netz

Hier werden examplarisch einige Einsatzstellen im Web für HTML-Formulare aufgelistet:


1.3. Verarbeitung

Das Formular wird durch drücken eines Buttons abgeschickt.
Die Daten des Formulars wird je nach Einstellung an ein cgi-Programm übergeben oder via mail verschickt.
Im folgenden werden Programme/Programmiersprachen aufgelistet, mit denen man die Daten eines Fromulars empfangen und verwerten kann:


1.4. Erstellung

Ein Formular wird mit einem Form-Tag begonnen und beendet.
Es wird eingeleitet mit <form method="..." action="..." enctype="..."> und geschlossen mit </fom>
Dazwischen hat man nun die Möglichkeit die Dinge anzugeben, die abgefragt werden sollen.


1.4.1. Formularelemente

Für das Erzeugen von Formularen stehen dem Autor eine Reihe von nützlichen Formulartools zur Verfügung.
Diese sind im einzelenen:

Für die Verarbeitung:
Für den Benutzerdialog:


1.4.1.1. method

Gibt die Methode an, wie das Formular verschickt werden soll. Bei versenden über das mailto Tag wählen Sie immer post. Beim versenden an cgi/php/asp Scripte können Sie auch get wählen.

method=get
Die Daten des ausgefüllten Formulars werden in der Umgebungsvariablen QUERY_STRING gespeichert (method = Methode, get = bekommen). Das CGI-Programm muß den Inhalt dieser Umgebungsvariablen auslesen und verarbeiten.

method=post
Die Daten des augefüllten Formulars werden auf dem Server-Rechner von "stdin" (Standard-Eingabe) zur Verfügung gestellt, und das CGI-Programm muß sie behandeln wie eine Benutzereingabe, die auf der Kommandozeile gemacht wurde (post = verschicken). Da in diesem Fall kein EndOfFile-Signal (EOF) gesendet wird, muß das CGI-Programm die Umgebungsvariable CONTENT_LENGTH auslesen, um die Länge der übermittelten Daten und damit deren Ende zu ermitteln.


1.4.1.2. action

Beschreibt welches Programm die Formulardaten weiter verarbeitet.
Man kann aber antelle eines CGI-Programms die Methode mailto: angeben. Dann werden sie Daten an die e-mail-Adresse geschickt die beim Aufruf der mailto-Methode angegeben wurde.


1.4.1.3. enctype

Hier kann man bei Bedarf das Formatierschemata angeben, mit der die Formulardaten formartiert werden.


1.4.1.4. Eingabefelder

Ein Eingabefeld wird mit folgendem Tag erzeugt:
<input type="text" name="..." size="...">
Da es noch andere Typen von input gibt, ist es notwendig den Typ anzugeben. Falls kein Typ angegeben wird, wirs automatisch type="text" angenommen..
Der Name des Feldes wird mit name="..." angegeben.
Die Länge des Feldes kann mit size="..." verändert werden.


1.4.1.5. Textfelder (textarea)

Testfelder können mit
<textarea name="..." rows=".." cols="..."></textarea>
erstellt werden.
Mit name="..." wird wieder der Name des Feldes angegeben.
Das Ausmaß des Textfeldes wird mit rows und cols festgelegt.


1.4.1.6. Checkboxen

Checkboxen erzeugt man mit:
<input type="checkbox" name="..." value="...">
Der Name des Feldes wird auch hier mit name="" festgelegt.
Die Werte in Value sind die Daten, die bei Auswahl dieses Kästchens, verschickt werden.


1.4.1.7. Radio-Buttons 

Mit
<input type="radio" name="..." value="...">
erhält man ein Radio-Button.
Name="" gibt wie immer den Feldnamen an.
Auch hier werden die Werte in Value bei Auswahl des Buttons mit dem Formular verschickt.


1.4.1.8. Auswahllisten

Möchte man Auswahllisten verwenden, so benutzt man folgenden Tag:
<select name="..." size=...>...</select>
Der Feldname gibt man bei name="..." an.
Die Size-Angabe gibt die Anzahl der sichtbaren, auswählbaren Einträge an. Die anderen Einträge koennen mit den Scrollbalken sichtbar gemacht  werden.
Mit <option value="..."> gibt man die Einträge an, die ausgewählt werden können.


1.4.1.9. Versteckte Elemente

Um Elemente zu verschicken, bei dem keine Eingabe des Benutzer benötigt wird, kann man den Tag:
<input type="hidden" name="..." value="...">
verwenden.


1.4.1.10. Buttons

Um das Formular abschicken zu können muss man dann noch den Tag:
<input type="submit" value="...">
hinzufügen.
Bei type="reset" wirde ein Reset-Button hinzugefügt, der beim Klicken die Formulardaten zurückgesetzt.



2. Erstellung eines HTML-Abfrageforumlars


Ziel dieses Themas ist die Erstellung eines datenbank-spezifisches HTML-Abfrageforumlars.


2.1. Anforderung

Oftmals müssen Datenbankabfragen generiert werden, wenn die Struktur der zugrunde liegenden Datenbank noch nicht feststeht (z.B. Meta-Datenbanken). In diesem Fall - oder falls nicht für jede Datenbank ein neues Forumlar "von Hand" generiert werden soll - muss ein Formular generiert werden, dessen Elemente von Struktur und Inhalten abhängen.


2.2. Formulargenerator

Es soll ein Formular generiert werden, dass unabhänigig der verwendeten Datenbank arbeiten soll.


2.2.1. Konstruktion des Generators

Um es flexibel und unabhängig von Datenbanken und Datentypen zu halten, sollte man das Formular erst zur Laufzeit erstellen. Dazu verwendet man am besten eine cgi-Skriptsprache wie perl.
Die Datenbanken haben verschiedene Datentypen. Wie kann man dies in dem Formular berücksichtigen? Das ist gar nicht notwendig! Wie wir schon im obigen Kapitel erfahren haben, werden die Formulardaten in einem String verschickt. Dies ist aber auch nicht weiter schlimm. Es soll ja im Formular nur die Daten für die Datenbankabfrage gesammelt werden. Die eigentliche Datenbank-Abfrage wird erst durch das nachgelagerte Programm, dass durch action="..." angegeben wird, ausgeführt. Dieses Programm kann dann das notwendige Casting durchführen. (Casting bezeichnet man das Transformieren von Datentypen ;z.B. von integer -> string)
Wichtig ist also nur die Information, was abgefragt werden soll!
Diese Information kann aber vom eigentlichen Programm, dass das Formular zur Laufzeit erzeugen soll, ausgelagert werden. Dazu verwendet man am Besten ein Ini-File. In diesem Ini-File gibt man die Tabellenelemente an und die Möglichkeiten der Auswahl. Diese Daten können dann vom "Generator" (das Perl-Programm, dass das Fromular erzeugen soll) eingelesen und verwendet werden.


2.2.2. Ini-File

Das Ini-File koennte folgende Aussehen haben:
Die Tabellenelemente werden mit [ ] angeben.
Der Typ des Formularelements (s. Formularelemente im vorigem Kapitel) wird mit type=... angegeben.
Mit elements=... werden die verschiedenen Möglichkeiten die zur Auswahl stehen, wie z.B. bei Radio-Buttons, angezeigt. Die Auswahlmöglichkeiten werden dabei durch ein Komma getrennt.

Beispiel:

Tabellenname:
Typ
Auswahlmöglichkeiten
Name
Eingabefeld

Geschlecht
Radio-Button
m,w
Ortsteil
Auswahlliste Pappenhausen, Entenhausen, Grosshausen


[Name]
type=text

[Geschlecht]
type=radio
elements=m,w

[Ortsteil]
type=select
elements=Pappenhausen,Entenhausen,Grosshausen


2.2.3. Der Generator

Hier ist ein Beispiel, wie der Generator aussehen kann:

#!perl
@data = "";
open(DATA,"<formulargenerator.ini");
while(<DATA>) {
push(@data,$_);
}
close(DATA);

  @cols = "";
  %type = "";
  %elements = "";
  $felder = "";
  for (@data) {
   chomp($_);
   $_ =~ s/ //g;
   if ($_ ne ""){
    if (substr($_,0,1) eq "[") {
#      $_ =~ s/\[\]//g;
     $current = substr($_,1,length($_)-2);
     push(@cols,$current);
     $felder .= "$current,"
    }
    else {
     @parameter = split(/=/,$_);
     if ($parameter[0] eq "type") { 
      $type{$current} = $parameter[1];
     }
     if ($parameter[0] eq "elements") { 
      $elements{$current} = $parameter[1];
     }
    }
   }
  }
  $felder = substr($felder,0,length($felder)-1);


print "Content-type: text/html\n\n";
print "<h1 align=center>Abfrage</h1>\n";
print "<hr><br><br>\n";
print "<form action=\"ergebnis.pl\" method=\"GET\">";
print "<center>\n";
print "<table border=1 bgcolor=#FFDDFF>\n";
print "<tr>\n";

print "<input type=hidden value=\"$felder\" >";

for (@cols) {
  if ($_ ne "") {
  
  print "<tr><td><b>$_</b>\n";
  print "<td>";

   if ($type{$_} eq "radio") {
    $name = $_;
    @data = split(/,/,$elements{$_});
    for (@data) {
      print "<input type=radio name=\"$name\" value=\"$_\">$_\n";
      print "<br>\n";
     }
     print "<input type=radio name=\"$name\" value=\"\" checked>keine Auswahl\n";
   }
   elsif ($type{$_} eq "select") {
     print "<select size=1 name=\"$_\">";
     print "<option value=\"\">keine Auswahl\n";
     @data = split(/,/,$elements{$_});
     for (@data) {
      print "<option value=\"$_\">$_\n";
     }
     print "</select>\n";
   }
   elsif ($type{$_} eq "checkbox") {
    $name = $_;
    @data = split(/,/,$elements{$_});
    for (@data) {
      print "<input type=checkbox name=\"$name\" value=\"$_\">$_\n";
      print "<br>\n";
     }
   }
   else {
     print "<input type=text name=\"$_\">\n";
   }
  }
}


print "</table>\n";
print "<br><input type=submit value=\"Abschicken\">\n";
print "<input type=reset value=\"Reset\">\n";
print "</center></form>\n";
print "</body></html>\n";