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] erreur Cannot send session cookie


Sujet :

Langage PHP

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    803
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 803
    Points : 356
    Points
    356
    Par défaut [Cookies] erreur Cannot send session cookie
    Bonjour,

    J'utilise depuis un bout de temps les sessions et donc ai l'habitude des précautions à prendre lors de l'utilisation du session_start, mais là je sèche.

    Depuis peu, et malheureusement je ne parviens pas à déterminer le moment exact, j'ai une erreur qui s'affiche alors que tout se passait correctement auparavant dans les mêmes conditions.

    Voici le message d'erreur :

    "Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at C:\wamp\www\psy\interfaces\interface.php:1) in C:\wamp\www\psy\fichiersInclusion\classes.php on line 163

    Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at C:\wamp\www\psy\interfaces\interface.php:1) in C:\wamp\www\psy\fichiersInclusion\classes.php on line 163"

    Voici mon code :

    - mon fichier interface.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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    <?php
    include_once("../fichiersInclusion/classes.php");
     
    $popup = 0;
    $typeSousMenu = "";
     
    if(!empty($_GET['titre']))    					 //utilisé pour les href (menu des interfaces)
     $titre = $_GET['titre'];
    elseif(!empty ($titrePasse))  					 //utilisé pour les include
     $titre = $titrePasse;
    else
     $titre = "Accueil";          					 //par défaut
     
    if(!empty($_GET['fichier']))  					 //utilisé pour les href (menu des interfaces)
     $fichier = $_GET['fichier'];
    elseif (!empty($fichierPasse))                   //utilisé pour les include
     $fichier = $fichierPasse;
    else
     $fichier = "../fichiersInclusion/accueil.inc";  //par défaut
     
    if(!empty($_GET['popup']))
     {
      $popup = 1;
     
      if(!empty($_GET['sousMenu']))
       $typeSousMenu = $_GET['sousMenu'];
     }
     
    $interface = new CInterface($titre, $fichier, $popup, $typeSousMenu);
    $interface->getHeader();
    $interface->getLogo();
    $interface->getTitre();
    $interface->getMenu();
    $interface->getContenu();
    $interface->getSignature();
    ?>
    -dans ma classe CInterface :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class CInterface
     {
      function __construct($titre, $contenu, $popup, $typeSousMenu)
       {
    	  session_start();
     
    	  $this->titre = $titre;
                   .....
    La ligne 163 correspond bien au session_start() décrit ci-dessus.

    Quelqu'un aurait une idée.

    Merci d'avance

  2. #2
    Membre expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Points : 3 972
    Points
    3 972
    Par défaut
    Bonjour,
    le fichier "../fichiersInclusion/classes.php" n'appelerait-il pas lui aussi session_start() ? Dans ce cas il ne faut pas l'appeler une seconde fois dans le constructeur de CInterface.

    Rien ne doit être envoyé au navigateur avant l'utilisation de session_start, ni session_start lui-même.

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    803
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 803
    Points : 356
    Points
    356
    Par défaut
    Merci beaucoup pour l'intérêt que tu portes à mon problème.

    Mon fichier classes.php ne contient que des classes et ne fait donc pas appel globalement à session_start(). J'aurais même du lui donner comme extension ".inc", ce qui aurait été plus logique.

    Donc, mes différents appels à session_start() se font toujours à l'intérieur d'une classe.

  4. #4
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    803
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 803
    Points : 356
    Points
    356
    Par défaut
    Je disais ne pas me souvenir du moment exact depuis lequel se produit cette erreur, mais je me demande si ce n'est pas depuis que j'utilise PsPad au lieu de PhpEdit comme éditeur. Cependant, ça m'étonnerais que ça provienne de là.

  5. #5
    Membre expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Points : 3 972
    Points
    3 972
    Par défaut
    Re,
    Donc, mes différents appels à session_start() se font toujours à l'intérieur d'une classe.
    Ne fais qu'un seul appel de session_start(), à l'éxtérieur de tes classes.

    Tes classes ne doivent pas appeler elles-mêmes session_star() sinon les appels risquent de se chevaucher (comme c'est le cas pour toi).

    Si le problème persiste, en plus de çà, vérifie qu'il n'y a pas de lignes vides ou de caractères qui traine dans tes fichiers, avant l'appel de session_start().

  6. #6
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    803
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 803
    Points : 356
    Points
    356
    Par défaut
    Re et encore merci...

    J'ai placé un session_start() en première ligne de mon fichier classes.php et j'ai commenté les autres session_start() dans mes classes, rien y a fait. Ca me semble logique du fait que seul le session_start() de la classe appelée est exécuté.

    De plus, comme tu peux le constater dans le code que j'ai transmis, je n'avais pas d'espace ou de ligne vides qui traînaient avant l'appel à session_start().

    Je deviens chèvre (et ne trouve pas de chou à me mettre sous la dent...)

  7. #7
    Membre expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Points : 3 972
    Points
    3 972
    Par défaut
    Re,

    Jte donne un ptit exemple :
    classes.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <?php
    session_start();
    include_once('CInterface.class.php');
    include_once('OtherClass.class.php');
    ?>
    default.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
    16
    17
    18
     
    <?php
    include('classes.php');
    ?>
    <html>
    <body>
        <?php  
        // $titre = "val"; etc...
        $interface = new CInterface($titre, $fichier, $popup, $typeSousMenu);
        $interface->getHeader();
        $interface->getLogo();
        $interface->getTitre();
        $interface->getMenu();
        $interface->getContenu();
        $interface->getSignature();
        ?>
    </body>
    </html>

  8. #8
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    803
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 803
    Points : 356
    Points
    356
    Par défaut
    Re,

    J'ai donc modifié mon fichier interface.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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    <?php
    session_start();
    include_once("../fichiersInclusion/classes.php");
     
    $popup = 0;
    $typeSousMenu = "";
     
    if(!empty($_GET['titre']))    					 //utilisé pour les href (menu des interfaces)
     $titre = $_GET['titre'];
    elseif(!empty ($titrePasse))  					 //utilisé pour les include
     $titre = $titrePasse;
    else
     $titre = "Accueil";          					 //par défaut
     
    if(!empty($_GET['fichier']))  					 //utilisé pour les href (menu des interfaces)
     $fichier = $_GET['fichier'];
    elseif (!empty($fichierPasse))                   //utilisé pour les include
     $fichier = $fichierPasse;
    else
     $fichier = "../fichiersInclusion/accueil.inc";  //par défaut
     
    if(!empty($_GET['popup']))
     {
      $popup = 1;
     
      if(!empty($_GET['sousMenu']))
       $typeSousMenu = $_GET['sousMenu'];
     }
     
    $interface = new CInterface($titre, $fichier, $popup, $typeSousMenu);
    $interface->getHeader();
    $interface->getLogo();
    $interface->getTitre();
    $interface->getMenu();
    $interface->getContenu();
    $interface->getSignature();
    ?>
    J'ai commenté mon session_start() dans mon fichier de classes.

    Mon url dans le navigateur : "http://localhost/psy/interfaces/interface.php"

    L'erreur se produit maintenant en ligne n°2 de mon fichier interface.php

  9. #9
    Membre expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Points : 3 972
    Points
    3 972
    Par défaut
    Peux tu nous montrer le script qui inclut "interface.php" ?

  10. #10
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    803
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 803
    Points : 356
    Points
    356
    Par défaut
    Je n'ai pas de script qui inclut interface.php : je le charge directement à partir du navigateur via l'url "http://localhost/psy/interfaces/interface.php".

    Ensuite, ce script fait appel à ma classe CInterface qui elle crée mon interface en fonction des paramètres passés.

    Par contre, je viens de lire ceci dans un post : "j'ai trouvé mon erreur encore a cause du BOM tout simplement, mon binôme codait directement en UTF-8 sur notepad et ça posait des problèmes"

    Dès lors, il y a peut-être quand même un lien avec mon changement d'éditeur, mais je n'y connais rien en BOM

  11. #11
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    803
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 803
    Points : 356
    Points
    356
    Par défaut


    Tout d'abord, merci pour le temps passé à m'aider...

    J'ai trouvé : c'était bien dû au changement d'éditeur : dans PsPad, vu que j'encode mes fichiers en UTF-8, j'ai décoché l'option "Octets de signature en UTF-8" et tout roule!!!!

    Bonne après-midi.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 26/02/2019, 19h16
  2. Cannot send session cookie - headers already sent by
    Par menekis dans le forum Langage
    Réponses: 2
    Dernier message: 09/07/2009, 15h22
  3. Réponses: 2
    Dernier message: 03/09/2008, 22h25
  4. Réponses: 4
    Dernier message: 06/05/2007, 11h07
  5. Réponses: 5
    Dernier message: 23/01/2007, 21h44

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