Cita:
Iniciado por Triby
De momento, un error mío, mysql_num_rows() requiere un parámetro, en este caso, $result... pequeño detalle que se me (nos) pasó.
La función esUsuario() lo único que hace es verificar si el usuario actual tiene sesión iniciada o es un invitado.
Sugerencia, después de login redirige a una página donde sólo tengas:
Con eso vas a ver lo que hay en sesiones y en cookies, si todo va bien, entonces llamas a la función esUsuario() y vuelves a usar var_dump() para ver si hay cambios, si es el caso, entonces en esa función algo hay mal... como comentaba en ese tema, son ejemplos y no todos los probé, pero podemos hacerlo funcionar.
Buenos días! Me ha servido de ayuda esto que me comentaste, y creo que he encontrado el fallo en la función esUsuario(); Corrígeme si me equivoco,me explico...
Código PHP:
function esUsuario() {
if( ! isset($_SESSION['usuario'])) {
//Aqui las operaciones si no existe la sesion
}
if(isset($_SESSION['usuario'])) {
$cadena = "{$_SESSION['usuario']['id']}|{$_SESSION['usuario']['nombre']}|{$_SESSION['usuario']['correo']}|{$_SERVER['REMOTE_ADDR']}";
if(strMd5($cadena) == $_SESSION['usuario']['comprobacion']) {
// Sesión válida, renovamos cookie para mantenerlo conectado
setcookie('usuario', "{$_SESSION['usuario']['id']}|{$_SESSION['usuario']['comprobacion']}", time() + (86400 * 30), '/');
return true;
}
// Sesión no válida, posiblemente es un ataque
// Cerramos sesión
logout();//Si existe la sesion, y aunque la cadena y la sesion de comprobacion sean iguales, siempre haremos logout y por tanto la cookie estara en modo sin sesion,¿no?
}
// No hay sesión válida, nos aseguramos de que la cookie siga sin datos
setcookie('usuario', 'sin sesión', time() + 3600, '/');//Aqui al final de la comprobación cambiaremos la cookie tambien, si o si, exista o no la sesion.
return false;
}
Al final de la función ,se ve que hacemos logout() y modificamos la cookie, pero estas operaciones no están sujetas a ninguna condición, por tanto siempre se realizaran cada vez que llamemos al script. ¿Voy bien?.
Por tanto modificando esta parte, y poniéndolo donde toca,que es si la cadena y la sesión no son iguales, funciona perfectamente y se mantiene la sesión.
Yo lo que haría, es poner un else donde esta la comparación de la cadena y la sesión comprobación, y poner que si no es igual, haga logout y cambie la cookie.
Quizás este diciendo una tontería.... no soy un experto.
Por otra parte, lo que no estoy seguro es si esta parte funciona bien. Que es el caso en que la session no exista.
Código PHP:
if( ! isset($_SESSION['usuario'])) {
// Entonces buscamos en cookie
$cookie = (isset($_COOKIE['usuario'])) ? $_COOKIE['usuario'] : 'sin sesión';
if($cookie != 'sin sesión' && $cookie != '') {
// Separamos ud y cadena de comprobación
$tmp = explode('|', $cookie);
// Sólo será válida si son dos elementos
if(count($tmp) == 2) {
$id = (int) $tmp[0];
$result2 = mysql_query("SELECT u_id, u_nombre,u_pass,u_email,u_nivel,u_creditos FROM user WHERE u_id='$id'");
$comp = mysql_fetch_assoc($result2);
// Si los datos son válidos, creamos variables de sesión
$_SESSION['usuario'] = array(
'id' => $comp['u_id'],
'nombre' =>$comp['u_nombre'],
'correo' => $comp['u_email'],
'rol' => $comp['u_nivel'],
'comprobacion' => $tmp[1] // La cadena obtenida de cookie
);
}
}
}
Un saludo! y espero explicarme con claridad...a ver si conseguimos que funcione, ya que es un aporte muy interesante.