Sei sulla pagina 1di 22

Formularios, Cookies y Sesiones

PHP: HyperText Preprocessor

HTTP: Conceptos Bsicos


Uno de los protocolos ms utilizados en Internet es HTTP (HyperText Transfer Protocol o protocolo de transferencia de hipertextos), que es precisamente el protocolo que se emplea en la World Wide Web fundamentalmente para la transferencia de documentos HTML e imgenes entre clientes (navegadores) y servidores web. El protocolo HTTP es un protocolo del nivel de aplicacin orientado hacia la comunicacin entre sistemas de informacin distribuidos, colaborativos e hipermedia. El sistema se basa en el envo de mensajes entre un cliente (navegador web) y un servidor. Dichos mensajes son la unidad bsica de la comunicacin HTTP. El cliente es siempre quien inicia la comunicacin, y para ello enva un mensaje que contiene una peticin, a lo que el servidor contesta con otro que contiene la respuesta.

Cada mensaje (tanto las solicitudes como las respuestas) est formado por dos partes: la cabecera y el cuerpo del mensaje. La cabecera se separa del cuerpo del mensaje por una lnea vaca, esto es, la cabecera no puede contener lneas en blanco puesto que esto sera interpretado como el comienzo del cuerpo del mensaje. Por su parte, la primera lnea de la cabecera es una lnea de solicitud (en las peticiones) o una lnea de estado (para las respuestas). En la cabecera de un mensaje se define informacin acerca de su contenido. As, por ejemplo, se define el tipo de mensaje, el tipo MIME del contenido, el tamao dicho contenido, etc. La estructura de cada lnea consiste en un nombre de campo seguido del carcter dos puntos (':') y el valor asociado a dicho campo. Estos campos permiten aadir una importante caracterstica al protocolo HTTP: la negociacin de los tipos y la representacin de contenidos entre cliente y servidor. En el cuerpo del mensaje (si es que existe, ya que un mensaje puede consistir slo en una cabecera) se incluye la informacin transmitida entre cliente y servidor. El cuerpo puede contener datos de un formulario, una imagen, un documento, etc. Por ejemplo, cuando un servidor web recibe una solicitud de un documento HTML, ste le enva un mensaje de respuesta al cliente con una cabecera en la que le indica el tipo de contenido, la fecha, el tipo de servidor, la longitud del mensaje, etc., a continuacin una lnea en blanco y despus el cuerpo del mensaje con la pgina HTML solicitada. Ejemplo de mensaje de respuesta enviado por un servidor web a un cliente:

En la primera lnea de este ejemplo se puede ver que el servidor contesta indicando un cdigo de estado 200 (la solicitud ha sido correctamente realizada), despus unas cuantas lneas con parejas nombre_de_campo: valor_asociado, a continuacin la lnea vaca que separa la cabecera del cuerpo del mensaje y por ltimo, el cuerpo del mensaje que contiene el documento HTML solicitado. Observe un detalle importante: el campo Connection, que tiene el valor close. Esto indica que la conexin ha finalizado, este concepto es importante: una vez que el servidor enva la respuesta a una peticin, la conexin se cierra. Este importante detalle hace que la lgica de las aplicaciones web sea bastante distinta a la lgica de las aplicaciones con interfaz directa con el usuario. Las aplicaciones web se construyen como una secuencia de pequeas fases individuales, siendo preciso el envo de todos los datos necesarios entre las distintas fases de la aplicacin, o bien, empleando alguna tcnica que permita "mantener el estado", como las cookies o las sesiones. A continuacin se presentan con mayor nivel de detalle los distintos tipos de mensajes y mtodos soportados por el protocolo HTTP y su implicacin en el desarrollo de aplicaciones sobre arquitecturas web.

Mensajes de Solicitud
Cuando un usuario pulsa sobre un enlace, el navegador se encarga de enviar un mensaje de solicitud al servidor correspondiente. Este mensaje contiene en la primera lnea de su cabecera el mtodo de solicitud empleado, el identificador del recurso solicitado y la versin del protocolo empleado. En la cabecera del mensaje y a continuacin de esta primera lnea, opcionalmente pueden figurar muchos campos que aportan informacin del cliente hacia el servidor. Un ejemplo de la primera lnea de una solicitud puede ser:
GET /LibroPHP/index.php HTTP/1.0

