2009-08-30 15 views
6

Estoy usando el siguiente código para invalidar la sesión. He vinculado a logout.php en muchas páginas. Si se hace clic en ese enlace, se llama a la página logout.php. El siguiente es el código en logout.php.Problemas de la sesión PHP

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

Una vez que se invalida la sesión quiero abrir la página index.php. pero estoy Consiguiendo el siguiente error:

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

Cuál es el problema?

Respuesta

16

Creo que no puede haber llamado a la función session_start() antes de destruir la sesión.

+0

¿Por qué alguna vez downvoted, él tiene razón. –

+0

Gracias ... de todos modos debe llamarse a session_start() al comienzo del script. – mck89

8

Tendrá que llamar a session_start() en la parte superior de la página para recordarle a php que esta llanta pertenece a la sesión. - Al menos PHP manual dice eso.

Las notas en esa página de manual dan indicios de que session_unset() solo se va a utilizar en entornos más antiguos que no están usando la variable $ _SESSION.

+0

Bueno, es una buena idea que no esté usando 'session_unset()' luego ... – nickf

+0

@nickf: correcto, no reconoció correctamente –

2

usted tiene que abrir la primera sesión:

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

Creo que la redirección debe colocarse al final, porque escribiendo el código como este el script realiza la redirección y no ejecuta las otras funciones – mck89

+0

No, funciona como se esperaba. – rodrigoap

+1

Funciona solo como se esperaba porque el script aún finaliza la ejecución después de enviar el encabezado. Sin embargo, debe colocar el encabezado después de que se destruya la sesión para disminuir la confusión del código. – MitMaro

1

El problema es que no se puede destruir una sesión que no se ha iniciado. Eso está generando una advertencia que se repite en el navegador. El siguiente problema es que no puede enviar encabezados después de que se haya enviado al navegador, por lo que se genera otra advertencia.

Sólo tiene que comprobar si existe una sesión en primer lugar:

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

siempre debe utilizar session_start(); ANTES de usar una función/variable de sesión. Así que inicie todos los archivos PHP con session_start() ;. También logout.php:

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

También no es necesario desarmar la misma.

+0

La documentación de PHP dice claramente que limpie manualmente la matriz $ _SESSION con '$ _SESSION = array();'. ¿Por qué dices que no necesitas desarmarlo? [Esta es la documentación a la que me refiero] (http://php.net/manual/en/function.session-destroy.php). – doug65536