Está en la página 1de 22

PHP Interaccin con el cliente

Aplicaciones Web/Sistemas Web

Juan Pavn Mestras


Dep. Ingeniera del Software e Inteligencia Artificial
Facultad de Informtica
Universidad Complutense Madrid

Material bajo licencia Creative Commons

PHP - Interaccin con el cliente

Formularios

Protocolo HTTP

El navegador (cliente, user agent) solicita un recurso (pgina


HTML, imagen, video, etc.) a un servidor

Solicitud: mtodo que se utiliza GET, POST, PUT, HEAD, etc.


Campos de cabecera
Lnea en blanco
Cuerpo del mensaje (texto): puede llevar parmetros del formulario

El servidor responde enviando el recurso o con un mensaje de


error

Lnea de estado: cdigo del estado (OK, Error) y texto asociado


Campos de cabecera
Lnea en blanco
Cuerpo del mensaje: el recurso solicitado
conexin

Cliente
(Navegador)

solicitud (GET/POST, ...)


y

80
x

Servidor

respuesta
cierre

Juan Pavn - UCM 2012-13

PHP

Paso de parmetros

La peticin del cliente puede llevar varios parmetros

Normalmente se obtienen de un formulario

Cmo se pasan depende de la accin indicada en el formulario


HTML en el que se recogen los datos

GET: peticin de informacin (operacin idempotente)


GETconsultatelefono.php?cliente=empresa1
Los parmetros se pasan como pares nombre=valor
Se pueden pasar varios parmetros seguidos con &
POST: peticiones que cambian el estado del servidor
Guardar o actualizar datos
Enviar email
Ordenar datos
POSTmodifica.php?cliente=empresa1&telefono=917892893

Juan Pavn - UCM 2012-13

PHP

Escenario tpico de interaccin (con GET)


hola.html

http://localhost/CursoPHP/hola.html

<p>Por
favor,indiquesunombre:
<form method="get"action="procesaform.php">
Nombre:
<inputtype="text"name="cliente"/>
<inputtype="submit"value="Enviar">
</form>
</p>

procesaform.php
<?php
$cliente=$_REQUEST["cliente"];
echo "Hola $cliente";
?>

Juan Pavn - UCM 2012-13

PHP

Escenario tpico de interaccin (con POST)


hola.html

http://localhost/CursoPHP/hola.html

<p>Por
favor,indiquesunombre:
<form method="post"action="procesaform.php">
Nombre:
<inputtype="text"name="cliente"/>
<inputtype="submit"value="Enviar">
</form>
</p>

procesaform.php
<?php
$cliente=$_REQUEST["cliente"];
echo "Hola $cliente";
?>

Juan Pavn - UCM 2012-13

PHP

Formularios

<form>

Conjunto de controles que permiten al usuario interactuar

Generalmente para introducir datos y enviarlos al servidor web


El navegador enva nicamente los datos de los controles contenidos
en el formulario
En una misma pgina puede haber varios formularios que enven
datos al mismo o a diferentes agentes

<form action="http://www.miweb.com/procesaform.php"method="post">
Escribetunombre:
<inputtype="text"name="nombre"value=""/>
<br/>
<inputtype="submit"value="Enviar"/>
</form>

POST "/procesaform.php"
nombre="valor"
Juan Pavn - UCM 2012-13

PHP

Formularios

Dentro de un formulario puede haber:

Cualquier elemento tpico de una pgina web


Prrafos, imgenes, divisiones, listas, tablas, etc.
Controles de formularios
<input />
<button>
<select>
<optgroup>
<option>
<textarea>
Estructura de formularios
<fieldset>
<legend>
Informacin para accesibilidad
<label> permite mejorar la accesibilidad de los controles

Juan Pavn - UCM 2012-13

PHP

Formularios

Atributos de <form>

action="URL": aplicacin del servidor que procesar los datos


remitidos (por ejemplo, un script de PHP)
method: mtodo HTTP para enviar los datos al servidor
GET: como aadido a la direccin indicada en el atributo action
Limitado a 500 bytes
Los datos enviados se aaden al final de la URL de la pgina y por tanto se
ven en la barra del navegador
Se suele usar cuando se enva informacin que no modifica el servidor (por
ejemplo, trminos para una bsqueda)
Si no se especifica, los navegadores suelen hacer GET

POST: en forma separada

Puede enviar ms informacin


Permite enviar ficheros adjuntos
Los datos enviados no se ven en la barra del navegador
Se suele usar cuando se enva informacin que puede modificar el servidor

enctype: Tipo de codificacin al enviar el formulario al servidor


"application/x-www-form-urlencoded" o "multipart/form-data"
Slo se indica cuando se adjuntan archivos

Juan Pavn - UCM 2012-13

PHP

Formularios

<input />

type = "text | password | checkbox | radio | submit | reset | file |


hidden | image | button" - Indica el tipo de control que se incluye en el
formulario
name = "texto" - Nombre del control (para que el servidor pueda
procesar el formulario)
value = "texto" - Valor inicial del control
size - Tamao inicial del control (en pxeles, salvo para campos de
texto y de password que se refiere al nmero de caracteres)
maxlength = "numero" - Mximo tamao de texto y de password
checked = "checked" Opcin preseleccionada para los controles
checkbox y radiobutton
disabled = "disabled" - El control aparece deshabilitado y su valor no
se enva al servidor junto con el resto de datos
readonly = "readonly" - El contenido del control no se puede modificar
src = "url" - Para el control que permite crear botones con imgenes,
indica la URL de la imagen que se emplea como botn de formulario
alt = "texto" - Descripcin del control

Juan Pavn - UCM 2012-13

PHP

10

Formularios

Cuadro de texto
Nombre<br/>
<inputtype="text" name="nombre"value=""/>

Se enviar al servidor cuando se pulse un botn de enviar


El nombre asignado en name tiene que concordar con el que se use en
la aplicacin en el servidor
No se deben utilizar caracteres problemticos en programacin
(espacios en blanco, acentos y caracteres como o )
value permite establecer un valor inicial en el cuadro de texto

Contraseas
Contrasea <br/>
<inputtype="password" name="contrasena"value=""/>

Igual que el cuadro de texto por el valor introducido no se ve

Juan Pavn - UCM 2012-13

PHP

11

Formularios

Cuadro de texto de varias lneas


Nombre<br/>
<textarea name="nombre"rows="4"cols="50">
Contenidoinicialdelcuadrodetexto
</textarea>

filas: nmero de filas visibles (sale una barra de desplazamiento si se


hay ms)
columnas: anchura en caracteres

Juan Pavn - UCM 2012-13

PHP

12

Formularios

Botn de envo de formulario


<inputtype="submit" name="enviar"value="Enviar"/>

El navegador se encarga de enviar automticamente los datos cuando


el usuario pincha el botn

Botn de reseteo de formulario


<inputtype="reset" name="borrar"value="Borrarformulario"/>

El navegador borra toda la informacin introducida y muestra el


formulario en su estado original

Juan Pavn - UCM 2012-13

PHP

13

Formularios

Botones en general: <button>


<button type="submit">Enviar</button>
<button type="reset">Borrar formulario</button>
<button type="button">Botn</button>

El navegador se encarga de enviar automticamente los datos cuando


el usuario pincha el botn

Juan Pavn - UCM 2012-13

PHP

14

Formularios

Casillas de verificacin (checkbox)


Lenguajes deprogramaci&oacute;n:<br/>
<inputname="java"type="checkbox" value="on"/>Java
<inputname="cplusplus"type="checkbox"value="on"/>C++
<inputname="csharp"type="checkbox"value="on"/>C#
<inputname="otros"type="checkbox"value="on"/>Otros
value indica el tipo de casilla: on/off, yes/no, true/false

Radiobutton
Sexo<br/>
<inputtype="radio" name="sexo"value="hombre"checked="checked"/>
Hombre
<inputtype="radio"name="sexo"value="mujer"/>Mujer

Juan Pavn - UCM 2012-13

PHP

15

Ejercicio

Crear una pgina PHP que genere un formulario con los


siguientes campos:
Un campo de texto para preguntar el nombre
Un campo radio button para seleccionar el sexo
Un campo checkbox para seleccionar lenguajes de programacin
Al hacer submit se envan los datos al servidor con POST y el servidor
devuelve una pgina que devuelve un texto que muestra los datos
recopilados.
Para probar lo que se enva al servidor, usar las herramientas de
desarrollador del navegador
Tambin se puede probar con GET y se vern los parmetros en la URL
resultante al hacer submit

