Programación Web » Aprender PHP y MySQL » Unidad 6. Cookies en PHP:

Almacenar variables en cookies

logo php

En una cookie se puede almacenar muy pocos datos (hasta un máximo de 4093 caracteres por cada cookie), y solo es posible almacenar hasta 20 cookies por dominio (esto es importante tenerlo presente por si en distintas sesiones de nuestro sitio hacemos uso de cookies), y un navegador solo puede almacenar hasta 300 cookies en total, compartidas entre todos los sitios que ese usuario visita (de lo contario, el navegador empezara a eliminar las cookies más antiguas, lo que constituye la razón de que algunos sitios que usan cookies para recordar nuestros datos, nos vuelvan a pedir una y otra vez que nos identifiquemos, periódicamente: es porque su cookie fue borrada , desplazada por otras cookies mas nuevas de otros sitios que fuimos visitando).

Debido a esa "escasez" de recursos de las cookies, es muy común almacenar únicamente un código en la cookie, para que identifique a ese usuario en ese navegador en esa computadora, y el resto de los datos asociados se almacena en el servidor (en el hosting, generalmente en base de datos).

Un antigua mito (más de diez años, ¡una eternidad en la historia de la web!) genera toda clase de rumores en torno a las cookies: se dice que revelan nuestros datos privados, que espían nuestra computadora, y muchas otras fantasías, causadas por el desconocimiento de sus verdaderos límites.

La única capacidad real de una cookie es la de almacenar algunos pocos datos en variables, que luego podremos utilizar cuando, desde la misma máquina y usando el mismo navegador, ese usuario ingrese nuevamente a nuestra página web.

Este detalle casi trivial merece ser recalcado: no es el usuario en sí, y ni siquiera es la computadora del usuario la que queda identificada, sino apenas el navegador que se utilizo; si desde la misma computadora ingresara el mismo sitio web el hermano o el compañero de trabajo de nuestro usuario utilizando el mismo navegador , lo confundiéramos con nuestro usuario. Y, por el contrario, si el mismo usuario ingresa usando otro navegador, o desde otra computadora, no lo reconoceremos… y algo más: solamente se puede leer la cookie desde el dominio que la creo, así que de "espionaje", poco y nada. Salvo en caso demasiado sofisticado, que solo son posibles para grandes empresas de publicidad online, que hospedan sus banner en un mismo dominio pero los publican en distintos sitios y, de esta manera, detectan el código de su cookie a lo largo de varios sitios, y pueden llevar estadísticas del perfil de visitas de un usuario: si visito tal diario, y luego tal otro sitio de remates, etc. Pero eso únicamente crea perfiles para mostrar publicidades afines al usuario, y no datos individualizables con nombre y apellido (salvo excepciones que, como las brujas, no existen, pero "que las hay, las hay…" aunque requieren que algunos de los sitios de la cadena compartan sus bases de datos, algo que entra en el terreno de lo legal más que de la programación).

Existen algunas consideraciones a tener en cuenta antes de pasar al código.

Las cookies se generan a través de una orden de que debe llegar al navegador del usuario antes de que este procese el código HTML que nos hará ver una página en nuestra pantalla. Para lograr esto, la orden para la creación de la cookie debe viajar en el header o encabezado de la dirección HTTP que nos trae el archivo HTML, desde el servidor hacia el navegador; por lo que la ejecución de la función que crea un archivo de cookies debe ser anterior a cualquier código HTML o a cualquier echo de PHP que ya en la página (igual que con las sesiones, como veremos pronto), para que llegue dentro de los encabezados de la petición HTTP.

En el siguiente ejemplo veremos cuál sería la ubicación del código que crea una cookie:

<?php
setcookie("nombre" ,"Juancito");
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtmll-strict.dtd">
<html ...etc ...
</html>

Analicemos el código precedente. La función setcookie, incluida en el lenguaje PHP, recibe como primer "argumento" (primera cosa dentro de sus paréntesis) el nombre de la variable que se almacenara en la cookie y, como segundo argumento (separado por una como del argumento anterior), el dato que desea almacenarse dentro de esa variable, que el navegador guardara en un archivo de texto de la computadora del usuario:

Setcookie("nombre", "Juancito");

La función setcookie permite especificar varios otros argumentos dentro de sus paréntesis, pero son todos opcionales:

Setcookie(nombre , valor, duracion, ruta, dominio, seguridad)

