Foros del Web » Programando para Internet » PHP »

Problema con las sessiones

Estas en el tema de Problema con las sessiones en el foro de PHP en Foros del Web. Hola buenas: Pues estamos intentando controlar el logeo a traves de la funcion $_SESSION.Es decir, queremos conseguir k cuando una persona se logea en nuestra ...
  #1 (permalink)  
Antiguo 07/12/2006, 06:14
 
Fecha de Ingreso: septiembre-2006
Mensajes: 84
Antigüedad: 17 años, 7 meses
Puntos: 0
Problema con las sessiones

Hola buenas:
Pues estamos intentando controlar el logeo a traves de la funcion $_SESSION.Es decir, queremos conseguir k cuando una persona se logea en nuestra web, no tenga k volver a hacerlo hasta que cierre la sesion.
Para ello hemos puesto el siguiente codigo en un include llamado: logeatu.php:

Código:
 if($_GET["logeatu"]=="bai")
			{
				//comenzar sesion
				session_start();
				
				session_register('erabiltzailea');
				session_register('pasahitza');
				session_register('mota');
				session_register('id');

				//erabiltzaile eta pasahitza sessio batean gordeko ditugu.
				$_SESSION['erabiltzailea']=$_GET["login_erabiltzaile"];
				$_SESSION['pasahitza']=$_GET["login_pasahitza"];

				//setencia sql
				$_sql_setentzia="SELECT * FROM login WHERE login.erabiltzailea='".$_SESSION['erabiltzailea']."' AND login.pasahitza='".$_SESSION['pasahitza']."'";
				
				$datuak = mysql_query($_sql_setentzia ,$con);
				$datuak_emaitza=mysql_fetch_array($datuak);
								
				if (!$datuak_emaitza['0'])
				{
					mensaje_error();
					$_SESSION['kontrola']="ez";
				}
				else
				{					
					$_SESSION['kontrola']="bai";
					$_SESSION['mota']=$datuak_emaitza['taldea'];
					$_SESSION['id']=$datuak_emaitza['0'];
					echo "Kaixo,<span class='beltzatu'> ".$datuak_emaitza['erabiltzailea']." !</span> ";
					echo "<img src='images/ikonoak/nere_datuak.gif' align='absmiddle' alt='Nire datuak' /> <a href='#'>Nire datuak</a> ";
					echo "<img src='images/ikonoak/irten.gif' align='absmiddle' alt='Irten' /> <a href='".$_SERVER['PHP_SELF']."?deskonektatu=bai'>Irten</a>";
					//echo "<meta http-equiv=Refresh content=0;url=../admin/index.php>";
				}
			}	
			else
			{
				if(!$_SESSION['kontrola']=="" || $_SESSION['kontrola']=="ez")
				{
					formulario();
				}
					
			 }
Las funciones a las k llamamos son las siguientes:

Código:
<? 
	function errore_mezua() 
	{
     echo "<div id='M_login_errore'>Zure erabiltzaile izena edo pasahitza ez da zuzena. <a href='javascript:history.go(-1)'>Berriro saiatu </a></div>";
    }
	function formularioa()
	{?>
	  <form id="form1" name="form1" method="get" action="<? echo $_SERVER['PHP_SELF']; ?>" >
	  <label for="login_erabiltzaile">Erabiltzailea:</label>
	  <input name="login_erabiltzaile" type="text" id="login_erabiltzaile" accesskey="e" tabindex="1" size="15" />
	  <label for="login_pasahitza">Pasahitza:</label>
	  <input name="login_pasahitza" type="password" id="login_pasahitza" accesskey="p" tabindex="2" size="15" />
	  <label for="Submit"></label>
	  <input type="hidden" value="bai" name="logeatu" />
	  <input type="submit" name="Submit" value="Enviar" accesskey="b" tabindex="3" id="Submit" />
	  </form>
	<? }
Eso seria lo que tenemos en nuestro include.
Ahora la cosa es k en todas las otras paginas (todas las k contiene nuestra web), en el lugar donde nos logeamos hemos puesto lo siguiente:
Código:
			<? session_start();
			if ($_SESSION['kontrola']=="bai")
			{
			echo "logeados estamos";
			}
			else
			{
			include("includeak/logeatu.php");
			}?>
Y la cosa es que nos aparece el dichoso "logeados estamos", y no sabemos cual puede ser el problema.Kizas tengais dudas a la hora de interpretar el problema, pero si algo no entendeis, m perguntais y os respondo y haber si de este modo solucionamos el problema.
SALU2 y gracias de antemano.
  #2 (permalink)  
Antiguo 11/12/2006, 02:32
 
Fecha de Ingreso: septiembre-2006
Mensajes: 84
Antigüedad: 17 años, 7 meses
Puntos: 0
Re: Problema con las sessiones

Nadie m puede ayudar con el problema? Venga espero alguna respuesta.
Gracias de antemano.SALU2
  #3 (permalink)  
Antiguo 11/12/2006, 17:31
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Re: Problema con las sessiones

El uso de session_register() es incompatible y no recomendado si ya usas los arrays superglobales: $_SESSION.

Es decir .. tus:
session_register('erabiltzailea');
session_register('pasahitza');
session_register('mota');
session_register('id');

NO corresponde! .. usa $_SESSION['tusvariables'] = "tus valores";

Más info:
www.php.net/session

Optimiza tu código al uso de $_SESSION sólo y luego realiza tus pruebas. Debemos partir de un "código limpio" para seguir viendo más problemas como por ejemplos sobre la propagación del SID de la cual no mencionas nada .. ni en tu código ni de como pretendes propagarlo (se "asume" así tal cual tu código presentas que lo haras en cookies o bien que PHP lo incrustrará en tus links y formularios usados .. esto no se debe "asumir"; se debe conocer como PHP en tu caso particular está actuando para ir descartando otro tipo de problemas). Una vez asegurado el correcto funcionamiento de tus sesiones a nivel "básico": crear una sesión en un script y leerla en otro previa redirección bajo la misma sesión por un llink/formulario .. u otro tipo de redirección, ahí se podrá ver otros detalles sobre la lógica del código que presentas.

Recuerda como "observación" que el valor real de una sessión queda disponible en la "próxima" llamada a tu script, una recarga del mismo, .. una redirección a otro .. etc. Ojo con eso.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #4 (permalink)  
Antiguo 12/12/2006, 03:51
 
Fecha de Ingreso: septiembre-2006
Mensajes: 84
Antigüedad: 17 años, 7 meses
Puntos: 0
Re: Problema con las sessiones

Muchas gracias por la respuesta en primer lugar...Explico un poco el asunto;
La cosa es k kiero conseguir k cuando un usuario se logee en el login, al ir a otras paginas de la web, no se tenga k volver a logear.
Para ello, hemos puesto el sigueinte codigo:

Código:
 if($_GET["logeado"]=="si") // valor k nos devuelve al hacer login en nuestro formulario.
			{
				//usuario y la contraseña las guardaremos en sus correspondientes sesiones.
				$_SESSION['usuario']=$_GET["login_usuario"];
				$_SESSION['contrasena']=$_GET["login_contrasena"];

				//setencia sql, de este modo si encuentra en la base de datos, datos k coincidan nos logearemos, cosa k logramos correctamente. 
				$setencia_sql="SELECT * FROM login WHERE login.usuario='".$_SESSION['usuario']."' AND login.contrasena='".$_SESSION['contrasena']."'";
				
				$datos= mysql_query($setencia_sql ,$con);
				$resultado_datos=mysql_fetch_array($datos);
								
				if (!$resultado_datos['0'])
				{
					mensaje_error(); // llamamos a una funcion para k aparezca el mensaje de error o k no se han encontrado usuarios con ese nombre de usuario o contraseña.
					$_SESSION['control']="no";//de este modo guaradremos en la session['control'] el valor no.
				}
				else
				{	//sino kiere decir k se ha encontrado un usuario en la base de datos.De este modo a session['control']le damos el valor si.			
					$_SESSION['control']="si";
					echo "estas logeado";
				}
			}	
			else
			{
				if(!$_SESSION['control']=="" || !$_SESSION['control']=="no")
				{
					formularioa();//llamamos al formulario para logeranos
				}
			 }
Esto seria el codigo el cual controlaria si nuestro usuario ha sido logeado o no, y si ha sido logeado correctamente, lo k hacemos es guardar en la session['control']="bai" y si no es correcto el valor session['control']="no", y otros valores k no son importantes. Entonces, despues lo k hemos hecho ha sido, poner en el lugar donde va el logeo el siguiente codigo:

Código:
<? 			if ($_SESSION['control']=="si")
			{
			echo "logeados estamos";
			}
			else
			{
			include("includeak/logeatu.php");
			}?>
La cosa es cuando nos logeamos si k encuentra en la base de datos, y nos dice k estamos logeados, pero despues si volvemos a esa misma web sin cerrar la sesion del navegador, no nos indica k estamos logeados, sino nos aparece el formulario para logearnos, con lo cual pensamos k en la pagina no llega el valor $_SESSION['control']="si" y no sabemos por k...
Haber si con esta explicacion se entiende mejor, por k en la anterior lo tenia mezclado con el Euskera...
Espero haberme explicado mejor esta vez...
Hbaer si lo coneguimos...
SALU2
  #5 (permalink)  
Antiguo 12/12/2006, 17:35
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Re: Problema con las sessiones

Según la filosofía de las sesiones, que pertenecen al usuario que las crea (mejor dicho al "cliente" que las crea) ..

No es necesario que en una variable de sesión propagues un dato como la "contraseña". Tampoco es -nada- recomendable pasar en una variable de sesión los datos que por "GET" te mandan .. las variables de sesión con sus valores adecuados debes "registrarlos" ($_SESSION['variable'] = "valor") en el momento que pase tu proceso de validación (en tu caso tu validación contra tu BBDD donde autentificas que los datos: usuario/contraseña son correctos para el usuario dado).

Por lo mismo .. tener una variable de sesión que almacene un dato como:
$_SESSION['usuario']

Y luego andar gestionando otra variable que indique si está autentificado o no:
$_SESSION['control']

No tiene sentido .. me explico, .. usa la variable que ya defines (y que debes definir si pasa tu proceso de autentificación contra tu BBDD en esa consulta SQL que haces) con el nombre del usuario en ese caso y usala simplemente: si existe, .. pasó tu autentificación .. si no existe .. no la pasó (o está accediendo directo a tus scripts sin pasar por tu validación ..) así de simple, una variable menos por el camino (a mi juicio sin valor .. ).

Todo esto lo comento aplicando la filosofía base de que consiste una sesión.

En resumen .. es tan simple como:

Tu script con el formulario de login.php de este mandas su "action" a tu autentifica.php que es donde vamos a validar a tu usuario:

autentifica.php
Código PHP:
<?php
session_start
();
// tu consulta a tu BBDD
// Uso los datos de $_GET directos ..  
// Uso mysql_real_escape_string() para evitar algo el fenómeno de "SQL Injection". (más info en google.com)

$setencia_sql="SELECT * FROM login WHERE login.usuario='".mysql_real_escape_string($_GET['login_usuario'])."' AND login.contrasena='".mysql_real_escape_string($_GET['login_usuario'])."'";

// Ejecuto la sentencia SQl .. la llamo "$resultado" .. realmente es lo que es.
$resultadomysql_query($setencia_sql) or die (mysql_error());

// Cuento el n° de resultados .. espero 1 o 0 .. pues no tengo más usuarios repetidos en mi BBDD (por lo menos con un mismo usuario/contraseña como par)
if (mysql_num_rows($resultado) == 1){
   
// Si hay resultados .. entonces accedo a ellos .. 
   // Aunque esto te parezca redundante asi "normalizas" .. pues no tomas directo lo que por $_GET te entre sino lo que realmente en tus BBDD registras.
   
$datos=mysql_fetch_array($resultado);
   
// Y vamos creando las variables de sesión ...
   
$_SESSION['usuario']=$datos['usuario'];
   
// si necesitas más datos del usuario .. (como el "ID" por ejemplo .. que es muy útil para ir relacionandolo en otros procesos que hagas) .. usa la misma técnica para definir más variables de sesión. 

  // y redireccionas hacia tu script subsiguiente
 
header ("Location: pagina_autentificada.php");
 
// y terminamos la ejecución de este script .. aquí no hay nada más que hacer!. 
 
exit;
  
// Así te aseguras que tus variables de sesión queden registradas, pues las variables de sesión no quedan registradas hasta la próxima iteracción con el servidor.

} else {
  
// tus rutinas de control del error en el "login" .. usuairo/contraseña no existen
 // Lo normal es redireccionar hacia tu script de "login.php":
 
header ("Location: login.php");
 exit;
}
pagina_autentificada.php
Código PHP:
<?php
session_start
();
if (empty(
$_SESSION['usuario'])){
   
header ("Location: login.php");
  exit;
}

// resto de tu script.
// ejemplo:

echo "Hola, ".$_SESSION['usuario'];
?>

Perfectamente puedes contener este pequeño código de validación de tu variable de sesión en un script aparte que llames en todos tus scripts que requieran autentificación bajo un "include("validar.php")" o algo así.

Ahora ... si este procedimiento no te "funciona" en el aspecto de que sigues sin ver el valor de tus variables de sesión .. ahí hay que revisar como PHP (tu configuración) propaga el SID. (con los "header()" de tipo "location" que hago "asumo" que se propaga el SID en cookies y que tu navegador las acepta).

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #6 (permalink)  
Antiguo 13/12/2006, 05:23
 
Fecha de Ingreso: septiembre-2006
Mensajes: 84
Antigüedad: 17 años, 7 meses
Puntos: 0
Re: Problema con las sessiones

Muchisimas gracias por la ayuda, pero la cosa es k no sabemos por k motivo el sistema k hemos hecho nosotros no funciona, y la manera mas correcta para hacerlo pensamos k es la opcion k hemos optado. La cosa es que con tu codigo o el nuestro nos aparecen los siguiente errores:

Notice: Undefined variable: _SESSION in c:\archivos de programa\easyphp1-8\www\bozi\index.php on line 15

Warning: session_start(): Cannot send session cookie - headers already sent by (output started at c:\archivos de programa\easyphp1-8\www\bozi\index.php:7) in c:\archivos de programa\easyphp1-8\www\bozi\includeak\logeatu.php on line 1

Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at c:\archivos de programa\easyphp1-8\www\bozi\index.php:7) in c:\archivos de programa\easyphp1-8\www\bozi\includeak\logeatu.php on line 1

Hbaer si con estos warning nos hechais una mano y solucionamos el asunto.
SALU2 Y GRACIAS DE ANTEMANO.
  #7 (permalink)  
Antiguo 13/12/2006, 18:57
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Re: Problema con las sessiones

Cita:
Iniciado por josusaar Ver Mensaje
Muchisimas gracias por la ayuda, pero la cosa es k no sabemos por k motivo el sistema k hemos hecho nosotros no funciona, y la manera mas correcta para hacerlo pensamos k es la opcion k hemos optado. La cosa es que con tu codigo o el nuestro nos aparecen los siguiente errores:

Notice: Undefined variable: _SESSION in c:\archivos de programa\easyphp1-8\www\bozi\index.php on line 15

Warning: session_start(): Cannot send session cookie - headers already sent by (output started at c:\archivos de programa\easyphp1-8\www\bozi\index.php:7) in c:\archivos de programa\easyphp1-8\www\bozi\includeak\logeatu.php on line 1

Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at c:\archivos de programa\easyphp1-8\www\bozi\index.php:7) in c:\archivos de programa\easyphp1-8\www\bozi\includeak\logeatu.php on line 1

Hbaer si con estos warning nos hechais una mano y solucionamos el asunto.
SALU2 Y GRACIAS DE ANTEMANO.
Primero deberías centrar el problema sobre el código que usas concreto.

Sobre todo por qué ahí se hace mención de líneas de cierto código que habrá que revisar.

Por otro lado .. si la secuencia de mensajes de error es la que muestras .. el mensaje iniciar del error el "Notice" ocasiona por la salida del mensaje (el "texto" en sí) el resto de mensajes de error sobre cabeceras y demás .. es decir, centrate en resolver el primero y teóricamente no veras el resto.

Ahora .. que versión de PHP usas?

Dice que $_SESSION no existe .. eso es un array superglobal que nació en PHP versión 4.1.0 (si no me equivoco). Si usas una versión inferior a esta de PHP más te vale actualizarla (no sé si será tu caso .. pero todo hay que evaluarlo y preguntarlo).

Y por lo demás tiene que existir un "session_start()" siempre -antes- de pretender acceder a $_SESSION (por lo menos en mis ejemplos textuales así lo incluyo, en tu código expuesto de ejemplo fuera de "contexto" no se observa el "session_start()").

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #8 (permalink)  
Antiguo 14/12/2006, 02:46
 
Fecha de Ingreso: septiembre-2006
Mensajes: 84
Antigüedad: 17 años, 7 meses
Puntos: 0
Re: Problema con las sessiones

Pues nada la cosa era k el <? session_start(); ?> no lo poniamos al principio del todo, y entonces daba los errores dichos anteriormente. Con lo cual despues de esto, el problema lo hemos solucionado, de todos modos muchas gracias por la ayuda.
SALU2
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:00.