Hoofdstuk 15: Projectintegratie

← Terug naar overzicht

Code hergebruiken

Naarmate je projecten groter worden, wil je code netjes organiseren. Met include en require kun je PHP-bestanden in andere bestanden laden. Zo kun je functies in een apart bestand functies.php zetten en die overal hergebruiken. Het verschil: require stopt het script bij een fout, include geeft alleen een waarschuwing.

<?php
// functies.php
function begroet($naam) {
    return "Hallo, " . $naam . "!";
}

// index.php
require "functies.php";
echo begroet("Jan");
?>

Gebruik require als het bestand essentieel is voor je script (bijv. functies die je nodig hebt). Gebruik include als het bestand optioneel is (bijv. een sidebar). In de praktijk gebruik je bijna altijd require.

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. We simuleren include/require door de functies in hetzelfde bestand te schrijven.

Oefening 1

Schrijf een functie reinigInvoer($tekst) die trim() en htmlspecialchars() toepast op de invoer en het resultaat teruggeeft. Test met echo reinigInvoer(" <b>Hallo</b> ").

Jouw code:

Oefening 2

Schrijf een functie formatteerDatum($datum) die een datum in het formaat "2024-03-15" omzet naar "15 maart 2024". Gebruik explode("-", $datum) om te splitsen. Maak een array $maanden met Nederlandse maandnamen (index 1-12). Test met echo formatteerDatum("2024-03-15").

Jouw code:

Oefening 3

Schrijf een functie valideerEmail($email) die filter_var() met FILTER_VALIDATE_EMAIL gebruikt. Return true als het e-mailadres geldig is, false als het ongeldig is. Test met een geldig en een ongeldig adres en toon het resultaat.

Jouw code:

Oefening 4

Schrijf drie functies die samen een functies.php zouden vormen: reinigInvoer($tekst) (trim + htmlspecialchars), valideerEmail($email) (filter_var), en formatteerPrijs($bedrag) (return "EUR " + number_format($bedrag, 2, ",", ".") ). Test alle drie en toon de resultaten.

Jouw code:

Oefening 5

Schrijf een functie valideerVerplichtVeld($waarde, $veldnaam) die controleert of een waarde niet leeg is na trim(). Als het veld leeg is, return de foutmelding "[veldnaam] is verplicht". Als het geldig is, return een lege string "". Test met een leeg veld en een ingevuld veld.

Jouw code:

Oefening 6

Schrijf een functie maakSlug($tekst) die een tekst omzet naar een URL-vriendelijke slug: maak lowercase met strtolower(), vervang spaties door streepjes met str_replace(" ", "-", ...). Test met echo maakSlug("Mijn Eerste Blog Post").

Jouw code:

Invoer & validatie combineren

In een echt project moet je formulierinvoer altijd valideren voordat je ermee werkt. Een goed patroon is om een $errors array te gebruiken: je controleert elk veld en voegt foutmeldingen toe. Alleen als de array leeg is, ga je verder met het verwerken van de data.

<?php
$errors = [];

$naam = trim($_POST['naam'] ?? "");
if ($naam === "") {
    $errors[] = "Naam is verplicht";
}

$email = trim($_POST['email'] ?? "");
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    $errors[] = "Ongeldig e-mailadres";
}

if (empty($errors)) {
    // Verwerk de data
    echo "Formulier is geldig!";
} else {
    foreach ($errors as $fout) {
        echo $fout . "<br>";
    }
}
?>

Het $errors patroon is een veelgebruikte aanpak in PHP: verzamel alle fouten eerst, en verwerk de data alleen als er geen fouten zijn. Zo krijgt de gebruiker alle foutmeldingen in een keer te zien.

Oefening 1

Maak een variabele $naam met de waarde "" (leeg). Maak een array $errors. Als $naam leeg is na trim(), voeg "Naam is verplicht" toe aan $errors. Controleer of $errors leeg is met empty() en toon het juiste bericht.

Jouw code:

Oefening 2

Valideer twee velden: $naam = "Jan" en $email = "geenemail". Voeg foutmeldingen toe aan $errors als de naam leeg is of als het e-mailadres ongeldig is (gebruik filter_var). Toon alle fouten of "Alles in orde".

Jouw code:

Oefening 3

Schrijf een functie valideerFormulier($naam, $email, $bericht) die een array met foutmeldingen teruggeeft. Controleer: naam niet leeg, email geldig met filter_var, bericht minimaal 10 tekens (gebruik strlen()). Test met $naam = "", $email = "test@test.nl", $bericht = "kort" en toon alle fouten.

Jouw code:

Oefening 4

Schrijf een functie reinigInvoer($tekst) (trim + htmlspecialchars) en een functie valideerContactFormulier($naam, $email) die de invoer eerst reinigt en dan valideert. Return een array met fouten. Test met $naam = " " (alleen spaties) en $email = "jan@test.nl".

Jouw code:

Oefening 5

Schrijf een complete validatie met drie velden: $naam = "Jan", $email = "jan@test.nl" en $leeftijd = "abc". Valideer: naam niet leeg, email geldig, leeftijd moet numeriek zijn (gebruik is_numeric()). Als er geen fouten zijn, toon "Welkom, Jan (jan@test.nl)". Anders toon de fouten.

Jouw code:

Oefening 6

Schrijf een functie valideerWachtwoord($wachtwoord) die een array met foutmeldingen teruggeeft. Controleer: minimaal 8 tekens (strlen), bevat een cijfer (preg_match('/[0-9]/', ...)), bevat een hoofdletter (preg_match('/[A-Z]/', ...)). Test met "kort" en toon de fouten.

Jouw code:

Data opslaan & tonen

Het ultieme doel is een complete workflow: formulierdata ontvangen via POST, valideren, opslaan in een bestand, en weer tonen. We slaan gegevens op in een tekstbestand met een scheidingsteken (bijv. |), en lezen ze weer uit met file() en explode().

<?php
// Opslaan
$regel = $naam . "|" . $email . "|" . date("Y-m-d") . PHP_EOL;
file_put_contents("database.txt", $regel, FILE_APPEND);

// Uitlezen en tonen
$regels = file("database.txt", FILE_IGNORE_NEW_LINES);
foreach ($regels as $regel) {
    $velden = explode("|", $regel);
    echo "<p>" . htmlspecialchars($velden[0]) . " - " . htmlspecialchars($velden[1]) . "</p>";
}
?>

Dit patroon (POST ontvangen, valideren, opslaan, tonen) is de basis van vrijwel elke webapplicatie. In de praktijk gebruik je een database in plaats van een tekstbestand, maar het principe is hetzelfde.

Oefening 1

Maak twee variabelen: $naam = "Jan" en $email = "jan@test.nl". Sla ze op in "database.txt" in het formaat "naam|email" gevolgd door PHP_EOL. Lees het bestand daarna uit en toon de inhoud.

Jouw code:

Oefening 2

Schrijf een functie slaOp($naam, $email) die de gegevens met datum opslaat in "contacten.txt" (formaat: naam|email|datum, datum met date("Y-m-d")). Gebruik FILE_APPEND. Sla twee contacten op: "Jan" met "jan@test.nl" en "Sara" met "sara@test.nl".

Jouw code:

Oefening 3

Schrijf een functie toonContacten() die "contacten.txt" inleest met file(), elke regel splitst op "|" en toont als "[naam] ([email])<br>". Beveilig de output met htmlspecialchars(). Maak eerst het bestand met twee regels: "Jan|jan@test.nl|2024-01-01" en "Sara|sara@test.nl|2024-01-02".

Jouw code:

Oefening 4

Bouw een complete workflow. Schrijf de functies reinigInvoer($tekst), valideerEnSlaOp($naam, $email) (valideer naam niet leeg en email geldig, sla op in "data.txt" met | en datum, return array met fouten), en toonData() (lees en toon). Begin met een leeg bestand. Verwerk: naam "Jan", email "jan@test.nl". Toon de opgeslagen data.

Jouw code:

Oefening 5

Schrijf een functie zoekContact($zoekterm) die door "contacten.txt" zoekt. Lees het bestand met file(), splits elke regel op "|", en controleer of de zoekterm voorkomt in het naam-veld (gebruik stripos()). Toon matches als "Gevonden: [naam] ([email])<br>". Maak eerst het bestand met drie contacten. Zoek naar "jan".

Jouw code:

Oefening 6

Bouw een compleet mini-CMS. Schrijf de functies: reinigInvoer($tekst), valideerArtikel($titel, $inhoud) (titel niet leeg, inhoud min. 20 tekens, return fouten), slaArtikelOp($titel, $inhoud) (sla op in "artikelen.txt" met | en datum), en toonArtikelen() (toon nieuwste eerst). Begin met leeg bestand, voeg een artikel toe met titel "PHP Basics" en inhoud "PHP is een krachtige server-side taal voor webontwikkeling.", en toon alle artikelen.

Jouw code:

Samenvatting

In dit hoofdstuk heb je geleerd: