PHP:Problemas al forzar descargas/redireccionar (pérdida de valores de $ SESSION)

De Foros del Web

Pregunta: CASO1: Cuando uso un header() para redireccionar, no se guardan los cambios en las variables de session.

CASO2: Mi script de control de descargas funciona pero no permite navegar el sitio hasta que el download finaliza.

Respuesta:

Para el CASO 1 lo primero es asegurarse que el SID (Identificador Unico de Session) se esté propagando por cookies y no por URL, ya que si este se está propagando por cookies y a su vez el browser no está siendo capaz de aceptar las cookies, esta puede ser la causa de la pérdida de valores de session. (Tener a bien realizar este control antes de utilizar la información a continuación).

En ambos casos la solución es utilizar el comando session_write_close(); que forzará el guardado de los cambios en session (variables) y cerrará la sesion sin destruirla (es decir, cuando vuelvo a hacer un session_start() la misma session sigue en pie).

Este problema sucede ya que PHP guarda los cambios en las variables de session cuando el script finaliza, y dado que un header() no significa el fin del script (sino un comando más), es necesario "forzar" el guardado y cierre de sesion.

Recordar que siempre se debe respetar el orden de los comandos de sesion, por ejemplo:

Código PHP:

session_start();
 
// Trabajamos con las variables de session
$_SESSION['contador']++;
$_SESSION['time'] = time();
 
(...)
 
// Antes de redireccionar, guardamos la session
 
session_write_close();
//redireccionamos
header("Location: /nueva_pagina.php");  

Para el caso 2 haremos exactamente lo mismo. Colocaremos un "session_write_close()" antes de llamar a la función header(); (que para este caso, nos estará redireccionando al archivo a descargarse).


--Computer XTress 31 May 2006

Este artículo es parte de las FAQs de PHP y el Manual de PHP.

Herramientas personales