Hoofdstuk 11: $_POST & Formulierverwerking

← Terug naar overzicht

POST Methode

Bij method="GET" staan de gegevens zichtbaar in de URL. Dit is handig voor zoekopdrachten, maar niet geschikt voor wachtwoorden of persoonlijke gegevens. Daarvoor gebruik je method="POST".

Verschillen tussen GET en POST:

Bij POST gebruik je $_POST in plaats van $_GET. Om te controleren of het formulier verstuurd is, gebruik je $_SERVER['REQUEST_METHOD'].

<?php
// Controleer of het formulier via POST is verstuurd
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $naam = $_POST['naam'];
    echo "Ontvangen: " . $naam;
}
?>

Met action="" (leeg) stuurt het formulier de data naar hetzelfde bestand. Dit heet een self-posting form.

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

Gebruik echo om een formulier te tonen met method="POST" en action="". Het formulier bevat een tekstveld met name="naam" en een submitknop met tekst "Verstuur".

Jouw code:

Oefening 2

Controleer met $_SERVER['REQUEST_METHOD'] of het formulier via POST is verstuurd. Zo ja, toon "Formulier ontvangen!". Zo niet, toon "Wachten op formulier...".

Jouw code:

Oefening 3

Controleer of het request via POST is. Zo ja, controleer of $_POST['naam'] bestaat met isset(). Als de naam bestaat, toon "Hallo, X!". Als de naam niet bestaat, toon "Naam ontbreekt". Als het geen POST request is, toon "Verstuur het formulier".

Jouw code:

Oefening 4

Maak een self-posting contactformulier. Controleer eerst of het een POST request is. Zo ja, haal $_POST['naam'] en $_POST['bericht'] op (met isset-checks) en toon "Bericht van X: Y". Zo niet, toon het formulier met echo: twee velden (naam en bericht) en een submitknop.

Jouw code:

Oefening 5

Controleer of het een POST request is. Zo ja, haal $_POST['email'] en $_POST['wachtwoord'] op. Controleer of het wachtwoord gelijk is aan "geheim123". Zo ja, toon "Welkom, X!" (met het emailadres). Zo niet, toon "Onjuist wachtwoord".

Jouw code:

Data Verwerken

Formulierdata van gebruikers is nooit te vertrouwen. Gebruikers kunnen kwaadaardige code invoeren (XSS-aanval). Gebruik altijd htmlspecialchars() om HTML-tekens om te zetten naar veilige entiteiten.

<?php
// ONVEILIG - gebruiker kan HTML/JavaScript injecteren!
echo $_POST['naam'];

// VEILIG - HTML-tekens worden onschadelijk gemaakt
echo htmlspecialchars($_POST['naam']);
?>

htmlspecialchars() zet tekens zoals <, >, " en & om naar &lt;, &gt;, &quot; en &amp;.

XSS staat voor Cross-Site Scripting. Een aanvaller kan via een formulier JavaScript-code invoeren (bijv. <script>alert('hacked')</script>). Als je dit zonder htmlspecialchars() toont, wordt het als echte code uitgevoerd in de browser!

Oefening 1

Maak een variabele $invoer met de waarde "<script>alert('hack')</script>". Pas htmlspecialchars() toe en toon het resultaat.

Jouw code:

Oefening 2

Maak een variabele $naam met de waarde " <b>Jan</b> ". Pas eerst trim() toe en daarna htmlspecialchars(). Toon het resultaat.

Jouw code:

Oefening 3

Schrijf een functie prepareInput($data) die achtereenvolgens trim() en htmlspecialchars() toepast op de meegegeven data en het resultaat teruggeeft. Test met echo prepareInput(" <h1>Test</h1> ");.

Jouw code:

Oefening 4

Controleer of het een POST request is. Zo ja, haal $_POST['naam'] op, pas de prepareInput() functie (die je eerst moet schrijven) toe, en toon "Welkom, X". Schrijf eerst de functie prepareInput($data) die trim() en htmlspecialchars() toepast.

