Donnerstag, 21. Februar 2008

PHP- und HTML-Baustein: Kontaktformular (formmailer)

Gerade habe ich wieder eine Webseite fertiggestellt, in die ich ein Kontaktformular einzubauen hatte. Und wie immer dasselbe: Lösung aus dem letzten Projekt heraussuchen, überfliegen und Änderungen vornehmen. Entsprechend meinem Vorsatz, künftig solche Bausteine zu bereinigen und zu bearbeiten, sie dann anschließend als Baustein im Webworker-Archiv zu hinterlegen, habe ich eine Extrastunde investiert und das Skript überarbeitet. Alle Editierleichen mussten raus und der Code wurde auskommentiert. Nachfolgender Code ist das Ergebnis.

Das Thema taucht laufend in den Foren auf. Gefragt wird nach Konzept, Struktur und geeigneten formmailer-Skripten.

Nachfolgendes Skript wird in diejenige Seite eingebaut, in der das Kontaktformular erscheinen soll. Es verweist auf sich selbst, verarbeitet dort auch die übergebenen Daten und gibt Fehlermeldungen aus. Das Formular wird wiederholt, und im Falle eines Errors die fehlerhaften Daten voreingetragen. Vom Konzept her entspricht es den üblichen Empfehlungen auf entsprechende Foren-Fragen.

Das Skript ist bereits längere Zeit in mehreren Projekten im Einsatz. Es kann beliebig abgeändert und natürlich frei verwendet werden kann.


##### Ziel-email-Adresse, unbedingt ändern ######
$mailto = "irgendwer@irgendwas.de"; // ÄNDERN


##### Allgemeine Variablen vorbereiten
$formactionziel= $_SERVER["PHPSELF"];
$zeit=strftime("%c", time());
$mail_text="Anfrage vom $zeit \n \n";
$betreff= "Anfrage";
$from="From: Kontaktformular@".$_SERVER['SERVER_NAME'];
$meldung="";


######### Die HTML-Ausgabe beginnt
// es beginnt der gesamte HTML-Abschnitt, in welchem Formular und oder Meldungen erscheinen
echo "<div style='margin-left:2cm; font-family:Arial; font-size:10pt'>";

########## Abschnitt 1 ##########
// folgt ein Abschnitt, der nur greift, wenn bereits Daten übersandt wurden; die Daten werden verarbeitet, um sie entweder zur Speicherung oder, bei Fehlern im erneut aufzurufenden Formular voreinzutragen.

if (isset($_POST["submit"])) {

// übergebene Variablen ermitteln:
$felder="absendername strasse plz ort tel absenderemail anmerkung";
$felder=explode(" ", $felder);
unset($errors);
foreach($felder as $tmp) {

if(trim(stripslashes($_POST[$tmp]))=="asdf") $errors[]="$tmp = asdf? Was soll das!?";
// kleines Gimmick für den Fall, dass jemand rumspielt und asdf eingibt

$$tmp=trim(stripslashes($_POST[$tmp]));
}


// Sicherheits-Überprüfung der Daten aus Übervorsicht,
// eigentlich nicht nötig, sofern $mailto oben fest definiert ist

if ($mailto != "" and !preg_match("/^[^@]+@.+\.\D{2,5}$/", $mailto)) {
$errors[] = "die E-Mail-Adresse sieht nicht richtig aus<br />";
$absenderemail="!!??!!";
}

// Pflichtfelder checken ----------------------------------------------------------- evtl. ÄNDERN -----------------
// soweit eine der folgenden Felder KEIN Pflichtfeld ist, muss man
// die entsprechende Zeile löschen oder auskommentieren

if(empty($ort)) $errors[]="Ort fehlt<br />";
if(empty($plz)) $errors[]="Postleitzahl fehlt<br />";
if(empty($strasse)) $errors[]="Straße fehlt<br />";
if(empty($tel)) $errors[]="Telefonnummer fehlt<br />";
if(trim($anmerkung)=="asdf") $errors[]="Hast Du nichts Besseres zu tun?";


// Wenn keine Fehler da sind, kann die Post abgehen.
if (empty($errors)) {
$mail_text="
Anfrage
-------
Name: $absendername
Strasse: $strasse
Ort: $plz $ort
Telefon: $tel
Email: $absenderemail
Nachricht:
$anmerkung ";
// keine HTML-Zeilenumbrüche; die hier notierten Zeilenumbrüche erscheinen 1:1 im email-Text

// Refererdaten vorbereiten, um sie der email-Nachricht hinzufügen zu können
$referer=$_SERVER["HTTP_REFERER"];
$IP=$_SERVER['REMOTE_ADDR'];
$remotehost=$_SERVER['REMOTE_HOST'];

$refererdaten="
http_referer: $referer
IP=$IP
remote_host=$remotehost
";

// referer-Daten an den email-Text anhängen

$mail_text.="
--------------
Protokollierung interner Daten für Kontrollzwecke:
$refererdaten
";

// mail versenden
if (@mail($mailto, $betreff, $mail_text, $from)) {
$sent = true;
}else {
$errors[] = "keine Verbindung zum Mailserver - bitte nochmal versuchen<br />";
}

}
}

