PHP Made Simple: Formulare - Teil 3

Im 3. Teil der PHP Made Simple Serie zeigen wir, wie du Formulardaten sicher empfängst, validierst und weiterverarbeitest.

PHP Made Simple: Formulare - Teil 3
Photo by Shahadat Rahman on Unsplash
Teil 2 - PHP Made Simple: Grundlagen
Dies ist Teil 2 der PHP Made Simple Serie. Wir in die Praxis und lernen den Aufbau von PHP-Skripten, die Verwendung von Variablen, Arrays und Kontrollstrukturen kennen.

Dies ist Teil 3 der PHP Made Simple Serie. Teil 2 findest du hier.

Im letzten Beitrag haben wir uns mit Arrays und Kontrollstrukturen in PHP beschäftigt. Nun widmen wir uns einem der wichtigsten Aspekte der Webentwicklung: der Verarbeitung von HTML-Formularen mit PHP. Wir lernen Schritt für Schritt, wie man Formulardaten empfängt, validiert und sicher verarbeitet.

Grundlagen der Formularverarbeitung

PHP wurde ursprünglich entwickelt, um Formulardaten zu verarbeiten - und das ist auch heute noch eine seiner Kernaufgaben. Die Sprache bietet verschiedene Möglichkeiten, um auf Formulardaten zuzugreifen und diese zu verarbeiten. Bevor wir in die Details eintauchen, sollten wir allerdings verstehen, wie der grundlegende Prozess der Formularverarbeitung funktioniert.

💡
PHP wurde ursprünglich für die Formularverarbeitung entwickelt und bietet dafür ausgezeichnete Werkzeuge.

Ablauf der Formularverarbeitung

  1. Der Benutzer füllt ein HTML-Formular aus
  2. Die Daten werden an den Server gesendet
  3. PHP empfängt die Daten über superglobale Variablen
  4. Die Daten werden validiert und verarbeitet
  5. Eine Antwort wird an den Benutzer zurückgesendet

HTML-Formulare erstellen

HTML-Formulare sind die Schnittstelle zwischen Benutzer und Server. Es gibt verschiedene Formularelemente, die wir nutzen können:

<!DOCTYPE html>
<html>
<head>
    <title>Kontaktformular</title>
</head>
<body>
    <form method="POST" action="verarbeitung.php">
        <!-- Textfelder -->
        <label for="name">Name:</label>
        <input type="text" id="name" name="name" required><br><br>
        
        <label for="email">E-Mail:</label>
        <input type="email" id="email" name="email" required><br><br>
        
        <!-- Auswahlfeld -->
        <label for="betreff">Betreff:</label>
        <select id="betreff" name="betreff">
            <option value="anfrage">Allgemeine Anfrage</option>
            <option value="support">Technischer Support</option>
            <option value="feedback">Feedback</option>
        </select><br><br>
        
        <!-- Radiobuttons -->
        <label>Dringlichkeit:</label><br>
        <input type="radio" id="hoch" name="dringlichkeit" value="hoch">
        <label for="hoch">Hoch</label>
        <input type="radio" id="mittel" name="dringlichkeit" value="mittel" checked>
        <label for="mittel">Mittel</label>
        <input type="radio" id="niedrig" name="dringlichkeit" value="niedrig">
        <label for="niedrig">Niedrig</label><br><br>
        
        <!-- Checkboxen -->
        <label>Newsletter abonnieren:</label>
        <input type="checkbox" id="newsletter" name="newsletter" value="ja"><br><br>
        
        <!-- Textbereich -->
        <label for="nachricht">Nachricht:</label>
        <textarea id="nachricht" name="nachricht" rows="4" cols="50" required></textarea><br><br>
        
        <input type="submit" value="Absenden">
    </form>
</body>
</html>
Dieses Beispiel ist bewusst etwas ausführlicher gewählt, um die verschiedenen Eingabefelder zu zeigen. Lass dich davon nicht einschüchtern! Wenn du allerdings doch noch einmal die Grundlagen von HTML festigen willst, schau doch bei unserer HTML und CSS Serie vorbei.
Teil 1 - HTML und CSS: Die Grundlagen
Dies ist Teil 1 der Serie “HTML und CSS”. In diesem und allen folgenden Artikeln beschäftigen wir uns mit den Grundlagen beider Sprachen und lernen gemeinsam alles notwendige um eigene, einfache Seiten mit HTML und CSS zu erstellen.

PHP: Formulardaten empfangen und verarbeiten

Da wir nun wissen, wie ein HTML Formular aufgebaut ist, fokussieren wir uns im folgenden auf die PHP-spezifischen Methoden und Funktionalitäten.
Generell gibt es zwei Möglichkeiten die Formulardaten aus dem method Feld des form Tags an die in actiondefinierte Datei zu übertragen. Die folgenden Code Blöcke müssen dementsprechend auch in der in action definierten Datei liegen.

