Actualizado el 14-01-2007
versión para imprimir
PHP y cookies
PHP permite manejar cookies con gran sencillez. Las cookies son pequeños archivos de texto que nuestra página puede almacenar en el disco duro de los visitantes, y recuperar cuando vuelvan a visitarla.
La función para colocar una cookie es setcookie(), y su sintaxis:
setcookie(Nombre, Valor, Tiempo_Vida, Path, Dominio, Seguro);
El primer parámetro es, pues, el nombre de la cookie. Es el único valor estrictamente necesario, los demás son opcionales. Así, si establecemos al principio de nuestro script
<?php
setcookie("saludo");
?>
estamos lanzando una cookie llamada saludo, sin ningun valor. Automáticamente se establecen los parámetros por defecto tiempo de vida = lo que dure la sesion; path = el directorio actual (dependiendo del navegador); dominio = el dominio de la página; seguro = no.
Ten en cuenta que la instrucción para colocar la cookie ha de ir junto a las cabeceras http de la página, por tanto debes incluirla al comienzo del script, antes de que comience el volcado de html al usuario; de lo contrario dará error.
Para completar los dos primeros parámetros nombre_cookie = valor utilizamos:
<?php
setcookie("saludo", "hola");
?>
El nombre y valor de la cookie viajan y se almacenan como texto simple, por lo que si deseas utilizar cookies para datos sensibles, por ejemplo la contraseña de usuario, es mejor encriptarla.
También debes tener en cuenta que no puedes usar en el nombre de la cookie el punto y coma (;), la coma (,) o espacios en blanco ( ). Tampoco es conveniente usar caracteres fuera del ascii simple. Si precisas usar algunas de estas cosas puedes utilizar la función urlencode()
En cuanto a la longitud de los datos, en general toda la cookie no debe exceder de 4 K.
El tercer parámetro de la cookie es su tiempo de vida. Se especifica en segundos. Si no especificamos nada, solo dura la sesión (es decir, hasta que cerremos el navegador). Usamos la función time() seguida del numero de segundos:
<?php
// Esta cookie dura una hora. 1 hora = 3600 segundos
setcookie("visitas", "1", time() + 3600);
// Esta cookie dura un dia. 24 h = 86400 segundos
setcookie("visitas", "1", time() + 86400);
// esta cookie dura una semana.
setcookie("visitas", "1", time() + (7 * 86400) );
// esta cookie dura un año. 1 año = 31536000 segundos
setcookie("visitas", "1", time() + 31536000);
?>
Si te cuesta hacer el cálculo en segundos, aqui tienes una pequeña utilidad.
El cuarto y quinto parámetros de la cookie son el path y el dominio, es decir, la ruta o directorio y dominio desde la cual la cookie puede ser recuperada.
Si especificamos como valor del path "/", cualquier script en el servidor podrá recuperar su valor. Si especificamos un directorio, por ejemplo /man/, la cookie solo podrá ser recuperada por scripts en ese directorio (o desde sus subdirectorios). Y si usamos /man/php/, solo desde ese subdirectorio.
Sobre el path ha de tenerse en cuenta que iexplorer y netscape proporcionan distintos valores por defecto si no damos un valor expreso con setcookie. Iexplorer proporciona un valor "/", mientras que netscape suple la omisión indicando directorio y subdirectorio.
Mediante el quinto parámetro, dominio, podemos limitar el acceso a los subdominios que tengamos. Por ejemplo, si especificamos "ignside.net", la cookie podrá ser recuperada tanto desde http://ignside.net como de www.ignside.net o dev.ignside.net.
El último parámetro seguro establece que la cookie solo puede ser mandada si existe una conexión segura (https)
Este parámetro se indica mediante un 1 (seguro=true) o un 0 (secure=false)
<?php
setcookie("visitas", "7", time() + 86400, "", "",1);
?>
Añadir que la función setcookie devuelve un 1 o un 0 segun se haya ejecutado con éxito, aunque que la función se haya ejecutado correctamente no implica que la cookie haya sido aceptada por el navegador del usuario. Esto solo puedes comprobarlo leyendo la cookie.
leyendo cookies
No puedes recuperar (leer) la cookie colocada al visitante hasta que no recarga la página.
Las cookies son recuperadas automaticamente por el script cada vez que se carga una página (son enviadas como cabeceras http por el server). Desde la versión 4.1 de PHP podemos recuperar las cookies con $_COOKIE['nombre_cookie']. Se trata de un array autoglobal, accesible desde cualquier parte del script. Este es el método recomendado. Por ejemplo:
<?php
echo $_COOKIE['saludo'];
?>
También podemos recuperar las cookies con $HTTP_COOKIE_VARS que, a diferencia del anterior, no es autoglobal. $HTTP_COOKIE_VARS y $_COOKIE son variables diferentes.
Por último, si tenemos PHP configurado con register_globals on, se crean también variables individuales (en nuestro ejemplo, $saludo). Este último método es desaconsejado.
Para borrar usualmente basta con colocar otra con su mismo nombre sin ningun parámetro mas, por ejemplo:
<?php
setcookie ("saludo");
//borra la cookie saludo
?>
Pero este sistema a veces falla (por ejemplo algunos navegadores no borran la cookie si no coincide el path). Por ello la forma mas segura de borrar una cookie es colocar otra nueva, con el mismo nombre, sin valor, mismo path y nombre de dominio (si se especificaron) y con un tiempo de vida negativo, por ejemplo time() - 3600.
Con php 3 las cookies se mandaban al servidor en sentido inverso, asi que si deseabas borrar una cookie y colocar otra con el mismo nombre, primero debias crear la cookie y luego borrarla. PHP 4 maneja el orden de las cookies en el orden correcto: primero deber borrar la cookie vieja y luego crear la nueva.
Finalmente si quieres acceder inmediatamente a la cookie, puedes recargar la página antes de enviarla al usuario, asi:
<?php
if(!isset($COOKIE_SET)) // $cookie_set es nuestra variable de control
// de flujo
{
setcookie("saludo", "hola");
header("Location: $PHP_SELF?COOKIE_SET=1"); // ponemos cookie_set
exit; // como true
} // podriamos haber redireccionado a otra pagina
?>
Lecturas adicionales sobre el tema
No existe ningun standard oficial sobre las cookies, asi que existen peculiaridades en como son tratadas por distintos tipos de servidores y distintos tipos de navegadores.
Netscape ofrece su especificación preliminar sobre la materia. El IETF propone dos rfcs (request for comments) sobre cookies: la 2109 y la 2965. Por ultimo, con carácter mas general, puedes obtener información sobre cookies en cookiecentral o en privacy.net