Perte variable de session

Eléphant du PHP | 216 Messages

09 déc. 2005, 00:48

Bonsoir! Qui peut me dire pourquoi est ce que les variables de session ['classe'] et ['binome'] changent au cours de ce script?
<?php
session_start();

//inclusion des fichiers nécessaires
require("../log.php");

//Si la session n'existe pas (personne non identifiée), ou que l'utilisateur n'est pas le bon, renvoi à la page d'identification
if(!$_SESSION['classe']||!$_SESSION['binome']){
  echo 'Veuillez vous identifier.';
	header("location:connexion.htm");
}

//la session existe, la personne est identifiée
else{
//echo $_SESSION['classe'];
//echo $_SESSION['binome'];
$date = $_POST['date'];
$classe = $_POST['classe'];
$binome = $_POST['binome'];
$objectif = $_POST['objectif'];	
$conformes = $_POST['conformes'];
$rebuts = $_POST['rebuts'];
$commentaire = $_POST['commentaire'];
$conformes2 = $_POST['conformes2'];
$rebuts2 = $_POST['rebuts2'];
$commentaire2 = $_POST['commentaire2'];

// connection à la BDD
$link = mysql_connect ($host,$user,$pass) or die ('Erreur : '.mysql_error() );
mysql_select_db($db) or die ('Erreur :'.mysql_error());

$select="UPDATE `suivi_pieces` SET `conformes` = '".$conformes."', `rebuts` = '".$rebuts."', `commentaires` = '".$commentaire."' WHERE (`date` ='".$date."'&&`classe` ='".$classe."'&&`rebuts` ='".$rebuts2."'&&`binome` ='".$binome."'&&`objectif` ='".$objectif."'&&`conformes` ='".$conformes2."'&&`commentaires` ='".$commentaire2."');";
$result = mysql_query($select,$link) or die ('Erreur : '.mysql_error() );
$url="gestion3.php?objet=".$_SESSION['objet']."&piece=".$_SESSION['piece']."&phase=".$_SESSION['phase'];
echo '<font size="5" color="#339933">Les informations ont bien été modifiées';
}

?>
<html>
<head>
<title>Gestion production</title>
</head>
<body bgcolor="#99CCFF">
<p align="center"><a href="
<?php echo $url; ?>
">Retour</a>
<?php
//echo $_SESSION['classe'];
//echo $_SESSION['binome'];
?>
</body>
</html>


Au début j'ai les bonnes variables de session.
A la fin j'ai d'autres variables, mais normalement ça ne devrait pas changer??? Je ne comprends pas.
Pour information, j'ai réussi à détourner le problème, mais je ne comprends pas mon erreur.[/code]

Mammouth du PHP | 19672 Messages

09 déc. 2005, 09:09

Je n'ai pas encore vu pourquoi tes variables de sessions disparaissent, en revanche, une erreur m'a sauté aux yeux:
//...
if(!$_SESSION['classe']||!$_SESSION['binome']){
  echo 'Veuillez vous identifier.';
    header("location:connexion.htm");
} 
//...
Avec ce code, on va te voir revenir nous voir en nous demandant pourquoi tu as l'erreur "Warning , cannot send header etc..."

Tu ne peux rien envoyer vers le navigateur avant l'utilisation de la fonction header() : La formulation en outre est erronée et sort tout droit de JavaScript. Il faut essayer de ne pas mélanger , enlève le "location:" et ne laisse que le chemin du fichier.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Invité
Invité n'ayant pas de compte PHPfrance

09 déc. 2005, 21:01

Je n'ai pas encore vu pourquoi tes variables de sessions disparaissent, en revanche, une erreur m'a sauté aux yeux:
//...
if(!$_SESSION['classe']||!$_SESSION['binome']){
  echo 'Veuillez vous identifier.';
    header("location:connexion.htm");
} 
//...
Avec ce code, on va te voir revenir nous voir en nous demandant pourquoi tu as l'erreur "Warning , cannot send header etc..."

Tu ne peux rien envoyer vers le navigateur avant l'utilisation de la fonction header() : La formulation en outre est erronée et sort tout droit de JavaScript. Il faut essayer de ne pas mélanger , enlève le "location:" et ne laisse que le chemin du fichier.
Ok si tu veux mais là n'est pas le problème. Header fonctionne bien ici, je n'ai pas de message bidon pour le moment.
Mais la perte de la variable de session m'intrigue.

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

09 déc. 2005, 21:21

[ Header fonctionne bien ici, je n'ai pas de message bidon pour le moment.
Très étonnant étant donné que tu affiche (echo) juste avant !!

Autre chose bizarre, l'opérateur "et" en SQL est "AND" et non "&&".

Sinon tu as 4 lignes, en commentaires, sur les variables de session:
//echo $_SESSION['classe'];
//echo $_SESSION['binome']; 
la 1ere série affiche le bon contenu et le second affichage (en bas de page) est erroné, c'est bien cela ?

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Invité
Invité n'ayant pas de compte PHPfrance

09 déc. 2005, 22:12

[ Header fonctionne bien ici, je n'ai pas de message bidon pour le moment.
Très étonnant étant donné que tu affiche (echo) juste avant !!

Autre chose bizarre, l'opérateur "et" en SQL est "AND" et non "&&".

Sinon tu as 4 lignes, en commentaires, sur les variables de session:
//echo $_SESSION['classe'];
//echo $_SESSION['binome']; 
la 1ere série affiche le bon contenu et le second affichage (en bas de page) est erroné, c'est bien cela ?
Oui c'est cela. C'est là que ça me dérange. Autrement pour le header, pour celui ci je n'ai pas testé, mais le répertoire est protégé par htaccess. donc normalement personne ne devrait y accéder. J'avoue que je n'ai pas testé celui là, je pensais à un autre header qui fait partie de mon script final. Pour le && en SQL, eh bien ça marche?!? J'ai toujours fait comme ça et pas de soucis jusque là.

A Cyrano: pour easyphp1.8, il faut la syntaxe suivant: header("location:page.htm"), et si je vire le location: ça foire. Et je ne comprends pas pourquoi tu dis que c'est codé Javascript?

Eléphant du PHP | 216 Messages

09 déc. 2005, 22:17

Au fait les messages de Invité c'est moi, bien entendu.
Pour le Header, c'est rectifié mais le problème n'avait jamais apparu jusqu'ici! Je vais mettre mes pages à jour.

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

10 déc. 2005, 01:33

voila une proposition de correction, entre autre il manquait la fermeture des balises <p> et <font>, de plus un affichage (echo: message de confirmation) avant <HTML>:
<?php
session_start();

//inclusion des fichiers nécessaires
require("../log.php");

//Si la session n'existe pas (personne non identifiée), ou que l'utilisateur n'est pas le bon, renvoi à la page d'identification
if(!$_SESSION['classe'] && !$_SESSION['binome'])
{  
    header("location:connexion.htm");	
}
else //la session existe, la personne est identifiée
{
	//echo $_SESSION['classe'];
	//echo $_SESSION['binome'];
	$date = $_POST['date'];
	$classe = $_POST['classe'];
	$binome = $_POST['binome'];
	$objectif = $_POST['objectif'];    
	$conformes = $_POST['conformes'];
	$rebuts = $_POST['rebuts'];
	$commentaire = $_POST['commentaire'];
	$conformes2 = $_POST['conformes2'];
	$rebuts2 = $_POST['rebuts2'];
	$commentaire2 = $_POST['commentaire2'];
	
	// connection à la BDD
	$link = mysql_connect ($host,$user,$pass) or die ('Erreur : '.mysql_error() );
	mysql_select_db($db) or die ('Erreur :'.mysql_error());
	
	$select="UPDATE `suivi_pieces` 
		SET `conformes` = '".$conformes."', `rebuts` = '".$rebuts."', `commentaires` = '".$commentaire."' 
		WHERE `date` ='".$date."' AND `classe` ='".$classe."' AND `rebuts` ='".$rebuts2."' AND `binome` ='".$binome."' 
		AND `objectif` ='".$objectif."' AND `conformes` ='".$conformes2."' AND `commentaires` ='".$commentaire2."'";
		
	$result = mysql_query($select,$link) or die ('Erreur : '.mysql_error() );
	
	$url="gestion3.php?objet=".$_SESSION['objet']."&piece=".$_SESSION['piece']."&phase=".$_SESSION['phase'];
		
	?>
	<html>
	<head>
	<title>Gestion production</title>
	</head>
	<body bgcolor="#99CCFF">	
		<p align="center">
			<font size="5" color="#339933">Les informations ont bien été modifiées</font>
			<br />
			<a href="<?php echo $url; ?>">Retour</a>	
		</p>
	</body>
	</html>
<?
	//echo $_SESSION['classe'];
	//echo $_SESSION['binome'];
}
?>
essaie avec ce code et dis nous si ça change quelque choses, a défaut le code est plus correct :wink:

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 216 Messages

10 déc. 2005, 10:28

Ok j'ai fait le test et ça marche. Curieux que ça perde les variables de session pour des balises html non refermées.
Autrement, j'ai fait encore autrement au final, avec une fonction header("location:$url").
<?php
session_start();

//inclusion des fichiers nécessaires
require("../log.php");

//Si la session n'existe pas (personne non identifiée), ou que l'utilisateur n'est pas le bon, renvoi à la page d'identification
if(!$_SESSION['classe']||!$_SESSION['binome']){
 	header("location:../connexion.htm");
}

//la session existe, la personne est identifiée
else{
$date = $_POST['date'];
$classe = $_POST['classe'];
$binome = $_POST['binome'];
$objectif = $_POST['objectif'];	
$conformes = $_POST['conformes'];
$rebuts = $_POST['rebuts'];
$commentaire = $_POST['commentaire'];
$conformes2 = $_POST['conformes2'];
$rebuts2 = $_POST['rebuts2'];
$commentaire2 = $_POST['commentaire2'];

// connection à la BDD
$link = mysql_connect ($host,$user,$pass) or die ('Erreur : '.mysql_error() );
mysql_select_db($db) or die ('Erreur :'.mysql_error());

$select="UPDATE `suivi_pieces` SET `conformes` = '".$conformes."', `rebuts` = '".$rebuts."', `commentaires` = '".$commentaire."' WHERE (`date` ='".$date."'&&`classe` ='".$classe."'&&`rebuts` ='".$rebuts2."'&&`binome` ='".$binome."'&&`objectif` ='".$objectif."'&&`conformes` ='".$conformes2."'&&`commentaires` ='".$commentaire2."');";
$result = mysql_query($select,$link) or die ('Erreur : '.mysql_error() );
$url="gestion3.php?objet=".$_SESSION['objet']."&piece=".$_SESSION['piece']."&phase=".$_SESSION['phase'];
header("location:$url");
}

?>



Ca marche sans soucis, j'évite une page supplémentaire avec le lien retour, ça me recharge la page "gestion3.php?variables..."
Et je ne perds pas les valeurs en session.