PHP Cookies

De MediaWiki
Ir a la navegación Ir a la búsqueda

Introdución

  • A cookie é información que se garda nos equipos dos usuarios.
É importanto ter claro que dita información gárdase no equipo cliente.
  • O uso das cookies pode ser utilizada para gardar información sobre que 'páxinas' ou 'produtos' foron vistos por un usuario para, cando se volve ao mesmo sitio, que este poida ofrecer información 'personalizada'.
Os seus detractores indican que pode ser un mecanismo para obter información sobre un usuario sen que o usuario estea de acordo con que se garde ese tipo de información.


  • A diferenza das variables de sesión, podemos configurar as cookies para que se manteñan no equipo do cliente durante o tempo que indiquemos.
Por iso resultan indicadas para gardar información como o nome do usuario, as súas preferencias de idioma,...
Desta forma o usuario non ten que volver a introducir ditos datos e se se ten acceso a esta información por parte de terceiros non supón ningún tipo de risco.


  • Temos que ter en conta o seguinte no uso das cookies:
  • O usuario pode configurar o navegador para que non acepte as cookies e non se poida gardar esta información.
  • Os datos das cookies se envía nos encabezados do protocolo HTTP, polo que é necesario gardar a cookie antes de enviar ningunha información ao usuario. Veremos a continuación que unha cookie se garda coa orde setCookie.

Onde se gardan

  • Como dixemos anteriormente, gárdanse no equipo cliente.
Onde ?
Vai depender do navegador, da versión do navegador e do S.O.
  • Vexamos algúns exemplos (deberemos ter activada la opción de visualizar arquivos ocultos do explorador de arquivos => Menú Ferramenta => Opcións de Carpeta => Lapela Ver)

FIREFOX

  • En Windows C:\Users\<tu_nombre_de_usuario>\AppData\Roaming\Mozilla\Firefox\Profiles\<nombre_del_perfil>\cookies.sqlite
  • En Unix/Linux no cartafol: /home/<tu_nombre_de_usuario>/.mozilla/firefox/<nombre_del_perfil>/cookies.sqlite
  • En Mac OS X: /Users/<tu_nombre_de_usuario>/Library/Application Support/Firefox/Profiles/<nombre_del_perfil>/cookies.sqlite


CHROME

  • En Windows: C:\Users\<tu_nombre_de_usuario>\AppData\Local\Google\Chrome\User Data\Default\Cookies
  • En Mac OS X: /Users/<tu_nombre_de_usuario>/Library/Application Support/Google/Chrome/Default/Cookies
  • En Linux: /home/<tu_nombre_de_usuario>/.config/google-chrome/Default/Cookies
O nome do arquivo é "Cookies" sen extensión e en formato base de datos.


INTERNET EXPLORER

  • En Windows: C:\Users\<tu_nombre_de_usuario>\AppData\Roaming\Microsoft\Windows\Cookies
Internet Explorer almacena as cookies individualmente en formato texto nuns arquivos codificados coa extensión ".txt"



  • Nalgúns navegadores tamén podemos visualizar as cookies a través do propio programa, por exemplo, nas opcións do firefox:

Php cookies 1.jpg

Como se borran por parte do usuario

  • En Firefox: menú "herramientas" / "limpiar historial" / "reciente".
  • En Chrome: icono de herramientas / "settings" / "under the hood" / "Clear browsing data" / marcar "the beginning of time" / "Delete cookies and other site and plug-in data".
  • En Internet Explorer: "herramientas" (icono en IE9) / "opciones de internet" / "historial de exploración" / "eliminar".

Uso de cookies

Creando novas cookies

setcookie(
    string $name,
    string $value = "",
    int $expires = 0,
    string $path = "",
    string $domain = "",
    bool $secure = false,
    bool $httponly = false
): bool


Leva a seguinte información (non toda é obrigatoria):
  • Nome da cookie (o único obrigatorio)
  • Valor da cookie.
  • Tempo de caducidade da cookie en segundos.
Este parámetro é opcional. Se non se pon, a cookie será válida ata que se peche o navegador.
O valor se pode calcular desta forma: time()+60*60*24*365 => Válido para un ano enteiro.
Se non se lle asocia, a cookie é válida mentres o usuario non peche o navegador.
Aquelas que levan unha data de caducidade permanecen gardadas no equipo ata chegar dita data, no momento en que deixan de ser válidas.
  • Ruta que indica que páxinas do servidor van poder facer uso da cookie. Se poñemos '/' indicaremos que todas as páxinas do sitio van poder acceder á cookie. Se poñemos /tenda/ indicaremos que soamente as páxinas que se atopen dentro do cartafol /tenda/ do meu sitio web poderán acceder á cookie (inclúe sub-cartafoles).
  • Dominio: nome do dominio que terá acceso á cookie. Por exemplo: tenda.meudominio.es
  • Secure: valores true/false, indica se queremos que a cookie só se transmita se o cliente dispón dunha conexión segura https.
  • httponly: valores true/false, indica se a cookie é accesible soamente a través do protocolo http (true) ou tamén a través de javascript no cliente (false).


  • Valor devolto:
  • False: se existe algunha saída (ouput) previa no cliente. Tense que definir antes de enviar ningunha información ao cliente. Isto é debido a que se vai enviar en forma de cabeceira.
  • True: Se executou correctamente, pero isto non indica que o cliente gardara a cookie no seu computador.


  • Vexamos un exemplo:
setCookie("Idioma","galego");
  • Outro exemplo cunha cookie que será válida durante 5 minutos:
setCookie("Hora_conectado",time(),time()+60*5);
Neste exemplo gardamos en segundos, o momento no que o usuario cargou a páxina.
Fixarse que se imos a outra páxina diferente, podemos calcular o tempo que pasou dende a carga dunha páxina anterior:
$tempo_transcurrido=time()-$_COOKIE['Hora_conectado'];



Importante: Lembrar que non podemos empregar setCookie se xa enviamos ao cliente algunha información, por exemplo:

printf("<br />Hola");
setCookie("Hora_conectado",time(),time()+60*5);



Accedendo ás cookies

  • Debemos facer uso do array global $_COOKIE
  • Así se queremos facer uso dunha cookie:
$valor = $_COOKIE['Idioma'];


Borrando cookies

  • Para borrar unha cookie temos que facer uso da mesma función (setCookie) pero indicando unha data de caducidade anterior á actual.
  • Por exemplo:
setCookie("Idioma",null,time()-3600);
Outra forma de facelo e non depender de que o tempo do servidor sexa o correcto:
setCookie("Idioma",null,1);


  • Lembrar que isto borra a cookie no cliente, pero non así no servidor na páxina onde estades a borrar a cookie.
Para borrala do servidor na páxina actual:
unset($_COOKIE("Idioma"));



Exercicios cookies


Exercicio 1

  • Crea unha páxina de nome 'UD4_cookie_ex1_paxina1.???' que cargue nunha cookie de nome 'tempo' o momento no que se conecta a dita páxina (en segundos => mirar función time()).
Se a cookie existe cando volvas a cargar a páxina amosará o tempo en minutos e segundos de canto tempo pasou dende a primeira vez que se conectou.
Para obter o tempo en minutos deberedes dividir entre 60, pero ides obter un número decimal polo que teredes que aplicar a función intval.
Terá un enlace que cargará a páxina 'UD4_cookie_ex1_borrar.???' que borre a cookie 'tempo' e cargue a páxina inicial.
O tempo de vida da cookie será de 3 minutos.


Solución Exercicio 1

Páxina UD4_cookie_ex1_paxina1.php

 1 <?php
 2 
 3     $segundos=0;
 4     $minutos=0;
 5     if (empty($_COOKIE['tempo'])){
 6         setcookie('tempo',time(),time()+3*60);
 7     }
 8     else {  // Xa estaba a cookie gardada
 9         $segundos = time()-$_COOKIE['tempo'];
10         $minutos = intval($segundos/60);
11         $segundos = $segundos-($minutos*60);
12     }
13     
14     
15 ?>
16 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
17     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
18 
19 <html>
20     <head>
21         <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
22         <title>Exercicios de cookies</title>
23     </head>
24     <body>
25         <p>
26             <?php
27                 printf("Levas %s minutos e %s segundos conectados.",$minutos,$segundos);
28             ?>
29         </p>
30         
31         <h2>Pulsa <a href='UD4_cookie_ex1_borrar.php'> para borrar a cookie</a></h2>
32         
33     </body>
34 </html>

Páxina UD4_cookie_ex1_borrar.php

 1 <?php
 2 
 3 // Se necesitamos que o usuario esté autenticado, mirar o tema das variables de sesión
 4 
 5 if (!empty($_COOKIE['tempo'])){
 6     setcookie('tempo',null,1);
 7     unset($_COOKIE['tempo']);
 8 }
 9 
10 header("Location: UD4_cookie_ex1_paxina1.php");


Exercicio 2

Chama as páxinas: UD4_cookies_ex2_????????????? en vez do nome indicado no exercicio 4.


Solución Exercicio 2

Páxina UD4_cookies_ex2_preferencias.html

 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 2     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 3 <html xmlns="http://www.w3.org/1999/xhtml" lang="es" xml:lang="es">
 4     <head>
 5         <title>Exercicio de cookies</title>
 6         <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
 7 
 8     </head>
 9     <body>
10         <form action="UD4_cookies_ex2_pref_paxina1.php" method='post'>
11             <div>
12                 Cor de fondo:<select name='lstCorFondo'>
13                     <option value='#ff0000'>Vermello</option>
14                     <option value='#00ff00'>Verde</option>
15                     <option value='#0000ff'>Azul</option>
16                 </select>    
17             </div>    
18             <div>
19                 Cor de texto:<select name='lstCorTexto'>
20                     <option value='#ff0000'>Vermello</option>
21                     <option value='#00ff00'>Verde</option>
22                     <option value='#0000ff'>Azul</option>
23                 </select>    
24             </div>    
25 
26             <input type='submit' value='GARDAR' />
27 
28         </form>
29     </body>
30 </html>


Páxina UD4_cookies_ex2_pref_paxina1.php

 1 <?php
 2 /* Lembrar quitar isto ao probar o scripts sen erros */
 3 ini_set('display_errors', 1);
 4 ini_set('display_startup_errors', 1);
 5 error_reporting(E_ALL);
 6 
 7 
 8     if(!empty($_POST)){ // Miramos se temos datos que veñan dun formulario
 9         if (!empty($_POST['lstCorTexto'])){
10             setcookie('cor_texto',$_POST['lstCorTexto'],time()+10*60);
11             // ATENCIÓN
12             // Neste exemplo, amosamos no hml o valor da cookie, pero non podemos empregar soamente setCookie e na mesma páxina $_COOKIE
13             //   xa que non se vai gardar nada no cliente ata que se remate de procesar a páxina.
14             // Por tanto $_COOKIE['cor_texto'] non vale nada.
15             // Se tivesemos unha páxinas 'intermedia' para crear a cookie e despois facer un header(location) xa funcionaría.
16             // Para solucionalo, asinamos ao array $_COOKIE o valor directamente.
17             $_COOKIE['cor_texto']=$_POST['lstCorTexto'];
18         }   
19 
20         if (!empty($_POST['lstCorFondo'])){
21             setcookie('cor_fondo',$_POST['lstCorFondo'],time()+10*60);
22             $_COOKIE['cor_fondo']=$_POST['lstCorFondo'];
23         }
24 
25     }
26     else{   // En caso de que se borren as cookies, poñemos uns valores por defecto
27         if (empty($_COOKIE['cor_texto'])){
28             setcookie('cor_texto','green',time()+10*60);
29             $_COOKIE['cor_texto']='green';
30         }
31         if (empty($_COOKIE['cor_fondo'])){
32             setcookie('cor_fondo','brown',time()+10*60);
33             $_COOKIE['cor_fondo']='brown';
34         }
35     }
36 ?>
37 
38 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
39     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
40 <html xmlns="http://www.w3.org/1999/xhtml" lang="es" xml:lang="es">
41     <head>
42         <title>Exercicio de cookies</title>
43         <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
44         <style type="text/css">
45             .estilo{
46                 background-color: <?php echo htmlentities($_COOKIE['cor_fondo']);?>;
47                 color: <?php echo htmlentities($_COOKIE['cor_texto']);?>;
48             }
49         </style>
50     </head>
51     <body>
52         <div class='estilo'>Este é un texto calquera sobre o que se vai a aplicar o estilo escollido na pantalla de preferencias....</div>
53 
54         <a href='UD4_cookies_ex2_pref_paxina2.php' >Enlace á páxina 2</a>
55     </body>
56 </html>


Páxina UD4_cookies_ex2_pref_paxina2.php

 1 <?php
 2     if(!empty($_GET['borrarPreferencias'])){ // Miramos se vimos de premer o enlace de borrar preferencias desta páxina
 3         if ($_GET['borrarPreferencias']==1){   // Comprobamos que valga 1 (poderíamos poñer esta condición cun && na liña anterior.
 4            setcookie('cor_fondo',null,1);
 5            setcookie('cor_texto',null,1);
 6            
 7            unset($_COOKIE['cor_fondo']);
 8            unset($_COOKIE['cor_texto']);
 9         }
10     }
11 ?>
12 <div>Cor de fondo:<?php echo htmlentities($_COOKIE['cor_fondo']);?></div>
13 <div>Cor de texto:<?php echo htmlentities($_COOKIE['cor_texto']);?></div>
14 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
15     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
16 <html xmlns="http://www.w3.org/1999/xhtml" lang="es" xml:lang="es">
17     <head>
18         <title>Exercicio de cookies</title>
19         <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
20         <style type="text/css">
21             .estilo{
22                 background-color: <?php echo htmlentities($_COOKIE['cor_fondo']);?>; /* Isto dará un warning se temos o display_errors a on xa que se vimos de borrar as variables de session non terá valor */
23                 color: <?php echo htmlentities($_COOKIE['cor_texto']);?>;            /*  Teríamos que comprobar se ten valor (usar o operador ternario) antes de utilizalo */
24             }
25         </style>
26     </head>
27     <body>
28         <div class='estilo'>Este é un texto calquera sobre o que se vai a aplicar o estilo escollido na pantalla de preferencias....</div>
29 
30         <a href='UD4_cookies_ex2_preferencias.html' >Enlace á páxina inicial</a>
31         <a href='UD4_cookies_ex2_pref_paxina1.php' >Enlace á páxina 1</a>
32         <a href="<?php echo htmlentities($_SERVER['PHP_SELF']); ?>?borrarPreferencias=1" >Borrar preferencias</a>
33     </body>
34 </html>


