Formulare

Versenden und Weiterverarbeitung

Nach obenNach unten

Über die Methoden des Versendens

Die GET-Methode

Die GET-Methode wird aufgerufen durch <form action="..." method="get">.

Bei der Verwendung der GET-Methode, werden alle Eingaben über die URL weitergegeben, d.h., wenn Sie zum Beispiel ein Feld Vorname und ein Feld Nachname haben, wird das beim Abschicken so an die URL drangehängt:
...?vorname=thomas&nachname=meyer
Da URLs aber grundsätzlich in der Länge beschränkt sind (die genaue Länge hängt vom Browser ab, so ungefähr jedoch sind es 200), ist von dieser Methode abzuraten, sobald mindestens eine Textarea im Formular ist, da es sonst beim Abschicken zu Problemen kommen könnte.
Diese Methode eignet sich für Formulare, welche nur Radio Buttons oder Auswahllisten haben, deren maximale Values die Grenze nicht überschreiten, z.B. Formulare für Abstimmungen.

Die POST-Methode

Die POST-Methode wird aufgerufen durch <form action="..." method="post">.

Man verwendet die POST-Methode immer dann, wenn die GET-Methode nicht funktioniert, also wenn man Textareas im Formular hat. Im Prinzip ist die Länge dessen, was man hier in die Felder eingeben kann unbeschränkt (in der Praxis mag es eine Grenze geben, aber die ist bei den heutigen Systemen so hoch...).
Von der POST-Methode ist für den Clienten nichts sichtbar, d.h. es werden keine Zeichen in der URL o.ä. übermittelt, die Texte werden direkt abgeschickt.

Nach obenNach unten

Die serverseitige Weiterverarbeitung der Daten

Die Versendung mittels mailto

Es gibt die Möglichkeit ein Formular mit mailto: zu versenden, dies muss dann so aussehen: <form action="mailto:IhreE-Mail@yxz.de" method="post"> Wenn der Besucher dann auf den Submit - Button, zu Deutsch den Übermitteln - Button klickt, öffnet sich ein E-Mail Client auf dem PC des Besuchers, über welchen der Besucher dann die Daten versenden kann.
Diese Methode hat aber mehrere Nachteile; Nicht nur, dass lange nicht jeder einen E-Mail Clienten (z.B. Outlook) auf seinem PC installiert hat, neuere Versionen der E-Mail Programme übernehmen aus Sicherheitsgründen überhaupt keine Formulardaten mehr!
Früher ließ sich auch über action="maito:IhreE-Mail@yxz.de?subject:Hier der Betreff" ein Betreff vorgeben, aber auch dies wird von neueren Programmen ingoniert.

Daraus lässt sich jetzt schließen, dass das ein erfolgreiches Versenden des Formulars ein reiner Glücksfall ist. Viele Besucher werden das Formular also nicht abschicken können. Deshalb würde ich diese Variante des Versenden nur im äußersten Notfall empfehlen und nur dann, wenn keine anderen Alternativen mehr möglich sind (es gibt aber fast immer Alternativen, wie Sie im Folgenden lesen können).

Wie doch mal jemand so schön im SelfHTML Forum sagte: Mailto-Formulare solltest du nur verwenden, wenn es dir auch wirklich sch*** egal ist, ob sie ankommen, gemeint ist, wenn es einem egal ist, ob man die Daten die der Besucher eigegeben hat letztlich auch erhält oder nicht.

Die Versendung mittels eines serverseitigen Scriptes

Hierbei werden die Daten (i.d.R. per POST) an ein Script geschickt, was auf irgendeinem Server liegt. Dies geht so:
<form action="Hier die URL zum Script" method="post">
Im Endeffekt könnte es dann z.B. so aussehen:
<form action="http://www.meinedomain.de/scripte/mein.script" method="post">