// Bestätigungsanzeige für den User

if($sent===true) {
echo "<p style='color:green; font-size:13pt'><b>Danke!</b><br />Nachricht erfolgreich versandt.</p>";

// hier könnte man auch abbrechen und link zurück auf die eigene Seite mit dem blanken Formula setzen,
// anderenfalls muss man zunächst die Formularinhalte wie folgt löschen
foreach($felder as $tmp) {
$$tmp="";
}
// Ende des Löschens der Formularinhalte
}

echo "Neue Nachricht: <br /><hr><br />";

###### Ende Abschnitt 1 ############

###### Abschnitt 2 #############
// Dieser Abschnitt schließt am Abschnitt 1 an, und greift nur, wenn dort ein Fehler bemerkt wurde
// sie bereitet im Falle einer Fehlermeldung die Fehlerhinweise vor
// und bereitet die übersandten Daten auf, um sie im Formula voreinzutragen

if (empty($sent)) {
if(isset($errors)) {
echo "<p>Hoppla. Fehler aufgetreten:</p><ul>";
foreach($errors as $f) {
echo "<li>".$f."</li>";
}
echo "</ul><br /><br />";

$action=$_SERVER["PHP_SELF"];

// folgendes wird in ähnlichen Skripten gern übersehen; wenn in Eingabefeldern ein Apostroph war, wurde das beim Übersenden mit slashes maskiert, und diese Slashes würden im Eingabefeld erscheinen. Diese müssen entfernt werden. Beim erfolgreichen Speichern in eine Datenbank dagegen übernimmt das php-Programm die Entfernung automatisch, so dass obige Routine nur notwendig ist, wenn die Variablen auf der Webseite wiedergegeben werden müssen

$absendername=htmlentities(stripslashes($absendername));
$absenderemail=htmlentities(stripslashes($absenderemail));
$strasse=htmlentities(stripslashes($strasse));
$anmerkung= htmlentities(stripslashes($anmerkung));
$ort=htmlentities(stripslashes($ort));


} // ende errors
}
####### Ende Abschnitt 2 ########

####### Abschnitt 3 #############
// ab hier der normale Content dieser Seite, der beim Erstaufruf erscheint, der Content besteht
// aus dem Formular, evtl. mit voreingetragenen Daten im Falle einer misslungenen Absendung
echo "
<form action='$formactionziel' method='post'>
<INPUT TYPE='TEXT' NAME='absendername' value='$absendername' SIZE='42'> Name, Vorname<br />
<INPUT TYPE='TEXT' NAME='strasse' value='$strasse' SIZE='42'> Straße und Hausnr.<br />
<INPUT TYPE='TEXT' NAME='plz' value='$plz' SIZE='6'> PLZ<br />
<INPUT TYPE='TEXT' NAME='ort' value='$ort' SIZE='42'> Ort<br />
<INPUT TYPE='TEXT' NAME='tel' value='$tel' SIZE='42'> Telefon<br />
<INPUT TYPE='TEXT' NAME='absenderemail' value='$absenderemail' SIZE='40'> E-Mail (optional)<br /><br />
Nachricht:<br />
<textarea name='anmerkung' cols='40' rows='10'>$anmerkung</textarea><br />
<br />
<INPUT TYPE='SUBMIT' name='submit' VALUE='Absenden'>
</form>
<br />
</div>";

Keine Kommentare: