viernes, junio 16, 2006

session_register() vs session_start()

Siempre que me pasa una cagada defiendo lo que hice hasta la muerte aunque te malo.

En este caso me escribi un codigo PHP como parte de una pequena aplicacion a usarse en mi trabajo para crear una sesion de usuario sencillo a todas vistas.

Corriendo en mi maquina como localhost con AppServ (por cierto, tuve que crear el articulo en la Wikipedia :P) para mayor facilidad y SQL Server como motor de bases de datos todo a las mil maravillas... El problema estubo cuando puse la aplicacion en el lugar donde deberia estar, en un Windows Server 2003 corriendo con IIS el principal problema era que la hacer login, el formulario simplemente se recargaba sin hacer la consulta, un momento, sin hacer la consulta? si enviabas usuario inexistente te decia que no existia el usuario, el mensaje que yo le habia puesto que devolviera cuando la consulta en la BD del usuario fallara :S y entonces??? Empece a hecharle la culpa a ISS y que Apache es lo mejor, que pongamos AppServ en el servidor, etc, etc, yo no sabia cual era el problema, mi caballo de batalla era que en mi maquina si funciona... Error, no se cuando voy a aprender a buscale el por que a las cosas... Este es el codigo que tenia:

if(isset($_POST["cmd_entrar"]))
if(isUsuarioValido($_POST["txtlogin"],
$_POST["password"])){
//declarar y asignar variables de sesion
$GLOBALS['login']=$_POST["txtlogin"];//registra variables
$GLOBALS['passwd']=$_POST["password"];

//registrar las variables de sesion
session_register("login");
session_register("passwd");

header("Location:inicio.htm");
exit();
}
else{
echo "Usuario no valido";
}
Tuve que darme cuenta que el del error era yo, estaba creando las sesiones de manera incorrecta, ya que esta forma a traves de session_register(); dejo de usarse hace mucho y ahora esta conciderado como una forma vieja o deprecated como me dijeron por ahi
you have a call to a (deprecated) function session_register();
La cosa es que la manera correcta de iniciar una sesion es a traves de session_start() entonces mi codigo arreglado quedo asi.

    session_start();
if (isset($_POST["cmdEntrar"]) &&
isset($_POST["txtUsuario"])
&& isset($_POST["txtPass"])){
if (UsuarioValido($_POST["txtUsuario"], $_POST["txtPass"])){
//Registrar Varibles de Sesion!
$_SESSION['login'] = $_POST["txtUsuario"];
$_SESSION['passwd'] = $_POST["txtPass"];

// Mueve el usario al otra pagina correcto
// usando un URL completamento
header("Location:index.php");
exit();
} else {
// La informacion del usario no esta valido
header("Location:error.php");
}
}
Otra cosa que me di cuenta fue que cuando no se pasa la variable de sesion el navegador tiene que tener las cookies habilitadas por lo tanto lo mas recomedable es pasarselas a sesion_start() en un campo oculto de la siguiente manera:

 echo SID;
//imprime PHPSESSID=5478c7e5ecaccaf64d731c6a11552850

$nameID = substr(SID,0,9);
//tomamos PHPSESSID como nombre del campo oculto

$valueID = substr(SID,10);
//el resto del contenido como valor del campo oculto
Donde la variable SID (si, es una variable PHP sin $) es la variable de sesion que guarda el navegador. Tonces lo pasamos a session_start() en los parametros del campo oculto name = $nameID value=$valueID y lo enviamos junto con el formulario de login.

Enlaces que te pueden interesar:
  • http://www.php.net/manual/es/function.session-register.php
  • http://forums.devnetwork.net/viewtopic.php?t=50178
  • http://www.php.net/manual/en/function.session-start.php
  • http://www.php.net/manual/en/function.substr.php
PD: Potter creo que hay que citar este post en tus clases de PHP con MySQL

No hay comentarios: