| ## Formulare definieren
| Allgemeines zu Formularen Formularbereich definieren Zielfenster für Server-Antwort Zu verarbeitende Zeichensätze Weitere Informationen

## Allgemeines zu Formularen

HTML stellt die Möglichkeit zur Verfügung, Formulare zu erstellen. In Formularen kann der Anwender Eingabefelder ausfüllen, in mehrzeiligen Textfeldern Text eingeben, aus Listen Einträge auswählen usw. Wenn das Formular fertig ausgefüllt ist, kann der Anwender auf einen Button klicken, um das Formular abzusenden.

Dazu geben Sie beim Erstellen eines Formulars an, was mit den Daten des ausgefüllten Formulars passieren soll. Sie können sich die ausgefüllten Daten beispielsweise per E-Mail zuschicken lassen oder von einem CGI-Programm auf dem Server-Rechner weiterverarbeiten lassen.

Formulare können sehr unterschiedliche Aufgaben haben. So werden sie zum Beispiel eingesetzt:

- um bestimmte, gleichartig strukturierte Auskünfte von Anwendern einzuholen,
- um Anwendern das Suchen in Datenbeständen zu ermöglichen,
- um Anwendern die Möglichkeit zu geben, selbst Daten für einen Datenbestand beizusteuern,
- um dem Anwender die Möglichkeit individueller Interaktion zu bieten, etwa um aus einer Produktpalette etwas Bestimmtes zu bestellen.

Ein Software-Hersteller könnte z.B. ein Formular zur Verfügung stellen, in dem der Anwender angeben kann, welche Produkte der Firma er besitzt, wie er Kenntnis von den Produkten erhalten hat, welchen Beruf er ausübt, auf welchem Rechnertyp die Software bei ihm läuft usw. Auf diese Weise könnte er gleichartig strukturiertes und daher gut vergleichbares Feedback von Anwendern einholen.

Viele Suchdienste im Internet bieten dem aufrufenden Web-Browser Eingabe-Formulare an, in denen der Anwender seinen Suchwunsch spezifizieren kann. Ohne solche Formulare wäre das Durchsuchen gar nicht möglich. Die meisten Suchdienste bieten darüber hinaus auch die Möglichkeit an, eigene Internet-Adressen in die Datenbank einzuspeisen. Das Einholen der dazu nötigen Information geschieht ebenfalls mit Hilfe von Formularen.

Immer zahlreicher werden auch die Online-Shops im Internet. Egal ob Tickets, Pizza oder Unterwäsche - um solche Bestell-Services zu realisieren, sind Formulare erforderlich, in denen der Anwender seine Bestellwünsche genau angeben kann.

Wenn Sie dem Anwender auf Ihren Web-Seiten einfach nur eine Möglichkeit anbieten wollen, direkt mit Ihnen in Kontakt zu treten, genügt allerdings auch ein einfacher E-Mail-Verweis an die eigene Email-Adresse.

### Beachten Sie:

Nicht wenige Anbieter versuchen über Formulare, Anwenderadressen zu sammeln, um diese dann zu verkaufen, oder um Auskünfte einzuholen, zu denen ein Anwender nicht verpflichtet ist. Dazu wird häufig ein Anwenderbegehren als Köder benutzt - beispielsweise ein Gewinnspiel oder die Downloadmöglichkeit der kostenlosen Ausprobierversion einer teueren Software.
Dieser Missbrauch hat einige selbsternannte Hüter des Datenschutzes auf den Plan gerufen, die aber leider an der falschen Ecke kehren und sich nicht an die rechtlich meist gut abgesicherten Datenjäger wenden, sondern an ahnungslose Homepage-Besitzer, die ein kleines Formular im Web haben und plötzlich dafür abgemahnt werden. Dabei wird mit dem Prinzip der so genannten "Datensparsamkeit" argumentiert (siehe auch Hinweise zum Teledienste-Datenschutzgesetz (TDDSG) im Abschnitt Gesetze für "neue Medien" (in Deutschland)). Versuchen Sie also nicht, den Anwender mit Hilfe von Formularen wie eine Zitrone auszuquetschen. Beschränken Sie sich auf solche Formularfelder, die für den Formularzweck erkennbar nötig sind.

## Formularbereich definieren

Sie können an einer beliebigen Stelle innerhalb des Dateikörpers einer HTML-Datei ein Formular definieren.

### Beispiel 1:

    <form action="http://www.ihr-guter-name.de/cgi-bin/feedback.pl" method="get">
    <!-- hier folgen die Formularelemente -->
    </form>

### Beispiel 2:

    <form action="mailto:eierschale@irgend.wo" method="post" enctype="text/plain">
    <!-- hier folgen die Formularelemente -->
    </form>

### Erläuterung:

