Foros del Web » Programando para Internet » PHP »

un problema con sesiones de usuario

Estas en el tema de un problema con sesiones de usuario en el foro de PHP en Foros del Web. Hola amig@s!! Resulta que quiero administrar una web utilizando sesiones de usuario. Quiero decir, para acceder al contenido de la web hay que logarse primero, ...
  #1 (permalink)  
Antiguo 01/02/2010, 11:22
Avatar de aniMAYtions  
Fecha de Ingreso: diciembre-2007
Ubicación: Granada
Mensajes: 519
Antigüedad: 16 años, 4 meses
Puntos: 2
un problema con sesiones de usuario

Hola amig@s!!

Resulta que quiero administrar una web utilizando sesiones de usuario. Quiero decir, para acceder al contenido de la web hay que logarse primero, y una vez logado, manteniendo una sesión, poder recorrer toda la web.

Lo hago de la siguiente forma:

Código:
<?php
if(isset($enviar_logueo))
{
$username = $_POST['username'];
$password = $_POST['password'];
$login = login($username, $password);
}
?>
Eso va en el index.php. Luego, en la página donde guardo las funciones compruebo que el logueo es correcto y creo una variable de sesion que se supone debería mantenerse durante toda la visita.

Código:
function login($usu, $pss)
{
	$conexion = conectar();
	$consulta = "Select * From usuarios where nombre = '$usu' and password = '$pss' ";
	$resultado = mysql_query($consulta, $conexion);
	$filas = mysql_num_rows($resultado);
	if($filas > 0)
	{
		$_SESSION['usuario'] = $usu;
		$_SESSION['identificado'] = '1';
	}
	else
	{
		$_SESSION['identificado'] = '0';
	}
}
Pero compruebo que no es así. En el menú principal tengo puesto que, si $_SESSION['identificado'] == '1' el enlace vaia a donde tiene que ir, y si no pues que se quede en la página principal con el formulario de logueo(la aplicación es para una intranet que no necesita contenido más que al que se puede acceder si estás identificado).
La primera vez que accedo y me logue correctamente se activa el menú principal y puedo moverme bien, pero en cuanto entro a uno de lo menús se pierden las variables y se desactiva el menú principal de nuevo.

La cosa es, qué estoy haciendo mal??

Saludos.
  #2 (permalink)  
Antiguo 01/02/2010, 11:24
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 10 meses
Puntos: 1517
Respuesta: un problema con sesiones de usuario

Para ver si tienes algun error en la consulta, usa la función mysql_error.
Código PHP:
Ver original
  1. mysql_query("aqui va tu consulta") or die(mysql_error());
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #3 (permalink)  
Antiguo 01/02/2010, 11:57
Avatar de aniMAYtions  
Fecha de Ingreso: diciembre-2007
Ubicación: Granada
Mensajes: 519
Antigüedad: 16 años, 4 meses
Puntos: 2
Respuesta: un problema con sesiones de usuario

Gracias por contestar abimaelrc.

Pero no preguntaba por mi error en la consulta, sino en la forma de conservar la sesión.
La consulta está correcta, además como ia he dicho la primera vez que me logueo correctamente me activa el menú. Lo que ocurre es que cuando accedo a los menús me pierde el valor 1 de la variable de sesión.
  #4 (permalink)  
Antiguo 01/02/2010, 12:00
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 10 meses
Puntos: 1517
Respuesta: un problema con sesiones de usuario

Puedes usar otro if para ver si esta activa la sesión, por ejemplo
Código PHP:
Ver original
  1. function login($usu, $pss)
  2. {
  3.     if(!isset($_SESSION["identificado"]) || $_SESSION["identificado"] != 1){
  4.         $conexion = conectar();
  5.         $consulta = "Select * From usuarios where nombre = '$usu' and password = '$pss' ";
  6.         $resultado = mysql_query($consulta, $conexion);
  7.         $filas = mysql_num_rows($resultado);
  8.         if($filas > 0)
  9.         {
  10.             $_SESSION['usuario'] = $usu;
  11.             $_SESSION['identificado'] = '1';
  12.         }
  13.         else
  14.         {
  15.             $_SESSION['identificado'] = '0';
  16.         }
  17.     }
  18. }
