Eigenes Kontaktformular mit PHP.

25.09.2009

Dieses Tutorial soll einen Einstieg in das Schreiben von Kontaktformularen mit PHP sowie Reguläre Ausdrücke bieten. Vorausgesetzt werden Grundkenntnisse in PHP und HTML, insbesondere über input-Elemente.

Es geht los!

Zunächst schreiben wir unser Kontaktformular in HTML (ein bisschen PHP ist auch dabei):

<form action="<?=$_SERVER['PHP_SELF']?>" method="post">
    <table>
    <tr>
        <td>
            <label for="name">Name</label>
        </td>
        <td>
            <input type="text" name="name" value="" id="name" />
        </td>
    </tr>
    <tr>
        <td>
            <label for="email">Email</label>
        </td>
        <td>
            <input type="text" name="email" value="" id="email" />
        </td>
    </tr>
    <tr>
        <td>
            <label for="text">Text</label>
        </td>
        <td>
            <textarea name="text" id="text"></textarea>
        </td>
    </tr>
    </table>
    <input type="submit" value="Senden" />
</form>

Nun wollen wir den Code analysieren. Der PHP-Code in Zeile 1 dient dazu, den Namen der Datei ($_SERVER['PHP_SELF']) auszugeben (<?=…?>), damit wir nicht auch noch die Datei bearbeiten müssen, wenn wir sie schon umbenennen. Die Tabelle im Formular habe ich nur der Übersichtlichkeit halber eingefügt. Mit dem label-Tag definieren wir ein Label (eine Kennung) für ein Formularelement, damit der Nutzer, wenn er auf die Aufschrift „Name“ klickt, gleich im dazugehörigen Feld tippseln kann. In den input-Elementen sowie in der textarea darf der Nutzer seine geistigen Ergüsse niederschreiben. Die ids dienen dazu, dass die labels auch ihre Herrchen finden (for="…"). Mit dem Attribut name sagen wir PHP, dass es das Formularelement unter angegebenem Namen verfügbar machen soll. Schließlich geben wir dem Nutzer mit dem <input type="submit"> die Chance, dass auch jemand anderes seine einfälle liest.

PHP im Anmarsch.

Jetzt geht’s an’s eingemachte. Mit unserem PHP wollen wir folgendes erreichen:

  1. Erst einmal etwas vom Nutzer empfangen.
  2. Die Eingaben auf ihre Richtigkeit überprüfen, denn
    1. der Nutzer ist immer böse und
    2. der Nutzer muss vor seiner eigenen Dummheit gerettet werden.
  3. Die Nachricht anschließend versenden.

Dazu benutzen wir diesen Code, an angegebener Stelle fügen wir den vorhandenen Code ein:

<?php
$name = $_POST['name']; // mit $_POST wird auf die Inhalte der input-Tags zugegriffen.
$mail = $_POST['email'];
$text = $_POST['text'];

$deine_email = "hans.wurst@example.com"; // an diese Adresse wird die Email versendet

// es folgt eine einfache Überprüfung, ob die Felder nicht leer sind
if (!empty($name) and !empty($mail) and !empty($text)) {
    // jetzt kommt der Reguläre Ausdrück für den Namen, Reguläre Ausdrücke werden später beschrieben
    $rname = "/^[A-ZÄÖÜ][a-zäöü]+(-[A-ZÄÖÜ][a-zäöü]+)? (von )?(( und)? zu )?[A-ZÄÖÜ][a-zäöüß]+(-[A-ZÄÖÜ][a-zäöüß]+)?$/";
    // die Email wird mit einer anderen Funktion geprüft
    // für den Text gibt es vorerst keine weitere Überprüfung
    if (preg_match($rname, $name) and filter_var($mail, FILTER_VALIDATE_EMAIL) !== false and $text = htmlspecialchars($text)) {
        // fast bereit für den Versand
        $text = $name." mit der IP ".$_SERVER['REMOTE_ADDR']." und der Email-Adresse ".$mail." hat dir am ".date("d.m.Y")." um ".date("H:i")." Uhr die folgende Nachricht gesendet:\n".$text;
        $text = wordwrap($text, 70); // siehe http://de.php.net/manual/de/function.mail.php Parameter "message"
        mail($deine_email, "Nachricht vom Kontaktformular", $text, "From: $mail");
        //Erfolg!
        echo "Email erfolgreich versendet!";
        $kann_ausblenden = true;
    } else {
        echo "Dir ist ein Fehler beim Ausfüllen unterlaufen.";
    }
} else {
    echo "Keines der Felder darf leer sein.";
}
if (!$kann_ausblenden) {
?>
<h1>Kontaktformular hierher</h1>
<? } ?>

Analyse: in den ersten 3 Zeilen (PHP-Tags ausgeschlossen) werden erst einmal Variablennamen festgelegt, damit man „schöner“ auf die Formularinhalte zugreifen kann. Einige werden mir in diesem Punkt widersprechen, diese können dann gerne den Code nach ihren Bedürfnissen umschreiben. Danach wird in der Variable $deine_email die Emailadresse festgelegt, an die die Email gesendet werden soll. In der if-Abfrage überprüfen wir zunächst, ob der Nutzer überhaupt etwas eingegeben hat, dann legen wir einen tollen Regulären Ausdruck fest, mit dem wir gleich danach überprüfen, ob der Name das richtige Format hat. Die Email-Adresse überprüfen wir mit der Funktion filter_var, die mit der Konstante FILTER_VALIDATE_EMAIL gleich weiß, was wir wollen. Im $text werden nur die gefährlichen Zeichen ersetzt. Wenn bis hier hin alles gut gelaufen ist, schreiben wir noch eine nützliche Nachricht vor den eigentlichen Mailtext und versenden sie. Beim ganzen Prozess wird der Nutzer stets informiert, ob er etwas falsch gemacht hat oder nicht (wenn auch nur sehr rudimentär). Die Variable $kann_ausblenden wird übrigens verwendet, um das Kontaktformular nach erfolgreichem Absenden zu verstecken, damit der Nutzer nicht auf dumme Gedanken kommt.

Die Magie der Regulären Ausdrücke:

Bisher hatten wir nur einen Regex (Abk. f. engl. Regular Expression (dt. Regulärer Ausdruck)) gesehen, nämlich den zur Überprüfung des Namens. Für die Scrollfaulen ohne Riesenbildschirm ist er hier noch einmal zu finden:

/^[A-ZÄÖÜ][a-zäöü]+(-[A-ZÄÖÜ][a-zäöü]+)? (von )?(( und)? zu )?[A-ZÄÖÜ][a-zäöüß]+(-[A-ZÄÖÜ][a-zäöüß]+)?$/

Dieser Reguläre Ausdruck findet sowohl normale Namen wie z.B. Hans Wurst, als auch Namen mit Umlauten (Rosa Schlüpfer) und solche mit Adelstiteln und Doppelnamen (Karl-Theodor zu Guttenberg, Hans-Peter Kerkeling, Rosa Flecken-Löser, Dörte Mayer). Der genaue Aufbau von Regulären Ausdrücken wird in einem kommenden Tutorial beschrieben.

Johаnnes

TopOfBlogs