Je n’avais jamais eu à utiliser les très contestés cookies en PHP jusqu’au jour où, fatalement l’on ma demandé d’en mettre en place pour l’authentification sur le long terme.
Le code était très simple à mettre en place, c’était l’affaire de 2 minutes ! Seulement voila, j’y ai passé 1h !
Pourquoi? Impossible de récupérer mon cookie une fois qu’il était créé, il apparaissait bien dans mon Firefox, mais le tableau $_COOKIE de PHP ne le prenais pas en compte ! J’ai finis par trouver d’où venait le problème en analysant les autres cookie qui, eux passaient bien dans mon tableau $_COOKIE.
Le problème venait en fait du fait que je déclarais mon cookie sur une page et que je cherchait à le récuperer sur l’index de mon site.
OR ! La fonction setcookie , dans son extrême fourberie, définit également un chemin sur le serveur sur lequel le cookie sera disponible et si ce chemin n’est pas précisé, la valeur par défaut est le répertoire courant où le cookie a été défini.
Je déclarais mon cookie dans : http://monsite.com/php/mapage.php donc mon cookie n’était disponible qu’une fois sur la page http://monsite.com/php/mapage.php et non sur http://monsite.com/index.php.
Résolution du problème ? Les experts vous dirons RTFMN :
Le chemin sur le serveur sur lequel le cookie sera disponible. Si la valeur est ‘/’, le cookie sera disponible sur l’ensemble du domaine domain. Si la valeur est ‘/foo/’, le cookie sera uniquement disponible dans le répertoire /foo/ ainsi que tous ses sous-répertoires comme /foo/bar/ dans le domaine domain. La valeur par défaut est le répertoire courant où le cookie a été défini. source : http://php.net/manual/fr/function.setcookie.php
il suffisait donc de préciser “/” dans le chemin du cookie :
setcookie($name, $value, mktime(0,0,0, date("d"),date("m"), (date("Y")+1)),'/');
au lieu de :
setcookie($name, $value, mktime(0,0,0, date("d"),date("m"), (date("Y")+1)));
Baaah !! Une telle perte de temps pour une telle connerie (sans compter le temps qu’il m’a fallu pour rédiger ce post, qui, je l’espère, en fera gagner à mes lecteurs) c’est rageant !
Ah oui j’avais eu le problème aussi 😀
En parlant de setcookie et afin d’opter pour la sécurité, je conseille de mettre le cookie en httponly afin d’empêcher de pouvoir y accéder via javascript (on est jamais à l’abri d’une faille XSS).
À ne désactiver qu’en cas où on voudrait justement pouvoir y accéder soit même.
setcookie($name, $value, mktime(0,0,0, date(“d”),date(“m”), (date(“Y”)+1)),’/’, $_SERVER[“HTTPS”], true);
zut, j’ai encore oublier la balise php !
Merci pour l’astuce 🙂
Un grand merci! 1h de perdue également pour un problème aussi stupide !
Fallait le trouver, merci pour l’info 😉
Pas de quoi, dommage que tu l’ai pas trouvé avant (jvais travailler mon référencement promis ^^)
Merci beaucoup, heureusement que ce post était bien placé car sinon j’aurais perdu beaucoup de temps aussi avec cette erreur !
Même 3 ans après la publication, ce billet m’a été bien utile !!
Apprenant sur le tas la programmation PHP, cela faisait bien plus d’une heure que je galère à comprendre pourquoi je n’arrivait pas à lire un cookie créé par un script appelé en ajax…
Un grand merci donc !
JE T’AIME TELLEMENT ! TU ME SAUVES LA VIE !
Un grand merci à toi ! 😀
merci beaucoup pour votre aide j’ai eu le même problème et grave a vous je l’ai réglé merci
Merci énormément, fonctionne avec php 5.6
J’y ai passé 2 heures à chercher des solution au fameux “undefined index” et je suis tomé sur ton site! Très utile comme info, merci!