Juan Pavn - UCM 2012-13

PHP

16

Formularios

Listas de seleccin
<formaction="">
<select name="lenguajes">
<optionvalue="c">C</option>
<optionvalue="cplusplus">C++</option>
<optionvalue="java"selected>Java</option>
<optionvalue="php">PHP</option>
<optionvalue="python">Python</option>
</select>
</form>

Atributos de option:
value determina el valor que se enva al servidor
selected permite definir la opcin por defecto

Juan Pavn - UCM 2012-13

PHP

17

Formularios

Agrupacin de elementos

Permite ver mejor las partes de un formulario agrupando elementos


relacionados
<legend> es el ttulo que se visualiza con el grupo

<form action="">
<fieldset>
<legend>Informacinpersonal:</legend>
Nombre:<inputtype="text"size="50"><br>
Email:<inputtype="text"size="50"><br>
Ciudad:<inputtype="text"size="20">
</fieldset>
</form>

Juan Pavn - UCM 2012-13

PHP

18

Informacin recibida con la solicitud del cliente

El valor de los parmetros se guarda en $_REQUEST

$_REQUEST ["nombre-parmetro"]
nombre-parmetro es el que en el formulario se indica con el atributo
name

<p>Nombre:<inputtype="text"name="nombre"/></p>

Si se quiere depurar se puede ver toda la informacin recibida con

print_r($_REQUEST);

Se pueden usar igualmente las siguientes variables superglobales

$_GET ["nombre-parmetro"]
$_POST ["nombre-parmetro"]
Pero $_REQUEST vale para ambos tipos de solicitudes

Juan Pavn - UCM 2012-13

PHP

19

Ficheros en formularios

Incluir un fichero

El atributo enctype en la etiqueta <form> del formulario tiene que ser


multipart/form-data

<form name="fichero"action="procesa_fichero.php"method="post"
enctype="multipart/form-data">
Fichero:<inputtype="file"name="archivo"/>
<inputtype="submit"value="Enviar">
</form>

Los ficheros recibidos se pueden acceder con $_FILE[]

$_FILE['campoFile']['name'] Nombre del fichero en el cliente


$_FILE['campoFile']['type']
Tipo MIME del fichero
$_FILE['campoFile']['size']
Tamao, en bytes, del fichero

Juan Pavn - UCM 2012-13

PHP

20

Validacin de la informacin recibida

Los campos de texto de los formularios siempre se reciben

Las casillas de verificacin y los botones radio solamente estn


definidos en $_REQUEST si se han marcado en el formulario

Conviene comprobar que no estn vacos

Conviene comprobar que estn definidos

SIEMPRE hay que validar los datos recibidos

Texto correcto
No vaco (strlen() > 0)
Eliminar caracteres en blanco (trim())
Cuidado con caracteres especiales
Nmeros
Bien formados
Enteros: intval()
Reales: floatval()

Rango de valores
Direccin de correo electrnico
Preg_match('/^[^@\s]+@([az09]+\.)+[az]{2,}$/i',$_POST['email'])
Juan Pavn - UCM 2012-13

PHP

21

Seguridad en las entradas

Conviene comprobar que no llegue cdigo con < y >

Podra ocasionar efectos inesperados

Juan Pavn - UCM 2012-13

PHP

22

Seguridad en las entradas

Para evitarlo se usa una funcin que elimine < y >

strip_tags(string)
Retira las etiquetas HTML y PHP de un string
htmlspecialchars(string)
Convierte caracteres especiales en entidades HTML

Tambin conviene quitar los espacios al principio

& &amp;
" (comillas dobles) &quot;
' (comilla simple) &#039;
< '&lt;'
> '&gt;'

trim(string)
Elimina los espacios en blanco iniciales y finales del string

En resumen, se debera hacer algo as:


$cliente=htmlspecialchars(trim(strip_tags($_REQUEST["cliente"])));

23

PHP

Juan Pavn - UCM 2012-13

Codificacin de caracteres especiales

Juan Pavn - UCM 2012-13

Carcter

Cdigo

%2F

%3A

%3D

"

%22

'

%60

(espacio)

%20

%3F

%40

&

%26

%5C

%7E

%7C
PHP

(tambin como +)

24

Funciones tiles para tratar strings

substr(string, posicin, [longitud])

Devuelve una subcadena de caracteres, a partir de la posicin idicada


y de longitud la especificada (o hasta el final si no se especifica)

strpos(string1, string2, [posicin])

Buscan en string1 la primera aparicin de string2


Si se especifica, se empieza a buscar a partir de la posicin indicada

htmlspecialchars(string)

Reemplaza en el string aquellos caracteres que no son vlidos en


HTML y los convierte en sus equivalentes vlidos (con &)

& &amp;

" &quot;

< &lt;

> &gt;

nl2br(string)

Cambia los saltos de lnea '\n' por <br>

Juan Pavn - UCM 2012-13

PHP

25

Ejercicio

Crear una pgina con un formulario que recoja informacin de un


nuevo cliente, la valide y la almacene en la base de datos tienda
como nuevo registro de la tabla clientes

Si todos los datos son correctos y se almacena bien en la base de


datos se mostrar una pgina indicando que la operacin se ha
realizado con xito, mostrando los campos del registro que se han
guardado
Si hubiera campos con datos incorrectos, volver a mostrar el
formulario resaltando dichos campos. Los datos que fueran correctos
aparecern en sus respectivos campos para que el usuario no tenga
que volver a introducirlos

Juan Pavn - UCM 2012-13

PHP

26

PHP - Interaccin con el cliente

Cookies

Cookies

HTTP es un protocolo SIN ESTADO

No se guarda informacin de la sesin/historia pasada


(Esto simplifica el protocolo)

Uso de cookies

Un cookie es un string que se pasa en una cabecera HTTP y que el


navegador puede guardar en un pequeo fichero de texto
En archivos temporales del navegador correspondiente

El cookie se reenva luego al servidor HTTP con cada peticin del


cliente a ese servidor
Los cookies no pueden capturar informacin del cliente
Slo recuerdan informacin proporcionada por el usuario al servidor
(es el servidor quien los crea)
Usos
Guardar las preferencias del usuario
Reconocimiento de usuarios
El cookie puede guardar un identificador que permite al servidor acceder a
todos los datos almacenados en su base de datos

Gestin de sesiones
Juan Pavn - UCM 2012-13

PHP

28

Cookies

Atributos

Par (Nombre, Valor)


Comentario (se puede presentar al usuario)
P.ej. para explicar para qu se usa el cookie (poltica del sitio web)
Especificacin de las pginas y dominios a los que se puede enviar el
cookie
Fecha y hora de expiracin
Permite controlar por ejemplo el tiempo mximo de una sesin antes
de volver a pedir login
Requiere o no una pgina segura
Versin

Tamao mximo: 4Kbytes

Seguridad

(Normalmente ocupan alrededor de 100 bytes)

Los cookies slo pueden ir al dominio especificado


No conviene poner informacin sensible en el cookie, mejor utilizar un
identificador en el cookie que sirva de clave de acceso en la base de
datos del servidor

Juan Pavn - UCM 2012-13

29

PHP

Cookies

Funcionamiento del mecanismo de cookies

crea cookie

respuesta HTTP
navegador

servidor

Juan Pavn - UCM 2012-13

peticin HTTP
Memoria/
Disco

PHP

30

Programacin de cookies con PHP

Creacin y envo de un cookie: setcookie()

El cookie se enva en la cabecera del mensaje de respuesta HTTP


El mtodo se tiene que llamar antes de que la pgina PHP genere
cualquier resultado (antes de cualquier sentencia echo o print)

El navegador recordar el nombre y valor del cookie y lo enviar


al servidor en peticiones posteriores

Los cookies recibidos con la solicitud del cliente se pueden consultar en


$_COOKIE[]
<?php
$cookie1="nombre";
$valor1="Juan";
$expira1=time()+3600*24;//expiraen24horas
setcookie($cookie1,$valor1,$expira1);
?>
<html>
<head><title>HolaCookie</title></head>
<body>
<?php
echo"<h1>Hola$_COOKIE[$cookie1]</h1>";
?>
</body>
</html>

Juan Pavn - UCM 2012-13

PHP

31

Programacin de cookies con PHP

setcookie($nombre, $valor, $tvida, $ruta, $dominio, $seguridad)

Las cookies tienen un $nombre y un $valor