Exercicio 3

  • Nota: Utiliza variable de sesión.
  • Crea unha páxina de nome UD4_cookies_ex3_listado.???' na que apareza un formulario cunha lista de tres nomes que representan a alumnos e unha caixa de texto que representa a nota que se lle vai dar ao alumno seleccionado na lista.
Os nomes dos alumnos veñen dunha variable $alumnos que é un array cos nomes dos alumnos.
O action do formulario 'apunta' á páxina 'UD4_cookies_ex3_gardar_cookie.???'.
A páxina amosará na parte baixa (despois do formulario) a lista de alumnos aos que se lles asinou unha nota así como o nome do último alumnos ao que se asinou a nota.
A lista de alumnos xunto coas notas estarán gardados nun array dentro dunha variable de sesión de nome 'notas' e o nome do alumno estará nunha cookie de nome 'nome'.
  • Páxina 'UD4_cookies_ex3_gardar_cookie.???': Se non se envían datos do formulario cargará a páxina anterior. Se se envían datos, gardarase nun array asociativo, formado polos campos 'nome' e 'nota', o nome do alumno seleccionado e a nota introducida no formulario anterior. Este dato gardarase nun array na variable de sesión 'notas'. Polo tanto dita variable estará formada por un array de arrays.
O nome do alumno seleccionado será gardado nunha cookie de nome 'nome'.
Unha vez gardados os datos cargarase a páxina UD4_cookies_ex3_listado.???'.


Solución Exercicio 3

Páxina UD4_cookies_ex3_listado.php

 1 <?php
 2 session_start();
 3 
 4 ?>
 5 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 6     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 7 <html xmlns="http://www.w3.org/1999/xhtml" lang="es" xml:lang="es">
 8     <head>
 9         <title>Exercicios cookies</title>
10         <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
11     </head>
12     <body>
13         <form action="UD4_cookies_ex3_gardar_cookie.php" method='post'>
14             <div>
15                 Nome:<select name='lstNome'>
16                 <?php
17                     $usuarios=['Pedro','Luis','Juan'];
18                     foreach($usuarios as $usuario){
19                         printf("<option>%s</option>",$usuario);
20                     }
21                 ?>
22                 </select>    
23             </div>    
24             <div>
25                 Nota:<input type='text' size='2' maxlength="2" name="txtNota" />    
26             </div>    
27             <input type='submit' value='GARDAR' />
28         </form>
29         <?php
30             if(!empty($_SESSION['notas'])){
31                 echo "As notas dadas ata o de agora son:<br />";
32                 $notas = $_SESSION['notas'];
33                 
34                 echo "<ol>";
35                 foreach($notas as $nota) {
36                     printf("<li>Nome:%s--->%s",htmlentities($nota['nome']),htmlentities($nota['nota']));
37                 }
38                 echo "</ol>";
39                 
40             }
41             if(!empty($_COOKIE['nome'])){
42                 printf("<p>O último alumno engadida a nota foi %s",htmlentities($_COOKIE['nome']));
43             }
44         ?>
45         
46     </body>
47 </html>


Páxina UD4_cookies_ex3_gardar_cookie.php

 1 <?php
 2 session_start();
 3 
 4 if (!empty($_POST)){
 5     $nome=filter_var($_POST['lstNome'], FILTER_SANITIZE_FULL_SPECIAL_CHARS, FILTER_FLAG_NO_ENCODE_QUOTES); 
 6     if (filter_var($_POST['txtNota'],FILTER_VALIDATE_INT) &&
 7         $_POST['txtNota'] > 0 &&
 8         $_POST['txtNota'] <= 10) {
 9     
10         $nota = ['nome'=>$nome,'nota'=>$_POST['txtNota']];
11         $_SESSION['notas'][] = $nota;
12         setcookie("nome",$nome);
13     }
14 }
15 
16 header("Location:UD4_cookies_ex3_listado.php");






-- Ángel D. Fernández González -- (2023).