Cookies in PHP 1. Wat is een cookie ?
2. Hoe ziet een cookie er uit ?
3. Wat kun je met een cookie ?
4. Cookies in PHP
4.1 Een cookie plaatsen
4.2 Controleren op het bestaan van een cookie
4.3 Waarde(n) uitlezen uit een cookie
4.4 Een cookie verwijderen
4.5 Meerdere waarden toekennen aan een cookie
5. Bronnen
1. Wat is een cookie ?
Een cookie is een (text)bestand op jouw computer, afkomstig van een website.
Een cookie bevat informatie over die website (dit kan van alles zijn).
Nadat je een website hebt bezocht, en je je browser hebt afgesloten, 'weet'
je browser niet meer dat jij deze website hebt bezocht, of wat je er hebt gedaan.
Alle informatie van je bezoek is (aan jouw kant) dus weg. Om informatie van / over de website
bij te houden, kan een website een cookie creëren op de machine die de site
bezoekt.
De meeste moderne browsers ondersteunen het gebruik van cookies, dus je mag er
in principe van uit gaan dat je cookies kunt gebruiken.
Er bestaat echter wel de mogelijkheid dat browsers cookies van bepaalde sites
weigeren, of het gebruik van cookies helemaal uitgeschakeld staat - je kan dit
allemaal in je browser instellen (als je hiervoor voldoende rechten hebt
vanuit je besturingssysteem).
2. Hoe ziet een cookie er uit ?
Een cookie is, zoals eerder gezegd, een textbestand met informatie van / over een website.
Je kan in Internet Explorer cookies bekijken:
Tools > Internet Options > Settings > View Files
Cookies staan bij Internet Explorer opgeslagen in je Temporary Internet Files folder
en worden in de naam vooraf gegaan door "Cookie:"
Als je een cookie-bestand opent, zie je een lange string tekst staan.
Of in Mozilla FireFox:
Tools > Options > Privacy > Cookies > Stored Cookies
Hier krijg je een net overzicht van de cookies die op je machine staan en wat er in zit.
Een cookie bestaat uit de volgende onderdelen:
- een naam (name)
- een waarde (value)
- een verloopdatum (expire)
- een pad (path)
- een domein (domain)
- een 'secure-flag' (secure)
De naam wordt gebruikt om een cookie te kunnen identificeren. Elke naam moet uniek zijn. Dit veld
is het enige verplichte veld van een cookie.
De verloopdatum geeft aan tot wanneer een cookie geldig is. De datum is, als je het cookie aanmaakt
met PHP, een UNIX-time (het aantal seconden vanaf 1 Januari 1970). Je kan hiervoor dus de PHP-functie
time() gebruiken . Als je geen tijd invult bij het setten van een cookie,
of hier 0 voor invult, zal het cookie geldig zijn tot het moment waarop je de browser afsluit.
Het pad van een cookie geeft aan in welke (sub)folder van de website het cookie geldig is.
Als je voor het pad "/" opgeeft, is het cookie in het hele domein geldig. Als je voor het pad "/bla/"
instelt, is het cookie alleen geldig in de folder /bla/, en alle subfolders hiervan.
Standaard is het cookie alleen geldig in de directory waarin het cookie geset wordt.
Het domein van een cookie geeft aan waar (welk (sub)domein) het cookie op de site geldig is.
Als je wilt dat een cookie geldig is in alle subdomeinen van bla.com, dan stel je hier ".bla.com" in.
Als je wilt dat het cookie alleen geldig is in het www subdomein, stel je hier "www.bla.com" in.
Standaard is het cookie geldig in het domein waarin het cookie geset is.
Het secure-veld van een cookie geeft aan of een cookie alleen verstuurd zou mogen worden als je met
een beveiligde connectie (https) werkt.
Standaard staat deze optie op false (je werkt ook meestal niet standaard met https).
3. Wat kun je met een cookie ?
Je kan de meest uiteenlopende dingen opslaan in een cookie, zoals:
- informatie over de laatst bezochte pagina of het vorige bezoek aan de site
- informatie over een poll waar iemand op gestemd heeft
- informatie over de voorkeur van een gebruiker voor een bepaalde stylesheet (die bepaalt hoe de pagina er uit ziet)
- informatie over de voorkeur voor een gebruikte taal op de website
- informatie over de laatst verrichte zoekactie (bijvoorbeeld de zoektermen)
Met cookies kun je dus (mede) bepalen hoe een pagina er uit ziet; vaak worden ze gebruikt om voorkeuren
van gebruikers op te slaan. Cookies maken een webpagina dynamisch(er).
Je zou zelfs een 'dynamische' site kunnen schrijven met enkel JavaScript en HTML.
4. cookies in PHP
De cookies van je eigen website kun je in PHP (vanaf versie 4.1.0) benaderen via de superglobal
(het superglobale array) $_COOKIE. $_COOKIE bevat (per site) alle geldige (niet verlopen) cookies van die site.
Cookies maken deel uit van de HTTP header. Net als de header()
functie, moeten cookies geset worden voordat er output naar de browser wordt gestuurd, anders krijg je de welbekende "headers already sent" foutmelding.
Wat je ook kunt doen in plaats van het versturen van headers (waaronder cookies) voordat je
pagina(inhoud) begint is het gebruiken van ob_start(), een functie
die er voor zorgt dat er gewacht wordt met het verzenden van alle output (behalve headers) tot het moment waarop
jij aangeeft dat er output verstuurd mag worden. Als je output wil gaan versturen kun je de functie
ob_end_flush() aanroepen, die er voor zorgt dat de
tot dan toe gebufferde output wordt verstuurd. Laat je deze laatste functie geheel achterwege, en gebruik je alleen
ob_start(), dan zorgt dit ervoor dat alle output pas verstuurd
wordt op het moment dat je hele script is verwerkt. Op deze manier worden de headers van de content gescheiden
(ob_start() 'sorteert' deze voor je) en heb je dus geen last van
"header already sent" foutmeldingen.
Wel zou je voorzichtig moeten omspringen met deze nieuw verkregen vrijheid, het is geen goede programmeergewoonte om maar ergens
in je script een cookie te setten of van waarde te veranderen, wanneer het jou uit komt. Het beste is om het setten en
verwijderen van cookies op een vaste plaats in je code te regelen (bijvoorbeeld ergens aan het begin van je script).
4.1 Een cookie plaatsen
Je kan een cookie plaatsen door middel van aanroep van de functie setcookie().
Als de functie setcookie() succesvol is uitgevoerd, retourneert deze functie true, anders false. Dit zegt
dus niets over het wel of niet geaccepteerd worden van de cookie door de client waar je het cookie wilt plaatsen!
Je kan een aanroep van setcookie() altijd plaatsen voordat je pagina begint (dus voor de <head> en voor de <!DOCTYPE ...> tag),
of, wanneer je dus van ob_start() gebruik maakt, op een willekeurige plaats in je script.
De parameters van de setcookie() functie zijn zoals in het onderdeel 2. Hoe ziet een cookie er uit ? is beschreven.
Je kan bijvoorbeeld op de volgende manier een cookie plaatsen (met naam "taal" en inhoud "nl") dat geldig is tot het
moment waarop de gebruiker zijn/haar browser sluit:
<?php
setcookie("taal", "nl");
?>
Wil je het cookie een langere levensduur geven dan enkel deze 'sessie', dan kun je met behulp van de derde parameter
(de verloopdatum) aangeven hoe lang het cookie dient te bestaan. Deze verloopdatum is, zoals al eerder gezegd, een UNIX-timestamp.
Met time() vraag je de huidige datum/tijd op in UNIX-timestamp
formaat. Het aantal seconden wat je hierbij optelt is de levensduur van je cookie. Stel dat je het cookie een uur geldig
wil laten zijn, dan tel je dus 60*60 seconden op bij de huidige tijd (time()):
<?php
setcookie("taal", "nl", time()+3600);
?>
Werk je met meedere folders op je website, en je wilt je cookie in elke folder ervan geldig laten zijn, dan doe je er
verstandig aan om het pad "/" mee te geven aan je cookie, dat er voor zorgt dat je cookie in alle folders van je
huidige domein geldig is.
<?php
setcookie("taal", "nl", time()+3600, "/");
?>
Het bovenstaande cookie "taal", zal dus de waarde "nl" bevatten, en een uur lang geldig zijn in elke folder van het
domein waarin je het cookie hebt geset.
Wanneer de subdomeinen van een domein compleet verschillende sites zijn, heeft het niet zoveel zin om
het (overkoepelende) domein toe te voegen aan het cookie zodat je cookie op alle subdomeinen geldig is -
meestal heeft een cookie afkomstig uit subdomein A geen betekenis binnen subdomein B. De vermelding van
een domein in setcookie() wordt dus meestal achterwege gelaten.
Wanneer je met https werkt, dient de laatste parameter van het cookie (de 'secure-flag') op true te staan. We gaan
hier verder niet op https in.
Een tweede manier om een cookie te setten is met setrawcookie() (vanaf PHP 5.0).
Het verschil tussen setcookie() en
setrawcookie() is, dat bij setrawcookie() speciale karakters in de cookie-waarde niet
worden vertaald - bij setcookie() gebeurt dit wel. Speciale karakters (alle niet-alfanumerieke karakters behalve '_')
worden bij setcookie() vertaald naar een %, gevolgd door twee hexadecimale karakters, die de ASCII code van het karakter voorstellen.
Spaties worden opgeslagen als '+'.
Dit noemt men URL-encoding (zie urlencode()).
Wanneer we dus het volgende cookie setten:
<?php
setcookie("cooked", "a;b;c d+e");
?>
Zal het cookie "cooked" de volgende inhoud hebben:
a%3Bb%3Bc+d%2Be
%2B = 2x16 + 11 = 43. ASCII karakter 43 is een plus-teken.
%3B = 3x16 + 11 = 59. ASCII karakter 59 is een punt-komma.
Nota bene, als je inhoud van het cookie afdrukt, zal er gewoon "a;b;c d+e" afgedrukt worden.
4.2 Controleren op het bestaan van een cookie
Voordat je een cookie probeert uit te lezen, zou je (eigenlijk) eerst moeten controleren of het cookie bestaat.
Dit doe je op dezelfde wijze als het controleren op het bestaan van een gewone variabele: je gebruikt de functie
isset().
Stel dat je cookie "cooked" heet, dan kun je als volgt op het bestaan van het cookie controleren:
<?php
if(isset($_COOKIE['cooked'])) {
// cookie bestaat
...
} else {
// cookie bestaat niet
...
}
?>
4.3 Waarde(n) uitlezen uit een cookie
Na de controle die kijkt of het cookie bestaat kun je de informatie die in het cookie staat uitlezen. Dit kan overal
op je webpagina, omdat je je cookie niet aanpast, en dus ook geen headers verstuurt.
Stel je hebt een cookie met de naam "cooked", en je wilt de waarde hiervan uitlezen:
<?php
// controleer eerst of het cookie bestaat
if(isset($_COOKIE['cooked'])) {
// cookie bestaat, lees de waarde uit
$cookie_var = $_COOKIE['cooked'];
// druk de waarde eventueel af (dit kan ook rechtstreeks natuurlijk)
echo "cookie waarde: ".$cookie_var;
} else {
// cookie bestaat niet
echo "cookie bestaat niet.";
}
?>
4.4 Een cookie verwijderen
Je kan cookies verwijderen door ze te setten met een UNIX-timestamp die in het verleden ligt.
Stel dat je eerder een cookie had geset met de naam "cooked", en je wilt deze verwijderen, dan doe je het volgende:
<?php
// verwijder het cookie
setcookie("cooked", "", time()-3600);
?>
Je kan de value van de cookie expliciet leeg maken door in het waarde-veld de lege string ("") in te vullen.
Hier zou je in principe willekeurige onzin in kunnen vullen, omdat je het cookie toch meteen laat verlopen.
Je moet hier sowieso wat invullen, anders kun je geen derde parameter (verloopdatum) invullen.
Je zou kunnen overwegen om eerst te controleren of het cookie wel bestond, voordat je het verwijdert:
<?php
// was er in de eerste plaats een cookie geset?
if(isset($_COOKIE['cooked'])) {
// verwijder het cookie
setcookie("cooked", "", time()-3600);
}
?>
4.5 Meerdere waarden toekennen aan een cookie
Je hebt in principe de mogelijkheid om een 'array-notatie' in de naam van een cookie te gebruiken. Elk 'array-element'
is dan wel een apart cookie, maar je kan alle cookies benaderen alsof het één array is.
Maak de cookies als volgt aan:
<?php
// cookies aanmaken
setcookie("mijnarray[een]", "aap");
setcookie("mijnarray[twee]", "noot");
setcookie("mijnarray[drie]", "mies");
?>
Je kunt nu de cookies uitlezen met:
<?php
// bestaat het cookie-array ?
if(isset($_COOKIE['mijnarray'])) {
// loop alle cookies af
foreach($_COOKIE['mijnarray'] as $k => $v) {
echo $k.": ".$v."<br />";
}
}
?>
levert:
een: aap
twee: noot
drie: mies
Een manier om meerdere waarden in één cookie te stoppen is door gebruik te maken van een zelf gekozen
scheidingskarakter. Stel dat we de verschillende waarden willen scheiden door middel van een ';' (een
punt-komma). Het setten van het cookie gaat op de gebruikelijke manier:
<?php
// cookie setten
setcookie("multicook", "aap;noot;mies");
?>
Bij het uitlezen scheid je de waarden door middel van explode().
explode() neemt een string als invoer (tweede parameter), en scheid
deze op grond van een scheidingskarakter (eerste parameter). explode()
retourneert een array.
<?php
// controleer of het cookie bestaat
if(isset($_COOKIE['multicook'])) {
// stop de verschillende waarden in een array
$cookie_vars = explode(";", $_COOKIE['multicook']);
}
?>
$cookie_vars is nu een array die de volgende inhoud bevat:
Array
(
[0] => aap
[1] => noot
[2] => mies
)
Als je de afzonderlijke cookie-waarden direct aan variabelen wilt toekennen, dan kan dit. Dit doe je met behulp
van list().
list() heeft als parameters variabelen, die hun waarde uit een array halen - list() kent dus variabelen 'array-gewijs' waarden toe:
<?php
// controleer of het cookie bestaat
if(isset($_COOKIE['multicook'])) {
// ken waarden toe aan de variabelen in list()
list($een, $twee, $drie) = explode(";", $_COOKIE['multicook']);
}
?>
$een bevat nu de waarde van het eerste array-element (index 0) van explode(";", $_COOKIE['multicook']) - dit is "aap".
Zo heeft $twee de waarde "noot" (index 1) en $drie de waarde "mies" (index 2).
5. Bronnen
http://www.php.net/explode/
http://www.php.net/isset/
http://www.php.net/list/
http://www.php.net/setcookie/
http://www.php.net/setrawcookie/
http://www.php.net/urlencode/
http://www.php.net/manual/en/features.cookies.php
|