Aprendiendo PHP, parte 20: Cookies

Hasta ahora hemos aprendido cómo enviar información de una página a otra por medio de los formularios, y recuperar esos valores mediante las variables $_GET y $_POST. Sin embargo en una aplicación web siempre se necesita mantener información de los visitantes de nuestra página en forma persistente, osea entre página y página, para así tener un control de esta información.

Existen dos formas de lograr esto, mediante las cookies y las sesiones. En esta publicación veremos la primera, cookies, que como decíamos antes permiten guardar la información de los usuarios y así por ejemplo saber si el visitante ya ha ingresado a nuestro sitio o es la primera vez.

Ahora, qué es una cookie, probablemente lo sepas, pero si no es así, simplemente te diré que las cookies son información que se guardan en nuestro navegador. Por tanto el servidor guardará esta información en el cliente, la eliminará o bien, preguntaré si la misma existe.

Para crear una cookie debemos utilizar la función de PHP:

setcookie()

Esta puede recibir siete parámetros, los dos primeros son obligatorios. El primero es el nombre de la cookie y el segundo el valor. El tercer parámetro es la fecha UNIX hasta donde durará la misma. El cuarto el path en donde estará disponible la cookie. El quinto, el dominio, por ejemeplo mipagina.com. El sexto es si esa cookie debe crearse mediante una conexión segura, osea «https», de ser true tomará esta regla. Y el séptimo, significa que ésta sólo será creada mediante el protocolo HTTP, para evitar ataques de scripting como Javascript.

Crear cookie

setcookie('nombre', 'Juan', time() + 86400, '/');

En este caso guardaremos una cookie que se llamará ‘nombre’ y tendrá un valor ‘Juan’, que durará un día, osea sumamos a la función time(), que recordemos nos devolverá la fecha y hora UNIX del momento y le sumamos 86400 (la cantidad de segundos que tiene un día) Y finalmente el path donde estará disponible la cookie, al ser el valor ‘/’, la misma se encontrará en todo el sitio.

Acceder a una cookie

Para acceder a una cookie, por ejemplo la que creamos antes:

$_COOKIE['nombre']

Eliminar cookie

Para eliminarla, simplemente tenemos que llamar a la función setcookie(), como cuando la creamos, pero en lugar de sumar segundos a la fecha UNIX, le restamos a la fecha actual:

setcookie('nombre', 'Juan', time() - 86400, '/');

Ahora veremos un pequeño ejemplo, para ello crearemos una pequeña aplicación con tres archivos: index.php, guardar_nombre.php y eliminar_nombre.php.

Vamos a editar el código de index.php de la siguiente forma:

<?php
   $nombre = (isset($_COOKIE['nombre'])) ? $_COOKIE['nombre'] : null;
?>
<!DOCTYPE html>
<html>
 <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title> Página de bienvenida </title>
 </head>
 <body>
    <?php if ($nombre): ?>
       <h1> Bienvenido/a <?php echo $nombre ?> </h1>
       <p> ¿Qué querés hacer? <a href="guardar_nombre.php"> Cambiar mi nombre </a> | <a href="eliminar_nombre.php"> Eliminar mi nombre </a> </p>
    <?php else: ?>
       <h1> Bienvenido/a usuario desconocido </h1>
       <p> <a href="guardar_nombre.php"> Seleccionar un nombre para identificarme </a> </p>
    <?php endif; ?>
 </body>
</html>

En primer lugar preguntamos si existe una cookie llamada ‘nombre’, y de serlo así guardamos el valor en una variable, pero sino guardará null:

<?php
   $nombre = (isset($_COOKIE['nombre'])) ? $_COOKIE['nombre'] : null;
?>

Y luego preguntaremos si existe un nombre, si es así saludamos al visitante por ese nombre y mostramos un link para cambiar el nombre o bien para eliminarlo. De no ser así saludamos al usuario, como «usuario desconocido» y le mostramos un link para que guarde su nombre:

<?php if ($nombre): ?>
   <h1> Bienvenido/a <?php echo $nombre ?> </h1>
   <p> ¿Qué querés hacer? <a href="guardar_nombre.php"> Cambiar mi nombre </a> | <a href="eliminar_nombre.php"> Eliminar mi nombre </a> </p>
<?php else: ?>
   <h1> Bienvenido/a usuario desconocido </h1>
   <p> <a href="guardar_nombre.php"> Seleccionar un nombre para identificarme </a> </p>
<?php endif; ?>

Ahora editaremos el archivo guardar_nombre.php con el siguiente código:

<?php
 $nombre = (isset($_COOKIE['nombre'])) ? $_COOKIE['nombre'] : null;
 if($_SERVER['REQUEST_METHOD'] == 'POST'){
    $nombre = $_POST['nombre'];
    setcookie('nombre', $nombre, time() + 86400, '/');
    header('Location: index.php');
    exit;
 }
?>
<!DOCTYPE html>
<html>
 <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title> Guardar nombre </title>
 </head>
 <body>
    <form method="post" action="guardar_nombre.php">
       <label> Nombre: </label>
       <input type="text" name="nombre" value="<?php echo $nombre ?>" required="required" />
       <input type="submit" value="Guardar" />
       <a href="index.php"> Volver </a>
    </form>
 </body>
</html>

Aquí mostramos un formulario con un campo de entrada para ingresar el nombre y un botón para guardarlo:

<form method="post" action="guardar_nombre.php">
   <label> Nombre: </label>
   <input type="text" name="nombre" value="<?php echo $nombre ?>" required="required" />
   <input type="submit" value="Guardar" />
   <a href="index.php"> Volver </a>
</form>

En la cabecera preguntamos si existe ese cookie, para luego mostrarlo como valor por defecto del campo de entrada:

$nombre = (isset($_COOKIE['nombre'])) ? $_COOKIE['nombre'] : null;

Y finalmente preguntaremos si existe una petición por POST, osea si se ha enviado el formulario y guardamos la cookie con el nombre que ha enviado el usuario y redireccionamos a la página de bienvenida, para así mostrar ese nombre.

if($_SERVER['REQUEST_METHOD'] == 'POST'){
   $nombre = $_POST['nombre'];
   setcookie('nombre', $nombre, time() + 86400, '/');
   header('Location: index.php');
   exit;
}

Ahora crearemos la acción para eliminar la cookie editando el archivo eliminar_nombre.php con el siguiente código:

<?php
 if(isset($_COOKIE['nombre'])){
    setcookie('nombre', '', time() - 86400, '/');
    header('Location: index.php');
    exit;
 }
?>

Aquí simplemente eliminamos la cookie, seteándola como hicimos cuando la creamos, pero en lugar de sumar un día, lo restamos, para así forzar su vencimiento.

Descargar ejemplo

Anterior: Aprendiendo PHP, parte 19: Subir archivos al servidor

Siguiente: Aprendiendo PHP, parte 21: Sesiones