Die POST-Methode

Die POST-Methode ist der sicherere Weg, Formulardaten zu übertragen, da die Daten nicht in der URL erscheinen. Sie eignet sich besonders für sensible Informationen und größere Datenmengen. In PHP greifen wir über das $_POST-Array auf diese Daten zu:

<?php
  $name = $_POST["name"];
  $email = $_POST["email"];
  
  echo "Hallo, " . $name; //Mittels dem Punkt konkatenieren wir einen String
?>

Die GET-Methode

Die GET-Methode fügt die Formulardaten als Parameter an die URL an. Dies macht sie ideal für Suchfunktionen oder wenn Links teilbar sein sollen. Die Daten sind über das $_GET-Array zugänglich:

<?php
if (isset($_GET["suche"])) {
    $suchbegriff = $_GET["suche"];
    echo "Sie suchen nach: " . $suchbegriff;
}
?>

Sicheres Abrufen von Formulardaten

Ein häufiger Fehler ist es, wie zuvor blind auf Formularfelder zuzugreifen. Stattdessen sollten wir immer prüfen, ob die Daten überhaupt gesendet wurden. Der Null Coalescing Operator (??) in PHP 7+ bietet hierfür eine elegante Lösung. Dies vermeidet Fehler durch falsch- oder undefinierte POST bzw. GET Arrays.

<?php
// Moderne Variante mit Null Coalescing Operator
$name = $_POST["name"] ?? '';

// Traditionelle Variante mit isset
$email = isset($_POST["email"]) ? $_POST["email"] : '';

// Für numerische Werte mit Typkonvertierung
$alter = (int)($_POST["alter"] ?? 0);
?>

Validierung der Formulardaten

Oftmals ist es auch empfehlenswert die Daten vor der Weiterverarbeitung zu validieren.
Einerseits für die Sicherheit, aber auch für die Funktionalität unserer Anwendung. PHP bietet verschiedene integrierte Funktionen für die Datenvalidierung:

Pflichtfeldprüfung

Die Pflichtfeldprüfung geschieht durch die Funktion empty(). Sie überprüft, ob das Eingabefeld leer ist. Wenn das Feld „Name“ leer bleibt, wird die Fehlermeldung „Name ist erforderlich“ in das Fehler-Array ($fehler) aufgenommen. Diese Prüfung sorgt dafür, dass wichtige Felder nicht versehentlich leer bleiben.

if (empty($_POST["name"])) {
    $fehler[] = "Name ist erforderlich";
}
Längenprüfung

Hier wird die Funktion strlen() verwendet, um die Länge des eingegebenen Passworts zu überprüfen. Falls das Passwort weniger als 8 Zeichen lang ist, wird eine Fehlermeldung „Passwort muss mindestens 8 Zeichen lang sein“ hinzugefügt. Diese Prüfung stellt sicher, dass Passwörter eine ausreichende Länge haben, um sicherer zu sein.

if (strlen($_POST["passwort"]) < 8) {
    $fehler[] = "Passwort muss mindestens 8 Zeichen lang sein";
}
E-Mail-Validierung

Eine E-Mail-Validierung wird durchgeführt, um sicherzustellen, dass die eingegebene E-Mail-Adresse im richtigen Format vorliegt. Die Funktion filter_var() mit dem Filter FILTER_VALIDATE_EMAIL überprüft, ob die E-Mail-Adresse gültig ist (z.B. user@example.com). Wenn die E-Mail-Adresse nicht dem gültigen Format entspricht, wird die Fehlermeldung „Ungültige E-Mail-Adresse“ hinzugefügt.

if (!filter_var($_POST["email"], FILTER_VALIDATE_EMAIL)) {
    $fehler[] = "Ungültige E-Mail-Adresse";
}
Nummerische Überprüfung

Eine nummerische Überprüfung kann z.B. auf das Alter angewendet werden. Hierbei prüft die Funktion is_numeric(), ob die Eingabe eine Zahl ist. Zudem wird sichergestellt, dass das Alter nicht negativ ist. Falls der Wert keine Zahl ist oder ein negatives Alter eingegeben wurde, wird die Fehlermeldung „Bitte geben Sie ein gültiges Alter ein“ hinzugefügt.

if (!is_numeric($_POST["alter"]) || $_POST["alter"] < 0) {
    $fehler[] = "Bitte geben Sie ein gültiges Alter ein";
}

Erweiterte Validierung mit Regulären Ausdrücken

Wenn die integrierten Validierungsmöglichkeiten nicht mehr ausreichen, können auch reguläre Ausdrücke (RegEx) verwendet werden. RegEx ermöglicht komplexe Mustererkennung in Strings. Sie sind besonders nützlich für die Validierung formatierter Eingaben:

