Formular Daten mit PHP verarbeiten

Senden wir ein HTML Formular ab, so gelangen die Daten per GET oder POST auf den Server. Dort wollen wir sie Verarbeiten. Einige grundlegende Herangehensweisen, wie wir Formular Daten mit PHP verarbeiten, hier in diesem Artikel.

Dieser Artikel ist eine Zusammenfassung vom Buch PHP 8 Solutions.

Hier zum vorangehenden Artikel Formulare mit HTML und PHP.

Sind die Daten da? Und Vollständig?

Als erstes Prüfen wir, ob Daten mit der erwarteten Methode übertragen wurden.

// Prüfen ob Daten übermittelt wurden
if ($_SERVER['REQUEST_METHOD'] == 'POST')
{
   // Skript zum verarbeiten der Daten
   $savePost = filter_input_array(INPUT_POST, FILTER_SANITIZE_SPECIAL_CHARS);
}

Damit nicht irgendwelche Daten eingeschleust werden können, definieren wir, welche Felder wir erwarten. Wir definieren ebenfalls, welche der Felder zwingend sind.

$expectedFields = ['name', 'email', 'comments'];
$requiredFields = ['name', 'email'];

Prüfen, ob alle zwingenden Felder nicht leer sind. Für jedes Feld eine Variabel dynamisch generiert, die dessen Wert enthält.

$missing = [];
$errors = [];
foreach ($savePost as $key => $value)
{
    if (!$is_array($value))     
    {
        $value = trim($value);  // Leerzeichen entfernen
    }
    if (!in_array($key, $expectedFields))
    {
        continue;   // Ignorieren weil nicht erwartet
    }
    if (in_array($key, $requiredFields) && empty($value))
    {
        // zwingendes Feld ist leer
        $missing[] = $key;
        $$key = "";
        continue;   // nächstes Feld
    }
    $$key = $value;  // alles OK, Variable anlegen
}

Unvollständigkeit und Fehler anzeigen

Der Nutzer sendet das Formular ab, aber es ist nicht vollständig. Jetzt zeigen wir ihm, welche Felder er korrigieren muss. Die bisherigen Eingaben jedoch, zeigen wir wieder in den Formularfeldern an.

Ob etwas fehlt oder ob ein Fehler aufgetreten ist, erkennen wir, indem wir prüfen ob die Arrays $error und $missing nicht leer sind. Indem wir im Array nach dem Namen des Feldes suchen, erkennen wir, ob für das Feld eine Meldung angezeigt werden muss.

<label for="name">Name: 
    <?php if (in_array('name', $missing)) { ?>
<!--    Hinweis, fehlende Eingabe-->
        <span class="warning">Bitte Namen eingeben </span>
    <?php } ?>
</label>
<input type="text" id="name" name="name" placeholder="Daniel" 
    <?php if ($missing || $errors) {
        // bisherige Eingabe wieder anzeigen
        echo 'value="' . htmlentities($name). '"';
    }?>>

Mit dem Value Parameter wird der eingegebene Wert wieder im Formular angezeigt. Bei Textfeldern ist das anders. Dort gehört die bisherige Angabe zwischen die Textfeld Tags.

Doppeltes Absenden von Formularen

Leicht passiert es, das ein Nutzer ein Formular mehrfach absendet. Das kann beispielsweise passieren, indem er auf einen Doppelklick auf den „Senden“ Button machet.

Eine Doppelte Verarbeitung vermeidet man, indem man prüft, ob von der selben Session bereits vor kurzem ein Formular übermittelt wurde.

// Nur beim ersten Absenden innerhalb der Zeit TRUE
public function isFormSentFirstTime() {
    $timeIntervall = 6; // Zeit in Sekunden
    $sentFirstTime = true;
    if (isset($_SESSION['posttimer']))
    {
        if ((time() - $_SESSION['posttimer']) <= $timeIntervall) {
            $sentFirstTime= false;
        }
    }
    $_SESSION['posttimer'] = time();
    return $sentFirstTime;
}

E-Mail Attacken blockieren

Besondere Vorsicht ist mit E-Mailadressen geboten. Wenn die Adresse zum senden, von E-Mails verwendet wird, muss die Eingabe gut gefiltert werden. Sonst kann ein Angreifer die Header Information der E-Mail manipulieren.

Genauere Informationen dazu, in folgendem Beitrag. E-Mail mit PHP versenden