Diferencia entre revisiones de «Usuario:ManuelRomero/PHP/sesiones»

De WikiEducator
Saltar a: navegación, buscar
(Página creada con «<!--__NOEDITSECTION__--> __NOTOC__ {|cellpadding="5" cellspacing="6" style="width:100%;background:#DFFFFF; border-style:solid; border-width:2px; border-color:#0066FF;" | w...»)
 
 
(3 revisiones intermedias por el mismo usuario no mostrado)
Línea 1: Línea 1:
 
<!--__NOEDITSECTION__-->
 
<!--__NOEDITSECTION__-->
 
__NOTOC__
 
__NOTOC__
{|cellpadding="5" cellspacing="6" style="width:100%;background:#DFFFFF; border-style:solid; border-width:2px; border-color:#0066FF;"
+
{{:Usuario:ManuelRomero/php/sesiones/nav}}
| width="100%" valign="top" style="padding: 0; margin:0px;" |
+
{|cellpadding="5" cellspacing="6" style="width:100%;background:#DFFFFF; border-style:solid; border-width:1px; border-color:#0066FF;"
+
| width="100%" valign="top" style="padding: 0; margin:0px;" |
+
<span style="background:#FFFF99">
+
</span>
+
[[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 01:15 26 feb 2015