Programando con Sesiones [PHP]

session Hace algunos días se terminaron las clases en mi Universidad, y yo todo este ciclo había estado llevando un curso, del cual sus contenidos los había aprendido bastante en mis vacaciones anteriores o al menos, la parte práctica de la programación en PHP, así que la primera parte y parte de la segunda parte del ciclo lo pasé sin estudiar nada y entendiendo todo. Pero llegó un momento en que llegué a un punto límite de mi conocimiento en PHP (hombre, es que en esta vida nadie lo sabe todo) y me tope con esto llamado “Sesiones”, que si bien las había visto en el uso de JSP ( Java Enterprise Edition ), no pensé que existiría un concepto parecido en su par de PHP, pero bueno, decidí hacer este post para no olvidarme luego como es que se usan… así que… vamos con la práctica sin tanto floro ya…

Primero que nada… recalcar que como todo humano puedo cometer un error y publicarlo, asi que no tomen esta información de absoluta, porque si se me pasa algo y ustedes lo usan, se van a la chingada… asi que ya están advertidos :D

Yo siempre usaba una variable que definía si estaba o no estaba logueado un usuario, digamos un var logueo = 0; , pero así a lo bruto, entre si era un 0 ó un 1 (de acuerdo a como es que el usuario elegía las diferentes opciones en la aplicación web) para empezar a mostrar datos privados o mandar un mensaje de que no estaba logueado el usuario cosa que se podría romper con un “?variable=1″ al mandar la URL y se venía abajo todo mi trabajo (peor si se tratase de un input del tipo hidden en html); luego lo puse simplemente con métodos POST en los formularios, osea que las variables (desde un formulario) se pasen sin que se escriban en la URL, pero tampoco era muy eficiente que digamos, un hack en el navegador, o un quiebre de ventanas y lo mismo con los CRASHES, entre otros intentos por simular una sesión que incluso tuve que manejar variables redundantes en php que hacian de mi código una chanfaina (frase citada del profesor Eddy Miranda, grande profe!!!) y peor aún si el WampServer no tenía activado Register_Globals, así que -justo en el mismo momento de mi examen de laboratorio- me propuse a aprender lo de sesiones, luego de leer conceptos.

Que son las Sesiones?

Es un identificador único de navegación, en donde el usuario puede almacenar cierta información privada en su PC (específicamente, en la instancia actual del navegador) para que el APP en PHP, le muestre información previamente definida, datos personales, acciones previas, etc etc; y se crea el concepto abstracto de USUARIO en la aplicación, por lo que se crea una SESIÓN DE USUARIO, y obviamente de ahí salen algunos términos conocidos en internet como los de Usuario-Contraseña, Logueo, Cerrar Sesión, etc.

*Este concepto, se aplica a cualquier lenguaje de programación que de soporte a las sesiones de usuario, mayormente, los lenguajes Web, y aquellos que tengan que manejar datos en una DB.

Pero bueno, yendo directo al grano con la programación en PHP, como la definimos?

Primero que nada una sesión actua a lo largo de toda la aplicación web, así que no debemos preocuparnos porque si usa tal o cual archivo, siempre y cuando en todos los archivos la inicialicemos/recuperemos (la misma función sirve para las dos acciones), de la siguiente manera:

<?php
      session_start();
      echo "se ha definido la session!"; //aunque no se puede saber asi nomas...
?>

Y Bueno, aunque hayamos iniciado la sessión, no podemos comprobarlo a simple vista… para esto podemos usar el método session_id() , una variable que almacena el identificador único de la sesión en aquel momento… por ejemplo en cualquier lado del código (obviamente después de session_start()) podríamos colocar algo así:

<?php
     //....
     echo "El identificador de la Session actual es -->". session_id();
     //...
?>

Y nos mostrará una serie de caracteres representando a la sesión en términos de identificador, aunque la hayamos definido incluso en un archivo anterior al actual, porque como dije mas arriba session_start() aparte de empezar la sesión, también la puede recuperar.

Registrando Variables

Todo esto de definir una sesión, no tendría sentido si no hacemos uso del registro y utilización de variables a lo largo de la aplicación que hacen más facil la gestión de un usuario, es por eso que la sesión permite métodos de registro y eliminación e incluso de modificación de variables, yo de manera personal, conozco dos formas de definir variables en una sesión:

  • La primera es registrando mediante el método session_register(‘variable’), en donde variable es una variable previamente definida (osea, lo que hacemos es decirle al PHP que tal variable, pasa a ser variable de sesión).
  • La segunda es definiendo una variable de la forma $_SESSION["var_session"] = “Value”, en donde var_session es el nombre de la variable, y Value, el valor que le damos.

Por ejemplo, yendo a la práctica sería algo así:

<?php
 session_start();

 //La primera Forma!!!
 $variable1 = "Soy una Variable de Session Joder!!!"; // se define localmente!
 @session_register('variable1'); // aqui se registra en la sesion y queda!

 //pongo el @ porque en PHP5 creo que se deprecó, y con @ no sale el aviso de deprecado

 //La Segunda Forma!!!
 $_SESSION["variable2"] = "Soy otra Variable de Session Joder!!!"; // se define directamente

 //LUEGO AQUI O EN OTRO ARCHIVO SESIONADO LAS PODEMOS LLAMAR:

 echo "La Primera variable dice: ".$_SESSION["variable1"]."<br /><br />";
 echo "La Segunda variable dice: ".$_SESSION["variable2"];

 // *Para llamarlas o usarlas, debe ser del tipo $_SESSION["VARIABLE"]

?>

