Les cookies et PHP

 

Les cookies et PHP

  1. Qu'est ce que c'est
  2. Créer un cookie avec PHP
  3. Lecture d'un cookie
  4. Détruire un cookie
  5. Infos complémentaires
  6. Liens connexes

Qu'est ce que c'est

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 :

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 :

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 :

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

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.

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 : http://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"
?>

Liens connexes

Article écrit le 4 septembre 2002 / Mis à jour le 19 septembre 2003 par Bobe
[29] commentairesTop

Des commentaires ?

Auteur : Toto • 16/12/2002 @ 12:55 • #140

Même en faisant pareil que le tuto ça marche pas :( , je vais me mettre à l'ASP :p (je déonne)

Auteur : narfight • 25/12/2002 @ 14:50 • #152

vas sur [Cliquez ici]

Auteur : Klem • 31/01/2003 @ 15:38 • #184

Vraiment terrible cette page :)
Merci !

Auteur : Adams • 06/04/2003 @ 23:24 • #272

Thank you!! Bravo!

Auteur : AXB • 02/06/2003 @ 19:55 • #343

J'arrive pas à enregistrer un cookie !!!
en plus ya 5 min ça marchait...

Auteur : chantecom • 07/08/2003 @ 10:08 • #389

Merci ça m'a beaucoup aidé ce Tuto mais je voudrais savoir comment faire pour supprimer un cookie avec un bouton

MERCI

Auteur : Bobe • 09/08/2003 @ 13:31 • #390

impossible, php est server-side.

pour supprimer un cookie, il faut refaire appel à la fonction setcookie() en spécifiant juste en premier argument le nom du cookie.

Auteur : chantecom • 17/08/2003 @ 10:40 • #398

comment se fait-il alors qu'un site que je connais y a réalisé

Auteur : Vador • 09/09/2003 @ 17:19 • #416

oui cela est très bien
bravo pour ce tuto
mais comment décoder un pass de cookies sa c''est vraiment intéressant

Auteur : elviz • 11/01/2004 @ 22:09 • #478

salut
je voudrais savoir comment on peut restaurer des sites a partir des cookies

Auteur : KahL • 28/01/2004 @ 13:15 • #493

Bonjour, et merci pour les explications .... ce sont les premieres que je comprends enfin ;)
Ma question est la suivante : comment faire qd on veut que la valeur entrée ds le cookie soit un texte saisi ds un formulaire ?
Merci

Auteur : Stephane • 10/04/2004 @ 12:41 • #538

Comment envoyer un cookie d'une durée de 10 ans?

Auteur : xion • 15/04/2004 @ 17:20 • #539

L'utilisation des cookies en javascript est-elle la même ? ou a-t-on accès à un autre système de cookie ? (le php est server-side, le javascript client permet donc de faire des cookies clients, cependant, sont-ils les même que ceux de php ?)

Auteur : scorpio07 • 21/05/2004 @ 13:39 • #564

Merci merci !

A chaque fois j'essayais mon cookies j'avais ce sublime message :

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

Fallait mettre le cokie en tout premier dans le code de la page (avant même le <html>). Et maintenant ça marche très bien !

Auteur : thrill • 28/01/2005 @ 17:21 • #651

es-ce possible de mettre plusieurs variables dans un cookie? si oui comment

Auteur : saxo • 18/09/2005 @ 10:42 • #720

Bonjour a tous,moi j'ai enlevé toute les balise html et j'ai toujour le fameux message

Auteur : webpsycho • 27/09/2005 @ 17:04 • #725

Salut saxo, vérifie si tu n'aurais pas laisser des espaces ou des enters avant ton <?php J'avais le même problème que toi et je l'ai réglé en enlevant les espaces. Je crois que php doit voir une espace devant lui comme du html...

Auteur : MickeyManu • 16/01/2006 @ 13:28 • #784

TRES bon tuto.
Merci aussi pour les tableaux dans les cookies j'en avais besoins :)

Pour ceux qui ont un pb de header déjà envoyé, attention aux sauts de ligne entre les balises:
?>
<?php
Envoie un retour chariot et donc le header ne peu plus être modifié. Aucun caractère avant le doctype.

Auteur : Maximelene • 18/01/2006 @ 17:01 • #786

Génial ça aussi ! Je vais pouvoir quitter les sessions pour me mettre aux cookies !

Euh... et si l'utilisateur refuse les cookies ?

Auteur : Samzamel • 09/04/2006 @ 03:24 • #866

Comment faire pour que le visiteur ne doive pas aller dans ses options pour accepter le cookie? Merci

Auteur : Vûk-Vük • 25/04/2006 @ 16:48 • #876

Merci pour ces éclaircissements! Sinon, comment repousser la date de destruction d'un cookie? Est-on obligé d'en créer un autre?

Auteur : boblamotte • 19/08/2006 @ 13:07 • #1623

