Comunidad de diseño web y desarrollo en internet online

Paso de variables dentro de un While durante una sesión

Citar            
MensajeEscrito el 17 Nov 2011 05:01 am
Saludos amigos de Cristalab!

Estoy diseñando un sitio con sesiones. Por el momento tengo dos páginas, una de login y otra a la que se accede sólo si el login es correcto, lo cual logro por medio de sesiones. Esto funciona a la perfección. Si el usuario y la contraseña son correctos, redirige a la página de usuario, de lo contrario, muestra en el index un mensaje de error. Hasta ahí todo bien.

Mi humilde script:

Código PHP :

<?php
require_once("session.php");
require_once("conexion.php");
$sql = "select usuario, password, perfil, nomperfil, nombres, apellidos from usuarios 
where 
usuario = '". mysql_real_escape_string ($_POST['usuario'])."' and 
password = '".mysql_real_escape_string ($_POST['password'])."' limit 1";
$resultado = mysql_query($sql) or die (mysql_error());
while ($row = mysql_fetch_array($resultado)) {
   $data = $row; }
if($data==0) {
header('Location: ../index.php?estado=error-us');
}
else {
$usuario = $_POST['usuario'];
$_SESSION['usuario'] = $usuario;
}
switch($data['perfil']) {   
case 1: header('Location: ../reg/admin/index.php'); break;
case 2: header('Location: ../reg/usuario/index.php'); break;
default; break;
}
?>
Con el último switch envío a la página según el tipo de perfil. Ahora bien, por ejemplo, si elimino la redirección y muestro en pantalla el nombre y el apellido lo hago así:

Código PHP :

if(!isset($data['nombres, apellidos']) !="0");
else {
echo $data['nombres']." ".$data['apellidos']; }
Y ¡Wow! Todo bien, me muestra los datos.

Mi problema es que al poner el mismo script en la página de usuario nada. No me muestra los datos. La sesión de usuario se pasa bien a la página de usuario, pues si hago un "echo" con el "$_SESSION['usuario']" me muestra en efecto el nombre de usuario, no así las otros datos.

Entonces, lo que quiero es poder traspasar esos datos desde el login a la página de usuario. Yo pensaba que al dejar todo en el while se pasaban solitos. Jajajajaja... Ya vi que no. Se me ocurre que quizás podría crear una variable de sesión por cada dato, pero no me parece que sea práctico. Probé creando una sesión igual a $data pero tampoco me resultó. Sé que el problema no está ni en la consulta ni en la forma de mostrar los datos, sino en el cómo pasar los datos almacenados en $data a la segunda página.

Eso sería. Agradeciendo de antemano vuestra amabilidad y disposición y esperando la conferencia del sábado,

Buena Caza y Largas Lunas.

Por eareddhel

83 de clabLevel



Genero:Masculino  

msie
Citar            
MensajeEscrito el 17 Nov 2011 04:08 pm
El while es innecesario ya que la consulta SQL explícitamente estás pidiendo uno y solo un registro ("... limit 1").

Ahora bien, lo que deberías hacer es en la página de usuario a la cual rediriges luego del login es volver a leer los datos del usuario desde la base de datos. No necesitas pasar todos los datos por sesión ya que esos datos ya están en la BD. De hecho ya tienes el índice del registro que le corresponde al usuario logueado en la variable $_SESSION['usuario'], ¿no?.

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 18 Nov 2011 03:02 am
Gracias DriverOp por responder.

Entonces, lo que me recomiendas es en la página de usuario volver a realizar una consulta en la que el usuario corresponda a la sesión para así obtener los datos de nombres y apellidos. ¿Es eso no?

Por otro lado, hasta ahora había entendido que el "limit 1" se refería a la lectura de "sólo una fila", es decir, la fila que contiene los datos que corresponden al usuario identificado en la sesión. Grrr... Ya me confundí.

Resumiendo. Para que en mi echo las variables "nombres" y "apellidos" tengan contenido en la página de usuario debo realizar nuevamente un "select". ¿Correcto? ¿Cuál sería entonces la forma más óptima de hacerlo? Porque lo que quiero es que cuando el usuario inicie sesión, en "todas las páginas" aparezca algo así como:

Perfil Administrador
Fulano Zutano de Tal

Sigo atento a todos los comentarios.

Por eareddhel

83 de clabLevel



Genero:Masculino  

msie
Citar            
MensajeEscrito el 18 Nov 2011 12:28 pm
eareddhel:
A la primera pregunta. Sí, eso mismo.

Sobre "limit 1". Esto indica que de regresar resultados solo regrese el primero y solo el primero de acuerdo al orden natural de la tabla o al orden especificado con "ORDER BY".

Pues cada vez que necesites datos del usuario debes ir a buscarlos a la base de datos porque es allí donde están. Tener todos los datos en un $_SESSION no hace más que duplicar datos. Para eso te convendría armate una biblioteca de funciones o mejor aún, una clase "usuario" donde poner toda la lógica de validación, recuperación y modificación de datos de usuarios.

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 18 Nov 2011 02:13 pm
Ajá. Entiendo. De todas formas, los únicos datos que necesito de forma permanente (por el diseño de la página) son el nombre del perfil y el nombre y apellidos del usuario, porque irán en la parte superior izquierda de la página y el tipo de perfil para mostrar un menú específico para cada tipo de usuario. Sólo esos y por eso había pensado en transmitirlos de alguna manera para no tener que estar sacándolos de la base de datos a cada rato.

Gracias por responder. Buena Caza y Largas Lunas.

Por eareddhel

83 de clabLevel



Genero:Masculino  

msie
Citar            
MensajeEscrito el 19 Nov 2011 01:36 am
Bueno, a partir de la sugerencia de DriverOp me decidí por crear un script llamado de forma muy original "funciones.php" en el cual iré escribiendo rutinas habituales (no sé por qué no se me ocurrió antes) y en cada página lo incluyo con su respectivo "require_once("php/funciones.php");"

La función no es más que:
a) Verificar si hay una sesión abierta o no, para evitar la notificación de que la variable no está definida.
b) Realizar una consulta sql para obtener los datos que quería mostrar.
c) Meter todo dentro de una variable con while.

Quedaría así:

Código PHP :

if(!isset($_SESSION['usuario']) !="0"); else {
$sql = "select usuario, perfil, nomperfil, nombres, apellidos from usuarios 
where 
usuario = '".($_SESSION['usuario'])."' limit 1";
$resultado = mysql_query($sql) or die (mysql_error());
while ($row = mysql_fetch_array($resultado)) {
   $data = $row;
}
}
Y eso sería todo. Funciona y lo mejor de todo es que mi página se ve como quería, es decir, mostrando en cada página en un lugar destacado el nombre del perfil y el nombre completo del usuario.

Lo único que me queda como duda es si no consumiremos mucha memoria del servidor al realizar en cada carga la misma consulta. Y por supuesto, si alguien tiene una mejor forma de hacerlo, compártala.

Bueno, cierro el tema satisfecho. Al menos el día no terminó tan mal. Me chocaron el auto y llegué derrotado a la casa. Al menos dejar esto funcionando me sacó una sonrisa. Gracias a todos por los comentarios.

Buena Caza y Largas Lunas.

Por eareddhel

83 de clabLevel



Genero:Masculino  

msie
Citar            
MensajeEscrito el 19 Nov 2011 12:44 pm
¿Para qué el while?

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 19 Nov 2011 06:15 pm
Después de leer tu pregunta volví al código y quite el while y todo sigue funcionando perfecto. Me había quedado con la idea de que era necesario para tener todos los datos en una misma variable. De modo que lo dejé al final así:

Código PHP :

if(!isset($_SESSION['usuario']) !="0"); else {
$sql = "select usuario, perfil, nomperfil, nombres, apellidos from usuarios 
where 
usuario = '".($_SESSION['usuario'])."' limit 1";
$resultado = mysql_query($sql) or die (mysql_error());
$data = mysql_fetch_array($resultado);
}
Y entonces me surge la pregunta: ¿Cuándo sería entonces recomendable o práctico usar el while? Aún no me acaba de quedar claro.

Por eareddhel

83 de clabLevel



Genero:Masculino  

msie
Citar            
MensajeEscrito el 19 Nov 2011 08:39 pm
Cuando esperas que la consulta devuelva más de un registro. Pero insisto, si en la sentencia SQL le pones "LIMIT 1" solo devolverá un registro (o ninguno) por lo tanto no hay nada qué recorrer con while.

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 19 Nov 2011 09:35 pm
Mmm... Cuando hablamos de registro, pensando en el LIMIT 1, nos referimos a que le pido sólo una "fila" de la tabla. ¿Verdad? Y eso correspondería a sólo un registro. ¿Estoy en lo correcto? Si es así, claro, tienes toda la razón por supuesto y el while era innecesario. ¿Lo entendí bien?

Por eareddhel

83 de clabLevel



Genero:Masculino  

msie
Citar            
MensajeEscrito el 19 Nov 2011 10:40 pm
"Fila" y "registro" es lo mismo. Y sí, lo has entendido bien...

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 19 Nov 2011 11:39 pm
:cool:

Genial. Muchas gracias DriverOp. Ahora lo tengo más claro. Se agradece de nuevo la buena voluntad.

Tengo otras dudas pero como son de otro tema prefiero abrir un nuevo tema.

Buena Caza y Largas Lunas.

Por eareddhel

83 de clabLevel



Genero:Masculino  

msie

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.