El nombre no debe coincidir con el de un control de formulario porque
en $_REQUEST se guardara solo el valor del cookie, no el del control
Se puede indicar un tiempo de vida del cookie
Si no se indica, el cookie se elimina al cerrar el navegador
El tiempo se indica como tiempo Unix, esto es, el nmero de
segundos desde el 1 de Enero de 1970
La funcin time() devuelve el nmero de segundos que han pasado desde
esa fecha
Se indicar como $tvida=time()+$numeroSegundos;

$ruta y $dominio determinan pginas y dominios a los que se puede


enviar el cookie
$seguridad indica si se mandar el cookie nicamente en conexiones
seguras https (TRUE) o indistintamente (FALSE)

$cookie1="nombre";
$valor1="Juan";
$tvida=time()+3600*24;//expiraen24horas
setcookie($cookie1,$valor1,$tvida,".dominio.com");
Juan Pavn - UCM 2012-13

PHP

32

Programacin de cookies con PHP

Modificacin del valor de un cookie

Borrado de un cookie

Basta con crear nuevamente el cookie con otro valor


Se consigue creando el cookie con un tiempo de expiracin del pasado
setcookie("nombre","valor",time()60);

Uso de un cookie

Consultando su existencia en la superglobal $_COOKIE


Conviene comprobar antes que se haya recibido

if (isset($_COOKIE["nombre"])){
echo"<p>Elvalordelcookienombrees$_COOKIE[nombre]</p>";
}else {
echo"<p>Noseharecibidoelcookienombre.</p>";
}

Juan Pavn - UCM 2012-13

PHP

33

Ejercicios Cookies

Crea una pgina PHP que solicite al usuario un nombre y el


nmero de segundos de vida para el cookie asociado al nombre.
Comprueba su funcionamiento

Desarrolla una pgina PHP que recuerde el color de fondo


preferido por un cliente

Desarrolla una pgina PHP que compruebe si el navegador


permite crear cookies y devuelva un mensaje indicando si los
admite o no

Soluciones a ejercicios similares:

http://www.mclibre.org/consultar/php/ejercicios/cookies/cookies.html

Juan Pavn - UCM 2012-13

PHP

34

PHP - Interaccin con el cliente

Sesiones

Sesiones de usuario

Una sesin determina un contexto que relaciona las acciones del


cliente sobre un sitio web

Normalmente las variables son destruidas cuando acaba la ejecucin


de una pgina PHP
A veces es necesario guardar cierta informacin entre una pgina y
otra durante la navegacin de un cliente

Las sesiones tienen un ciclo de vida

Inicio de sesin
Login de usuario
Actividad del usuario
Flujo lgico de operaciones de consulta/modificacin de informacin
Cierre de sesin
Explcito por el usuario
Por expiracin de un tiempo de inactividad

Juan Pavn - UCM 2012-13

PHP

36

Mecanismos para implementar sesiones

Para gestionar las sesiones sobre HTTP (protocolo sin estado) se


podran usar varios mecanismos

Un cookie: PHPSESSID
Cuando se inicia una sesin en una pgina, el intrprete PHP
comprueba la presencia de este cookie y la establece si no existe
El identificador de sesin en la cookie PHPSESSID permite identificar
unvocamente ese cliente en el servidor
Variables de identificacin de sesin
Normalmente el usuario navega de una pgina a otra del mismo sitio
Se podra crear un identificador nico al visitar la primera pgina si
no existiera y pasarlo en las siguientes pginas
Como un argumento en cada GET

<ahref="siguiente.php?sesion=<?php echo$_GET['id_sesion'];?>">Siguientepgina</a>
En formularios, como un argumento oculto en el POST
<form action=siguiente.php method=post>
Camposdelformulario
<inputtype=hidden name=sesion value="<?php echo$_GET['id_sesion'];?>">
</form>

Juan Pavn - UCM 2012-13

PHP

37

Sesiones en PHP

PHP ofrece un mecanismo de gestin de sesiones que abstrae al


programador de cul de esos mecanismos se utilice

Normalmente usa cookies si el navegador lo permite, y si no el


identificador de sesin en GET y POST
Las variables de la sesin se guardan en un fichero en el servidor con
el nombre del identificador

Gestin de sesiones en PHP

1. Iniciar una nueva sesin: session_start();


