# Cookies (PHP) Las cookies son datos de una página web (En forma de archivos de texto) guardados en la memoria de tu dispositivo. No suelen contener información sensible, guarda datos sobre tus preferencias. Al igual que el paso por GET o POST, el uso de las cookies es otra técnica de almacenaje de información mediante pares nombre/valor. En PHP manejamos las cookies con la variable superglobal **$_COOKIE**, y para definir una nueva cookie podemos usar la función **setcookie**. ## Ventajas - Guardar configuración para mejorar la experiencia (autologin, cambiar idioma que elegiste la primera vez, la última búsqueda que realizaste, evitar mostrar avisos que ya aceptaste …) - Usos comerciales (sugerencias personalizadas dependiendo de qué buscaste en la última ocasión, guardar tu carrito de compra …) - Crear estadísticas ## Desventajas - Hacer un uso desmedido de las mismas. - Su disponibilidad está controlada por el cliente (puesto que se almacenan en el dispositivo del cliente). - Algunos usuarios puedesn deshabilitar las cookies en el navegador porque piensan que la información que almacenan puede suponer un potencial problema de seguridad. ## setcookie La función setcookie nos permite manejar cookies con PHP, tanto guardarlas, como modificarlas o eliminarlas. ### Importante - Es **importante** saber que **el valor de la cookie no estará disponible hasta que se recargue la página**. - Debemos tener en cuenta que **las cookies deben ser declaradas antes de cualquier sentencia ejecutable** (Creación de variables, ejecución de una función). **Si podemos utilizar sentencias de control de flujo como if/else**, ya que no ejecutan código php. Si no lo hacemos así PHP puede tener problemas a la hora de crear la cookie y puede lanzar un warning. - En relación a el anterior punto: En un entorno de producción se suele utilizar un buffer de salida, pero puede enmascarar errores de programación. Si no se genera el Warning, vete a **php.ini**, modifica **output_buffering** y dale valor **0**, reinicia Apache y ejecuta de nuevo. - Es muy importante que **los nombres de las cookies no coincidan con los nombres de controles de formularios**, porque PHP incluye los valores de las cookies en $_REQUEST. ### Parámetros setcookie recibe multitud de parámetros de configuración: - **name: string**: Nombre de la Cookie - **value: string**: Valor de la Cookie - **expires_or_options: int**: Define el tiempo en el que expirará una cookie, si no lo definimos o ponemos un 0 la cookie expirará cuando se cierre la pestaña. - **path: string**: Indica en que partes de la página estara disponible la cookie. Si se utiliza "/" estará disponible en todo el dominio, si se utiliza "/cookie/" solo estará disponible en el directorio "/cookie/". Si no lo definimos el valor será el directorio actual. - **domain: string**: Establece el dominio en el que está disponible la cookie. - **secure: boolean**: Si la definimos como true la cookie solo se creara si la página es segura (HTTPS). Por defecto es false. - **httponly: boolean**: Si la definimos como true no se puede leer la cookie desde el cliente. Por defecto es false. *Ejemplo* ```php <?php setcookie( name: "example", value: "example", expires_or_options: time() + 60, path: "/", domain: "localhost", secure: false httponly: false ); ``` ### Guardar una Cookie Podemos guardar una cookie de dos formas: 1. Pasando los parámetros sin nombrar ```php <?php setcookie("cookie_sin_nombrar", "Esto es una cookie") ``` 2. Pasando los parámetros nombrados ```php <?php setcookie( name: "cookie_nombrada", value: "Esto es otra cookie" ) ``` La **forma recomendada** de crear una cookie es con los **parámetros nombrados**, ya que es más fácil legible y semántico. #### Datos Binarios Podemos guardar contenido binario dentro de una cookie (arrays) utilizando la función serialize para pasarlo a string y deserialize cuando queramos pasarlo de nuevo a su estado original y utilizar ese valor. *Ejemplo* ```php= <?php // De binario a texto: setcookie("notas", serialize(array(9,7,6,5))); // De texto a binario: $array = unserialize($_COOKIE["notas"]); ``` ### Acceder a una cookie Acceder a las cookies: Para ello utilizamos la variable global **$_COOKIE**, que permite acceder a las cookies almacenadas. ```php= <?php if (isset($_COOKIE["visitas"]){ echo “Ésta es tu visita número $_COOKIE["visitas"]; } ``` ### Actualizar una Cookie Para actualizar una cookie simplemente debemos poner el mismo nombre de la cookie que queramos cambiar y cambiar los atributos que nos interese modificar. **Es importante controlar la existencia de la cookie para que no se sobreescriba de manera incontrolada**. *Ejemplo* ```php= <?php /** Por defecto el valor de la cookie será #12373d, pero si seleccionamos un color y cambiamos se modificará el valor de la cookie por el color elegido. IMPORTANTE: No se reflejarán los cambios hasta que se refresque la página */ setcookie( name: "bg_color", value: $_POST["color"] ?? "#12373d", expires_or_options: time() + 60 ); $color = $_COOKIE["bg_color"] ?? "red"; ?> <!DOCTYPE html> <html lang="es"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Cookies</title> <style> body { background: <?= $color ?> } </style> </head> <body> <h1>Prueba de Cookies</h1> <form action="<?= $_SERVER["PHP_SELF"]?>" method="post"> <label for="color">Color de fondo</label><br> <input type="color" name="color" id="color"><br> <button type="submit">Cambiar</button> </form> </body> </html> ``` ### Borrar una Cookie Para eliminar una cookie solo debemos establecer un tiempo de expiración menor que el que le definimos a la cookie y poner su valor como "". *Ejemplo* ```php= <?php setcookie( name: "bg_color", value: isset($_POST["eliminar"]) ? "" : "#12373d", expires_or_options: isset($_POST["eliminar"]) ? time() - 60 : time() + 60 ); $color = $_COOKIE["bg_color"] ?? "red"; ?> <!DOCTYPE html> <html lang="es"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Cookies</title> <style> body { background: <?= $color ?> } </style> </head> <body> <h1>Prueba de Cookies</h1> <form action="<?= $_SERVER["PHP_SELF"]?>" method="post"> <button type="submit" name="eliminar">Elimnar Cookie</button> </form> </body> </html> ``` **IMPORTANTE**: Si usáramos la función unset() para borrar la cookie, únicamente la borraríamos del array asociativo $_COOKIE pero continuaría en el navegador web del usuario, y al recargarse la página o ser cargada otra se volvería a recuperar su valor. *Ejemplo* ```php= <?php /* Se borrara de $_COOKIE pero al recargar el valor seguirá persistiendo */ unset($_COOKIE["ejemplo"]); ``` ## UT3: Sesiones y Cookies [Documentación General](https://hackmd.io/@bd1-NGPOSje0xW9PiI2fSQ/SJ5IDhnDo) ###### tags: `DSW` `UT3` `Platzi`