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