Desarrollo de aplicaciones web con PHP y MySQL
Cookies y sesiones en PHP
Sergio Sáez y José Luis Poza
© 2015 Sergio Sáez y José Luis Poza

1. Cookies en PHP

2. Estableciendo una cookie

<?php
setcookie
("nombre""Sergio Saez");
setcookie("usuario""ssaez"time()+3600); // Expira en una hora
setcookie("password"$passwordtime()+3600"/~ssaez/",".upv.es");
setcookie("password"""0""""true);
?>

3. Cookies en el navegador

4. Accediendo a una cookie en PHP

<?php // Establece la cookie
  
setcookie("nombre""Sergio Sáez");
?>
<?php // La siguiente página que se cargue podrá verla
  
echo "Nombre: "$_COOKIE["nombre"];
?>
Nombre: Sergio Sáez
<?php // La cookie no se puede ver en el mismo script que la define
  
if (!isset($_COOKIE["nombre"])) {
    
setcookie("nombre""Desconocido");
  } 
// endif
  
echo "Nombre: "$_COOKIE["nombre"];
?>
PHP Notice:  Undefined index: nombre in - on line 5
Nombre:

5. Flujo de datos con las cookies

  1. El navegador solicita una página en PHP
  2. El servidor web la procesa, genera una cookie y se la envía al navegador.
    • En el script que genera la cookie, ésta no se puede ver.
  3. El navegador la almacena, y la enviará en todas las siguientes peticiones a ese servidor.
  4. El interprete PHP verá las nuevas cookies que le envía el navegador.
Primera petición
GET /~ssaez/intranet/ HTTP/1.1
Host: viver.disca.upv.es:8080
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.12) Gecko/20090207 ...
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain; ...
Accept-Language: es,en;q=0.7,en-us;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-15,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Respuesta
HTTP/1.1 200 OK
Date: Thu, 14 Feb 2009 19:08:55 GMT
Server: Apache/2.2.4 (Ubuntu) mod_python/3.3.1 Python/2.5.1 PHP/5.2.3-1ubuntu6.3
X-Powered-By: PHP/5.2.3-1ubuntu6.3
Set-Cookie: PHPSESSID=563df31d660d982d9df4721cbc07aafb; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Length: 7344
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
   <head>
...
Siguinte petición
GET /~ssaez/intranet/ HTTP/1.1
Host: viver.disca.upv.es:8080
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.12) Gecko/20090207 ...
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain; ...
Accept-Language: es,en;q=0.7,en-us;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-15,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Cookie: PHPSESSID=563df31d660d982d9df4721cbc07aafb

6. Vectores de cookies

7. Sesiones en PHP

8. Acceso a las variables de sesión

9. Ejemplo de uso de $_SESSION

10. Otras funciones

11. Precauciones en el uso de sesiones

Comenzar una sesión
Se debe comenzar una sesión con session_start() en cada fichero PHP en que se quieran utilizar las variables de sesión, ya sea para modificarlas o para consultarlas.

Cuidado, si se utilizan cookies para almacenar el identificador de sesión, no se debe enviar nada hacia el navegador antes de comenzar la sesión.

Destruir una sesión
Una sesión se destruye con session_destroy() sólo cuando ya no quieres volver a utilizar las variables de sesión existentes.

No se debe utilizar al final de cada fichero PHP, sólo cuando el usuario se vaya a "desconectar".