Déjà, c’est quoi les cookies ?
Non, les cookies dont je vais vous parler ici n’ont rien à voir avec le gâteau du même nom.
Les cookies sont de petits fichiers texte présents sur l’ordinateur client et envoyés par le serveur. La grande utilité des cookies est de pouvoir y stocker diverses informations que vous pouvez récupérer ultérieurement (nous verrons comment plus loin dans cet article). Le désavantage des cookies est que le client (comprenez le visiteur) peut paramétrer son navigateur pour refuser les cookies.
Il est donc élémentaire de ne pas s’appuyer excusivement sur l’utilisation des cookies et de prévoir un système de secours (passage des variables par l’URL par exemple).
Voila en gros à quoi ressemble le contenu d’un cookie :
Commençons par le nom du fichier : bobe@www.phpcodeur[2].txt
Remarquez le chiffre entre crochets, il indique le nombre de cookies contenus dans le fichier. En effet, tous les cookies émis par un même site sont stockés dans le même fichier. Le contenu du fichier consiste en une suite de données, séparées par un saut de ligne [1], les différents cookies étant séparés entre eux par un astérisque.
Voici comment se compose le premier cookie :
- pseudo correspond au nom que j’ai donné au cookie
- bobe correspond à la valeur du cookie
- www.phpcodeur.net/ correspond au répertoire pour lequel le cookie est actif (ici, le répertoire racine du site et tous les sous répertoire, en résumé, le cookie est actif sur tout le site)
Vient ensuite une série de chiffre dont je n’ai pas dicerné précisément l’utilité puis l’astérisque de séparation.
Et maintenant, le deuxième cookie :
- pass, le nom du cookie
- dfg84regj87uk9zef78uk4vv4zry8HFD, la valeur du cookie (ici, un mot de passe crypté [2])
- www.phpcodeur.net/ toujours pour le répertoire à partir duquel le cookie est actif
Créer un cookie avec PHP
Pour la gestion des cookies, le langage PHP met à disposition la fonction setcookie(). En voici la définition :
int setcookie ( string name [, string value [, int expire [, string path [, string domain [, int secure]]]]])
PHP enverra le cookie name avec la valeur value au navigateur client. La date d’expiration expire du cookie doit être un timestamp unix, et si elle n’est pas précisée, le cookie est supprimé à la fin de la session [3]. Le répertoire path indique les répertoires du site émetteur où le cookie est actif. domain indique le nom de domaine émetteur. Enfin, secure permet d’indiquer si le cookie doit être envoyé uniquement à travers une connexion sécurisée.
<?php
setcookie('cookie_name', 'blablabla', (time() + 3600));
?>
Ici, on envoie un cookie portant le nom cookie_name
et ayant la valeur blablabla
. Sa durée de vie est de une heure (timestamp unix + 3600 secondes)
Note : La valeur du cookie est automatiquement encodé lors de l’envoi et décodé lors de la réception.
Note : Les cookies doivent être envoyés avant tout début d’affichage, c’est à dire qu’aucune donnée ne doit avoir été envoyé en sortie lors de l’appel à la fonction setcookie(), sinon, vous aurez droit à un message d’erreur de ce genre :
Warning: Cannot add header information – headers already sent by (output started at f:\web\www\test\test.php:2) in f:\web\www\test\test.php on line 4
Lecture d’un cookie avec PHP
Pour réceptionner le contenu du cookie, rien de plus simple, la valeur du cookie est affectée à une variable portant le nom du cookie. Toutefois, cela n’est pas très pratique pour s’y retrouver plus tard dans son code, et c’est pas top niveau sécurité, car vous n’êtes pas sûr que le contenu de la variable portant le nom du cookie vienne bien du cookie.
Préférez donc la variable prédéfinie $_COOKIE
ou encore $HTTP_COOKIE_VARS
(si vous travaillez sur PHP 4.1.0 ou supérieur).
Si l’on reprend l’exemple précédent :
<?php
/*
* Les trois exemples suivants afficheront
* tous "blablabla".
*/
echo $cookie_name; // exemple 1 (si registar_globals est à on dans php.ini)
echo $HTTP_COOKIE_VARS['cookie_name']; // exemple 2
echo $_COOKIE['cookie_name']; // exemple 3 (si on est sur PHP 4.1.0 ou plus)
?>
Note : Vous ne pouvez pas lire le contenu d’un cookie aussitôt après l’avoir envoyé, vous devez attendre d’avoir changé de page ou d’avoir rechargé la page.
Détruire un cookie avec PHP
Pour cela, il vous suffit de faire appel à la fonction setcookie() avec pour seul argument le nom du cookie à détruire. Vous pouvez également spécifier une chaine quelconque pour la valeur du cookie et une valeur minimale pour la date d’expiration du cookie.
Toujours avec le même exemple de cet article :
<?php
/*
* Les deux exemples suivants sont équivalents
*/
setcookie('cookie_name'); // exemple 1
setcookie('cookie_name', '', 1); // exemple 2
?>
Informations complémentaires
Si vous voulez que le cookie ne soit accessible que pour certains répertoires de votre site, vous pouvez le spécifier avec le quatrième argument de la fonction setcookie().
Admettons que vous ayez un répertoire rep1
sur votre site : https://www.domaine.com/rep1/
<?php
setcookie('cookie_name', 'blablabla', (time() + 3600), '/rep1/');
?>
Le cookie ne pourra être lu que par un script se trouvant dans le répertoire rep1
ou dans un de ses sous-repertoires.
Vous pouvez également utiliser les cookies comme des tableaux :
<?php
setcookie('cookie_name[miam]', 'c\'est bon', (time() + 3600));
setcookie('cookie_name[slurp]', 'c\'est délicieux', (time() + 3600));
setcookie('cookie_name[berk]', 'c\'est dégueulasse', (time() + 3600));
?>
Et pour réceptionner les cookies :
<?php
echo $_COOKIE['cookie_name']['miam']; // affichera "c'est bon"
echo $_COOKIE['cookie_name']['slurp']; // affichera "c'est délicieux"
echo $_COOKIE['cookie_name']['berk']; // affichera "c'est dégueulasse"
?>