Les cookies PHP : résoudre le Notice: Undefined index:

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 !

11 réactions au sujet de « Les cookies PHP : résoudre le Notice: Undefined index: »

  1. JeromeJ Réponse

    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);

  2. JeromeJ Réponse

    zut, j’ai encore oublier la balise php !

    setcookie($name, $value, mktime(0,0,0, date('d'),date('m'), (date('Y')+1)),'/', $_SERVER['HTTPS'], true););
  3. Ganguill Réponse

    Un grand merci! 1h de perdue également pour un problème aussi stupide !
    Fallait le trouver, merci pour l’info 😉

    • Idleman Auteur ArticleRéponse

      Pas de quoi, dommage que tu l’ai pas trouvé avant (jvais travailler mon référencement promis ^^)

  4. Neok Réponse

    Merci beaucoup, heureusement que ce post était bien placé car sinon j’aurais perdu beaucoup de temps aussi avec cette erreur !

  5. Fabien Réponse

    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 !

  6. sheep_knight Réponse

    JE T’AIME TELLEMENT ! TU ME SAUVES LA VIE !
    Un grand merci à toi ! 😀

  7. noureddine Réponse

    merci beaucoup pour votre aide j’ai eu le même problème et grave a vous je l’ai réglé merci

  8. boulord Réponse

    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!

Répondre à Idleman Annuler la réponse

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.