Variable de session PHP.

Eti38 Messages postés 57 Statut Membre -  
Atropa Messages postés 2051 Statut Membre -
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...

7 réponses

Reivax962 Messages postés 3742 Statut Membre 1 011
 
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
arthezius Messages postés 3756 Statut Membre 475
 
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
Reivax962 Messages postés 3742 Statut Membre 1 011 > arthezius Messages postés 3756 Statut Membre
 
Les 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
Eti38 Messages postés 57 Statut Membre 2
 
salut reivax.

merci de t'interresser, mais ta solution donne le meême comportement de la page....
0
Eti38 Messages postés 57 Statut Membre 2
 
je me permet de relancer....
0
Atropa Messages postés 2051 Statut Membre 274
 
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Reivax962 Messages postés 3742 Statut Membre 1 011
 
Oui effectivement !
On teste si $_SESSION['var'] existe avant de relancer session_start()... Donc évidemment, il n'existe pas encore !
0
Eti38 Messages postés 57 Statut Membre 2
 
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
Atropa Messages postés 2051 Statut Membre 274
 
<?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