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>
    0
    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.
      0
    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 :)
      0
  2. salut reivax.

    merci de t'interresser, mais ta solution donne le meême comportement de la page....
    0
    1. je me permet de relancer....
      0
      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...
        0
        1. Oui effectivement !
          On teste si $_SESSION['var'] existe avant de relancer session_start()... Donc évidemment, il n'existe pas encore !
          0
          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
            0
            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>
              0