von Michael Christoph
Wer ein Formular mit dem »mailto:«-Kommado verschicken will, stößt schnell auf Probleme. Nicht alle Browser unterstützen das direkte Versenden von E-Mails z.B. verschiedene Versionen des Internet Explorers von Microsoft. Außerdem können nicht alle Browser mit der Kodierungsanweisung umgehen. Das führt dazu, dass eine einzige, URL-kodierte Zeile in der Mail ankommt, was natürlich recht schwer zu lesen ist. Es gibt aber auch Fälle, in denen eine leere Mail den Empfänger bei Versenden per »mailto:«-Kommado erreichte. Mit PHP kann man das Problem aber lösen und das sehr flexibel.
Ein Formular
muss her
Wir werden hier nicht näher auf PHP selber eingehen, dazu gab es im Amiga Magazin verschiedene Artikel. Wer PHP auf seinem eigenem Amiga testen möchte, muss zuerst Apache einrichten, damit dieser als Webserver fungiert. Dieser ist in der Regel auch bereits für das aktuelle PHP4 konfiguriert. Ein ausführlicher Bericht zur Einrichtung von Apache, PHP und der Datenbank »mySQL« finden im Amiga-Magazin 8/2001.
|
Zur Ausgabe von HTML-Code stellt PHP die Befehle echo und printf zur Verfügung.
Während der erste nur den angebenen Text wiedergibt, kann der zweite (wie
von C bekannt) Formatierungsangaben enthalten. Beide erzeugen keinen Zeilenvorschub.
Wer später den erzeugten HTML-Code ansehen möchte (z.B., um Fehler
zu finden), sollte jede HTML-Zeile mit einem Zeilenvorschub (Escape-Sequenz
\n) versehen. Der Zeilenumbruch dient ausschließlich dazu, den Quelltext
für den HTML-Browser mehrzeilig zu verfassen. Eine neue Zeile in der Browseranzeige
wird nur bei einer <br> Anweisung begonnen. Im Fehlerfall zeigt der Browser
lediglich einen kurzen Hinweistext mit Zeilennummer an. Anhand dieser Meldung
kann man nach fehlerhafter Syntax suchen.
In Listing 1 sehen Sie, dass man auch HTML-Anweisungen und PHP-Code beliebig
mischen kann. Wichtig ist nur, dass der PHP-Code durch <?php und ?> eingeschlossen
wird. Wie gesagt, könnte bei unserem Beispiel auch alles direkt in HTML-Anweisungen,
ohne eine einzige Zeile PHP-Code, geschrieben werden.
Der Formularmailer
Speichern Sie das Listing 1 unter dem Namen
formmail1.php im Root-Verzeichnis für die Webdokumente ab. Im Browser rufen
Sie die Seite mit http:// <URL>/form.php
auf. Bei einem lokal installierten Webserver (z.B. Apache) geht das so:
http://localhost/form.php
|
Beim Klick auf den Absenden-Button passiert etwas Unerwartetes: Das Namensfeld
wird geleert, und trotzdem ist alles scheinbar korrekt. Wird der Absenden-Knopf
gedrückt, wertet der Browser die FORM-Anweisung aus und findet dort unter
ACTION eine Datei, die er aufruft und die Formulardaten mitgibt. Im Beispiel
handelt sich um unsere eigene Datei (das Formular) diese wird wieder aufgerufen.
In der Praxis sollte aber eine HTML-Seite mit der Antwort gesendet werden, die
der Browser anzeigt. Eine andere Variante: Die Formularseite wird erneut aufgerufen
und zeigt die Anwort automatisch an. Was uns noch fehlt, ist also die Weiterverarbeitung
der Formulardaten und die entsprechende Reaktion.
Über empty() wird festgestellt, ob die Variable gefüllt ist oder nicht.
Wird die Datei nun vom Browser zum ersten Mal abgefragt, gibt es die Variable
gar nicht. Erst wenn der Benutzer den Abschicken-Knopf verwendet, füllt
PHP für uns automatisch die folgenden drei Variablen: $name, $email und
$subject (entspricht dem Namen aus dem Formular). Während die ersten beiden
auch leer sein können, wenn vom Benutzer nichts im Formular eingetippt
wurde, ist die dritte Variable auf alle Fälle vorhanden. Sie dient uns
daher als Unterscheidung, ob nur das Formular angezeigt werden soll oder ob
die Formulareingaben durch das Skript verarbeitet werden müssen.
Mailen in PHP
Neu ist in Listing 2 auch die mail()-Funktion.
Wie der Name schon vermuten lässt, lassen sich damit Mails versenden
eine korrekt installierte PHP-Umgebung vorausgesetzt. Erkundigen Sie sich bei
Ihrem ISP und lassen Sie das Setup des Servers entprechend ändern. Die
Syntax für mail() lautet:
mail($empfaenger,$titel,
Â$text);
Die Parameter für die mail()-Funktion haben folgende Bedeutung:
$empfaenger: E-Mail-Adresse des Empfängers, z.B. formular@localhost.
$titel: Subject-Zeile der Mail (z.B. »Formularanforderung«
oder »Anfrage«).
$text: Inhalt der Mail. Beim unserem Formular sollte es nur Text sein.
Eventuelle Attachments bei anderen Formularen müssen entsprechend kodiert
und an den Text angehangen werden. Auf dieses Thema wollen wir aber an dieser
Stelle nicht eingehen.
Was in unserem Fall noch nicht so wichtig ist, aber trotzdem nicht außer
Acht gelassen werden sollte, ist, die Gültigkeit der Eingabewerte festzustellen.
Wo immer die Daten von Hand eingegeben werden, können durch Unachtsamkeit
oder auch Absicht fehlerhafte Eingaben erfolgen. Man kann zwar in vielen Fällen
gar nicht feststellen, was gültige Eingaben sind, aber man kann etwa bei
E-Mail-Adressen zumindest auf diekorrekte Syntax achten: Text, dann ein AT-Zeichen
gefolgt von mindestens drei Zeichen Internetadesse und abschließend, mit
Punkt getrennt, eine Domain-Kennung. Eine entsprechende Testroutine finden Sie
im Amiga Magazin 10/2001 oder auf unserer Webseite. In diesem Beispiel wird
die Richtigkeit der E-Mail-Adresse mit Hilfe von regular Expressions getestet.
In anderen Fällen kann man prüfen, ob das Feld einen Inhalt aufweist
oder leer gelassen wurde. Diese Angaben können nun einerseits direkt im
Browser per Java-Script überprüft werden. Da aber nicht jeder Browser
den JavaScript Code ausführt (z.B. IBrowse auf dem Amiga), ist eine Überprüfung
der Daten direkt im PHP Code vorzuziehen.
Der else-Zweig der Routine muss erweitert werden, wie in Listing
3 zu sehen.
Mehr Komfort
durch Konfigurierbarkeit
Der Formularmailer funktioniert jetzt schon recht gut. Er hat allerdings einen
kleinen Schönheitsfehler: Die Mails gehen bis jetzt immer an den Schreiber.
Beabsichtigt ist aber ein Anforderungs-Mailer, der die eingegebenen Daten an
einen speziellen Empfänger weitermailt. Je nach Anforderung kann die E-Mail
evtl. an unterschiedliche Empfänger gesendet werden. Deshalb darf die E-Mail-Adresse
nicht im PHP-Code festgelegt werden. Sie wird je nach Anforderung dynamisch
verwendet.
|
Um die Sache noch zu verfeinern, wird das Formular für verschiedene Anforderungen
durch das Skript angepasst. Das bedeutet auch: Das Forumlar muss nicht immer
identisch aussehen und kann auch unterschiedliche Eingabefelder haben. An dieser
Stelle kann man sehr flexible Skripte schreiben. Deswegen dürfen auch die
Formulardaten selber nicht mehr direkt über die Variablen abgefragt werden.
Dadurch kann auch das Formular nicht mehr automatisch generiert werden, sondern
muss als ganz reguläre HTML-Datei auf dem Server vorliegen.
Für die frei wählbare Empfängeradresse gibt es eine ganz einfache
Lösung: versteckte Formularfelder. Diese erden als Typ hidden definiert
und erhalten per VALUE die gewünschte Belegung. Eine weitere Möglichkeit:
Je nach Anforderung weist das Skript bei der Auswertung die passende Adresse
der Empfänger-Variablen automatisch zu.
Aber auch für die variable Anzahl der Formularfelder gibt es eine Lösung.
Je nach der Formular-Versandmethode (METHOD) werden alle Felder in $HTTP_POST-_VARS
oder $HTTP_GET_-VARS gefüllt. Da wir die Methode METHOD=POST verwenden,
stehen die Werte in der ersten Variablen. Die Post-Methode hat auch noch den
Vorteil, dass in der URL-Zeile des Browsers die Argumente nicht auftauchen und
somit auch nicht vom Benutzer manipuliert werden können (wie es bei GET
der Fall wäre). Solange Sie testen, ist es empfehlenswert, die GET-Methode
zu verwenden. Dann sehen Sie in der URL-Leiste des Webbrowsers die Werte für
die übergebenen Variablen und können diese besser kontrollieren. Funktioniert
der Skript, wechseln Sie einfach die Methode.
In der Variablen sind die Einträge im Syntax Feldbezeichner=Wert enthalten
und durch ein kaufmänisches Und (&) voneinander getrennt. Natürlich
bietet PHP auch Kommandos zur Aufsplittung dieses Strings in assoziative Arrays
ein Beispiel zur Aufsplittung sehen Sie in Listing
4.
Durch foreach wird jedes Wertepaar durchlaufen und auch gleich noch aufgesplittet.
Dabei entstehen $key für den Feldbezeichner und $arg für die Benutzereingabe.
Als Nächstes wird noch auf die beiden Hidden-Variablen geprüft, über
die der Empfänger und auch der Titel (Subject) der Mail festgelegt werden
kann. Alles andere (das Absenden-Feld) wird als fortlaufender Text aufbereitet.
Dabei gibt es eine Ausnahme die Variable ok. Sie zeigt, ob das Formular
gesendet wurde.
Die Daten werden jetzt zusammengefasst, und per mail()-Funktion erfolgt wieder
der Versand. Zum Abschluss gibt das Skript Rückmeldung für den Nutzer
in HTML aus, dass die Anfrage korrekt verarbeitet wurde.
Damit hätten wir jetzt unser gestecktes Ziel erreicht: einen universell
einsetzbaren Formularmailer. Das Beispiel soll auch zum Experimentieren einladen.
Sie können neben verschiedenen Formularen und Empfängeradressen auch
das Design für das Formular verändern. Das gilt auch für die
Anwortseite. Hier gibt es viele Möglichkeiten, ein Webforumlar flexibel
per PHP-Skript zu gestalten und die Routine immer wieder für andere Webprojekte
einzusetzen.
lb
Kommentare, Fragen, Korrekturen und Kritik bitte an Webmaster
AMIGA schicken.
Zuletzt aktualisiert am 1. 9. 2002.