Procesamiento y validación de formularios en PHP

Anuncio
Tiempo: 2h
Procesamiento y
Validación de formularios
en PHP
Departamento de
Lenguajes y Sistemas Informáticos
Grupo de Ingeniería del Software
Noviembre 2009
[Ángel US V7] Diseño: Amador Durán Toro (2003-2006)
Versión original: Jose Antonio Parejo (noviembre 2008)
escuela técnica superior
de ingeniería informática
• Procesamiento en servidor
Escuela Técnica Superior
de Ingeniería Informática
Departamento de Lenguajes
y Sistemas Informáticos
PHP
1. Introducción
PDO
2. El lenguaje PHP
1. Comentarios
2. Tipos
5. Estructuras
de Control
6. Clases y
objetos
7. Clases
predefinidas
3. Estilos de
programación PHP
4. Variables Globales
4.1. La variable
$GLOBALS
4.2. La variable
$_SERVER
4.3. La variable
$_REQUEST
4.4. La variable
$_SESSION
Cliente web
8
2
7
4
3
Datos
1
4. Funciones
Lógica de Negocio
3. Variables
Presentación
[Ángel US V7] Diseño: Amador Durán Toro (2003-2006)
Introducción a PHP
6
SGBD
5
Servidor web
(con capacidad de procesamiento)
En la clase de Hoy
Sevilla, noviembre de 2006
Grupo de Ingeniería del Software
1
[Ángel US V7] Diseño: Amador Durán Toro (2003-2006)
Introducción a PHP
Variables Predefinidas
Escuela Técnica Superior
de Ingeniería Informática
Departamento de Lenguajes
y Sistemas Informáticos
1. Introducción
2. El lenguaje PHP
1. Comentarios
2. Tipos
3. Variables
• Generales
– $GLOBALS ≡ Variables Globales
– $_SERVER ≡ Informacion sobre la ejecucion y
configuracion del servidor web
– $_SESSION ≡ Gestion de la Sesion.
4. Funciones
5. Estructuras
de Control
6. Clases y
objetos
7. Clases
predefinidas
3. Estilos de
programación PHP
• Procesamiento de Datos
– $_REQUEST ≡ Datos de la peticion
– $_FILES ≡ Gestion del fichero enviado en la peticion
4. Variables Globales
4.1. La variable
$GLOBALS
4.2. La variable
$_SERVER
4.3. La variable
$_REQUEST
4.4. La variable
$_SESSION
Sevilla, noviembre de 2006
Grupo de Ingeniería del Software
2
[Ángel US V7] Diseño: Amador Durán Toro (2003-2006)
Introducción a PHP
Escuela Técnica Superior
de Ingeniería Informática
Departamento de Lenguajes
y Sistemas Informáticos
• Las variables globales definidas en esta sección
están accesibles en cualquier función o etiqueta
PHP
1. Introducción
2. El lenguaje PHP
1. Comentarios
2. Tipos
• Definición de $GLOBALS
3. Variables
4. Funciones
5. Estructuras
de Control
6. Clases y
objetos
– Esta variable es un array asociativo que contiene
referencias a todas las variables globales definidas.
7. Clases
predefinidas
3. Estilos de
programación PHP
4. Variables Globales
4.1. La variable
$GLOBALS
4.2. La variable
$_SERVER
4.3. La variable
$_REQUEST
4.4. La variable
$_SESSION
Sevilla, noviembre de 2006
Grupo de Ingeniería del Software
– Los nombres de las variables globales son las claves
del array.
3
[Ángel US V7] Diseño: Amador Durán Toro (2003-2006)
Introducción a PHP
Escuela Técnica Superior
de Ingeniería Informática
Departamento de Lenguajes
y Sistemas Informáticos
• La variable $_SERVER contiene información sobre
el entorno de ejecución y el servidor en el que se
está ejecutando el script.
1. Introducción
2. El lenguaje PHP
1. Comentarios
2. Tipos
3. Variables
4. Funciones
5. Estructuras
de Control
6. Clases y
objetos
7. Clases
predefinidas
3. Estilos de
programación PHP
4. Variables Globales
4.1. La variable
$GLOBALS
4.2. La variable
$_SERVER
4.3. La variable
$_REQUEST
4.4. La variable
$_SESSION
Sevilla, noviembre de 2006
Grupo de Ingeniería del Software
• Es un array asociativo, algunos de los elementos
que contiene son:
– 'PHP_SELF’: Ruta relativa del fichero que se está
ejecutando actualmente.
– ‘SERVER_ADDR’: Dirección IP del servidor en el cual se
está ejecutando el script actual.
– ‘SERVER_NAME‟: Nombre del servidor en el cual se está
ejecutando el script actual.
– „ SERVER_PORT‟: Puerto puerto usado por el servidor web.
– „REQUEST_METHOD’: Tipo de petición usada
(‘GET’,’POST’,…).
– ‘REMOTE_ADDR’: IP del sistema desde el que se solicitó la
pátina.
4
[Ángel US V7] Diseño: Amador Durán Toro (2003-2006)
Introducción a PHP
Escuela Técnica Superior
de Ingeniería Informática
Departamento de Lenguajes
y Sistemas Informáticos
1. Introducción
2. El lenguaje PHP
1. Comentarios
2. Tipos
3. Variables
4. Funciones
5. Estructuras
de Control
6. Clases y
objetos
• La variable $_REQUEST contiene los valores las
variables de la pectición HTTP. Lo habitual es
usarla para procesar los datos enviados por los
formularios.
• Es un array asociativo, que contiene a su vez
todos los elementos de $_GET, $_POST y
$_COOKIE.
• Una manera de comprobar si una variable ha sido
enviada en la petición actual sería:
7. Clases
predefinidas
3. Estilos de
programación PHP
4. Variables Globales
4.1. La variable
$GLOBALS
4.2. La variable
$_SERVER
4.3. La variable
$_REQUEST
4.4. La variable
$_SESSION
Sevilla, noviembre de 2006
Grupo de Ingeniería del Software
<?
if (isset($_REQUEST[„X‟]))
echo “„X‟=$_REQUEST[„X‟]”;
else
echo “La variable „X‟ no tiene valor”.
?>
5
[Ángel US V7] Diseño: Amador Durán Toro (2003-2006)
Introducción a PHP
Escuela Técnica Superior
de Ingeniería Informática
Departamento de Lenguajes
y Sistemas Informáticos
• Para procesar los ficheros subidos por los usuarios
de nuestros formularios usamos la variable global
$_FILES.
1. Introducción
2. El lenguaje PHP
1. Comentarios
2. Tipos
3. Variables
4. Funciones
5. Estructuras
de Control
• $_FILES es un array asociativo donde las claves
son los nombres de los elementos file del
formulario y los valores son a su vez otro array
con los siguientes elementos (por clave):
6. Clases y
objetos
– name: nombre del fichero subido
7. Clases
predefinidas
– type: tipo mime del fichero
3. Estilos de
programación PHP
4. Variables Globales
4.1. La variable
$GLOBALS
4.2. La variable
$_SERVER
4.3. La variable
$_REQUEST
4.4. La variable
$_SESSION
Sevilla, noviembre de 2006
Grupo de Ingeniería del Software
– size: tamaño del fichero en bytes
– tmp_name: localización en la que esta el fichero
temporalmente
– error: código de error
•
UPLOAD_ERR_OK
•
UPLOAD_ERR_INI_SIZE
•
UPLOAD_ERR_FORM_SIZE
•
UPLOAD_ERR_PARTIAL
•
UPLOAD_ERR_NO_FILE
•
UPLOAD_ERR_NO_TMP_DIR
•
UPLOAD_ERR_CANT_WRITE
6
[Ángel US V7] Diseño: Amador Durán Toro (2003-2006)
Introducción a PHP
• Ejemplo:
Escuela Técnica Superior
de Ingeniería Informática
Departamento de Lenguajes
y Sistemas Informáticos
1. Introducción
2. El lenguaje PHP
<?
if (isset($_FILES['documento']) &&
1. Comentarios
($_FILES['documento']['error'] == UPLOAD_ERR_OK)) {
2. Tipos
$nuevaRuta = “c:\\tmp\\” .basename($_FILES['document']['name']);
3. Variables
4. Funciones
if (move_uploaded_file($_FILES['document']['tmp_name'],
5. Estructuras
de Control
$ nuevaRuta)) {
6. Clases y
objetos
print("Fichero grabado en $nuevaRuta“);
7. Clases
predefinidas
} else {
print (“No se puedo mover el fichero a $nuevaRuta“);
3. Estilos de
programación PHP
}
4. Variables Globales
4.1. La variable
$GLOBALS
4.2. La variable
$_SERVER
4.3. La variable
$_REQUEST
4.4. La variable
$_SESSION
Sevilla, noviembre de 2006
Grupo de Ingeniería del Software
} else {
print( “Error en la subida del fichero.“);
}
?>
7
[Ángel US V7] Diseño: Amador Durán Toro (2003-2006)
Introducción a PHP
Escuela Técnica Superior
de Ingeniería Informática
Departamento de Lenguajes
y Sistemas Informáticos
1. Introducción
2. El lenguaje PHP
1. Comentarios
2. Tipos
• HTTP está diseñado como un protocolo sin estado,
lo que dificulta la creación de aplicaciones web.
• Una sesión es el tiempo que un usuario está
conectado de forma continuada
3. Variables
4. Funciones
5. Estructuras
de Control
6. Clases y
objetos
7. Clases
predefinidas
3. Estilos de
programación PHP
4. Variables Globales
4.1. La variable
$GLOBALS
4.2. La variable
$_SERVER
4.3. La variable
$_REQUEST
4.4. La variable
$_SESSION
Sevilla, noviembre de 2006
Grupo de Ingeniería del Software
• Un buen soporte para la gestión de sesiones sobre
HTTP implica:
– El mantenimiento de la sesión, es decir, detectar
cuando dos peticiones pertenecen a la misma
sesión.
– La capacidad de almacenar información asociada a
la sesión y acceder a ella desde nuestros scripts.
• Desde PHP 4.0 existe un conjunto de funciones de
gestión de la sesión, que facilitan mucho esta
tarea.
8
[Ángel US V7] Diseño: Amador Durán Toro (2003-2006)
Introducción a PHP
Escuela Técnica Superior
de Ingeniería Informática
Departamento de Lenguajes
y Sistemas Informáticos
1. Introducción
2. El lenguaje PHP
1. Comentarios
2. Tipos
3. Variables
• PHP usa por defecto cookies (pequeños
contenedores de datos que se almacenan en el
ordenador local del usuario) para mantener la
sesión.
– Esto hace que sea problema muy común que el navegador
del usuario tenga desactivada la opción de aceptar cookies
(por razones de seguridad).
4. Funciones
5. Estructuras
de Control
6. Clases y
objetos
7. Clases
predefinidas
3. Estilos de
programación PHP
• Cuando las cookies están desactivadas PHP usa
variables ocultas en la petición para mantener la
sesión.
4. Variables Globales
4.1. La variable
$GLOBALS
4.2. La variable
$_SERVER
4.3. La variable
$_REQUEST
4.4. La variable
$_SESSION
Sevilla, noviembre de 2006
Grupo de Ingeniería del Software
• Afortunadamente las funciones de gestión de
sesión de PHP nos abstraen de estos detalles (en
la mayoría de los casos).
9
[Ángel US V7] Diseño: Amador Durán Toro (2003-2006)
Introducción a PHP
Escuela Técnica Superior
de Ingeniería Informática
Departamento de Lenguajes
y Sistemas Informáticos
1. Introducción
• En PHP cada sesión está identificada por una
cadena de 32 caracter (el sessionID)
–
Esto implica que cada usuario conectado
concurrentemente tiene asociado un sessionID distinto.
2. El lenguaje PHP
1. Comentarios
2. Tipos
3. Variables
4. Funciones
5. Estructuras
de Control
6. Clases y
objetos
• Por defecto PHP guarda los datos asociados a una
sesión en el diretorio /tmp del servidor (cada
sesión almacena sus datos en un fichero
distinto).
7. Clases
predefinidas
3. Estilos de
programación PHP
4. Variables Globales
4.1. La variable
$GLOBALS
4.2. La variable
$_SERVER
4.3. La variable
$_REQUEST
4.4. La variable
$_SESSION
Sevilla, noviembre de 2006
Grupo de Ingeniería del Software
10
[Ángel US V7] Diseño: Amador Durán Toro (2003-2006)
Introducción a PHP
• La variable $_SESSION contiene los datos
relativos a una sesión.
Escuela Técnica Superior
de Ingeniería Informática
Departamento de Lenguajes
y Sistemas Informáticos
1. Introducción
2. El lenguaje PHP
1. Comentarios
2. Tipos
• Es un array asociativo, que permite almacenar y
recuperar datos en el ámbito de la sesión de un
usuario.
3. Variables
4. Funciones
5. Estructuras
de Control
6. Clases y
objetos
7. Clases
predefinidas
3. Estilos de
programación PHP
<? session_start(); ?>
…
<?
$_SESSION[„usuario`]=$_REQUEST[„usuario‟];
4. Variables Globales
4.1. La variable
$GLOBALS
4.2. La variable
$_SERVER
4.3. La variable
$_REQUEST
4.4. La variable
$_SESSION
Sevilla, noviembre de 2006
Grupo de Ingeniería del Software
$_SESSION[„passwd`]=$_REQUEST[„passwd‟];
?>
11
[Ángel US V7] Diseño: Amador Durán Toro (2003-2006)
Introducción a PHP
• Funciones para la gestión de la sesión en PHP:
Escuela Técnica Superior
de Ingeniería Informática
Departamento de Lenguajes
y Sistemas Informáticos
– session_start: Inicia una sesión y permite
almacenar variables en $_SESSION.
1. Introducción
2. El lenguaje PHP
1. Comentarios
2. Tipos
3. Variables
– session_destroy: Destruye los datos guardados
en la sesión
4. Funciones
5. Estructuras
de Control
6. Clases y
objetos
7. Clases
predefinidas
3. Estilos de
programación PHP
4. Variables Globales
4.1. La variable
$GLOBALS
4.2. La variable
$_SERVER
4.3. La variable
$_REQUEST
4.4. La variable
$_SESSION
Sevilla, noviembre de 2006
Grupo de Ingeniería del Software
– session_encode: Codifica los datos de la sesión
actual en una cadena
– Session_decode: Descodifica (y restaura) los
datos de la sesión desde una cadena
– session_id: Devuelve los 32 caracteres que forman
el identificador de sesión
12
[Ángel US V7] Diseño: Amador Durán Toro (2003-2006)
Introducción a PHP
Escuela Técnica Superior
de Ingeniería Informática
Departamento de Lenguajes
y Sistemas Informáticos
• Modularidación del código para tratar datos de
formularios:
1. Introducción
2. El lenguaje PHP
Datos en $_Session
1. Comentarios
2. Tipos
3. Variables
4. Funciones
5. Estructuras
de Control
formulario
tratamiento
6. Clases y
objetos
7. Clases
predefinidas
<%
<%
%>
%>
3. Estilos de
programación PHP
4. Variables Globales
4.1. La variable
$GLOBALS
4.2. La variable
$_SERVER
4.3. La variable
$_REQUEST
4.4. La variable
$_SESSION
Sevilla, noviembre de 2006
Grupo de Ingeniería del Software
exito
sí
¿errores?
no
<%
%>
13
[Ángel US V7] Diseño: Amador Durán Toro (2003-2006)
Introducción a PHP
formulario
<?
<%
Escuela Técnica Superior
de Ingeniería Informática
Departamento de Lenguajes
y Sistemas Informáticos
1. Introducción
2. El lenguaje PHP
1. Comentarios
2. Tipos
3. Variables
4. Funciones
5. Estructuras
de Control
6. Clases y
objetos
7. Clases
predefinidas
3. Estilos de
programación PHP
4. Variables Globales
4.1. La variable
$GLOBALS
4.2. La variable
$_SERVER
4.3. La variable
$_REQUEST
4.4. La variable
$_SESSION
Sevilla, noviembre de 2006
Grupo de Ingeniería del Software
%>
// Inicializamos o recuperamos la sesión
session_start();
$formulario=$_SESSION["formulario"];
$errores=$_SESSION["errores"];
// Asignamos valor por defecto a los elementos
if(!isset($formulario)){
$formulario["nombre"]="nombrePorDefecto”
$formulario["direccion"]="direccionPorDefecto“
}
$_SESSION["formulario"]=$formulario;
?>
…
<div id="div_errores">
<?
if(isset($errores)){
foreach($errores as $error){
print("<div class='error'>");
print("$error");
print("</div>");
}
}
?>
</div>
….
<div id="div_nombre">
<label for="nombre">Nombre:</label>
<input id="nombre" name="nombre"
value= „<?= $formulario[“nombre “]?>‟
</div>
…
Crear dos objetos en
Session:
• Para almacenar los datos
del formulario
• Para almacenar un Array
de errores
• Mostrar errores si los hay
/>
14
[Ángel US V7] Diseño: Amador Durán Toro (2003-2006)
Introducción a PHP
tratamiento
<?
<%
Escuela Técnica Superior
de Ingeniería Informática
Departamento de Lenguajes
y Sistemas Informáticos
1. Introducción
2. El lenguaje PHP
1. Comentarios
2. Tipos
3. Variables
4. Funciones
5. Estructuras
de Control
6. Clases y
objetos
7. Clases
predefinidas
3. Estilos de
programación PHP
4. Variables Globales
4.1. La variable
$GLOBALS
4.2. La variable
$_SERVER
4.3. La variable
$_REQUEST
4.4. La variable
$_SESSION
Sevilla, noviembre de 2006
Grupo de Ingeniería del Software
%>
• Verificar que
existen los
objetos
formulario y
errores. Si no
existen
redireccionar
al formulario
• Asignar los
valores que se
han enviado
• Validar los
datos en
Servidor
• Si hay
errores
redireccionar
al formulario
• Si no, enviar
a la página de
éxito
?>
session_start(); $formulario=$_SESSION["formulario"];
$errores=$_SESSION["errores"];
if(isset($formulario)){
$formulario["nombre"]=$_REQUEST["nombre"];
$formulario["direccion"]=$_REQUEST["direccion"];
$_SESSION["formulario"]=$formulario;
if(isset($formulario["nombre"]) && …)
{
Header("Location: exito.php");
}else{
$errores[1]="El nombre no puede ser vacío";
$_SESSION["errores"]=$errores;
Header("Location: formulario.php");
}
}else{
Header("Location: formulario.php”);
}
15
[Ángel US V7] Diseño: Amador Durán Toro (2003-2006)
Introducción a PHP
• Ejemplos de validación en PHP: Cadenas
<?
if(isset($_REQUEST ["nombre"]) && strlen($_REQUEST ["nombre"])>$X)
{
…
}else{
…
}
?>
Escuela Técnica Superior
de Ingeniería Informática
Departamento de Lenguajes
y Sistemas Informáticos
1. Introducción
2. El lenguaje PHP
1. Comentarios
2. Tipos
3. Variables
4. Funciones
•
5. Estructuras
de Control
6. Clases y
objetos
<?
if(isset($_REQUEST [“dominio"])){
if(substrrlen($_REQUEST [“dominio"],-5)=“us.es”){
…
}else{
…
}else{
…
Validación meramente
}
?>
7. Clases
predefinidas
3. Estilos de
programación PHP
4. Variables Globales
4.1. La variable
$GLOBALS
4.2. La variable
$_SERVER
4.3. La variable
$_REQUEST
4.4. La variable
$_SESSION
Sevilla, noviembre de 2006
Grupo de Ingeniería del Software
Pueden usarse las funciones de manipulación de cadenas
para realizar validaciones más complejas.
sintáctica
•
Para la validación de correos electrónicos consultar
http://code.iamcal.com/php/rfc822/rfc822.phps
•
Para la validación de número de cuenta corriente consular
http://en.wikipedia.org/wiki/Luhn
16
[Ángel US V7] Diseño: Amador Durán Toro (2003-2006)
Introducción a PHP
• Ejemplos de validación en PHP: Números
Escuela Técnica Superior
de Ingeniería Informática
Departamento de Lenguajes
y Sistemas Informáticos
1. Introducción
2. El lenguaje PHP
1. Comentarios
2. Tipos
3. Variables
4. Funciones
5. Estructuras
de Control
• Comprobar que es un número
<?
if(isset($_REQUEST ["nombre"]) && is_numeric($_REQUEST ["nombre"])){
…
}else{
…
}
?>
• Comprobar que es entero
6. Clases y
objetos
// ¿Es $X entero?
7. Clases
predefinidas
// ¿Es $X entero (formado por dígitos) positivo ($X>=0)?
3. Estilos de
programación PHP
4. Variables Globales
4.1. La variable
$GLOBALS
4.2. La variable
$_SERVER
4.3. La variable
$_REQUEST
4.4. La variable
$_SESSION
$esEntero=is_int( $X); // ¡¡¡¡¡¡ SI $X=0xCAFE devuelve TRUE!!!!
$esEnteroPositivo=ctype_digit($X);
// ¿Es $X entero (formado por dígitos) de cualquier signo?
$esEntero2=($X== strval(intval($X)));
• Comprobar que es decimal
// ¿Es $X un número decimal?
$esDecimal=($X== strval(floatval($X)));
Sevilla, noviembre de 2006
Grupo de Ingeniería del Software
17
[Ángel US V7] Diseño: Amador Durán Toro (2003-2006)
Introducción a PHP
• Ejemplos de validación en PHP: Fechas
Escuela Técnica Superior
de Ingeniería Informática
Departamento de Lenguajes
y Sistemas Informáticos
• Si tenemos dia, mes y año por separado
$esFechaValida=checkdate($mes, $dia,$año);
1. Introducción
2. El lenguaje PHP
1. Comentarios
2. Tipos
3. Variables
4. Funciones
5. Estructuras
de Control
6. Clases y
objetos
7. Clases
predefinidas
3. Estilos de
programación PHP
4. Variables Globales
4.1. La variable
$GLOBALS
4.2. La variable
$_SERVER
4.3. La variable
$_REQUEST
4.4. La variable
$_SESSION
Sevilla, noviembre de 2006
Grupo de Ingeniería del Software
• Si tenemos una cadena para la fecha
<?
$date1 = "11/15/1999“;
$date2 = "12/10/2000";
list ($month1, $day1, $year1) = explode ("/", $date1);
list ($month2, $day2, $year2) = explode ("/", $date2);
$timestamp1 = mktime (0, 0, 0, $month1, $day1, $year1);
$timestamp2 = mktime (0, 0, 0, $month2, $day2, $year2);
$diff = ($timestamp1 > $timestamp2) ?
($timestamp1 - $timestamp2) : ($timestamp2 - $timestamp1);
print(“La diferencia entre las fechas es ";
print(date ("Y“, $diff) – 1970);
print(" año(s), " . (date ("m", $diff) - 1);
print(“ mes(es) y " . (date ("d", $diff) - 1);
print " día(s).";
?>
18
[Ángel US V7] Diseño: Amador Durán Toro (2003-2006)
Introducción a PHP
• Ejemplos de validación en PHP: Instantes
Escuela Técnica Superior
de Ingeniería Informática
Departamento de Lenguajes
y Sistemas Informáticos
1. Introducción
2. El lenguaje PHP
1. Comentarios
•
PHP incorpora una función strtotime, que
intenta inferir el formato a partir de la cadena
y devolver el instante temporal.
<?
2. Tipos
3. Variables
4. Funciones
5. Estructuras
de Control
6. Clases y
objetos
?>
$nacimiento = “2 Noviembre 1976 01:50am";
$instante_nacimiento = strtotime ($birth_time);
print(“Tienes una edad de “);
print( number_format (time() - $instante_nacimiento));
print( " segundos “);
7. Clases
predefinidas
3. Estilos de
programación PHP
4. Variables Globales
4.1. La variable
$GLOBALS
4.2. La variable
$_SERVER
4.3. La variable
$_REQUEST
4.4. La variable
$_SESSION
Sevilla, noviembre de 2006
Grupo de Ingeniería del Software
19
Descargar