26 - Creación y lectura de una cookie

El protocolo HTTP es desconectado. Esto significa que cada vez que solicitamos una página a un servidor representa una conexión distinta.

Una cookie es una pequeña cantidad de datos almacenada por el navegador del usuario cuando solicita una página a un servidor. El que envía que se genere la cookie es el servidor.

Una cookie consta de un nombre, un valor, una fecha de expiración y un servidor. Una cookie está limitada a 4KB.

Luego que una cookie es creada sólo el sitio que la creó puede leerla. Luego de creada una cookie, cada vez que el navegador del usuario visita el sitio, se envía dicha cookie. Otra cosa importante que hay que tener en cuenta es que el usuario del browser puede configurar el mismo para no permitir la creación de cookies, lo que significa que el uso de cookies debe hacerse con moderación y cuando la situación lo requiera. De todos modos, el 99% de los navegadores están configurados para permitir la creación de cookies.

Para la creación de una cookie desde PHP debemos llamar a la función setcookie.

Los parámetros de esta función son:

setcookie( <nombre de la cookie>, <valor de la cookie>, <fecha de expiración>, <carpeta del servidor>) 

Con un problema sencillo entenderemos el uso de esta función. Supongamos que queremos que los usuarios que entran a nuestro sitio puedan configurar con qué color de fondo de página quiere que aparezca cada vez que ingresa al sitio. Al color seleccionado por el visitante lo almacenaremos en una cookie. En caso que no exista el color, por defecto es blanco.

La primera página mostrará un formulario con tres controles de tipo radio para la selección del color. También esta página verificará si existe la cookie creada, en caso afirmativo fijará el fondo de la página con el valor de la cookie. Tengamos en cuenta que la primera vez que ejecutemos este programa la página es de color blanco, luego variará según el color seleccionado en el formulario.

El código de la primera página es:

pagina1.php
<html>
    <head>
        <title>Problema</title>
    </head>
    <body <?php if (isset($_COOKIE['color'])) echo " style=\"background:$_COOKIE[color]\"" ?>>
        <form action="pagina2.php" method="post">
            Seleccione de que color desea que sea la página de ahora en más:<br>
            <input type="radio" value="rojo" name="radio">Rojo<br>
            <input type="radio" value="verde" name="radio">Verde<br>
            <input type="radio" value="azul" name="radio">Azul<br>
            <input type="submit" value="Crear cookie">
        </form>
    </body>
</html> 

El formulario no varía en nada respecto a otros vistos. Lo más importante es el bloque PHP que verifica si ya existe la cookie en el navegador del cliente. Es importante entender que la primera vez que ejecutemos esta página la cookie no existe, por lo que el if se verifica falso:

<body <?php if (isset($_COOKIE['color'])) echo " style=\"background:$_COOKIE[color]\"" ?>> 

El vector asociativo $_COOKIE almacena todas las cookies creadas por el visitante. Si es la primera vez que peticionamos esta página, el vector $_COOKIE no tendrá elementos.

Es decir que la marca body no tiene inicializada la propiedad style.

La segunda página es la que crea la cookie propiamente dicha:

<?php
if ($_REQUEST['radio'] == "rojo")
  setcookie("color", "#ff0000", time() + 60 * 60 * 24 * 365, "/");
elseif ($_REQUEST['radio'] == "verde")
  setcookie("color", "#00ff00", time() + 60 * 60 * 24 * 365, "/");
elseif ($_REQUEST['radio'] == "azul")
  setcookie("color", "#0000ff", time() + 60 * 60 * 24 * 365, "/");
?>
<html>
    <head>
        <title>Problema</title>
    </head>
    <body>
        Se creó la cookie.
        <br>
        <a href="pagina1.php">Ir a la otra página</a>
    </body>
</html> 

La llamada a la función setcookie debe hacerse antes de imprimir cualquier etiqueta HTML, de lo contrario no funcionará.

Como podemos observar, la creación de la cookie se hace llamando a la función setcookie:

<?php
if ($_REQUEST['radio'] == "rojo")
  setcookie("color", "#ff0000", time() + 60 * 60 * 24 * 365, "/");
elseif ($_REQUEST['radio'] == "verde")
  setcookie("color", "#00ff00", time() + 60 * 60 * 24 * 365, "/");
elseif ($_REQUEST['radio'] == "azul")
  setcookie("color", "#0000ff", time() + 60 * 60 * 24 * 365, "/");
?> 

El nombre de la cookie se llama «color» y el valor que almacenamos depende de que control de tipo radio esté seleccionado en la página anterior. La fecha de expiración de la cookie la calculamos fácilmente llamando a la función time() que nos retorna la fecha actual en segundos y le sumamos el producto 60*60*24*365 (60 segundos * 60 minutos * 24 horas * 365 días) es decir que la cookie existirá en la máquina del visitante hasta el año próximo.

Cuando indicamos como directorio la sintaxis «/» significa que la cookie se crea a nivel del sitio y con cuaquier petición a dicho sitio, el navegador enviará la cookie al servidor.

Por último dispusimos en esta página un hipervínculo a la página anterior, para ver que, de ahora en más, cada vez que ejecutemos la pagina1.php, el color de fondo de la misma dependerá del valor de la cookie registrada.