sesiones - Las variables de sesión de PHP no se transfieren a mi página de inicio de sesión, pero la ID de sesión es
session start php (4)
Estoy usando PHP 4.3.9, Apache / 2.0.52
Estoy intentando que funcione un sistema de inicio de sesión que registre los valores de la base de datos en una sesión en la que estén disponibles una vez que haya iniciado sesión. Perderé las variables de la sesión una vez que me redirijan .
Estoy usando el siguiente código para imprimir los ID / valores de la sesión en mi página de formulario de inicio de sesión y la página redireccionada:
echo ''<font color="red">session id:</font> '' . session_id() . ''<br>'';
echo ''<font color="red">session first name:</font> '' . $_SESSION[''first_name''] . ''<br>'';
echo ''<font color="red">session user id:</font> '' . $_SESSION[''user_id''] . ''<br>'';
echo ''<font color="red">session user level:</font> '' . $_SESSION[''user_level''] . ''<br><br>'';
Esto es lo que está impreso en mi navegador desde mi página de inicio de sesión (simplemente comento el redireccionamiento del encabezado a la página de inicio de sesión). Esta es la información correcta proveniente de mi DB también, así que todo está bien en este punto .
session id: 1ce7ca8e7102b6fa4cf5b61722aecfbc
session first name: elvis
session user id: 2
session user level: 1
Esto es lo que está impreso en mi página redirigida / iniciada sesión (cuando elimino el comentario del encabezado / redirección). ID de sesión es el mismo , pero no obtengo ningún valor para las variables de sesión individuales.
session id: 1ce7ca8e7102b6fa4cf5b61722aecfbc
session first name:
session user id:
session user level:
Obtengo los siguientes errores:
Índice no definido: first_name
Índice no definido: user_id
Índice indefinido: user_level
Tengo un archivo global header.php que mi loggedIN.php NO llama, aunque lo hace loggedOUT.php - para brindar por la sesión):
header.php
<?php
ob_start();
session_start();
//if NOT on loggedout.php, check for cookie. if exists, they haven''t explicity logged out so take user to loggedin.php
if (!strpos($_SERVER[''PHP_SELF''], ''loggedout.php'')) {
/*if (isset($_COOKIE[''access''])) {
header(''Location: www.mydomain.com/loggedin.php'');
}*/
} else {
//if on loggedout.php delete cookie
//setcookie(''access'', '''', time()-3600);
//destroy session
$_SESSION = array();
session_destroy();
setcookie(session_name(), '''', time()-3600);
}
//defines constants and sets up custom error handler
require_once(''config.php'');
?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
some page layout stuff
Login portion is eventually called via include
footer stuff
Mi loggedIN.php no hace más que comenzar la sesión
<?php
session_start();
?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
La lógica de mi script de inicio de sesión , la parte clave es que estoy obteniendo los resultados de la base de datos en $ _SESSION (aproximadamente a mitad de camino):
if (isset($_POST[''login''])) {
//access db
require_once(MYSQL);
//initialize an errors array for non-filled out form fields
$errors = array();
//setup $_POST aliases, clean for db and trim any whitespace
$email = mysql_real_escape_string(trim($_POST[''email'']), $dbc);
$pass = mysql_real_escape_string(trim($_POST[''pass'']), $dbc);
if (empty($email)) {
$errors[] = ''Please enter your e-mail address.'';
}
if (empty($pass)) {
$errors[] = ''Please enter your password.'';
}
//if all fields filled out and everything is OK
if (empty($errors)) {
//check db for a match
$query = "SELECT user_id, first_name, user_level
FROM the rest of my sql here, blah blah blah";
$result = @mysql_query($query, $dbc)
OR trigger_error("Query: $query/n<br />MySQL Error: " . mysql_error($dbc));
if (@mysql_num_rows($result) == 1) { //a match was made, OK to login
//register the retrieved values into $_SESSION
$_SESSION = mysql_fetch_array($result);
mysql_free_result($result);
mysql_close($dbc);
/*
setcookie(''access''); //if "remember me" not checked, session cookie, expires when browser closes
//in FF you must close the tab before quitting/relaunching, otherwise cookie persists
//"remember me" checked?
if(isset($_POST[''remember''])){ //expire in 1 hour (3600 = 60 seconds * 60 minutes)
setcookie(''access'', md5(uniqid(rand())), time()+60); //EXPIRES IN ONE MINUTE FOR TESTING
}
*/
echo ''<font color="red">cookie:</font> '' . print_r($_COOKIE) . ''<br><br>'';
echo ''<font color="red">session id:</font> '' . session_id() . ''<br>'';
echo ''<font color="red">session first name:</font> '' . $_SESSION[''first_name''] . ''<br>'';
echo ''<font color="red">session user id:</font> '' . $_SESSION[''user_id''] . ''<br>'';
echo ''<font color="red">session user level:</font> '' . $_SESSION[''user_level''] . ''<br><br>'';
ob_end_clean();
session_write_close();
$url = BASE_URL . ''loggedin_test2.php'';
header("Location: $url");
exit();
} else {
//wrong username/password combo
echo ''<div id="errors"><span>Either the e-mail address or password entered is incorrect or you have not activated your account. Please try again.</span></div>'';
}
//clear $_POST so the form isn''t sticky
$_POST = array();
} else {
//report the errors
echo ''<div id="errors"><span>The following error(s) occurred:</span>'';
echo ''<ul>'';
foreach($errors as $error) {
echo "<li>$error</li>";
}
echo ''</ul></div>'';
}
} // end isset($_POST[''login''])
si comento el redireccionamiento del encabezado en la página de inicio de sesión, puedo repetir las variables $ _SESSION con la información correcta del DB. Una vez que se redirigen a la página de inicio de sesión, sin embargo, desaparecen o se desarman.
¿Alguien tiene alguna idea? He pasado casi todo el día en esto y no puedo decir que esté más cerca de descubrirlo.
Por cierto, recientemente hice 2 páginas de prueba simples, una comenzó una sesión, estableció algunas variables, envió un formulario que redirigió a una segunda página que no hizo más que leer / dar salida a los valores de sesión. Todo parece funcionar bien, solo estoy teniendo problemas con algo que estoy haciendo en mi aplicación principal.
Intenta hacer una
session_regenerate_id(true);
antes de
session_write_close();
También. La mejor forma de IMO para hacer un script de inicio de sesión es esta:
Deje que la lógica de inicio de sesión se maneje dentro de la página principal a la que el usuario intenta acceder.
- Si el usuario no está autenticado, regresa a la página de inicio de sesión
- Si el usuario está autenticado, obtiene $ _SESSION ["auth"] o algo
- Luego, cuando el usuario navega por la página principal u otras páginas que necesitan autenticación, solo comprueban si se ha configurado $ _SESSION ["auth"].
Entonces no tendrá el problema de la sesión, no guardando justo antes de una redirección
No veo un session_start()
en su secuencia de comandos de inicio de sesión. Si no está comenzando la sesión, no creo que php guarde ningún dato que coloque en el array $_SESSION
. También para estar seguro, colocaría variables de manera explícita en el array $_SESSION
lugar de sobrescribir todo con $_SESSION = mysql_fetch_array($result);
.
... puedo agregar a las otras respuestas, que session_start () a veces falla o se producen cosas raras si no se coloca en el primer comienzo del guión. En su script de encabezado, intente:
En lugar de
<?php
ob_start();
session_start();
Poner
<?php
session_start();
ob_start();
Estaba teniendo un problema similar cuando descubrí esto:
http://www.w3schools.com/php/php_sessions.asp
TIENE QUE poner el session_start (); antes de CUALQUIER etiqueta html