Chapitre 18 - Les cookies
Un cookie permet de stocker des informations sur les visiteurs, par exemple leur langue préférée (pour la navigation sur le site). Les sites les utilisent fréquemment à des fins publicitaires, pour engranger des informations sur les habitudes, les centres d'interet etc...
Je vais me servir de l'exemple d'un cookie qui recueille la langue usuelle de l'utilisateur
Une fois ce dernier crée, lorsque cet utilisateur reviendra sur le site, ces informations seront conservées (selon une durée fixée dans un parametre du cookie)
Désormais, l'utilisateur retrouvera toutes ses préférences, visite après visite
-
18.1 Stockage des cookies
Pour visualiser les différents cookies stockés sur votre ordinateur, si vous utilisez Firefox, allez dans l'onglet outil de la barre des menus de FF, puis cliquez sur paramètres. Dans la barre de gauche, cliquez sur Vie privée et sécurité
Dans Cookies et données de sites, allez dans Gérer les données, puis tapez dans la barre de recherche localhost. Et ainsi apparaitront les différents cookies crées pour le local
-
18.2 Créer un cookie
Pour donner le choix de la langue au visiteur, je vais utiliser de petits fanions, cliquables (test disponible à la fin de ce sous-chapitre)
Je vais entourer ma balise <img> d'une balise <a> qui va servir à faire transiter des informations (dans l'attribut href, voir le chapitre 15 sur la méthode GET)
<div class="row justify-content-around mb-5"> <a href="?pays=en"><img class="img-fluid" src="img/england.webp" alt="drapeau de l'Angleterre"></a> <a href="?pays=es"><img class="img-fluid" src="img/spain.webp" alt="drapeau de l'Espagne"></a> <a href="?pays=dz"><img class="img-fluid" src="img/algeria.webp" alt="drapeau de l'Algérie"></a> </div>
Si je clique sur le premier drapeau, pays sera égal à 'en', sur le second, pays sera égal à 'es' etc...
Pour récupérer cette information, je vais utiliser la condition switch/case (mais j'aurai tout aussi bien pu le faire avec un if/elseif)
<?php switch($pays){ case 'fr' : echo "<h1 class='text-center'>Bonjour</h1>"; break; case 'en' : echo "<h1 class='text-center'>Hello</h1>"; break; case 'es' : echo "<h1 class='text-center'>Hola</h1>"; break; case 'dz' : echo "<h1 class='text-center'>Salaam</h1>"; break; default : echo "<h1 class='text-center'>Vous devez choisir une langue</h1>"; break; } ?>
Mais au préalable, en début de script donc, je vais devoir vérifier si j'ai bien reçu une information via l'URL
Cette vérification est obligatoire. Car lorsque l'utilisateur arrivera pour la première fois sur la page, il n'aura encore rien cliqué/choisi. Le if(isset($_GET['pays'])) sera donc indispensable, sinon j'aurais droit a une erreur PHP ( Undefined array key "pays" )
Au lieu de isset, je pourrai utiliser de manière tout aussi sure et efficace array_key_exists
if(isset($_GET['pays'])){ $pays = $_GET['pays']; }elseif(isset($_COOKIE['pays'])){ $pays = $_COOKIE['pays']; }else{ $pays = 'fr'; }
Explications détaillées
Après avoir vérifié en ligne 1 que j'ai bien reçu une information dans mon URL, je déclare la variable $pays à laquelle j'affecte la valeur de l'information reçue dans l'URL (ligne 2)
En ligne 3, je soumets une autre hypothèse ( elseif ). La Superglobale $_COOKIE me permet de vérifier si un cookie du même nom n'existe pas déjà. Auquel cas, pas besoin d'en créer un nouveau, $_COOKIE me permet de récupérer le contenu de celui existant
C'est la signification de la ligne 4. elseif le cookie ['pays'] existe déjà ? Alors ma variable $pays prendra sa valeur
Enfin, en lignes 5 et 6, le cas de figure où aucune information n'a été passée dans l'URL, si le cookie n'existe pas encore, alors $pays prendra la valeur 'fr', ce qui affichera le message 'Bonjour', par défaut
En dernier lieu, je vrai créer mon cookie, avec la fonction setcookie
setcookie fait partie des fonctions réseaux, et prend 3 arguments
setcookie('pays', $pays, time()+365*24*3600);
Le premier, son nom ('pays')
Le second, sa valeur, et cela pourra donc etre la valeur par défaut, la valeur passée dans l'URL, ou la valeur récupérée dans le cookie existant
Enfin, la date à laquelle il doit expirer. Ici, je fais appel à time() qui me permet de récupérer la date d'aujourd'hui, exprimée en secondes. Aussi, pour avoir un cookie qui expire dans un an, je vais additionner à time() : 365(pour les jours) multiplié à 24 (les heures), multiplié a 3600 (secondes dans une heure). Car, comme time() est indiqué en secondes, je dois lui ajouter une année, mais exprimée en secondes aussi.
Il faut savoir que setcookie permet non seulement d'envoyer le cookie, mais aussi de le régénérer ! Le compteur repart à zéro à chaque fois que je l'appelle avec $_COOKIE (+ un an à chaque visite sur le site)
(cliquez a nouveau sur le bouton "Tester cookie" pour visualiser la conservation de la préférence langue)