Jouw code:

Oefening 5

Controleer of het een POST request is. Haal $_POST['naam'], $_POST['email'] en $_POST['bericht'] op. Pas op elk veld trim() en htmlspecialchars() toe. Toon elk veld op een aparte regel met labels: "Naam: X", "Email: X", "Bericht: X". Gebruik <br> tussen de regels.

Jouw code:

Oefening 6

Schrijf de functie prepareInput($data) (trim + htmlspecialchars). Controleer of het een POST request is. Zo ja, verwerk $_POST['naam'] en $_POST['email'] met prepareInput. Sla beide op in een associatieve array $formulierData met sleutels "naam" en "email". Toon de array met een foreach-loop als "sleutel: waarde" per regel (gebruik <br>).

Jouw code:

Self-Posting & Feedback

Een self-posting form is een pagina die zowel het formulier toont als de verwerking doet. Het formulier stuurt naar zichzelf (met action=""). Na verwerking kun je een succesmelding tonen of het formulier opnieuw laten zien.

<?php
$melding = "";
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $naam = htmlspecialchars(trim($_POST['naam']));
    $melding = "Bedankt, " . $naam . "!";
}
if ($melding != "") {
    echo "<p>" . $melding . "</p>";
}
// Formulier altijd tonen
echo '<form method="POST" action="">';
echo '<input type="text" name="naam">';
echo '<input type="submit" value="Verstuur">';
echo '</form>';
?>

Oefening 1

Maak een variabele $melding met een lege string. Controleer of het een POST request is. Zo ja, stel $melding in op "Formulier verstuurd!". Controleer daarna of $melding niet leeg is en toon het dan met echo.

Jouw code:

Oefening 2

Schrijf prepareInput($data) (trim + htmlspecialchars). Maak een self-posting form: bij POST, verwerk $_POST['naam'] en toon "Bedankt, X!". Toon daarna altijd het formulier met een tekstveld name="naam" en een submitknop.

Jouw code:

Oefening 3

Schrijf code die bij een POST request de $_POST['naam'] en $_POST['email'] verwerkt (met trim en htmlspecialchars). Sla ze op in een associatieve array $formulierData. Toon een bevestiging: "Naam: X" en "Email: X" op aparte regels met <br>.

Jouw code:

Oefening 4

Maak een begroeting op basis van het tijdstip. Gebruik date("H") om het huidige uur op te halen. Als het uur kleiner is dan 12, toon "Goedemorgen". Tussen 12 en 17, toon "Goedemiddag". Daarna toon "Goedenavond". Combineer dit met een POST check: als $_POST['naam'] bestaat, voeg de naam toe aan de begroeting (bijv. "Goedemorgen, Jan!"). Anders toon alleen de begroeting.

Jouw code:

Oefening 5

Schrijf een complete contactpagina. Definieer prepareInput($data) (trim + htmlspecialchars). Bij een POST request, verwerk naam, email en onderwerp uit $_POST. Sla ze op in een array $formulierData. Controleer of het onderwerp gelijk is aan "klacht", "vraag" of "compliment" en toon een passende reactie: "We nemen uw klacht serieus", "We beantwoorden uw vraag zo snel mogelijk" of "Bedankt voor uw compliment!". Toon ook de naam en email van de afzender.

Jouw code:

Oefening 6

Schrijf een self-posting form met kantoortijden-check. Definieer prepareInput($data). Bij POST: verwerk $_POST['naam'] en $_POST['bericht']. Check met date("H") of het tussen 9 en 17 uur is. Zo ja, toon "Bericht ontvangen van X. We reageren vandaag nog!". Zo niet, toon "Bericht ontvangen van X. We reageren de volgende werkdag.". Toon daarna altijd het formulier.

Jouw code:

Samenvatting

In dit hoofdstuk heb je geleerd: