Qué es una Cookie
- Una cookie es una pequeña cantidad de datos almacenada por el navegador del usuario cuando solicita una página a un servidor.
- Con esto podemos suplir la característica de que http es un protocolo sin estado (Insistir en que esto es una característica del protocolo, no una limitación.
- Una Cookie es un fichero que se almacene en el cliente y guarda información de ese cliente en referencia a una determinada sitio web.
- Como se guardan en el cliente, se necesita confirmación expresa del cliente para dejar que se almacenen cosas en su equipo
- En general no se debe de abusar de ellas, máxime cuando muchos las pueden tener deshabilitadas y esto puede impedir que nuestra aplicación web se ejecute de forma eficiente o incluso correcta.
- El servidor es quien solicita la creación del coockie en el cliente
- El cliente crea un fichero con dicha información
- Una vez creada, solo puede ser leída por el sitio web que la creó.
- Para trabajar con cookies tenemos que hacer dos cosas
- El tamaño máximo de un cookie está limitado a 4K.
- Alamacenar o crear la cookie
- Poder leerla en un momento determinado
Crear una coockie
- Para ello usaremos la fucnión setCookie(...)
- En esta función puede recibir hasta 7 parámetros, (sólo el primero es obligatorio).
http://es.php.net/manual/es/function.setcookie.php
- Es habitual usar los tres primeros que serían
- Nombre de la cookie
- Valor que almacenamos en ella
- Tiempo de expiración: es un entero en segundos. Si no se especifica, la cookie termiará junto a esta sesión.
- Por ejemplo si quieremos almacenar el usuario y que tenga un tiempo de duración de 1 hora
setcookie("usuario", $_SERVER['PHP_AUTH_USER'], time()+3600);
- Importante el envío de cookies al cliente ha de hacerse antes de que se escriba nada en html, igual que las funciones header.
Recuperar la cookie
- El proceso de recuperación de la información que almacena una cookie es muy simple.
- Cuando accedes a un sitio web, el navegador (cliente), le envía de forma automática todo el contenido de las cookies que almacene relativas a ese sitio en concreto (servidor).
- Desde PHP se puede acceder a esta información por medio del array $_COOKIE.
- Para recuperar los datos anteriores
$usuario = $_COOKIE['usuario'];
Borrar una cookie
- Para borrar la cookie usamos la función setcookie con un tiempo negativo
<?php
// Ponemos un tiempo de expiración negativo
setcookie("user", "", time()-3600);
?>
Actividad
- En la página registro.php anterior, almacena en una cookie el último instante en que el cualquier usuario visitó la página.
- Si es su primera visita, muestra un mensaje de bienvenida.
- En caso contrario, muestra la fecha y hora de su anterior visita.
- Deberás utilizar la función setcookie para guardar el instante de su anterior visita y mostrar su contenido utilizando el array $_COOKIE.
Posible solucion
- Tomado el ejemplo anterior (de autentificación), habría que añadir el siguiente código
if($resultado->num_rows == 0) {
//......
else {
if (isset($_COOKIE['ultimo_login'])) {
$ultimo_login = $_COOKIE['ultimo_login'];
}
setcookie("ultimo_login", time(), time()+3600);
}
//..... y una vez dentro de la página
if (isset($ultimo_login))
echo "Ultimo login: " . date("d/m/y \a \l\a\s H:i", $ultimo_login);
else
echo "Bienvenido. Esta es su primera visita."
|
Resumen
Creación de coockies
<?php
$expire = time()*60*60*24*30 //La coockie durará un mes
setcookie("user", "Alex Porter", $expire);
?>
- Si tiempo de expiración es 0, la coockie que solo dura la sesion
<?php
$expire = =; //La coockie durará lo que dure la sesión
setcookie("user", "Alex Porter", $expire);
?>
Ver el valor de una cookie
<?php
// Ver una cookie concreta
echo $_COOKIE["user"];
// Para ver todas las cookies
print_r($_COOKIE);
?>
Borrado
<?php
// Ponemos un tiempo negativo
setcookie("user", "", time()-3600);
?>
|
Plantilla:Actividades
}}
Referencias en la web
Normativa: Directiva 2009/136/CE
|
Coockies con array
- En este caso la cookie en lugar de contener un solo valor va a contener un array
- A la hora de leer la cookie se hace igual que hasta ahora
- Supongamos que tenemos varias cookies, dependiendo del usuario que se ha conectado
- De cada uno de esos usuarios tendríamos los accesos que ha realizado en un array indexado indicando la hora
- Leemos la cookie
<?php
....
$usuario = $_POST['usuario']
......
//Leemos la cookie que es un array de accesos
$arrayAccesos = $_COOKIE[$usuario];
.....
- Guardar la cookie
- Esto crea el plateamiento de como guardar la cookie a la hora de qué nombre va a tener esta cookie
- Es como que en la misma cookie queremos guardar muchos valores, pero en realidad guardamos uno solo que es el array
- Una manera de hacerlo es incorporar a la cookie ya guardada el nuevo índice
- Para ello una manera de hacerlo es obtener el valor del indice del nuevo elemento obteniendo el tamaño del vector hasta ahora
- Incorporamos en la posición correspondiente el nuevo valor
....
$usuario = $_POST['usuario']
......
//Leemos la cookie que es un array de accesos
$arrayAccesos = $_COOKIE[$usuario];
.....
//Ahora ya puedo obtener el tamaño del vector
$indice = count($arrayAccesos);
//Con este valor añado la nueva entrada
setCookie($usuario.'['.$indice.']',time(),time()+3600
.....
Actividad
- Añade en la base de datos usuarios varios usuarios diferentes
- Crea un formulario para que el usuario sepuede registrar
<div id="login">
<fieldset >
<legend>Login</legend>
<form action="." method="POST">
<label for='nombre' >Nombre:</label>
<input type="text" name ="nombre">
<label for='pass'>Password: </label>
<input type="text" name ="pass">
<input type="submit" value="Cambiar Usuario" name="registrar"/>
</form>
</fieldset>
</div>
- Visualiza los accesos del usuario acutual así como los accesos del resto de usuarios
- Aquí podemos ver el ejemplo
http://www.manuel.infenlaces.com/cookies/
- Para el formulario este sencillo css
#login fieldset {
width: 230px;
padding:10px;
border:1px solid #ccc;
background-color: #eee;
}
#login legend {
font-family : Arial, sans-serif;
font-size: 1.3em;
font-weight:bold;
color:#333;
}
Posible solución del ejercicio
<?php
// Si el usuario aún no se ha autentificado, pedimos las credenciales
//Si me he registrado verifico los datos
require_once "baseDatos.php";
$usuario = $_POST['nombre'];
$pass = $_POST['pass'];
$conexion = conectar();
if ($conexion != null) { //Se ha conectado ok a la bd
date_default_timezone_set('Europe/Madrid');
// Ejecutamos la consulta para comprobar si existe
// esa combinación de usuario y contraseña
$sql = <<<SQL
SELECT usuario FROM usuarios
where usuario = ?
and
contrasena =?
SQL;
$stmt = $conexion->stmt_init();
$stmt->prepare($sql);
$stmt->bind_param("ss", $usuario, md5($pass));
$stmt->execute();
$stmt->store_result();
//$stmt->bind_result($u);
// Si no existe, se vuelven a pedir las credenciales
$indice = 0;
if ($stmt->num_rows == 0) {
$error = "Usuario no reconocido";
} else {
if (isset($_COOKIE[$usuario])) {
//Leemos la cookie y obtenemos el índice
$acceso = $_COOKIE[$usuario];
$indice = count($acceso);
}
//Añadimos el nuevo acceso en la cookie correspondiente
setcookie($usuario . "[" . ($indice) . "]", time(), time() + 3600);
}
$stmt->free_result();
$conexion->close();
}
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Ejemplo Cookies en autentificación </title>
<link href="cookie.css" rel="stylesheet" type="text/css">
</head>
<body>
<div id="login">
<fieldset >
<legend>Login</legend>
<form action="." method="POST">
<label for='nombre' >Nombre:</label>
<input type="text" name ="nombre">
<label for='pass'>Password: </label>
<input type="text" name ="pass">
<input type="submit" value="Cambiar Usuario" name="registrar"/>
</form>
</fieldset>
</div>
<?php
if ($error == null) {
echo"<h2>Lista de accesos del usuario conectado actualmente $usuario</h2><hr/>";
if (isset($acceso)) {
for ($i = 0; $i < $indice; $i++)
echo "-Acceso número $i a las " . date("d/m/y \a \l\a\s H:i", $acceso[$i]) . "<br/>";
} else
echo "Bienvenido. Esta es su primera visita. $nombre<br/>";
//ahora recorro todos los usuarios";
foreach ($_COOKIE as $user => $accesos) {
if ($user != $usuario) {
echo "<h2> Usuario $user </h2><br/><hr/>";
foreach ($accesos as $numAcceso => $hora) {
echo "Acceso número $numAcceso a las " . date("d/m/y \a \l\a\s H:i", $hora) . "<br/>";
}
}
}
} else
echo "Se ha producido el error $error.<br />";
?>
</body>
</html>
- Bases de datos donde habrá que actualizar las credenciales
<?php
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
function conectar(){
$usuarioBD ="manuel_manuel";
$pass ="xv2e6w";
$host = "localhost";
$bd = "manuel_dwes";
$conexion = new mysqli($host,$usuarioBD,$pass,$bd);
//Hacemos una consulta a ver si el usuario existe
if ($conexion->connect_errno){
echo ("Se ha producido un error conectado a la base de datos ".$conexion->connect_error);
return null;
}
return $conexion;
}
?>
|
Administrar cookies en diferentes navegadores
|
|