Kodokon kodokon.com

Formulare: Daten empfangen und validieren

Behandle Formulare wie ein Profi: die richtige HTTP-Methode, strenge Eingabevalidierung und sichere erneute Anzeige.

9 Min. · 3 Fragen

Diese Lektion in Kodokon öffnen

Ein Formular ist der erste Berührungspunkt zwischen deinen Nutzern und deinem PHP-Code. Die Methode get legt die Daten in die URL (?q=pizza): perfekt für eine Suche oder einen Filter, denn die Seite lässt sich als Lesezeichen speichern und teilen. Die Methode post transportiert die Daten im Rumpf der Anfrage: Sie ist Pflicht, sobald die Anfrage etwas verändert (Kontoerstellung, Bestellung, Löschung) oder sensible Daten enthält. PHP speichert die empfangenen Werte in den Superglobalen $_GET und $_POST.

HTML
<form action="search.php" method="get">
  <label for="q">Search</label>
  <input id="q" name="q" type="text">
  <button type="submit">Search</button>
</form>
<?php
$query = trim($_GET['q'] ?? '');

if ($query !== '') {
    echo "<p>You are searching for: " .
        htmlspecialchars($query, ENT_QUOTES) . "</p>";
}
?>
search.php: das Formular und seine Verarbeitung auf derselben Seite.

Profi-Regel Nummer eins: traue eingehenden Daten niemals. Ein Nutzer kann alles Mögliche senden, auch gefälschte Werte, die außerhalb deines Formulars erzeugt wurden. Die Funktion filter_input() liest und validiert einen Wert in einem einzigen Schritt: Sie liefert den validierten Wert zurück, false, wenn er ungültig ist, und null, wenn das Feld fehlt - drei Fälle, die du in deinen Fehlermeldungen unterscheiden solltest.

PHP
<?php

declare(strict_types=1);

$errors = [];

$email = filter_input(
    INPUT_POST,
    'email',
    FILTER_VALIDATE_EMAIL
);

$age = filter_input(
    INPUT_POST,
    'age',
    FILTER_VALIDATE_INT,
    ['options' => ['min_range' => 18, 'max_range' => 120]]
);

$name = trim((string) ($_POST['name'] ?? ''));

if ($name === '' || mb_strlen($name) > 50) {
    $errors[] = "Name required (50 characters max).";
}

if (!is_string($email)) {
    $errors[] = "Invalid email address.";
}

if (!is_int($age)) {
    $errors[] = "Invalid age (between 18 and 120).";
}

if ($errors === []) {
    echo "Registration valid.";
}
Eine Registrierung mit filter_input() validieren.

Wenn die Validierung fehlschlägt, schicke kein leeres Formular zurück: Zeige die vom Nutzer eingegebenen Werte erneut an (ein "klebriges" Formular) und dazu die Fehlermeldungen neben den betroffenen Feldern. Jeder erneut angezeigte Wert muss durch htmlspecialchars() laufen: Das ist es, was Tags unschädlich macht und Skript-Injektionen verhindert.

HTML
<?php
$name = trim($_POST['name'] ?? '');
$hasError = isset($_POST['name']) && $name === '';
$safeName = htmlspecialchars($name, ENT_QUOTES);
?>
<form method="post" action="">
  <label for="name">Your name</label>
  <input id="name" name="name"
    value="<?= $safeName ?>">
  <?php if ($hasError): ?>
    <p>Name is required.</p>
  <?php endif; ?>
  <button type="submit">Submit</button>
</form>
Klebriges Formular: die Eingabe überlebt den Fehler.

Wissenscheck

Stelle sicher, dass du die wichtigsten Punkte dieser Lektion behalten hast.

  1. Welche HTTP-Methode ist für ein Formular passend, das ein Nutzerkonto anlegt?
    • GET, damit die Daten in der URL sichtbar bleiben
    • POST, weil die Anfrage den Serverzustand verändert und die Daten nicht in der URL auftauchen dürfen
    • Beide gehen, das ist Geschmackssache
  2. Was liefert filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL) zurück, wenn das Feld überhaupt nicht gesendet wurde?
    • false
    • Eine leere Zeichenkette
    • null
    • Es wirft eine Ausnahme
  3. Warum solltest du einen Wert durch htmlspecialchars() schicken, bevor du ihn erneut auf einer Seite anzeigst?
    • Um HTML-Tags unschädlich zu machen und Skript-Injektionen zu verhindern (XSS-Schwachstelle)
    • Um Tippfehler automatisch zu korrigieren
    • Um den Wert zu komprimieren und die Anzeige zu beschleunigen