Variable de session PHP.

Bonjour,

je me met au php et j'ai un problême de transmission de variable de session:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
<title>Bienvenue sur mon site !</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body>
<p>
<CENTER>ESSAI SESSION</CENTER><br />

<?php
if (!isset($_SESSION['var'])){//var pas encore defini.
session_start();
$_SESSION['var']= 10;
$var=$_SESSION['var'];
echo " Premier passage var = $var ";
}
else{//var deja defini.
$_SESSION['var']=$_SESSION['var']-1;
$var=$_SESSION['var'];
echo " var = $var ";
}
?>
<CENTER>
<a href="essai_session.php">Clique ici pour decrementer var.</a><br />
</CENTER>

</p>
</body>
</html>


Problême:
a chaque affichage de la page, je constate que var n'est pas défini.. il repasse a chaque fois dans le if .....

je croyait qu'une fois défini au premier passage,elle irait ensuite ds le else,j'ai peut-être manqué quelquechose....

PS:je ne sais pas si on peut mettre le codes ds un emplacement prevus...
Configuration: Windows XP
Firefox 3.5.5

7 réponses

  1. Bonjour,

    Les sessions utilisent des cookies. Or, les cookies sont placées dans les en-têtes de la réponse HTTP.
    Ces en-têtes sont envoyés au navigateur client par le serveur PHP au moment où le premier morceau du corps de la page est envoyé. Dans ton cas, les en-têtes HTTP sont générées et envoyé quand le serveur PHP arrive à ta première ligne : <!DOCTYPE...
    Donc, quand PHP arrive à ton session_start(), il ne peut pas exécuter l'instruction, qui suppose de modifier les en-têtes pour y mettre le cookie (d'ailleurs, tu as dû recevoir un Warning: Headers already sent, non ?).
    Résultat, la session ne peut pas être commencée.

    Pour résoudre ce problème, il te suffit donc de placer ton code PHP, et principalement le session_start(), avant tout envoi de données, en début de fichier. Par exemple, comme ceci :
    <?php
    $sortie_session = "";
    if (!isset($_SESSION['var'])){//var pas encore defini.
        session_start();
        $_SESSION['var']= 10;
        $var=$_SESSION['var'];
        $sortie_session = " Premier passage var = $var ";
    }
    else{//var deja defini.
        $_SESSION['var']=$_SESSION['var']-1;
        $var=$_SESSION['var'];
        $sortie_session = " var = $var ";
    }
    ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
        <head>
            <title>Bienvenue sur mon site !</title>
            <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
        </head>
        <body>
            <p>
                <CENTER>ESSAI SESSION</CENTER><br />
    <?php echo $sortie_session; ?>
                <CENTER>
                    <a href="essai_session.php">Clique ici pour decrementer var.</a><br />
                </CENTER>
    
            </p>
        </body>
    </html>
    1. Les sessions et les cookies sont deux choses différentes.

      Les sessions sont appelé par la variable $_SESSION['champ'] et les cookies par $_COOKIE['champ'].
      Ils peuvent toutefois avoir une utilisation similaire.
      Pour les varaiables de session, il faut placer au début de la page:
      <?php
      session_start();
      ?>

      Ne rien mettre avant ça.
      Les cookies se déclare avec ce code:
      <?php
      $temps='3600';
      setcookie('nom', 'contenu', (time() + $temps));
      ?>

      Il suffit ensuite de simplement placer la variable pour l'utiliser.
      J'espère avoir clarifié un peu le problème.
    2. @artheziusLes sessions et les cookies sont deux choses différentes, MAIS les sessions utilisent les cookies. L'identifiant de session, qui permet au navigateur de dire au serveur PHP "c'est cette session-là sur laquelle je travaille", est stockée dans un cookie. D'où tout ce que j'ai dit, sans confusion entre les deux :)
  2. salut reivax.

    merci de t'interresser, mais ta solution donne le meême comportement de la page....
    1. bonjour session_start(); dois être appelé à chaue début de page et pas seulement pour initialiser la session

      met session_start() au dessus du doctype et hors du if et ça ira mieux...
      1. Oui effectivement !
        On teste si $_SESSION['var'] existe avant de relancer session_start()... Donc évidemment, il n'existe pas encore !
        1. J'ai avancé, et j'ai maintenant un problême avec ce code:


          <?php
          session_start();

          if (isset($_GET['relaunch_session'])){//redemarage de session
          echo "Redemarage de la session en cours......";
          $_SESSION = array();
          session_destroy();
          echo "Redemarage de la session effectué.";
          }

          if (isset($_SESSION['var'])){
          echo "-----LA variable var est deja defini .";
          }
          else{//on a jamais defini var
          echo " On a jamais defini var ";
          $_SESSION['var']= 3;
          echo " var vient d'être defini.";
          }
          ?>
          <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
          <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
          <head>
          <title>Bienvenue sur mon site !</title>
          <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
          </head>
          <body>
          <p>
          <CENTER>ESSAI SESSION
          <br /><br /><br /><br /><br /><br /><br />
          <a href="essai_session.php">Clique ici pour relancer la page.</a><br />
          <br /><br /><br /><br /><br /><br /><br />
          <a href="./essai_session.php?relaunch_session=0">Cliquez ici pour reinitialiser la session !</a></CENTER>
          </p>
          </body>
          </html>


          je vous décrit le comportement:
          ->tout d'abord, je fais une réinitialisation.ce qui affiche:

          Redemarage de la session en cours......Redemarage de la session effectué. On a jamais defini var var vient d'être defini.

          jusque la tout va bien, il me dit lui même que la variable $_SESSION['var'] est defini. je suis content
          ->donc, je fais un réaffichage de la page et voila ce qu'il affiche:

          On a jamais defini var var vient d'être defini.

          ->si je relance encore la page , il affichera bien:

          -----LA variable var est deja defini .

          mais j'avoue ne pas comprendre pourquoi il ne le fait pas au premier réaffichage, alors qu'il dit lui même que
          $_SESSION['var'] est defini...

          j'ai fait un autre test ou l'on voit que la fonction isset renvoie avant le 1er réaffichage que la var est défini...
          comment peut-elle être defini juste avant de cliquer sur le lien et ne plus l'être juste aprés...

          je nage totalement, si quelqu'un peut m'aider,
          peut-être que j'ai omis quelquechose...

          merci d'avance
          1. <?php
            session_start();
            
            //N'utilise pas un doctype si ce n'est pas pour respecter le standard qui vas avec !
            ?>
            <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
            <html xmlns="http://www.w3.org/1999/xhtml" lang="fr">
            <head>
            	<title>Bienvenue sur mon site !</title>
            	<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
            
            </head>
            <body>
            <p><?php
            if (isset($_GET['relaunch_session'])){//redemarage de session
            	//echo "Redemarage de la session en cours......"; // Inutile de mettre ça ça prend à peine un milième de seconde
            	//session_destroy(); après un appel de session_destroy() il faut forcément rapeller session_start() et avant que qoi que ce soit soit généré
            	//plus simple :
            	unset($_SESSION);
            	echo "Redemarage de la session effectué.";
            }
            
            if (isset($_SESSION['var'])) echo "-----LA variable var est deja defini .";
            else{//on a jamais defini var
            	//echo " On a jamais defini var "; // Inutile également si elle vient d'être définit c'est qu'elle n'y était pas...
            	$_SESSION['var']= 3;
            	echo " var vient d'être defini.";
            }
            ?></p>
            
            	<p style="text-align: center;">
            		ESSAI SESSION
            		<br /><br /><br /><br /><br /><br /><br />
            		<a href="essai_session.php">Clique ici pour relancer la page.</a>
            		<br /><br /><br /><br /><br /><br /><br /><br />
            		<a href="./essai_session.php?relaunch_session=0">Cliquez ici pour reinitialiser la session !</a>
            	</p>
            </body>
            </html>