Me imagino que haces esa consulta en todas las paginas y cada vez estas verificando el usuario. Considero que esta no es la mejor forma, sino más bien crearlo en alguna pagina y ya las sesiones van a estar disponibles en todas las paginas.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #5 (permalink)  
Antiguo 02/02/2010, 02:22
Avatar de aniMAYtions  
Fecha de Ingreso: diciembre-2007
Ubicación: Granada
Mensajes: 519
Antigüedad: 16 años, 4 meses
Puntos: 2
Respuesta: un problema con sesiones de usuario

Cita:
Iniciado por abimaelrc Ver Mensaje
Me imagino que haces esa consulta en todas las paginas y cada vez estas verificando el usuario. Considero que esta no es la mejor forma, sino más bien crearlo en alguna pagina y ya las sesiones van a estar disponibles en todas las paginas.
No, y la cuestión está en hacer esta consulta cada vez que no haia sesión. Quiero decir, si el usuario supera el tiempo de respuesta máximo y pierde la sesión e intenta acceder a cualquier apartado de la página le debería saltar el formulario de petición de logueo.

Veamos, el trancurso normal de la aplicación que quiero hacer es el siguiente:

1. Un usuario x accede a la intranet y lo primero que ve es el menú cabecera y el formulario de logueo. Si no se ha logueado el menú no hace nada.Si se loguea el menú se activa y aparece en otra página(lo de que aparezca en otra página aún no lo he hecho, pero lo demás sí y funciona).
2. Al haberse logueado correctamente el usuario y mientras no supere el tiempo máximo de espera para la sesión activa(o sea, que no pierda la sesión al no hacer nada en la web durante 5 minutos seguidos, por ejemplo), este usuario tiene acceso total a todos los contenidos y funcionalidades de la intranet.
3. Pero en cada paso que se de, o sea, a cada menú que acceda o cada opción que elija debe comprobar que la sesión está activa sin tener que estar pasando variables por get ni por url ni nada por el estilo.

En principio, como ia expliqué anteriormente, inicio la sesión cuando el usuario se loguea y recojo 2 variables si el logueo es correcto para que, una de eias, me sirva como comprobación($_SESSION['identificado']).
Y todo correcto para la primera vez que accedo a un menú. Pero cuando estoy en ese menú me pierde el valor de la variable de sesión y ia no me deja acceder a ningún otro menú más.

Ahora, dónde está la gracia de las variables de sesión si hay que comprobar el logueo cada vez que se quiera acceder a algo, suponiendo que ia se comprobó en su momento y todo es correcto??

Gracias de nuevo!!
  #6 (permalink)  
Antiguo 02/02/2010, 03:17
Avatar de morior  
Fecha de Ingreso: agosto-2009
Ubicación: Barcelona
Mensajes: 437
Antigüedad: 14 años, 8 meses
Puntos: 12
Respuesta: un problema con sesiones de usuario

Puedes hacer un header location. Recuerda que no debe haber nada de código html antes de header.

Algo al estilo.

