PHP - MySQL [Retour au menu]

Les Cookies

Limites d'utilisation des cookies

Admettons un fichier http://www.info-3000.com/test/testcookie.php crée un cookie. Pour pouvoir le relire, ce DOIT être depuis un fichier quelconque contenu directement dans le dossier http://www.info-3000.com/test. Même un fichier qui se trouverait dans un sous-dossier du dossier test ne pourrait pas l'appeler. A fortiori, un fichier se trouvant directement dans http://www.info-3000.com, ou dans n'importe quel autre sous-dossier ne pourrait pas y accéder.

Acceptation, refus et refus conditionnel des cookies

C'est le visiteur, sur son propre PC, dans son navigateur, qui va donner ou non l'autorisation aux sites web de créer et/ou lire les cookies

L'endroit ou vous pouvez déterminer l'acceptation, le refus, ou le refus conditionnel des cookies dans Internet Explorer 6 est :

Emplacement des cookies chez le visiteur

Sous Windows XP, les cookies sont calfeutrés dans le dossier :

C:\Documents and Settings\NomUtilisateurCourant\Cookies

Création et lecture d'un cookie

setcookie() définit un cookie qui sera envoyé avec le reste des en-têtes. Les cookies doivent passer avant toute autre en-tête (c'est une restriction des cookies, pas de PHP). Cela vous impose d'appeler cette fonction avant toute balise <HTML> ou <HEAD>.

Par contre, la lecture peut s'effectuer n'importe où.

Nous allons créer un cookie appelé MonCookie, qui va contenir la chaîne de caractères Tralala, et directement après le lire (time()+86400veut dire que le cookie est valable pendant 1 jour - 86400 secondes):

<?php
  setcookie("MonCookie","Tralala",time()+86400);
  echo $HTTP_COOKIE_VARS["MonCookie"];

?>
<html>
<head>
<title>Test de cookies</title>
</head>
<body>
</body>
</html>

Attention donc au piège

Le code suivant va générer une erreur puisque une valeur est attribuée au cookie après l'affichage :

<?php
  setcookie("Compteur",1,time()+86400); // OK
  echo $HTTP_COOKIE_VARS["Compteur"]; // Toujours OK
  setcookie("Compteur",2,time()+86400); // Oops ! ERROR
  echo $HTTP_COOKIE_VARS["Compteur"]; // Et donc erreur encore
?>

Mais celui-ci fonctionne très bien :

<?php
  setcookie("Compteur",1,time()+86400);
  $Truc = $Machin + $Bidule; // Ne génère pas d'erreur
  setcookie("Compteur",2,time()+86400); // et donc OK
  echo $HTTP_COOKIE_VARS["Compteur"]; // et tout va bien
?>

Espaces, caractères spéciaux

Il est possible d'assigner des chaînes de caractères pourvues d'espaces. Les espaces seront remplacés par des +, et d'une manière globale, les tags HTML seront utilisés.

setcookie("MonCookie","La tarte aux pommes",time()+86400);
Donne
La+tarte+aux+pommes

setcookie("MonCookie","L'hébergement est-il sécurisé+fiable ?",time()+86400);
Donne
L%27h%E9bergement+est-il+s%E9curis%E9%2Bfiable+%3F

Par contre, la récupération des contenus à caractères spéciaux seront réaffichés quasi-correctement, sauf les apostrophes. L'exemple suivant ajoute encotre du piment en utilisant un nom de variable de Cookie avec des caractères spéciaux (L'hébergement)

setcookie("L'hébergement","L'hébergement est-il sécurisé & fiable ?",time()+86400);
echo $HTTP_COOKIE_VARS["L'hébergement"];

Affiche :
L\'hébergement est-il sécurisé & fiable ?

Dénomination des fichiers créés

Remarque préléminaire : Si on ne précise pas le 3ème paramètre (la durée de validité), le fichier cookie n'est apparemment pas créé, mais   setcookie("MonCookie","Tralala");
  echo $HTTP_COOKIE_VARS["MonCookie"];

Renvoie bien Tralala, mais il est probable que si on ferme et rouvre le navigateur, le cookie soit perdu.

A la fin de l'exécution de cette page PHP, un cookie sera donc créé sur C:\Documents and Settings\NomUtilisateurCourant\Cookies, qui s'appellera :

nomutilisateur@nomdudossierdanslequellefichierphpsetrouve.txt

Exemple : Admettons que mon nom d'utilisateur soit jean, et que j'ai un fichier PHP appelant un cookie dans http://www.info-3000.com/testcookie/trucmuche.php, le cookie s'appellera :

jean@testcookie.txt

Ainsi, quel que soit le fichier accédant à n'importe quel nom de cookie, du moment qu'il est placé dans le même dossier testcookie, il fera toujours référence à jean@testcookie.txt.

Remarque : En faisant quelques tests successifs, j'ai constaté qu'en réalité, c'est plutôt un fichier
jean@testcookie[1].txt
Qui était généré. Et si je recharge la même page de création d'un seul bête cookie, c'est tout à coup
jean@testcookie[2].txt
qui apparait, faisant disparaître jean@testcookie[1].txt du même coup.

Bon, de toute manière, peu importe le nom physique du fichier puisqu'on en a pas réellement besoin avec setcookie ni HTTP_COOKIE_VARS.

Contenu des cookies

Soit un fichier :
http://www.info-3000.com/testdecookie/monbeaufichier.php

qui contient :
<?php
setcookie("Couleur","vert",time()+86400);
setcookie("Taille","1800",time()+86400);

?>

<html><head> <title>Test de cookies</title> </head> <body> </body> </html>

Alors, le dossier
C:\Documents and Settings\NomUtilisateurCourant\Cookies

Se garnira d'un fichier cookie supplémentaire
nomutilisateurcourant@testdecookie[2].txt

qui contiendra :

Couleur
vert
www.info-3000.com/testdecookie/

1024
4045600768
08544927
3429581061
27532776
*
Taille
1800
www.info-3000.com/testdecookie/

1024
9003603378
29542927
3400187292
29629821
*

On voit alors aisément comment la vérification de l'endroit depuis lequel a été posé le cookie s'effectue (www.info-3000.com/testdecookie/). Les différentes variables sont manifestement délimitées par des étoiles (*), et j'ignore la signification des chiffres apparentés. Cet exemple provient de l'utilisation d'Internet Explorer 6. Il est possible (probable?) que l'utilisation d'un autre navigateur génère des cookies d'une autre structure.

Réactualisation parfois nécessaire

Attention : Si c'est la première fois qu'on arrive sur cette page telle qu'elle est décrite dans l'exemple, le cookie est bien initialisé par le setcookie, mais, comme si c'était trop rapide, l'affichage avec $HTTP_COOKIE_VARS["MonCookie"] renvoie un résultat vide. Mais si on réactualise simplement la page, Tralala est bien affiché, et ce même si on lui "laisse un peu de temps" :

<?php
setcookie("MonCookie","Patrouchon",time()+86400);
?>
<html>
<head>
<title>Test de cookies</title>
</head>
<body>

<?
echo $HTTP_COOKIE_VARS["MonCookie"];
?>
</body>
</html>

Définition d'une durée de valdité d'un cookie

setcookie("MonCookie","Tralala",time()+86400);

Le 3ème paramètre (time()+86400) représente la durée de validité du cookie exprimée en secondes (24 heures = 86400 secondes). Ce cookie sera donc valide pendant 24 heures.

Dans commentcamarche.net, ils parlent d'une valeur de time()+2592000, qui pourrait être une limite supérieure.

Utilisation d'un compteur de visites par Cookie
Une variable dans un cookie existe-t-elle déjà ?

Voici un code qui va permettre d'incrémenter une variable de 1 à chaque chargement de la page :

<?php
  setcookie("Compteur",$HTTP_COOKIE_VARS["Compteur"]+1,time()+86400);
  echo $HTTP_COOKIE_VARS["Compteur"];
?>

Ce n'est pas complet : Il nous faut définir si c'est la première fois que le visiteur vient sur la page. Pour ce faire, il s'agit de déterminer si la variable Compteur existe déjà, à l'aide de isset (isset vu dans les variables). On commence donc par demander si la variable du cookie existe bien (if (isset($HTTP_COOKIE_VARS["CompteurDeVisite"]))). Si c'est le cas, on augmente cette valeur de 1 (setcookie("CompteurDeVisite",$HTTP_COOKIE_VARS["CompteurDeVisite"]+1,time()+86400);) on affiche la combientième fois que la page est vue (echo "visite numéro ".$HTTP_COOKIE_VARS["CompteurDeVisite"];). Et si la variable CompteurDeVisite n'existait pas (else), on la crée, et l'initialise à 1 (setcookie("CompteurDeVisite",1,time()+86400);), et on affiche au nouveau visiteur que c'est sa première visite (echo "Première visite";).

<?php
  if (isset($HTTP_COOKIE_VARS["CompteurDeVisite"]))
    {
    setcookie("CompteurDeVisite",$HTTP_COOKIE_VARS["CompteurDeVisite"]+1,time()+86400);
    echo "visite numéro ".$HTTP_COOKIE_VARS["CompteurDeVisite"];
    }
  else
    {
    setcookie("CompteurDeVisite",1,time()+86400);
    echo "Première visite";

    }
?>
<html><head> <title>Test de cookies</title> </head> <body> </body> </html>

Astuce : Le navigateur du client accepte-t-il les cookies ?