Se tiene que invocar antes de escribir cualquier cosa con echo o print
Porque el identificador de la sesin se enva en la cabecera de respuesta
HTTP

2. Uso de la variable superglobal $_SESSION


Todas las variables de la sesin se incluirn y se pueden acceder,

entre pgina y pgina de una misma sesin, en el array $_SESSION


Siempre se tiene que haber invocado antes session_start() al
principio de la pgina (as PHP prepara las variables correspondientes
a la sesin)
3. Cerrar sesin: session_destroy();
Juan Pavn - UCM 2012-13

PHP

38

Ejemplo de sesin PHP


<?php session_start();?>
<html>
<head><title>EjemplodesesionesPHP</title></head>
<body>
<h1>EjemplodesesionesconPHP</h1>
<?php
if (!isset($_SESSION['contador'])){
echo"<p>Bienvenidoporprimeravez</p>";
$_SESSION['contador']=1;
}
else {
$_SESSION['contador']++;
echo"<p>Yanoshasvisitado".$_SESSION['contador'] ."veces.</p>";
}
?>
</body>
</html>

Juan Pavn - UCM 2012-13

PHP

39

Ejercicio Sesiones

Probar a crear dos pginas distintas para una misma sesin

En la primera crear la sesin

<?php
session_start();
$_SESSION["nombre"]="Juan";
print "<p>Sehaguardadotunombre.</p>";
?>

En la segunda usar alguna variable de la sesin creada

<?php
session_start();
print "<p>Hola $_SESSION[nombre],vemos quesiguespor aqu</p>";
?>

Juan Pavn - UCM 2012-13

PHP

40

Sesiones

Una sesin se puede destruir con la funcin session_destroy()

Los datos de una sesin en $_SESSION se guardan durante un


tiempo predeterminado de 24 minutos

Pero las variables correspondientes pueden seguir usndose en esa


ejecucin del script

La directiva de configuracin session.gc_maxlifetime permite


configurar este valor por defecto
ini_set(string varConfig, valor) permite modificar ese valor
Tiene que invocarse antes de session_start()

Los valores de $_SESSION se pueden borrar tambin como en


cualquier otra matriz mediante la funcin unset()

Juan Pavn - UCM 2012-13

PHP

41

Otras funciones para gestin de sesiones

session_register("variable")

session_unregister("variable")

Elimina la variable en la sesin

session_is_registered("variable")

Registra la variable en la sesin


Se debe especificar el nombre de la variable sin $
Las asignaciones a esa variable se mantendrn en futuras invocaciones
dentro de la sesin
Si no se hubiera invocado session_start(), esta funcin lo hace

Comprueba si la variable est registrada en la sesin

session_id()

Devuelve el identificador de la sesin

Juan Pavn - UCM 2012-13

PHP

42

Ejercicios Sesiones

Prueba a contar el nmero de accesos de un cliente a una pgina


durante una sesin. La pgina tendr un botn para iniciar la
sesin y otro para cerrarla. Tambin visualizar en cada
momento el nmero de accesos que se han producido a la pgina
durante la sesin

Es bastante similar al ejemplo anterior

Crea una secuencia de pginas que soliciten informacin sobre un


usuario. En la primera pgina su nombre, en la segunda su
nmero de telfono y en la tercera su email. En la cuarta se
mostrarn los datos recibidos

Prueba a acceder a la vez desde dos navegadores distintos para


comprobar que se pueden gestionar dos sesiones diferentes a la vez

Solucin a un problema similar en:

http://www.mclibre.org/consultar/php/ejercicios/nivel_medio/sesiones/sesiones.html

Juan Pavn - UCM 2012-13

PHP

43

Ejercicio: Autenticacin de usuarios

Crear un sistema de autenticacin de usuarios que guarde los


passwords codificados en una base de datos

Habr que cifrar el password


Se recomienda usar https
Qu informacin habr que guardar en la base de datos?
Ejemplo:

http://www.mclibre.org/consultar/php/ejercicios/nivel_medio/registro_usuarios.html

Con LDAP:
http://docstore.mik.ua/orelly/webprog/pcook/ch17_09.htm
http://www.ajpdsoft.com/modules.php?name=News&file=article&sid=494

Juan Pavn - UCM 2012-13

PHP

44

También podría gustarte