W3docs

PHP Formularverarbeitung: Ein vollständiger Leitfaden

PHP ist eine leistungsstarke Skriptsprache für Webentwicklung. Erfahren Sie, wie Sie Formulare empfangen, validieren und sicher verarbeiten.

Die Verarbeitung von Formularen gehört zu den häufigsten Aufgaben in jeder Webanwendung: Eine Registrierungsseite, ein Kontaktformular, ein Suchfeld oder ein Kassiervorgang senden alle Benutzereingaben an den Server, wo PHP sie liest, prüft und verarbeitet. Dieser Leitfaden beschreibt den vollständigen Ablauf — vom HTML-Formular im Browser bis hin zum PHP-Code, der die übermittelten Daten empfängt, validiert und sicher weiterverwendet.

Am Ende verstehen Sie, wie $_POST und $_GET funktionieren, wie Sie Eingaben auf dem Server validieren, wie Sie das Formular nach einem Fehler „klebrig" halten und wie Sie die zwei klassischen Sicherheitslücken (XSS und SQL-Injection) vermeiden.

Wie eine Formularübermittlung funktioniert

Eine Formularübermittlung ist eine einzelne HTTP-Anfrage vom Browser an den Server:

  1. Der Benutzer füllt Felder aus und klickt auf Absenden.
  2. Der Browser verpackt die Feldwerte gemäß der method des Formulars und sendet sie an die URL in der action des Formulars.
  3. PHP auf dem Server empfängt die Werte in einem Superglobalen Array$_POST oder $_GET — und Ihr Skript verarbeitet sie.

Da die Daten aus dem Browser des Benutzers stammen, können Sie ihnen niemals vertrauen. Jeder kann Feldwerte ändern, Felder entfernen oder die Anfrage senden, ohne Ihr Formular zu verwenden. Die serverseitige Validierung ist daher keine Option — clientseitige required- und type="email"-Attribute sind nur eine Bequemlichkeit.

Ein HTML-Formular erstellen

Jedes Formular beginnt in HTML. Das Formular enthält Eingabefelder — Textfelder, E-Mail-Felder, Optionsfelder, Kontrollkästchen — und eine Schaltfläche zum Absenden. Zwei Attribute steuern alles:

  • action — die URL, die die Daten empfängt (weglassen, um an dieselbe Seite zurückzuposten).
  • methodpost oder get (siehe den Vergleich unten).
<form action="form_processing.php" method="post">
  <p>
    <label for="name">Name:</label>
    <input type="text" id="name" name="name" />
  </p>
  <p>
    <label for="email">Email:</label>
    <input type="email" id="email" name="email" />
  </p>
  <input type="submit" value="Submit" />
</form>

Das name-Attribut jedes Eingabefeldes ist der Schlüssel, den Sie auf dem Server lesen: name="email" wird zu $_POST['email']. Ein Eingabefeld ohne name wird niemals übermittelt. Verknüpfen Sie immer jedes Feld mit einem <label> für die Barrierefreiheit.

POST vs. GET

Das method-Attribut bestimmt, wie die Daten übertragen werden und welches Array sie empfängt.

method="post"method="get"
DatenspeicherortHTTP-Anfrage-BodyAn die URL als Query-String angehängt
PHP-Array$_POST$_GET
In URL sichtbarNeinJa (?name=Ann&email=...)
Als Lesezeichen/teilbarNeinJa
Geeignet fürPasswörter, alles was Daten verändertSuchfilter, Paginierung — nur-lesende Anfragen

Verwenden Sie POST für alles, was Daten erstellt, aktualisiert oder löscht, oder das sensible Werte enthält. Verwenden Sie GET für Suchen und Filter, die Benutzer als Lesezeichen speichern sollen. Beide landen im entsprechenden Superglobalen; der Rest dieses Leitfadens verwendet POST.

Die übermittelten Daten lesen

Wenn das Formular gepostet wird, füllt PHP $_POST mit den Feldnamen als Schlüssel und dem übermittelten Text als Werte. Lesen Sie jedes Feld, aber schützen Sie sich gegen fehlende Schlüssel mit dem Null-Koaleszenz-Operator ??, sodass ein fehlendes Feld einen leeren String anstelle einer Warnung ergibt:

$name  = $_POST['name']  ?? '';
$email = $_POST['email'] ?? '';

Prüfen Sie $_SERVER['REQUEST_METHOD'], damit der Verarbeitungscode nur bei einer tatsächlichen Übermittlung ausgeführt wird, nicht wenn die Seite zum ersten Mal geöffnet wird:

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
  $name  = $_POST['name']  ?? '';
  $email = $_POST['email'] ?? '';
  // ...validate and use the values
}

Die Eingabe validieren

Validierung beantwortet eine Frage: Ist dieser Wert akzeptabel? Sammeln Sie alle Probleme in einem $errors-Array, damit Sie dem Benutzer alle Fehler auf einmal anzeigen können, anstatt beim ersten anzuhalten. Verwenden Sie filter_var() mit FILTER_VALIDATE_EMAIL, um das E-Mail-Format korrekt zu prüfen:

$errors = [];

if (trim($name) === '') {
  $errors[] = "Name is required";
}

if (trim($email) === '') {
  $errors[] = "Email is required";
} elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
  $errors[] = "Invalid email format";
}

if (!empty($errors)) {
  foreach ($errors as $error) {
    echo htmlspecialchars($error) . "<br>";
  }
}

Wir verwenden trim(), damit ein Feld, das nur Leerzeichen enthält, trotzdem als leer gilt, dann filter_var(), um zu bestätigen, dass die E-Mail wie [email protected] aussieht. Wenn $errors nicht leer ist, werden die Nachrichten ausgegeben; andernfalls sind die Daten sauber und können verwendet werden. Für eine ausführlichere Behandlung von Pflichtfeldern und E-Mail-/URL-Regeln, siehe PHP-Formularvalidierung und Pflichtfelder validieren.

Ausgabe maskieren: XSS verhindern

Beachten Sie den Aufruf von htmlspecialchars() oben. Immer wenn Sie einen Wert ausgeben, der vom Benutzer kam, müssen Sie ihn maskieren, sonst kann ein Angreifer <script>-Tags einreichen, die im Browser anderer Besucher ausgeführt werden — ein Cross-Site-Scripting-Angriff (XSS). htmlspecialchars() wandelt <, >, & und Anführungszeichen in harmlose HTML-Entitäten um:

$dangerous = '<script>alert("xss")</script>';
echo htmlspecialchars($dangerous);
// &lt;script&gt;alert(&quot;xss&quot;)&lt;/script&gt;

Der Browser zeigt den Text jetzt buchstäblich an, anstatt ihn auszuführen. Maskieren Sie bei der Ausgabe, jedes Mal.

Das Formular „klebrig" halten

Wenn die Validierung fehlschlägt, zeigen Sie das Formular erneut mit den Werten des Benutzers an — alles erneut eintippen zu müssen ist frustrierend. Geben Sie jeden Wert maskiert in sein value-Attribut zurück:

<input
  type="text"
  name="name"
  value="<?php echo htmlspecialchars($name ?? ''); ?>"
/>

Da dieselbe Seite das Formular sowohl rendert als auch verarbeitet, setzen Sie action="" (zurück an sich selbst posten) und das Feld wird nach einem fehlgeschlagenen Absenden automatisch wieder befüllt.

Alles zusammensetzen

Hier ist eine einzelne selbstverarbeitende Seite, die das Formular rendert, bei POST validiert, Fehler anzeigt, das Formular klebrig hält und den Erfolg bestätigt — das Muster, dem die meisten echten Kontaktformulare folgen:

<?php
$name = $email = '';
$errors = [];
$success = false;

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
  $name  = trim($_POST['name']  ?? '');
  $email = trim($_POST['email'] ?? '');

  if ($name === '') {
    $errors[] = 'Name is required';
  }
  if ($email === '') {
    $errors[] = 'Email is required';
  } elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    $errors[] = 'Invalid email format';
  }

  if (!$errors) {
    $success = true; // here you would save to a database or send an email
  }
}
?>
<?php if ($success): ?>
  <p>Thanks, <?php echo htmlspecialchars($name); ?>!</p>
<?php else: ?>
  <?php foreach ($errors as $e): ?>
    <p style="color:red"><?php echo htmlspecialchars($e); ?></p>
  <?php endforeach; ?>
  <form action="" method="post">
    Name:
    <input type="text" name="name"
           value="<?php echo htmlspecialchars($name); ?>"><br>
    Email:
    <input type="email" name="email"
           value="<?php echo htmlspecialchars($email); ?>"><br>
    <input type="submit" value="Submit">
  </form>
<?php endif; ?>

Daten sicher speichern: SQL-Injection verhindern

Sobald die Daten gültig sind, speichern Sie sie oft in einer Datenbank. Niemals Benutzereingaben direkt in einen SQL-String einfügen — das öffnet die Tür für SQL-Injection. Verwenden Sie ein Prepared Statement, damit die Datenbank die Werte als Daten behandelt, niemals als Befehle:

$mysqli = new mysqli('localhost', 'user', 'pass', 'app');

$stmt = $mysqli->prepare(
  'INSERT INTO contacts (name, email) VALUES (?, ?)'
);
$stmt->bind_param('ss', $name, $email);
$stmt->execute();

Die ?-Platzhalter und bind_param() halten die Werte von der Abfrage getrennt, sodass eine Eingabe wie '; DROP TABLE contacts; -- als harmloser Text gespeichert wird, anstatt ausgeführt zu werden.

Sicherheits-Checkliste

Ein sicheres Formularverarbeitungsskript folgt einer kurzen, wiederholbaren Routine:

  • Validieren Sie jedes Feld auf dem Server — verlassen Sie sich niemals allein auf Browser-Prüfungen.
  • Maskieren Sie bei der Ausgabe mit htmlspecialchars(), um XSS zu verhindern.
  • Verwenden Sie Prepared Statements für jede Datenbankabfrage, um SQL-Injection zu verhindern.
  • Hashen Sie Passwörter mit password_hash(), bevor Sie sie speichern — speichern Sie niemals Klartext.
  • Fügen Sie ein CSRF-Token hinzu bei zustandsändernden Formularen, damit Anfragen nicht von anderen Seiten gefälscht werden können.
  • Fügen Sie CAPTCHA hinzu bei öffentlichen Formularen, um automatisierte Spam-Übermittlungen zu reduzieren.

Verwandte Kapitel

Übungen

Übung
Was macht $_POST in PHP?
Was macht $_POST in PHP?
Was this page helpful?