martes, 8 de mayo de 2012

Declaracion de Sesiones


DECLARACION DE SESSIONES


¿Qué son las sesiones? Es uno de los sistemas más usados en PHP para el almacenamiento de variables a lo largo de la navegación por una página web son las sesiones.
Consisten básicamente en variables globales que mantienen su valor a pesar de cambiar de sección dentro de una misma web. Recordamos que existen tres formas de almacenar la información de las variables que más tarde querremos procesar:
POST: Envía los datos de forma “oculta” en la cabecera de la página y requiere de un formulario para enviar las variables.
GET: Envía la información en la URL. Tiene la ventaja de poder enlazar directamente con los valores de las variables. Limitación de capacidad y falta de confidencialidad.
SESIONES: Gracias a las sesiones podremos almacenar el valor de variables cuyo contenido se preservará a lo largo de toda la visita.
Un ejemplo de su gran potencial es, por ejemplo, cuando queremos almacenar el nombre de usuario y la contraseña de una persona a lo largo de su recorrido por la web. Podríamos ir enviando dichos valores mediante el método GET pero tanto el nombre de usuario y la contraseña saldrían visibles en la URL destino. Para asegurar confidencialidad y seguridad, se usan las sesiones.
En definitiva, si queremos almacenar valores en unas determinadas variables y que dichos valores permanezcan a lo largo de una visita sin necesidad de ir enviando formularios ni enviando variables por la URL, el método más cómodo son las sesiones. Veamos como se implementan.

Implementación práctica


La implementación no debe suponer ningún problema. Hay que tener claro que en cada página donde queramos mantener el valor de dichas variables hay que añadirle las siguientes líneas de código (cuyo significado se explicará detenidamente más adelante):

<?
session_start();
session_register(‘dni_usuario’);
session_register(‘variable_2′);

session_register(‘variable_n’);
?>
 

Es importante añadir que dichas lineas deben estar colocadas al comienzo del fichero HTML. Antes incluso de cualquier etiqueta HTML o código en PHP. Esto es importante pues si no, genera errores.
Como su propia palabra indica, session_start(); indica a la página web en concreto que, en ese fichero HTML queremos usar las variables almacenadas en la sesión.
Posteriormente hay que definir que variables son las que vamos a usar a través de la orden 

session_register(‘nombre_variable’);

Imaginemos que tenemos tres páginas web:

index.php: Donde colocaremos un formulario de login para el usuario y lugar donde se procesarán los datos introducidos en el formulario.
contenidos.php: De acceso exclusivo a la gente registrada.
noticias.php: Sección que puede tener acceso todo el mundo.
La idea consiste en que, gracias a los datos insertados en la página index.php, el sistema identifique al usuario y le de acceso o no a la página restringida contenidos.php. En el caso de noticias.php no será necesario implementar nada referente a las sesiones pues no se usarán esas variables para procesar absolutamente nada.
En las otras dos páginas (index.php y contenidos.php) será necesario incluir las líneas citadas anteriormente. De esta forma estamos ordenando que dichas páginas “recuperen” el valor de las variables de la sesión para ser usadas en la sección en concreto.
Una vez tenemos dicho a las páginas que vamos a usar las variables de sesión, lo único que queda es saber asignarle valores, quitárselos o recuperarlos. De esta forma, si en la página contenidos debemos verificar si el usuario está registrado o no, podríamos hacer un simple “if” para saber si existe un usuario o no y en caso negativo sacarle el correspondiente error.

Siguiendo con nuestro ejemplo, en index.php y en contenidos.php habrá que colocar las siguientes líneas:

<?
session_start();
session_register(‘nombre_usuario’);
session_register(‘clave_usuario’);
?>

De esta forma se han definido dos variables: nombre_usuario y clave_usuario.
Pues bien, en la página index.php lo que haremos será recoger las variables del formulario en cuestión y almacenarlas en las variables de sesión. En este punto se le pueden añadir tantas restricciones como se quieran. Por ejemplo, comprobar mediante una base de datos que el nombre de usuario y la contraseña corresponden a un usuario registrado con anterioridad. En caso de no existir, denegar la identificación.

if($_POST['login']){
     $HTTP_SESSION_VARS['nombre_usuario']=$_POST['nombre_usuario'];
     $HTTP_SESSION_VARS['clave_usuario']=$_POST['clave_usuario'];

En lugar de escribir $HTTP_SESSION_VARS se puede optar por poner $_SESSION cuyo significado es equivalente. En este caso, escriba lo que escriba, se van a almacenar los valores del formulario dentro de la sesión.

Si existiera un botón de “Desconectar”, se podría poner algo así:

if($_POST['desconectar']){
     session_unset();
}

De esta forma, a través de session_unset() lo que se hace es eliminar todas las variables que estuvieran definidas en la sesión. De esta forma, cuando la página web intentara reconocer al usuario, vería que no existe por lo que la desconexión se habría realizado con éxito. 

En la página contenidos.php podemos incluir un “if” de forma que si existen las dos variables de sesión, se le de acceso. En caso contrario, mostrarle un mensaje de error. También se podría comprobar si las variables de sesión corresponde a un usuario registrado en una base de datos u operaciones similares.

<html><head></head><body>
<?
if(isset($HTTP_SESSION_VARS['nombre_usuario']) && isset($HTTP_SESSION_VARS['clave_usuario'])){
     echo “Bievenido a la sección…”;
}
else{
     echo “Error: Ha accedido a una sección restringida. Vueva a intentarlo”;
}
?>
</body></html>

Como se puede comprobar, las posibilidades son infinitas. Incluso, si se dispone de un índice, se pueden “anular” accesos en dicho índice comprobando simplemente si el usuario está identificado. Por ejemplo:

<a href=”index.php” mce_href=”index.php”>Principal</a><br>
<a href=”noticias.php” mce_href=”noticias.php”>Noticias</a><br>
<?if(isset($HTTP_SESSION_VARS['nombre_usuario']) && isset($HTTP_SESSION_VARS['clave_usuario'])){
?><a href=”contenidos.php”>Contenidos</a><?}?>

En este caso, si vamos a usar las variables de sesión en el índice, la sección noticias.php ya si requerirá el uso de las variables de sesión por lo que habrá que incluir las mismas líneas que se incluyeron en las otras dos. Solo en el caso de que el usuario esté identificado, le saldrá en el menú el acceso a la sección contenidos.php.

Todo este ejemplo queda disponible en la parte de “Referencias” para su descarga. En él, se dispondrá del código completo para una mejor interpretación.

III. Funciones
A pesar de la explicación anterior, es importante disponer de una buena referencia de funciones usadas en las sesiones. Entendiendo los fundamentos básicos de las sesiones y sabiendo usar adecuadamente cada función, su uso no debería suponer ningún misterio.
A continuación os comento las funciones más importantes. El resto de funciones podéis encontrarlas en las referencias.

SESSION _STAR
Inicializa los datos de una determinada sesión. Su uso es imprescindible y se coloca justamente donde se indicó en el anterior apartado: Al comienzo de cada página web que requiera su uso.

SESSION _REGISTRER
 Sirve para declarar las variables que se van a usar en la sesión.

SESSION _DESTROY
Destruye la sesión actual sin destruir ninguna de las variables. Por ejemplo, si usamos este método únicamente para desconectar a un usuario, no serviría pues las variables asociadas a su identificación seguirían activas. Haría falta borrar dichos valores.


SESSION _UNSET
Borra las variables asociadas a una sesión eliminando su valor.



Funciones para el manejo de sesiones

El apoyo que PHP proporciona para las sesiones consiste en una forma de conservar ciertos datos a lo largo de los subsiguientes accesos, lo cual le permite construir aplicaciones más personalizadas e incrementar el atractivo de su sitio web.
Si ya está familiarizado con el tratamiento de sesiones de PHPLIB, notará que algunos conceptos son similares al soporte de las sesiones de PHP.
A cada visitante que accede a su web se le asigna un identificador único, llamado "session id" (identificador de sesión). Éste se almacena en una cookie por parte del usuario o se propaga en la URL.
El soporte de las sesiones le permite registrar un número arbitrario de variables que se conservarán en las siguientes peticiones. Cuando un visitante acceda a su web, PHP comprobará automáticamente (si session.auto_start está puesto a 1) o cuando usted lo especifique (de forma explícita mendiante session -star() o implícita a través de session _registrer() si se le ha enviado un "session id" específico con su petición, en cuyo caso se recrean las variables que se habían guardado anteriormente.
Todas las variables registradas son almacenadas tras finalizar la petición. Las variables que están indefinidas se marcan como no definidas. En los subsiguientes accesos, no estarán definidas por el módulo de sesiones a menos que el usuario las defina más tarde.
Las opciones de configuración track _vars y registrer_global influyen notablemente en la forma en que las variables de la sesión se almacenan y restauran.
Nota: A partir de PHP 4.0.3,track _vars siempre está activado.
Nota: A partir de PHP 4.1.0, $_SESSION está disponible como variable global, al igual que $_POST, $_GET, $_REQUEST y demás. Al contrario que $HTTP_SESSION_VARS, $_SESSION siempre es global. Por tanto, no se debe usar global para $_SESSION.
Si track _vars está activado y registrer_global está desactivado, sólo los miembros del vector asociativo global $HTTP_SESSION_VARS pueden ser registrados como variables de la sesión. Las variables restauradas de la sesión sólo estarán disponibles en el vector $HTTP_SESSION_VARS.
Ejemplo 1. Registrar una variable con track _vars activado 

<?php
session_start
();
if (isset(
$HTTP_SESSION_VARS['count'])) {
   
$HTTP_SESSION_VARS['count']++;
}
else {
   
$HTTP_SESSION_VARS['count'] = 0;
}
?> 
Se recomienda usar $_SESSION (o $HTTP_SESSION_VARS con PHP 4.0.6 o inferior) por seguridad y para hacer el código más legible. Con $_SESSION o $HTTP_SESSION_VARS, no es necesario usar las funciones session_register() / session_unregister() / session_is_registered(). Los usuarios pueden acceder a una variable de la sesión como si se tratase de una variable normal.
Ejemplo 2. Registrar una variable con $_SESSION. 

<?php
session_start
();
// Use $HTTP_SESSION_VARS con PHP 4.0.6 o inferior
if (!isset($_SESSION['count'])) {
    
$_SESSION['count'] = 0;
} else {
    
$_SESSION['count']++;
}
?>

Ejemplo 3. Borrar una variable con $_SESSION.
<?php
session_start
();
// Use $HTTP_SESSION_VARS con PHP 4.0.6 o inferior
unset($_SESSION['count']);
?>
Si register_globals está activado, todas las variables globales pueden ser registradas como variables de la sesión, y las variables de la sesión serán restauradas a sus correspondientes variables globales. Como PHP debe saber qué variables globles están registradas como variables de la sesión, los usuarios deben registrar las variables con la función session_register(), mientras que con $HTTP_SESSION_VARS/$_SESSION no es necesario usar session_register().

Hola, visitante. Has visto esta p&aacute;gina <?php echo $count; ?> veces.

<?php
# el <?php echo SID?> (Se puede usar <?=SID?> si short tag est&aacute; activado)
# es necesario para conservar el session id
# en caso de que el usuario haya desactivado las cookies
?>

Para continuar, haga click <A HREF="nextpage.php?
<?php echo SID?>">aqu&iacute;</A>.
El <?=SID?> no es necesario si se ha usado --enable-trans-sid al compilar PHP.
Nota: Se asume que las URLs no relativas apuntan a sitios web externos, y por tanto no se añade el SID, ya que pasar el SID a un servidor diferente podría ocasionar un agujero de seguridad.
Para implementar el almacenamiento en bases de datos o en otro tipo de almacenamiento, necesitará usar session_set_save_handler()() para crear una colección de funciones de almacenamiento a nivel de usuario.


No hay comentarios:

Publicar un comentario