OVH Cloud OVH Cloud

Suppression de cookies

12 réponses
Avatar
nico3333fr(at)free.fr
Bonjour à tous,

j'ai un site qui utilise divers cookies à divers endroits de
l'arborescence, et je cherche un moyen "direct" de tous les supprimer
(en PHP), sans avoir à faire :
setcookie("mon_cookie","",time()-3600);
pour chaque cookie créé.

En gros, une fonction delete_all_cookie_from_ze_domaine ! ;-)
Si ça existe...

Merci à ceux qui répondront !

--
Hoffmann Nicolas
Site perso : http://dominique.hoffmann.free.fr

2 réponses

1 2
Avatar
Mister Jack
Salut !

Peter Pan a écrit :
Mister Jack a écrit :
Là j'ai pas compris, désolé.



On peut manipuler certaines variables [super] globales, comme celle de
session par exemple : $_SESSION['id'] = 2;
On ne peut pas le faire avec $_COOKIE car, à l'inverse de setcookie(),
on n'envoie pas alors un header au client (qui lui écrit le cookie).



Ca je le sais bien, mais c'est ça qui ne m'a pas paru clair dans le
contexte (suppression de cookies) :
<cite auteur="Davel_x">
un simple $COOKIE['truc']= $mavariableamettredanslecookie
serait valide et plus simple je pense
</cite>

foreach ($COOKIE as $nom)
{
setcookie($nom);
unset($COOKIE[$nom]);
}
Comme ça le cookie a disparu au niveau du client *et* du serveur et on
ne risque plus de cafouillage.




A moins d'avoir sauté une page (!) il n'y a pas de cookie au niveau du
serveur (ce n'est pas une session). Sinon, les 2 instructions font
double emploi : setcookie est approprié (avec $_COOKIE et son
underscore). Voici ce qui fonctionne *vraiment* :


<couic/>

Ces instructions ne font pas double emploi, et je me suis mal exprimé en
parlant du côté serveur. Je voulais dire qu'on efface ainsi toute
*trace* du cookie côté serveur (dans le tableau $_COOKIE) :

1) Le navigateur appelle la page PHP. Il profite pour envoyer les
valeurs de cookie stockées.
2) PHP reçoit les infos et commence à traiter. Il stocke les valeurs de
cookie dans $_COOKIE.
3) Si PHP doit supprimer un cookie, on commence par un setcookie('truc')
sans valeur. PHP crée alors les entêtes à envoyer au client pour lui
dire de supprimer le cookie.

4) A ce moment, si on doit considérer le cookie comme effacé, se pose le
problème de la présence de sa valeur dans $_COOKIE. La suite du script
pourrait éventuellement traiter un cookie dont on vient de demander
l'effacement.

5) Pour celà on fait un unset sur $_COOKIE, pour faire disparaitre toute
trace du cookie côté serveur. Ca limite alors les risques d'erreur.
6) Le serveur envoie les en-têtes qui demandent la supression du cookie
au client.
7) Le reste de la page suit.

Voilà. J'espère avoir été plus clair cette fois ;-)
Et j'en ai profité pour rajouté l'unserscore de $_COOKIE, que j'avais
oublié... :p

Amicalement,
--
Mister Jack (MJ)
"Linux c'est pas pour les manchots !"
Un don pour les victimes du Tsunami : http://www.croix-rouge.fr/
Avatar
Peter Pan
Mister Jack a écrit :
Ces instructions ne font pas double emploi, et je me suis mal exprimé en
parlant du côté serveur. Je voulais dire qu'on efface ainsi toute
*trace* du cookie côté serveur (dans le tableau $_COOKIE) [...]



C'est là où tu te fourvoies : le serveur n'a aucune autre mémoire, d'une
page à l'autre, que le cookie ou une session PHP (qui est un cookie côté
serveur). Tu supprimes la valeur d'une clef via setcookie() et au
prochain chargement cette clef est vide dans $_COOKIE !

L'instruction unset() n'a d'utilité que dans le déroulement d'un script,
script qui se termine au moment où la traduction HTML de la page est
envoyée au navigateur (le serveur à ce moment ignore l'existence de tes
variables). Mais, dans la mesure où setcookie() est traité avant tout
autre envoi au brouteur, le tableau $_COOKIE est implémenté en fonction
du dit cookie... vide !

Bref, setcookie() n'est pas fait pour les chiens et la boucle qui doit
éventuellement effacer toutes les valeurs du cookie (mais pas les clefs)
doit traiter la clef ET la valeur, cette dernière étant ignorée dans
l'instruction. Testé et approuvé ;-)

--
Pierre
http://www.1966.fr/
1 2