Diferencia entre revisiones de «Usuario:ManuelRomero/php/cookies»

De WikiEducator
Saltar a: navegación, buscar
(Coockies con array)
 
(19 revisiones intermedias por el mismo usuario no mostrado)
Línea 1: Línea 1:
{{:Usuario:ManuelRomero/php/nav}}
 
 
 
<!--__NOEDITSECTION__-->
 
<!--__NOEDITSECTION__-->
 
__NOTOC__
 
__NOTOC__
Línea 170: Línea 168:
 
.....
 
.....
 
//Ahora ya puedo obtener el tamaño del vector
 
//Ahora ya puedo obtener el tamaño del vector
$indice = count($array);
+
$indice = count($arrayAccesos);
 
//Con este valor añado la nueva entrada
 
//Con este valor añado la nueva entrada
 
setCookie($usuario.'['.$indice.']',time(),time()+3600
 
setCookie($usuario.'['.$indice.']',time(),time()+3600
 
.....
 
.....
 
</source>
 
</source>
<>
+
 
 
{{Actividad|
 
{{Actividad|
 
*Añade en la base de datos usuarios varios usuarios diferentes
 
*Añade en la base de datos usuarios varios usuarios diferentes
 
*Crea un formulario para que el usuario sepuede registrar
 
*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
 
*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>
  
 
{{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
 
}}
 
|}
 
<!--
 
<!DOCTYPE html>
 
 
<?php
 
<?php
 
// Si el usuario aún no se ha autentificado, pedimos las credenciales
 
// Si el usuario aún no se ha autentificado, pedimos las credenciales
//Observa que escribimos esto antes de escribier ninguna salida
+
//Si me he registrado verifico los datos
//Esto es importante si se usa la función header
+
require_once "baseDatos.php";
if (!isset($_SERVER['PHP_AUTH_USER'])) {
+
    $usuario = $_POST['nombre'];
     header('WWW-Authenticate: Basic realm="Contenido restringido"');
+
     $pass = $_POST['pass'];
    header("HTTP/1.0 401 Unauthorized");
+
     $conexion = conectar();
    exit;
+
     if ($conexion != null) { //Se ha conectado ok a la bd
}
+
         date_default_timezone_set('Europe/Madrid');
// Si ya ha
+
        // Ejecutamos la consulta para comprobar si existe
//enviado las credenciales, las comprobamos con la base de datos
+
        // esa combinación de usuario y contraseña
else {
+
// Conectamos a la base de datos
+
+
     $conexion = new mysqli("localhost", "root", "root", "dwes");
+
    $error = $conexion->connect_errno;
+
// Si se estableció la conexión
+
     if ($error == null) {
+
        //Realizamos una consulta preparada
+
         $consulta = $conexion->stmt_init();
+
// Ejecutamos la consulta para comprobar si existe
+
// esa combinación de usuario y contraseñ
+
 
         $sql = <<<SQL
 
         $sql = <<<SQL
SELECT usuario FROM usuarios
+
                SELECT usuario FROM usuarios
WHERE usuario = ? AND
+
                where usuario = ?
      contrasena = ?
+
                and
 +
                contrasena =?
 
SQL;
 
SQL;
+
 
         $usuario = $_SERVER['PHP_AUTH_USER'];
+
         $stmt = $conexion->stmt_init();
        $pass = md5($_SERVER['PHP_AUTH_PW']);
+
         $stmt->prepare($sql);
         $consulta->prepare($sql);
+
 
         $consulta->bind_param("ss", $usuario, $pass);
+
         $stmt->bind_param("ss", $usuario, md5($pass));
         $consulta->execute();
+
         $stmt->execute();
         $consulta->store_result();
+
         $stmt->store_result();
         if ($consulta->num_rows == 0) {
+
         //$stmt->bind_result($u);
+
// Si no existe, se vuelven a pedir las credenciales
            header('WWW-Authenticate: Basic realm="Contenido restringido"');
+
        $indice = 0;
            header("HTTP/1.0 401 Unauthorized");
+
        if ($stmt->num_rows == 0) {
            //Esto solo se visualizará si damos a cancelar del formulario de autentificación
+
             $error = "Usuario no reconocido";
            $consulta->close();
+
         } else {
            $conexion->close();
+
             if (isset($_COOKIE[$usuario])) {
             echo "<h1> Usuario y password no autorizado reintentelo </h1>";
+
                //Leemos la cookie y obtenemos el índice
            exit;
+
                 $acceso = $_COOKIE[$usuario];
         } else { //Situación en la que el usuario se ha conectado ok
+
                $indice = count($acceso);
             if (isset($_COOKIE["usuario"])){
+
                 $acceso=$_COOKIE["usuario"];
+
 
             }
 
             }
            $acceso[]=time();
+
             //Añadimos el nuevo acceso en la cookie correspondiente
            $indice =count($acceso)-1;
+
             setcookie($usuario . "[" . ($indice) . "]", time(), time() + 3600);
             //$indice = count($acceso)-1;
+
       
+
             setcookie("usuario[$indice]",time(),time()+12*30*24*3600);
+
            print_r($_COOKIE);
+
           
+
 
         }
 
         }
         $consulta->close();
+
         $stmt->free_result();
 
         $conexion->close();
 
         $conexion->close();
    }//End error =null
+
 
}//End else de if !isset .....
+
}
 
?>
 
?>
 +
<!DOCTYPE html>
 
<html>
 
<html>
 
     <head>
 
     <head>
 
         <meta http-equiv="content-type" content="text/html; charset=UTF-8">
 
         <meta http-equiv="content-type" content="text/html; charset=UTF-8">
         <title>Ejemplo Tema 4: Utilización de MySQL para autentificación HTTP</title>
+
         <title>Ejemplo Cookies en autentificación </title>
         <link href="dwes.css" rel="stylesheet" type="text/css">
+
         <link href="cookie.css" rel="stylesheet" type="text/css">
 
     </head>
 
     </head>
 
     <body>
 
     <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
 
         <?php
         echo "Nombre de usuario: " . $_SERVER['PHP_AUTH_USER'] . "<br/>";
+
         if ($error == null) {
        echo "Hash de la contraseña: " . md5($_SERVER['PHP_AUTH_PW']) . "<br/>";
+
            echo"<h2>Lista de accesos del usuario conectado actualmente $usuario</h2><hr/>";
       
+
            if (isset($acceso)) {
        if (count($acceso)!=0){
+
                for ($i = 0; $i < $indice; $i++)
            echo "<h2>Accesos realizados</h2>";
+
                    echo "-Acceso número $i a las  " . date("d/m/y \a \l\a\s H:i", $acceso[$i]) . "<br/>";
               
+
            } else
            for ($i=0;$i<=$indice;$i++){
+
                echo "Bienvenido. Esta es su primera visita. $nombre<br/>";
                echo "Acceso número $i ".(date ("d/m/y \a \l\a\s H:i",$acceso[$i]))."<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
         }else
+
             echo "Se ha producido el error $error.<br />";
             echo "Wellcome to your first access";
+
       
+
 
         ?>
 
         ?>
 
     </body>
 
     </body>
 
</html>
 
</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 03:43 6 dic 2014


DWES TituloTema5.png

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.
  1. Alamacenar o crear la cookie
  2. 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
  1. Nombre de la cookie
  2. Valor que almacenamos en ella
  3. 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);
?>


Icon activity.jpg

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."






Icon summary.gif

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


Icon activity.jpg

Actividad



}}



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
.....



Icon activity.jpg

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;
}
?>








Icon reading.jpg

Administrar cookies en diferentes navegadores