Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 16/03/2009, à 18:00

Elzen

[Résolu] Cookies mal déposés avec PHP

Salut les gens, j'ai un petit soucis avec les petits gâteaux...
(Ce message est un copier-coller de celui que j'ai fait dans le topic des couche-tards, puisqu'on ma dit que je pouvais poster ici même si ça ne concerne pas spécifiquement Ubuntu)

Mon but est de permettre aux visiteurs de mon site de modifier le style à leur guise, pour qu'ils aient le look qui leur convient. Pour les membres inscrits, je mémorise ça dans un fichier ini sur le serveur. Par contre, pour les autres, je fais enregistrer ça dans un tableau de cookies (quand les cookies ont un nom en machin[bidule], c'est considéré par PHP comme un tableau machin contenant l'élément bidule).

À chaque chargement de page, j'ai la boucle suivante censée renouveler tous les cookies laissés par le site:

if (!empty($_COOKIE)) foreach ($_COOKIE as $key => $val)
	if (is_array($val)) foreach ($val as $subkey => $subval)
		setcookie("$key[$subkey]", $subval, time()+31557600);
	else setcookie($key, $val, time()+31557600);

Tous les cookies sont toujours traités d'un coup, tous en même temps. Or, ça fait plusieurs fois que je recharge le site, et que je m'aperçois qu'il a perdu une partie des cookies, mais que les autres sont toujours là.

J'ai également, sur la page de déconnexion, une boucle censée permettre de supprimer tous les cookies:

if ($_GET["del"] == "all") foreach ($_COOKIE as $key => $val) {
	if (is_array($val)) foreach ($val as $subkey => $subval)
		setcookie("$key[$subkey]", "", time()-31557600);
	setcookie($key, "", time()-31557600);
}

Et elle semble n'avoir strictement aucun effet hmm

En plus de ça, j'ai aussi un truc permettant de prévenir périodiquement le serveur que l'utilisateur est toujours en ligne pour éviter les fins de sessions, de deux manières différentes (soit par un appel AJAX, soit par une balise <object> pointant sur une page avec un refresh automatique, donc sans JavaScript). C'est aussi mémorisé dans un cookie, lequel contient la chaîne "xhtml" s'il faut utiliser la balise, la chaîne "jscript" s'il faut utiliser le script.
Quand je règle le cookie sur "xhtml", pas de soucis, ça me rajoute bien la balise. Par contre, quand je règle sur "jscript", ça doit marcher quelques minutes, et ensuite, le cookie n'a plus l'air d'apparaître dans le tableau $_COOKIE, alors que Firefox m'indique qu'il est toujours présent et valide hmm

Si quelqu'un a une explication à ce sujet, je suis preneur.

Dernière modification par ArkSeth (Le 16/03/2009, à 19:20)

Hors ligne

#2 Le 16/03/2009, à 18:12

kouskous

Re : [Résolu] Cookies mal déposés avec PHP

Heu.. Pourquoi tu mets $key[$subkey] entre guillemets ?

Au hasard, parce que j'ai pas d'idée, ce serait pas le navigateur qui déconne ? Si le cookie n'apparaît pas dans $_COOKIE, mais bien dans le navigateur.. Tu as testé avec genre opera ?


#!/usr/bin/killall
« « J'aime kouskous » — kouskous. »  — kouskous.

Hors ligne

#3 Le 16/03/2009, à 18:44

Elzen

Re : [Résolu] Cookies mal déposés avec PHP

Je teste principalement avec Firefox et Epiphany. Après, ce sont deux gecko, donc il me faudrait effectivement un autre point de mesure (je regarde dans Midori une fois de temps en temps pour vérifier un webkit), mais malgré tout le respect que je dois à ce paraît-il excellent navigateur, Opera n'est pas Libre, et j'ai décidé de n'utiliser que des outils Libres pour créer le site.

Je mets entre guillemets parce que la fonction attend une chaîne de caractères comme identifiant du cookie.
Oui, tiens, d'ailleurs... c'est peut-être ça, le problème, doit me chercher ce qui est dans $key à l'indice $subkey au lieu de m'envoyer juste la chaîne de caractères avec les crochets yikes Je vais corriger ça de suite.

Hors ligne

#4 Le 16/03/2009, à 18:47

kouskous

Re : [Résolu] Cookies mal déposés avec PHP

Bah le problème, c'est que ton interpréteur risque de prendre $key[$subkey] comme une chaîne de caractère et pas prendre la valeur de ta variable (je sais plus c'est qu'elle option qu'il faut (dés)activer mais tu peux tester avec une echo)

Pour ce qui est du navigateur, je respecte tes principes de liberté (qui sont d'ailleurs les miens) mais tente alors avec elinks, par exemple.

Edit : par contre, pourrais-tu rajouter un print_r($key) et renvoyer le résultat ? Voir ce que contient ton tableau ?

Dernière modification par Kous-Kous! (Le 16/03/2009, à 18:48)


#!/usr/bin/killall
« « J'aime kouskous » — kouskous. »  — kouskous.

Hors ligne

#5 Le 16/03/2009, à 19:15

Elzen

Re : [Résolu] Cookies mal déposés avec PHP

$key n'est pas un tableau, justement, c'est une clef du tableau $_COOKIE qui contient le tableau $val wink

Je viens de remplacer "$key[$subkey]" par $key."[$subkey]" dans les deux fonctions, et effectivement, c'est déjà un peu mieux (je perds une série de cookies inutiles auxquels je n'avais pas prêté attention mais qui étaient générés à cause de cette erreur).

Ça continue à avoir du mal, mais je crois que je viens d'identifier un autre responsable potentiel: le "chemin" des cookies. Firefox m'indique que certains viennent de /, tandis que de /shared/contents (le répertoire dans lequel se trouve la page de déconnexion, ainsi que la page vide qui sert juste à prolonger la session). Il est possible que chaque page ne puisse avoir que les cookies correspondant à son chemin d'accès ? :s

Edit: bingo. Un petit tour dans le manuel php m'indique l'argument path auquel je n'avais jusque là pas prêté attention. Je corrige et je retente.

Re-Edit: Yeah! En indiquant à tous les cookies de s'appliquer à la racine du site, ça a l'air de marcher. À première vue, le problème est résolu big_smile Merci wink

Dernière modification par ArkSeth (Le 16/03/2009, à 19:20)

Hors ligne

#6 Le 16/03/2009, à 20:29

kouskous

Re : [Résolu] Cookies mal déposés avec PHP

Ok.. smile (j'avais lu le script en diagonale ^^)
Par contre, je comprends toujours pas pourquoi tu ne fais pas ça : $key."[".$subkey."]" qui est je pense plus correct tongue smile


#!/usr/bin/killall
« « J'aime kouskous » — kouskous. »  — kouskous.

Hors ligne

#7 Le 16/03/2009, à 20:36

Elzen

Re : [Résolu] Cookies mal déposés avec PHP

Ou pas tongue

Dans l'absolu, oui, mais le délimitage des chaînes de caractères avec des " plutôt que des ' sert justement à ce que les variables (ainsi que les \n, \t et consorts) soient interprétées.

Hors ligne

#8 Le 16/03/2009, à 20:44

kouskous

Re : [Résolu] Cookies mal déposés avec PHP

Moi je dis paresseux yikes tongue


#!/usr/bin/killall
« « J'aime kouskous » — kouskous. »  — kouskous.

Hors ligne

#9 Le 16/03/2009, à 20:52

Elzen

Re : [Résolu] Cookies mal déposés avec PHP

T'auras qu'à venir lire les sources du site quand ce sera en ligne et poster dans la partie du forum qui sera prévue à cet effet toutes tes réclamations sur le style du code tongue

Hors ligne

#10 Le 16/03/2009, à 21:32

kouskous

Re : [Résolu] Cookies mal déposés avec PHP

^-^

Y'a de beaux trolls là-dessus, en fait ! tongue


#!/usr/bin/killall
« « J'aime kouskous » — kouskous. »  — kouskous.

Hors ligne