Validierung und Fehlerbehandlung in PHP

Erste Schritte: Validierung & Fehlerbehandlung in PHP

Wenn Benutzer Formulardaten abschicken oder externe Eingaben an dein PHP-Skript gelangen, ist es wichtig, diese Eingaben zu überprüfen und mögliche Fehler sauber zu behandeln. Eine robuste Validierung beugt nicht nur falschen Daten oder Programmabstürzen vor, sondern ist auch ein essenzieller Sicherheitsaspekt. In diesem Tutorial lernst du, wie du Eingaben validieren und bei Problemen angemessen reagieren kannst.

1. Warum Validierung?

  • Datenqualität: Stelle sicher, dass z. B. E-Mail-Adressen wirklich E-Mail-Formate haben oder eine Zahl in einem bestimmten Bereich liegt.
  • Sicherheit: Verhindere XSS, SQL-Injections und andere Angriffe, indem du Eingaben filterst oder zurückweist.
  • Benutzerfreundlichkeit: Ein klares Fehlermeldungssystem hilft den Nutzern, falsche Eingaben zu korrigieren.

2. Grundlegende Validierungsstrategien

Bei der Validierung prüfst du Eingaben gegen bestimmte Kriterien, z. B. ob sie ein Pflichtfeld ausfüllen, ob sie einen bestimmten Datentyp haben oder ein bestimmtes Muster (Regex) erfüllen. Dieser Prozess kann sowohl im Frontend (JavaScript) als auch im Backend (PHP) stattfinden – aber besonders der Server (PHP) ist verbindlich, da man Frontend-Validierung umgehen kann.

// Beispiel: Prüfe, ob ein Benutzername nicht leer ist
if (empty($_POST['username'])) {
    $errors[] = "Bitte gib einen Benutzernamen ein.";
}

// Prüfe, ob eine E-Mail valide ist
if (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
    $errors[] = "Keine gültige E-Mail-Adresse.";
}

Hier wird filter_var() mit dem FILTER_VALIDATE_EMAIL genutzt, eine eingebaute PHP-Funktion, um E-Mail-Formate zu überprüfen.

3. Fehlermeldungen sammeln & ausgeben

Eine gängige Praxis ist, alle Fehler in einem Array zu sammeln. Falls dieser Array nicht leer ist, zeigst du die Fehler dem Nutzer an. Beispielsweise:

$errors = [];

// Validierungen
if (strlen($_POST['pass']) < 6) {
    $errors[] = "Das Passwort muss mindestens 6 Zeichen lang sein.";
}

// Auswertung
if (!empty($errors)) {
    foreach ($errors as $err) {
        echo "<li>" . htmlspecialchars($err) . "</li>";
    }
} else {
    echo "Formular ist gültig, weiter zur Verarbeitung...";
}

Auf diese Weise kriegt der Benutzer eine Liste an Hinweisen, was noch fehlt oder inkorrekt ist.

4. Filter und Validierungsfunktionen

PHP bietet unter filter_var() bzw. filter_input() einige vordefinierte Filter:

  • FILTER_VALIDATE_EMAIL: Prüft E-Mail-Format
  • FILTER_VALIDATE_INT: Prüft, ob es eine Integer-Zahl ist (optional min-/max-Range angeben)
  • FILTER_VALIDATE_FLOAT, FILTER_VALIDATE_IP etc.

Möchtest du noch flexiblere Überprüfungen, kannst du preg_match() mit regulären Ausdrücken nutzen. Beispiel:

// Prüfe, ob $_POST['username'] nur Buchstaben/Ziffern enthält
if (!preg_match("/^[A-Za-z0-9]+$/", $_POST['username'])) {
    $errors[] = "Benutzername darf nur Buchstaben und Zahlen enthalten.";
}

5. Fehlerbehandlung (Exception Handling)

Neben der Validierung von Benutzereingaben kann es zu Fehlern bei Datenbankzugriffen, Datei-Operationen oder anderen Programmteilen kommen. Ein moderner Ansatz ist, Ausnahmen (Exceptions) zu verwenden.

try {
    // z. B. Datenbankoperation
    $pdo = new PDO($dsn, $user, $pass);
    // ...
} catch (PDOException $e) {
    // Fehler beim DB-Zugriff
    echo "Datenbankfehler: " . $e->getMessage();
}
  • try: Codeblock, in dem Fehler entstehen können
  • catch (ExceptionType $e): Fängt die Ausnahme ab und behandelt sie (z. B. Fehlermeldung ausgeben, Log schreiben)

6. Benutzerfreundliches Feedback

Wenn du dem Nutzer Fehlermeldungen gibst, ist es ratsam:

  • Klartext: Sage, was genau schief lief (z. B. „Die E-Mail ist ungültig“ statt nur „Error 123“).
  • Nicht zu viel verraten: Aus Sicherheitsgründen solltest du keine internen Fehlermeldungen (z. B. „DB Connection failed“ mit Pfad und User) offenlegen.
  • Werte behalten: Wenn ein Formular fehlschlägt, gib dem Nutzer die bereits eingegebenen Daten zurück, damit er es nicht neu eintippen muss.

7. Beispiel-Workflow

// form.php
<form action="validieren.php" method="POST">
    <label>E-Mail:</label>
    <input type="text" name="email">
    
    <button type="submit">Absenden</button>
</form>

// validieren.php
$errors = [];

// 1) Daten holen
$email = $_POST['email'] ?? '';

// 2) Validieren
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    $errors[] = "Keine gültige E-Mail.";
}

// 3) Fehler oder Erfolg?
if ($errors) {
    // Fehler ausgeben oder zurückleiten
    foreach ($errors as $err) {
        echo "<li>" . htmlspecialchars($err) . "</li>";
    }
} else {
    // Erfolg
    echo "Formular ist OK. Weiterverarbeitung...";
}

Das zeigt einen einfachen Validierungsablauf:
Daten abholen, Check durchführen, Fehlerliste befüllen,
je nach Ergebnis (Fehler oder nicht) entsprechend reagieren.

Fazit

Validierung und Fehlerbehandlung sind grundlegende Bestandteile in der Entwicklung von sicheren und stabilen PHP-Anwendungen. Indem du Benutzereingaben konsequent überprüfst (z. B. mit filter_var oder preg_match) und Ausnahmen (Exceptions) für systemkritische Fehler nutzt, stellst du sicher, dass deine Anwendung robust gegen falsche Eingaben, Angriffe und unerwartete Situationen bleibt. Eine klare Fehlerkommunikation und sinnvolle Rückmeldungen steigern zudem die Benutzerfreundlichkeit. Mit diesen Prinzipien bist du gut gerüstet, um dein Projekt vor typischen Problemen zu bewahren.