j'ai eu le meme pb d'erreur.
Je l'ai résolu en créant un fichier spécial pour la fonction d'écriture du cookie et ensuite il FAUT IMPERATIVEMENT qu'il n'y ait pas d'espace ou autre caractère avant <?php et après ?>.
sinon cette page est tres claire...

Auteur : hleb • 10/09/2006 @ 13:08 • #2115

Bonjour,

Mon cookie se crée et la valeur s'affiche dans la page 1fois. Lorsque je rappelle la page, la valeur n'apparait plus.
Pourquoi ?
Merci de venir à mon aide , de m'expliquer un peu le pq du comment...

Auteur : Claude • 03/12/2006 @ 01:05 • #2594

Y a t'il un moyen de passer outre:

Warning: Cannot add header information

Il parraitrait que l'on peut ?

Auteur : Tetranon • 25/03/2007 @ 21:36 • #3637

Le message du 21/05/2004 montre que la plupart des gens ne savent pas lire... Espérons que depuis le temps, il ait appris. Quand au message du 18/01/2006, il suffit de cliquer sur le premier lien connexe pour avoir une réponse... Merci PHPCodeur pour cette page d'apprentissage et bon courage avec les millions de questions bêtes à venir d'internautes...

Auteur : vinz • 18/04/2007 @ 16:07 • #4152

tres bon tuto. et pour passer outre les 'cannot add header info' on peus utiliser ob_start() et ob_clean()

Auteur : Kevin • 24/04/2007 @ 08:26 • #4421

Voici quelques réponses aux multiples questions posées ici et sans réponse:

«comment faire pour supprimer un cookie avec un bouton»

Utilise un language client tel que javascript. ( [Cliquez ici] ou [Cliquez ici] )

«comment décoder un pass de cookies»

Il va faudra brute-forcer (md5 par exemple), si vous avez plusieurs vies devant vous, go for it !

«comment on peut restaurer des sites a partir des cookies»

Si j'ai bien compris cette question, comment rendre un site dynamique selon les cookies ? sinon, on ne peut pas "restaurer un site" avec des cookies.Pour le rendre dynamique, il faut ajouter des conditions:

ex:
<?php
if(empty($_COOKIE['ton_cookie'])){
//... operation 1
}else{
//... operation 2
?>

«comment faire qd on veut que la valeur entrée ds le cookie soit un texte saisi ds un formulaire ?»

<?php
$ton_champ = "";
if(!empty($_POST['ton_champ'])){ $ton_champ = $_POST['ton_champ']; }

setcookie('ton_cookie', $ton_champ);
?>

«Comment envoyer un cookie d'une durée de 10 ans?»

Il faut faire un calcul du nombre de secondes en 10 ans.

<?php
setcookie('ton_cookie', 'ta valeur', (time() + 10*365*24*60*60));
?>

«es-ce possible de mettre plusieurs variables dans un cookie? si oui comment»

Si le cookie est un tableau, tu devras quand même les ajouter un par un, ex: pour avoir la 8e donnée de ton cookie, tu devras écrire:

<?php
echo $_COOKIE['ton_cookie'][7];
?>

ou pour tout les afficher:

<?php

$i = 0;
while($i < count($_COOKIE['ton_cookie'])){
echo $_COOKIE['ton_cookie'][$i]."<br />";
$i++;
}

?>

«Comment faire pour que le visiteur ne doive pas aller dans ses options pour accepter le cookie?»

C'est impossible, il doit impérativement configurer son navigateur.

«Mon cookie se crée et la valeur s'affiche dans la page 1fois. Lorsque je rappelle la page, la valeur n'apparait plus. Pourquoi ?»

Ça serait préférable de voir le code source avant de répondre, mais as-tu vérifier la date d'expiration de ton cookie ?

«Y a t'il un moyen de passer outre: Warning: Cannot add header information»

Oui, avec un paramètre de apache, mais c'est inutile, ça rallenti le site et c'est beaucoup mieux de bien structurer son site au lieu de contourner les problèmes.

Ce tuto est très bien fait, merci.

Cordialement,
Kevin (kevin@kegisiteweb.com)

Auteur : Zabuza • 01/01/2008 @ 17:26 • #30853

Très bon Tuto, un qui essaie d'être dans le même style
[Cliquez ici]
(pour enregistrer)
et pour lire :
[Cliquez ici]

Auteur : mahdivitche • 06/05/2008 @ 02:31 • #53980

comment tester si un cookies existe ou non ???

et comment faire pour comparer la valeur d'un cookies avec un autre valeur ???

Déposer un commentaire

Pseudo, Email et Options

Tapez votre commentaire

Note : Vos données personnelles restent strictement confidentielles et ne sont pas réutilisées à votre insu. Vous pouvez consulter à ce propos cette page.

Valid Xhtml Valid CSS Mozilla et Firebird