Tengo una página, login.php, que procesa un nombre de usuario y una contraseña y, si tiene éxito, establece variables de sesión y luego redirige al usuario a home.php. La parte relevante de login.php está aquí:
if ($pwdHash == $storedpass) { $success = true; $sessionStatus = session_status(); if ($sessionStatus !== PHP_SESSION_ACTIVE) { session_start(); } $_SESSION['user_id'] = $user; $_SESSION['logged_in'] = true; session_write_close(); header('Location: http://www.examplesite.com/home.php'); header("HTTP/1.1 303 See Other"); die("redirecting"); }Luego, home.php intenta recopilar la variable de sesión.
$sessionStatus = session_status(); if ($sessionStatus !== PHP_SESSION_ACTIVE) { session_start(); } $loggedIn = $_SESSION['logged_in'];El problema es que en el primer intento de inicio de sesión, $_SESSION['logged_in'] no está definido y genera un error, aunque login.php fue exitoso.
Notice: Undefined index: logged_inUn var_dump de $_SESSION devuelve una matriz vacía, pero sessionStatus informa que la sesión ya se inició, no tuvo que ejecutar session_start.
Esto obliga al usuario a iniciar sesión por segunda vez, luego todo está bien. Entonces, ¿la redirección está sucediendo demasiado rápido para que se establezca la variable de sesión? ¿Debo poner un retraso en la redirección? (¿y cómo haría eso?) ¿O es algo más que estoy haciendo mal?
EDITAR: Verifiqué con mi host en base a una respuesta a una pregunta similar y confirmé que una sesión nunca sería atendida por más de un servidor y no hay necesidad de habilitar sesiones pegajosas ni nada por el estilo. También actualicé el código anterior en función de una respuesta que se ofrece a continuación y alguna otra investigación, pero el error persiste.
La sesión probablemente se guarde automáticamente cuando finalice el script. Redirige antes de que finalice el script.
El tiempo que tarda su secuencia de comandos en terminar realmente depende en gran medida de lo que otro código necesita para relajarse. Es mejor guardar explícitamente la sesión.
Cómo hacerlo depende del tipo de sesiones que utilice. Un tipo se puede cerrar así:
http://php.net/manual/en/function.session-write-close.php
Si ese es el que estás usando, haz esto:
if ($pwdHash == $storedpass) { $success = true; $_SESSION['user_id'] = $user; $_SESSION['logged_in'] = true; session_write_close(); header('Location: http://www.examplesite.com/home.php'); header("HTTP/1.1 303 See Other"); die("redirecting"); }Y la sesión debería estar disponible en la página siguiente cuando redirige.
Si tus sesiones funcionan de forma diferente, tienes que adaptar el código, por supuesto. El punto que estoy tratando de hacer es: nunca ponga un retraso en su código. No es fiable y no tiene sentido. Simplemente guarde la sesión antes de redirigir.
Experimenté el mismo problema al escribir el contenido de la sesión en la base de datos. Para que funcione, agregué la función sleep() antes de configurar la variable de sesión, como se muestra a continuación.
sleep(2); $_SESSION['GUID'] = uniqid(time().rand());Resuelve el problema para mí.
Hemos observado este problema cuando las visitas a la página son frecuentes, pero si uno o dos usuarios acceden a la página, funciona como se esperaba.
He encontrado este mismo problema con una página de inicio de sesión, pero ninguna de las sugerencias me funciona. Lo único que he encontrado que funciona es redirigir la página a sí misma después de 1 segundo y luego verificar las variables de la sesión para ver si el inicio de sesión fue exitoso...
startSession(); // assigns all the login session variables, etc. header('Refresh: 1; URL=/[THIS_PAGE].php'); // [THIS_PAGE] = the current login pageSin embargo, esta es una solución muy poco elegante y no me gusta usarla. Pero funciona".