Es gibt mehrere Scriptsprachen, die da zum Einsatz kommen könnten. Einerseits könnte man sich ein eigenes Perl Script schreiben, welches die Daten dann über CGI versendet. Wer aber nur ein einfaches Webspace+Domain - Packet bei einem Provider hat, wird nur schwerlich sich des Features der eigenen-CGI-Script-Einbindung erfreuen können.
In so einem Fall kann man auch ein PHP Script verwenden - vorrausgesetzt der Server untersützt PHP. Ein Beispielscript sehen Sie auf dieser Seite weiter unten. Dieses Script können Sie gerne für sich verwenden.

Sowohl für die PHP als auch für die Perl Lösung lassen sich im Internet viele kostenlose Scripte finden. Suchen Sie einfach mal im Internet danach.

Aber...

Nun taucht natürlich zu Recht die Frage auf: Was mache ich, wenn mein Webspace mir keinerlei serverseitige Scriptsprache (werder Perl noch PHP etc.) zur Verfügung stellt und ich mich trotzdem nicht von der Unzuverlässigkeit der Mailto-Formulare abhängig machen will?

Passen Sie auf, ich sag's Ihnen: Nutzen Sie doch einfach die Möglichkeit eines kostenlosen Anbieters, über den Sie dann Ihr Formlar verschicken können.
Das geht einfach und bei Vielen müssen Sie sich noch nicht einmal anmelden. Hier habe ich Ihnen mal ein paar Anbieter aufgelistet:

Anbieter Referenz Vorteile Nachteile
www.go4xml.com Beschreibung Eigene Sendebestätigungsseite möglich Kleines Werbepopup
www.formmailer.com/ Beschreibung Verschlüsselung der Daten möglich Registrierung erforderlich, für kommerzielle Anwernder kostenplichtig
www.formhandler.de Codegenerator Drei kostenlose Angbote, versch. Umfang Teilweise etwas unübersichtlich
www.nettz.de Dokumentation Eigene Sendebestätigungs- und Fehlerseite, Pflicht Felder, Mehrfachabschnitte, komplett kostenlos Kleine Schrifteinblendung als Werbung
www.dw-formmailer.de Beschreibung Kostenlose Version, mehrsprachig, Vorlagen In der kostenlosen, werbefinanzierten Version gibt es ein paar Feature nicht.
www.formhandler.de Codegenarator Verschiedene kostenlose Versionen, bis hin zu recht umfangreichen Konfigurationsmöglichkeiten Registrierung erforderlich, man kann kein eigenes Template einbinden

Und wenn da jetzt für Sie noch nichts dabei war, suchen Sie doch einfach mal bei Google, da finden Sie noch einiges.
Jetzt bei Google suchen.

Nach obenNach unten

Beispielscript für Weiterverarbeitung mit PHP

Nehmen wir einmal an, wir hätten folgendes Formular in einer beliebigen HTML Datei:

<form action="pfad/zum/phpscript.php" method="post">

  <label for="absender">Ihr Name:</label>

  <input type="text" name="absender" id="absender" size="25">
  
  <label for="email">Ihre E-Mail Adresse:</label>

  <input type="text" name="email" id="email" size="25">

  <label for="betreff">Betreff ihrer Nachricht:"</label>

  <input type="betreff" name="betreff" id="betreff" size="25">

  <label for="nachricht">Ihre Nachricht:</label>

  <textarea name="nachricht" id="nachricht" rows="8" cols="30"></textarea>
  
  <input type="submit" name="abschicken" value="Nachricht verschicken">

</form>

Dieses Formular würde an die nachfolgende mail.php verschickt, welche das Formular verarbeitet, bzw. eine Fehlermeldung ausgibt.

<?php

/* Geben Sie hier Ihre E-Mail Adresse zwischen den beiden " an: */

$_emails[0] = "selfhtml@riehle-web.com";

