Ver Mensaje Individual
  #1 (permalink)  
Antiguo 30/04/2013, 14:09
Avatar de guardarmicorreo
guardarmicorreo
 
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 12 años
Puntos: 84
grandes cuestiones: destruir variables de sesion + globals + session_unset + unset

vengo a exponer una cuestión de la que me he percatado y que no sé si es acertada mi conclusión.

perfeccionando mi proyecto personal web, me he dado cuenta de que cuando un usuario se registra inicia una variable de sesión después de hacer una comprobación en base de datos mysql (en este caso).

el usuario al hacer unlogin la variable de sesion la estruía de la siguiente manera:

Código PHP:
Ver original
  1. if(isset($_POST['salir']))
  2. {
  3.     session_unset();
  4. }
no le dí mucha más importacia, hasta que tuve que utilizar de nuevo las variables de sesión, esta vez para un carrito de compra, el cual utilizará variables de sesión.
si utilizo session_unset(); esto podría provocar un error que no quiero, es el siguiente:

un usuario se registra, marca ciertos productos para comprarlos, pero antes de comprarlos cierra sesión usuario, al hacer clic se le borran todos los $_SESSION por que yo programé session_unset(); y lo que quiero es darle al usuario la posibilidad de que si se desloguea solo borre su sesion de usuario, no su sesion del carrito de compra.

busqué una alternativa a session_unset();
en la documentación de php me recomienda que si utilizo $_SESSION es mejor borrar sesiones específicas, efectivamente era lo que yo buscaba.

el problema viene dado cuando borro S_SESSION desde una función; al hacerlo me decía que la variable $_SESSION["usuario"]; no existía.

seguí buscando información de por qué este error y me encontré con que hay dos tipos de variables:

las que trabajan fuera de funciones son por defecto globales.

las que trabajan dentro de funciones son por defecto locales.

deducí que ese era el error, que al borrar $_SESSION("usuario"); dentro de una función estaba borrando un $_SESSION local y no el global.

por lo tanto a la hora de borrar $_SESSION["usuario"]; le indiqué que borrar la variable global "usuario".

a raíz de esto tengo dos preguntas:

¿es acertado borrar la variable $_SESSION["usuario"] con unset($GLOBAL("usuario"))?

¿si la variable $_SESSION["usuario"] la creé a partir de un valor obtenido por consulta a mysql dentro de una función cómo es que pasa a ser global y no local?

les dejo mi código para que tengan el resultado que al parecer me funciona.

funciones.php (donde se crea y destruye la variable de sesion $_SESSION["usuario"])

Código PHP:
Ver original
  1. function sesion_usuario()
  2.    {
  3.        
  4.        
  5.         if (isset ($_POST["salir"]))//primero cierra sesion si el usuario ha pulsado en salir, sino hace lo que hay a continuaci�n
  6.         {
  7.                         //ahora borro así la variable de sesión "usuario" y parece que funciona porque en el blog_index.php da el error de Undefined variable: _SESSION
  8.             unset($GLOBALS["usuario"]);
  9.             /*session_unset(); //antes borraba así la variable de sesión "usuario"*/
  10.         }
  11.        
  12.        
  13.         if(isset($_SESSION['usuario'])) //si hay sesion iniciada
  14.         {
  15.              menu_unlogin();
  16.         }
  17.         elseif (isset($_POST['enviarlogin'])) //si el usuario envía los datos de registro
  18.         {
  19.                          //creación de la instacia a la clase para consultar datos
  20.             $usuario=new Sesion_usuario();
  21.             $usuario=$usuario->sesion($_POST['usuario'], $_POST['passwd']);
  22.             if(!(empty($usuario)))
  23.             {
  24.            
  25.                 for($i=0;$i<sizeof($usuario);$i++)
  26.                 {      
  27.                     if($_POST['usuario']==$usuario[$i]['usuario'] AND $_POST['passwd']==$usuario[$i]['passwd'])
  28.                     {
  29.                                                  //aquí se crea la sesión de usuario para abrir su sesión
  30.                         $_SESSION["usuario"]=$usuario[$i]['usuario'];
  31.                         menu_unlogin();
  32.                     }
  33.                     else
  34.                     {
  35.                         echo "usuario no válido";
  36.                     }
  37.                 }
  38.             }
  39.             else
  40.             {
  41.                 echo "usuario no válido";
  42.             }
  43.          }
  44.         else //sino carga siempre menu para login
  45.         {
  46.             menu_login();    
  47.         }  
  48.     }

blog_index.php
Código PHP:
Ver original
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 5 Transitional//EN">
  2. <HTML>
  3.     <HEAD>
  4.         <meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
  5.         <meta http-equiv="Content-Language" content="es"/>
  6.         <link href="style.css" type="text/css" rel="stylesheet"/>
  7.         <title>Espacio de Jonathan Rodríguez</title>
  8.         <?php include ('funciones.php'); ?>
  9.     </HEAD>
  10.     <BODY>
  11.         <div id="body">
  12.             <div id="caja">
  13.                 <div id="cabecera">
  14.                     <?php cabecera(); ?>
  15.                     <?php echo " ··· ".$_SESSION['usuario']. " ··· ";
  16. /*aquí compruebo en todo momento el valor de la variable de sesion "usuario"*/ ?>
  17.                 </div>
  18.                 <div id="cuerpo">
  19.                     <?php cuerpo(); ?>
  20.                 </div>
  21.                 <div id="pie">
  22.                     <?php pie(); ?>
  23.                 </div>
  24.             </div>
  25.         </div>
  26.    
  27.     </BODY>
  28. </HTML>

Última edición por guardarmicorreo; 30/04/2013 a las 14:14