El cliente realiza la solicitud empleando el mtodo GET, el documento solicitado (identificado por su URI) est en el subdirectorio LibroPHP y se denomina index.php, y se ha empleado la versin 1.0 del protocolo. HTTP ha sido diseado como un protocolo de propsito general (no slo para el servicio www) y especifica diferentes mtodos que permiten a los clientes realizar solicitudes al servidor. En la siguiente
3

tabla se enumeran dichos mtodos:

Mtodo

Objetivo de la Solicitud

OPTIONS

Informacin relativa a opciones de comunicacin de un recurso

GET

Solicita un recurso imagen, etc.)

(documento

HTML,

script

PHP,

HEAD

Obtiene metainformacin acerca de un recurso

POST

Enva un mensaje con datos para ser procesados por un recurso

PUT

Enva un documento para ser almacenado en el servidor

DELETE

Solicita la eliminacin de un recurso en el servidor

TRACE

Genera informacin comunicacin

de

diagnstico

relativa

la

CONNECT

Mtodo proxys

reservado

para

comunicaciones

travs

de

Los mtodos ms empleados habitualmente y que tienen mayor importancia desde el punto de vista del desarrollo de aplicaciones son GET, HEAD y POST. MTODO GET
4

El mtodo GET es el que emplean habitualmente los navegadores para obtener un recurso, y permite solicitar cualquier tipo de recurso que est disponible en un servidor. Un ejemplo de peticin empleando este mtodo podra ser:
GET /LibroPHP/Cap07/metodoGET.php HTTP/1.0

Cuando el recurso solicitado (/LibroPHP/Cap07/metodoGET.php) requiere procesamiento para generar la informacin (como en este ejemplo), se obtiene como resultado los datos generados, no el recurso que realiza dicho procesamiento. As, cuando un cliente accede a un script PHP, obtiene el resultado de la ejecucin del script (habitualmente un documento HTML), no el cdigo del mismo. El mtodo GET se emplea frecuentemente para solicitar informacin y, a la vez, en la misma peticin enviar variables con sus correspondientes valores. Estas parejas de variables y valores se concatenan en el URI de la peticin a continuacin del recurso precedidas por el carcter de cierre de interrogacin ('?'). Toda esta cadena recibe el nombre de QUERY STRING(cadena de la consulta). La informacin transmitida en dicha cadena se codifica siguiendo las reglas indicadas para la codificacin URL. En los documentos HTML generados dinmicamente, es posible incluir enlaces que incluyan una peticin (empleando las habituales etiquetas <a href="">) y, adems, transmitan informacin variable hacia el servidor. Supongamos que hemos generado un script que solicita el nombre de usuario y su nmero de identificacin para acceder a una determinada informacin. Una vez validada esta informacin, deseamos mostrar al usuario (llamado Javier en nuestro ejemplo) a travs del scriptMostrarMsj.php sus mensajes pendientes de leer. Lgicamente, este nuevo script tambin necesita conocer el nombre del usuario previamente validado. Pues bien, para este cometido podemos generar un enlace a dicha pgina y adems enviarle una variable llamada user con el valor Javier. Para ello podramos hacer que el script generara un documento HTML con un enlace como:
<a href="/LibroPHP/Cap07/MostrarMsj.php?user=Javier">Leer mensajes</a>

Observe que cuando el usuario pulse sobre este enlace, su navegador enviar hacia el servidor un mensaje de solicitud cuya primera lnea ser parecida a la siguiente:
5

GET /LibroPHP/Cap07/MostrarMsj.php?user=Javier HTTP/1.1

El URI solicitado incluye la variable y el valor asociado. Tambin es posible concatenar ms de una pareja variable=valor empleando el carcter &. Por ejemplo, la cadena de la consulta podra conteneruser=Javier&uid=404. Cuando esta solicitud llega al servidor, PHP se encarga de incluir en una matriz asociativa denomina $_GET las parejas clave-valor correspondientes. As, en este caso, la matriz contendra las claves user y uid y tendran respectivamente asociados los valores Javier y 404. Otro ejemplo: el script metodoGET.php. se encarga de mostrar algunas de las variables relacionadas con el mtodo GET, y a continuacin imprime el contenido de la matriz asociativa $_GET. mtodo GET
<html> <head> <title>PHP: Peticin GET</title> </head> <body> <h2 align="center">Peticin GET</h2> <pre> <?php // Imprimimos algunas variables relacionadas echo <<< Fin_Texto *** Variables de la peticin *** Mtodo Solicitud: {$_SERVER['REQUEST_METHOD']} Query_String : {$_SERVER['QUERY_STRING']} Fin_Texto; // Y ahora imprimimos la matriz asociativa $_GET echo "\n *** Matriz \$_GET ***\n"; if (empty($_GET)) echo "La matriz \$_GET est vaca"; else foreach ($_GET as $clave => $valor) echo " $clave => $valor \n"; ?> </pre> </body> </html>

Los datos se envan realizando algunas transformaciones. Si se envan caracteres especiales en los URIs como el carcter de cierre de interrogacin, el espacio en blanco o el carcter de suma se aplican las reglas de transformacin de urls.
6

Codificacin URL

Dada la naturaleza multilenguaje de la tecnologa web, fue preciso determinar un sistema de representacin de los URLs que pudiera ser soportado por cualquier tipo de sistema con cualquier conjunto de caracteres. As, en el RFC 1738 se define la estructura y contenido de los URLs . Entre otros aspectos, en la seccin 2.2 de dicho documento se especifica la forma de codificar caracteres "poco habituales" en los localizadores, que es lo que habitualmente se conoce como codificacin URL. La codificacin URL sigue unas sencillas reglas: los "caracteres especiales" son reemplazados por una tripleta formada por el carcter % seguido de dos dgitos hexadecimales (0..9A..F) que representan el valor (en hexadecimal) del carcter correspondiente. As, por ejemplo, el carcter # es sustituido por los caracteres %23. Por motivos histricos, el carcter de espacio es reemplazado por el smbolo + (lo cual implica que el smbolo + deba, a su vez, ser reemplazado por su correspondiente codificacin hexadecimal que es %2B). Los caracteres especiales son los que estn contemplados en alguno de los siguientes grupos:

Aquellos que no tienen asignado un carcter grfico en el juego de caracteres US ASCII (como los smbolos , , , etc.) Los considerados como "peligrosos" (unsafe): (espacios en blanco, <, >, ", #, %, {, ...) Reservados con algn significado especial en algn esquema URL. Es el caso de los caracteres /, @, ?, &, ...

A continuacin se presenta un ejemplo de aplicacin de la codificacin URL. Supongamos que el usuario (variable$user) se llama "lvaro Gil", su identificador de usuario (variable $uid) ahora es "#13&05" y queremos generar un enlace que enve el nombre e identificador de usuario al script que hemos empleado anteriormente para procesar el formulario enviado mediante el mtodo GET (denominado metodoGET.php). El siguiente cdigo PHP intentara generar dicho enlace:
echo '<a href="metodoGET.php?user=', $user, '&uid=', $uid, '">';

Esta instruccin, al ser interpretada con los datos anteriores genera un documento con un enlace como el siguiente:
7

<a href="metodoGET.php?user=lvaro Gil&uid=#13&05">

Que es incorrecto pues incumple las reglas de construccin de URLs por contener caracteres no permitidos. Para resolver este problema, PHP ofrece dos tiles funciones que realizarn la codificacin y decodificacin URL. Estas funciones son urlencode() y urldecode(). Para evitar el problema anterior, basta con realizar la codificacin del contenido de las variables. El cdigo sera ahora el siguiente:
echo '<a href="metodoGET.php?user=', urlencode($user), '&uid=', urlencode($uid), '">';

Que en esta ocasin funcionara de manera adecuada generando el enlace:


<a href="metodoGET.php?user=%C1lvaro+Gil&uid=%2313%2605">

En la cadena de la consulta ahora han sido sustituidos todos los caracteres no permitidos en la construccin de URLs generando un enlace vlido. Por su parte, la funcin urldecode() se emplea para realizar la transformacin inversa, pero no es preciso emplearla ya que el intrprete de PHP se encarga de realizar esta transformacin.

MTODO HEAD Los mensajes de solicitud empleando el mtodo HEAD son idnticos a aquellos que emplean el mtodo GET, la nica diferencia est en el mensaje de respuesta: cuando se trata del mtodo HEAD, el servidor devuelve exclusivamente la cabecera de la respuesta, sin incluir el cuerpo del mensaje. Este mtodo sirve para poder consultar informacin relativa a un recurso (metainformacin) sin la necesidad de obtener dicho recurso. Esta informacin puede ser empleada, por ejemplo, para comprobar la validez de un enlace, la disponibilidad del mismo o cualquier dato existente en la cabecera de la respuesta. As, por ejemplo, puede ser interesante obtener la fecha de la ltima modificacin del recurso para determinar si se debe actualizar el contenido de otro recurso relacionado.

MTODO POST

El mtodo POST se emplea fundamentalmente para el envo de formularios. A diferencia del mtodo GET, empleando este mtodo, los datos del formulario son enviados en el cuerpo del mensaje y no en la cadena de la solicitud como ocurra anteriormente. De este modo, cuando se emplea POST para procesar los datos de un formulario, stos son enviados en el cuerpo del mensaje empleando las reglas de codificacin URL vistas anteriormente. Por tanto, en el URI solicitado, la cadena de la consulta (query string) suele estar vaca y exclusivamente suele figurar el nombre del recurso que realizar el procesamiento de dicho formulario. A continuacin se muestra un formulario que utiliza el mtodo POST para su envo:
<html> <head><title>Formulario POST</title></head> <body> <h2 align="center">Formulario POST</h2> <form action="metodoPOST.php" method="post"> nombre de usuario: <input type="text" name="user"><br> identificador de usuario: <input type="text" name="uid"><br> <input type="submit" value="enviar"> </form> </body> </html>

Programaremos ahora el script metodoPOST.php que realizar el procesamiento de los datos enviados por este formulario: mtodo POST
<html> <head> <title>PHP: Peticin POST</title> </head> <body> <h2 align="center">PHP: Peticin POST</h2> <pre> <?php // Imprimimos algunas variables relacionadas echo <<< Fin_Texto *** Variables de la peticin *** Mtodo Solicitud: {$_SERVER['REQUEST_METHOD']} Query_String : {$_SERVER['QUERY_STRING']} Fin_Texto; // Ahora imprimimos la matriz asociativa $_POST echo "\n *** Matriz \$_POST ***\n"; foreach ($_POST as $clave => $valor) echo " $clave => $valor \n"; ?> </pre> </body> </html>

El mtodo POST es ms aconsejable cuando se tiene que realizar una solicitud de un recurso que requiere el envo de un conjunto de datos, ya que los datos no figuran en la propia solicitud (no se ven en la direccin del navegador) y adems, tampoco se almacenan en los ficheros de registro (log) del servidor web. Por tanto, como norma general, podemos indicar que POST es el mtodo ms apropiado para el procesamiento de formularios.

Mensajes de Respuesta
Como se coment al inicio del presente mdulo, los mensajes que generan los servidores como respuesta a las peticiones de los clientes tambin estn formados por una cabecera y, opcionalmente, por un cuerpo del mensaje. A su vez, dicha cabecera contiene una primera lnea denominada lnea de estado seguida de una serie de campos con sus correspondientes valores. La estructura de la lnea de estado es la siguiente:
Versin_HTTP Cdigo_de_Estado Descripcin_Cdigo_Estado

As, la lnea de estado habitual generada por los servidores cuando las peticiones son correctamente atendidas ser:
HTTP/1.1 200 OK

Como puede apreciarse, dicha lnea est formada en primer lugar por la versin empleada del protocolo (habitualmenteHTTP/1.1), a continuacin un cdigo de tres dgitos que indica el estado de la solicitud recibida y, finalmente, una breve descripcin textual del cdigo de estado devuelto. Existen cinco clases de cdigos de estado (en funcin del primer dgito) que pueden apreciarse en la siguiente tabla: Cdigo Finalidad Estado de la Solicitud

1xx

Informacin

Ha sido recibida, el proceso contina

2xx

xito

Ha sido recibida, comprendida y aceptada

10

3xx

Redireccin

Se requiere una accin completar la solicitud

posterior

para

4xx

Error en el Cliente

La solicitud tiene una sintaxis incorrecta o no puede ser atendida

5xx

Error en el Servidor

El servidor ha sido incapaz de atender la solicitud

Crear una sencilla pgina que genera un mensaje de error: '404 Not Found'. Para ello se emplear la funcin header(), que permite incluir una lnea en la cabecera de la respuesta. Un detalle importantsimo, es que cuando se emplea esta funcin: esta lnea debe ejecutarse antes de que el script genere cualquier tipo de contenido, incluidos comentarios, lneas en blanco, etc., esto tiene una sencilla explicacin: la cabecera del mensaje de respuesta debe ser generada antes que cualquier contenido que figure en el cuerpo de dicho mensaje. As, cuando se emplee la funcin header(), modificaremos la estructura que estbamos empleando hasta ahora en los ejemplos, pues generara un error. funcin header()
<?php /* ///////////////////////////////////////////////////////// * Este script genera un error 404 - Documento no encontrado * ////////////////////////////////////////////////////// */ header('HTTP/1.1 404 Not Found'); ?>

Lgicamente, cuando se interpreta este script se produce el correspondiente cdigo de error y, dependiendo de la configuracin, el navegador muestra una pgina con el cdigo correspondiente (o una pgina en blanco si los errores estn desactivados). Hay que observar que muchos navegadores tienen una opcin (activada por defecto) a travs de la cual, si el servidor devuelve algn tipo de cdigo de error, muestran una pgina explicativa del error producido. Otro posible empleo bastante habitual de la funcin header() consiste en provocar redirecciones. Vamos a desarrollar un script, que al ejecutarse genera una cabecera de respuesta con una redireccin a otra pgina. En concreto, vamos a
11

provocar una redireccin a la pgina del manual de PHP en el que se muestran algunos de los libros que hay publicados sobre el lenguaje. El script es tan sencillo como: funcin header('Location: ...')
<?php /* ///////////////////////////////////////////////////////// * Este script genera una redireccin * ////////////////////////////////////////////////////// */ header('Location: http://es2.php.net/books.php'); ?>

Como puede observarse, es muy sencillo provocar una redireccin a otra pgina empleando este tipo de cabeceras. Adems, su utilidad es muy amplia, ya que es posible, por ejemplo, realizar cualquier tipo de procesamiento (que no genere ningn tipo de salida por pantalla) y despus realizar la redireccin. A continuacin se estudiarn los mecanismos de cookies y sesiones, que estn internamente muy relacionados con el envo de informacin en las cabeceras de las peticiones y respuestas, y nos permitirn mantener el "estado" a lo largo de mltiples scripts.

Cookies
HTTP es un protocolo sin estados. Esto significa que cada solicitud enviada por un cliente al servidor representa una conexin independiente. Por tanto, para realizar cualquier procesamiento que requiera ms de un paso, ser preciso utilizar algn tipo de mecanismo que permita mantener el "estado del proceso". Uno de estos posibles mecanismos es el empleo de cookies. Las cookies permiten a las aplicaciones residentes en el servidor enviar bloques de informacin que son almacenados por el cliente. Una vez almacenado dicho bloque, las posteriores solicitudes realizadas por el cliente incluyen el valor actual de la informacin almacenada en el mismo. A este bloque de informacin se le denomina cookie. Un aspecto importante a tener en cuenta es que el empleo de esta tcnica requiere que el software empleado por el cliente tenga habilitado el empleo de cookies. ESTRUCTURA DE UNA COOKIE

12

Una cookie es un bloque de informacin que est constituido por varios campos. Todos son opcionales excepto el nombre de la cookie. Su estructura es: Elemento Contenido

Nombre

Nombre de la cookie

Valor

Valor asociado a codificacin URL)

la

cookie (se enva

empleando la

fecha expiracin

Fecha de expiracin de la cookie

Path

Subconjunto de URLs para los que la cookie es vlida

Dominio

Rango de dominios para los que la cookie es vlida

Segura

Indica si la cookie se debe transmitir exclusivamente sobre conexiones seguras HTTPS

Si se enva solamente el nombre, la cookie ser eliminada en el cliente. Tambin debe tenerse en cuenta que la informacin almacenada en una cookie es enviada como un campo en la cabecera de las solicitudes que el cliente enva hacia el servidor. Por tanto, una aplicacin que desee emplear esta tcnica debe realizar al menos dos pasos: 1. En el primer paso se enviar la cookie 2. En el segundo (y posteriores) se podr consultar la informacin almacenada en la misma Un error muy habitual cuando se emplea esta tcnica consiste en dar valor e intentar consultar el contenido en el primer paso.
13

ENVO DE UNA COOKIE AL CLIENTE Para este cometido, PHP dispone de la funcin setcookie(). Esta funcin tiene seis parmetros (los seis campos indicados anteriormente), aunque slo el primero es obligatorio. A continuacin se desarrolla un sencillo script llamadoenvio_cookie.php que enviar una cookie denominada TDSW con una serie de valores que posteriormente sern consultados. Esta cookie ser vlida durante diez minutos para todos aquellos scripts que estn en el mismo directorio: funcin setcookie()
<?php /* ///////////////////////////////////////////////////////// * Este script enva una cookie llamada TDSW * ////////////////////////////////////////////////////// */ // Generamos los valores que se van a especificar para la cookie $nombre = 'TDSW'; // Nombre de la cookie $valor = 404; // Un valor cualquiera $fecha_expiracion = time() + 600; // Expira dentro de 10 minutos $path = dirname($_SERVER['REQUEST_URI']); // El path actual // Enviamos la cookie setcookie($nombre, $valor, $fecha_expiracion, $path, '', 0); // Escribimos la info (y para que no aparezca una pgina en blanco :) echo "Cookie enviada: $nombre, $valor, $fecha_expiracion, $path \n"; ?>

RECUPERACIN DE UNA COOKIE EN EL SERVIDOR La recuperacin desde un script PHP del contenido de una cookie es muy sencilla: basta con acceder a la matriz asociativa $_COOKIE. Esta matriz contiene una entrada nombre valor por cada cookie enviada por el cliente. En el siguiente ejemplo puede observarse cmo acceder a la cookie anteriormente generada (si es que an es vlida...): matriz $_COOKIE
<html> <head> <title>PHP: Recuperacin de Cookies</title> </head> <body> <h2 align="center">Cookies Disponibles</h2>

14

<table border="1" align="center"> <?php // listamos el contenido de la matriz $_COOKIE echo "<tr><th> Nombre Cookie </th><th> Valor </th></tr> \n"; if (empty($_COOKIE)) echo "<tr><td colspan='2'> No hay cookies vlidas disponibles </td></tr>\n"; else foreach ($_COOKIE as $nombre_cookie => $valor_cookie) echo "<tr><td nowrap>$nombre_cookie</td><td>$valor_cookie</ td></tr>\n"; ?> </table> </body> </html>

Slo quien enva la cookie conoce los detalles de la informacin enviada como son la fecha de expiracin, el path, el dominio, etc. CONTADOR DE ACCESOS EMPLEANDO COOKIES A continuacin desarrollaremos un sencillo contador personal de accesos a una pgina empleando la tcnica de envo y recuperacin de cookies. De esta forma, el valor del contador se almacenar en el cliente, no siendo necesario el almacenamiento de ningn tipo de informacin en el servidor. El funcionamiento es trivial: cada vez que se accede a la pgina, el script recupera el valor de la cookie y la reenva con el contador incrementado. De esta forma, cuando el cliente accede al script, ste no tiene ms que acceder al valor de la cookie para determinar cuntas veces ha visitado dicho cliente la pgina en cuestin. El cdigo de este script es el siguiente: Contador de Accesos (cookies)
<?php /* ///////////////////////////////////////////////////////// * Este script cuenta el nmero de accesos empleando cookies * ////////////////////////////////////////////////////// */ // Generamos los valores que se van a especificar para la cookie $nombre = 'ContadorTDSW'; // Obtenemos el valor del contador (evitando warnings no deseados...) if (!isset($_COOKIE[$nombre])) $veces = 1; else $veces = $_COOKIE[$nombre] + 1; // Expira el 01/01/2010 a las 00:00:00

15

$fecha_expiracion = mktime(0, 0, 0, 1, 1, 2010); // Esta cookie slo la ver el script actual $path = $_SERVER['REQUEST_URI']; // Ahora enviamos la cookie y despus generamos el documento setcookie($nombre, $veces, $fecha_expiracion, $path, '', 0); ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>PHP: Contador de Accesos (cookies)</title> </head> <body> <h2 align="center">Contador de Accesos (cookies)</h2> <?php if ($veces == 1) // Es la primera vez echo "Bienvenido por primera vez a nuestra pgina\n"; else echo "Has visitado nuestra pgina $veces veces\n"; ?> <br />Pulsa <a href=''>aqu</a> para volver a visitarnos... </body> </html>

Sesiones
Las sesiones permiten mantener variables PHP (con sus valores) a lo largo de ejecucin de varios scripts. Para que las sesiones funcionen correctamente, todos los pasos que se vayan a seguir en el servidor deben ser generados dinmicamente, esto es, no pueden aparecer pginas estticas (documentos HTML) en pasos intermedios. Importante Los datos almacenados para cada sesin son almacenados por PHP en un fichero en el directorio indicado por el parmetro session.save_path. Para que funcionen correctamente las sesiones, dicho parmetro del fichero de configuracin (php.ini) debe estar asignado a un directorio que realmente exista y disponga de los permisos necesarios. Para que un script forme parte de una sesin, al inicio del script y antes de generar cualquier tipo de etiqueta o contenidodebe ejecutar la funcin session_start(). Esta funcin indica al
16

intrprete de PHP que el script arranca una sesin, o que contina la sesin existente si ya existe una sesin activa. Importante Todos los scripts que formen parte de una sesin deben realizar una llamada a la funcin session_start()antes de generar cualquier tipo de etiqueta o contenido. Cada sesin es independiente y nica para cada usuario que visite nuestro sitio web, y PHP proporciona los mecanismos para acceder a las variables de sesin activas para cada usuario. La forma de acceder desde nuestros scripts a estas variables de sesin es anloga a la que se emple con las cookies, pero en este caso la matriz asociativa se denomina$_SESSION. Para mantener informacin a lo largo de la ejecucin de varios scripts de una sesin, simplemente basta con guardar dicha informacin en esta matriz asociativa. Vamos a desarrollar una pequea "tienda" de ejemplo que utiliza sesiones. El ejemplo est formado por cuatro scripts:

El primer script (entrada.php) arranca la sesin y solicita el nombre de usuario y la contrasea para acceder al sitio. Se ejecuta dos veces: o la primera ejecucin simplemente muestra un formulario que, una vez rellenado por el usuario, ser enviado al propio script o la segunda ejecucin del script "valida" los datos recibidos, los almacena como datos de la sesin y concede el acceso a la tienda El segundo script (tienda.php) muestra los artculos disponibles en la tienda y el contenido del "carrito de la compra". Desde este script se pueden realizar dos acciones: o Introducir un artculo en el carrito: se producir la ejecucin de un tercer script (compra.php), que recibe la referencia del artculo seleccionado y lo introduce en el carrito (almacenando su contenido en variables de sesin). Una vez realizada esta operacin provoca de nuevo la ejecucin del segundo script. o Finalizar la compra, que provoca la ejecucin del cuarto script (caja.php). Este script muestra el contenido del carrito, el
17

importe total, finaliza la compra y libera las variables de sesin. Para simplificar un poco el cdigo y hacerlo ms legible, hemos desarrollado una librera de funciones (denominadafunciones.php) que realizan operaciones auxiliares. Estas operaciones incluyen las siguientes funciones:
function validar($usuario, $pclave); Se encarga de validar si es correcto el nombre de usuario y la contrasea

function comprobarSesion(); Contina la sesin activa y verifica si est definido el nombre de usuario. En caso contrario provoca una redireccin a la pgina de entrada a la tienda

function mostrar_carrito(); Genera una tabla con el contenido del carrito

function estantes(); Muestra los artculos disponibles en la tienda entrada.php

Comencemos con el primer script, entrada.php. Como se ha comentado anteriormente, este script se ejecuta al menos dos veces: en la primera ejecucin muestra el formulario de acceso a la tienda, y en la segunda verifica los datos introducidos en dicho formulario. Veamos su implementacin: PHP [Sesiones]: entrada.php
<?php // ******************* // *** entrada.php *** // ******************* // incluimos la librera con las funciones auxiliares include "funciones.php"; // Iniciamos la sesin session_start(); // Inicializamos la variable de sesin del carrito $_SESSION['carrito'] = array();

18

// // // // // // // if

*** INICIO SCRIPT *** * - Si el mtodo es GET -> Mostramos el formulario * - Si el mtodo es POST -> Procesamos el formulario *** ($_SERVER['REQUEST_METHOD'] == 'GET') // Mostrar formulario

{ $contenido = <<< MarcaFinal <h1 align='center'>Entrada a MiTienda</h1> <form action='entrada.php' method='POST'> <table summary = "entrada sistema" border='0' align='center'> <tr><td>Usuario:</td> <td><input type='text' name='usuario' width='10' /></td></tr> <tr><td>Contrasea:</td> <td><input type='password' name='pclave' width='10' /></td></tr> <tr><td><input type='submit' value='Enviar Formulario' /></td> <td><input type='reset' value='Borrar Formulario' /></td></tr> </table> MarcaFinal; } else // Procesar formulario { // Comprobamos si el nombre de usuario y contrasea son correctos if (validar($_POST['usuario'], $_POST['pclave'])) { // Es correcto: asignamos la variable de sesin que guardar el nombre de usuario $_SESSION['usuario'] = $_POST['usuario']; // Generamos la salida $contenido = <<< MarcaFinal <h1 align='center'>Bienvenido $_POST[usuario]</h1> <p align='center'>Pulsa <a href='tienda.php'>aqu</a> para continuar...</p> MarcaFinal; } else // El nombre de usuario o la contrasea no son correctos { $contenido = <<< MarcaFinal <h1 align='center'>Error: nombre de usuario o contrasea incorrectas</h1> <p align='center'>Pulsa <a href='entrada.php'>aqu</a> para continuar...</p> MarcaFinal; } } ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>PHP [Sesiones]: entrada.php</title>

19

</head> <body> <?php echo $contenido; ?> </body> </html>

Como se puede comprobar, en este script no se genera ningn tipo de contenido hasta el final. Simplemente, se almacena la informacin en la variable $contenido y al final se genera el documento HTML correspondiente. Obsrvese adems (en el atributo action) como el formulario es procesado por el propio script. Una vez validado el usuario y la contrasea, el script da paso a la siguiente fase de la sesin, la pgina principal de la tienda.
tienda.php

Este segundo script es relativamente sencillo: verifica que sesin est activa, muestra los artculos disponibles, y muestra contenido del carrito. Cada artculo tiene un enlace script compra.php, que es el encargado de aadirlo al carrito de compra. Por ltimo, hay un enlace al script caja.php, para finalizar compra. PHP [Sesiones]: tienda.php
<?php // ****************** // *** tienda.php *** // ****************** // incluimos la librera con las funciones auxiliares include "funciones.php"; // Verificamos que la sesin est activa comprobarSesion(); ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <title>PHP [Sesiones]: tienda.php</title> </head> <body> <h1 align="center">Mi Tienda</h1> <?php // Mostramos los artculos disponibles estantes(); echo "<hr />\n";

la el al la la

20

// y el contenido del carrito mostrar_carrito() ?> <hr /> <p align="center"><a href='./caja.php'>Pasar por caja</a></p> </body> </html>

Los enlaces generados para cada artculo son del tipo:


compra.php?articulo=ref15

Como puede observarse, cada uno de estos enlaces enva en la cadena de la consulta (query string) un identicador nico con el cdigo de referencia del artculo. A continuacin presentamos el script encargado de aadir dicha referencia al carrito de la compra.
compra.php

Este script tambin es muy breve: verifica la validez de la sesin, incrementa el nmero de unidades de la referencia elegida y provoca una redireccin a la tienda para que el cliente siga comprando. PHP [Sesiones]: compra.php
<?php // ****************** // *** compra.php *** // ****************** // incluimos la librera con las funciones auxiliares include "funciones.php"; // Verificamos que la sesin est activa comprobarSesion(); // Recuperamos el contenido de la variable de sesin y el artculo $carrito = $_SESSION['carrito']; $articulo = $_GET['articulo']; // Incrementamos el nmero de unidades del artculo elegido if (empty($carrito[$articulo])) $carrito[$articulo] = 1; else $carrito[$articulo]++; // Guardamos la variable de sesin actualizada $_SESSION['carrito'] = $carrito; // Redirigimos a la tienda... y se acab ;-) $tienda = dirname('http://' . $SERVER_NAME . $REQUEST_URI) . '/tienda.php'; header("Location: $tienda");

21

?>

caja.php

Por ltimo, el script caja.php es ms breve an: como los anteriores, verifica la sesin, muestra el contenido del carrito (y el nombre del cliente), deja el carro vaco y proporciona una enlace de vuelta a la entrada. Al final del cdigo se dispone del correspondiente botn para comprobar el funcionamiento de estos scripts. PHP [Sesiones]: caja.php
<?php // **************** // *** caja.php *** // **************** // incluimos la librera con las funciones auxiliares include "funciones.php"; // Verificamos que la sesin est activa comprobarSesion(); ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>PHP [Sesiones]: entrada.php</title> </head> <body> <?php echo "<h1 align='center'>Contenido del carrito de ", $_SESSION['usuario'], "</h1>\n"; // Mostramos el contenido mostrar_carrito(); // "Vaciamos" el contenido de las variables de sesin $_SESSION = array(); ?> <p align='center'>Pulsa <a href='entrada.php'>aqu</a> para continuar...</p> </body> </html>

22

Potrebbero piacerti anche