IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[Cookies] Pb SETCOOKIE avant un HEADER("...")


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 8
    Points : 5
    Points
    5
    Par défaut [Cookies] Pb SETCOOKIE avant un HEADER("...")
    Bonjour,

    J'ai un souci avec la gestion des cookies en PHP sous IIS.
    Mon appli commence par un ASP (pour récupérer le login Windows) qui génère un cookie A :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Response.Cookies("A")=RemoteUser
    Response.Cookies("A").Expires=date+1
    Response.Redirect("start.php")
    Ensuite j'ai du code PHP (dans START.PHP) qui triture dans des BdD et qui, à la fin, génère des cookies B, C et D, ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ob_start();
    setcookie("B",'abc',time()+30);
    setCookie("C",23,time()+30);
    setCookie("D","NOM",time()+30);
    ob_end_flush();
    Si je m'arrête là, OK, les cookies sont créés (je les vois dans C:\Documents and Settings\xxx\Cookies).
    Mais si j'ajoute une redirection vers ma première page interactive, les cookies B, C et D ne sont pas créés (ou disparaissent), je n'ai que le cookie A !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ob_start();
    setcookie("B",'abc',time()+30);
    setCookie("C",23,time()+30);
    setCookie("D","NOM",time()+30);
    ob_end_flush();
    header("Location:recherche.php");
    (la présence/absence de ob_start et ob_end_flush ne change rien)

    Pourquoi ?
    Que dois-je faire ?

    (j'ai cherché dans le forum avant mais sans succès)

  2. #2
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 860
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 860
    Points : 3 445
    Points
    3 445
    Par défaut
    Tu es sûr que ta fonction ob_start() n'affiche rien sur le navigateur du client ? Le setcookie ne fonctionne pas si tu as déjà affiché quelque chose, un peu comme le header, d'un autre coté tu ne parles pas d'un échec de ton header, donc je suppose qu'il fonctionne convenablement..

    Pourquoi ne pas faire les setcookies dans ta fonction ob_start() ?

  3. #3
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 249
    Points : 1 565
    Points
    1 565
    Par défaut
    a noter que dans le 1er cas, tu créé le cookie A pour 1 jour (date+1, je suppose que ca correspond a 1 jour en ASP... j'y connais rien ;o)

    et dans le 2eme cas, tu créé B,C et D pour... 30 secondes !

    Donc si tu regarde pas tres vite, tes cookies sont supprimées ;o)

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    La fonction ob_start() est une fonction PHP : http://www.php.net/ob_start. J'ai lu qu'on pouvait l'utiliser avant l'écriture d'un cookie.
    Donc elle n'affiche rien, et je ne peux évidemment rien ajouter dedans.
    Le HEADER fonctionne toujours bien, seule la création de cookie échoue si elle est suivie par le HEADER.

    Quant au cookie en ASP, oui c'est pour 1 jour
    Mais les 30" sont largement suffisantes pour constater que rien n'est créé (j'ai l'explorateur ouvert sur le dossier COOKIES en simultané).

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Je peux reformuler ma question autrement :

    Comment créer un cookie dans une page P1.PHP et appeler une seconde page P2.PHP qui le relira ?

    Je pourrais utiliser les sessions, mais je ne maîtrise pas du tout cette technique. Ceci dit je peux apprendre

  6. #6
    Membre chevronné
    Avatar de ska_root
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    1 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Août 2005
    Messages : 1 203
    Points : 1 839
    Points
    1 839
    Par défaut
    Citation Envoyé par Erwan18
    Ceci dit je peux apprendre
    bonne idée ;-)
    http://php.developpez.com/faq/?page=sessions

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Ceci dit je suis têtu... et désespéré
    J'ai retesté un exemple ultra-simple trouvé sur un site consacré aux cookies.
    Source A.PHP
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
    //ob_start();
    setCookie("panier[pomme]", 10,time()+3600);
    setCookie("panier[poire]", 20,time()+3600);
    setCookie("panier[peche]", 30,time()+3600);
    //ob_end_flush();
    //header("Location:b.php");
    ?>
    Ca fonctionne et j'ai le cookie ci-dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    panier[pomme]
    10
    ...
    *
    panier[poire]
    20
    ...
    *
    panier[peche]
    30
    ...
    *
    Mais si j'active la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    header("Location:b.php");
    avec
    Source B.PHP
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <?php
    $panier = $_COOKIE["panier"];
    $total  = 0;
    $total += $panier["pomme"]*1;
    $total += $panier["poire"]*1.5;
    $total += $panier["peche"]*2;
    ?>
    <html>
    <head>
    <title>Total</title>
    </head>
    <body>
    Total du panier: <?echo $total?> Euros</p>
    </body>
    </html>
    ca ne fonctionne plus la page B.PHP s'affiche bien mais je n'ai plus aucun cookie
    Je n'ai pas non plus de message d'erreur.
    J'ai essayé avec Firefox et c'est pareil.

    Pouvez-vous essayer et me dire si ça fonctionne chez vous ?

    Y a-t-il un paramétrage spécial de IIS ou de PHP sur le serveur (en Windows 2000 Server) ?

  8. #8
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 860
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 860
    Points : 3 445
    Points
    3 445
    Par défaut
    Essaie avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    header('Refresh: 0; recherche.php');
    Au lieu d'utiliser le header location.

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Merci mais c'est (presque) pire : la page A.PHP boucle ! Le cookie est créé mais la page A.PHP ne passe jamais la main à B.PHP
    J'ai essayé en ajoutant l'entête complet http://195.69.x.y/ mais sans succès.
    D'un autre côté j'ai trouvé ceci en cherchant dans les forums : http://fr.php.net/manual/fr/function.setcookie.php
    Alchaemist
    15-Mar-2005 12:36
    setcookie + header Location + IIS 5 = Trouble

    It took me a long time to figure out what was causing a missing cookie in one system while it worked perfectly in another...

    See this one: http://support.microsoft.com/kb/q176113/

    In short, this WILL NEVER WORK IN IIS 5:
    <?php
    header("Pragma: no-cache");
    header('Location: http://www.example.com/');
    setcookie('AA','1',0,'/');
    setcookie('BB','2',time() + 24 * 3600,'/');
    ?>

    You will ONLY get the Location Header, everything else will be "cut out" by IIS 5 CGI implementation.

    Solutions:
    1- Migrate to Apache/IIS6/Whatever
    2- Use a Non Parsed Header Script (nph-*.php)
    3- Try with header('Refresh: 0; $URL');

    I hope this helps somebody not to spend hours knocking his/her head.
    ce qui confirme ce que tu me dit, mais qui ne résoud pas pour autant mon problème.
    Je me demande si je ne vais pas installer un Apache plutôt...

  10. #10
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 860
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 860
    Points : 3 445
    Points
    3 445
    Par défaut
    J'ai l'impression qu'il se mélange les pinceaux entre tous ces headers, il faudrait faire la gestion des cookies une seule fois, au démarrage de ton application, et peut-être les mettre à jour en Javascript ? C'est une idée comme une autre Si ça peut t'éviter de réinstaller un serveur !

    De plus, fais attention aux noms de variables dans les cookies, utilises principalement des alphanumériques et le signe moins '-' !

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Le fichier que je nomme A.PHP et qui tente décrire les cookies est le premier de l'appli en effet. Ensuite il est prévu de lire uniquement les cookies dans les autres PHP de l'appli.
    Sinon installer Apache me fera plutôt plaisir car je ne suis pas un ardent défenseur de IIS : je l'utilise un peu par fainéantise, parceque c'est le serveur par défaut partout dans mon entreprise
    OK pour les noms de cookies, mais en général je n'utilise même pas de tiret, seulement des lettres.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PHP-JS] il n ya rien avant le header
    Par napz dans le forum Langage
    Réponses: 3
    Dernier message: 21/10/2006, 00h51
  2. Réponses: 13
    Dernier message: 15/02/2006, 21h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo