Page 1 sur 1

session_destroy, bug ?

Posté : 15 mars 2007, 00:48
par VaN
Bonsoir,

Sur mon site j'affiche un lien 'Deconnexion' qui recharge la page courante en ajoutant la variable ?action=destroy dans l'URL.

le fichier qui contient ce lien vérifie si cette variable existe dans l'URL. si elle existe, le script effectue un session_destroy(), puis le reste de la page est chargée.

Dans ce même fichier, mais plus bas dans le script, je test l'existence d'une session, pour afficher ou non le login, et un texte, ainsi que des liens, qui changent si la session existe ou non.

Mon problème est le suivant :
Lorsque je clique sur 'deconnexion', le code qui suis le session_destroy ne comprend pas que la session est fermée, et m'affiche mes liens et le login de la session juste détruite, comme si cette session existait encore.

Voici le problème en image :

Ici, l'URL est index.php, avec une session ouverte :
Image

Je clique ensuite sur 'Déconnexion', l'URL devient index.php?action=destroy :
Image

Alors que cela devrait m'afficher :
Image

Le script qui génère tout ça :
<?php
// Fermeture de session
if(isset($_GET['action']) && $_GET['action'] == 'destroy')
{
	session_destroy();
	sleep(2);
}
?>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
  <tr>
	<td style="color:#505050;font-size:12px;padding-left:5px;">Marketplace for world pictures</td>
	<td align="right" style="color:#858585;font-size:12px;padding-right:5px;">
	<?php echo $lang_welcome; ?>, 
	<?php
	if(isset($_SESSION['user_login']))
	{
		echo $_SESSION['user_login'].' . ';
		if($_SESSION['user_level'] == 2)
			echo '<a href="admin/index.php">'.$lang_admin.'</a> . ';
		echo '<a href="'.$_SERVER['PHP_SELF'].'?action=destroy'.$add.'">'.$lang_log_out.'</a> . ';
		
	}
	else
	{
		echo $lang_guest.' . ';
		echo '<a href="auth.php">'.$lang_log_in.'</a> . ';
		echo '<a href="register.php">'.$lang_register.'</a> . ';
	}
	?>
	<?php 
	echo $lang_language.' : '; 
	?> 
	<a href="<?php echo $_SERVER['PHP_SELF']; ?>?lang=fr<?php echo $add; ?>"><img src="img/flag_fr.gif" alt="Français" border="0" /></a> 
	<a href="<?php echo $_SERVER['PHP_SELF']; ?>?lang=en<?php echo $add; ?>"><img src="img/flag_uk.gif" alt="English" border="0" /></a>
	</td>
  </tr>
</table>
Comme vous pouvez le voir, j'ai même essayer de mettre un sleep() pour laisser le temps au script de comprendre que la session était fermée, avant qu'il charge le reste de la page, même résultat.

Comment régler ce problème ?
Merci.

Posté : 15 mars 2007, 01:23
par guilt92
Bonjour,

le problème reste-il le même si à la place du sleep du recharge ta page ?
<?php 
// Fermeture de session 
if(isset($_GET['action']) && $_GET['action'] == 'destroy') 
{ 
    session_destroy(); 
    header('Location: '.$_SERVER["PHP_SELF"]);
} 
?>

Posté : 15 mars 2007, 02:19
par VaN
Non, le problème n'apparait pas. C'est d'ailleurs comme ça que je procédais avant. Mais l'une des pages sur lequel apparaît ce lien contient 6 photos selectionnées aléatoirement parmis une grande liste de photos. Et le fait de recharger la page faisait que les photos changeaient (vu que le script rechoisit 6 photos au hasard), et ça ne plait pas vraiment à mon client.

(deja que la page se recharge une fois, en cliquant sur le lien de deconnexion, ce la change 1 fois l'affichage. Avec un rafraichissement en plus, ils ne sont pas trop d'accord).

Posté : 15 mars 2007, 07:34
par guilt92
Et si tu fais un unset() de tes variables avant le session_destroy ?
<?php 
// Fermeture de session 
if(isset($_GET['action']) && $_GET['action'] == 'destroy') 
{ 
    unset( $_SESSION['user_login']);
    session_destroy(); 
    sleep(2); 
} 
?> 

Posté : 15 mars 2007, 08:37
par raptor
ou un :

session_unset();
session_destroy();

Posté : 15 mars 2007, 12:57
par VaN
Effectivement, ça marche bien avec session_unset() et session_destroy().

je ne connaissais pas cette fonction. merci.