Foros del Web » Programando para Internet » PHP »

Sesiones en PHP

Estas en el tema de Sesiones en PHP en el foro de PHP en Foros del Web. Hola, gente. Qué tal. Hace rato vengo lidiando con un problema en un código que hice para iniciar sesión en un sistema. El problema es ...
  #1 (permalink)  
Antiguo 17/05/2010, 12:08
 
Fecha de Ingreso: mayo-2010
Mensajes: 6
Antigüedad: 14 años, 6 meses
Puntos: 0
Sesiones en PHP

Hola, gente. Qué tal.

Hace rato vengo lidiando con un problema en un código que hice para iniciar sesión en un sistema. El problema es que me reconoce los datos la segunda vez que envío los datos del formulario, o sea, debo ingresar dos veces los datos para iniciar sesión.

No sé si tiene que ver con la posición de 'session_start()' dentro del código o qué rayos.

Les muestro el código PHP.

<?php
session_start();

include ("conexion.php");
$conexion=mysql_connect ($host_db, $usuario_db, $pass_db);
mysql_select_db("comunicacion",$conexion) OR die ("Oh my gosh! Hay Problemas con La Base de Datos.");

if ($_GET[cargar]==1)
{
$sql= "SELECT * FROM usuario WHERE email_usu = '$email_usu' AND contrasena_usu = '$contrasena_usu'";
$resultado= mysql_query($sql, $conexion);
if (mysql_num_rows ($resultado) != 0)
{
$fila = mysql_fetch_array ($resultado);
$_SESSION["session_able"] = 1;
$_SESSION["session_id"] = $fila [0];
$_SESSION["session_nombre"] = $fila [1];
$_SESSION["session_apellido"] = $fila [2];
$_SESSION["session_grupo"] = $fila [5];
$_SESSION["session_puesto"] = $fila [6];
$sql_puesto = "SELECT * FROM puesto WHERE id_pue = ".$fila [6];
$resultado_puesto = mysql_query ($sql_puesto,$conexion);
$_SESSION["session_departamento"] = mysql_result($resultado_puesto,0,3);
switch($session_grupo) //Dependiendo del grupo al que pertenece el usuario lo redirecciono a un archivo diferente
{
case 1: header ('Location: ver_noticia.php'); break;
case 2: header ('Location: ver_noticia_emisor.php'); break;
case 3: header ('Location: ver_noticia_receptor.php'); break;
}
}
}
?>


Este es el formulario:

<form id="form1" name="form1" method="post" action="index.php?cargar=1" class="form_index">
Direcci&oacute;n de e-mail <br />
<input name="email_usu" type="text" class="campo" id="email_usu" size="25" maxlength="80" />

Contrase&ntilde;a<br />
<input name="contrasena_usu" type="password" class="campo" id="contrasena_usu" size="25" maxlength="80" />

<input name="cargar" type="submit" class="boton" id="cargar" value="Ingresar" />
</form>




Espero que puedan ayudarme, saludos!!
  #2 (permalink)  
Antiguo 17/05/2010, 12:13
Avatar de dcreate  
Fecha de Ingreso: octubre-2009
Ubicación: Veracruz
Mensajes: 536
Antigüedad: 15 años, 1 mes
Puntos: 22
Respuesta: Sesiones en PHP

mira aki espero esto te resulva algunas dudas, deje un aporte si te sirve
  #3 (permalink)  
Antiguo 17/05/2010, 12:48
Avatar de wiwi74  
Fecha de Ingreso: marzo-2008
Mensajes: 515
Antigüedad: 16 años, 8 meses
Puntos: 10
Respuesta: Sesiones en PHP

A ver si esto te ayuda algo:




<?php
session_start();

include ("conexion.php");
$conexion=mysql_connect ($host_db, $usuario_db, $pass_db);
mysql_select_db("comunicacion",$conexion) OR die ("Oh my gosh! Hay Problemas con La Base de Datos.");

if ($_GET[cargar]==1)
{
$sql= "SELECT * FROM usuario WHERE email_usu='".$email_usu."' AND contrasena_usu='".$contrasena_usu."';";

$resultado= mysql_query($sql, $conexion);

if (mysql_num_rows($resultado) != 0)
{
$fila = mysql_fetch_array ($resultado);

//en realidad lo que recuperarias de la tabla es el campo (columna) no la fila ($fila)
//y mysql_fetch_array convierte el resultado en un array asociativo
//cuyos indices son nombres no numeros $fila[0] (ahora si tu campo se llama 0 bueno: $fila["0"] pero no creo)
//Ejemplo: en $_SESSION["session_nombre"] guardas $file["nombre_del campo_que_esta_el_nombre"]

$_SESSION["session_able"] = 1;
$_SESSION["session_id"] = $fila[0];
$_SESSION["session_nombre"] = $fila[1];
$_SESSION["session_apellido"] = $fila[2];
$_SESSION["session_grupo"] = $fila[5];
$_SESSION["session_puesto"] = $fila[6];


$sql_puesto = "SELECT * FROM puesto WHERE id_pue=".$fila[6];

$resultado_puesto = mysql_query ($sql_puesto,$conexion);

$_SESSION["session_departamento"] = mysql_result($resultado_puesto,0,3);

//En que lugar le das valor a esta variable $session_grupo
//seria asi...?: $session_grupo = $_SESSION["session_grupo"]
//o asi: switch($_SESSION["session_grupo"])

switch($session_grupo) //Dependiendo del grupo al que pertenece el usuario lo redirecciono a un archivo diferente
{
case 1: header ('Location: ver_noticia.php'); break;
case 2: header ('Location: ver_noticia_emisor.php'); break;
case 3: header ('Location: ver_noticia_receptor.php'); break;
}
}
}
?>

Este es el formulario:

<form id="form1" name="form1" method="post" action="index.php?cargar=1" class="form_index">
Direcci&oacute;n de e-mail <br />
<input name="email_usu" type="text" class="campo" id="email_usu" size="25" maxlength="80" />

Contrase&ntilde;a<br />
<input name="contrasena_usu" type="password" class="campo" id="contrasena_usu" size="25" maxlength="80" />

<input name="cargar" type="submit" class="boton" id="cargar" value="Ingresar" />
</form>




Por ahora te lo dejo asi... me tengo que ir...

Saludos...!
  #4 (permalink)  
Antiguo 17/05/2010, 21:24
 
Fecha de Ingreso: mayo-2010
Mensajes: 6
Antigüedad: 14 años, 6 meses
Puntos: 0
Respuesta: Sesiones en PHP

Gracias, muchach@s.

Wiwi74: Mi problema, no reside en cómo se guardan los datos, aunque tu método es más económico.

Sé que no es ese el problema porque cuando trato de iniciar sesión por segunda vez (con los mismos datos de usuario, obviamente) todo funciona de maravilla. El problema es que TENGO QUE INICIAR SESION DOS VECES :P

MUCHAS GRACIAS!!!

Última edición por terceracolina; 17/05/2010 a las 21:32
  #5 (permalink)  
Antiguo 17/05/2010, 22:50
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 16 años, 3 meses
Puntos: 2237
Respuesta: Sesiones en PHP

terceracolina leiste la sugerencia de wiwi74?

Cita:
Iniciado por wiw74
//En que lugar le das valor a esta variable $session_grupo
//seria asi...?:
// $session_grupo = $_SESSION["session_grupo"];
//o asi:
// switch($_SESSION["session_grupo"])
__________________
- León, Guanajuato
- GV-Foto
  #6 (permalink)  
Antiguo 17/05/2010, 23:27
 
Fecha de Ingreso: mayo-2010
Mensajes: 6
Antigüedad: 14 años, 6 meses
Puntos: 0
Respuesta: Sesiones en PHP

Si, Triby, la leí.

mysql_fetch_array() toma los resultados de la consulta y crea un array con ellos. Cuando escribo $fila[0], me estoy refiriendo al primer campo del registro que adquiero como resultado, que en mi caso podría escribirse $fila["id_usu"].

Esta es la estructura de mi tabla usuario:

create table usuario(
id_usu int NOT NULL auto_increment, // $fila[0];
nombre_usu char(80) NOT NULL, // $fila[1]; . . .
apellido_usu char(80) NOT NULL,
contrasena_usu char(80) NOT NULL,
email_usu char(80) NOT NULL,
grupo_usu int NOT NULL,
puesto_usu int NOT NULL,
fecha_creacion_usu date NOT NULL,
baja_usu int NOT NULL,
primary key (id_usu));

En cuanto a $session_grupo :

$_SESSION["session_grupo"] = $fila[5] //aquí asigno a la variable de sesión el contenido del campo grupo_usu.

y si, $session_grupo = $_SESSION["session_grupo"].

Con switch($session_grupo), determino a qué página debomandar al usuario dependiendo de a qué grupo pertenece.

Probé mostrar los valores del mysql_fetch_array y funciona bien esa parte. El problema es con las variables de session, ya que toman los valores la segunda vez que los envío. Sigo tratando de resolver esto.

Muchas gracias!!
  #7 (permalink)  
Antiguo 18/05/2010, 04:18
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 16 años, 3 meses
Puntos: 2237
Respuesta: Sesiones en PHP

Disculpame, pero en tu codigo no aparece por ningun lado $session_grupo = $_SESSION["session_grupo"]; y te sugiero algunos cambios:

