Les cookies en PHP
Un cookie est un mécanisme d’enregistrement et de lecture de données sur le client. C’est une information qu’un site Web demande à un navigateur de mémoriser.
Le cookie n’est pas dangereux en soi, ce n’est qu’un fichier texte enregistrer dans un répertoire selon le navigateur. Aucun virus ne peut être dissimulé dans un cookie. Les données d’un cookie ne peut pas être lues par un autre site.
Il sont souvent exploiter par les sites à vocation commerciale pour suivre l’internaute (son caddie, ses consultations de produits..).
Les cookies sont utiles, par exemple, pour mémoriser les identifiants de connexion d’un internaute pour éviter de les ressaisir à chaque fois . L’utilisation des cookies permet aussi à PHP de faire fonctionner les sessions.
Créer un cookie simple
La fonction setcookie() permet d’envoyer un cookie sur le client. Cette fonction doit être appelée avant tout affichage de texte dans la page.
La fonction accepte au moins trois paramètres, le nom du cookie, sa valeur, et sa durée de vie exprimée en nombre de secondes depuis le 1 janvier 1970 (timestamp Unix). Pour connaitre la durée écoulée jusqu’à aujourd’hui, on utilise la fonction time().
Si la durée de vie n’est pas fournie, le cookie expirera à la fin de la session (lorsque le navigateur sera fermé), dans le cas contraire le cookie est appelé cookie persistant.
<?php
setcookie("CompteurPage", 1, time()+365*24*3600); // expiration au bout de 1 an
?>
Le cookie mémorise la première visite de l’internaute sur une page. Le cookie expire au bout de 1 an.
Note : La valeur d’un cookie doit être un nombre ou une chaîne de caractères. Sans la fonction de sérialisation (voir plus bas), vous ne pouvez pas stocker un tableau.
Créer un cookie avec la notation tableau
Les cookies peuvent être utilisés avec des tableaux associatifs. Cela à l’avantage de sauvegarder plusieurs valeurs sur un seul cookies et de les retrouver de façon plus intuitive puisque que les clés sont des chaines de caractères.
<?php
//en haut de la page 'accueil.php'
setcookie("CompteurPage[accueil]", 1, time()+365*24*3600);
//en haut de la page 'servicesphp
setcookie("CompteurPage[services]", 1, time()+365*24*3600);
//en haut de la page 'contact.php'
setcookie("CompteurPage[contact]", 1, time()+365*24*3600);
?>
Le même cookie mémorise la première visite de l’internaute sur trois pages différentes.
Note : même si on utilise une notation tableau, chaque valeur d’un cookie doit être un nombre ou une chaîne de caractères. Sans la fonction de sérialisation (voir plus bas), vous ne pouvez pas stocker un tableau comme valeur.
Récupérer la valeur d’un cookie simple
La variable superglobale $_COOKIE[] permet la récupération des valeurs. c’est un tableau associatif.
Le nom du cookie définit par setcookie() est la clé du tableau associatif qui retourne la valeur.
<?php
echo $_COOKIE['CompteurPage'];
?>
Note : La superglobale $_COOKIE[] ne peut être utilisée qu’en lecture seulement.
Récupérer la valeur d’un cookie tableau
Avec la notation tableau, la superglobale $_COOKIE[‘nomducookie’] retourne directement un tableau. La fonction foreach() peut servir à parcourir toutes les valeurs et les clés de ce tableau.
<?php
// Après avoir rechargé la page :
if (isset($_COOKIE['CompteurPage'])) {
foreach ($_COOKIE['CompteurPage'] as $name => $value) {
echo "$name : $value <br>";
}
}
?>
Affichage
accueil : 1
services : 1
contact : 1
Modifier la valeur d’un cookie simple
Pour modifier la valeur d’un cookie, il faut recréer un cookie de même nom mais de valeur différente.
<?php
// Après avoir rechargé la page :
if (isset($_COOKIE['CompteurPage'])) {
$nbPages = $_COOKIE['CompteurPage']; // on récupère l'ancienne valeur
$nbPages++; // on incrémente
setcookie("CompteurPage", $nbPages, time()+365*24*3600); // on modifier le cookie
}
?>
Dans cet exemple on réalise un compteur de visite de pages
Modifier la valeur d’un cookie tableau
Pour modifier la valeur d’un cookie tableau, il faut, comme dans le cas d’un cookie simple recréer un cookie avec le même nom de tableau mais de valeur différente.
La valeur récupérée doit être traitée comme un tableau.
<?php
// Après avoir rechargé la page :
if (isset($_COOKIE['CompteurPage'])) {
$tabNbPages = $_COOKIE['CompteurPage']; // on récupère l'ancienne valeur
$tabNbPages['accueil']++; // on incrémente
setcookie("CompteurPage[accueil]", $tabNbPages, time()+365*24*3600); // on modifier le cookie
}
?>
Dans cet exemple on récupère le cookie sous forme de tableau et on réalise un compteur de visite sur la page d’accueil du site.
Supprimer un cookie
Il faut pour cela créer un cookie du même nom mais sans valeur.
<?php
//avant tout affichage de contenu
setcookie("CompteurPage");
?>
En effet sans valeur le cookie est inexploitable et sans durée d’expiration, il se détruira automatiquement à la fermeture du navigateur.
La sérialisation
L’intérêt de la sérialisation est le stockage de tableaux en tant que valeurs d’un cookie. Jusqu’à présent, seuls les nombres ou les chaines de caractères pouvaient être stockés.
Avant d’enregistrer un tableau dans le cookie, il faut le transformer en une chaîne de caractères. C’est la sérialisation, qui est gérée par les fonctions PHP serialize() et unserialize().
<?php
//avant tout affichage de contenu
$jours = array('lundi','mardi','mercrdi');
$expire = 365*24*3600;
$chaine = serialize($jours); // conversion du tableau en une chaîne
setcookie("lesJours", $chaine, time() + $expire);
//Pour récuperer les valeur de mon tableau après rechargement de la page
$chaineJours = $_COOKIE['lesJours'];
$tabJours = unserialize($chaineJours); // conversion de la chaîne en tableau
echo $tabJours[0];
?>
Affichage
lundi
Disponibilité du cookie
Par défaut, le cookie est disponible dans le répertoire courant où il a été défini. Il est possible de définir un autre répertoire en rajoutant le paramètre path à la fonction setcookie().
Si la valeur du ‘path’ est /, le cookie est disponible sur l’ensemble du domaine.
Si la valeur du ‘path’ est /html/, le cookie est disponible dans le répertoire ‘html’ et ses sous-répertoires.
<?php
//avant tout affichage de contenu
$expire = 365*24*3600;
setcookie("informations", $chaine, time() + $expire, "/lyon/"); // rajout du paramètre path
?>
Dans cet exemple, le cookie ‘informations’ est disponible pour toutes les pages situées dans le répertoire /lyon/.