2009-08-30 9 views
6

J'utilise le code suivant pour invalider la session. J'ai lié à logout.php dans beaucoup de pages. Si vous cliquez sur ce lien de déconnexion, la page logout.php est appelée. Ce qui suit est le code logout.php.Problèmes de session PHP

unset($_SESSION['admin']); 
session_destroy(); 
header('Location: index.php'); 

Une fois que la session est invalidée Je veux ouvrir la page index.php. Mais je Geting l'erreur suivante:

Warning: session_destroy() [function.session-destroy]: Trying to destroy uninitialized session in C:\xampp\htdocs\Selection\logout.php on line 3

Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\Selection\logout.php:3) in C:\xampp\htdocs\Selection\logout.php on line 4

Qu'est-ce qui ne va pas?

Répondre

16

Je pense que vous ne pouvez pas avoir appelé la fonction session_start() avant de détruire la session.

+0

Pourquoi jamais downvoted, il a raison. –

+0

Merci ... de toute façon le session_start() doit être appelé au début du script. – mck89

8

Vous devrez appeler session_start() en haut de la page pour rappeler à php que ce pagecall appartient à la session. - Au moins PHP manual dit cela.

Les notes sur cette page de manuel indiquent que session_unset() doit uniquement être utilisé dans les environnements plus anciens qui n'utilisent pas la variable $ _SESSION.

+0

bien c'est une bonne chose qu'il n'utilise pas 'session_unset()' alors ... – nickf

+0

@nickf: correct, n'a pas reconnu correctement –

2

Vous devez ouvrir la session première:

header('Location: index.php'); 
session_start(); 
session_unset(); 
session_destroy(); 
+1

Je pense que la redirection doit être placée à la fin, car écrire le code comme ceci le script fait la redirection et n'exécute pas les autres fonctions – mck89

+0

Non, cela fonctionne comme prévu. – rodrigoap

+1

Cela ne fonctionne que comme prévu, car le script termine l'exécution après l'envoi de l'en-tête. Cependant, vous devez placer l'en-tête après la destruction de la session pour réduire la confusion du code. – MitMaro

1

Le problème est que vous ne pouvez pas détruire une session qui n'a pas été démarré. Cela soulève alors un avertissement qui est répercuté sur le navigateur. Le problème suivant est que vous ne pouvez pas envoyer d'en-têtes après la sortie dans le navigateur, ce qui déclenche un autre avertissement.

Vous avez juste besoin de vérifier si une session existe d'abord:

if (session_name() != '') { 
    session_destroy(); 
} 
0

Vous devez toujours utiliser session_start(); AVANT d'utiliser une fonction/variable de session. Commencez donc tous les fichiers PHP avec session_start() ;. Aussi logout.php:

session_start(); 
session_destroy(); 
header('Location: index.php'); 

Vous n'avez pas non plus besoin de le supprimer.

+0

La documentation PHP dit très clairement d'effacer manuellement le tableau $ _SESSION avec '$ _SESSION = array();'. Pourquoi dites-vous que vous n'avez pas besoin de le désactiver? [Ceci est la documentation à laquelle je fais référence] (http://php.net/manual/fr/function.session-destroy.php). – doug65536