Todos los indices de matriz (array) que sean alfanumericos (no variable, no constante, no numerico) deben estar encerrados entre comillas, dobles o sencillas, te recomiendo sencillas.

Código PHP:
Ver original
  1. // De donde obtienes $email_usu y $contrasena_usu ???
  2. // Haz esto:
  3. $email_usu = $_POST['email_usu'];
  4. $contrasena_usu = $_POST['contrasena_usu'];
  5.  
  6. // Antes de usar los datos recibidos en la consulta es necesario escaparlos por cuestiones de seguridad:
  7. $email_usu = mysql_real_escape_string($email_usu);
  8. // Haces lo mismo para $contrasena_usu
  9.  
  10. // Despues de leer tu consulta
  11. if(mysql_num_rows($resultado) < 1) {
  12.     // Nombre de usuario o contraseña invalidos, limpia datos de sesiones anteriores
  13.     // Tambien debes hacerlo en el caso de "logout"
  14. } else {
  15.     // Continuas el proceso normal de ingreso
  16.  
  17.     // Para redireccionar mas facilmente, menos codigo, sin switch:
  18.     $paginas = array('Cero, no pagina', 'pagina1.php', 'pagina2.php', 'pagina---n.php');
  19.     header("Location: {$paginas[$session_grupo]}");
  20.     exit; // Oh my dog!!! creo que esto era lo unico que te hacia falta, finalizar la ejecucion del script!!! xD
  21. }

De cualquier forma, aunque solo te haga falta asignar $session_grupo y finalizar la ejecucion del script con exit; te sugiero optimizar un poco tu codigo y agregar seguridad.
__________________
- León, Guanajuato
- GV-Foto
  #8 (permalink)  
Antiguo 18/05/2010, 08:04
 
Fecha de Ingreso: mayo-2010
Mensajes: 6
Antigüedad: 14 años, 6 meses
Puntos: 0
Respuesta: Sesiones en PHP

OH MY DOG!!! jajja

Gracias, Triby

Tienes razón en cuanto a la seguridad y a la cantidad de líneas.

A las variables $email_usu y $contrasena_usu las obtengo del formulario que mostré en el primer mensaje. Sí, es verdad, debería tomarlas con $_POST[] pero estoy trabajando con variables globales.

Cuando escribí $session_grupo = $_SESSION["session_grupo"] no estaba haciendo referencia a una línea de código, sino a la equivalencia de valores.

Probé con los cambios que me sugeriste pero sigo teniendo el mismo problema. Quizás no lo estoy expresando bien. El problema es con la sesión. Por alguna razón las variables de sesión toman el valor que les corresponde en el segundo intento de login.

Saludos y muchas gracias.
  #9 (permalink)  
Antiguo 18/05/2010, 08:23
 
Fecha de Ingreso: mayo-2010
Mensajes: 6
Antigüedad: 14 años, 6 meses
Puntos: 0
Respuesta: Sesiones en PHP

Cita:
Iniciado por dcreate Ver Mensaje
mira [URL="http://www.forosdelweb.com/f18/si-clave-corresponde-pagina-754794/"]aki [/URL]espero esto te resulva algunas dudas, deje un aporte si te sirve
Estuve viendo este ejemplo, dCreate y la parte de código php tiene lo que necesito. Es más, el algoritmo está parecido a lo que hice. Si a vos te funcionó de esa forma quizás mi problema no esté en el código, sino en el servidor de prueba o la configuración de PHP.

Chas Gracias.
  #10 (permalink)  
Antiguo 25/05/2010, 17:50
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 16 años, 3 meses
Puntos: 2237
Respuesta: Sesiones en PHP

No habia visto tu respuesta, pero ya que ando por aqui, solo agrego un par de notas:

Si estas en un servidor de prueba no creo que tengas problemas para tener register_globals activado, sin embargo, cuando lo subas al servidor de produccion (o cuando actualices tu PHP) te veras en serios problemas, porque es una directiva insegura, obsoleta y que en proximas versiones de PHP no estara disponible.

Supongo que a pesar de tener register_globals activado, crear $_SESSION['session_grupo'] no hace que la variable $session_grupo este activa durante la ejecucion del script, sino hasta que actualizas la pagina, por lo que necesariamente deberias usar $session_grupo = $_SESSION['session_grupo'];
__________________
- León, Guanajuato
- GV-Foto
  #11 (permalink)  
Antiguo 30/05/2010, 13:23
 
Fecha de Ingreso: mayo-2010
Mensajes: 6
Antigüedad: 14 años, 6 meses
Puntos: 0
Respuesta: Sesiones en PHP

Gracias, Triby.

Ya solucioné el problema hace unos días inicializando las variables de sesión cuando comienza el script.

Saludos!

Etiquetas: inicio, login, sesión, sesiones
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 14:41.