# Conservar información a través de distintas páginas

## Introducción: Cabeceras de HTTP

Funcionamiento de una conexión:

Al pedir un usuario una página nueva el explorador se comunica con el servidor para obtenerla. Esto se realiza en tres pasos mediante el protocolo de red HTTP (Hypertext Transfer Protocol): Establecer la conexión, realizar la transferencia y cerrar la conexión. Durante el establecimiento de la conexión se envía una cierta información que puede ser de gran utilidad como es la dirección IP, versión del explorador, sistema operativo, etc. Todo esto se envía por medio de cabeceras y es este el momento en el que el servidor puede enviar la orden de crear una cookie para que el explorador genere una variable en el ordenador del usuario o iniciar una sesión. Es también en este momento cuando el explorador envía todas las cookies que tiene almacenadas. Una vez se pasa a la parte de transferencia del contenido de una página ya no se puede hacer nada con las cookies ya que se ha terminado el tiempo de transferencia de cabeceras. Por este motivo, cuando se desee enviar una cabecera, crear una cookie o iniciar una sesión, esto se debe hacer al principio del todo, antes de enviar cualquier otro contenido.

Existe una función de PHP que permite controlar en cierta medida las cabeceras que se envían durante la conexión mediante el protocolo HTTP antes del envío del contenido de una página. Existen una gran variedad de cabeceras que se pueden enviar siguiendo el formato de la función header:

booleano header (string cabecera_http; bool reemplazar, entero respuesta)

Campos de la función header
Nombre | Tipo | Descripción
cabecera_http | string | Cabecera de HTTP que se envía
remplazar / respuesta | booleano / entero | Campos opcionales.

Las cabeceras que más nos van a interesar son:

- Location: Esta cabecera se usa para redireccionar a una página concreta.

  Redireccionamiento
      header("Location: Inicio.htm");
  | Esta función redireccióna a la página del servidor "inicio.htm"

- WWW-Authenticate: Esta cabecera se pude usar para que se realice una identificación de los usuarios antes de terminar la conexión. Será muy útil para entornos con seguridad.

      header("WWW-Authenticate: Basic realm=\"Conjunto\"");
  | Se establecerá un diálogo de identificación del usuario. Los resultados se almacenarán en el array $_SERVER

  Ejemplo 1: Identificación de usuarios
      <?php
      if(isset($_SERVER['PHP_AUTH_USER']) AND ($_SERVER['PHP_AUTH_USER'] == "leon" ) AND ($_SERVER['PHP_AUTH_PW'] == "leon2" )) {
          print("<html>\n<body>\n<h1>hola 1</h1>\n</body>\n</html>");
      } else {
          header("WWW-Authenticate: Basic realm\"agenda2\"");
          header("HTTP/1.0 401 Unauthorized");
          print("Lá página está protegida");
      }
      ?>

Este método de identificación no es demasiado bueno ya que no permite un "log out" del usuario y además sólo es válido con el servidor Apache. Información acerca de este tema se puede consultar aquí.

- HTTP/1.0 401 Unauthorized: Esta cabecera redirecciona al usuario a una página de error por no haberse identificado.

Volver al principio de la página

## Cookies

### Introducción

Las cookies (o “galletas”) son un método de para con el que se pueden guardar variables en el ordenador del usuario. Dichas variables se podrán utilizar para personalizar el contenido de las páginas a cada uno de los usuarios que accedan a ellas. Una utilidad frecuente son las páginas comerciales en las que se consiguen seleccionar los productos que el usuario está buscando.

El número máximo de cookies por servidor son 20 y en total un explorador tiene permitido llevar hasta 300. De todos modos no es demasiado aconsejable el abuso de cookies ya que son información que se debe enviar al principio y que ralentiza la comunicación. Pongamos por caso que tenemos 10 cookies de 1K, entonces se deberían enviar 10K extra de información. Por otro lado, el usurario puede tener deshabilitadas las cookies por lo que no funcionarían.

Aquí se puede encontrar información sobre las cookies.

Volver al principio de la página

### Creación de una cookie

La forma de crear una cookie es:

booleano setcookie(string nombre, string valor, int vence, string path, string domain, int seguridad)

Campos de la función setcookie()
Nombre | Tipo | Descripción
nombre | string | Nombre del fichero cookie
valor | string | Dato para guardar
vence | entero | Fecha que define el tiempo de vida de la cookie.
path y domain | string | Con estos dos campos el explorador determina si enviar la cookie o no. Se trata de las carpetas válidas dentro del servidor y el domino al que se corresponden.
seguridad | booleano | Si verdadero la cookie sólo será mandada cuando la comunicación sea segura.

