Mes variables de session disparaissent après une redirect°

Petit nouveau ! | 6 Messages

19 avr. 2012, 17:43

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 !

ViPHP
xTG
ViPHP | 7331 Messages

19 avr. 2012, 18:08

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().

Petit nouveau ! | 6 Messages

19 avr. 2012, 18:30

Oui, il est en tout début, et je n'ai pas d'espace ou de ligne vide avant mon <?php...

ViPHP
xTG
ViPHP | 7331 Messages

19 avr. 2012, 19:35

Navigateur acceptant les cookies ?
Pour vérifier que ce n'est pas une nouvelle session à chaque changement de page affiches session_id().

Petit nouveau ! | 6 Messages

19 avr. 2012, 21:01

session_id ne change pas...

ViPHP
xTG
ViPHP | 7331 Messages

20 avr. 2012, 09:15

Il n'y a pas de raison dans ce cas.
Un var_dump($_SESSION) montre un array totalement vide ??

Petit nouveau ! | 6 Messages

20 avr. 2012, 12:36

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...

ViPHP
xTG
ViPHP | 7331 Messages

20 avr. 2012, 12:55

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.