Mit `<form>...</form>` definieren Sie ein Formular (form = Formular). Alles, was zwischen dem einleitenden `<form>`-Tag und dem abschließenden Tag `</form>` steht, gehört zum Formular. Das sind hauptsächlich Elemente des Formulars wie Eingabefelder, Auswahllisten oder Buttons. Um die Elemente zu platzieren und zu beschriften, können Sie dazwischen aber auch andere HTML-Elemente notieren. Dabei müssen Sie allerdings folgendes beachten: nach der HTML-Variante "Strict" dürfen Sie innerhalb eines Formulars nur Block-Elemente (und Script-Bereiche) notieren, also etwa Überschriften, Textabsätze, allgemeine Bereiche oder Tabellen. In der HTML-Variante "Transitional" ist es dagegen außerdem erlaubt, zwischen `<form>` und `</form>` auch gemischten Inhalt aus Text und Inline-Elementen zu notieren. Um die etwas lästige und an dieser Stelle nicht ganz nachvollziehbare Restriktion in der "Strict"-Variante zu umgehen, können Sie sich damit behelfen, dass Sie das Formular folgendermaßen strukturieren:
`<form><div> <!-- Formularinhalt --> </div></form>`.
Innerhalb des `div`-Elements, das da innerhalb des Formulars notiert ist, haben Sie auch in der "Strict"-Variante die Freiheiten der "Transitional"-Variante. Eine andere Möglichkeit besteht darin, anstelle des `div`-Elements mit dem `fieldset`-Element zu arbeiten und Formularinhalte darin einzuschließen - auch innerhalb des `fieldset`-Elements haben Sie alle Freiheiten (siehe dazu Elemente gruppieren).

Im einleitenden `<form>`-Tag geben Sie mit dem Pflichtattribut `action=` an, was mit den Formulardaten passieren soll, wenn der Anwender das Formular absendet (action = Aktion). Die Wertzuweisung an `action=` kann beispielsweise eine E-Mail-Adresse (normalerweise Ihre eigene) mit vorangestelltem `mailto:` sein - so wie im zweiten der obigen Beispiele (mailto = sende an). Dann werden die ausgefüllten Formulardaten an diese E-Mail-Adresse geschickt, sofern das möglich ist.
Oder Sie rufen ein Programm auf dem Server-Rechner, meistens ein CGI-Script, auf, das die Daten weiterverarbeitet - so wie im ersten der obigen Beispiele.
Sie können bei `action=` auch eine HTML-Datei angeben. Diese wird bei Absenden des Formulars aufgerufen und kann die Formulardaten z.B. mit JavaScript weiterverarbeiten. Das ist beispielsweise für mehrseitige Formulare interessant. Berücksichtigen Sie dabei aber, dass JavaScript nur dann Zugriff auf Daten hat, wenn die Methode `get` verwendet wurde. Bei einigen Browsern, z.B. bei Opera, funktioniert das Übergeben von Formulardaten zwischen HTML-Dateien auch nur in HTTP-Umgebung, also nicht lokal ohne Serverkommunikation.

Bei der Wertzuweisung an `action=` gelten die Regeln zum Referenzieren in HTML. Das Referenzieren mit relativen oder absoluten Pfadangaben ist also ebenso möglich wie das oben in Beispiel 1 gezeigte Referenzieren mit einem absoluten URI, z.B.:
`<form action="/cgi-bin/auswert.pl">
<form action="../../cgi-bin/suche.cgi">`.

Eine weiteres wichtiges Attribut bei der Formulardefinition ist das Attribut `method=`. Dabei bestimmen Sie, nach welcher HTTP-Übertragungsmethode die Formulardaten an ihr Ziel gelangen. Dabei gibt es zwei mögliche Wertzuweisungen:

- Wenn Sie `method="get"` wählen (diese Angabe ist übrigens nicht zwingend erforderlich, da `get` als Default-Einstellung definiert ist), werden die Daten des ausgefüllten Formulars als Parameter an die Aufrufadresse angehängt. Die Anfrage, die beim Server eintrifft, sieht dann beispielsweise so aus:
  `http://www.ihr-guter-name.de/cgi-bin/feedback.cgi?AnwenderName=Stefan+M%FCnz&AnwenderMail=selfhtml@teamone.de&Text=Das+ist+ein+kleiner+Text`. Das verarbeitende Script kann diese als Parameter übergebene Zeichenkette auslesen und für die Datenverarbeitung auseinanderdröseln. Wenn Sie sich näher dafür interessieren, können Sie den Abschnitt HTML-Formulare und CGI lesen.
