Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] grandes cuestiones: destruir variables de sesion + globals + session_unset + unset

Estas en el tema de grandes cuestiones: destruir variables de sesion + globals + session_unset + unset en el foro de PHP en Foros del Web. 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, ...
  #1 (permalink)  
Antiguo 30/04/2013, 14:09
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 8 años, 2 meses
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
  #2 (permalink)  
Antiguo 30/04/2013, 14:41
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 13 años, 9 meses
Puntos: 270
Respuesta: grandes cuestiones: destruir variables de sesion + globals + session_unset

Cita:
Iniciado por guardarmicorreo Ver Mensaje
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.
No hay una "sesion de usuario" y una "sesion de carrito".Hay una sesión.
Suponiendo que pudieras borrar la sesion de usuario, y no de su carrito...Cómo
sabrías de quién es el carrito?
Antes de destruir la sesión, guarda en base de datos el carrito.

Cita:
Iniciado por guardarmicorreo Ver Mensaje
en la documentación de php me recomienda que si utilizo $_SESSION es mejor borrar sesiones específicas, efectivamente era lo que yo buscaba.
No sé dónde has leído sobre "sesiones específicas".

Cita:
Iniciado por guardarmicorreo Ver Mensaje
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.
$_SESSION no es ni global ni local.Es una superglobal.Puedes usarla en cualquier
sitio, como una global, sin especificar su ámbito, como una local.

Cita:
Iniciado por guardarmicorreo Ver Mensaje
¿es acertado borrar la variable $_SESSION["usuario"] con unset($GLOBAL("usuario"))?
No.Usa $_SESSION.

Cita:
Iniciado por guardarmicorreo Ver Mensaje
¿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?
Porque ese valor se lo has asignado a una variable superglobal.
  #3 (permalink)  
Antiguo 30/04/2013, 17:49
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 8 años, 2 meses
Puntos: 84
Respuesta: grandes cuestiones: destruir variables de sesion + globals + session_unset

Cita:
Iniciado por dashtrash Ver Mensaje
No hay una "sesion de usuario" y una "sesion de carrito".Hay una sesión.
Suponiendo que pudieras borrar la sesion de usuario, y no de su carrito...Cómo
sabrías de quién es el carrito?
Antes de destruir la sesión, guarda en base de datos el carrito.



No sé dónde has leído sobre "sesiones específicas".
antes de nada, muchas gracias por responderme y ayudarme.

lo leí aquí

documentación oficial de php (en NOTAS)

Cita:
$_SESSION no es ni global ni local.Es una superglobal.Puedes usarla en cualquier
sitio, como una global, sin especificar su ámbito, como una local.


No.Usa $_SESSION.
ok, no sabía que era super global, gracias :D

Cita:
Porque ese valor se lo has asignado a una variable superglobal.
entendiendo que session_unset(); destruye todas las variables de sesion, entonces mi pregunta es

si puedo crear $_SESSION["usuario"] y $_SESSION["carrito"]

¿cómo puedo destruir $_SESSION["usuario"] sin destruir $_SESSION["carrito"]?


gracias por tu ayuda

EDITO

encontré la solución

además de destruir todas las sesiones con session_unset(); sí se pueden destruir sesiones por separado con unset($_SESSION["nombre de la sesión"]).

yo estaba teniendo el error en que en el propio documento funciones.php que generaba la sesion y la eliminaba no tenía al principio del todo la sesión iniciada con session_start();
por lo tanto al ir a eliminarla la sesión no estaba disponible en funciones.php, solamente en blog_index.php
craso error por mi parte.

RESPECTO a que entiendo que dices de que no es viable mantener una sesion carrito sin tener una sesion de usuario porque así no sabes quien compra, bueno, tal vez el vendedor online sí le interese esto mientras el comprador quede reflejado en paypal por ejemplo. esa puede ser la situación de cualquier tienda online que no quiere que sus compradores tengan que registrarse para comprar.

muchas gracias por tu ayuda nuevamente.

saludos!

Última edición por guardarmicorreo; 30/04/2013 a las 18:00 Razón: encontré la solución
  #4 (permalink)  
Antiguo 30/04/2013, 19:00
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 12 años, 5 meses
Puntos: 2235
Respuesta: grandes cuestiones: destruir variables de sesion + globals + session_unset

Sólo como observación y recordando lo que ya te dijo dashtrash:

No existen sesiones independientes, sino variables, que son índices de $_SESSION y, sí, es recomendable crear una para cada uso, ejemplo: usuario, carrito, etc. y cada indice puede ser casi cualquier tipo de dato disponible en PHP: arrays, cadenas, enteros, flotantes, etc.
__________________
- León, Guanajuato
- GV-Foto
  #5 (permalink)  
Antiguo 01/05/2013, 04:09
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 8 años, 2 meses
Puntos: 84
Respuesta: grandes cuestiones: destruir variables de sesion + globals + session_unset

ha sido todo un placer contar con la ayuda de ustedes dos, se lo agradezco :D

Etiquetas: destruir, globals, grandes, html, mysql, registro, unset, variables
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 21:21.