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.
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 :
Sous Windows XP, les cookies sont calfeutrés dans le dossier :
C:\Documents and Settings\NomUtilisateurCourant\Cookies
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>
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
?>
<?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
?>
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 ?
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.
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.
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>
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.
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>