|
|
(2 revisiones intermedias por el mismo usuario no mostrado) |
Línea 2: |
Línea 2: |
| __NOTOC__ | | __NOTOC__ |
| {{:Usuario:ManuelRomero/php/sesiones/nav}} | | {{:Usuario:ManuelRomero/php/sesiones/nav}} |
− | ===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
| |