Page 1 sur 1

Mes variables de session disparaissent après une redirect°

Posté : 19 avr. 2012, 17:43
par yannG1040
Bonjour, j'ai déjà eu ce problème mais je ne me rappelle pas comment faire.

En gros je souhaite pouvoir afficher un message à l'attention de l'utilisateur comme par exemple "Connexion réussie", "Tel champ doit être renseigné" etc.

J'ai choisi d'utiliser des variables de session mais lorsque je veux afficher leur contenu je m'aperçois qu'il est vide après une redirection. Lorsque je déclare ma variable et que je l'affiche dans le même script tout va bien, mais si je la déclare et que je fais une redirection derrière, le message ne s'affiche pas, comme s'il n'y avait pas de session.

Je mets bien un session_start(); au début de chaque script.

Voici le code php qui génère le message (le tableau $err contient le cas échéant des messages d'erreurs, générés en amont lors de la validation du formulaire) :
//-- si on a détecté des erreurs
if (isset($err)) {
	if (count($err) > 1) {
		$_SESSION['error'] = "<p>".count($err)." erreurs ont été détectées :</p>\n<ul>\n";
		foreach ($err as $ch) {
			$_SESSION['error'] .= "<li>$ch</li>\n";
		}
		$_SESSION['error'] .= "</ul>\n";
	}
	else $_SESSION['error'] = "<p>$err[0]</p>";
}
//-- pas de redirection, le formulaire sera affiché plus bas dans le même fichier

//-- sinon on enregistre
if (!isset($err)) {
	$nom = mysql_real_escape_string($nom);
	$auteur = mysql_real_escape_string($auteur);
	$sql = "INSERT INTO ma_table (id, nom, annee, mois, auteur, pays, langue, fichier)
			VALUES('', '$nom', '$annee', '$mois', '$auteur', '$pays', '$langue', '$fic')";
	$rs = @mysql_query($sql);
	if (!$rs) {
		$_SESSION['error'] = "<p>La requête \"<em>$sql</em>\" a généré : <strong>".mysql_error()."</strong></p>";
	}
	else $_SESSION['succes'] = "<p>Rapport enregistré.</p>";
	//-- on redirige pour afficher le message sur la prochaine page.
	header('Location: index.php');
}
et le code qui est censé afficher les messages :
<?php
if (isset($_SESSION['error'])) {
	$msg = $_SESSION['error'];?>
				<div id="message" class="error">
					<?php echo $msg; ?>
				</div>
<?php
	unset($_SESSION['error']);
}

if (isset($_SESSION['succes'])) {
	$msg = $_SESSION['succes'];?>
				<div id="message" class="succes">
					<?php echo $msg; ?>
				</div>
<?php
	unset($_SESSION['succes']);
}
?>
C'est sans doute tout bête mais je ne vois pas...

Merci d'avance pour toute aide !

Re: Mes variables de session disparaissent après une redirec

Posté : 19 avr. 2012, 18:08
par xTG
Ton session_start() est-il vraiment en tout début ? Car avec une mauvaise gestion de l'affichage des erreurs tu ne verras pas le warnings t'indiquant header alreay sent...
Et donc pas de démarrage de session s'il y a un tel warning concernant le session_start().

Re: Mes variables de session disparaissent après une redirec

Posté : 19 avr. 2012, 18:30
par yannG1040
Oui, il est en tout début, et je n'ai pas d'espace ou de ligne vide avant mon <?php...

Re: Mes variables de session disparaissent après une redirec

Posté : 19 avr. 2012, 19:35
par xTG
Navigateur acceptant les cookies ?
Pour vérifier que ce n'est pas une nouvelle session à chaque changement de page affiches session_id().

Re: Mes variables de session disparaissent après une redirec

Posté : 19 avr. 2012, 21:01
par yannG1040
session_id ne change pas...

Re: Mes variables de session disparaissent après une redirec

Posté : 20 avr. 2012, 09:15
par xTG
Il n'y a pas de raison dans ce cas.
Un var_dump($_SESSION) montre un array totalement vide ??

Re: Mes variables de session disparaissent après une redirec

Posté : 20 avr. 2012, 12:36
par yannG1040
En fait dans mon script d'affichage des commentaires j'utilise isset($_SESSION['var']) pour savoir si j'ai un message à afficher, puis unset($_SESSION['var']) pour que le message ne s'affiche pas sur les pages suivantes.

Dans le code tel qu'il est, un var_dump situé AVANT unset n'affiche pas la variable détruite (plus bas !) mais affiche correctement les autres variables (login...), si je supprime la commande unset, toutes les variables sont affichées, y compris celle que je voulais détruire après affichage (le problème ne vient donc pas de l'enregistrement de la variable).

On dirait que l'instruction unset est exécutée avant le reste, même si elle est située après dans le script :shock:

Je vais essayer avec des chaînes remplies/vides au lieu de déclarées/non déclarées pour voir si ça marche mieux mais j'aurais aimé comprendre...

Re: Mes variables de session disparaissent après une redirec

Posté : 20 avr. 2012, 12:55
par xTG
Tu n'aurais pas une autre redirection sur cette page d'affichage des messages ?
Car si c'est le cas tu affiches mais rediriges aussitôt sur la même page, donc tu perds les données.