Nota Mental: Un Error común que comenten los usuarios ante tanto código (y que dá mas problemas en PHP4), es cuando antes del session_start(), dejamos algún espacio en blanco o colocamos otras declaraciones, por lo que yo recomiendo que session_start() esté antes que todo, justo debajo de la etiqueta <?php , porque más de una vez me causó algún disgusto entre si se registró o no algún objeto o variable… -pueden preguntarle a ZeroXprt y Clayder si quieren XD.

Bueno, ahora vamos con un ejercicio un poco más complejo, del cual si no entiendes algo puedes questionarlo como comentario porque abarqué un poquito más de temas, pero el concepto general de sesiones está ahí…

Crearemos una aplicación que nos pida datos, y que luego nos de a elegir cual queremos ver (osea su valor)… Para esto usaremos 4 archivos, La página principal, un controlador, y dos archivos para que nos muestre la data… yo los llamé así:

  • index.php
  • controlador_registro.php
  • mostrarDatos.php
  • mostrarDatosFrm.php (esté saldrá “embebido” mediante el metodo include(), en el anterior archivo)

Las estructuras son las siguientes:

  • index.php:
<?php
 session_start();
 session_destroy();
 //destruye toda session para plantear en limpio el problema
?>
<!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=iso-8859-1" />
<title>Documento sin t&iacute;tulo</title>
</head>

<body>
<form id="formulario_datos" name="form1" method="post" action="controlador_registro.php">
 <h1>Registro de Usuario</h1>
 <table width="100%" border="0">
 <tr>
 <td width="20%">Nombre:</td>
 <td width="80%"><input name="txtNombre" type="text" id="txtNombre" /></td>
 </tr>
 <tr>
 <td>Tel&eacute;fono:</td>
 <td><input name="txtTelefono" type="text" id="txtTelefono" /></td>
 </tr>
 <tr>
 <td>Direcci&oacute;n:</td>
 <td><input name="txtDireccion" type="text" id="txtDireccion" /></td>
 </tr>
 <tr>
 <td>Edad:</td>
 <td><input name="txtEdad" type="text" id="txtEdad" /></td>
 </tr>
 <tr>
 <td>&nbsp;</td>
 <td><input type="submit" name="Submit" value="Registrar en Sessi&oacute;n" /></td>
 </tr>
 </table>
 <p>&nbsp;  </p>
</form>
</body>
</html>
  • controlador_registro.php:
<?php
 session_start(); //se crea la sesion

 //registramos los datos desde el formulario hacia la session
 $_SESSION["PrimeraVez"] = 0; //identificador que servira en mostrarDatos.php

 $_SESSION["nombre"] = $_POST["txtNombre"];
 $_SESSION["telefono"] = $_POST["txtTelefono"];
 $_SESSION["direccion"] = $_POST["txtDireccion"];
 $_SESSION["edad"] = $_POST["txtEdad"];

 //$_POST sirve para recuperar variables, enviadas en formularios con el atributo method
 //como POST, si es GET, usar $_GET

 header("Location: mostrarDatos.php");
 //esto nos redirecciona a mostrarDatos.php haciendo que no se muestre este archivo
 //solamente que lo procese
?>
  • mostrarDatos.php:
<?php
 session_start(); //recuperamos la session

 //si primeraves = 0, entonces se da a elegir que variable se quiere mostrar
 if($_SESSION["PrimeraVez"]==0){
 $_SESSION["PrimeraVez"] = 1;
 ?>
 <form name="frm" method="post" action="mostrarDatos.php">
 <p>Elija una variable para mostrar:
 <select name="elegido">
 <option value="nombre">Nombre</option>
 <option value="telefono">Telefono</option>
 <option value="direccion">Direccion</option>
 <option value="edad">Edad</option>
 </select>
 </p>
 <p>
 <input type="submit" name="Submit" value="Mostrar Contenido">
</p>
 </form>

<?php

 }else{ //si primeravez no es = 0, entonces se muestra embebido el mostrarDatosFrm.php

 include("mostrarDatosFrm.php");

 }
?>
  • mostrarDatosFrm.php
<?php
 //no se llama a la sesion, porque esta dentro de mostrarDatos.php
 //y éste si la llama
 $elegido = $_POST["elegido"];

 switch($elegido){
 case "nombre":
 $valor = $_SESSION["nombre"];
 break;

 case "telefono":
 $valor = $_SESSION["telefono"];
 break;

 case "direccion":
 $valor = $_SESSION["direccion"];
 break;

 case "edad":
 $valor = $_SESSION["edad"];
 break;
 }

  //de acuerdo al switch, se muestran los valores abajo:
?>
<p>El Elemento que usted Eligio (<?php  echo $elegido; ?>) Contiene lo siguiente</p>
<p>&quot;<?php  echo $valor; ?>&quot;.</p>
<p><a href="index.php">Regresar al Inicio</a></p>

El funcionamiento es Sencillo:

En el index.php se muestra un formulario de ingreso de datos, en la cabecera se destruye la session por si acaso se regrese a ese formulario con el boton atras del navegador, así cogera los datos en limpio, en el controlador_registro.php , se registran esos datos ingresados y aparte se da un identificador (mediante otra variable de sesión) para saber si es la primera vez en el archivo mostrarDatos.php, y si no, se muestran los resultados del mostrarDatosFrm.php que están embebidos en el anterior mediante el método include(), con un juego del Switch para saber cual fue el elegido, se muestra el valor ($valor) asignandolo desde las variables de sesión, y así a pesar que pasamos por varios archivos en el funcionamiento, las variables siguen valiendo igual.

Espero les haya servido este post, adjunto todos los códigos fuente en un rar más abajo, incluído el código de la miniaplicación y los ejemplos planteados arriba.

Saludos! , espero postear más seguido acerca de programación!!!

Archivo rar Sesiones | Descárgalo aquí (vía MediaFire)