Ver Mensaje Individual
  #5 (permalink)  
Antiguo 15/09/2009, 21:18
TheHard
 
Fecha de Ingreso: abril-2003
Ubicación: Santiago de Chile
Mensajes: 115
Antigüedad: 21 años
Puntos: 0
Si, estoy usando $_SESSION[], pero los valores se pierden... trataré de levantar un pequeño código para explicarme mejor.

Ok, a ver si nos entendemos... me hice esta pequeña página de prueba de sesiones, con formulario y todo, me gustaría si alguien se anima a discutirlo conmigo.

1. Después de conectarse, simulo verificación de usuario y dejo "logueado" al usuario, usando una variable de sesión para comprobar el estado.
2. En "Voy a hacer algo, sin errores", sólo simulo la ejecución de una acción, con una redirección. En este punto el comportamiento está Ok, sigo con las variables y sigo "logueado"
3. En "Voy a hacer algo, con errores", creo datos en un array, luego guardo ese array en una variable de sesión, y redirecciono. En este punto, por alguna razón, el valor del array no llega de vuelta, es aquí donde tengo el problema principalmente.
4. Finalmente, el logout, destruyo cualquier variable que pueda tener creada.

Este es el código, para quien quiera probarlo. Yo, como mencioné al principio, estoy probando con APPSERV, y las variables tienen un comportamiento raro. En un servidor web "X", las variables me duran como 3 segundos antes de desaparecer.

Código PHP:
<?php

// Indico que voy a usar sesiones
session_start();

// Veo si está ingresando

$b_logueado chequeoLogin();

// Si la variable de sesion a_msg vuelve con algo, la pongo en mi variable local
$a_msg = array();
if ( isset(
$_SESSION["a_msg"]) ) { $a_msg $_SESSION["a_msg"]; } else { $_SESSION["a_msg"] = array(); }

if ( isset(
$_POST["accion"]) ) { 
    
$accion $_POST["accion"];
} elseif ( isset(
$_GET["accion"]) ) {
    
$accion $_GET["accion"];
}

if ( 
$accion == "login" ) {
    
$usuario $_POST["usuario"];
    
$password $_POST["password"];

    
// Asumamos que aquí fuí a ver si estaba el usuario en una base de datos.
    // if ( !(buscaUsuario($usuario, $password)) ) { ... }

    // Creo las sessiones
    
    
$_SESSION["usuario"] = $usuario;
    
$_SESSION["password"] = $password;
    
$_SESSION["estado"] = 1// 1 = Conectado
    
    // Ok, ingresé correctamente, así que lo mando a la página de inicio de nuevo, para que ejecute chequeoLogin()
    
    
header("Location: " $_SERVER['PHP_SELF']);
    exit();        
// Para que no siga ejecutando el código

    //$a_msg[] = "Me conecté correctamente"; //Ojo, para mostrar este mensaje no estoy usando sesiones.

} elseif ( $accion == "sinerrores" ) {

    
// Asumamos que acá hago una consulta a la base de datos
    // if ( !(consultaEnorme() ) { echo "No encontré datos"; } else { echo "Muchos datos..."; }
    
    // Redirecciono después de esta acción, a la página de inicio. Ojo, aquí es donde pierdo las variables de sesión por alguna razón

    
header("Location: " $_SERVER['PHP_SELF']);
    exit();        
// Para que no siga ejecutando el código

} elseif ( $accion == "conerrores" ) {

    
// Asumamos que acá hago una consulta a la base de datos, y me devolvió un error, que quiero mostrar con sessiones
    // if ( !(consultaEnorme() ) { echo "No encontré datos"; } else { echo "Muchos datos..."; }
    
    
$a_msg[] = "Ha ocurrido un error, por lo que lo muestro en la página principal.";
    
    
// Redirecciono después de esta acción, a la página de inicio. Ojo, aquí es donde pierdo las variables de sesión por alguna razón
    // Ya que voy a redireccionar, lleno la variable de sesión con mis mensajes
    
    
if ( !(empty($a_msg)) ) { $_SESSION["a_msg"] = $a_msg; }
    
header("Location: " $_SERVER['PHP_SELF']);
    exit();        
// Para que no siga ejecutando el código

} elseif ( $accion == "logout" ) {

    unset(
$_SESSION["usuario"]);
    unset(
$_SESSION["password"]);
    unset(
$_SESSION["estado"]);
    unset(
$_SESSION["a_msg"]);
    
    
session_destroy();    // De una u otra forma...
    
    
header("Location: " $_SERVER['PHP_SELF']);
    exit();

}


function 
chequeoLogin() {

    if ( isset(
$_SESSION["estado"]) && $_SESSION["estado"] ) {
        return 
true;
    } else {
        return 
false;
    }

}

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>formulario con sesiones</title>
</head>

<?php

    
if ( $a_msg ) { // Si volvió bien con mis errores desde la sesión, entonces los muestro.
        
echo "<h3>Han ocurrido algunos errores...</h3>\n";
        echo 
"<ul>\n";
        foreach ( 
$a_msg as $msg ) {
            echo 
"  <li>" $msg "</li>\n";
        }
        echo 
"</ul>\n";
    }
    unset (
$a_msg);
    unset (
$_SESSION["a_msg"]);
?>

<?php
    
if ( $b_logueado ) {
?>

    <h3>Bienvenido <?php echo $_SESSION["usuario"]; ?> !!! </h3>
    <p>Qu&eacute; quieres hacer ahora?</p>
    <ul>
        <li><a href="<?php echo $_SERVER['PHP_SELF'] . "?accion=sinerrores"?>">Voy a hacer <i>algo</i>, sin errores</a></li>
        <li><a href="<?php echo $_SERVER['PHP_SELF'] . "?accion=conerrores"?>">Voy a hacer <i>algo</i>, con errores</a></li>
        <li><a href="<?php echo $_SERVER['PHP_SELF'] . "?accion=logout"?>">Me aburr&iacute; me voy... (logout)</a></li>
    </ul>

<?php
    
} else {
?>

<form action="<?php $_SERVER["PHP_SELF"]; ?>" method="post" name="frmlogin">
<input name="accion" type="hidden" value="login" />
<table border="0" cellspacing="0" cellpadding="0" summary="BlaBla">
  <caption>
    Bienvenido! veamos quien eres...
  </caption>
  <tr>
    <td>Usuario</td>
    <td><input name="usuario" type="text" value="<?php echo $_SESSION["usuario"]; ?>" size="25" maxlength="15" /></td>
  </tr>
  <tr>
    <td>Contrase&ntilde;a</td>
    <td><input name="password" type="password" value="<?php echo $_SESSION["password"]; ?>" size="25" maxlength="15" /></td>
  </tr>
  <tr>
    <td align="right" colspan="2"><input type="submit" /></td>
  </tr>
</table>
</form>
<?php
    
}
?>

<body>
</body>
</html>
Bueno, eso... ojalá y alguien quiera discutir esto conmigo.

Saludos!

Update: Acabo de crear un sitio en 000webhost.com (no la conocía, por cierto), y aquí me funciona el tema! pueden chequearlo aquí http://cnavarroh.comlu.com/frmsesion.php... tendrá algo especial en la configuración del php? http://cnavarroh.comlu.com/phpinfo.php
__________________
~[ The Hard ]~
- Sólo sé que nada sé...
- Hay un placer en la locura, que sólo los locos conocen...
- ¿Trabajas para vivir, o vives para trabajar?

Última edición por GatorV; 16/09/2009 a las 14:06