Diferencia entre revisiones de «Usuario:ManuelRomero/php/cookies»
De WikiEducator
< Usuario:ManuelRomero | php
(Página creada con «{{TEP}} {{:Usuario:ManuelRomero/php/nav}} <!--__NOEDITSECTION__--> __NOTOC__ {|cellpadding="5" cellspacing="6" style="width:100%;background:#DFFFFF; border-style:solid;...») |
|||
| (36 revisiones intermedias por el mismo usuario no mostrado) | |||
| Línea 1: | Línea 1: | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
<!--__NOEDITSECTION__--> | <!--__NOEDITSECTION__--> | ||
__NOTOC__ | __NOTOC__ | ||
| Línea 13: | Línea 8: | ||
</span> | </span> | ||
[[Imagen:DWES_TituloTema5.png|center]] | [[Imagen:DWES_TituloTema5.png|center]] | ||
| + | |} | ||
| + | ===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 | ||
| + | <source lang=php> | ||
| + | setcookie("usuario", $_SERVER['PHP_AUTH_USER'], time()+3600); | ||
| + | </source> | ||
| + | *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 | ||
| + | <source lang=php> | ||
| + | $usuario = $_COOKIE['usuario']; | ||
| + | </source> | ||
| + | ====Borrar una cookie==== | ||
| + | *Para borrar la cookie usamos la función setcookie con un tiempo negativo | ||
| + | <source lang="php"> | ||
| + | <?php | ||
| + | // Ponemos un tiempo de expiración negativo | ||
| + | setcookie("user", "", time()-3600); | ||
| + | ?> | ||
| + | </source> | ||
| + | {{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 | ||
| + | <source lang=php> | ||
| + | |||
| + | 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." | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | </source> | ||
| + | |||
| + | }} | ||
| + | {{Resumen| | ||
| + | ==Creación de coockies== | ||
| + | <source lang="php"> | ||
| + | <?php | ||
| + | $expire = time()*60*60*24*30 //La coockie durará un mes | ||
| + | setcookie("user", "Alex Porter", $expire); | ||
| + | ?> | ||
| + | </source> | ||
| + | *Si tiempo de expiración es 0, la coockie que solo dura la sesion | ||
| + | <source lang="php"> | ||
| + | <?php | ||
| + | $expire = =; //La coockie durará lo que dure la sesión | ||
| + | setcookie("user", "Alex Porter", $expire); | ||
| + | ?> | ||
| + | </source> | ||
| + | == Ver el valor de una cookie == | ||
| + | <source lang="php"> | ||
| + | <?php | ||
| + | // Ver una cookie concreta | ||
| + | echo $_COOKIE["user"]; | ||
| + | |||
| + | // Para ver todas las cookies | ||
| + | print_r($_COOKIE); | ||
| + | ?> | ||
| + | </source> | ||
| + | |||
| + | == Borrado == | ||
| + | <source lang="php"> | ||
| + | <?php | ||
| + | // Ponemos un tiempo negativo | ||
| + | setcookie("user", "", time()-3600); | ||
| + | ?> | ||
| + | </source> | ||
| + | }} | ||
| + | |||
| + | {{Actividades| | ||
| + | *Crea una pagina que simule ser la de un periódico. La misma debe permitir configurar que tipo de titular deseamos que aparezca al visitarla, pudiendo ser: | ||
| + | #Noticia política. | ||
| + | #Noticia económica. | ||
| + | #Noticia deportiva. | ||
| + | *Mediante tres objetos de tipo radio, permitir seleccionar que titular debe mostrar el periódico. | ||
| + | *Almacenar en una cookie el tipo de titutar que desea ver el cliente. | ||
| + | *La primera vez que visita el sitio deben aparecer los tres titulares. | ||
| + | }} | ||
| + | {{Actividad| | ||
| + | *Realiza el ejercicio de la siguiente referencia | ||
| + | *http://www.mclibre.org/consultar/php/ejercicios/cookies/cookies.html}} | ||
| + | }} | ||
| + | {{Lectura|Title=Referencias en la web| | ||
| + | *http://docs.php.net/manual/es/features.cookies.php | ||
| + | *http://docs.php.net/manual/es/function.setcookie.php | ||
| + | *http://www.w3schools.com/php/php_cookies.asp | ||
| + | *http://www.mclibre.org/consultar/php/lecciones/php_cookies.html | ||
| + | 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 | ||
| + | <source lang=php> | ||
| + | <?php | ||
| + | .... | ||
| + | $usuario = $_POST['usuario'] | ||
| + | ...... | ||
| + | //Leemos la cookie que es un array de accesos | ||
| + | $arrayAccesos = $_COOKIE[$usuario]; | ||
| + | ..... | ||
| + | </source> | ||
| + | *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 | ||
| + | <source lang=php> | ||
| + | .... | ||
| + | $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 | ||
| + | ..... | ||
| + | </source> | ||
| + | |||
| + | {{Actividad| | ||
| + | *Añade en la base de datos usuarios varios usuarios diferentes | ||
| + | *Crea un formulario para que el usuario sepuede registrar | ||
| + | <source lang=html5> | ||
| + | <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> | ||
| + | </source> | ||
| + | *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 | ||
| + | <source lang=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; | ||
| + | } | ||
| + | </source> | ||
| + | |||
| + | ===Posible solución del ejercicio=== | ||
| + | <source lang=php> | ||
| + | |||
| + | <?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> | ||
| + | </source> | ||
| + | *Bases de datos donde habrá que actualizar las credenciales | ||
| + | <source lang =php> | ||
| + | <?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; | ||
| + | } | ||
| + | ?> | ||
| + | </source> | ||
| + | |||
| + | }} | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | {{Lectura|Title=Administrar cookies en diferentes navegadores|}} | ||
| + | *'''''Firefox''''' http://support.mozilla.org/es/kb/Borrar%20cookies?esab=a&s=cookies&r=2&as=s | ||
| + | *'''''Chrome/Chromium''''': http://support.google.com/chrome/bin/answer.py?hl=es&answer=95647 | ||
| + | *'''''Internet Explorer''''': http://windows.microsoft.com/es-es/windows7/how-to-manage-cookies-in-internet-explorer-9 | ||
| + | *'''''Opera''''': http://help.opera.com/Windows/11.50/es-ES/cookies.html | ||
| + | *'''''Safari''''': http://support.apple.com/kb/ph5042 | ||
| + | |||
|} | |} | ||
Última revisión de 14:43 5 dic 2014
Qué es una Cookie
Crear una coockie
http://es.php.net/manual/es/function.setcookie.php
setcookie("usuario", $_SERVER['PHP_AUTH_USER'], time()+3600);
Recuperar la cookie
$usuario = $_COOKIE['usuario']; Borrar una cookie
<?php // Ponemos un tiempo de expiración negativo setcookie("user", "", time()-3600); ?>
}}
Coockies con array
<?php .... $usuario = $_POST['usuario'] ...... //Leemos la cookie que es un array de accesos $arrayAccesos = $_COOKIE[$usuario]; .....
.... $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 .....
|
