Hoofdstuk 12: Server-Side Validatie

← Terug naar overzicht

Basisvalidatie

Formulierdata moet altijd gevalideerd worden op de server. Nooit alleen vertrouwen op client-side validatie (HTML5 of JavaScript), want die kan omzeild worden.

De belangrijkste validatiefuncties:

Een veelgebruikt patroon is een $errors array: je voegt foutmeldingen toe en controleert achteraf of er fouten zijn.

<?php
$errors = [];
if (empty($naam)) {
    $errors[] = "Naam is verplicht";
}
if (strlen($naam) < 2) {
    $errors[] = "Naam moet minimaal 2 tekens zijn";
}
if (count($errors) > 0) {
    foreach ($errors as $error) {
        echo "<p>" . $error . "</p>";
    }
}
?>

Let op: In de oefeningen hieronder hoef je GEEN <?php en ?> tags te typen. Het platform regelt dit automatisch. Je typt alleen de PHP-code zelf.

Oefening 1

Maak een variabele $naam met een lege string "". Controleer met empty() of de naam leeg is. Zo ja, toon "Naam is verplicht". Zo niet, toon "Naam: " gevolgd door de naam.

Jouw code:

Oefening 2

Maak een variabele $wachtwoord met de waarde "abc". Controleer met strlen() of het wachtwoord minimaal 8 tekens lang is. Zo ja, toon "Wachtwoord geaccepteerd". Zo niet, toon "Wachtwoord moet minimaal 8 tekens zijn".

Jouw code:

Oefening 3

Maak een variabele $leeftijd met de waarde "vijftien". Controleer met is_numeric() of het een geldig getal is. Zo ja, toon "Leeftijd: X". Zo niet, toon "Voer een geldig getal in".

Jouw code:

Oefening 4

Maak een $errors array (leeg). Maak variabelen $naam = "" en $leeftijd = "abc". Valideer: als $naam leeg is, voeg "Naam is verplicht" toe aan $errors. Als $leeftijd niet numeriek is, voeg "Leeftijd moet een getal zijn" toe. Als count($errors) > 0, toon elke fout met een foreach-loop.

Jouw code:

Oefening 5

Schrijf validatie voor een gebruikersnaam. Maak $gebruikersnaam = "ab". Maak een $errors array. Controleer: (1) niet leeg, (2) minimaal 3 tekens, (3) maximaal 20 tekens. Voeg passende foutmeldingen toe. Als er geen fouten zijn, toon "Gebruikersnaam geldig: X". Anders toon alle fouten.

Jouw code:

Oefening 6

Simuleer formulierverwerking. Controleer of het een POST request is. Zo ja, haal $_POST['naam'] en $_POST['leeftijd'] op (met trim). Valideer: naam niet leeg en minimaal 2 tekens, leeftijd niet leeg en numeriek en tussen 1 en 120. Toon fouten of een succesmelding "Welkom, X! Je bent Y jaar.".

Jouw code:

Email & filter_var

PHP heeft een krachtige functie om e-mailadressen te valideren: filter_var() met het filter FILTER_VALIDATE_EMAIL. Dit controleert of een e-mailadres een geldig formaat heeft.

<?php
$email = "jan@voorbeeld.nl";
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
    echo "Geldig e-mailadres";
} else {
    echo "Ongeldig e-mailadres";
}
?>

filter_var() geeft het gefilterde resultaat terug bij succes, of false bij een ongeldig formaat.

Tip: Maak e-mailadressen altijd lowercase met strtolower() voordat je ze opslaat. Jan@Voorbeeld.NL en jan@voorbeeld.nl zijn hetzelfde e-mailadres.

Oefening 1

Maak een variabele $email met de waarde "jan@voorbeeld.nl". Controleer met filter_var() en FILTER_VALIDATE_EMAIL of het een geldig e-mailadres is. Zo ja, toon "Geldig". Zo niet, toon "Ongeldig".

Jouw code:

Oefening 2

Maak een variabele $email met de waarde "dit-is-geen-email". Controleer of het een geldig e-mailadres is met filter_var(). Toon het passende bericht.

Jouw code:

Oefening 3

Maak een variabele $email met de waarde " Jan@Voorbeeld.NL ". Schoon het op met trim() en strtolower(). Controleer daarna met filter_var() of het geldig is. Zo ja, toon het opgeschoonde e-mailadres. Zo niet, toon "Ongeldig e-mailadres".

Jouw code:

Oefening 4