Algunos de ellos los veremos algunos párrafos más adelante. Pero con esos dos datos (el nombre de la variable y su valor), separados por comas y envueltos entre comillas, es suficiente para crear una cookie y guardar un dato.

Este ejemplo, que define una variable denominada "nombre" con el valor "Juancito", ha creado realmente una cookie (probemos de ejecutarlo en nuestro servidor local, o en nuestro hosting). Como no se ve nada especial en la pantalla, nos queda la duda: no sabemos si se a logrado crear esta cookie, o no…

Afortunadamente, es my fácil comprobar si se creo, o no: podemos ver con nuestro propio navegador todas las cookies que ese navegador ha almacenado, y cuál es el valor que guarda dentro cada una de ellas.

En cada navegador es diferente la forma de acceder a las cookies; por ejemplo, en Firefox, accedemos entrando al menú Herramientas →Opciones →Privacidad→ Eliminar cookies de forma individual, que nos muestra el listado de cookies que existe en ese navegador, así como su contenido, su fecha de expiración y otras informaciones complementarias.

En este caso, se vería de esta manera:

Cookie almacenada y su valor

De esta forma, verificamos si la cookie fue creada y con que valor. Esto es muy útil mientras programamos y necesitamos detectar si funciono nuestro código o si hubo errores. Pero por supuesto, la forma más usual de trabajar con los datos guardados en las cookies es la de leerlos y utilizarlos directamente desde los código PHP que programemos en nuestras pagina y que aprenderemos a continuación.

Leer variables de cookies

Vamos a tratar de entender como es el circuito de lectura de una dentro que estaba en una cookie. Como dijimos, la cookie es renviada automáticamente por el navegador hacia el servidor (hosting) cada vez que el navegador detecta que se esta realizando una petición a una URL de un dominio que ya tiene almacenada una cookie en ese mismo navegador, es decir, en cuanto pulsamos un enlace, despachamos un formulario o escribimos una URL y pulsamos enter, si cualquiera de estas tres acciones apunta hacia un sitio que anteriormente nos guardo una cookie, en ese mismo instante, nuestro navegador envía hacia el servidor las variables contenidas en la cookie correspondiente a ese sitio (las vaya a usar o no en ese servidor, que no es cuestión que le interese al navegador, él solo las envía sin preguntar), sin necesidad de que tengamos que hacer nada especial, todo sucede de forma invisible y automática.

Esas variables almacenadas en cookies que se envían hacia el servidor, se almacenan por el servidor Web es una matriz, al igual que sucedía con los datos enviados por enlaces get o por formulario post, solo que esta vez la matriz se llama $_COOKIE.

Imaginemos un ejemplo: en una de nuestras páginas, le pedimos al usuario que mediante un formulario complete su nombre,y lo guardamos en su propia máquina, en una variable de cookie llamada "nombre". luego cuando hagamos un echo $_COOKIE["nombre"] en cualquier otro momento y desde cualquiera de las páginas de nuestro sitio, esto será posible gracias a que el navegador ya leyó en le disco rígido de usuario esta variable y la reenvío automáticamente hacia el servidor.

Esto nos ahorra espacio de almacenamiento en nuestra base de datos, y causa la impresion de estar "reconociendo" a nuestros usuarios en cuanto entran a nuetro sitio... aunque lo que en verdad se reconoce es el archivo que hemos dejado guardado en esa computadora.

Por lo tanto, podemos concluir que la informacion guardada en cookies:

  • Perdura más tiempo de lo que dura el simple proceso de una pagina PHP (ya veremos que es posible definir cuánto tiempo durará antes de que el navegador la elimine automáticamente, aunque siempre exista la posibilidad de que sea el propio usuario el que elimine sus cookies antes del tiempo previsto).
  • Las cookies creadas en algunas páginas de nuestro sitio, se pueden leer desde otras paginas PHP de nuestro propio sitio (lo que permite identificar, a lo largo de varias páginas, a ese visitante, siempre hablando de páginas PHP dentro de un mismo dominio, nunca de otro distinto).

Volviendo al código, para utilizar los datos almacenados en una cookie en nuestras páginas (en la misma que la creó, o en otras páginas del mismo dominio), simplemente debemos mostrar una celda de la matriz $_COOKIE.

Probemos con la creación de esta página, y llamémosla inicial.php:

<?php
setcookie ("mi variable", "datos, datos y más datos", time()+60);
//Recordemos que esto es imprescindible que esté al inicio del archivo
?>
<!DOCTYPE html PUBLIC "-//W3C// DTC XHTML 1.0 strict// EN2
" http: // www.w3. Org/ TR/ xhtm11 /DTD/ xhtm11-strict.dtd">
<html>
<head>
… etc…
</head>
<body>
<h1> ¡ya se creó la cookie!<h1>
</body>
</html>

Mediante el código, definimos en la máquina del usuario una variable denominada "mivariable", en la que guardamos un texto que dice "datos, datos y más datos" .

El tercer argumento de la función setcookie especifica la duración o el momento de vencimiento de la cookie; es decir, cuándo el navegador del usuario deberá eliminar el archivo de texto de su disco rígido.

En este caso, se ha pasado como tercer argumento el instante actual (la función time(), tema que veremos más adelante en este artículo) más 60 segundos, esto significa que luego de un minuto se autodestruirá esa cookie. Si la intentamos leer pasados los 60 segundos, no estará disponible el dato, ya no existirá (si no especificamos ningún momento de borrado, la cookie se eliminará automáticamente en cuanto el usuario cierre su navegador).

Si lo queremos probar luego de ejecutar una vez el código que creé a la cookie, ingresemos con muestro navegador en otra página de nuestro ismo servidor que contenga la lectura de esa variable, podríamos llamarla otra-pagina.php, y contendría algo así:

<¡DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 strict //EN"
"http: www.w3 .org/ TR/xhtm11//DTD/XHTML11-strict.dtd">
<html>
<head>
…etc…
</head>
<body>
<h1>
<?php
If (isset ($_COOKIE["mivariable"] ) ) {
echo "La cookie contiene: ";
echo $_ COOKIE [ " mivariable"];
} else {
Echo " Parece que no pasó por la pagina inicial. Php,
Vuelva a ella asi de crea la cookie. " ;
}
?>
</h1>
</body>
</html>

Si en lugar de hacer en dos páginas diferentes este uso de datos de cookies, quisiéramos hacerlo en una sola página, el código sería similar al siguiente(podemos llamar a esta página en-una-sola.php):

<?php
If (isset ($_COOKIE ["mivariable"])) {
// Sí no está presente, la creamos:
setcookie ("mivariable", "datos,datos y más datos", time()+60);
}
?>
<!DOCTYPE html PUBLIC "- //W3C//DTD XHTML 1.0 Strict // EN"
"http: //www.w3.org/ xhtm11 / DTD/ xhtm11-strict.dtd">
<html>
<head>
…etc…
</head>
<body>
<h1>
<?php
If ( isset ($_COOKIE[ "mivariable"] ) ) {
// si está disponible, la usamos:
echo "La cookie contiene: ";
echo $_COOKIE ["mivariable"];
} else {
echo " Como es la primera vez que entra a esta página, acaba de enviarse al navegador la orden de crear la cookie, junto con este código y texto que está leyendo. Si vuelve a solicitar esta página otra vez pulsando F5, el navegador enviará hacia el servidor la cookie y podrá ser leída y utilizada.";
}
?>
</h1>
</boby>
</html>

NOTA: No podemos leer una cookie en el mismo momento en que ordenamos crearla con la función setcookie, sino que recién a partir de la siguiente petición al servidor, el valor de la cookie será enviado por el navegador hacia el servidor y allí podrá utilizarse.

servidor setcookie

Artículos de navegación

Acerca del Profesor

Adrián Delgado Rodríguez

Ingeniero en Computación, docente por convicción y apasionado por la programación Web.

Actualmente trabaja como Profesor para en el Centro Universitario de la Costa de la Universidad de Guadalajara y como Desarrollador Web.

Síguenos:

 

Ver el perfil completo de Hugo Adrián Delgado Rodríguez (akus.net).

Deja un comentario

avatar comentario
rey0101
Tengo dos programas en diferentes frameworks; Symfony y Ruby on Rails, cada uno tiene un login, pero tengo que hacer un solo login para que ingrese a ambos, ¿Cómo escribiria el código?. le coloque este pero me sigo logueando con los dos login. agradeceria mucho su ayuda, por favor.




Diseño de páginas Web en Puerto Vallarta y Bahía de Banderas akus.net
subir

Síguenos en Facebook

Artículo de la semana

Cómo iniciar una página WebMetodología para la creación de sitios

Comprende las fases de Análisis, Planificación, Contenido, Diseño. ¿Qué método utilizas?