Hoofdstuk 13: Cookies

← Terug naar overzicht

Cookies plaatsen

HTTP is een stateless protocol. Dat betekent dat de server bij elk verzoek vergeet wie je bent. Cookies lossen dit op: de server stuurt een klein stukje data mee dat de browser opslaat. Bij elk volgend verzoek stuurt de browser de cookie automatisch mee.

Met setcookie() plaats je een cookie. De functie accepteert minimaal een naam en waarde, en optioneel een verlooptijd. De verlooptijd bereken je met time() plus het aantal seconden.

<?php
// Cookie die 30 dagen geldig is
setcookie("gebruikersnaam", "Jan", time() + (30 * 24 * 60 * 60));
?>

Belangrijk: setcookie() MOET aangeroepen worden VOORDAT er HTML-output naar de browser wordt gestuurd. Dit komt omdat cookies via HTTP-headers worden verzonden, en headers moeten voor de body komen.

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 setcookie() om een cookie te plaatsen met de naam "taal" en de waarde "nl".

Jouw code:

Oefening 2

Plaats een cookie met de naam "stad" en de waarde "Amsterdam" die over 1 uur verloopt. Gebruik time() + 3600.

Jouw code:

Oefening 3

Plaats een cookie met de naam "voorkeur" en de waarde "donker" die 7 dagen geldig is. Bereken de verlooptijd met time() + (7 * 24 * 60 * 60).

Jouw code:

Oefening 4

Maak een variabele $verlooptijd die 30 dagen vooruit is (time() + (30 * 24 * 60 * 60)). Gebruik die variabele vervolgens in setcookie() om een cookie "sessie" met waarde "actief" te plaatsen.

Jouw code:

Oefening 5

Plaats twee cookies: een cookie "voornaam" met waarde "Pieter" en een cookie "achternaam" met waarde "de Vries". Beide verlopen na 1 dag (time() + 86400).

Jouw code:

Oefening 6

Maak een variabele $thema met de waarde "light". Maak een variabele $dagen met de waarde 14. Bereken de verlooptijd en plaats een cookie "thema" met de waarde van $thema, geldig voor $dagen dagen.

Jouw code:

Oefening 7

Schrijf een functie plaatsCookie($naam, $waarde, $dagen) die een cookie plaatst met de opgegeven naam, waarde en geldigheid in dagen. Roep de functie aan met "kleur", "blauw" en 5.

Jouw code:

Oefening 8

Bouw een compleet voorbeeld. Maak een variabele $taalKeuze met waarde "nl". Plaats een cookie "taal" met deze waarde die 90 dagen geldig is. Plaats ook een cookie "laatstBezocht" met de huidige datum (date("Y-m-d")) die 365 dagen geldig is. Toon daarna "Cookies geplaatst voor taal: nl".

Jouw code:

Cookies uitlezen

Nadat een cookie is geplaatst, kun je deze bij het volgende paginaverzoek uitlezen met de superglobal $_COOKIE. Gebruik altijd isset() om te controleren of de cookie bestaat voordat je hem uitleest.

<?php
if (isset($_COOKIE['gebruikersnaam'])) {
    echo "Welkom terug, " . $_COOKIE['gebruikersnaam'];
} else {
    echo "Welkom, bezoeker!";
}
?>

Let op: Een cookie is pas beschikbaar NADAT de pagina opnieuw is geladen. Als je setcookie() aanroept en daarna $_COOKIE leest op dezelfde pagina, is de cookie nog niet zichtbaar. In de oefeningen hieronder doen we alsof de cookie al eerder is geplaatst.

Oefening 1

Controleer met isset() of de cookie "taal" bestaat. Zo ja, toon de waarde met echo. Zo nee, toon "Geen taal ingesteld". (Ga ervan uit dat de cookie NIET bestaat.)

Jouw code:

Oefening 2

Maak een variabele $naam die de waarde van de cookie "voornaam" krijgt als die bestaat, of "Gast" als de cookie niet bestaat. Toon vervolgens "Hallo, " gevolgd door de waarde van $naam.

Jouw code:

Oefening 3

Maak een variabele $thema die de waarde van cookie "thema" bevat als die bestaat, of "light" als standaardwaarde. Toon het resultaat met echo.

Jouw code:

Oefening 4

Controleer of de cookies "voornaam" en "achternaam" beiden bestaan. Zo ja, toon "Welkom, [voornaam] [achternaam]". Zo nee, toon "Welkom, bezoeker". (Ga ervan uit dat geen van beide bestaat.)

Jouw code:

Oefening 5

Schrijf een functie leesCookie($naam, $standaard) die de waarde van een cookie teruggeeft als die bestaat, of de standaardwaarde als die niet bestaat. Test de functie door het resultaat van leesCookie("kleur", "rood") te tonen met echo.

Jouw code:

Oefening 6

Maak een variabele $thema met standaardwaarde "light" via de cookie "thema" (als die niet bestaat, gebruik "light"). Gebruik een ternary. Toon vervolgens de HTML: <body class="[thema]"> waarbij [thema] de waarde van $thema is.

Jouw code:

Oefening 7

Schrijf een functie toonBegroeting() die controleert of de cookie "gebruiker" bestaat. Zo ja, return "Welkom terug!". Zo nee, return "Hallo, nieuwe bezoeker!". Toon het resultaat met echo.

Jouw code:

Oefening 8

Schrijf een functie leesCookies($namen) die een array van cookienamen ontvangt en een associatieve array teruggeeft met de cookienaam als sleutel en de waarde (of "niet ingesteld" als standaard). Test met de namen ["taal", "thema", "gebruiker"] en toon elke naam en waarde met een foreach-loop.

Jouw code:

Cookie validatie & verwijderen

Het is belangrijk om cookiewaarden te valideren voordat je ze gebruikt. Een gebruiker kan cookies handmatig aanpassen! Gebruik in_array() om te controleren of een waarde in een lijst van toegestane waarden staat (whitelist). Om een cookie te verwijderen, plaats je dezelfde cookie met een verlooptijd in het verleden.

<?php
// Cookie verwijderen
setcookie("thema", "", time() - 3600);

// Cookie valideren met whitelist
$toegestaan = ["light", "dark", "high-contrast"];
$thema = isset($_COOKIE['thema']) ? $_COOKIE['thema'] : "light";
if (!in_array($thema, $toegestaan)) {
    $thema = "light"; // Terugvallen op standaard
}
?>

Vergeet nooit: gebruik htmlspecialchars() wanneer je een cookiewaarde toont in HTML. Een aanvaller zou anders schadelijke code in een cookie kunnen plaatsen (XSS-aanval).

Oefening 1

Verwijder de cookie "taal" door setcookie() aan te roepen met een lege waarde en een verlooptijd in het verleden (time() - 3600).

Jouw code:

Oefening 2

Maak een array $toegestaan met de waarden "light", "dark" en "high-contrast". Maak een variabele $keuze met de waarde "blauw". Controleer met in_array() of $keuze in de toegestane lijst staat. Zo ja, toon $keuze. Zo nee, toon "light".

Jouw code:

Oefening 3

Schrijf een functie valideerThema($thema) die controleert of het thema "light", "dark" of "high-contrast" is. Zo ja, return het thema. Zo nee, return "light". Test met echo valideerThema("dark") en echo valideerThema("ongeldig").

Jouw code:

Oefening 4

Maak een variabele $thema met de waarde "dark". Toon de tekst "Thema: dark" waarbij de waarde beveiligd is met htmlspecialchars().

Jouw code:

Oefening 5

Schrijf een functie verwijderCookie($naam) die een cookie verwijdert door de verlooptijd in het verleden te zetten. Roep de functie aan met "sessie".

Jouw code:

Oefening 6

Schrijf een complete thema-instelling. Maak een variabele $thema die de cookiewaarde "thema" uitleest (standaard "light"). Valideer met de functie valideerThema() (die je ook moet schrijven). De geldige waarden zijn "light", "dark" en "high-contrast". Toon het resultaat veilig met htmlspecialchars().

Jouw code:

Oefening 7

Bouw een compleet instellingensysteem. Schrijf de functie valideerThema($thema) (geldige waarden: "light", "dark", "high-contrast"). Lees de cookie "thema" uit (standaard "light"), valideer het thema, en toon de HTML: <body class="[thema]">Welkom!</body>. Beveilig de output met htmlspecialchars().

Jouw code:

Oefening 8

Bouw een cookie-gebaseerd taalvoorkeur-systeem. Schrijf een functie valideerTaal($taal) die controleert of de taal "nl", "en" of "de" is (anders standaard "nl"). Schrijf een functie toonWelkomBericht($taal) die "Welkom!" toont voor "nl", "Welcome!" voor "en", en "Willkommen!" voor "de". Lees de cookie "taal" uit (standaard "nl"), valideer, en toon het welkombericht.

Jouw code:

Samenvatting

In dit hoofdstuk heb je geleerd: