Hoofdstuk 16: Oplevering & Reflectie

← Terug naar overzicht

Testen & debugging

Als je code "werkt" is dat nog niet genoeg. Je moet ook testen met randgevallen (edge cases): wat gebeurt er met lege invoer, extreem lange tekst, of speciale tekens? Met var_dump() kun je de waarde en het type van een variabele bekijken, wat enorm helpt bij het opsporen van bugs.

<?php
$waarde = "123";
var_dump($waarde); // string(3) "123"
var_dump((int)$waarde); // int(123)
var_dump($waarde === 123); // bool(false) - string vs int!
?>

Gebruik var_dump() in plaats van echo als je wilt zien wat het type van een variabele is. Dit helpt vooral bij het opsporen van type-gerelateerde bugs, zoals het verschil tussen de string "0" en de integer 0.

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 $invoer met de waarde " " (alleen spaties). Gebruik trim() en controleer of het resultaat leeg is. Toon "Leeg" als het na trimmen leeg is, of "Niet leeg" als er nog tekst over is.

Jouw code:

Oefening 2

Schrijf een functie testInvoer($waarde) die de volgende tests uitvoert en de resultaten toont: is het leeg na trim? Is het numeriek (is_numeric)? Is het langer dan 255 tekens (strlen)? Toon voor elke test "Leeg: ja/nee", "Numeriek: ja/nee", "Te lang: ja/nee". Test met de waarde "Hallo".

Jouw code:

Oefening 3

Schrijf een functie valideerLeeftijd($leeftijd) die test of de leeftijd een getal is, minimaal 0 en maximaal 150. Return een foutmelding als het ongeldig is, of een lege string als het geldig is. Test met de waarden "abc", "-5", "200" en "25". Toon de resultaten.

Jouw code:

Oefening 4

Schrijf een functie beveiligOutput($tekst) die htmlspecialchars() toepast. Test met gevaarlijke invoer: '<script>alert("hack")</script>'. Toon het origineel en het beveiligde resultaat.

Jouw code:

Oefening 5

Schrijf een functie debugVariabele($naam, $waarde) die de naam, het type (via gettype()) en de waarde van een variabele netjes toont als: "[naam]: type=[type], waarde=[waarde]<br>". Test met een string "Hallo", een integer 42, een boolean true en een array [1, 2, 3] (voor de array, gebruik implode(", ", ...) als waarde).

Jouw code:

Oefening 6

Schrijf een functie testFormulierVeld($veldnaam, $waarde, $maxLengte) die een veld test op: leeg na trim, te lang (> maxLengte), bevat HTML-tags (check met strip_tags() of de waarde verschilt). Return een array met alle gevonden problemen. Test met veldnaam "naam", waarde "<b>Jan</b>" en maxLengte 50.

Jouw code:

Code kwaliteit

Goede code is leesbaar, herbruikbaar en veilig. Belangrijke principes: DRY (Don't Repeat Yourself) door functies te gebruiken, consistente naamgeving met camelCase, en altijd htmlspecialchars() voor output. Een code review checklist helpt om niets te vergeten.

Code review checklist: (1) Alle invoer getrimd en gevalideerd? (2) htmlspecialchars() bij alle output? (3) Geen herhaalde code - gebruik functies? (4) Duidelijke variabelenamen in camelCase? (5) Foutafhandeling aanwezig? (6) Bestanden afgesloten na gebruik?

Oefening 1

De volgende code herhaalt zichzelf. Schrijf een functie toonProduct($naam, $prijs) die een product toont als "<p>[naam]: EUR [prijs]</p>". Gebruik de functie om drie producten te tonen: "Laptop" met 999, "Muis" met 25, en "Toetsenbord" met 45.

Jouw code:

Oefening 2

Verbeter de naamgeving van deze variabelen naar camelCase en geef ze duidelijkere namen. Origineel: $x = "Jan", $y = "jan@test.nl", $z = 25, $a = true. Hernoem naar: $gebruikersNaam, $emailAdres, $leeftijd, $isActief. Toon alle waarden.

Jouw code:

Oefening 3

Schrijf een functie maakVeilig($tekst) die invoer reinigt (trim + htmlspecialchars) en een functie toonVeilig($label, $waarde) die een label en waarde veilig toont als "[label]: [waarde]<br>". Gebruik toonVeilig om drie velden te tonen: "Naam" met "<b>Jan</b>", "Stad" met " Amsterdam ", "Bio" met "Ik <3 PHP".

Jouw code:

Oefening 4

Schrijf een functie valideerFormulier($velden) die een associatieve array ontvangt (bijv. ["naam" => "Jan", "email" => ""]). Controleer dat geen enkel veld leeg is na trim. Return een array met foutmeldingen voor lege velden in het formaat "[veldnaam] is verplicht". Test met een array waar "email" leeg is.

Jouw code:

Oefening 5

Refactor deze herhaalde code tot een functie. De code toont steeds een tabelrij: echo "<tr><td>Naam</td><td>Jan</td></tr>" enzovoort. Schrijf een functie tabelRij($label, $waarde) die een beveiligde tabelrij maakt. Maak een complete tabel met <table> tags en drie rijen: Naam/Jan, Email/jan@test.nl, Stad/Amsterdam.

Jouw code:

Oefening 6

Schrijf een functie codeReview($code) die een string met PHP-code analyseert en waarschuwingen geeft. Check op: bevat "echo $_" (onveilige output, melding: "Gebruik htmlspecialchars() bij output"), bevat "mysql_" (verouderd, melding: "Gebruik PDO in plaats van mysql_"). Return een array met waarschuwingen. Test met 'echo $_POST["naam"];'.

Jouw code:

Alles samen

Nu combineren we alles wat je hebt geleerd: variabelen, condities, loops, arrays, functies, formulieren, validatie, bestanden en cookies. Deze oefeningen zijn integrale opdrachten die meerdere concepten uit eerdere lessen combineren.

Dit is de eindoefening van de cursus. Elke oefening combineert meerdere concepten. Neem de tijd en denk stap voor stap na over wat je nodig hebt. Gebruik functies om je code te organiseren!

Oefening 1

Bouw een contactformulier-verwerker. Schrijf de functies reinigInvoer($tekst) (trim + htmlspecialchars), valideerContact($naam, $email, $bericht) (naam niet leeg, email geldig met filter_var, bericht min. 10 tekens; return fouten-array). Test met: naam "Jan", email "jan@test.nl", bericht "Korte test met meer dan tien tekens erin". Als er geen fouten zijn, toon "Bericht ontvangen van [naam]".

Jouw code:

Oefening 2

Bouw een productenlijst-generator. Maak een array $producten met drie associatieve arrays (elk met "naam", "prijs", "voorraad"). Schrijf een functie toonProductTabel($producten) die een HTML-tabel genereert met een header-rij en een rij per product. Producten met voorraad 0 krijgen een rode kleur (style="color:red"). Beveilig alle output met htmlspecialchars().

Jouw code:

Oefening 3

Bouw een registratiesysteem. Schrijf de functies: reinigInvoer($tekst), valideerRegistratie($naam, $email, $wachtwoord) (naam niet leeg, email geldig, wachtwoord min. 8 tekens met minstens 1 cijfer via preg_match), en slaGebruikerOp($naam, $email) (opslaan in "gebruikers.txt" met | en datum). Verwerk de registratie van "Sara", "sara@test.nl", "Welkom123". Als het lukt, lees het bestand en toon de opgeslagen gebruiker.

Jouw code:

Oefening 4

Bouw een rapportgenerator. Maak een array $studenten met 4 associatieve arrays (naam en cijfer). Schrijf functies: berekenGemiddelde($studenten) (return gemiddeld cijfer), bepaalStatus($cijfer) (>= 5.5 is "Geslaagd", anders "Gezakt"), en toonRapport($studenten) (toon elke student met cijfer en status, en onderaan het gemiddelde). Test met studenten: Jan/8, Sara/4, Bas/6.5, Lisa/7.

Jouw code:

Oefening 5

Bouw een compleet to-do systeem. Schrijf de functies: voegTaakToe($taak) (valideer niet leeg, sla op in "taken.txt" als "taak|niet gestart|datum"), toonTaken() (lees en toon alle taken als lijst met status), en telTaken() (return het totaal aantal taken). Begin met een leeg bestand. Voeg drie taken toe: "PHP leren", "Oefeningen maken" en "Project afronden". Toon de taken en het totaal.

Jouw code:

Oefening 6

Bouw een mini-webshop overzicht. Maak een array met 3 producten (naam, prijs, categorie). Schrijf functies: filterOpCategorie($producten, $categorie) (return alleen producten van die categorie), berekenTotaal($producten) (return totaalprijs), toonWinkelwagen($producten) (toon producten in een tabel met totaal onderaan). De producten: "PHP Boek"/29.95/"boeken", "USB Muis"/15.00/"elektronica", "CSS Boek"/24.95/"boeken". Filter op "boeken" en toon de winkelwagen.

Jouw code:

Oefening 7

Eindopdracht: bouw een compleet gastenboek met alle geleerde concepten. Schrijf de functies: reinigInvoer($tekst) (trim + htmlspecialchars), valideerBericht($naam, $email, $tekst) (naam niet leeg, email geldig, tekst min. 5 tekens; return fouten), bewaarBericht($naam, $email, $tekst) (opslaan in "gastenboek.txt" met | scheidingsteken en datum), toonGastenboek() (nieuwste eerst, beveiligde output). Begin met leeg bestand. Voeg twee berichten toe en toon het gastenboek.

Jouw code:

Samenvatting

Gefeliciteerd! Je hebt de PHP-cursus afgerond. In dit hoofdstuk heb je geleerd:

Wat je nu kunt:

Je bent klaar om echte PHP-webapplicaties te bouwen!