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 :

header already sent


Sujet :

Langage PHP

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 146
    Par défaut header already sent
    B'jour!

    J'ai voulu implémenter, sur mon site, la fonction de mémorisation des identifiants des utilisateurs via un cookie.

    Tout va bien sauf... que j'ai un soucis de "header already sent".

    Mon erreur me renvoie sur du texte qui a déjà été envoyé, et qui a été envoyé à cause du menu qui, sur ma page d'index, est inclus avant l'affichage du contenu.

    Je sais bien qu'il ne faut pas qu'il y ai de texte avant que le header soit envoyé, mais que puis-je faire contre mon menu qui est inclus avant le contenu??
    Ca ne m'a pas posé de soucis avec mes sessions pourtant?

    C'est surtout pour ce dernier point que je suis perplexe ...

    Bien sur, si j'inclus mon contenu avant mon menu, ça fonctionne, mais tout le design est modifié...

    Avez-vous des pistes pour me mettre dans le droit chemin s'il vous plait? :p

    Merci d'avance

    David

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2005
    Messages : 58
    Par défaut
    Bonjour,

    Si tu n'as pas d'autres solutions que de gérer les cookies une fois que le contenu a été affiché (en règle générale cela signifie que tu devrais repenser l'architecture de ton application), le buffering pourra t'aider.

    Jettes un coup d'oeil aux fonctions ob_start et ob_end_flush.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 146
    Par défaut
    Ha super, merci de l'info. Au moins j'ai un recours

    Je veux bien concevoir que l'application n'est pas bien construite, je ne suis pas professionnel. Cependant je ne vois pas trop comment je pourrais faire autrement là...

    J'ai ma page d'index qui inclut ... tout. Le contenu est chargé en fonction d'un gros switch.
    Dans la mesure ou la page d'index inclut déjà un session_start(), puis la lecture du cookie, puis l'inclusion du header, puis celle du menu, puis celui du contenu, etc... je ne vois pas comment je pourrais faire pour créer mon cookie avant que quelque chose ne soit envoyé? Sauf si... je mets l'inclusion du menu avant celle du contenu. Est-ce finalement la seule solution "propre"?

    Est ce que l'utilisation de buffers peut nuire à la qualité de mon application? Est-ce que je peux rencontrer des problèmes plus tard en continuant le développement?
    Et si j'ai bien compris, cela permet de regrouper tous les header qui sont envoyés "à droite et à gauche", de les transmettre d'un coup, puis de s'occuper du contenu du site après?

    Merci de vos infos précieuses!

    D.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2005
    Messages : 58
    Par défaut
    La solution propre serait de stocker le contenu de la page à afficher après ton menu dans une variable "$contenu". Tu renseignes cette variable en début de script, et dans ton affichage (après avoir affiché ton menu) tu fais :
    echo $contenu;

    Sinon, j'ai utilisé plusieurs fois ob_start et ses amis sans avoir de problèmes ... je ne sais cependant pas la perte de performance que cela implique (à mon avis c'est surtout au niveau mémoire !)

  5. #5
    FoxLeRenard
    Invité(e)
    Par défaut
    Citation Envoyé par divad Voir le message
    B'jour!
    J'ai voulu implémenter, sur mon site, la fonction de mémorisation des identifiants des utilisateurs via un cookie.
    Tout va bien sauf... que j'ai un soucis de "header already sent".
    Mon erreur me renvoie sur du texte qui a déjà été envoyé, et qui a été envoyé à cause du menu qui, sur ma page d'index, est inclus avant l'affichage du contenu.
    Je sais bien qu'il ne faut pas qu'il y ai de texte avant que le header soit envoyé, mais que puis-je faire contre mon menu qui est inclus avant le contenu??
    Ca ne m'a pas posé de soucis avec mes sessions pourtant?
    C'est surtout pour ce dernier point que je suis perplexe ...
    Bien sur, si j'inclus mon contenu avant mon menu, ça fonctionne, mais tout le design est modifié...
    Avez-vous des pistes pour me mettre dans le droit chemin s'il vous plait? :p
    Merci d'avance
    David

    Bonjour, j'arrives aprés la bagare

    Mais je crois a te lire qu'il est bon de te proposer un plan enfantin puisque une valeur de session ça coute rien ...

    l'Idée majeure, est que OUI la session s'ouvre etc ... avant tout HEADER
    Mais pas les changements de valeur

    Moi je fais un peut comme ça

    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
    16
     
    <?PHP
    session_start();
    //=========== puis tout ce dont j'ais besoins ou risque d'avoir besoins
     
    if (!isset($_SESSION['truc1'])) {$_SESSION['truc1']="N";$truc1="N";}
         else {$truc1=$_SESSION['truc1'];}
     
    // ETC... ensuite aprés tout tes includes contrôles etc.. 
    // le header est bien open mais on peut faire
     
    if ($age_capitaine>12)
        {
    $_SESSION['truc1']=$age_capitaine;
    $truc1=$age_capitaine;
         }
    voila au cas ou ça t'aides

  6. #6
    Rédacteur
    Avatar de jsd03
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2008
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Août 2008
    Messages : 1 221
    Par défaut
    De plus il faut tout le temps envoyer le header avec tout autre code html.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ...
    <p>Hello</p>
    ...
    <?php session_start(); ?>
    ...
    A remplacer par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?php session_start(); ?>
    ...
    <p>Hello</p>
    ...
    Google est ton ami mais ton voisin aussi

    Modérateur BI - Responsable Talend
    Mes tutoriels - FAQ Talend - FAQ SQL*Plus

    Avant toute chose : lire le mode d'emploi du forum et ses règles.
    Suivez @Developpez sur twitter !

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 146
    Par défaut
    merci à tous de vos réponses.

    Je suis en train de tester là. La solution de real34 me parrait facile à mettre en place, mais je ne vois pas trop comment faire pour mettre le contenu dans une variable?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $contenu = include("switch.php");
    ne fonctionne pas.

    Parce que si je fais un un echo de $contenu, j'ai 1 qui apparait.

    Les connaisseurs doivent bien se moquer de ce que j'ai écrit, mais je ne vois pas trop comment faire
    il y a t il une histoire de concaténation à faire ou... je ne sais pas?

    Merci de votre aide!

    David

  8. #8
    Membre Expert

    Homme Profil pro
    Expert PHP
    Inscrit en
    Novembre 2004
    Messages
    2 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Expert PHP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 127
    Par défaut
    Quand tu fais le code est diffusé à cet endroit, tu ne peux pas le stocker de cette manière dans une variable.

    D'ailleurs le 1 que tu as dans $contenu ça veut dire que l'include c'est bien passé !!

    Si tu veux vraiment chopper le contenu de ton include il faut faire comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ob_start();
    include("switch.php");
    $contenu = ob_get_contents();
    ob_end_clean();
    Et la $contenu contiendra bien ton contenu

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 30
    Par défaut
    Quand on fait un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $contenu = include("switch.php");
    il faut que dans switch.php il y ait un return.
    Exemple de switch.php:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?php
    $mon_code_html='<p>Je suis du html dans une variable php</p>';
    ....
    ....
    ....
    return  $mon_code_html;
    ce qui donne au final:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $contenu = '<p>Je suis du html dans une variable php</p>';
    Sinon le include retourne forcement "true" (d'ou le 1 si le fichier est disponible) dans la variable puis qu'il a réussi a inclure le fichier dans la variable et non le traitement du fichier inclus.

  10. #10
    FoxLeRenard
    Invité(e)
    Par défaut
    Bonjour les Amis

    Peut-étre un petit rappel entre include et lecture d'un fichier PHP ou autre dans une variable


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $Le_tout = "";
        $xx="mon_php.php";
        $Tab=file($xx);
        $NbrLig=count($Tab)-1;
        for($i=0;$i<=$NbrLig;$i++)
          {
           $Le_tout .= stripslashes($Tab[$i]);
          }
    Hop this HELP

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 146
    Par défaut
    Merci à tous pour vos précisions. Je n'ai pas l'occasion de tester tout cela encore mais ça sera fait très prochainement et je vous tiendrai au courant de l'évolution de la chose.

    Merci encore!

    D.

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 146
    Par défaut
    Je ne sais pas (encore) comment j'aurai pu faire pour modifier l'ordre des flux.
    Je vais conserver cette technique pour le moment car elle me semble bien pratique

    Bonne journée

    D.

    oh non

    C'est possible qu'ovh ne supporte pas les fonctions utilisées??

    J'ai bien l'impression que j'ai le même soucis qu'avant. Ca fonctionne en local...

    Je continue mes recherches.

  13. #13
    Membre Expert

    Homme Profil pro
    Expert PHP
    Inscrit en
    Novembre 2004
    Messages
    2 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Expert PHP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 127
    Par défaut
    Tes pages sont en PHP5 ?

    http://guides.ovh.com/Php5ChezOvh :
    Pour changer la version de php qui va exécuter un fichier .php, il suffit de creer un .htaccess dans le repertoire de votre site. Avec le bloc note de Windows ou tout autre éditeur de texte, tapez :

    Car je ne crois pas que certaines fonctions soient interdites sous OVH.

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 146
    Par défaut
    Hello,

    merci de la réponse.
    Mes pages ne sont pas en PHP5. Elles doivent l'être absolument?
    Avec la technique du htaccess ça ne change rien :s


    Edit:

    Hum... je ne trouve toujours pas de solution. J'ai bien tout transféré comme il faut, tous mes fichiers. J'ai encore retenté à l'instant...
    Ca ne vient pas du navigateur, ni de mon ordinateur en tout cas...

    Quelqu'un aurait une piste à suivre svp?

    Merci de votre soutien.

    D.

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 146
    Par défaut
    Voici ci dessous une description plus complète de mon problème, et de la raison de celui-ci.
    Je propose à la fin une idée, pas propre, mais qui pourrait me sauver?

    Voici la structure schématique de ma page index.php (s'il y a des erreurs, c'est parce que je la tape à la main, sans copier/coller de mon propre code) :

    J'ai d'abord quelques vérifications, de navigateur notamment, qui ne semblent pas être la cause du problème. Puis,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    include("header.php");
    Dans ce header.php, j'ai uniquement une image, la bannière de mon site. Rien d'autre.


    Ensuite,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    include("menu.php");
    Il s'agit ici d'un menu, en php sans envoi de "header" qui pourraient créer le fameux soucis de header already sent. Il n'y a même pas de session_start(); dedans alors que je fais appel à des variables de Session (oubli...pas indispensable!).
    Cependant, à la ligne 92 se termine mon premier <table>, c'est donc mon premier envoi de données réelles.

    Après, arrive cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    include("switch.php");
    Et c'est ici que j'ai tous mes appels de pages constituant le contenu de mon site. J'ai notamment la fameuse page d'authentification.php qui crée un cookie ( à la ligne 13) si l'utilisateur s'est bien connecté, et qui pose problème!

    Ensuite arrive:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    include("colonneDeDroite.php");
    include("footer.php");
    Mais cela ne pose pas de soucis, et arrive après le problème.




    Le souci, le voici:

    Warning: Cannot modify header information - headers already sent by (output started at D:\Programmation\monsite\menu.php:92) in D:\Programmation\monsite\utilisateur\authentification.php on line 13
    et il se passe au moment de l'identification, évidement.


    La solution qui m'a été proposée par Maxoo a été d'utiliser la tamporisation de sortie. Une pirouette sympathique qui fonctionne en local mais que je ne parviens pas du tout à faire fonctionner sur mon compte (payant) ovh!
    Elle consiste à insérer les lignes suivantes avant tout envoi de données:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ob_start();
    include("switch.php");
    $contenu = ob_get_contents();
    ob_end_clean();

    On m'a fait comprendre que si j'avais besoin de recourir à cette méthode, c'est que mon architecture était mal pensée. Pour le moment je ne parviens pas à résoudre mon soucis en mettant simplement dans "le bon ordre" mes div. Car forcément, si je bouge une div, tout le graphisme est décalé et il est compliqué, et un peu tordu, d'appeler le contenu de son site avant l'entête et avant le menu de gauche, non?
    Donc pour le moment cette solution ne me convient pas non plus.


    Je suis donc à court de solutions que je suis capable d'appliquer. Je suis donc tout ouïe à vos pistes de recherche!



    J'ai juste une piste à laquelle je viens de penser et j'aimerais votre avis avant de la tester.
    L'idée est d'effectuer une redirection en javascript qui permettrait d'insérer une page "invisible" entre le formulaire d'identification et la fin de l'authentification. Je m'explique:
    Actuellement le processus en le suivant. L'utilisateur valide son formulaire ==> une page fait la vérif, créée le cookie s'il est bien identifié et un bout de code javascript l'envoi sur la page d'accueil ==> page d'accueil.

    Je suggère de mettre en place le système suivant. L'utilisateur valide son formulaire ==> une page fait la vérif, un bout de code javascript l'envoi sur une autre page s'il est bien identifié ==> La page sur laquelle il est arrivé créée le cookie et un bout de code javascript l'envoi sur la page d'accueil ==> page d'accueil.

    Ca permettrait de faire les choses par étape non? Est ce que ça changera quelque chose? Est-ce que ça n'est pas trop lourd?
    Je sais déjà que si l'utilisateur désactive javascript, je serai embêté. Je peux mettre en place un dispositif obligeant l'utilisateur à activer javascript...

    EDIT:HEY! Mais il me suffit de faire comme ça en fait? ==> L'utilisateur valide son formulaire ==> une page externe (et non pas appelée via mon switch mais avec un lien en dur) fait la vérif, créée le cookie s'il est bien identifié et un bout de code javascript l'envoi sur la page d'accueil ==> page d'accueil.


    Voilà, j'en ai terminé avec ce long post. J'espère que vous m'aiderez car si je prends le temps d'écrire tout ça, c'est que j'en ai vraiment besoin

    Merci d'avance !

    D.

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 146
    Par défaut
    B'jour!

    Je laisse le bug de coté en le contournant de la manière suivante:

    ==> L'utilisateur valide son formulaire ==> la page qui fait la vérif et qui créée le cookie est appelée en dur, et non pas via le switch.Puis un bout de code javascript l'envoi sur la page d'accueil ==> page d'accueil.


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

Discussions similaires

  1. [PHP-JS] problème headers already sent
    Par charlene44 dans le forum Langage
    Réponses: 12
    Dernier message: 14/06/2006, 13h55
  2. Réponses: 11
    Dernier message: 11/05/2006, 11h16
  3. [Cookies] cookies et 'headers already sent'
    Par wellser dans le forum Langage
    Réponses: 5
    Dernier message: 26/04/2006, 13h37
  4. [Cookies] Warning : headers already sent
    Par arti2004 dans le forum Langage
    Réponses: 8
    Dernier message: 04/04/2006, 16h31
  5. [JpGraph] Header already sent
    Par grunk dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 09/02/2006, 16h54

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