Código PHP:
if ($_SESSION['id'] == 0){

header ("Location: volver_login.php");
}else{

ejecuta el programa...

  #7 (permalink)  
Antiguo 02/02/2010, 03:57
Avatar de aniMAYtions  
Fecha de Ingreso: diciembre-2007
Ubicación: Granada
Mensajes: 519
Antigüedad: 16 años, 4 meses
Puntos: 2
Respuesta: un problema con sesiones de usuario

Gracias morior, pero a ver si me aclaro.
Contando con que tengo una página index.php donde se carga todo el contenido proveniente de las funciones a las que iamo, situadas en la página funciones.php.

Código:
if($_SESSION['identificado'] == '1')
{
   if($action == 'muestraloquesea')
   {
      $action();
   }
   else if($action == 'muestraotracosa')
   {
      $action($parametro);
   }
   else
   {
      muestraPaginaInicial();
   }
}
else
{
   muestraLoguin();
}
Eso lo pongo en el index y $action toma valor desde los enlaces de lo menús en los que pincho.

Ya dije que lo primero que pido es el logueo, para poder acceder a los actions de los menús y recojo el valor de $_SESSION['identificado'] en la función de logueo. Se supone que esta sesión me la debería guardar una vez haia tomado el valor, pero no puedo hacer lo que tú me dices pues sólo me guarda dicho valor para la primera acción que realizo y, al realizar una segunda acción me volvería a pedir que me identificase, eso es lo que quiero evitar.
O sea, identificarse una vez, al inicio, y no volver a hacerlo hasta que, o bien haian pasado 5 minutos sin que el usuario haga nada, o bien se cierre y se vuelva a iniciar sesión. Pero que en todo momento se pueda comprobar que el usuario se logueó correctamente y la variable $_SESSION['identificado'] tenga el valor 1, si no es así no se realiza nada.

Un saludo!!
  #8 (permalink)  
Antiguo 02/02/2010, 04:08
Avatar de morior  
Fecha de Ingreso: agosto-2009
Ubicación: Barcelona
Mensajes: 437
Antigüedad: 14 años, 8 meses
Puntos: 12
Respuesta: un problema con sesiones de usuario

Un simple comentario (al igual me equivoco). En la cabecera de la página, antes de todo, lo primero que hay en el código PHP pones:

Código PHP:
<?php
session_start
();
?>
Lo digo porque ésa es la única forma de mantener la variable de sesión activa.
  #9 (permalink)  
Antiguo 02/02/2010, 11:47
Avatar de aniMAYtions  
Fecha de Ingreso: diciembre-2007
Ubicación: Granada
Mensajes: 519
Antigüedad: 16 años, 4 meses
Puntos: 2
Respuesta: un problema con sesiones de usuario

En el index.php tengo puesto lo siguienta al inicio de la página

Código:
<?php
include('funciones.php');
$page=$_REQUEST['paginacion'];
 ?>
<?php
if(isset($enviar_logueo))
{
$username = $_POST['username'];
$password = $_POST['password'];
$login = login($username, $password);
if($login)
{
	session_start();
}
}
?>
Serí corresco o eso es lo que esta faiando?
  #10 (permalink)  
Antiguo 02/02/2010, 11:59
Avatar de rfadgrmm  
Fecha de Ingreso: junio-2009
Mensajes: 74
Antigüedad: 14 años, 10 meses
Puntos: 1
Respuesta: un problema con sesiones de usuario

Hola aniMAYtions,

session_start() lo debes declarar al principio de la página, en la primera línea de código, no debe tener código HTML en medio, ni espacios que se impriman antes en la página, de lo contrario tendrás errores de encabezados enviados al cliente. La funcion debe estar en todas las páginas donde quieres conservar las sesiones. Y lo declaras en variables $_SESSION para luego volver a llamarlas en el momento que desees...

Saludos...
  #11 (permalink)  
Antiguo 02/02/2010, 13:06
Avatar de morior  
Fecha de Ingreso: agosto-2009
Ubicación: Barcelona
Mensajes: 437
Antigüedad: 14 años, 8 meses
Puntos: 12
Respuesta: un problema con sesiones de usuario

Si ya es lo que he comentado yo, vuelve a revisar el comentario que te he dejado, porque viendo tu código el programa no puede almacenar la variable de sesion. Necesitas ponerlo como lo ha comentado el compañero en el mensaje de aquí arriba

Código PHP:
<?php 
session_start
(); // <--- esto al principio siempre de todos tus scripts

include('funciones.php');
$page=$_REQUEST['paginacion'];

if(isset(
$enviar_logueo))
{
$username $_POST['username'];
$password $_POST['password'];
$login login($username$password);
if(
$login)
{
    
}
}
?>
  #12 (permalink)  
Antiguo 02/02/2010, 15:00
Avatar de aniMAYtions  
Fecha de Ingreso: diciembre-2007
Ubicación: Granada
Mensajes: 519
Antigüedad: 16 años, 4 meses
Puntos: 2
Respuesta: un problema con sesiones de usuario

Y lo debería poner también en mi página de funciones?? no verdad?
Mañana os cuento si va, que hoy se me ha hecho tarde :)
Gracias amig@s!!
  #13 (permalink)  
Antiguo 02/02/2010, 15:11
Avatar de morior  
Fecha de Ingreso: agosto-2009
Ubicación: Barcelona
Mensajes: 437
Antigüedad: 14 años, 8 meses
Puntos: 12
Respuesta: un problema con sesiones de usuario

No en la página de las funciones no, simplemente en todas las páginas donde vayas a usar sesiones y necesites su valor tendrás que empezar el código php con eso.

Por ejemplo si tienes:

script1.php
script2.php
script3.php <-- pero en éste no necesitas las sesiones

Pues lo tendrás que poner sólo en los dos primeros. Espero haberme hecho entender :)
  #14 (permalink)  
Antiguo 03/02/2010, 01:21
Avatar de aniMAYtions  
Fecha de Ingreso: diciembre-2007
Ubicación: Granada
Mensajes: 519
Antigüedad: 16 años, 4 meses
Puntos: 2
Respuesta: un problema con sesiones de usuario

Sí morior, te has hecho entender y funciona.
Por suerte o desgracia sólo utilizo una página donde se carga todo el contenido proveniente de las funciones, así que sólo necesitaré usarlo en el index.

Gracias de nuevo!!

P.D: Ahora mi pregunta es, cómo puedo hacer que expire la sesión al pasar 5 minutos de inactividad?? :)
  #15 (permalink)  
Antiguo 03/02/2010, 04:29
Avatar de morior  
Fecha de Ingreso: agosto-2009
Ubicación: Barcelona
Mensajes: 437
Antigüedad: 14 años, 8 meses
Puntos: 12
Respuesta: un problema con sesiones de usuario

Opps pues eso no lo sé, creo que el tema de las sesiones es una relación muy estrecha entre el navegador del usuario y el servidor. Diría que eso es configurable pero desde el servidor en el archivo config o PHP.Ini

revísalo a ver que tal.
  #16 (permalink)  
Antiguo 03/02/2010, 09:57
Avatar de rfadgrmm  
Fecha de Ingreso: junio-2009
Mensajes: 74
Antigüedad: 14 años, 10 meses
Puntos: 1
Información Respuesta: un problema con sesiones de usuario

En realidad el tiempo de inactividad se especifica en el php.ini, por lo que te recomiendo mejor crear una rutina en PHP con esta lógica:

Primero captura la hora actual cada vez que navegues y/o cargues una página determinada y con la función strtotime le agregas el tiempo deseado (ej. +5 minutos) siendo ahora el tiempo limite, puede ser en horas, minutos y/o segundos. (Si vas a trabajar con sesiones, la almacenas en una variable del tipo $_SESSION)

http://www.php.net/strtotime

Segundo, cuando accedas a otra página, recupera el tiempo límite que estaría en la variable del tipo $_SESSION y lo comparas con la nueva hora capturada del sistema (obviamente producto de la carga de la nueva página), si el de la variable $_SESSION es mayor a la nueva hora capturada, continúa en la sesión, caso contrario, expiró su sesión. Puedes usar también la función session_destroy.

http://www.php.net/session_destroy

No tengo un ejemplo a la mano, pero espero haberte orientado en algo sobre tiempos de inactividad en sesiones.

Saludos...
__________________
"Viajando en el espacio profundo, de nova en nova, y sorteando a veces uno que otro agujero negro..." Peru@D

Última edición por rfadgrmm; 03/02/2010 a las 10:13

Etiquetas: sesiones, usuarios
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:59.