Ejemplos:

    setcookie(“Prueba”, $valor)
| Se crea un cookie llamado prueba.
    setcookie(“Prueba”, $valor,time()+3600)
| Ahora además se le da 1 hora de vida.
    setcookie(“Prueba”, $valor,time()+3600,”/pruebas/”,”.undominio.com”,1)
| En este caso se establece la cookie para las páginas que estén en la carpeta pruebas del servidor y que estén en el dominio “.undominio.com”

Volver al principio de la página

### Lectura de una cookie

El cookie se puede leer directamente en el array $_COOKIE[“nombre_cookie”]. También se puede encontrar en el array $_REQUEST[“nombre_cookie”].

Lectura de una cookie
    $galleta = $_COOKIE[“Prueba”];
| Se lee una cookie llamada Prueba.

Volver al principio de la página

### Borrar una cookie

La cookie se borra con el mismo formato que al crearse pero con un tiempo negativo, o simplemente con el valor de la cookie.

Borrar una Cookie
    setcookie(“Prueba”,” ”,time()-3600);
| Se borra la cokie
    setcookie(“Prueba”);

Ejemplo:

Ejemplo 1a: Creación y lectura de una Cookie
    <?php
    //Creación y lectura de una cookie
    $valor="Hola, esto es una galleta.";
    setcookie("Prueba",$valor,time()+3600);
    ?>
    <html>
    <body>
    <p><strong>La cookie contiene:</strong>
    <?php
    print $_COOKIE["Prueba"];
    ?>
    </p>
    </body>
    </html>
| La cookie contiene: Hola esto es una galleta.

Para comprobar la anterior página se puede hacer uso de la siguiente:

Ejemplo 1b: Comprobación del ejemplo1a
    <html>
    <body>
    <p><strong>¿Se recibe la cokie?</strong></p>
    <p>
    <?php
    //Comprobación de la cookie.
    print $_COOKIE["Prueba"];
    ?>
    </p>
    </body>
    <html>
| ¿Se recibe la cookie? Hola esto es una galleta.

En el caso de que en la entrada path se ponga el nombre de un directorio (“/7L/prueba/”) la cookie no se envía a páginas que estén contenidas en directorios superiores. Es decir que si guardamos el ejemplo 1b en la carpeta www este no podrá ver la cookie.

Volver al principio de la página

### Crear una Cookie vector

Simplemente hay que ir introduciendo uno a uno cada uno de los elementos del vector indicándolo entre corchetes. Por ejemplo, para una cookie llamada “vectorGalleta” con tres valores se haría de la siguiente forma:

Creación del vectorGalleta.
    setcookie(“vectorGalleta[0]”,$valor1,time()-100);
    setcookie(“vectorGalleta[1]”,$valor2,time()-100);
    setcookie(“vectorGalleta[2]”,$valor3,time()-100);
| Se crea un vector cokie de tres elementos

Volver al principio de la página

## Sesiones

### Introducción

Otra alternativa para mantener información a través de distintas páginas es la incorporación de sesiones. En este caso la información se almacena principalmente en el servidor donde se guarda una sesión distinta para cada uno de los usuarios que accedan a la página.

Funcionamiento:

Por cada usuario se asigna un identificador conocido como id de sesión. Este identificador se guarda en forma de cookie en el ordenador del usuario o, si éste tiene las cookies deshabilitadas, se introduce como parte de la dirección URL. Una vez se recibe el identificador en el servidor este ya podrá acceder a toda la información que tenga almacenada en la sesión.

Para ampliar conocimientos de sesiones puedes acudir aquí.

Volver al principio de la página

### Puesta en marcha

La puesta en marcha puede ser automática si así se configura en la variable session.auto_start del fichero php.ini. Si no está activado su arranque automático se puede arrancar mediante la función:

booleano session_start()

Esta función comprueba si el usuario ya tiene una sesión en marcha y si no es así crea una. La función devuelve siempre TRUE.

Una vez puesta en marcha la sesión se pueden crear variables introduciéndolas en el vector $_SESSION.

Almacenar información en una variable de sesión
    $_SESSION[“nombre_dato”] = 1;
| Se guarda el valor 1 en la variable de sesion “nombre_dato”

Volver al principio de la página

### Lectura de las variables

La lectura de las variables se hace a través del vector $_SESSION, accediendo a las distintas variables al introducir su nombre como puntero dentro del vector.

Acceso a una variable de sesión
    $dato = $_SESSION[“nombre_dato”];
| Se gurada la variable de sesion “nombre_dato” en la variable $dato.

Volver al principio de la página

### Borrar variables

Las variables que se han usado en la sesión se pueden borrar por medio de la función unset().

Void unset(mixed variable)

Borrar una variable de sesión
    unset($_SESSION[“nombre_dato”]);
| Se borra la variable “nombre_dato”

Volver al principio de la página

### Cerrar una sesión

Para cerrar una sesión el usuario deberá cerrar todas las ventanas del navegador que haya abierto o bien se puede realizar mediante el comando session_destroy();

Volver al principio de la página

### Ejemplos

Ejemplo 2: Contador del número de accesos a una página
    <?php
    //contador del número de accesos a una página por sesión.
    session_start();
    if (!isset($_SESSION['count'])) {
        $_SESSION['count'] = 0;
    } else {
        $_SESSION['count']++;
    }
    ?>
    <html>
    <head>
      <title>Contador de accesos</title>
    </head>
    <body>
    <p>
    <?php
    print("Hola, has accedido a esta página ");
    print($_SESSION["count"]);
    print(" veces.");
    ?>
    </p>
    </body>
    </html>
| Hola, has accedido a esta página 2 veces.

Ejemplo 3a: Configuración personalizada de los colores de una página.
    <?php
    session_start();

    if (!isset($_SESSION['bgcol'])) {
        $_SESSION['bgcol'] = 0;
    }

    if (!isset($_SESSION['textCol'])) {
        $_SESSION['textCol'] = 0;
    }

    if(isset($_POST['enviar'])) {
        $bgCol = traduce($_POST['nbgCol']);
        $textCol = traduce($_POST["ntextCol"]);
        $_SESSION["bgCol"] = $bgCol;
        $_SESSION['textCol'] = $textCol;
        print "<html>\n<head>\n<title>Elección de colores</title>\n</head>\n";
        print("<body bgcolor='$bgCol' text=\"$textCol\">");
    } else {
        print "<html>\n<head>\n<title>Elección de colores</title>\n</head>\n<body>";
    }

    function traduce($color)
    {
        switch ($color) {
            case "rojo" : return "red";
            case "verde" : return "green";
            case "azul" : return "blue";
            case "cian" : return "cyan";
            case "amarillo" : return "yellow";
        }
    }
    ?>

    <h2>Elige los tus colores favoritos</h2>
    <form action='<?php echo($_SERVER["PHP_SELF"]) ?>' method='post'>
      <p>Color de fondo:
        <select name='nbgCol'>
          <option>rojo</option>
          <option>verde</option>
          <option>azul</option>
          <option>cian</option>
          <option>amarillo</option>
        </select></p>
      <hr />

      <p>Color del texto:
        <select name='ntextCol'>
          <option>rojo</option>
          <option>verde</option>
          <option>azul</option>
          <option>cian</option>
          <option>amarillo</option>
        </select></p>
      <p><input type='submit' name='enviar' /></p>
    </form>
    </body>
    </html>

## Ampliación: Sesiones y Cookies en ASP

Las Cookies y las Sesiones también están implementadas en el lenguaje ASP. En el caso de las Cookies se manejan cómodamente con los objetos de comunicación Response y Request al llamar al procedimiento Cookies. Se utilizará el objeto Response para crear la cookie y mediante el objeto Request se leerán las cookies que se envían desde el usuario.

Ejemplo 4: Manejo de Cookies con ASP.
Response.Cookies("País") = "España" | Se crea una Cookie llamada País en la que se almacena la cadena "España".
Request.Cookies("País") | Se lee el valor de la Cookie País.

Las Sesiones sin embargo son un nuevo tipo de objetos con sus propiedades y procedimientos. En este caso también es sencillo retener a información de la sesión. Además se puede acceder a las propiedades del objeto para obtener información adicional como la Id de la sesión o en número de variables que hay almacenadas. Adicionalmente existen unos sucesos que pueden ser de utilidad (Session_OnStat y Session_OnEnd) ya que premiten la realización de determinadas funciones al empezar o terminar una sesión.

Ejemplo 5: Manejo de sesiones en ASP.
Session("Color") = "Rojo" | Se almacena el valor "Rojo" en la variable de sesión Color.
Session.Contents.Count | Se cuenta cuántas variables de sesión existen.
Session.Contents.Count.(j) | Se accede a la variable "j-ésima" de la sesión.

Existe además otra utilidad que incorpora el lenguaje ASP, se trata de la Aplicación. Básicamente consiste en un mecanismo por el cual se premite la compartición de información por varios usuarios en una determinada sesión. De esta manera, cuando varios usuarios están accediendo simultáneamente al mismo servidor, podrán compartir información.

Volver al principio de la página

Esta obra está bajo una licencia de Creative Commons.