<?php
// Benutzername: nur Buchstaben und Zahlen
if (!preg_match("/^[a-zA-Z0-9]+$/", $_POST["benutzername"])) {
    $fehler[] = "Benutzername darf nur Buchstaben und Zahlen enthalten";
}

// Telefonnummer: 6-15 Ziffern
if (!preg_match("/^[0-9]{6,15}$/", $_POST["telefon"])) {
    $fehler[] = "Ungültige Telefonnummer";
}

// PLZ: genau 5 Ziffern (für Deutschland)
if (!preg_match("/^[0-9]{5}$/", $_POST["plz"])) {
    $fehler[] = "Ungültige Postleitzahl";
}
?>

Komplettes Beispiel: Ein Kontaktformular

Lasst uns nun alles gelernte in einem einfachen Beispiel anwenden. Hierfür eignet sich ein Kontaktformular ideal.
Wir benötigen hierfür einmal den entsprechenden HTML-Teil, also das Formular selber:

<!DOCTYPE html>
<html lang="de">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Kontaktformular</title>
</head>
<body>
    <h2>Kontaktformular</h2>

    <form action="auswertung.php" method="POST">
        <div>
            <label for="name">Name:</label>
            <input type="text" id="name" name="name" required>
        </div>

        <div>
            <label for="email">E-Mail:</label>
            <input type="email" id="email" name="email" required>
        </div>

        <div>
            <label for="nachricht">Nachricht:</label>
            <textarea id="nachricht" name="nachricht" required></textarea>
        </div>

        <div>
            <input type="submit" value="Absenden">
        </div>
    </form>
</body>
</html>

Da wir kein CSS-Styling angewendet haben, schaut das Kontaktformular zwar noch etwas provisorisch aus, allerdings tut das vorerst nichts zur Sache:

In dem oben gezeigten form-Tag referenzieren wir auf die Datei auswertung.php. Diese schaut wie folgt aus:

<?php
// Eingabedaten sicher abrufen und trimmen
$name = trim($_POST['name'] ?? '');
$email = trim($_POST['email'] ?? '');
$nachricht = trim($_POST['nachricht'] ?? '');

// Einfache Validierungen
$fehler = [];

if (empty($name)) {
	$fehler[] = "Name ist erforderlich";
}

if (empty($email) || !filter_var($email, FILTER_VALIDATE_EMAIL)) {
	$fehler[] = "Bitte geben Sie eine gültige E-Mail-Adresse ein";
}

if (empty($nachricht)) {
	$fehler[] = "Nachricht ist erforderlich";
}

// Wenn keine Fehler vorhanden sind, wird eine Willkommensnachricht angezeigt
if (empty($fehler)) {
	echo "<h2>Willkommen, $name!</h2>";
	echo "<p>Ihre E-Mail-Adresse: $email</p>";
	echo "<p>Ihre Nachricht: $nachricht</p>";
} else {
	// Fehlermeldungen anzeigen
	echo "<h2>Fehler:</h2>";
	foreach ($fehler as $fehlermeldung) {
		echo "<p style='color: red;'>$fehlermeldung</p>";
	}
}
?>

💡
Bestimmt hast du gemerkt, dass eine neue Methode in dem Beispiel enthalten ist: trim():
Diese entfernt Leerzeichen (und andere vorangestellte Zeichen) am Anfang und Ende eines Strings. Sie wird häufig verwendet, um Eingabewerte zu bereinigen, die von Benutzern in Formularen eingegeben wurden, damit keine unerwünschten Leerzeichen oder Steuerzeichen die Verarbeitung oder Validierung der Eingabedaten beeinträchtigen.

Geben wir nun valide Daten in das HTML-Kontaktformular ein und senden diese ab, werden wir auf auswertung.php weitergeleitet. Hier werden die Daten ausgewertet und eine Willkommensnachricht erscheint:

Geben wir eine ungültige E-Mail Adresse an, bekommen wir eine Fehlermeldung:


Fazit

Super, du hast es geschafft! Nun solltest du erste einfache Formulare auswerten können. Dies ist ein fundamentaler Bestandteil der Webentwicklung mit PHP. Durch die Kombination von gut strukturierten Formularen, sorgfältiger Validierung und robusten Sicherheitsmaßnahmen können wir zuverlässige und sichere Webanwendungen erstellen.

Im nächsten Teil unserer Serie werden wir uns noch mit der Datenbankanbindung in PHP beschäftigen. Dort lernen wir, wie wir die validierten Formulardaten sicher in einer Datenbank speichern und wieder abrufen können.

Bis dahin gilt: Üben, Üben, Üben! Bis zum nächsten mal! 👋