Schrijf een functie valideerEmail($email) die het e-mailadres opschoont (trim, strtolower) en valideert. De functie geeft het opgeschoonde e-mailadres terug als het geldig is, of false als het ongeldig is. Test met: $resultaat = valideerEmail(" Test@Email.COM "); en toon het resultaat of "Ongeldig".

Jouw code:

Oefening 5

Simuleer formuliervalidatie. Controleer of het een POST request is. Haal $_POST['email'] op, schoon op met trim en strtolower. Maak een $errors array. Controleer: (1) niet leeg, (2) geldig e-mailformaat met filter_var. Toon fouten of "Email geregistreerd: X".

Jouw code:

Oefening 6

Schrijf een complete registratievalidatie. Bij POST, haal naam, email en wachtwoord op uit $_POST (met trim). Valideer: naam niet leeg en min. 2 tekens, email niet leeg en geldig formaat, wachtwoord niet leeg en min. 8 tekens. Verzamel alle fouten in $errors. Toon fouten of "Registratie succesvol voor X (Y)" met naam en email.

Jouw code:

Sticky Forms

Een sticky form is een formulier dat de ingevoerde waarden onthoudt na het versturen. Als er validatiefouten zijn, hoeft de gebruiker niet alles opnieuw in te typen. Dit doe je door de value-attributen van de invoervelden te vullen met de eerder ingevoerde waarden.

<?php
$naam = "";
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $naam = trim($_POST['naam']);
    // validatie hier...
}
// In het formulier:
echo '<input type="text" name="naam" value="' . htmlspecialchars($naam) . '">';
?>

Het patroon voor een sticky form met de ternary operator:

<?php
echo '<input value="' . (isset($_POST['naam']) ? htmlspecialchars($_POST['naam']) : '') . '">';
?>

Belangrijk: gebruik ALTIJD htmlspecialchars() bij het terugplaatsen van waarden in HTML-attributen. Anders kan een gebruiker met een waarde als " onmouseover="alert('hack') je HTML breken.

Oefening 1

Maak een variabele $naam met een lege string. Als het een POST request is, vul $naam met de getrimde waarde uit $_POST['naam']. Toon een formulier met een tekstveld waarvan de value is ingesteld op de (htmlspecialchars-beveiligde) waarde van $naam.

Jouw code:

Oefening 2

Gebruik de ternary operator om een sticky input te maken. Toon een formulier met een tekstveld name="email". De value moet de waarde van $_POST['email'] zijn als die bestaat (met htmlspecialchars), anders een lege string.

Jouw code:

Oefening 3

Maak variabelen $naam en $email, beide als lege string. Maak een $errors array. Bij POST: vul $naam en $email uit $_POST (met trim). Valideer: naam niet leeg, email niet leeg. Voeg foutmeldingen toe aan $errors. Toon eventuele fouten met foreach. Toon daarna het formulier met sticky waarden (htmlspecialchars in de value).

Jouw code:

Oefening 4

Maak een sticky formulier met validatie. Variabelen: $naam = "", $email = "", $leeftijd = "", $errors = []. Bij POST: vul variabelen (trim), valideer naam (niet leeg, min. 2 tekens), email (niet leeg, geldig formaat), leeftijd (niet leeg, numeriek). Als er geen fouten zijn, toon een succesmelding. Toon altijd het formulier met sticky waarden.

Jouw code:

Oefening 5

Bouw een compleet registratieformulier met sticky fields. Schrijf een prepareInput($data) functie (trim + htmlspecialchars). Variabelen: $naam, $email, $wachtwoord, $errors, $succes. Bij POST: valideer naam (niet leeg, 2-50 tekens), email (niet leeg, geldig), wachtwoord (niet leeg, min. 8 tekens). Bij succes: toon "Account aangemaakt voor X" en maak de velden weer leeg. Toon fouten in rood. Toon altijd het sticky formulier.

Jouw code:

Oefening 6

Bouw het ultieme contactformulier. Velden: naam, email, onderwerp (select met opties: "Vraag", "Klacht", "Feedback"), bericht (textarea). Valideer: naam niet leeg (min. 2 tekens), email niet leeg en geldig, onderwerp niet leeg, bericht niet leeg (min. 10 tekens). Toon fouten of succesmelding met datum en tijd (date("d-m-Y H:i")). Maak het formulier sticky. Gebruik prepareInput().

Jouw code:

Samenvatting

In dit hoofdstuk heb je geleerd: