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.
Gebruik setcookie() om een cookie te plaatsen met de naam "taal" en de waarde "nl".
Plaats een cookie met de naam "stad" en de waarde "Amsterdam" die over 1 uur verloopt. Gebruik time() + 3600.
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).
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.
Plaats twee cookies: een cookie "voornaam" met waarde "Pieter" en een cookie "achternaam" met waarde "de Vries". Beide verlopen na 1 dag (time() + 86400).
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.
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.
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".
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.
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.)
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.
Maak een variabele $thema die de waarde van cookie "thema" bevat als die bestaat, of "light" als standaardwaarde. Toon het resultaat met echo.
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.)
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.
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.
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.
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.
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).
Verwijder de cookie "taal" door setcookie() aan te roepen met een lege waarde en een verlooptijd in het verleden (time() - 3600).
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".
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").
Maak een variabele $thema met de waarde "dark". Toon de tekst "Thema: dark" waarbij de waarde beveiligd is met htmlspecialchars().
Schrijf een functie verwijderCookie($naam) die een cookie verwijdert door de verlooptijd in het verleden te zetten. Roep de functie aan met "sessie".
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().
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().
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.
In dit hoofdstuk heb je geleerd:
setcookie($naam, $waarde, $verlooptijd)time() plus seconden$_COOKIE en isset()in_array() (whitelist)htmlspecialchars()