You are on page 1of 151

Desarrollo de aplicaciones web con PHP y MySQL

El lenguaje PHP

Miguel A. Redondo Crescencio Bravo Ana Isabel Molina
Grupo CHICO Escuela Superior de Informática Ciudad Real

El lenguaje PHP
• Objetivos
– Conocer las características básicas de las aplicaciones desarrolladas con PHP y situarlas frente a otras tecnologías – Adquirir conocimientos y destreza básica para utilizar PHP en
• Aplicaciones web dinámicas • Formularios • Acceso a bases de datos

– Conocer otras posibilidades de PHP
2

Contenidos
• • • • • • • • Introducción Instalación de APACHE, PHP, MySQL Instalación de FoxServ Sintaxis básica del lenguaje PHP PHP y Formularios Web Acceso a bases de datos con PHP Gestión de sesiones con PHP Seguridad con PHP

3

Introducción .

Introducción • Páginas web estáticas – Archivos HTML almacenados en un servidor – Poca o nula interacción del usuario – Información que varía con muy poca frecuencia – Mantenimiento de la información modificando documentos HTML 5 .

.. . fecha. – Aplicaciones tipo • • • • Periódico online Aplicación de comercio electrónico Enciclopedia Buscador 6 .Introducción • Páginas web dinámicas – HTML generado automáticamente en el servidor y en tiempo de ejecución – Programas en el servidor cuya respuesta varía según la petición.

Introducción • Generación de webs dinámicas – Generación a partir de opciones en la petición • Ejecución de programas en el servidor • Interacción con el usuario – Acceso a bases de datos • Generación de la página web según los contenidos de una BD • Mantenimiento mediante modificación de los contenidos de la base de datos 7 .

Tecnologías • Common Gateway Interface: CGI • Lenguajes de script – Software libre: PHP – Microsoft: ASP • Tecnología Java: JSP • Otros 8 .

CGI’s – Especificación para transferir información entre un servidor web y un programa ejecutable – Protocolo para envío y recepción de datos – Recepción • Entrada estándar • Variables de entorno que crea el servidor antes de llamar al CGI – Envío: salida estándar • Cabecera de tipo MIME: content-type: [tipo] • Cuerpo de los datos 9 .

HTML B ase de Datos 10 .) CGI Otras Fuentes de Datos Docum. IIS .Funcionamiento de CGI’s Internet Cliente W eb (Brows er) [ HTTP ] [ HTTP ] Servidor Web (Apac he...

html.cgi o directorio específico) – Se ejecuta en el sistema – Envía el resultado de la ejecución al cliente • Si_no – Otros • Fin_Si – Fin_si 11 . etc.Activación de un CGI • Servidor – Recibe URL – Determina el archivo al que referencia – Si es html (ext. .) • Lo envía al cliente que hace la petición – Si_no • Si es un programa (ext.htm. . .

Lenguajes para CGI • Cualquier lenguaje • Los más utilizados – Perl – Python –C – C++ – Tcl – Bourne Shell – Visual Basic 12 .

Ejemplo de CGI 13 .

CGI’s y Bases de Datos • Utilización de las bibliotecas BDI y DBD – Interfaz para el envío de comandos SQL a una base de datos – BDI independiente de la base de datos – DBD dependiente de la base de datos 14 .

) Inter faz DBI CGI Módulo DBI Interfaz DBD Otras Fuentes de Datos Docum.. HTML Modulo DBD para Oracle Modulo DBD Postgres Modulo DBD para MySQL Interfaz del Driver del Fabricante Dr iver de O racle Driver de Postgres Driver de MySQ L Interfaz Propietario BD Oracle BD PostGres BD MySQL 15 .CGI’s y Bases de Datos Internet Cliente W eb (Browser) [ HTTP ] [ HTTP ] Servidor Web (Apache. IIS..

y serv. web • Desventajas – Las comunicaciones permanecen abiertas hasta que se genera el resultado – Cada programa consume un nuevo proceso (o hilo) en el servidor – Problemas de seguridad • Llamadas al shell que pueden degenerar en ataques al sistema 16 .Discusión sobre CGI’s • Ventajas – Simplicidad – Independencia: lenguaje de prog.

IIS.) Páginas HTML Otras Fuentes de Datos Base de Datos 17 . Cliente W eb (Browser) Documen to HTM L estándar Servidor Web (Apache.ASP. ASP..) Página Página Dinám ica Dinámica M otor Lenguaje Script (PHP....ASP....Lenguajes de Script Petición página PHP.) (PHP..

El lenguaje PHP • • • • • Personal Home Page Tools (PHP) Ejecución de scripts en el servidor: interpretado Creado por Rasmus Lerdorf (1994) Alternativa a la programación CGI/Perl Se ejecutan en el contexto (proceso) del servidor web – Módulo de extensión a un servidor web – Posibilidad de utilización de múltiples hilos • Idóneos para servidores que soportan gran volumen de usuarios • Orientado a conexiones entre páginas web y diferentes servidores de bases de datos 18 .

php <HTML>..</HTML> Navegador Web Servidor Web Módulo de PHP Base de Datos Otros Servicios 19 ..Entorno de ejecución de PHP Petición de URL.

Otros comentarios sobre PHP • Software libre • Conexión nativa a múltiples bases de datos – Eficiencia • Las operaciones se resuelven en el mismo espacio de memoria asignado a PHP • Posibilidad de comunicación con otros procesos – Sistema UNIX – Deamons • Portado a multitud de plataformas y servidores 20 .

ASP • Active Server Pages (ASP) • Disponible por primera vez con IIS 3.0 • Código Visual Basic Script que genera dinámicamente archivos HTML que se envían al cliente • Permite el acceso a objetos y componentes en el servidor (Sistemas Windows) • Ejecución en el mismo proceso servidor • Funcionalmente equivalente a PHP • Lenguaje propietario 21 .

asp <HTML>.Funcionamiento de ASP Petición de URL.</HTML> Navegador Web Servidor Web Intérprete Visual Basic Script Componentes Active X Otros Servicios Base de Datos 22 ...

Otros comentarios sobre ASP • Funcionamiento razonable sobre IIS de Microsoft • Conexión a bases de datos con ODBC y objetos COM – Mayor tiempo de ejecución • Lenguajes de programación VBScript y Jscript • ASP .NET – Múltiples lenguajes de programación 23 .

etc. acceso a datos.) • JDBC – Acceso directamente a bases de datos relacionales – Pude utilizarse sobre ODBC 24 .JSP • Tecnología Java de SUN • Java Server Pages (JSP) – Alternativa a PHP o ASP • Servlets – Programación Java en servidor – Acepta peticiones y genera resultados (html.

Funcionamiento de JSP Petición de URL.jsp <HTML>.</HTML> Navegador Web Servidor Web Motor de Servlets Servlets Páginas JSP Servicios J2EE Base de Datos Otros Servicios 25 ...

class) 26 .java) • Clase Java compilada (.Funcionamiento de JSP • Una página JSP pasa por tres etapas en la evolución de su código: • Código fuente JSP (.jsp) • Código fuente Java (.

Otras tecnologías: NSAPI e ISAPI • NSAPI – API proporcionado por el servidor de Netscape • Objetivo – Resolver el problema de rendimiento de los CGI – Los script se cargan como parte del servidor – Acceso a todos los recursos del servidor • ISAPI – Microsoft Internet Information Server API • Características – – – – Flexibilidad y potencia Problemas de seguridad Poca portabilidad: limitado a cada tipo de servidor Los API son propietarios 27 .

Otras tecnologías: CACHÉ y CSP • CACHÉ Motor de Datos Multidimensional Arquitectura de Datos Unificada Base de Datos PostRelacional 28 .

Otras tecnologías: CACHÉ y CSP Caché Server Pages (CSP) Tecnología integrada en Caché Browser Web Server Gateway de Caché Caché Server 29 .

En este curso • APACHE – Servidor más utilizado en el mundo • PHP – Seguridad – Facilidad para conexión a bases de datos • MySQL – Soporte SQL – Libre disposición – Muy potente para bases de datos de tamaño medio 30 .

Instalación de APACHE. PHP. MySQL .

com – PHP: www.Instalación en Linux • Paquetes necesarios – Apache: www.mysql.net 32 .php.org – MySQL: www.apache.

Instalación en Linux • Procedimiento (pude depender de la distribución que utilicemos) – – – – – – Descompresión de paquetes Compilar MySQL Instalar MySQL Creación de las BBDD del sistema Iniciar el servidor de MySQL Configuración de Apache para compilación. activando el módulo para PHP – Definición de extensiones para tratarlas con PHP – Probar Apache + PHP 33 .

Instalación de FoxServ .

Otras alternativas • FoxServ – Completo y eficiente paquete que instala Apache. MySQL y PhpMyAdmin en Windows – Lo hace de una sola vez – No requiere configurar los componentes de forma independiente – Todos los componentes se instalan en un directorio con subdirectorios para cada paquete 35 . PHP. Zend Optimizer.

FoxServ En la última pantalla de la instalación nos permitirá seleccionar la opción de ejecutar el Apache y dirigir el navegador a http://localhost y ver si se ha instalado todo correctamente. Administración de MySQL http://localhost/phpMyAdmin 36 .

Sintaxis básica del lenguaje PHP .

/* … */ y // • Inserción en documento HTML – <?PHP . • Comentarios: como en C. ?> – <?= expresión ?> • equivale a <? echo expresión ?> • La marca final ?> implica un ... 38 .Sintaxis básica de PHP • Es sensible a las mayúsculas • Las instrucciones se separan con un . como en C.

print “Hola “ . echo “Hola “. print “Hola mundo”.Sintaxis básica de PHP • Sentencias para impresión – echo • muestra una o más cadenas • echo cadena1 [. cadena2…]. “mundo”. echo “Hola mundo”. “mundo”. 39 . – print • muestra una cadena • print cadena.

?> 40 .Ejemplo PHP <?php phpinfo().

?> </body> </html> 41 .Ejemplo PHP <html> <head> <title>Example</title> </head> <body> <?php echo "Hola. Esto es PHP".

"Hello. "</html>".Ejemplos PHP <html> <body> <?php print "Hello. "<body>". world. "</body>".".". ?> </body> </html> <?php print print print print print ?> "<html>". world. 42 .

Sintaxis básica de PHP • Sugerencia – Intentar generar código HTML fácilmente legible print (“<P>Párrafo 1</P>”). Código PHP <P>Párrafo 1</P><P>Párrafo 2</P> Código HTML Párrafo 1 Salida Párrafo 2 Poco legible 43 . print (“<P>Párrafo 2</P>”).

Sintaxis básica de PHP • Sugerencia – Utilización del carácter ‘\n’ para generar código HTML fácilmente legible Código PHP print (“<P>Párrafo 1</P>\n”). Código HTML <P>Párrafo 1</P> <P>Párrafo 2</P> Salida Párrafo 1 Párrafo 2 44 . print (“<P>Párrafo 2</P>\n”).

Sintaxis básica de PHP • Utilización de archivos externos para ser evaluados – include() • En caso de error produce un warning – require() • En caso de error produce un error fatal • Se usa cuando debe interrumpirse la carga de la página en caso de error 45 .

require ("$libdir/fecha. . require ("$libdir/cadena. require ("$libdir/globals.Ejemplo de PHP <HTML> <HEAD> <TITLE>Título</TITLE> <?PHP // Incluir bibliotecas de funciones require ("$libdir/conecta. <?PHP include ("pie.html").html"). ?> <HTML> <HEAD> <TITLE>Título</TITLE> </HEAD> <BODY> <?PHP include ("cabecera.php"). ?> // Código HTML + PHP .php").php"). ?> </BODY> </HTML> 46 . .php").

string – array. NULL • Las variables no suelen ser tipificadas – El tipo se decide en tiempo de ejecución en función del contexto y éste puede variar 47 .Tipos de datos en PHP • Tipos primitivos – boolean. double. integer. object – resource.

Tipos de datos en PHP
• Funciones para tipos de datos
– gettype()
• devuelve el tipo de una variable

– is_type: funciones para comprobar el tipo
•is_array() •is_bool() •is_float() •is_integer() •is_null() •is_numeric() •is_object() •is_resource() •is_scalar(), •is_string()

– var_dump()
• Muestra el tipo y el valor de una variable • útil con los arrays
48

Tipos de datos en PHP
• Consideraciones sobre el tipo String
– Las cadenas se encierran entre comillas
• Simples
– Admite los caracteres de escape \’ y \\ – No se produce expansión de las variables » print ‘a vale $a’; // muestra a vale $a

• Dobles
– Admite más caracteres de escape, como \n, \r, \t, \\, \$, \” – Permite la expansión de las variables » print “a vale $a”; // muestra a vale 9

– Acceso a los caracteres de una cadena tratándola como un array
• $inicial = $nombre{0};
49

Tipos de datos en PHP
• Consideraciones sobre el tipo Array
– Indexados y asociativos – Sintaxis:
• array ([clave =>] valor, ...) • La clave es una cadena o un entero no negativo. • El valor puede ser de cualquier tipo válido en PHP

– Funciones relacionadas
• Creación: list(), array() • Ordenación: asort(), arsort(), ksort(), rsort(), sort() • Otras funciones: count(), next(), prev(), each()

50

15). ‘verde’=>51. – Acceso: • $color[‘rojo’] • $medidas[0] • El primer elemento es el 0 51 . ‘azul’=>255). 25. • $medidas = array (10.Tipos de datos en PHP • Consideraciones sobre el tipo Array – Ejemplos: • $color = array (‘rojo’=>101.

Tipos de datos en PHP • Conversiones entre tipos 52 .

$_GET. seguido de letras. $_POST. $_FILES. $_REQUEST. $_SERVER. • Predefinidas – Unas creadas por el servidor y otras por PHP – $GLOBALS. $_ENV. $_SESSION – Lista completa: phpinfo() 53 . números o subrayado – Sensibles a las mayúsculas – Las variables siempre se asignan por valor – En PHP4 existen asignaciones por referencia (&).Variables en PHP • Nombres – Identificador precedido de un $ – El identificador comienza por letra o subrayado. $_COOKIES.

• $a con valor “hola” • $hola con valor “mundo” • Variables externas – Variables de los formularios HTML – Cookies 54 .Variables en PHP • Ámbito – Similar a C o a Perl – Globales al fichero o locales a la función • Variables variables – Variables con un nombre no fijo • $a = "hola". $$a = "mundo".

string) – Se utiliza la función define() • define (“CONSTANTE”. “hola”). – No pueden ser redefinidas • Algunas predefinidas – – – – PHP_VERSION: Versión de PHP PHP_OS: Sistema operativo del cliente TRUE: Verdadero FALSE: Falso 55 . double. • print CONSTANTE.Constantes en PHP • Nombre – No llevan $ como primer carácter • Definición – Sólo se pueden definir constantes de los tipos escalares (boolean. integer.

Constantes en PHP <?php define("CONSTANTE". "hello world. echo CONSTANTE."). ?> 56 .

Expresiones en PHP • Cualquier cosa que pueda proporcionar un valor como consecuencia de su evaluación – Variables – Constantes – Funciones • Combinación de expresiones mediante operadores • Sintaxis similar al lenguaje C 57 .

Operadores en PHP 58 .

evita cualquier mensaje de error que pueda ser generado por la expresión • Captura el valor de error generado – Operadores de cadenas • concatenación . (punto) • asignación con concatenación .Operadores en PHP • Algunos especiales – Operador de control de error @ • Antepuesto a una expresión.= – operador de identidad = = = • Igualdad en valor y tipo 59 .

'$php_errormsg'"). ?> 60 .Operadores en PHP • Ejemplo de uso del operador @ <?php $res = @mysql_query(” select nombre from clientes") or die ("Error en la selección.

Estructuras de control en PHP 61 .

.IF – ELSE – ELSE IF • Comportamiento como en C • Las sentencias compuestas se encierran entre llaves if (expresión_1) sentencia_1 else if (expresión_2) sentencia_2 . else if (expresión_n) sentencia_n else sentencia_n+1 62 ..

SWITCH • Comportamiento como en C • la expresión puede ser integer. float o string switch (expresión) { case valor_1: sentencia_1 break. … case valor_n: sentencia_n break. default sentencia_n+1 } 63 .

else echo "a es menor que b".Ejemplos con IF if( $a > $b ) echo "a es mayor que b". elseif( $a == $b ) echo "a es igual a b". # UTILIZACION DE LLAVES if( $a >= $b ) { echo "a es mayor o igual que b". $mayor = $b. } 64 . $mayor = $a. } else { echo "a es menor que b".

Ejemplos con IF <H1>Listado de ventas</H1> <? if( $orden == "fecha" ) ?> <P>Ordenadas por <B>fecha</B></P> <? elseif ( $orden == "producto" ) ?> <P>Ordenadas según el <B>nombre</B> del producto</P> <? endif. ?> 65 .

..\n"."\n". } echo "Cero !!!".WHILE • Comportamiento como en C while (expresión) sentencia $a = 10. echo "Cuenta regresiva . 66 .. while($a > 0) { echo $a-.

} while( $a > 0 ). "\n". do { echo $a-..DO WHILE • Comportamiento como en C do sentencia while (expresión) $a = 10.. echo "Cuenta regresiva .\n". echo "Cero !!!". 67 ..

expresión3) sentencia # Cuadrados for($a=1. expresión2. } 68 .$a<=10. “\n”.$a++) { echo “El cuadrado de $a es“.FOR • Comportamiento como en C for (expresión1. echo ($a * $a) .

• Desplegar el programa para que sea accesible desde la web. • El número de tabla estará definido por una constante.Ejercicio • Desarrollar un programa en PHP que permita construir y mostrar una tabla de multiplicar. 69 . • Retocar la presentación combinando PHP y HTML para lograr un buen aspecto.

} 70 .$a<=10. echo "-----\n".Ejemplo con FOR # Tabla de multiplicar for($a=1. }.$a++) { echo "Tabla del $a\n".$b<=10. echo ($a * $b) . for($b=1.$b++) { echo "$a por $b es “. "\n".

FOREACH • Permite iterar sobre arrays • Cada elemento del array supone una iteración • Sintaxis foreach (expresión_array as $valor) sentencia foreach (expresión_array as $clave => $valor) sentencia 71 .

• Salida Valor: Valor: Clave: Clave: 101 51 rojo. ‘verde’=>51). foreach ($color as $valor) print “Valor: $valor<BR>\n”. Valor: $valor<BR>\n”.Ejemplo con FOREACH $color = array(‘rojo’=>101. Valor: 101 verde. Valor: 51 72 . foreach ($color as $clave => $valor) print “Clave: $clave.

$nombre\n". 73 . }.Ejemplo con FOREACH $tblApellidos["juan"] = "perez". foreach($tblApellidos as $nombre => $apellido) { echo "$apellido. $tblApellidos["pedro"] = "gonzalez".

Funciones en PHP • Definición por parte del usuario – Palabra reservada function • Declaración – Antes de ser referenciadas • Paso de parámetros – Por defecto se pasan por valor – Con PHP4 se puede forzar paso por referencia – Se pueden emplear parámetros con argumentos por defecto • Deben ser siempre los últimos en la función 74 .

Ejemplo de funciones
• Definición
function suma ($x, $y) { $s = $x + $y; return $s; } $a=1; $b=2; $c = suma ($a, $b); print $c;
75

Ejemplo de funciones
• Paso por referencia
function incrementa (&$a) { $a = $a + 1; } $a=1; incrementa ($a); print $a; // ¿Qué muestra?

76

Ejemplo de funciones
• Argumentos por defecto
function mTitulo($titulo = "Sr."){ print "Estimado $titulo:\n"; } mTitulo (); mTitulo ("Prof.");

• Salida
Estimado Sr.: Estimado Prof.:
77

} echo hacerCafe().Ejemplo de funciones • Argumentos por defecto function hacerCafe($tipo="capuchino"){ return "he hecho un café $tipo\n". echo hacerCafe(“expreso”). 78 .

79 . $uno.1. $dos) = numeros().Funciones en PHP • Devolución de valores – Pueden devolver cualquier número de valores – Hay que efectuar una correcta recepción de estos valores • Ejemplo function numeros(){ return array(0. } list ($cero.2).

<br>\n" } $func = 'foo'. El argumento ha sido '$arg'. $func('test'). $func='bar'.Funciones en PHP • Funciones variables <?php function foo() { echo "En foo()<br>\n" } function bar ($arg ='') { echo "bar()”. ?> 80 . $func().

Funciones en PHP • Bibliotecas de funciones – Algunos ejemplos: • • • • • • • Funciones de manipulación de cadenas Funciones de fecha y hora Funciones de arrays Funciones de ficheros Funciones matemáticas Funciones de bases de datos Funciones de red – Algunas bibliotecas requieren la instalación de componentes adicionales – Documentadas en manual de referencia de PHP 81 .

utilizando funciones definidas por el usuario y funciones de biblioteca. muestre la fecha actual en formato – Día 4 de julio de 2005 82 .Ejercicios • Modificar el programa de la tabla de multiplicar para que la tabla que muestre se corresponda con el día actual • Desarrollar un programa en PHP que.

PHP y Formularios Web .

Acceso a formularios con PHP • Objetivo – Acceso a programa PHP – Ejecución dependiente de los valores introducidos en un formulario Web – Intercambio de información • Web/HTML – Servidor Web – Servidor de datos 84 .

Acceso a formularios con PHP • Ejemplo sencillo 85 .

php <HTML> <BODY> <?PHP print (“La edad es: $edad”). ?> </BODY> </HTML> 86 .php” METHOD=”POST”> Edad: <INPUT TYPE=”text” NAME=”edad”> <INPUT TYPE=”submit” VALUE=”aceptar”> </FORM> </BODY> </HTML> Fichero dos.Acceso a formularios con PHP • Ejemplo sencillo Archivo uno.php <HTML> <BODY> <FORM ACTION=”dos.

– $_REQUEST[‘edad’] en lugar de $edad – Altenativa • Poner register_globals = on en php.0 • valor por defecto de la directiva register_globals es off • No es posible acceder a las variables enviadas de la manera anterior (como variables globales).2.Acceso a formularios con PHP • Notas sobre versiones – A partir de PHP 4.ini • No es recomendable por motivos de seguridad • Sugerencia – $edad = $_REQUEST[‘edad’]. 87 . • Hay que utilizar la variable predefinida $_REQUEST.

Elementos de formularios y PHP • Tipo INPUT – – – – – – – – TEXT RADIO CHECKBOX BUTTON FILE HIDDEN PASSWORD SUBMIT • SELECT – Simple / múltiple • TEXTAREA 88 .

Formularios y PHP: TEXT
Introduzca la cadena: <INPUT TYPE="text" NAME="cadena" VALUE=“una cadena" SIZE="20">

<?PHP print ($cadena); //print ($_REQUEST [‘cadena’]); ?>

89

Formularios y PHP: RADIO
<INPUT TYPE="radio" NAME="titulo" VALUE=“II“ CHECKED>I.Informática <INPUT TYPE="radio" NAME="titulo" VALUE="ITIG">I.T.I. Gestión <INPUT TYPE="radio" NAME="titulo" VALUE="ITIS">I.T.I. Sistemas

<?PHP print ($titulo); //print ($_REQUEST [‘titulo’]); ?>

90

Formularios y PHP: CHECKBOX
<INPUT TYPE="checkbox" NAME="extras[]" VALUE="garaje" CHECKED>Garaje <INPUT TYPE="checkbox" NAME="extras[]" VALUE="piscina">Piscina <INPUT TYPE="checkbox" NAME="extras[]" VALUE="jardin">Jardín

<?PHP $n = count ($extras); for ($i=0; $i<$n; $i++) print (“$extras[$i]<BR>\n”); //foreach ($_REQUEST[‘extras’] as $extra) //print (“$extra<BR>\n”); ?>

91

?> 92 .Formularios y PHP: BUTTON <INPUT TYPE="button" NAME="nueva" VALUE="Añadir más"> <?PHP if ($nueva) print ("Se va a añadir una más"). //if ($_REQUEST [‘nueva’]) //print ("Se va a añadir una nueva").

Formularios y PHP: FILE <FORM ACTION="procesa.php" METHOD="post“ ENCTYPE="multipart/form-data"> <INPUT TYPE="file" NAME=“archivo"> </FORM> 93 .

//print ($_REQUEST [‘username’]). ?> <?PHP print ($username).Formularios y PHP: HIDDEN <?PHP print(“<INPUT TYPE=’hidden’ NAME=’username’ VALUE=’$usuario’>\n”). ?> 94 .

//print ($_REQUEST [‘clave’]).Formularios y PHP: PASSWORD Contraseña: <INPUT TYPE="password" NAME="clave"> <?PHP print ($clave). ?> 95 .

//if ($_REQUEST [‘enviar’]) // print ("Se ha pulsado el botón de enviar"). ?> 96 .Formularios y PHP: SUBMIT <INPUT TYPE="submit" NAME="enviar“ VALUE="Enviar datos"> <?PHP if ($enviar) print ("Se ha pulsado el botón de enviar").

Téc. ?> 97 .Formularios y PHP: SELECT SIMPLE <SELECT NAME="titulacion"> <OPTION VALUE="II" SELECTED>Ingeniería Informática <OPTION VALUE="ITIG">Ing. Téc. en Informática de Gestión <OPTION VALUE="ITIS">Ing. en Informática de Sistemas </SELECT> <?PHP print ($titulacion). //print ($_REQUEST [‘titulacion’]).

//foreach ($_REQUEST[‘idiomas’] as $idioma) //print (“$idioma<BR>\n”). for ($i=0.Formularios y PHP: SELECT MÚLTIPLE <SELECT MULTIPLE SIZE="3" NAME="idiomas[]"> <OPTION VALUE="ingles" SELECTED>Inglés <OPTION VALUE="frances">Francés <OPTION VALUE="aleman">Alemán <OPTION VALUE="holandes">Holandés </SELECT> <?PHP $n = count ($idiomas). $i<$n. ?> 98 . $i++) print (“$idiomas[$i]<BR>\n”).

?> 99 . //print ($_REQUEST [‘comentario’]).Formularios y PHP: TEXTAREA <TEXTAREA COLS=“30" ROWS=“4" NAME="comentario"> Este libro me parece ... </TEXTAREA> <?PHP print ($comentario).

Ejercicio (I) Diseñar y programar una página Web que contenga un formulario en el que se pidan datos sobre nombre. 100 . Además. apellidos y dirección de email. mediante una lista de opciones se debe poder seleccionar un número.

y mostrará una nueva página con los datos introducidos (la dirección de email como un link). 101 . y la tabla de multiplicar correspondiente al número seleccionado en la lista anterior.Ejercicio (II) El formulario se procesará mediante un programa en php.

$nombre . print "<br><br>". $a<=10. " “ print $apellido1 . ($tabla * $a) . print "<br>". " " . $email . ?> </body> </html> 102 . "\">“ print $email . $apellido2. print "<a href=mailto:\"" . " . $a++) echo "$tabla * $a = " . print "Ha elegido la tabla del " . print "<br><br>". for ($a=1. "</a>". $tabla. "<br>".Ejercicio (III) <html><body> <?php print "Estimado Sr/a.

Construir un programa php que acceda a los datos de estos elementos y genere una página web que los muestre.Ejercicio Diseñar una página Web que contenga un formulario que incorpore todos los tipos de elementos de entrada de información presentados anteriormente (excepto BUTTON y FILE). 103 .

Formularios y PHP • Esquema de programación – Utilización de un único programa – Muestra el formulario o lo procesa dependiendo de si “ha sido enviado” o no – Ventajas • Esto disminuye el número de ficheros • Permite validar los datos del formulario en el propio formulario – Procedimiento: Si se ha enviado el formulario Procesar formulario si no Mostrar formulario Fin 104 .

105 ... if ($enviar == “procesar”) ...Formularios y PHP • ¿Cómo determinar si se ha enviado el formulario o no? – Consultar la variable correspondiente al botón de envío <INPUT TYPE="SUBMIT" NAME="enviar“ VALUE="procesar"> – Consulta if (isset($enviar)) .

Ejercicio Construir un programa php que permita mostrar y procesar un formulario como el siguiente 106 .

Envío de archivos • Consideraciones – Utilización de FILE – Debe tener el atributo • ENCTYPE="multipart/form-data“ – El archivo tiene un límite de tamaño – El límite se puede fijar • En el archivo de configuración php. descartar el nombre original y crear uno nuevo/único – El archivo enviado se almacena en un directorio temporal • Para moverlo al directorio de destino se utiliza la función move_upload_file() 107 .ini • En el formulario – Hay que asignar un nombre al archivo diferente al de los enviados previamente • Como norma general.

... upload_max_filesize = 2M 108 . .Envío de archivos • Limitación de tamaño en php.ini . ..upload_tmp_dir = .. ...... system default if not specified)... ... Whether to allow HTTP file uploads. Temporary directory for HTTP uploaded files (will use ........ Maximum allowed size for uploaded files. file_uploads = On ....... File Uploads ....

Envío de archivos • Limitación de tamaño en el formulario <INPUT TYPE=”HIDDEN” NAME=”MAX_FILE_SIZE” VALUE='102400’ > <INPUT TYPE=”FILE” NAME=“archivo"> 109 .

"image/gif" – $_FILES[' nombre_archivo ']['size'] • Tamaño en bytes del archivo – $_FILES[' nombre_archivo ']['tmp_name'] • Nombre del archivo temporal del servidor en el que se almacena – $_FILES[' nombre_archivo’]['error'] • Código de error 110 .Envío de archivos • Más información – Acceso a la variable $_FILES o $HTTP_POST_FILES – $_FILES[‘nombre_archivo']['name'] • Nombre original del archivo en el cliente – $_FILES[' nombre_archivo ']['type'] • Tipo mime del archivo. Por ejemplo.

Envío de archivos • Procedimiento general SI se ha enviado correctamente el archivo Asignar un nombre Mover a su ubicación definitiva SI NO Mostrar un mensaje de error FIN 111 .

$nombreFichero = $idUnico . $nombreDirectorio .Envío de archivos • Ejemplo de procedimiento if (is_uploaded_file ($_FILES['imagen']['tmp_name'])) { $nombreDirectorio = "img/". } else print ("No se ha podido subir el archivo\n"). $nombreFichero ). $idUnico = time(). $_FILES['imagen']['name']. 112 . "-" . move_uploaded_file ( $_FILES['imagen']['tmp_name'].

Ejercicio Construir un programa php que permita mostrar y procesar un formulario mediante el que se pueda gestionar una lista de archivos de imágenes (gif o jpg). El programa debe permitir: – Mostrar un formulario para añadir un nuevo archivo junto con un texto – Procesar el envío • Asignación de nombre en servidor • Localización • Presentación de la imagen y del texto asociado 113 .

Acceso a MySQL con PHP .

CONEXIONES A BBDD • Estados de una conexión – – – – Función connection_status() Normal (0) Aborted (1) Timeout (2) • set_time_limit() • Procedimiento de acceso a una base de datos – – – – conectar a servidor de bases de datos seleccionar base de datos realizar consulta cerrar la conexión 115 .

php3 method=GET> First Name: <input type=text name=first_name size=25 maxlength=25> Last Name: <input type=text name=last_name size=25 maxlength=25> <p> <input type=submit> </form> </body> </html> 116 .DATOS DE PHP A MySQL (I) • Formulario HTML para recogida de datos <html> <body> <form action=submitform.

DATOS DE PHP A MySQL (II) • Script PHP <html> <body> <?php mysql_connect (localhost. password). print (" ")."). print ($last_name). print ("<p>"). print ($first_name). username. print ("Thanks for submitting your name. last_name) VALUES ('$first_name'. mysql_select_db (dbname). '$last_name') "). mysql_query ( "INSERT INTO tablename (first_name. ?> </body> </html> 117 .

DATOS DE MySQL A PHP (I) • Formulario HTML para búsqueda indexada <html><body> <form action=searchform.php method=GET> Search For: <p> First Name: <input type=text name=first_name size=25 maxlength=25><p> Last Name: <input type=text name=last_name size=25 maxlength=25><p> <input type=submit> </form> </body></html> 118 .

password). if ($first_name == "") { $first_name = '%'.DATOS DE MySQL A PHP (II) • Script PHP <html> <body> <?php mysql_connect (localhost. } if ($last_name == "") { $last_name = '%'. } $result = mysql_query ( "SELECT * FROM tablename WHERE first_name LIKE '$first_name%' AND last_name LIKE '$last_name%’ "). 119 . mysql_select_db (dbname). username.

no records were found!".) if ($row = mysql_fetch_array($result)) { do { print $row["first_name"].} ?> </body> </html> 120 . } else {print "Sorry. print ("<p>"). print (" "). print $row["last_name"].DATOS DE MySQL A PHP (II) • Script PHP (cont. } while($row = mysql_fetch_array($result)).

DATOS DE MySQL A PHP (III)
• Consideraciones
– mysql_fetch_array()
• Extrae la primera fila de los resultados de una consulta • Sucesivas llamadas con el mismo argumento proporcionan las siguientes filas de la consultas

121

Algo de SQL
• CREATE TABLE tabla (campo1 tipo (tamaño), campo2 tipo (tamaño), ..., ) • SELECT Campos FROM Tabla; • SELECT Campos FROM tabla WHERE condición; • INSERT INTO Tabla (campo1, campo2, .., campoN) VALUES (valor1, valor2, ..., valorN); • DELETE Tabla.* FROM Tabla WHERE condición; • UPDATE Tabla SET Campo1 = Valor1, Campo2 = Valor2, ... CampoN = ValorN WHERE condición;

122

Func. de PHP para MySQL (I)
• mysql_affected_rows: Obtiene el número de tuplas modificadas en la última operación MySql. • mysql_change_user: Modifica el usuario responsable de las operaciones. • mysql_close: Cierra la conexión MySql. • mysql_connect: Abre una conexión con un servidor de MySQL. • mysql_create_db: Crea una base de datos en el gestor de Bases de Datos.

123

de PHP para MySQL (II) • mysql_data_seek: Realiza un movimiento en el puntero de los datos resultado. • mysql_errno: Devuelve un código de error relacionado con la última operación MySql realizada. • mysql_db_query: Realiza una consulta a una base de datos. 124 .Func. • mysql_drop_db: Realiza una operación Drop sobre una base de datos.

de PHP para MySQL (III) • mysql_error: Devuelve el mensaje de error asociado a un código concreto relacionado con la última operación MySql realizada. • mysql_fetch_field: Devuelve un objeto con la información de un resultado. 125 . • mysql_fetch_lengths: Obtener la longitud de los resultados.Func. • mysql_fetch_array: Introduce el resultado en un array asociativo.

• mysql_fetch_row: Devuelve el resultado como un array. 126 . de PHP para MySQL (IV) • mysql_fetch_object: Devuelve el resultado como un objeto. • mysql_field_name: Devuelve el nombre de un campo especificado en un resultado.Func. • mysql_field_table: Obtiene el nombre de la tabla de un campo especificado. • mysql_field_seek: Asigna el puntero de los resultados a una posición determinada.

Func. • mysql_insert_id: Obtiene el identificador de la última operación INSERT. • mysql_field_len: Obtiene las longitud de un campo especificado. • mysql_free_result: Libera la memoria de los resultados. • mysql_field_flags: Obtiene los "Flags" asociados del campo especificado. de PHP para MySQL (V) • mysql_field_type: Obtiene el tipo de un campo especificado. 127 .

• mysql_list_dbs: Lista las bases de datos disponibles en el servidor MySQL. 128 .Func. • mysql_num_fields: Obtiene el número de campos del resultado. • mysql_num_rows: Obtiene el número de líneas del resultado. • mysql_list_tables: Lista las tablas de una base de datos MySql. de PHP para MySQL (VI) • mysql_list_fields: Lista los campos resultado.

Func. • mysql_result: Obtiene los datos resultados. • mysql_tablename: Obtiene el nombre de la tabla de un campo. de PHP para MySQL (VII) • mysql_pconnect: Abre una conexión permanente con una base de datos. • mysql_query: Envía una consulta SQL a MySQL. • mysql_select_db: Selecciona una base de datos MySql. 129 .

Gestión de sesiones con PHP .

Utilización de sesiones • Justificación – Mantenimiento del estado de una conexión entre distintas páginas – Ejemplos • aplicaciones personalizadas • carrito de la compra • control de acceso – Permiten disponer de variables con valores persistentes durante toda la conexión • Pueden almacenarse en el cliente (cookies) o en el servidor 131 .

Utilización de sesiones sesión VARIABLE Variable_1 Variable_2 VALOR Valor_1 Varlor_2 Variables de sesión Variable_n Valor_n 132 .

carga todas las variables de sesión – session_register (variable) • Registra una variable de sesión – session_unregister (variable) • Elimina una variable de sesión – session_is_registered (variable) • Comprueba si una variable está registrada • Devuelve true en caso afirmativo y false en caso contrario – session_destroy () • Cierra una sesión 133 .Utilización de sesiones • Funciones de PHP – session_start () • Inicializa una sesión • Le asigna un identificador de sesión único • Si la sesión ya está iniciada.

Utilización de sesiones • Procedimiento general – Todas las páginas asociadas a una sesión deben realizar una llamada a session_start() para cargar las variables de dicha sesión – La llamada debe estar colocada antes de cualquier código HTML – Conviene llamar a session_destroy() para cerrar la sesión y liberar recursos 134 .

$salt). » $clave_crypt = crypt ($clave.Utilización de sesiones • Autenticación de usuarios – A nivel de servidor (Apache) – A nivel de aplicación (PHP + base de datos) • Mayor flexibilidad • Tabla de usuarios – Nombre y contraseña encriptada » $salt = substr ($usuario. 0. 2). • Autenticación – Registro de variable • Acceso a una página de la aplicación – Comprobación de que la variable anterior está registrada 135 .

Utilización de sesiones • Autenticación de usuarios 136 .

time()+3600).Cookies • Cookies HTML – Cualquier cookie que se envía a un cliente se convierte en un variable PHP – La función SetCookie() se utiliza para asignar cookies – La función debe ser llamada antes de empezar a crear la página • Forma parte de la cabecera $count++.. 137 . setCookie(&quotcount".$count."$valor". time()+3600). SetCookie("Visita[$count]".

Seguridad con PHP .

Seguridad • Introducción – Importante • Utilizar versiones actualizadas de Apache y PHP – Vulnerabilidades más importantes en PHP • Variables globales • Nombres de archivos • Envío de ficheros • Bibliotecas • Datos enviados desde formularios 139 .

ini – Datos de los formularios y de las cookies • Problemas – Generación incontrolada de variables – Adquisición de privilegios de superusuario como consecuencia de alguna variable • Soluciones – register_globals = off – Inicialización de variables antes de usarlas – Orden en la creación de variables globales 140 .Variables globales • Creación automática de variables globales – Activación de register_globals en php.

ini: – display_errors = off – log_errors = on – error_log = /var/log/php_errors.Variables globales • Inicialización de variables – Utilización de la directiva error_reporting=E_ALL en php.ini • Se genera un aviso cuando se usa una variable que no ha sido previamente inicializada – En un entorno de producción debe evitarse la aparición de mensajes de aviso o error • Para ello se utilizan las siguientes directivas en php.log 141 .

Un posible valor para variables_order que evita esto es “ES” – Para acceder a los parámetros de los formularios y a las cookies se deben utilizar los arrays globales $_REQUEST. $_GET.Variables globales • Orden en la generación de variables – Generación de variables • • • • Entorno (E) Cookies (C) Servidor (S) GET (G) y POST (P) – La directiva variables_order controla el orden de generación • Por defecto es “EGPCS” – Permitir la creación de variables globales desde parámetros GET y POST y desde cookies es potencialmente peligroso. $_POST y $_COOKIES 142 .

/etc/passwd”? • Se mostraría el archivo de passwords del sistema 143 . • Este código pretende mostrar un mensaje de bienvenida personalizado para el usuario • ¿qué ocurriría si el usuario introduce como username la cadena “./.Nombres de los archivos • Consideraciones – Posibilidad de referenciar a algo no deseado • include (“/usr/local/lib/bienvenida/$username”)../..../.

// permitido include (“/otra/ruta/lib.inc”).inc”). // error 144 .Nombres de los archivos • Consideraciones – Las funciones include() y require() admiten nombres de archivos remotos • Puede provocar la ejecución de código mal intencionado procedente de otro servidor – Se puede desactivar la funcionalidad de acceso a archivos remotos con la siguiente directiva en php.ini • allow_url_fopen = off – Otra precaución frente nombres de archivos incorrectos es la directiva de open_basedir • PHP limitará las operaciones sobre ficheros al directorio especificado y sus subdirectorios open_basedir = /alguna/ruta include (“/alguna/ruta/lib.

los archivos se reciben automáticamente y luego se verifican – Posibilidad de ataque de denegación de servicio por saturación del sistema de archivos • Utilización de la directiva post_max_size de php.ini – El valor por defecto suele ser más elevado de lo necesario 145 .Envío de archivos • Consideraciones – El usuario puede enviar cualquier archivo al servidor que luego podría ejecutar – Recomendación • Evitar utilizar el nombre enviado por el navegador • Generar un nombre único – Sobre el tamaño de los archivos • Aunque se limite el tamaño máximo en el formulario.

ini – Esto es particularmente importante cuando en el código de la biblioteca aparecen passwords. como es el caso de las funciones de conexión con bases de datos 146 .Bibliotecas • Consideraciones – Conviene almacenar los archivos de bibliotecas de funciones fuera de la raíz del directorio que contiene los documentos a publicar en web • Evitamos que puedan ser accedidos por su URL • Indicar a PHP la ubicación de los archivos indicando la ruta completa en los include() y require() o bien mediante la directiva include_path en php.

ini – Esto es particularmente importante cuando en el código de la biblioteca aparecen passwords.Bibliotecas • Consideraciones – Conviene almacenar los archivos de bibliotecas de funciones fuera de la raíz del directorio que contiene los documentos a publicar en web • Evitamos que puedan ser accedidos por su URL • Indicar a PHP la ubicación de los archivos indicando la ruta completa en los include() y require() o bien mediante la directiva include_path en php. como es el caso de las funciones de conexión con bases de datos 147 .

Formularios • Recomendaciones – Validar todos los datos provenientes de formularios para asegurarse de que los valores recibidos son los esperados – Cualquier información del exterior debe considerarse como posiblemente contaminada y debe ser verificada antes de ser utilizada – Por ejemplo una variable puede contener código HTML • La función htmlspecialchars() impide que se interpreten los caracteres especiales de HTML (<. &) 148 . >.

Comentarios finales • Recomendaciones generales –Estudiar los requerimientos de las aplicaciones –Configurar y ajustar adecuadamente PHP a través del archivo php.ini –Seguir unas buenas prácticas en la programación 149 .

Referencias .

ugr.htm http://www.es/php-mysql/manual/manual_pag_01.us.wtwebwizard.mysql.org http://www.es/php/manual/manual.one.programacion.php.us.com/tutorials/mysql http://www.com/al/acs/bd.com/soporte_online/php.es 151 .html http://geneura.pageimpact.ujaen.angelfire.htm http://www.php3 http://www.lsi.net http://www.org http://www.net/cursos/php/access.apache.html http://www.htm http://www.es/cursos/cursophp/ http://w3.otri.programacion.Referencias bibliográficas http://www.com/scripts/PHP3/ http://wwwdi.net/cursos/php/mysql.find-script.net/~jhoffman/sqltut.htm http://www.