// Wenn keine $_POST Daten übermittelt wurden, dann abbrechen
if(!isset($_POST) OR empty($_POST))
{
    header("Content-type: text/plain");
    echo "Es wurden keine Daten übermittelt!";
    exit;
}
else
{
    // Datum, Uhrzeit und Pfad zum eigenen Script feststellen
    $date = date("d.m.Y");
    $time = date("H:i");
    $host = "http://" . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
   
    // Empfänger feststellen und auf Gültigkeit prüfen
    if(isset($_POST['recipient']) AND isset($_emails[ $_POST['recipient'] ])
       AND preg_match("/^.*@.*\..*$/", $_emails[ $_POST['recipient'] ]))
    {
        $recipient = $_emails[ $_POST['recipient'] ];
    }
    // Wurde kein (gültiger) Empfänger angegeben, es mit $_email[0] versuchen
    elseif(isset($_emails[0]) AND preg_match("/^.*@.*\..*$/", $_emails[0]))
    {
        $recipient = $_emails[0];
    }
    // Ist auch diese Adresse ungültig, mit Fehlermeldung abbrechen
    else
    {
        header("Content-type: text/plain");
        echo "Fehler im Script - es wurde kein Empfänger oder eine ungültige E-Mail Adresse in \ angegeben.";
        exit;
    }
   
    // Wenn Betreff übermittelt, diesen verwenden
    if(isset($_POST['subject']))
    {
        $subject = $_POST['subject'];
    }
    // sonst einen Default Betreff verwenden
    else
    {
        $subject = "Formular Daten von {$_SERVER['HTTP_HOST']}";
    }
   
    // E-Mai Kopf generieren
    $email = "Formular Eintrag\n"
           . "\n"
           . "Am $date um $time Uhr hast das Script auf $host Formulardaten empfangen,\n"
           . "welche nach Angabe des Browsers von {$_SERVER['HTTP_REFERER']} stammen.\n"
           . "\n"
           . "Der Formular Inhalt wird nachfolgend wiedergegeben.\n"
           . "\n";
   
    // Alle $_POST Werte an den E-Mail Kopf anhängen
    foreach($_POST as $key => $value)
    {
        if($key == "redirect" OR $key == "recipient" OR $key == "subject")
        {
            continue;
        }
        $email .= "Fomular Feld '$key':\n"
               .  "=============================\n"
               .  "$value\n"
               .  "\n";
    }
   
    // E-Mail Fuß anfügen
    $email .= "=============================\n"
           .  "Ende der automatisch generierten E-Mail.";
   
    // Versuchen E-Mail zu versenden
    if(!mail($recipient, $subject, $email))
    {
        // Ist dies gescheitert, Fehlermeldung ausgeben
        echo "Es ist ein Fehler beim Versenden der E-Mail aufgetreten,"
             . " eventuell liegt ein Konfigurationsfehler am Server vor.\n\n";
        exit;
    }
   
    // Wenn gewünscht, auf Bestätigungsseite weiterleiten
    if(isset($_POST['redirect']) AND preg_match("=^(http|ftp)://.*\..*$=", $_POST['redirect']))
    {
        header("Location: ".$_POST['redirect']);
        exit;
    }
    // sonst eine Bestätigung ausgeben
    else
    {
        header("Content-type: text/html");
        echo "Die E-Mail wurde erfolgreich versendet.";
        exit;
    }
}

?>

Sie können das PHP Script, sowie ein Beispiel Formular hier (ZIP-Datei, 2,89 KB) downloaden. Weitere Versendungsmöglichkeiten (z.B. an mehrere vordefinierte Absender) werden dort ebenfalls (im Script) erklärt.
Sollen Sie Fehler im Script finden, so nehmen Sie bitte Kontakt zu mir auf.

Nach obenNach unten

Doppeltes Absenden verhindern durch Cookies

Soweit so gut. Wir haben ein Formular, wir wissen, wie man dieses verschickt und wir haben auch ein Script, welches die Daten serverseitig weiterverarbeitet bzw. wir nutzen das Angebot eines kostenlosen Anbieters, der unser Formular verschickt.