- Wenn Sie `method="post"` wählen, werden die Daten des augefüllten Formulars vom Web-Server über den Standardeingabekanal zur Verfügung gestellt, und ein auswertendes CGI-Script muss die ankommenden Daten behandeln wie eine Benutzereingabe, die auf der Kommandozeile gemacht wurde (post = verschicken). Bei CGI-Scripts müssen Sie diese Methode auf jeden Fall dann verwenden, wenn das Script die POST-Methode verarbeitet, und wenn die Formulardaten zu umfangreich für die GET-Methode sind.

Das W3-Konsortium empfiehlt, die Methode `get` dann zu wählen, wenn das auswertende Programm die Daten nur als Input benötigt (z.B. für eine Suche), während die Methode `post` für Fälle empfohlen wird, in denen das auswertende Programm "Seiteneffekte" wie das Einspeisen der Daten in eine Datenbank ausführt.

Wenn Sie sich die Formulardaten per E-Mail zuschicken lassen, wie im zweiten obigen Beispiel gezeigt, dann benutzen Sie immer `method="post"`. Außerdem sollten Sie bei E-Mail-Empfang von Formulardaten im einleitenden `<form>`-Tag `enctype="text/plain"` mit angeben. Denn Formulardaten sind normalerweise nach einem Schema kodiert, das für Menschen keine Freude zu lesen ist. Mit der genannten Angabe erhalten Sie zumindest von Anwendern, die Ihr Formular mit einem modernen Web-Browser ausfüllen, ordentlich formatierte E-Mails.

### Beachten Sie:

Bei E-Mail-Formularen besteht keine Garantie auf Erfolg. Es hängt vom Browser und anderen Einstellungen auf dem Rechner des Anwenders ab, ob der Formularversand klappt. E-Mail-Formulare gelten deshalb mittlerweile als unsauber, zumal es Alternativen gibt. Mehr dazu im Abschnitt Formulare verarbeiten.

## Zielfenster für Server-Antwort

Wenn Sie mit Frames arbeiten und in einem Frame-Fenster ein Formular haben, nach dessen Absenden die Server-Antwort bzw. die Antwort eines CGI-Scripts in einem anderen Frame-Fenster angezeigt werden soll, können Sie das gewünschte Zielfenster angeben.

### Beispiel:

    <form action="/cgi-bin/auswert.pl" method="get" target="Daten">
    <!-- hier folgen die Formularelemente -->
    </form>

### Erläuterung:

Mit dem Attribut `target=` können Sie im einleitenden `<form>`-Tag den Namen des Frame-Fensters angeben, in dem die Server-Antwort ausgegeben werden soll. Es muss sich entweder um einen Fensternamen handeln, der für ein Frame-Fenster dem `name`-Attribut im `<frame>`-Tag vergeben wurde, oder um einen der folgenden reservierten Fensternamen:
`_self`, um die Server-Antwort im aktuellen Fenster auszugeben,
`_parent`, um für die Server-Antwort bei verschachtelten Framesets das aktuelle Frameset zu sprengen,
`_top`, um für die Server-Antwort bei verschachtelten Framesets alle Framesets zu sprengen.

### Beachten Sie:

Das `target`-Attribut ist zwar nicht als deprecated gekennzeichnet, doch um es einzusetzen, müssen Sie die HTML-Variante "Transitional" verwenden. Der Grund ist, dass dieses Attribut vorwiegend für Verweise bei Verwendung von Frames gedacht ist und Frames eine eigene HTML-Variante haben, die von der Einstufung her der Variante "Transitional" entspricht (auf gut Deutsch: nicht der "reinen Lehre" entspricht).

## Zu verarbeitende Zeichensätze

Sie können angeben, nach welchen Zeichensätzen eingegebene Formulardaten interpretiert werden sollen. Dabei können Sie einen oder mehrere Zeichensätze angeben.

### Beispiel:

    <form action="/cgi-bin/auswert.pl" method="get" accept-charset="ISO-8859-1, ISO-8859-2">
    <!-- hier folgen die Formularelemente -->
    </form>

### Erläuterung:

Mit dem Attribut `accept-charset=` können Sie Zeichensätze angeben. Trennen Sie mehrere Angaben durch Kommata und/oder Leerzeichen. Erlaubt sind Zeichensatzangaben, wie sie auf der Web-Adresse http://www.iana.org/assignments/character-sets angegeben sind.

## Weitere Informationen

In der HTML-Referenz finden Sie Angaben darüber, wo das `form`-Element vorkommen darf, welche Attribute erlaubt sind und was bei den einzelnen Attributen zu beachten ist:
Element-Referenz für Formulare (`<form>...</form>`)
Attribut-Referenz für Formulare (`<form>...</form>`)

Zur Datenverarbeitung von Formularen mit Hilfe von CGI-Scripts gibt es innerhalb der vorliegenden Dokumentation das Kapitel CGI/Perl.

| Eingabefelder und Eingabebereiche
| Verweis-sensitive Grafiken

© 2001 selfhtml@teamone.de