Doch was machen, wenn man z.B. bei einer Abstimmung jedem Besucher das Abstimmen nur einmal erlauben will? Das beste dagegen vorzubeugen wäre es, serverseitig eine IP-Sperre bzw. Kontrolle einzubauen, wäre mit PHP auch alles kein großes Problem.
Pech haben da nur die, die keine Ahnung von PHP haben, oder durch einen kostenlosen Anbieter bedingt kein serverseitiges Script hochladen können.

Es gibt aber noch eine Möglichkeit, mittels Javascript ein Cookie (Was ist das?) zu setzen. Jedoch ist man dann wieder von Javascript abhängig, was dazu führt, dass jemand, der Javascript in seinem Browser deaktivier hat immer abschicken kann, so oft und so schnell hintereinander wie er will.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

<head>

<title>Meine tolle Seite zum Cookies setzen!</title>
<script type="text/javascript">
<!--
  function abschicken() {
    if(document.cookie) {
      alert("Sie haben schon mal abschickt!");
      return false;
    }
    else {
      var ablauf = new Date();
	  //Das Cookie verfällt nach 45 Minuten (Angabe in Millisek!)
      var inmin45 = ablauf.getTime() + (45 * 60 * 1000);
      ablauf.setTime(inmin45);
      document.cookie = "Name=Zeitstempel; expires=" +   ablauf.toGMTString();
      return true;
    }
  }
//-->

</script>
</head>
	
<body>

<form name="formname" action="....." method="post">

<input type="text" name="name"><br>

<!-- Hier kommen eventuell noch andere Felder... //-->

<input type="submit" name="abschicken" value="Formular abschicken" onclick="return abschicken();">

</form>

</body>
</html>

Beim Klicken auf den Submit-Button wird die Funktion abschicken() aufgerufen. Diese überprüft, ob schon ein Cookie vorhanden ist. Falls ja, liefert die Funktion false zurück, gibt eine Fehlermeldung aus und der Vorgang des Abschickes wird abgebrochen.
Gibt es jedoch noch kein Cookie, so wird die aktuelle Zeit genommen getTime() und zu ihr werden 45 * 60 * 1000 Millisekunden dazugezählt, was 45 Minuten entspricht. Letztlich wird noch das Cookie gesetzt und die Funktion liefert true zurück, sodass das Formular abeschickt wird.

Der Vorteil von diesem Script ist, dass wenn ein Besucher Javascript deaktiviert hat, er trotzdem noch abschicken kann - allerdings auch gerne mehrfach. Es gibt auch andere Methoden, wo dann bei deaktiviertem Javascript nichts mehr mit abschicken ist.

Man ändere dazu die Zeile return true; um, in document.formname.submit(); und baue das Formular so auf:

<form name="formname" action="....." method="post">

<textarea name="name" rows="2" cols="20"></textarea>
<br>

<!-- Hier kommen eventuell noch andere Felder... //-->
<!-- Allerdings sollte man hier Textfelder vermeiden! //-->

<input type="button" name="abschicken" value="Formular abschicken" onclick="abschicken();">
</form>

Hier ist jetzt kein Submit-Button mehr vorhanden, sondern lediglich ein Button, dem per Javascript eine Funktion zum Cookie setzen und Formular abschicken gegeben wurde.
Wenn nun jedoch Javascript deaktiviert ist, passiert beim Klick auf den Button (zum Ärgernis des Besuchers) gar nichts! Somit wird das Formular nicht abgeschickt. Eine Möglichkeit hat der Besucher aber nicht: Er muss in einem Textfeld einfach Enter drücken, dagegen kann man nichts machen, außer auf Textfelder zu verzichten.

Nach obenNach unten

Valid HTML 4.01! Valid CSS!

Letzte Änderungen: Dienstag, 6. September 2005
© 2005, Dennis Riehle.