programacionenphp

143
Programación en PHP Version imprimible Este documento deber servir exclusivamente como material de apoyo al contenido del curso interactivo accesible a través de internet. Indice Módulo I. Introducción................................................................. U.D.1. Lenguajes de programación Web............................. 3 U.D.2. ¿Qué es PHP?.................................................... 6 U.D.3. ¿Qué es apache?................................................ 9 U.D.4. Instalación........................................................ 10 Módulo II. Conceptos básicos........................................................ U.D.1. Panorámica del lenguaje...................................... 17 U.D.2. Variables......................................................... 21 U.D.3. Operadores...................................................... 24 U.D.4. Sentencias de control.......................................... 33 Módulo III. Conceptos avanzados................................................... U.D.1. Cadenas.......................................................... 44 U.D.2. Arrays............................................................. 53 U.D.3. Funciones........................................................ 61 U.D.4. Formularios...................................................... 70 U.D.5. Manejo de ficheros.............................................. 80 Módulo IV. PHP y las bases de datos.............................................. U.D.1. Estructura de una aplicación web con bases de datos...88 U.D.2. ¿Qué es MySQL?............................................... 89 U.D.3. El lenguaje SQL................................................. 90 U.d.4. Funciones de PHP con MySQL............................. 102 Módulo V. Aplicaciones comunes en PHP......................................... U.D.1. Fecha y hora................................................... 111 U.D.2. Envío de emails................................................ 116 Plataforma de Teleformación de IFES Página 1 de 143

Upload: creart40

Post on 27-Jun-2015

340 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: ProgramacionenPHP

Programación en PHP

Version imprimible

Este documento deber servir exclusivamente como material de apoyo al contenido

del curso interactivo accesible a través de internet.

Indice

Módulo I. Introducción.................................................................U.D.1. Lenguajes de programación Web............................. 3U.D.2. ¿Qué es PHP?.................................................... 6U.D.3. ¿Qué es apache?................................................ 9U.D.4. Instalación........................................................ 10

Módulo II. Conceptos básicos........................................................U.D.1. Panorámica del lenguaje...................................... 17U.D.2. Variables......................................................... 21U.D.3. Operadores...................................................... 24U.D.4. Sentencias de control.......................................... 33

Módulo III. Conceptos avanzados...................................................U.D.1. Cadenas.......................................................... 44U.D.2. Arrays............................................................. 53U.D.3. Funciones........................................................ 61U.D.4. Formularios...................................................... 70U.D.5. Manejo de ficheros..............................................80

Módulo IV. PHP y las bases de datos..............................................U.D.1. Estructura de una aplicación web con bases de datos... 88U.D.2. ¿Qué es MySQL?............................................... 89U.D.3. El lenguaje SQL................................................. 90U.d.4. Funciones de PHP con MySQL............................. 102

Módulo V. Aplicaciones comunes en PHP.........................................U.D.1. Fecha y hora................................................... 111U.D.2. Envío de emails................................................ 116

Plataforma de Teleformación de IFES Página 1 de 143

Page 2: ProgramacionenPHP

U.D.3. Sesiones........................................................ 120U.D.4. Control de acceso............................................. 126U.D.5. Registro de accesos.......................................... 131U.D.6. Plantillas........................................................ 135

Programación en PHP

Programación en PHP

Página 2 de 143 Programación en PHP

Page 3: ProgramacionenPHP

Módulo I. Introducción

U.D.1. Lenguajes de programación Web

Tipos de páginas web. Estáticas y dinámicas.

Las primeras páginas que aparecieron en Internet eran muy sencillas y pocointeractivas. Solo permitían mostrar información (texto o imágenes) y seguir enlaces anuevas páginas.

Para compensar esta falta de interactividad aparecieron los lenguajes de programaciónen el cliente (el navegador de Internet) que permitían una interactividad limitada. Enesta categoría el principal lenguaje es Javascript. Un ejemplo típicode programación mediante un Javascript es el de un menú jerarquico desplegable.

Pero hay multitud de funcionalidades que están fuera del alcance de los lenguajes deprogramación en el cliente. La interactividad que permiten se reduce prácticamente amejorar la apariencia de la información en la página web, y a añadir efectos visualesque aunque puedan ser curiosos no aportan un valor añadido.

Con la llegada de los lenguajes de servidor aparecieron las primeras páginasdinámicas. Hoy en día la mayor parte de Internet está formada por este tipo de páginas.El buscador de Internet que usamos cada vez que queremos encontrar páginas de unatemática es una página dinámica. La Plataforma de Teleformación de IFES es tambiénuna página dinámica.

Generación de páginas web

Para poder comprender la diferencia entre una página estática y una página dinámicahay que tener presente el proceso que sigue una página web desde que lasolicitamos (haciendo clic en un enlace del navegador) hasta que la recibimos y semuestra por pantalla.

Página estática

Programación en PHP

Plataforma de Teleformación de IFES Página 3 de 143

Page 4: ProgramacionenPHP

Elementos del proceso:

a) Navegador - Aplicación que permite al usuario recibir y mostrarpáginas web.b) Cliente - En el ámbito de Internet, es el ordenador que estáconectado a la red. Su función se limita a realizar peticiones de páginasweb y mostrar los resultados.c) Internet.d) Servidor web (hardware) - Ordenador conectado a Internet que alojapáginas web.e) Servidor web (software) - Programa que transfiere páginas web alos cllientes mediante el protocolo HTTP.

El término servidor web se usa indistintamente para denominar tanto al ordenadorconectado a Internet que aloja páginas web como a la aplicación software que gestionala transferencia de páginas web.

Página dinámica

Programación en PHP

Página 4 de 143 Programación en PHP

Page 5: ProgramacionenPHP

Ahora hay un nuevo elemento, el servidor de aplicación.

f) Servidor de aplicación - Es el programa que colabora con el servidorweb para generar páginas dinámicas.

A diferencia de las páginas estáticas, en las que se guardaba en el disco duro elarchivo html, las páginas dinámicas no están directamente almacenadas en el discoduro. En su lugar hay un programa, que se ejecuta en el servidor de aplicaciones, quees el encargado de crear el archivo que se transferirá al cliente.

Lenguajes de programación web

Para generar páginas web se han usado a lo largo del tiempo un gran número detecnologías. En los comienzos no había ningún lenguaje de programación específico,por lo que se hacía uso de lenguajes de uso más general como C, C++, Basic o Pascal.Para comunicar estos programas con el servidor web se hacía uso de la especificaciónCGI (Common Gateway Interface o Pasarela de Interfaz Común). Hoy en día aún hayaplicaciones que siguen este enfoque, y comúnmente se las conoce como CGI's.

Pero el uso de lenguajes de uso general hacía complicado el proceso de construirpáginas web dinámicas. El código se escribía de forma casi artesanal y era difícil demantener y actualizar. Además el código que funcionaba en un servidor web podía nofuncionar en otro o requerir de un esfuerzo grande para su instalación. Para colmo de

Programación en PHP

Plataforma de Teleformación de IFES Página 5 de 143

Page 6: ProgramacionenPHP

todos los males, por lo general, los CGI son poco eficientes.

Afortunadamente hoy en día el panorama ha cambiado radicalmente. El éxito deInternet ha ido acompañado de la aparición de lenguajes de programación web quefaciliten todo el proceso. Para especializarse en la creación de páginas web dinámicasestos lenguajes intentar cumplir los siguientes objetivos:

• Ser de fácil uso, para permitir una curva de aprendizaje sencilla.• Adaptarse rápidamente a la rápida evolución de Internet, ofreciendo

continuamente nuevas características y actualizaciones de seguridad.• Tener una gran comunidad de usuarios que garanticen el éxito del producto.

De hecho han proliferado tanto que ahora hay una gran cantidad de tecnologíasdisponibles, que lanzan los fabricantes con la intención de acaparar la mayor cuota demercado posible. Aún así hay tres tecnologías mediante las cuales se desarrollan lamayoría de los sitios web.

ASP- Active Server Pages

Esta es una tecnología propietaria de Microsoft. Actualmente está engloba en suestrategia .NET. Su principal ventaja es su sencillez, además de una muy buenaintegración con otros productos de Microsoft como su entorno de desarrollo .NET quepermite crear aplicaciones es un tiempo record. Se integra muy bien con el servidorweb de Microsoft, el IIS (Internet Information Center).

JSP - Java Server Pages

Esta es una tecnología basada en uno de los lenguajes de uso general más populares,Java. Es quizás el más complejo de los 3 pero a su vez el más potente. La grancomunidad de usuarios garantiza la existencia de numerosas herramientas, librerías decódigo abierto y bases de conocimiento. Además se integra muy bien en el servidorweb mayoritario, Apache gracias a la extensión Tomcat.

PHP - PHP Hypertext Preprocessor

A su favor tiene el ser una iniciativa de código abierto, por lo que es mantenido eimpulsado por una gran comunidad de programadores. Además es el más sencillo delos tres, por lo que atrae a usuarios de muy diferentes procedencias: programadores enlenguajes de programación más generalistas, diseñadores que desean completar susconocimientos...

U.D.2. ¿Qué es PHP?

Un poco de historia

Programación en PHP

Página 6 de 143 Programación en PHP

Page 7: ProgramacionenPHP

Ya hemos visto que PHP responde a las siglas PHP Hypertext Procesor. Pero, ¿comosurgió?

En el año 1994 el programador danes-canadiense Rasmus Lerdorf lo creo para poderprogramar su página web personal, que consistía básicamente en un curriculum vitae yun registro del tráfico que recibía. Un año más tarde lo publicó con el nombre dePersonal Home Page Tools. En 1997 atrajo el interés de dos programadores israelíesdel Technion que reescribieron el interprete gramatical de este lenguaje creando labase de la primera versión realmente popular de PHP, PHP 3.

En 1999 reescribieron el lenguaje y lo dotaron de mayor eficiencia mediante el motorZend, dando lugar a la versión estable más utilizada actualmente, PHP 4.

Existe ya una versión 5 de este lenguaje, que incluye un sistema novedoso, el PDO(Objetos de Información de PHP o PHP Data Objects) y mejoras utilizando las ventajasque provee el nuevo Zend Engine 2. Los cambios que incorpora la versión sonnotables, y posicionan a PHP como un lenguaje dinámico muy potente.

Durante este curso se recomienda el uso de Xampp, que viene con la versión 5.04 dePHP. No obstante, como el curso es de iniciación, no se hará uso de las característicasavanzadas, por lo que no nos afectará la versión que estemos utilizando. De todasformas siempre es conveniente conocecer la versión en la que ejecutaremos nuestrasaplicaciones/ejemplos.

Características de PHP

A nivel técnico se pueden destacar los siguientes aspectos:

• Es un lenguaje interpretado (también llamado de tipo script).• La sintaxis es similar a los lenguajes de programación estructurada más

populares, como C, por lo que resulta muy sencilla la transición desde otroslenguajes.

• En el código fuente se mezclan habitualmente fragmentos de código PHPcon el cuerpo de la página HTML, generando dinámicamente el contenido dela misma.

• Dispone de una gran cantidad de módulos (también llamados extensiones)que amplian su funcionallidad.

• Es un lenguaje portable, es decir, puede ser ejecutado en la mayoría de lossistemas operativos. También existen módulos interprete para casi todos losservidores web, y en muchos de ellos viene ya instalado en el paquetebásico.

• Soporta algunas características de la programación orientada a objetos.• Se integra bien con otras tecnologías, como XML, Javascript...• Ofrece conexión a numerosas bases de datos en modo nativo: MySQL,

Programación en PHP

Plataforma de Teleformación de IFES Página 7 de 143

Page 8: ProgramacionenPHP

Postgres, Oracle, SQL Server...

Un uso común es dotar a una aplicación web de un servidor de base de datos, en elmundo PHP y Apache esta es MySQL, lo que en conjunto se ha denominado como lasolución LAMP (Linux, Apache, MySQL y Php).

¿Por qué PHP?

Hay muchas razones para aprender a usar PHP:

• Como ya se ha dicho con anterioridad el aprendizaje de este lenguaje esmuy sencillo.

• No obstante PHP ofrece muchas características avanzadas al alcance delprogramador experto.

• Es seguro y robusto, cumpliendo con las exigencias de cualquier entornoprofesional.

• Es gratuito (open source), por lo que ha atraído a una gran comunidad deusuarios. Todos contribuyen de una u otra forma. Los desarrolladores

Programación en PHP

Página 8 de 143 Programación en PHP

Page 9: ProgramacionenPHP

expertos arreglando errores y aportando mejoras, los usuarios testeando elcódigo e intercambiando ideas que podrían mejorar el lenguaje.

• Existe una gran cantidad de aplicaciones de código abierto que estándesarrolladas en PHP. Conociendo PHP se tiene siempre la posibilidad deampliarlas, personalizarlas y darles el mantenimiento adecuado.

• La práctica totalidad de los proveedores de alojamiento de páginas webofrece soporte para este lenguaje y acceso a una base de datos MySQL.

U.D.3. ¿Qué es apache?

Apache es un producto software desarrollado por una asociación de caracter nolucrativo, la Apache Software Foundation (ASF). La ASF no solo desarrolla el servidorHTTP Apache, también engloba múltiples proyectos, algunos como extensiones delservidor web y otros independientes.

Dentro de toda la gama de servidores web Apache es sin duda el que mejorconsiderado está por parte de los usuarios. La prueba es que el 71% de los sitios webestán alojados en servidores de este tipo (estadísticas de noviembre del 2005 dehttp://news.netcraft.com/archives/web_server_survey.html ).

Apache se ha ganado la confianza de los usuarios principalmente debido a lassiguientes razones:

• Es muy eficiente, robusto y seguro.• Dispone de características avanzadas como mensajes de error altamente

configurables, contenido negociable, autentificación...• Está disponible para la mayoría de las Plataformas, incluyendo Windows y

Linux.• Es software libre, con las ventajas que esto supone. No solo es que sea

gratuito, sino que además dispone de una numerosa comunidad de usuariosque contribuyen a su continua mejora.

La mayor objeción que se le ha puesto a Apache es que no dispone de un modo gráficoamigable para su configuración, por lo que su aprendizaje puede suponer más esfuerzoque el de otros servidores.

Durante este curso se propone la utilización de Apache como servidor al que se leañade como extensión el interprete de PHP.

Otros servidores web

La principal alternativa a Apache es el servidor HTTP de Microsoft. Actualmenteaproximadamente un 20% de las páginas web están alojadas en este tipo deservidores. La ventaja de este servidor es que dispone de un interfaz gráfico amigable

Programación en PHP

Plataforma de Teleformación de IFES Página 9 de 143

Page 10: ProgramacionenPHP

que hace más sencilla su instalación, configuración y despliegue de sitios web. Existenotros servidores, que, o bien son pequeños productos con pocas características, o bienson desarrollos de grandes empresas que no son accesibles al público en general.

U.D.4. Instalación

Las páginas con código PHP son archivos que usan la extensión .php . Como hemosvisto, para poder visualizarlas, tienen que estar alojadas en un servidor web remoto.Esta solución no es factible para practicar con el lenguaje ya que tiene las siguientesdesventajas:

• Hay que contratar un servicio de alojamiento, lo que puede resultar costoso.• Hay dependencia de la conexión a Internet.• Gestionar los archivos que subimos al servidor a través de FTP es algo

engorroso y lento, por lo que no se pueden hacer pruebas de código conagilidad.

La solución no puede ser más sencilla. Haremos que nuestro ordenador actúe comoservidor web. A esta forma de trabajo se le llama coloquialmente desarrollar en local.

Dependiendo de las habilidades de cada uno en el manejo e instalacion deaplicaciones un poco mas complejas, como es el caso que nos lleva, del servidorApache y su módulo para PHP, se necesitaría un curso para todo ello. Apache se hacriticado en este aspecto de no contar con una instalación y/o configuracióngráfica/amigable al usuario, tanto nóvel como experto.

Afortunadamente existen en el mercado soluciones que integran todo lo quenecesitamos para trabajar, y además disponen de los llamados instaladoresautomáticos, que nos dejan preparado y, lo mas importante, configurado de manerahomogénea el entorno de desarrollo que vamos a emplear en todo este curso.

De entre los instaladores disponibles, hemos elegido una solución probada y que cubrevarios sistemas operativos (Windows, GNU/Linux y Mac), esta se llama Xampp en suversion reducida (lite) y la versión 1.5. En el curso vamos a usar la versión paraWindows, que será la referente por facilidad de uso para los usuarios menosavanzados, aunque veremos algunas pantallas de Linux como alternativa (99%idénticas).

En Linux y otros sistemas, podemos usar Xampp o nos instalaremosApache+PHP+MySQL por nuesta cuenta. Esto último para usuarios avanzados, dadoque hay que configurar el sistema, aunque últimamente, en algunas distribuciones deLinux es muy sencillo que el sistema nos instale y configure todo por si mismo bajodemanda.

Programación en PHP

Página 10 de 143 Programación en PHP

Page 11: ProgramacionenPHP

Xampp en la versión elegida instala las siguientes versiones de Apache, Php y Mysql:

• Apache: v2.0.54• Php: 5.0.5• MySQL: v4.1.14

Requerimientos:

• 64Mb de memoria RAM• 58Mb de disco• Windows 98, ME, XP Home.Windows NT,2000,XP

Professional,GNU/Linux,MacOS.

Hay que tener en cuenta que Xampp evoluciona muy rápidamente y que en elmomento de realizar el curso puede encontrarse en una versión posterior. De todasformas es de esperar que la instalación siga siendo muy similar o igual.

Instalación paso a paso sobre Windows

1. Descargamos la versión deseada según el sistema operativo que tengamos desdelas direcciones siguientes:

• Windows:http://prdownloads.sourceforge.net/xampp/xampp-win32-1.5.0-pl1-installer.exe?download

• Linux: http://www.apachefriends.org/en/xampp-linux.html

2. Ejecutamos el fichero. Nos aparecerá la siguiente ventana preguntándonos dondeinstalará Xampp:

Programación en PHP

Plataforma de Teleformación de IFES Página 11 de 143

Page 12: ProgramacionenPHP

Eligiremos la ruta de instalación como por ejemplo: C:\CursoPHP y pulsaremos el botón"Extract".

3. Una vez instalado, tendremos una carpeta llamada C:\CursoPhp\xampplite , dentrode ella ejecutaremos el fichero setup_xampp.bat y nos saldrá una ventana similar a lasiguiente:

Pulsaremos una tecla cualquiera y se cerrará la ventana o la cerraremos con el ratón.

4. Ya está instalado y listo para arrancar el servidor Apache y MySQL, para ello hayque ejecutar el ejecutable xampp_start.exe dentro de la carpeta C:\CursoPhp\xampplite:

Programación en PHP

Página 12 de 143 Programación en PHP

Page 13: ProgramacionenPHP

Mientras estemos utilizando PHP no debemos cerrar esta ventana. Cuando queramosdejar de usar Xampp no se debe cerrar sin más la ventana, sino ejecutar el programaxampp_stop.exe , que se encargará de cerrar de forma ordenada la aplicación.

5. Vamos a comprobar que Apache está funcionando, para ello vamos a ir a ladirección http://localhost con nuestro navegador favorito y deberíamos ver la siguientepágina:

Programación en PHP

Plataforma de Teleformación de IFES Página 13 de 143

Page 14: ProgramacionenPHP

Esta página web esta siendo servida por Apache y PHP (mirar la dirección en elnavegador). Pulsaremos en el idioma español (Spanish ) para continuar.

6. Esta es la página principal de Xampp en español, desde ella podremos navegar porlas demostraciones de PHP (Algunas no funcionarán dado que usamos una versión deXampp reducida):

Programación en PHP

Página 14 de 143 Programación en PHP

Page 15: ProgramacionenPHP

7. Pulsaremos en el enlace Estado para probar toda la instalación definitivamente:

Programación en PHP

Plataforma de Teleformación de IFES Página 15 de 143

Page 16: ProgramacionenPHP

Deberíamos tener todos los componentes con el estado Activado.

Programación en PHP

Página 16 de 143 Programación en PHP

Page 17: ProgramacionenPHP

Módulo II. Conceptos básicos

U.D.1. Panorámica del lenguaje

En este módulo y en el siguiente se van a descirbir los elementos y estructuras dellenguaje. Quien esté familliarizado con la programación estructurada encontrará que lamayoría son familiares. Concretamente la sintaxis de PHP es heredada del lenguaje C,Java y Perl. Si ya conocemos C o Java entonces tenemos el 90% del camino recorrido,en lo que a sintaxis se refiere.

Las explicaciones vienen acompañadas por ejemplos para facilitar su comprensión.Todos los ejemplos pueden ser probados tal y como se explica en la práctica delmódulo I. Para ello hay que crear un fichero con un editor de textos, como puede ser elBloc de Notas (ficheros planos), dándole un nombre y guardándolo con extensión .phpen la carpeta de publicación C:\CursoPHP\xampplite\htdocs\practicasPHP .

Los resultados de los programas que hagamos se visualizarán a través del navegador,escribiendo en la barra de direcciones la URL de nuestra página en local.

• http://localhost/practicasPHP/miprograma.php

Vamos a pasar directamente a dar una visión general del lenguaje.

Bloques de código PHP

Una página web en PHP generalmente contiene dos tipos de código: el código HTML yel código PHP. El código de PHP que va a procesar el interprete puede estar dentro deuna de las siguientes etiquetas:

<?php ... ?><script language="php"> ... </script><% ... %><? ... ?>

Nosotros vamos a usar la primera (es la más usual), las dos últimas hay que activarlasexprésamente en la configuración de PHP.

Ejemplo 2.1.1. Aquí podemos ver una página muy sencilla. Tiene tres bloques decódigo: al comienzo la cabecera HTML, después un fragmento en PHP y finalmente el

Programación en PHP

Plataforma de Teleformación de IFES Página 17 de 143

Page 18: ProgramacionenPHP

cierre de la página otra vez en HTML.

<html><head>

<title>Hola Mundo</title></head><body>

<p>

Bloque HTML

<?phpecho "Hola Mundo";?>

Bloque PHP

</p></body></html>

Bloque HTML

En un fichero PHP pueden alternarse tantos bloques HTML con bloques PHP como sequiera, siempre que estos últimos estén abiertos y cerrados por las etiquetasadecuadas.

Sentencias en PHP

Una sentencia es una instrucción básica que realiza alguna acción. También se lesllama a veces línea de código, aunque estrictamente hablando no tienen porqué ocuparexactamente una línea en el fichero.Es imprescindible que las sentencias estén bien diferenciadas. Para ello en PHP todasentencia debe ser terminada con un punto y coma " ; ". La única excepción a esto esla última sentencia antes del fin de un bloque de código PHP, indicado por "?> ".

Ejemplo 2.1.2. Los siguientes bloques de código están bien formados, ya que todas lassentencias, salvo la última, terminan con un punto y coma:

<?php echo "Esto es un bloque ";echo "de código correcto";?>

<?php echo "Esto es un bloque ";echo "de código correcto"?>

<?php echo "Esto es un bloque de código correcto" ?>

Las instrucciónes echo y print()

Programación en PHP

Página 18 de 143 Programación en PHP

Page 19: ProgramacionenPHP

Una de las instrucciones básicas de PHP es la instrucción echo . Se limita a interpretarel texto que se pone a continuación e insertarlo en la página web. Una forma alternativade conseguir esto es haciendo uso de la etiqueta:

<?= ... ?>

La función print() también es equivalente a echo .

Ejemplo 2.1.3. Los siguientes bloques de código PHP son equivalentes y por lo tantoproducen el mismo resultado:

<?php echo "Este texto se mostrará en la página web." ?>

<?= "Este texto se mostrará en la página web." ?>

<?php print("Este texto se mostrará en la página web.") ?>

Ejemplo 2.1.4. En muchas ocasiones querremos insertar un salto de línea en la páginade salida. En HTML el salto de línea se marca con la etiqueta <br> , por lo que paraconseguir este resultado lo haremos de forma similar a como se hace a continuación:

<?php echo "Esta es la primera línea.";echo "<br>" //Salto de línea HTMLecho "Esta es la segundalínea."?>

Funciones en PHP

En PHP hay dos tipos de funciones, las que están definidas por el propio lenguaje y lasque puede crear a medida el programador. Estas últimas las veremos en la U.D.3. delmódulo III.Pero en los trozos de código que vienen a continuación nos encontraremos que parahacer acciones complejas deberemos usar las funciones predefinidas del lenguajePHP. Estas se caracterizan por un identificador seguido por un parentesis,dentro delcual ponemos los parámetros que tenemos que pasarle a la función.

A medida que las vayamos usando iremos describiendo las funciones definidas. Unejemplo de este tipo de funciones que hemos visto ya es la instrucción print() .

Programación en PHP

Plataforma de Teleformación de IFES Página 19 de 143

Page 20: ProgramacionenPHP

Comentarios en PHP

Los cometarios son ignorados por el interprete a la hora de generar la página. De todasformas cumplen una función esencial, aumentar la legibilidad del código, para suposterior mantenimiento por nosotros o por otra persona. Con los comentariosdescribiremos la función de determinados fragmentos de código.

En PHP hay tres formas de poner comentarios:

<?php// Este es un comentario de una sola línea/*Este es un comentarioque ocupa varias líneas*/# Esta forma de poner comentarios de una línea se usa menos?>

Hay que tener en cuenta que si bien los comentarios ayudan a comprender el código ypor lo tanto facilitan el mantenimiento del código por nuestra parte o por la de otraspersonas, un abuso de los mismos puede hacer difícil distinguir a primera vista elpropósito del código. Lo ideal es escribir un código limpio que resulte lo más legibleposible y limitar el uso de comentarios a aquellas ocasiones en los que haya que haceruna aclaración imprescindible.

También es habitual insertar anotaciones en el código a medida que se estáconstruyendo, cuando aún no ha tomado su forma final. Este tipo de comentarios esconveniente eliminarlo en cuanto dejan de ser necesarios.

Hay dos palabras que se usan habitualmente en los comentarios durante el desarrollo.

<?php//FIXME: Marca un trozo de código que habría que mejorar//DOME: Marca una característica sin programar?>

No está de más recordar que los comentarios son parte del código PHP, por lo que hande estar en bloques de código PHP (es decir, abiertos por la etiqueta "<¿php " ycerrados por la etiqueta "?> ".

Errores en PHP

Sin lugar a dudas, cuando programemos, cometeremos errores, como olvidar poner unpunto y coma al final de una instrucción, o no cerrar adecuadamente unas comillas.Cuando vayamos a intentar ver el resultado en el navegador aparecerá un mensaje deerror (o varios) similar a este.

Programación en PHP

Página 20 de 143 Programación en PHP

Page 21: ProgramacionenPHP

El mensaje está en inglés y es muy probable que no nos oriente de qué es lo que estáfallando. Pero lo importante es que si que nos muestra donde (en qué línea) estáfallando, por lo que podremos dirigirnos a ella y arreglar el fallo.

Inhibir errores

En ocasiones no querremos que el error se vea por pantalla. Para conseguir estopondremos el símbolo arroba "@" antes de la sentencia en la que se produce el fallo.

Ejemplo 2.1.5. El primer trozo de código muestra un mensaje de error al intentar abrirun archivo que no existe. En cambio en el segundo fragmento se hace uso del símbolo@ para evitar que dicho error se muestre por pantalla.

<?php$archivo = fopen("noexiste.txt", "r");?>

<?php@$archivo = fopen("noexiste.txt", "r");?>

U.D.2. Variables

Datos en PHP

En PHP definimos los datos con los que vamos a trabajar como variables. Una variableno es más que una estructura de datos cuyo valor puede cambiar con el tiempo. PHPtrabaja con tres tipos de datos sencillos: integer (número entero), double (número con

Programación en PHP

Plataforma de Teleformación de IFES Página 21 de 143

Page 22: ProgramacionenPHP

decimales) y string (cadena de texto).

El separador de decimales en PHP es el punto, como en la mayoría de los lenguajes deprogramación.

Ejemplo 2.2.1. En los dos ejemplos anteriores el dato es de tipo cadena, aunque laúltima cadena contenga un número. Como se puede observar, los datos de tipo stringse escriben entre comillas, que pueden ser simples o dobles.

11 //esto es un dato de tipo integer 43.95 //estoes un dato de tipo double "Código postal" //esto es un dato de tipo string

"08080" //esto también es un dato de tipo string

Ejemplo 2.2.2. Si queremos escribir un dato que contenga comillas dobles loescribiremos encerrado entre comillas simples. Y si queremos escribir un dato quecontenga comillas simples lo encerraremos en comillas dobles.

'Leopoldo Alas "Clarin" fué un gran escritor...'

Nombre de variables

Todas las variables en PHP se distinguen por comenzar con el símbolo del dolar, "$",seguido del nombre de la variable. El nombre de una variable ha de empezarnecesariamente por una letra o el símbolo guión bajo "_" seguido por cualquiercombinación de números, letras o guiones bajos.

Ejemplo 2.2.3. Diferentes ejemplos de nombres de variables, válidos y no válidos.

<?php $apellido1; //nombre de variable válido$_tfno; //nombre de variable válido$1apellido; //no válido, empieza por un número$email@; //no válido, contiene el símbolo @?>

Es importante tener en cuenta que en lo nombres de variables se distingue entremayúsculas y minúsculas.

Ejemplo 2.2.4. Mediante este ejemplo se puede ver que PHP distingue entremayúsculas y minúsculas en los nombres de variables.

<?php $precio = 33;

Programación en PHP

Página 22 de 143 Programación en PHP

Page 23: ProgramacionenPHP

$Precio = 55;echo "La variable precio contiene el valor";echo $precio;echo "<br>";echo "La variable Precio contiene el valor";echo $Precio;?>

A pesar de que tenemos gran libertad a la hora de poner nombres a las variables esrecomendable seguir los siguientes consejos para que el código resulte más legible:

• Usar nombres de variable que tengan significado.• No usar nombres de variable demasiado largos (12-16 caracteres deberían

ser suficientes en la mayoría de los casos).• No usar como nombre de variable palabras clave de PHP.

Ejemplo 2.2.5. Los siguientes nombres de variable no son recomendables.

<?php $x37; //no tiene significado$preciodelproductoconiva //demasiado largo$echo //echo es una palabra clave de PHP?>

Asignación de datos a variables

Como se ha ido viendo en los ejemplos, a las variables se les asigna un dato medianteel símbolo igual "=".

Ejemplo 2.2.6. Asignación de un dato de tipo cadena a una variable.

<?php $telefono = "918903220";?>

Hay que tener en cuenta que PHP es un lenguaje poco tipado, Las variables no tienenun tipo de datos predefinido, el tipo vendrá dado según el contenido de la variable o elcontexto donde se trate. Este es el punto mas debil del lenguaje, aunque le aporta unasencillez y flexibilidad propias.

Constantes

Programación en PHP

Plataforma de Teleformación de IFES Página 23 de 143

Page 24: ProgramacionenPHP

Las constantes son una manera de asignar a un identificador valores simples que novan a variar. La declaración de una constante se realiza mediante la función define() .

El nombre de la constante debe seguir las mismas reglas que las variables, solo que nolleva delante el símbolo del dolar, "$", ya que no es una variable. Una práctica habituales poner los nombres de las constantes en mayúsculas.

Ejemplo 2.2.7. Sabemos a ciencia cierta que el número PI no va a cambiar. En lugarde tener que teclearlo varias veces a lo largo del código podemos definir una constantecon el identificador PI.

<?php $define("PI", 3.1416);echo PI; //No se pone el símbolo dolar?>

U.D.3. Operadores

Los operadores son utilizados para realizar cálculos y manipular datos en el ámbito deuna expresión. Las expresiones más comunes que conocemos, como la multiplicación,implican la participación de dos operandos (los datos) y un operador (el símbolo dela multiplicación). En PHP puede haber:

• Operadores unarios: La expresión manipula un único dato.• Operadores binarios: La expresión manipula dos datos.• Operadores ternarios: La expresión manipula tres datos.

Ejemplo 2.3.1. Los datos pueden ser introducidos directamente o estar almacenadosen variables. El resultado de la operación se suele asignar a una variable, aunquepuede formar parte de una expresión mayor. Esta variable a la que se asigna elresultado puede ser parte de la expresión.

<?php echo "La variable z vale ";$z = 1 + 5; //Los datos se introducen directamenteecho $z;echo "<br>";

echo "La variable z vale ";$x = 2;$y = 3;$z = $x + $y; //Los datos están almacenados en variablesecho $z;echo"<br>";

echo "La variable z vale ";$z = $x + $z; //La variable $z aparece en la expresiónecho $z; ?>

Programación en PHP

Página 24 de 143 Programación en PHP

Page 25: ProgramacionenPHP

Lo habitual es clasificar a los operadores según el tipo de cálculo o manipulación querealizan.

Operadores aritméticos

En PHP hay cinco operadores que realizan operaciones matemáticas entre dos datos yun operador unario, el signo de negación.

Operador Denominación Descripción Ejemplo Resultado

+ Suma Devuelvelasumadedosoperandos.

2+2 1

- Resta Devuelveladiferenciaentredosoperandos.

5-3 1

* Producto Devuelve lamultiplicación entredosoperandos.

2*3 1

/ Cociente Devuelveelcocientedeladivisiónentredosoperandos.

8/2 1

% Módulo Devuelveelrestodeladivisiónentre

7%4 3

Programación en PHP

Plataforma de Teleformación de IFES Página 25 de 143

Page 26: ProgramacionenPHP

dosoperandos.

- Cambiodesigno

Devuelveelvalordeloperandoconelsignocambiado.

$x=6$y=-x

$yvale-6

Ejemplo 2.3.2. Aquí se experimenta con varias operaciones aritméticas.

<?php echo "El resultado de sumar 5 y 3 es ";$z = 5 + 3;echo $z;echo "<br>";echo "El resultado de restar 3 a 5 es ";$z = 5 - 3;echo $z;echo "<br>";echo "El resultado de multiplicar 5 y 3 es ";$z = 5 * 3;echo $z;echo "<br>";echo "El resultado de dividir 5 entre 3 es ";$z = 5 / 3;echo $z;echo "<br>";echo "El resultado de calcular 5 módulo 3 es ";$z = 5 % 3;echo $z;echo "<br>";echo "El resultado de cambiar el signo a la variable $z es ";$z = -$z;echo $z;?>

Operadores de comparación

En el siguiente módulo se tratará de las sentencias de control. Estas utilizan elresultado de unas expresiones especiales para decidir cual sera la instrucción queejecutarán luego. Las expresiones básicas que utilizan son el resultado de unacondición. Este resultado solo puede tomar dos valores: verdadero o falso.

PHP tiene dos constantes predefinidas para designar los valores verdadero y falso, queson, como cabía esperar, TRUE y FALSE. Se pueden usar también en minúsculas,aunque conviene recordar que la práctica habitual en programación es usar lasconstantes en mayúsculas.

Programación en PHP

Página 26 de 143 Programación en PHP

Page 27: ProgramacionenPHP

Cuando el resultado es verdadero la expresión de comparación devolverá TRUE, si laevaluación de la expresión de comparación es falsa PHP devolverá como resultadoFALSE.

Operador Denominación Descripción Ejemplo Resultado

== Esigual

Devuelve verdaderosilosdosoperandossoniguales.

2==22==5

TRUEFALSE

!=<>

Noesigual

Devuelve verdaderosilosdosoperandossondiferentes.

2!=22!=5

FALSETRUE

< Esmenor

Devuelve verdaderosielprimeroperandoesmenorqueelsegundo.

2<55<2

TRUEFALSE

> Esmayor

Devuelve verdaderosielprimeroperandoes mayorqueelsegundo.

2>55>2

FALSETRUE

<= Esmenoroigual

Devuelve verdaderosielprimer

2<=52<=2

TRUETRUE

Programación en PHP

Plataforma de Teleformación de IFES Página 27 de 143

Page 28: ProgramacionenPHP

operandoesmenoroigual queelsegundo.

>= Esmayoroigual

Devuelve verdaderosielprimeroperandoesmayoroigual queelsegundo.

5>=22>=2

TRUETRUE

A nivel interno PHP no almacena TRUE o FALSE, snio que interpreta el valor 0 comofalso y el 1como verdadero (realmente interpreta como verdadero cualquier valor quesea diferente de 0. Por ejemplo, en PHP el valor 5 es interpretado como verdadero ).

Ejemplo 2.3.3. En este ejemplo aparece la construcción if ... else que se verá en laproxima unidad didáctica.

<?php echo "¿Es 5 igual a 3? ";if (5 == 3) { echo "TRUE";} else {

echo "FALSE";}echo "<br>";echo "¿Es 5 diferente a 3? ";if (5 != 3) { echo "TRUE";} else {

echo "FALSE";}echo "<br>";echo "¿Es 5 menor que 3? ";if (5 < 3) { echo "TRUE";} else {

echo "FALSE";}echo "<br>";echo "¿Es 5 mayor que 3? ";

Programación en PHP

Página 28 de 143 Programación en PHP

Page 29: ProgramacionenPHP

if (5 > 3) { echo "TRUE";} else {

echo "FALSE";}?>

Operadores lógicos

Los operadores lógicos sirven para relacionar los resultados de condiciones, es decir,combinan los resultados de valores TRUE y FALSE. Son útiles para representarexpresiones del tipo ¿Es cierto que Madrid es la capital de España y que a la vezMadrid es la ciudad más poblada de España?

Operador Denominación Descripción Ejemplo Resultado

&&and

AND(y)

Devuelve verdaderosiambosoperandossonverdaderos.

TRUE&&TRUETRUE&&FALSE

TRUEFALSE

||or

OR(o)

Devuelve verdaderosialmenosunodelosoperandosesverdadero.

TRUE&&TRUETRUE&&FALSE

TRUETRUE

xor XOR(oexclusivo)

Devuelve verdaderosiunodelosoperandosesverdaderopero

TRUE&&TRUETRUE&&FALSE

FALSETRUE

Programación en PHP

Plataforma de Teleformación de IFES Página 29 de 143

Page 30: ProgramacionenPHP

noambos.

! NOT(negación)

Devuelveverdaderosieloperandoesfalsoyfalsosiesverdadero

TRUEFALSE

FALSETRUE

Ejemplo 2.3.4. Al conjunto de combinaciones de valores que pueden tomar losoperandos y el resultado de la operación se le conoce en lógica como tabla de verdad.En el siguiente ejemplo construiremos la tabla de verdad del operador AND. De formasimilar se podría construir la tabla de verdad del resto de los operadores.

<pre><?php echo "Tabla de verdad del operador AND ";echo "<br>";echo "<br>";echo "opdo1 | opdo2 |opdo1 AND opdo2";echo "<br>";echo "------+-------+----------------";echo "<br>";echo "TRUE | TRUE | ";if (TRUE && TRUE) { echo "TRUE ";} else {

echo "FALSE";}echo "<br>";echo "TRUE | FALSE | ";if (TRUE && FALSE) { echo "TRUE ";} else {

echo "FALSE";}echo "<br>";echo "FALSE | TRUE | ";if (FALSE && TRUE) { echo "TRUE ";} else {

echo "FALSE";}echo "<br>";echo "FALSE | FALSE | ";if (FALSE && FALSE) { echo "TRUE ";} else {

Programación en PHP

Página 30 de 143 Programación en PHP

Page 31: ProgramacionenPHP

echo "FALSE";}?></pre>

Operador de unión de cadenas

En la mayoría de ejemplos anteriores, cuando hemos querido imprimir un texto porpantalla que estaba formado por varios fragmentos hemos tenido que usaruna instrucción echo por cada uno de los fragmentos. El operador de unión de cadenasnos permite unir los fragmentos para, por ejemplo, usar una sola instrucción echo.

Operador Denominación Descripción Ejemplo Resultado

. Concatenar Unedoscadenasdetexto

"Hola"."Mundo" "HolaMundo"

Ejemplo 2.3.5. Se pueden concatenar directamente cadenas de texto con datos de tipoentero. Los datos que se concatenan se pueden introducir directamente o extraer devariables.

<?php$x = 2;$y = 3;$z = $x + $y; echo "El resultado de sumar 2 y 3 es " . 5 . "<br>";echo "El resultado de sumar 2 y 3 es " . (2 + 3) . "<br>";echo "El resultado de sumar 2 y 3 es " . $z . "<br>";?>

Operadores de asignación

En la unidad didáctica sobre variables hemos visto el operador básico de asignación,que es el símbolo igual "=". Pero hay otros operadores que permiten hacer unaoperación y una asignación a la vez y por lo tanto producen un código má comprimido.El uso de estos operadores es desaconsejable para el programador principiante ya quepuede llevar a un código poco legible y como consecuencia a asignaciones erroneas.

Programación en PHP

Plataforma de Teleformación de IFES Página 31 de 143

Page 32: ProgramacionenPHP

Los operadores de asignación comprimidos y sus equivalencias son:

Operador Ejemplo Equivalencia

= $x = 4 $x = 4

+= $x += 4 $x = $x + 4

-= $x -= 4 $x = $x - 4

*= $x *= 4 $x = $x * 4

/= $x /= 4 $x = $x / 4

%= $x %= 4 $x = $x % 4

.= $x .= "mundo" $x = $x ."mundo"

++ $x++ $x = $x + 1

-- $x-- $x = $x - 1

Precedencia de operadores

Un último aspecto que conviene mencionar es, ¿qué pasa cuando en una expresióncompleja aparece más de un operando? En ese caso, ¿qué operaciones se evaluanantes?.

Cuando hay expresiones complejas con más de un operando hay unos que se evaluanantes de otros siguiendo el siguiente orden, teniendo en cuenta que los de arriba seevalúan antes que los de abajo y que los de la misma fila tienen igual precedencia (seevalúan de izquierda a derecha):

Operador lógico de negación !

Operadores multiplicativos * / %

Programación en PHP

Página 32 de 143 Programación en PHP

Page 33: ProgramacionenPHP

Operadores aditivos + - .

Operadores de comparación < <= > >=

Operadores de comparación(igualdad)

== !=

Operadores lógicos (salvo lanegación)

&& || xor

Operadores de asignación = (y operadorescomprimidos)

En cualquier caso podemos alterar la precedencia mediante la inclusión de partentesisalrededor de las expresiones. De hecho es muy recomendable hacerlo incluso aunqueexista una regla de precedencia que produzca el mismo resultado, para dar mayorclaridad al código.

Ejemplo 2.3.6. La multiplicación tiene precedencia sobre la suma por lo que, sinparéntesis, en la expresión 2 + 5 * 4 se evalúa primero 5 * 4 y luego se le suma dos.

<?php echo "El resultado de (2 + 5) * 4 es " . ((2 + 5) * 4);echo "<br>";echo "El resultado de 2 + 5 * 4 es " . (2 + 5 * 4);//El último caso resulta máslegible si ponemosecho "El resultado de 2 + 5 * 4 es " . (2 + (5 * 4));?>

U.D.4. Sentencias de control

Hasta ahora solo hemos visto instrucciones muy sencillas. Además la único quepodíamos hacer con ellas es ejecutarlas secuencialmente. Pero, ¿tenemosherramientas para elegir una alternativa entre dos? ¿O para escribir 5 veces un textopor pantalla? Para hacer frente a estas situaciones se incluyen en cualquier lenguajede programación las sentencias de control.

Estructuras condicionales.

Instrucción if

Programación en PHP

Plataforma de Teleformación de IFES Página 33 de 143

Page 34: ProgramacionenPHP

Las instrucciones condicionales permiten ejecutar diferentes fragmentos de código enfunción del resultado de una expresión condicional. La instrucción básica es if . Lasintaxis es:

if (condición ) {Código a ejecutar si la condición es cierta

}

Cuando el código a ejecutar si la condición es cierta es una sola sentencia sepueden omitir las llaves "{" "}". En cualquier caso es preferible no omitirlos ya que danmayor claridad a cuales son exáctamente las sentencias que se ejecutan en el caso decumplirse la condición.

Ejemplo 2.4.1. Las dos construcciones siguientes son equivalentes, aunque espreferible siempre usar la primera por claridad:

<?php$hora = 8; // La hora en formato de 24 horasif ($hora == 8) {

echo "Suena el despertador.";}echo "<br>";if ($hora == 8)echo "Suena el despertador.";?>

Ejemplo 2.4.2. Veamos la diferencia entre poner llaves para encuadrar un bloque detexto entre llaves y no hacerlo:

<?php$hora = 11; // La hora en formato de 24 horasif ($hora == 8) {

echo "Suena el despertador. ";echo "Es la hora de levantarse.";

}echo "<br>";if ($hora == 8) echo "Suena el despertador. ";

echo "Es la hora de levantarse.";?>

Instrucción else

En muchos casos no nos bastará con ejecutar un código si ese cumple la condiciónsino que querremos elegir entre dos opciones alternativas y mutuamente excluyentes.En estos casos la sentencia if se completa con un bloque de código que se ejecuta solosi es falsa la condición:

if (condición ) {

Programación en PHP

Página 34 de 143 Programación en PHP

Page 35: ProgramacionenPHP

Código a ejecutar si la condición es cierta} else {

Código a ejecutar si la condición es falsa }

Ejemplo 2.4.3.

<?php$hora = 17; // La hora en formato de 24 horasif ($hora <= 12) {

echo "Son las " . $hora . " de la mañana";} else {

echo "Son las " . ($hora - 12) . " de la tarde";}?>

Instrucción else if

También puede suceder que queramos encadenar diferentes condiciones. Para ello sepuede encadenar una sentencia else con un nuevo condicional. A su vez la nuevasentencia if puede ser completada por un else.

if (condición1 ) {Código a ejecutar si la condición1 es cierta

} else if (condición2 ) {Código a ejecutar si la condición1 es falsa y la 2 cierta } else {Código a ejecutar si ambas condiciones son falsas

}

Ejemplo 2.4.4. Se pueden encadenar varias sentencias else if como se ve en elsiguiente programa:

<?php$hora = 14; // La hora en formato de 24 horasif ($hora == 8) {

echo "Es la hora de desayunar.";} else if ($hora == 14) {

echo "Es la hora de la comida.";} else if ($hora == 21) {echo "Es la hora de la cena.";} else {echo "Ahora no toca comer.";}?>

Instrucción switch

En el caso anterior se elegía entre varias opciones alternativas y excluyentes. PHP nosofrece una instrucción que nos facilita la tarea, siempre que haya que elegir entre

Programación en PHP

Plataforma de Teleformación de IFES Página 35 de 143

Page 36: ProgramacionenPHP

varias posibles. A diferencia de con la instrucción if , si queremos que se ejecutenvarias instrucciones no será necesario englobarlas entre llaves "{" "}". La ejecuciónseguirá hasta que encuentre el siguiente break.

switch (expresion ) { case etiqueta1 : Código a ejecutarsi expresión == etiqueta1 break; case etiqueta2 : Códigoa ejecutar si expresión == etiqueta1 break; case default :Código a ejecutar si no se verifica ninguna etiqueta break; }

El bloque de código detras del default se ejecuta en el caso de que no se hayaverificado ninguno de los casos anteriores. Terminar el bloque de instrucciones defaultcon una instrucción break es opcional, pero es recomendable ya que mejora lalegibilidad.

Ejemplo 2.4.5. Puede haber tantas sentencias case como sea necesario.

<?php$hora = 14; // La hora en formato de 24 horasswitch ($hora) {

case 9: echo "Es la hora de desayunar.";break; case 14: echo "Es la hora de comer.";break; case 21: echo "Es la hora de merendar.";break; default: echo "Ahora no toca comer.";break;}

?>

Ejemplo 2.4.6. Aquí se puede observar dos estrategias que nos pueden ser útiles enalgunos casos. La primera es formar un grupo de alternativas que producen unresultado. La segunda en omitir intencionadamente la instrucción break al final de unbloque.

<?php$hora = 19; // La hora en formato de 24 horasswitch($hora) {

case 24: case 23: case 22: echo "Ya he cenado.";case 21: case 20: case 19: case 18: case 17: case 16: case

15: echo "Ya he comido.";case 14: case 13: case 12: case 11: case 10: echo "Ya

he desayunado."; break;default:

echo "Tengo hambre";break;}?>

Programación en PHP

Página 36 de 143 Programación en PHP

Page 37: ProgramacionenPHP

Estructuras iterativas

En muchas ocasiones, al programar, hay una acción que se repite varias veces.Podríamos poner varios bloques de código iguales seguidos para conseguir esteefecto, pero esto nos conduciría a un código redundante y muy largo. Además, ¿quesucede si no conocemos las veces que queremos repetir el código a priori?

Instrucción while

Es la estructura más sencilla. Repite indefinidamente la ejecución de un bloque decódigo mientras la evaluación de la condición sea cierta. La forma que tenemos decontrolar cuantas veces se repite el bucle while es a través de la condición. Por lo tantoen el cuerpo del bucle se han de modificar las variables que intervienen en la condiciónde tal forma que en algún momento sea falsa.

while (condición ) { Código a ejecutar mientras la condición sea cierta}

Ejemplo 2.4.7. El ejemplo más tipo de ejecución de un bucle es contar. Es importanteobservar dos cosas:

1. La variable $i se inicializa fuera del bucle.2. La variable $i se modifica en la última instrucción del cuerpo delbucle. De esta forma cada vez que se evalúa la condición ha cambiado.Cuando $i llega a valer 11 la condición es falsa y el bucle termina.

<?php$i = 1;while ($i <= 10) { echo "Línea " . $i;

echo"<br>";$i++;

}?>

Ejemplo 2.4.8. Un ejemplo un poco más complejo. En la expresión condición del buclese hace uso de una constante por primera vez en los ejemplos.

<?phpdefine(HORA_DE_CENAR, 21); //Constante$hora = 12; // La hora en formato de 24 horaswhile ($hora <HORA_DE_CENAR) {

echo "Son las " . $hora . ". ";

Programación en PHP

Plataforma de Teleformación de IFES Página 37 de 143

Page 38: ProgramacionenPHP

echo "Faltan " . (HORA_DE_CENAR - $hora) . " horas ";echo "para la cena."; echo"<br>";$hora++;

}echo "Son las " . $hora . ". Es la hora de la cena.";?>

Instrucción do ... while

En PHP se dispone también de la estructura do ... while, que a diferencia de la anteriorevalúa la condición al final en lugar de al principio del bucle. De esta forma el bucle seejecuta siempre al menos una vez y a partir de ese momento se repite mientras lacondición sea cierta.

do { Código a ejecutar } while (condición );

Ejemplo 2.4.9. Uno de los casos en los que se usa esta estructura es cuando se estáesperando recibir un dato en concreto y hay que realizar varias veces una lectura de undato hasta que se recibe el dato esperado. Como aún no conocemos ninguna forma derecibir datos todavía se ha optado por generarlos aleatoriamente. En este ejemplo sesimula el lanzamiento de un dado de parchis.

<?phpdo { $dado = rand(1,6); //rand() devuelve un valor aleatorioecho "Tirando el dado... ";echo "ha salido un " . $dado . ".";echo "<br>";

} while ($dado != 5);echo "¡Bien! Saco una ficha de casa.";?>

Instrucción for

La instrucción for es probablemente la más fácil de comprender para las personas queestán aprendiendo a programar, dado que, en la mayoría de los casos se conoce elnúmero de veces que se va a ejecutar el bucle antes de entrar al mismo. La sintaxisque tiene en PHP es:

for (inicialización ; condición ; incremento ) { Código a ejecutar }

El bucle se ejecutará mientras la condición sea TRUE.

Programación en PHP

Página 38 de 143 Programación en PHP

Page 39: ProgramacionenPHP

Ejemplo 2.4.10. Aquí se puede ver un bucle for sencillo que, al igual que el bucle whiledel ejemplo 2.4.7., imprime 10 líneas numeradas. Como se puede observar es habitualutilizar la variable $i en el cuerpo del bucle. A esta variable se le llama a veces índice.

<?phpfor ($i = 1; $i <= 10; $i++) { echo "Línea " . $i;

echo"<br>";}?>

Ejemplo 2.4.11. La instrucción de incremento no tiene porqué hacer aumentar el valor,también lo puede hacer retroceder. En este ejemplo se imprime una cuenta atrás.

<?phpecho "Cuenta atrás.";echo "<br>";for ($i = 10; $i >= 0; $i--) { echo $i . " ... ";

echo"<br>";}echo "Ignición!";?>

Ejemplo 2.4.12. También se puede hacer que la instrucción incremento aumente elvalor en cada paso un número distinto de 1. El siguiente programa cuenta los númerosdel 3 al 15 de 3 en 3.

<?phpfor ($i = 3; $i <= 15; $i = $i + 3) { echo $i;echo"<br>";

}?>

Ejemplo 2.4.13. La condición no tiene por qué ser necesariamente sobre la variabledeclarada como índice . En este ejemplo se puede observar esto. El resultado es elmismo que con el ejercicio anterior.

<?php$j = 3for ($i = 1 ; $j <= 15 ; $i = $i++) {$j = $i * 3; echo $j;echo"<br>";

}?>

De todas formas es muy recomendable que la condición sea sobre el índice. Tambiénhay que evitar alterar el contenido del índice en el cuerpo del bucle, pues puede llevar a

Programación en PHP

Plataforma de Teleformación de IFES Página 39 de 143

Page 40: ProgramacionenPHP

comportamientos impredecibles si no se tiene cuidado.

Anidamiento de bloques de código

Hasta ahora hemos visto a las sentencias de control actuar de forma aislada. Pero enla mayoría de las situaciones nos encontraremos con que para obtener el resultadoesperado hemos de hacer que trabajen juntas. Esto no supone ningún problema. Unbloque de código dentro de una sentencia de control puede contener varias sentenciascondicionales, y a su vez los bloques de código de estas, nuevas sentenciascondicionales.

Ejemplo 2.4.14. Aquí se puede ver un caso típico del uso de sentencias de controlanidadas.

<?phpfor ($i = 1; $i <= 10; $i++) { if (($i % 2) == 1) {

echo "El " . $i . " es un número impar.";echo "<br>"; } else {echo "El " . $i . " es un número par.";echo "<br>"; }

}?>

El principal problema con el que nos podemos encontrar es tener un código pocolegible. Para evitarlo es recomendable poner espacios delante de cada bloque decódigo de tal forma que el comienzo de las instrucciones comience a diferentesdistancias del margen dependiendo del bloque en el que se está. A esta técnica se lellama indentado (sangrado).

El indentado más habitual es de 4 espacios en blanco por cada nivel de anidamiento.Todos los fragmentos de código que se han incluido hasta ahora se han puesto coneste estilo de indentado con el que es más frecuente encontrárselos.

Ejemplo 2.4.15. Este código es idéntico al anterior pero sin indentado. Es obvio queeste es mucho más dificil de comprender el flujo que sigue el programa.

<?phpfor ($i = 1; $i <= 10; $i++) {if (($i % 2) == 1) {echo "El " . $i . " es un número impar.";echo "<br>";} else {echo "El " . $i . " es un número par.";echo "<br>";}}?>

Programación en PHP

Página 40 de 143 Programación en PHP

Page 41: ProgramacionenPHP

Indentar no es obligatorio, el código funcionaría igual sin hacerlo, pero como se ha vistoen este ejemplo los programas se vuelven prácticamente ilegibles.

Ejemplo 2.4.16. Mediante el anidamiento se pueden conseguir resultados interesantescon muy poco código. En el siguiente ejemplo se va a dibujar una tabla de multiplicar.

<table><?phpfor ($i = 1; $i <= 10; $i++) {

echo "<tr align='right'>";for ($j = 1; $j <= 10; $j++) {

echo "<td width='25'>" . ($i*$j) . "</td>";}echo "</tr>";

}?></table>

Terminación de los bucles

Si no controlamos bien la condición del bucle esta nunca se evaluará a falso y el buclese evaluará indefinidamente, dando lugar a un bucle infinito. Este es uno de los erroresmás habituales, en bucles complejos puede ser fácil perder de vista cuales son lasvariables que intervienen en la evaluación de la condición.

Ejemplo 2.4.17. Este es un bucle infinito que escribirá indefinidamente una frase porpantalla. El bucle no se detiene hasta que no paremos la descarga desde el navegadoro nos quedemos sin memoria.

<?phpwhile (TRUE) {echo "Hasta el infinito ";echo "y más allá...";echo "<br>";

}?>

break

La ejecución natural de los bucles se puede interrumpir mediante la sentencia break .En el cuerpo de cualquiera de los tipos de bucle que hemos visto, una sentencia breakcausa la finalización del mismo sin ejecutarse ninguna sentencia más del cuerpo delbucle. En otras palabras, en cuanto se encuentra una sentencia break se interrumpe la

Programación en PHP

Plataforma de Teleformación de IFES Página 41 de 143

Page 42: ProgramacionenPHP

ejecución del bucle y se pasa a la siguiente línea de código después del bucle.

Ejemplo 2.4.18. Bucle que se interrumpe mediante un break.

<?phpwhile (TRUE) {

echo "Hasta el infinito";break;echo " y más allá..."; echo "<br>";

}?>

Ejemplo 2.4.19. En ocasiones se pone intencionadamente un bucle infinito que sepretende romper con una sentencia break en su cuerpo.

<?phpdefine(ALERTA_MISION, 5);$nivel_alerta = 1;while (TRUE) {

echo "Hasta el infinito";if ($nivel_alerta == ALERTA_MISION) {

break;} echo " y más allá...";echo "<br>";$nivel_alerta++; // Se incrementa en uno}

echo "Parece que hay alguien en apuros.";?>

continue

La sentencia continue tiene cierta similitud con la sentencia break .

Su funcionamiento es el siguiente. En cuanto se encuentra una sentencia continue seignoran el resto de las instrucciones del cuerpo del bucle pero no se sale del mismo,sino que se salta a la sentencia de evaluación de la condición . Obviamente si en esemomento la condición del bucle es verdadera el bucle comenzara una nueva ejecución.

Ejemplo2.4.20. Este programa lista los números del 1 al diez, indica los queson múltiplos por 3 y si son divisibles por 3 nos muestra el resultado de esta división.

<?phpfor ($i = 1; $i <= 10; $i++) {echo "El número " . $i;if (($i % 3) != 0) {

echo " no es multiplo de 3.";

Programación en PHP

Página 42 de 143 Programación en PHP

Page 43: ProgramacionenPHP

echo "<br>";continue;

}echo " es multiplo de 3. ";echo "Por lo tanto ";echo $i . " dividido entre 3 es igual a " . ($i / 3); echo "<br>";

}?>

Las sentencias break y continue dan lugar por lo general a un código más complejo ypropenso a errores, por lo que no se recomienda su uso por parte del programadorprincipiante.

Programación en PHP

Plataforma de Teleformación de IFES Página 43 de 143

Page 44: ProgramacionenPHP

Módulo III. Conceptos avanzados

U.D.1. Cadenas

El manejo de cadenas en PHP es de vital importancia, ya que la única forma quetenemos de comunicarnos con el cliente es a través de texto. Hay que tener en cuentaque el producto de un programa en PHP es una página web con formato HTML.

Combinar código HTML con código PHP

Como en una página web dinámica programada en PHP hay código de dos tipos lomejor es mantenerlos bien diferenciados. Hay que ser especialmente cuidadosoprocurando que el código sea muy legible. Esto facilitará el mantenimiento de la páginay hará mucho más sencillo dotarla de elementos de diseño.

El objetivo ideal sería que un diseñador web pudiera aplicar diseño a una página PHPsin tener que preocuparse de la programación que contiene. En el módulo V veremosuna breve introducción a las plantillas que nos facilitan notablemente la tarea deseparar el código HTML del PHP.

Variables dentro de cadenas

Hasta ahora, siempre que hemos necesitado mostrar un texto compuesto por unacadena y el valor de una variable los hemos tenido que unir usando el operadorconcatenar " . ". Pero PHP ofrece una sintaxis alternativa que resulta más compacta ypuede ser de utilidad en muchos casos.

Ejemplo 3.1.1. Si ponemos una variable en el interior de una cadena entre comillas,PHP la interpreta y en vez del nombre de la variable escribe su valor. Lo podemoscomprobar a continuación, donde los dos fragmentos de código producen los mismosresultados.

<?php$edad = 46;echo "Belinda tiene " . $edad . " años.";?>

<?php$edad = 46;

Programación en PHP

Página 44 de 143 Programación en PHP

Page 45: ProgramacionenPHP

echo "Belinda tiene $edad años.";?>

Uso de la sentencia echo

Es recomendable usar esta forma de conseguir salida cuando es predominante lacantidad de código PHP sobre la cantidad de código HTML. Lo mismo se aplica al usode la función print() que produce los mismos resultados. Hay partidarios de usar unaforma y partidarios de usar la otra, lo que no es muy recomendable es mezclarlasdentro del mismo programa.

Ejemplo 3.1.2. En este pequeño programa predomina el código PHP sobre el códigoHTML.

<html><head>

<title>Números primos</title></head><body><?phpdefine(LIMITE, 100);echo "Los números primos del 1 al " . LIMITE . " son:";echo "<br>";for ($i = 1; $i <= LIMITE; $i++) {

$es_primo = TRUE; //Hipótesis inicial, es primofor ($j =2; $j < $i; $j++) {

if(($i % $j) == 0) { //Tiene un divisor$es_primo = FALSE; //Luego no es primobreak;

}}if ($es_primo) {

echo "$i";echo "<br>";

}}?></body></head>

Uso de la sintaxis <?= ... ?>

A la inversa, cuando predomina el código HTML sobre el código PHP es interesantemostrar la salida usando esta sintaxis.

Programación en PHP

Plataforma de Teleformación de IFES Página 45 de 143

Page 46: ProgramacionenPHP

Ejemplo 3.1.3. En este pequeño programa predomina el código HTML sobre el códigoPHP.

<html><head>

<title>El hombre del tiempo</title></head><body bgcolor="#cccccc"><table border="1">

<tr><td align="center" colspan="2">

Hola, soy el hombre del tiempo.<br>Mi método para adivinar el clima es infalible.

</td></tr><tr>

<td align="center">Temperatura mínima prevista

</td><td align="center">

Temperatura máxima prevista</td>

</tr><tr>

<td align="center"><font size="+2"><?= rand(0, 15)?></font> grados.

</td><td align="center">

<font size="+2"><?= rand(15, 30)?></font> grados.</td>

</tr></table></html>

Fragmentos de HTML dentro de estructuras condicionales

Cuando tenemos que mostrar trozos de código HTML muy grandes y este se encuentradentro de una estructura condicional, puede ser muy pesado construirlos a base desentencias echo . En este caso es preferible volver a cerrar el bloque de código PHPcon la etiqueta ?>, escribir el código HTML que se ejecuta condicionalmente, y abrirotra vez el código PHP con la etiqueta <?php para terminar la estructura condicional.

Este sistema, combinado con el uso de la sintaxis <=? ... ?> produce un código

Programación en PHP

Página 46 de 143 Programación en PHP

Page 47: ProgramacionenPHP

compacto y fácil de leer.

Ejemplo 3.1.4. Aquí se ven las dos estrategias. La segunda es más compacta y clara.

<?php$autorizado = FALSE;

if (!$autorizado) {echo ?<center>?;echo ?<table bgcolor="#cccccc">?;echo ?<tr>?;echo ?<td align="center">?;echo ?<font color="#ff0000" size="+2">?;echo ?No está autorizado a ver esta página.?;echo ?<br>?;echo ?Contacte con el administrador del sistema.?;echo ?</font>?;echo ?</td>?;echo ?</tr>?;echo ?</table>?;echo ?</center>?;

}?>

<?php$autorizado = FALSE;

if (!$autorizado) {?><center><table bgcolor="#cccccc">

<tr><td align="center">

<font color="#ff0000">No está autorizado a ver esta página.<br>Contacte con el administrador del sistema.</font>

</td></tr>

</table></center> <?php

}?>

Programación en PHP

Plataforma de Teleformación de IFES Página 47 de 143

Page 48: ProgramacionenPHP

Distribución del código

La última cuestión que nos queda por resolver es donde situar el código. Salvo elcódigo que muestra resultados por pantalla, que tiene que aparecer en el lugarapropiado de la página, el código PHP se puede situar en cualquier lugar. La mejoropción es separarar en la medida de lo posible el código encargado de:

• Inicializar las constantes y variables.• Leer datos de entrada.• Realizar operaciones.

Este código es conveniente ponerlo al principio de la página. Los resultados de lasoperaciones que se quieran mostrar se almacenan entonces en variables auxiliares yse muestran en el cuerpo de la página HTML donde corresponda haciendo uso de lasetiquetas <?= ... ?>.

Ejemplo 3.1.5. Esta es una página web en PHP bien construida. Usa un algoritmo parahallar el máximo común divisor de dos números generados aleatoriamente.

<?php//InicializaciónDEFINE(LIMITE, 100);

//Lectura de datos$i = rand(1, LIMITE); //Simulamos la lectura$j = rand(1, LIMITE);

//Operaciones con los datosif ($i > $j) {

$mayor = $i;$menor = $j;

} else {$mayor = $j;$menor = $i;

}while (($mayor % $menor) != 0) {

$auxiliar = $menor;$menor = $mayor % $menor;$mayor = $auxiliar;

}$mcd = $menor;?><html><head>

<title>Máximo comun divisor</title>

Programación en PHP

Página 48 de 143 Programación en PHP

Page 49: ProgramacionenPHP

</head><body>El máximo común divisor de <?= $i ?>y <?= $j ?>es <?= $mcd ?>.</body></html>

Esto no es posible siempre. Por ejemplo, si tenemos que mostrar una lista de 11resultados el bucle que los recorre deberá estar mezclado con el código HMTL. Detodas formas con la experiencia iremos aprendiendo poco a poco a extraer la mayorparte del código PHP al comienzo de la página.

Manipulación de cadenas

PHP dispone de funciones predefinidas en el núcleo que nos permiten haceroperaciones con los textos almacenados en cadenas. Ya hemos visto las función echoy printf() pero hay unas cuantas más.

Acceder a los caracteres de una cadena

Se puede acceder a los caracteres de las cadenas indicando la posición del caracterque queremos extraer. Las posiciones van desde 0 hasta el número de caracteres(longitud) menos uno. Si intentamos acceder a una posición más allá del final de lacadena nos devolverá la cadena vacía (cadena sin ningún caracter = "").

Ejemplo 3.1.6. Varias pruebas extrayendo caracteresde una cadena.

<?php$cadena = "Pernambuco";echo "Cadena a analizar: '$cadena'<br>";

//Caracter en la primera posiciónecho "Caracter en la posición 0: '$cadena[0]'<br>";

//Caracteres de posiciones intermediasecho "Caracter en la posición 1: '$cadena[1]'<br>";echo "Caracter en la posición 5: '$cadena[5]'<br>";echo "Caracter en la posición 5: '$cadena[7]'<br>";

//La cadena tiene longitud 10, la última posición es la 9echo "Caracter en la posición 9: '$cadena[9]'<br>";

//La cadena tiene longitud 10, en la posición 12 no hay nadaecho "Caracter en la posición 12: '$cadena[12]'<br>";?>

Programación en PHP

Plataforma de Teleformación de IFES Página 49 de 143

Page 50: ProgramacionenPHP

strlen()

Por lo general no conceremos la longitud de la cadena a priori. Esta función nospermite obtenerla.

strlen(cadena )

strpos()

En ocasiones nos interesará conocer la posición de la primera aparición de un caracteren una cadena. Si no se encuentra el caracter devuelve FALSE.

strpos(cadena , caracter )

Alternativamente podemos indicarle la posición a partir de la cual queremos queempiece a buscar.

strpos(caracter, posición inicial )

substr()

Habrá muchos casos en los que nos interesará extraer un trozo del texto de unacadena. Para hacerlo disponemos de esta función.

substr(caracter, posición inicial, posición final )

Ejemplo 3.1.7. El funcionamiento de las funciones se va a explicar con un ejemplotípico, la comprobación de que un mail es correcto y la extracción de datos del mismo.

<?php$email = "[email protected] ";

echo "Email a analizar: ?$email?<br>";echo "<br>";echo "Tiene " . strlen($email) . " letras.<br>";

//Indica la posición del caracter "@" o FALSE si no está$posicion_arroba = strpos($email, "@");

//Busca la aparición de un punto (.) partir de la arroba$posicion_punto = strpos($email, ".", $posicion_arroba);

Programación en PHP

Página 50 de 143 Programación en PHP

Page 51: ProgramacionenPHP

if ($posicion_arroba && $posicion_punto) {echo "Es una dirección de email válida<br>";$usuario = substr($email, 0, $posicion_arroba);$dominio = substr($email, $posicion_arroba + 1);echo "El nombre de usuario es: $usuario<br>";echo "El dominio es: $dominio<br>";

} else {echo "No es una dirección de email válida<br>";if (!$posicion_arroba) {

echo "Le falta el caracter arroba<br>";}if (!$posicion_punto) {

echo "El dominio no es válido<br>";}

}?>

trim()

Elimina los espacios en blanco al principio y final de una cadena.

trim(cadena )

str_replace()

En un texto, reemplaza las apariciones de una cadena por otra.

str_replace(cadena original, cadena a buscar, cadena reemplazar )

Ejemplo 3.1.8. En este ejemplo se supone que podemos recibir emails con erroneos, ylos intentamos arreglar. El primer error que eliminamos es la aparición de espacios enblanco al principio y al final de la dirección. El segundo cuando los usuarios escriben eldominio pernambuco.es cuando el correcto es pernambuco.com .

<?php$email = " [email protected] ";echo "Dirección recibida: ?$email?.<br>";//Eliminamos los espacios en blanco$email = trim($email);//Reemplazamos pernambuco.es por pernambuco.com$email = str_replace($email, "pernambuco.es", "pernambuco.com");

Programación en PHP

Plataforma de Teleformación de IFES Página 51 de 143

Page 52: ProgramacionenPHP

echo "Dirección corregida: ?$email?.";?>

strtoupper() y strtolower()

La función strtoupper() convierte los textos a mayúsculas, y strtolower() a minúsculas.

strtoupper(cadena )strtolower(cadena )

Ejemplo 3.1.9. En este ejemplo vamos a pasar la dirección de correo a minúsculas.

<?php$email = " [email protected] ";echo "Dirección recibida: ?$email?.<br>";//Convertimos a minúsculas$email = strtolower($email);echo "Dirección corregida: ?$email?.";?>

Ejemplo 3.1.10. Un uso muy habitual de estas funciones es para comparar cadenas.Para PHP la cadena "MADRID" es diferente a la cadena "Madrid", pero mediante estasfunciones se pueden comparar como iguales.

<?phpecho "Comparación de cadenas directamente: ";if ("MADRID" == "Madrid") {

echo "MADRID es igual a Madrid<br>";} else {

echo "MADRID no es igual a Madrid<br>";}echo "<br>";echo "Antes de compararar pasamos ambas a minúsculas: ";if (strtolower("MADRID") == strtolower("Madrid")) {

echo "MADRID es igual a Madrid<br>";} else {

echo "MADRID no es igual a Madrid<br>";}?>

Programación en PHP

Página 52 de 143 Programación en PHP

Page 53: ProgramacionenPHP

number_format()

Esta función es útil cuando hay que mostrar datos de tipo double, es decir, númeroscon decimales. Permite especificar el número de decimales que queremos que semuestren, en lugar de los diez decimales que se muestran habitualmente.

number_format(número, decimales )

Ejemplo 3.1.11. Esta función ya apareció en una práctica del módulo anterior.

<?php$precio_kg = 1.29;$peso = 2.17;$a_pagar = $precio_kg * $peso;//Saca el dato $a_pagar ocn 2 decimalesecho "A pagar " . number_format($a_pagar, 2) . " euros.";?>

U.D.2. Arrays

Hasta ahora hemos trabajado en nuestros programas con una pequeña cantidad dedatos, y la cantidad de los mismos no variaba a lo largo del programa. Pero la mayoríade los programas que hacen algo útil requieren tratar gran cantidad de datos. En estecaso sería muy incomodo tener una variable para cada dato.

Afortunadamente cuando se tratan muchos datos estos suelen ser de unos tipos muysimilares entre sí. Para tratarlos en grupos PHP ofrece tipos de datos compuestos, esdecir, tipos de datos que permiten almacenar varios datos en una misma variable.

El tipo de datos compuesto más sencillo es el array . Es una estructura muy potente,flexible y de uso muy intuitivo. Un array está compuesto por varios elementos. Cadaelemento almacena un valor diferente. Y para poder localizar un elemento haydisponemos del índice (algo así como una dirección).

Arrays indexados numéricamente

El tipo más sencillo de arrays son los indexados numéricamente, en los que el índicede cada elemento corresponde con su posición. Hay que tener en cuenta qué, al igualque sucedía con las cadenas, el primer elemento de un array tiene índice 0 (y no 1como cabría esperar).

Programación en PHP

Plataforma de Teleformación de IFES Página 53 de 143

Page 54: ProgramacionenPHP

Inicializaciar un array

Los arrays se suelen almacenar en variables, como cualquier otro tipo de datos.La forma más sencilla de crear un array es asignando los valores de sus elementos a lavez que se crea. Para ello primero declaramos el nombre de la variable y usamos lafunción array() , a la que le pasamos como parámetros un grupo de valores separadospor comas.

Ejemplo 3.2.1. Creación de un array por asignación directa mediante la función array():

<?php $edades = array(28, 43, 32, 55);$formas = array("triángulo", "cuadrado", "círculo");?>

La segunda forma de crear un array es añadiéndole elementos al final del array. Paraañadir un elemento a un array se usa su identificador seguido de corchetes "[ ]", sin elíndice, y se le asigna un valor.

Ejemplo 3.2.2. Aquí se puede ver como se crea un array mediante la adición deelementos.

<?php $paises[] = "Italia"; //Añade el elemento con índice 0$paises[] = "Francia"; //Añade el elemento con índice 1$paises[] ="Portugal"; //Añade el elemento con índice 2?>

Ejemplo 3.2.3. Se pueden combinar ambas formas, primero declarar un arraydirectamente y cuando sea necesario ir añadiendo elementos.

<?php $frutas = array("melón", "sandía", "naranja");$frutas[] = "manzana";$frutas[] = "melocoton";?>

Acceder a un elemento de un array

Programación en PHP

Página 54 de 143 Programación en PHP

Page 55: ProgramacionenPHP

Necesitaremos acceder a los elementos de un array para asignarles valores o para leersu contenido. Esto es muy sencillo, basta poner el índice del elemento al que queremosacceder entre corchetes "[ ... ]".

Ejemplo 3.2.4. Aquí se leen los valores de los elementos de un array para sacarlospor pantalla. Luego se asigna un nuevo valor al primer elemento (recordamos, coníndice 0).

<?php $frutas = array("melón", "sandía", "naranja");echo "La primera fruta de la lista es $frutas[0].<br>";echo "La segunda fruta de la lista es $frutas[1].<br>";echo "La tercera fruta de la lista es $frutas[2].<br>";$frutas[0] = "limón"; //Asigna un nuevo valor al elemento 1echo "La primera fruta de la lista es $frutas[0].";?>

Recorrer un array

Los arrays se suelen utilizar para almacenar listas de valores. Por ello una de lasacciones más habituales que se hacen con ellos es recorrerlos de principio a fin paraleer o modificar uno o varios de ellos.

Las estucturas iterativas (bucles) que se vieron en la unidad didáctica 4 del módulo IIson idóneas para recorrer arrays. Lo único que hay que hacer es limitar el número deiteraciones al número de elementos del array. Para esto disponemos de la funcióncount().

count(array )

Ejemplo 3.2.5. La función count() nos dice cuantos elementos contiene un array.

<?php $frutas = array("melón", "sandía", "naranja");echo "La lista contiene " . count($frutas) . " frutas.";?>

Ejemplo 3.2.6. Recorriendo un array para mostrarlo por pantalla.

<?php $frutas = array("melón", "sandía", "naranja");for ($i = 0; $i <count($frutas); $i++) {

echo "Elemento $i: $frutas[$i]<br>";}?>

Programación en PHP

Plataforma de Teleformación de IFES Página 55 de 143

Page 56: ProgramacionenPHP

Ejemplo 3.2.7. Recorriendo un array para modificar todos sus elementos. Aquí se usandos arrays que están relacionados por sus posiciones.

<?php$nombres = array(Juan, Inés, Andrea, Roberto); $edades = array(33, 28, 45,52);for ($i = 0; $i < count($edades); $i++) {

echo "$nombres[$i] tiene $edades[$i] años.<br>";}echo "<br>";for ($i = 0; $i < count($edades); $i++) {

$edades[$i]++;}echo "Ha pasado un año...<br>";for ($i = 0; $i < count($edades); $i++) {

echo "$nombres[$i] tiene $edades[$i] años. <br>";}?>

Ejemplo 3.2.8. Recorriendo un array para buscar un elemento. Se vuelve a hacer usode dos arrays relacionados por las posiciones de sus índices. En este código se da porsupuesto que se va a encontrar el valor buscado. No es seguro, fallaría sipreguntaramos por la edad de una persona cuyo nombre estuviera en el arraynombres.

<?php $nombres = array(Juan, Inés, Andrea, Roberto);$edades = array(33, 28, 45, 52);echo "¿Cuantos años tiene Andrea?<br>";for ($i = 0; $i < count($nombres); $i++) {

if ($nombres[$i] == "Andrea") {echo "$edades[$i] años"; }}?>

Ordenar un array

La función sort() ordena los elementos de un array. Si el array está formado porcadenas de texto considera menores las minúsculas que las mayúsculas.

sort(array )

Ejemplo 3.2.9. En esta ejemplo se ordena una lista de nombres, primero por elprocedimiento normal. Luego se muestra la forma de ordenar el mismo array sin hacerdistinción entre mayúsculas y minúsculas.

Programación en PHP

Página 56 de 143 Programación en PHP

Page 57: ProgramacionenPHP

<?php$astros = array("planeta", "cometa", "Venus", "Jupiter");

echo "Ordenación distinguiendo mayúsculas y minúsculas:<br>";sort($astros);

for ($i = 0; $i < count($astros); $i++) {echo "$astros[$i]<br>";

}

echo "<br>";

echo "Ordenación sin distinguir mayúsculas y minúsculas:<br>";$astros_minusculas = array_map("strtolower", $astros);array_multisort($astros_minusculas, SORT_ASC, SORT_STRING, $astros);

for ($i = 0; $i < count($astros); $i++) {echo "$astros[$i]<br>";

}?>

Arrays no secuenciales

Hasta ahora lo arrays que hemos visto tenían como índices la sucesión 0 (1er elemnto),1 (2o elemento), 2 (3er elemento) ...En PHP los índices de un array no tiene por quéser consecutivos, pueden incluso estar desordenados.

El índice de los arrays asociativos no tiene por qué ser necesariamente un entero,puede ser también un numero decimal o una cadena. Este tipo de arrays es más difícilde usar y aunque permite una mayor flexibilidad pueden ser fuente de muchos erroresdifíciles de detectar si no se usan con cuidado.

Arrays asociativos

Estos son un caso específico de arrays no secuenciales en los que el índice es unacadena de texto. Pueden resultar útiles para guardar listas en las cuales se asocia un

Programación en PHP

Plataforma de Teleformación de IFES Página 57 de 143

Page 58: ProgramacionenPHP

valor a una palabra clave.

La creación de este tipo de arrays se puede hacer de dos formas. La primera esmediante la función array() de forma parecida a como lo hacíamos antes, solo queahora deberemos especificar un valor para el índice.

Ejemplo 3.2.10. Cuando se declaran explícitamente los índices se escribe el valor delindice seguido por "=>" y el valor del elemento que contiene.

<?php$capitales = array("Italia" => "Roma",

"Francia" => "Paris","Portugal" => "Lisboa");

echo "La capital de Francia es {$capitales["Francia"]}";?>

Como se puede observar en el ejemplo, si queremos hacer referencia a un elemento deun array indexado por una cadena dentro de un texto entre comillas lo tendremos queencerrar entre llaves "{ }". Si no nos dará un error al interpretar la comilla de aperturadel índice del array como la comilla final de la cedena.

Ejemplo 3.2.11. En la siguiente sentencia PHP considera como texto la parte en verdey como código la parte en rojo. Como no puede entender la palabra Francia dará unerror.

<?phpecho "La capital de Francia es $capitales["Francia"]";?>

La segunda forma de crear un array asociativo es añadiendo elementos al array yasignándoles de forma explícita cual es su índice.

Ejemplo 3.2.12. Veamos esta segunda forma de inicializar arrays declarandoexplícitamente sus índices.

<?php $alturas["Aneto"] = 3404;$alturas["Teide"] = 3718;

Programación en PHP

Página 58 de 143 Programación en PHP

Page 59: ProgramacionenPHP

$alturas["Mulhacen"] = 3748;echo "El Aneto mide {$alturas["Aneto"]} metros";?>

Hay que tener cuidado con este sistema de creación pues se usa indistintamente paracrear un elemento y para acceder a su valor.

Ejemplo 3.2.13. En este ejemplo primero se relaciona un array con otro a través deíndices de tipo cadena. Los valores del primer array sirven a su vez como índices delsegundo.

<?php$nombres = array("Eva", "Antonio", "Felipe", "Rosa");$edades = array("Eva" => 28,

"Antonio" => 43,"Felipe" => 32,"Rosa" => 55);

for ($i = 0; $i < count($nombres); $i++) {echo "$nombres[$i] tiene {$edades[$nombres[$i]]} años.<br>";

}?>

Aún así, al igual que ocurría con los arrays no secuenciales, su uso no esrecomendable si no se tiene dominio sobre el lenguaje de programación PHP.

Arrays no homogéneos.

Como estamos viendo PHP establece muy pocas limitaciones a las estructuras de losarrays. Aunque hasta el momento todos los arrays que hemos visto los hemos usadopara manipular datos del mismo tipo (arrays de enteros, arrays de cadenas...) esta esuna restricción que no era necesaria.

PHP permite mezclar en los elementos de los array valores de diferentes tipos. Inclusopermite que los índices de los elementos de un mismo array sean de diferentes tipos.

Programación en PHP

Plataforma de Teleformación de IFES Página 59 de 143

Page 60: ProgramacionenPHP

Pero una vez más esta es una estrategia peligrosa a seguir y a la que en la mayoría delos casos no será necesario recurrir.

Arrays multidimensionales

El contenido de un elemento de un array puede, a su vez, ser un array. De esta formase pueden construir arrays multidimensionales.

Ejemplo 3.2.14. Aquí se muestra como almacenar una matriz (array de dosdimensiones) que contiene una sopa de letras generada aleatoriamente (la funciónchr() devuelve un caracter dado su número ascii).

<font ><?phpDEFINE(ALTO,10);DEFINE(ANCHO,20);$sopa_letras = array();

for ($i = 0; $i < ALTO; $i++) {for ($j = 0; $j <ANCHO; $j++) {

$sopa_letras[$i][$j] = chr(rand(65, 90));}

}

echo "SOPA DE LETRAS<br>";echo "<br>";for ($i = 0; $i < ALTO; $i++) {

for ($j = 0; $j <ANCHO; $j++) {echo $sopa_letras[$i][$j];

}echo "<br>";

}?></font>

Mostrar el contenido de un array

Ejemplo 3.2.15. PHP dispone de la función print_r() a la que se le pasa comoargumento un array y imprime por pantalla su contenido. Para poderlo ver bien se usala etiqueta HTML <pre>... </pre> que sirve para mostrar el texto y los saltos de líneacomo tal cual.

Programación en PHP

Página 60 de 143 Programación en PHP

Page 61: ProgramacionenPHP

<pre><?php$edades = array("Eva" => 28,

"Antonio" => 43,"Felipe" => 32,"Rosa" => 55);

print_r($edades);?></pre>

Desbordamiento de arrays

Si se intenta acceder a un elemento que no existe en un array PHP nos devolvera lacadena vacía (""). Esta es una causa de error muy habitual, sobre todo si luego vamosa hacer operaciones con ese dato.

Ejemplo 3.2.16. Aquí se accede al quinto elemento del array, que no existe.

<?php $formas = array("triángulo", "cuadrado", "círculo");echo $formas[4];?>

U.D.3. Funciones

PHP es un lenguaje estructurado y como tal dispone de funciones. Las funciones noson más que fragmentos de código (programitas) a los que se puede llamar desdecualquier parte del código. Gracias a esto permiten:

• Reutilizar código que se usa frecuentemente.• Estructurar lógicamente el código para que sea más comprensible.• Separar el código en diferentes ficheros para poder compartirlo en diferentes

Programación en PHP

Plataforma de Teleformación de IFES Página 61 de 143

Page 62: ProgramacionenPHP

páginas PHP.

Funciones definidas por el usuario

Declaración de una función

Antes de poder utilizar una función ésta ha de ser escrita. Por lo tanto el lugar en el quese suelen situar las funciones es al comienzo del archivo, de tal forma que esténdisponibles a partir de ese momento. Situarlas al comienzo también ayuda a unaestructuración del código más lógica.

Las funciones se declaran, como las variables, con un nombre , precedido de la palabrafunction , unos paréntesis (para albergar los datos de entrada, llamados argumentos oparámetros) y unas llaves que incluyen el cuerpo de la función. Dentro del cuerpo de lafunción podemos declarar variables, llamadas a otras funciones y demás sentencias.

function nombre_funcion (arg1, arg2, arg3, ...) {bloque de códigoreturn valor ; //Opcional

}

Llamada a una función

Para utilizar una función se escribe su nombre, seguido de paréntesis y dentro de estosse escriben los datos que se quieren pasar a la función (o variables que contienendichos datos).

nombre_funcion (arg1, arg2, arg3, ...);

Si la función devuelve un dato este se puede asignar a una variable o usardirectamente como parte de una expresión.Ejemplo 3.3.1. A continuación se muestra una función muy sencilla, que no tieneargumentos.

<?phpfunction hola_mundo() {echo "¡Hola Mundo!";

}hola_mundo();?>

Programación en PHP

Página 62 de 143 Programación en PHP

Page 63: ProgramacionenPHP

Devolución de un valor

Las funciones son mucho más útiles si pueden devolver un dato. Para ello usan lasentencia return . Una vez que se llega a esta instrucción no se ejecuta el código quese pueda encontrar a continuación.

Ejemplo 3.3.2. La siguiente función devuelve aleatoriamente un día de la semana.

<?phpfunction dia_semana() {

$semana = array("lunes", "martes", "miércoles", "jueves","viernes", "sabado", "domingo");

$dia = $semana[rand(0, 6)];return $dia;

}

$dia_cine = dia_semana();echo "El próximo $dia_cine voy al cine.";?>

Argumentos

Aún así, estas funciones que hemos visto son muy sencillas y no permiten hacergrandes cosas. Lo más habitual es que a las funciones se les pasen datos, queluego operen con estos y que al terminar la función devuelva el resultado. A los datosque recibe una función se les llama argumentos o parámetros.

En la declaración de la función, tras la palabra clave function , va el nombre de lafunción seguido por una lista de argumentos entre paréntesis y separados por comas.Dentro del cuerpo de la función estos datos se pueden utilizar como una variablecualquiera.

Ejemplo 3.3.3. Función sencilla que recibe un parámetro y devuelve un resultado.Luego es llamada dentro de un bucle para mostrar el cuadrado de los números de 1 a10;

<?phpfunction cuadrado($numero) {

return $numero * $numero;}for ($i = 1; $i <= 10; $i++) {echo "$i al cuadrado es igual a " . cuadrado($i) . ".<br>";

}?>

Programación en PHP

Plataforma de Teleformación de IFES Página 63 de 143

Page 64: ProgramacionenPHP

Paso de argumentos por valor

Cuando se pasan valores a las funciones hay varias formas de pasarlos. Elcomportamiento predefinido es lo que se conoce como paso por valor. Esto quiere decirque la variable que recibe el valor hace una copia del mismo y a partir de ese momentoactúa como una variable independiente de manera que si cambias el valor delargumento dentro de la función, no se ve modificado fuera de ella.

Paso de argumentos por referencia

En ocasiones es preferible no hacer la copia del dato que se pasa. Esto puedeinteresar cuando se trabaje con arrays (el copiado de muchos datos puede perjudicar eltiempo de ejecución del programa) o más comunmente cuando se quiere alterar elvalor de la variable para obtener algún efecto. A esto se le llama paso de parámetrospor referencia. Para indicar que un parámetro se pasa por referencia se le antepone elsímbolo ampersand, "&".

Una función puede emplear argumentos pasados por valor y por referencia.

Ejemplo 3.3.4. Comparación entre el paso por valor y por referencia.

<?phpfunction duplicar_por_valor($argumento) {

$argumento = $argumento * 2;echo "Dentro de la función vale $argumento.<br>";

}

function duplicar_por_referencia(&$argumento) {$argumento = $argumento * 2;echo "Dentro de la función vale $argumento.<br>";

}

$numero1 = 5;echo "Antes de llamar a la función vale $numero1.<br>";duplicar_por_valor($numero1);echo "Después de llamar a la función vale $numero1.<br>";

echo "<br>";

$numero2 = 7;echo "Antes de llamar a la función vale $numero2.<br>";duplicar_por_referencia($numero2);echo "Después de llamar a la función vale $numero2.<br>";?>

Programación en PHP

Página 64 de 143 Programación en PHP

Page 65: ProgramacionenPHP

Ejemplo 3.3.5. No se puede hacer que una función devuelva dos valores. Pero en sulugar es posible pasar por referencia las variables a devolver y modificar su contenidoen el cuerpo de la función. Aquí se emplea esta estratagema para intercambiar elcontenido de dos variables.

<?phpfunction intercambiar(&$argumento1, &$argumento2) {

$auxiliar = $argumento1;$argumento1 = $argumento2;$argumento2 = $auxiliar;

}

$numero1 = 5;$numero2 = 8;echo "($numero1, $numero2)<br>";

intercambiar($numero1, $numero2);echo "($numero1, $numero2)"?>

Alcance de las variables

Dentro de las funciones también podemos declarar nuevas variables, pero, ¿que pasasi hay una variable dentro de una función que se llama igual que una variable que seencuetra fuera de la función? La respuesta es que la variable de dentro de la función esdiferente de la que está fuera y por lo tanto su valor es independiente.

A esto se le llama alcance de una variable. Las variables que se declaran dentro deuna función solo existen en el cuerpo de la función.

Ejemplo 3.3.6. Este código muestra el alcance de una variable dentro de una función.No hay que confundir este ejemplo con el ejemplo 3.3.4. En este caso no hay ningúnargumento.

<?phpfunction mi_ciudad() {

$ciudad = "Madrid";echo "Dentro de la función vale $ciudad.<br>";

}

$ciudad = "Barcelona";echo "Antes de llamar a la función vale $ciudad.<br>";

mi_ciudad();

Programación en PHP

Plataforma de Teleformación de IFES Página 65 de 143

Page 66: ProgramacionenPHP

echo "Después de llamar a la función vale $ciudad.<br>"?>

Ejemplo 3.3.7. Puede darse el caso de que queramos acceder a una variable globaldentro del cuerpo de la función. Para conseguirlo le antepondremos la palabra claveglobal a la primera referncia de la variable, con lo que el interprete PHP sabe queestamos llamando a la variable externa.

<?phpfunction mi_ciudad() {

global $ciudad;$ciudad = "Madrid";echo "Dentro de la función vale $ciudad.<br>";}

$ciudad = "Barcelona";echo "Antes de llamar a la función vale $ciudad.<br>";mi_ciudad();echo "Después de llamar a la función vale $ciudad.<br>" ?>

No obstante es altamente recomendable usar en las funciones nombres de variablesdiferentes a los de las variables del programa principal para evitar confusiones.Tampoco es conveniente usar variables globales dentro de las funciones. Siempre quese pueda es mejor pasar estas variables como parámetro, mejora notablemente lafiabilidad y claridad del código.

Creación de bibliotecas

Para conseguir un código lo más claro posible es deseable que este sea breve. Unaforma de conseguirlo es extraer las funciones que se declaran a unarchivo independiente con extensión .php . Una ventaja de esta estrategia es que sepueden hacer accesibles estas funciones a más de una página en PHP.

Ejemplo 3.3.8. Una biblioteca de funciones guardada en el archivo utils.php . Se haoptado por poner un breve comentario antes de cada función explicando su cometidopara contribuir a la legibilidad y mantenibilidad del código.

<?php// Biblioteca de funciones de usuario// Archivo utils.php

// Devuelve el argumento elevado al cuadradofunction cuadrado($numero) {

Programación en PHP

Página 66 de 143 Programación en PHP

Page 67: ProgramacionenPHP

return $numero * $numero;}// Devuelve la raíz cuadrada del argumentofunction raiz($numero) {

return sqrt($numero);}// Devuelve verdadero si el número es igual o mayor que cerofunction es_positivo($numero) {

return ($numero >= 0);}?>

Ejemplo 3.3.9. En los ficheros de biblioteca se puede incluir cualquier tipo de código.También se pueden poner archivos de configuración, de constantes predefinidas, etc.En este caso se guarda en el archivo config.php.

<?php// Fichero de configuración// Archivo config.php

DEFINE(PI, 3.1416);DEFINE(NUMERO_E, 2.7183);DEFINE(EULER, 0.5772);?>

Las instrucciónes include() y require()

Para tener disponibles las funciones de un fichero externo hay que indicarle al códigoPHP que las ha de incorporar al script actual. Mediante estas instrucciones se incluyeun fichero en el punto en el que se importa. La diferencia es que require() lanza unerror fatal en el caso de no encontrar el fichero mientras que include() no lo hace.

Ejempo 3.3.10. La inclusión de bibliotecas se suele poner al principio para que esténdisponibles en el resto del código.

<?phpinclude("config.php");include("utils.php");$radio = 5;

$circunferencia = 2 * radio * PI;$area = PI * cuadrado($radio);echo "Un círculo de rádio $radio tiene circunferencia ";echo "$circunferencia y área $area.<br>";$area = -8;if (es_positivo($area)) {

$radio = raiz(area / PI);

Programación en PHP

Plataforma de Teleformación de IFES Página 67 de 143

Page 68: ProgramacionenPHP

echo "Un círculo de área $area tiene un rádio $radio";} else {

echo "No se puede calcular, área negativa.";}?>

Hay que tener en cuenta el orden en el que se cargan los archivos externos, sobre todosi unos hacen uso de código de otros.

Otros tipos de funciones

Hasta ahora hemos visto las funciones que nosotros definimos. Pero a lo largo demuchos ejemplos hemos ido usando funciones como rand() o number_format() que yaestaban disponibles en el lenguaje. Estas son funciones del núcleo de PHP y por lotanto no hace falta hacer un include() para poder usarlas.

Extensiones de PHP

Las funciones que incorpora de forma predefinida PHP están agrupadas enextensiones.

Ejemplo 3.3.11. Para saber que extensiones están instaladas en nuestro interprete dePHP tenemos una opción muy útil, la función phpinfo() que genera una página con lainformación del intérprete que tenemos instalado.

<?phpphpinfo();?>

Debe aparecernos una pantalla similar a la siguiente:

Programación en PHP

Página 68 de 143 Programación en PHP

Page 69: ProgramacionenPHP

Referencia sobre funciones

Toda la referencia sobre funciones se puede encontrar en la página oficial sobre PHP:

http://es.php.net/manual/es/funcref.php

Hay una gran multitud de funciones en PHP de las cuales probablemente usaremos

Programación en PHP

Plataforma de Teleformación de IFES Página 69 de 143

Page 70: ProgramacionenPHP

unas pocas. Las extensiones más útiles son:

• Funciones matemáticas - http://es.php.net/manual/es/ref.math.php• Funciones de cadenas - http://es.php.net/manual/es/ref.strings.php• Funciones de mysql - http://es.php.net/manual/es/ref.mysql.php• Funciones de fecha y hora - http://es.php.net/manual/es/ref.datetime.php

La página dispone también de un buscador que resulta bastante útil.

U.D.4. Formularios

Hasta este momento todas las páginas que hemos visto a través de ejemplos tenían undefecto, no eran interactivas. Hacían operaciones en función de los datos de los que yadisponían pero eran incapaces de recibir datos del navegador.

Una de las formas más habituales de recibir datos por parte de una página webdinámica es a través de formularios web. Estrictamente hablando los formularios noson parte del lenguaje PHP sino del lenguaje HTML. Pero para recibir los datos de unformulario en HTML hace falta por lo general una página dinámica que los procese.

Hay que tener en cuenta que además de formularios HTML hay otras tecnologías quepermiten el envío de datos a páginas web, com Flash u otras páginas web dinámicas.

Formularios HTML

Los formularios pueden llegar a ser muy complejos, con una gran cantidad de camposde entrada, validación de datos por Javascript, campos ocultos... Pero el objetivo delcurso no es explicar su funcionamiento, así que se hará un repaso muy superficial.

Un formulario está formado por tres tipos de elementos: Etiquetas de comienzo y final,campos de entrada de datos y botones para realizar acciones.

Declaración del formulario

Un formulario se distingue por estar encuadrado entre una etiqueta de comienzo deformulario <form ...> y una de final de formulario </form>. La etiqueta de comienzo deformulario ha de tener al menos tres atributos.

• name - No es obligatorio pero si muy recomendable darle un nombre alformulario para que sea fácil de identificar.

• method - Este parámetro puede tomar dos valores según la forma de enviarlos datos:

• • get - Los datos se envían codificados en la URL (dirección de lapágina destino).

Programación en PHP

Página 70 de 143 Programación en PHP

Page 71: ProgramacionenPHP

• post - Los datos se envían ocultos.• action - Indica la página destino que se encargara de procesar los datos que

envía el formulario.

<form name="formulario" method="get" action="procesar.php">Campos de entrada de datosBotones de acciones

</form>

Campos

Una vez declarado el formulario hemos de poner un campo para cada uno de los datosque queremos recibir. Hay 6 tipos de campos:

• Texto - Se usa para recibir una línea de texto.

<input type="text" name="nombre">

• Selección única - Se usa para elegir una opción entre varias. Las opcionesque son excluyentes entre sí han de tener el mismo nombre.

<input type="radio" name="sexo" value="hombre"><input type="radio" name="sexo" value="mujer">

• Selección múltiple - Se usa para elegir opciones de forma independiente.Esto es, se pueden elegir todas, algunas o ninguna.

<input type="checkbox" name="cine"><input type="checkbox" name="musica"><input type="checkbox" name="lectura"><br>

• Lista de selección - Es un sistema alternativo al campo de selecciónúnica para elegir una opción entre varias, esta vez con formato de listadesplegable.

<select name="sexo"><option>hombre</option><option>mujer</option>

</select>

Programación en PHP

Plataforma de Teleformación de IFES Página 71 de 143

Page 72: ProgramacionenPHP

• Área de texto - Sirve para poder recibir textos largos compuestos por variaslíneas.

<textarea name="opinion"></textarea>

• Campo oculto - En ocasiones queremos pasar un dato a la página PHP queprocesará el formulario pero no queremos que esté se muestre en un campovisible. Puede ser útil para pasar información entre páginas PHPindependientes.

<input type="hidden" name="referencia">

En todos ellos es importante poner el atributo name que es el nombre de variable conel cual vamos a recibir los datos. El atributo value es opcional e indica el valorpredefinido que se les da.

Botones

Todos los formularios han de tener un botón para enviar los datos una vez que se hanrellenado.

<input type="submit" name="Enviar">

También se suele incluir un botón para limpiar los campos del formulario.

<input type="reset" name="Borrar todo">

Ejemplo 3.4.1. A continuación se muestra un formulario formado por algunos de lostipos de campo descritos con anterioridad y se guarda en un archivo llamadoencuesta.html .

<html><head>

<title></title></head><body><form name="encuesta" method="get" action="verificar.php">

NOMBRE <input type="text" name="nombre" size="43"><br><br>

NIVEL DE INTERNET<br>

Programación en PHP

Página 72 de 143 Programación en PHP

Page 73: ProgramacionenPHP

bajo <input type="radio" name="nivel" value="bajo" checked>medio <input type="radio" name="nivel" value="medio">alto <input type="radio" name="nivel" value="alto"><br>

<br>EXPERIENCIA PREVIA EN PROGRAMACIÓN<br>

Visual Basic <input type="checkbox" name="basic">C/C++ <input type="checkbox" name="c_cplus">Java <input type="checkbox" name="java"><br>

<br>TU OPINIÓN SOBRE ESTE CURSO<br>

<textarea name="opinion" cols="40" rows="5"></textarea><br><br><input type="submit" value="Enviar"><input type="reset" value="Borrar todo">

</form></body></html>

Deberíamos ver un formulario similar a este:

Programación en PHP

Plataforma de Teleformación de IFES Página 73 de 143

Page 74: ProgramacionenPHP

Recepción de datos de formularios

Recibir los datos no puede ser más sencillo. El script de destino tendrá definida unvariable por cada campo con el mismo nombre que se le haya dado en el formulario. Yesta variable contendrá el valor que se haya introducido en el campo. Esta variable yaestá disponible desde el comienzo del script, no hay que hacer nada especial, sólo leersu contenido.

Ejemplo 3.4.2. Esta página PHP recibe los datos de la encuesta y los muestra. Paraque funcione hay que guardarla con el nombre verificar.php , que es el que aparecía enel atributo action del formulario.

<?phpecho "Comprueba si tus datos son correctos.<br>";echo "<br>";

echo "$nombre.<br>";echo "Nivel de internet $nivel.<br>";

Programación en PHP

Página 74 de 143 Programación en PHP

Page 75: ProgramacionenPHP

if (($basic == "on") || ($c_cplus == "on") || ($java == "on")) {echo "Con experiencia en ";if ($basic == "on") {

echo "Visual Basic";if ($c_cplus == "on") {

echo ", C/C++";}if ($java == "on") {

echo ", Java";}

} else if ($c_cplus == "on"){echo "C/C++";if ($java == "on") {

echo ", Java";}

} else {if ($java == "on") {

echo "Java";}

}echo ".<br>";

} else {echo "Sin experiencia previa en programación.<br>";

}echo "<br>";echo "OPINIÓN SOBRE EL CURSO:<br>";echo nl2br($opinion); //convierte saltos de línea en <br>?>

Ejemplo 3.4.3. Los parametros que nos han llegado se encuentran almacenados en unarray asociativo con nombre de variable $_REQUEST. Podemos ver su contenidousando la función print_r() que se vió en la unidad didáctica anterior. Esto nos ofreceotra forma de acceder a los datos recibidos, que es más explícita y por lo tanto hace elcódigo más legible.

<pre><?phpprint_r($_REQUEST);?></pre>

Ejemplo 3.4.4. El ejemplo 3.4.3. Podría haber sido escrito también de la siguienteforma (se muestran sólo las primeras líneas, un buen ejercicio sería completarlas).

Programación en PHP

Plataforma de Teleformación de IFES Página 75 de 143

Page 76: ProgramacionenPHP

<?phpecho "Comprueba si tus datos son correctos.<br>";echo "<br>";

echo "{$_REQUEST["nombre"]}.<br>";echo "Nivel de internet {$_REQUEST["nivel"]}.<br>";//...?>

Páginas que envían, reciben y procesan datos

Ejemplo 3.4.5. Esta página web une el formulario de entrada de datos y la recepciónde los mismos. El atributo action de la etiqueta form ha de ser el mismo que el nombrede la página. Para ello usamos la variable predefinida $PHP_SELF que contiene elnombre de archivo de la misma página. Podemos guardar este archivo con el nombrejuegoppt.php.

<?php$opciones = array("piedra", "papel", "tijeras");if ($jugada != "") {

$mijugada = $opciones[rand(0, 2)];

if ($jugada == $mijugada) {$resultado = "Empates.";

} else if (($jugada == "piedra" && $mijugada == "tijeras")|| ($jugada == "tijeras" && $mijugada == "papel")|| ($jugada == "papel" && $mijugada == "piedra")) {

$resultado = "Tu ganas.";} else {

$resultado = "Gano yo.";}

}?><html><head>

<title>Piedra, papel o tijera</title></head><body><?phpif ($jugada != "") {

?>Has elegido <?= $jugada ?>, yo he elegido <?= $mijugada ?>.<?= $resultado ?><br>¿Quieres jugar otra vez?<br>

Programación en PHP

Página 76 de 143 Programación en PHP

Page 77: ProgramacionenPHP

<?php}?><form "juego" method="post" action="<?= $PHP_SELF ?>">

Piedra<input type="radio" name="jugada" value="piedra">Papel<input type="radio" name="jugada" value="papel">Tijera<input type="radio" name="jugada" value="tijeras"><input type="submit" value="Jugar">

</form></body></head>

El código que se incluye al principio solo se ejecuta si el dato $jugada no llega vació, esdecir, cuando se le ha dado al menos una vez al botón de enviar.

Redirección de páginas web

En ocasiones se necesita que un programa PHP reciba datos y haga una operación"silenciosa" con los mismos. Es decir, que no sea necesario que se muestre una páginaal navegador sino que se vuelva a la inicial. Esto se puede hacer con un formulario queenvía recibe y procesa datos.

Una alternativa es hacer una página que procese los datos y que al terminar se redirijaautomáticamente a otra. Para poder hacerlo PHP nos ofrece la función header(), quese usa de la siguiente forma.

header("location:url ")

La dirección de destino url puede ser una ruta absoluta o relativa.

Es imprescindible que la página no contenga al principio código HTML. También hayque tener en cuenta que una vez que se llega a la función header no se sigueejecutando el resto de la página, por lo que las operaciones que queramos hacer lashabremos de ejecutar antes.

Ejemplo 3.4.6. Este es un ejemplo típico de recepción de datos. En primer lugar seincluye una sencilla página web con un formulario que pide el nombre y uncomentario para almacenarlo en un registro de visitas. En el script insertar.php sealmacena en la base de datos y se redirecciona a una página para dar las gracias.

• visita.html

Programación en PHP

Plataforma de Teleformación de IFES Página 77 de 143

Page 78: ProgramacionenPHP

<html><head> <title>Libro de visitas</title></head><body><form name="visita" method="post" action="insertar.php">

Nombre: <input type="text" name="nombre" size="44"><br>Comentario:<br><textarea name="comentario" cols="40" rows="5"></textarea><br><input type="submit" value="Enviar">

</form></body></html>

• insertar.php

<?php// Aquí vendría el código para guardar en la base dedatosheader("location:gracias.html"); //Redirección?>

• gracias.html

<html><head> <title>Gracias</title></head><body>Su comentario ha sido registrado en el libro de visitas.<br>Gracias por su participación.</body></html>

Ejemplo 3.4.7. Un uso habitual de la redirección es para redirigir hacia una página deerror en el caso de que haya fallos en los datos. En este ejemplo se pide una direcciónde correo electrónico, se valida y si es incorrecta se reenvía a una página de error.

• suscripcion.html

<html><head> <title>Suscripción al boletín electrónico</title></head><body>Bienvenido al servicio de suscripción.<br>Por favor, introduzca una dirección de email válida.<br><form

Programación en PHP

Página 78 de 143 Programación en PHP

Page 79: ProgramacionenPHP

name="suscripcion" method="post" action="guardar.php">Email: <input type="text" name="email" size="40"><br><input type="submit" value="Enviar">

</form></body></html>

• guardar.php

<?php//Indica la posición del caracter "@" o FALSE si no está$posicion_arroba = strpos($email, "@");

//Busca la aparición de un punto (.) a partir de la arroba$posicion_punto = strpos($email, ".", $posicion_arroba);

if ($posicion_arroba && $posicion_punto) {// Aquí vendría el código para guardar en la base de datosheader("location:confirmacion.html"); //Redirección

} else {// Aquí vendría el código para guardar en la base de datosheader("location:error.html"); //Redirección

}?>

• confirmacion.html

<html><head> <title>Confirmacion</title></head><body>Su suscripción ha sido registrada.</br>Gracias por su interés.</body></html>

• error.html

<html><head> <title>Error</title></head><body>Introdujo una dirección de correo no válida.<br>Por favor vuelva a solicitar la suscripción.

Programación en PHP

Plataforma de Teleformación de IFES Página 79 de 143

Page 80: ProgramacionenPHP

<a href="suscripcion.html"> Volver </a></body></html>

U.D.5. Manejo de ficheros

Mediante los formularios hemos conseguido aportar interactividad a nuestra páginasweb. Pero otra de las limitaciones fundamentales de lo que podemos hacer con lo quesabemos hasta el momento es que una vez que se cierra una página web los datos quecontiene se pierden.

En el próximo módulo veremos como guardar la información en una base de datos.Esto es útil para grandes cantidades de información muy estructurada pero hay casosen los que la información que queremos guardar es pequeña. En esta unidad didácticaveremos como podemos usar PHP para acceder al sistema de archivos del servidorpara poder leer o guardar datos.

Manejo de ficheros

Abrir

Para acceder a un archivo primero es necesario abrirlo. Para ello usaremos la funciónfopen() que tiene dos argumentos, el nombre del archivo a acceder y el modo deacceder a este.

fopen(ruta al archivo, modo de acceso )

PHP ofrece los siguientes modos de acceso:

Modo Descripción

r Apertura para sólo lectura;ubica el apuntador de archivoal comienzo del mismo.

r+ Apertura para lectura yescritura; ubica el apuntadorde archivo al comienzo delmismo.

a Apertura para sólo escritura;ubica el apuntador de archivo

Programación en PHP

Página 80 de 143 Programación en PHP

Page 81: ProgramacionenPHP

al final del mismo. Si elarchivo no existe, intentacrearlo.

a+ Apertura para lectura yescritura; ubica el apuntadorde archivo al final del mismo.Si el archivo no existe,intenta crearlo.

w Apertura para sólo escritura.Cualquier contenido delarchivo será borrado. Si elarchivo no existe, intentacrearlo.

w+ Apertura para lectura yescritura.Cualquier contenidodel archivo será borrado. Siel archivo no existe, intentacrearlo.

El apuntador es la posición del archivo en la que leemos o escribimos. Como podemosver lo más habitual es que lo situemos al principio para leer todo su contenido o al finalpara ir añadiendo datos.

La función devuelve un manejador que usaremos posteriormente para manipular elarchivo (y que guardaremos en una variable), o devuelve FALSE si no ha podidoacceder por alguna causa (permisos, ruta, memoria,etc.).

Cerrar

Mientras hacemos operaciones con el archivo este lo hemos de mantener abierto peroal terminar de trabajar con él hay que cerrarlo para que el sistema operativo puedadisponer de él (mientras está abierto el sistema operativo lo bloquea para que nopuedan escribir en él dos programas y destruir mutuamente lo que escriben).

Para cerrar un archivo abierto se usa la función fclose() pasándole como parámetro lavariable que contiene el manejador del archivo.

fclose(archivo )

Ejemplo 3.5.1. En este código se abre un fichero en modo de lectura. En función de sise ha conseguido se muestra un mensaje de confirmación o de error. Finalmente elarchivo se cierra.

Programación en PHP

Plataforma de Teleformación de IFES Página 81 de 143

Page 82: ProgramacionenPHP

<?php$ruta = "utils.php";$archivo = fopen($ruta, "r");if ($archivo) {

print "Archivo $ruta abierto para lectura.";} else {

print "No se pudo abrir el archivo: $ruta.";}fclose($archivo);?>

Ejemplo 3.5.2. El fichero que abrimos lo podemos localizar mediante una ruta absolutao relativa. Aunque en Windows las rutas se construyan usando la contrabarra " \ " PHPadmite que se separen los directorios con la barra normal " / " como en Linux. Esta esla forma que elegiremos ya que las rutas relativas que contruyamos de esta formaserán válidas tanto si instalamos nuestra aplicación en Linux como en Windows.

<?php$ruta_absoluta = "c:/CursoPHP/xampplite/htdocs/index.php";$ruta_relativa = "../practicasPHP/config.php";$archivo1 = fopen($ruta_absoluta, "r");$archivo2 = fopen($ruta_relativa, "r");fclose($archivo1);fclose($archivo2);?>

Ejemplo 3.5.3. Es incluso posible abrir archivos que estén alojados en otros servidores,aunque lo más habitual es que solo tengamos permisos de lectura.

<?php$url = "http://www.google.es/index.html ";$archivo = fopen($url, "r");fclose($archivo);?>

Leer

Lo más habitual es que queramos leer el archivo. PHP ofrece muchas formas dehacerlo. Una de las más sencillas es mediante la función fread() que lee un número decaracteres de un archivo. En conjunción con la función filesize() que nos devuelve eltamaño del archivo en bytes se puede usar para leer todo el archivo.

fread(archivo, tamaño )

Programación en PHP

Página 82 de 143 Programación en PHP

Page 83: ProgramacionenPHP

Ejemplo 3.5.4. Lectura del archivo prueba.txt . Para que el archivo funcione tendremosque haberlo creado antes y copiado en la misma carpeta que este script.

<pre><?php$archivo = fopen("prueba.txt", "r");$tamano = filesize("prueba.txt");$texto = fread($archivo, $tamano);echo $texto;fclose($archivo);?></pre>

Escribir

Otra acción que querremos hacer habitualmente es añadir datos a un archivo. Para ellose usa una función muy sencilla, fwrite() que escribe en la posición en la que está elapuntador (normalmente, si hemos abierto el archivo en modo "a" escribiremos al finaldel archivo).

La función fwrite() usa dos parámetros. El primero el manejador del archivo y elsegundo la cadena que queremos escribir.

fwrite(archivo, cadena de texto )

Ejemplo 3.5.5. En este ejemplo se usa esta función dos veces para escribir dosfrases en el archivo.

<?php$archivo = fopen("refranes.txt", "a");fwrite($archivo, "Si las barbas de tuvecino ves cortar ...\r\n");fwrite($archivo, "...pon las tuyas a remojar \r\n");fclose($archivo);?>

La cadena " \r\n " sirve para insertar un salto de línea en el archivo en el sistemaoperativo Windows. En Linux se usa solo la cadena " \n ".

Si lo que queremos es sobreescribirlo abriremos el archivo en modo "w", de tal formaque se borre el contenido al abrirlo y dispondremos de un fichero vacío.

Crear un fichero

Si queremos crear un archivo bastará que lo abramos con el modo "a" o "w". Al abrirlo,

Programación en PHP

Plataforma de Teleformación de IFES Página 83 de 143

Page 84: ProgramacionenPHP

si el archivo no existe lo creará.

Eliminar un fichero

La función unlink() que recibe como parámetro una ruta a un fichero lo borra. En elcaso de que no lo haya conseguido (por no tener permisos o sencillamente porque noexiste el archivo) devuelve FALSE.

unlink(archivo )

Ejemplo 3.5.6. Este programa intenta borrar un archivo y en el caso de no conseguirlomuestra un mensaje de error.

<?phpif (!unlink("prueba.txt")) {echo "No se ha podido borrar el archivo.";

}?>

Atributos de un fichero

Para manejar de forma segura es conveniente que conozcamos sus atributos. Porejemplo, antes de abrir un archivo para escritura convendría comprobar si tenemospermisos de lectura. Las siguientes funciones nos ayudarán en esta tarea.

file_exists()

Devuelve TRUE si el archivo por el que preguntamos existe.

file_size()

Ya ha aparecido al hablar de la lectura de un archivo. Devuelve el tamaño en bytes delmismo.

is_file()

Devuelve TRUE si el archivo es un fichero.

is_dir()

Devuelve TRUE si el archivo es un directorio.

is_readable()

Programación en PHP

Página 84 de 143 Programación en PHP

Page 85: ProgramacionenPHP

Devuelve TRUE si el archivo se puede abrir para lectura.

is_writeable()

Devuelve TRUE si el archivo se puede abrir para escritura.

Ejemplo 3.5.7. Mediante este programa se muestran las propiedades del archivoprueba.txt.

<?php$ruta = "prueba.txt";if (file_exists($ruta)) {

echo "$ruta tiene un tamaño de ";echofilesize($ruta) . " bytes.<br>";if (is_file($ruta)) { echo "$ruta es un fichero.<br>";}if (is_dir($ruta)) {

echo "$ruta es un directorio.<br>";} if (is_readable($ruta)) {

echo "$ruta se puede abrir para lectura.<br>";}if (is_writable($ruta)) {

echo "$ruta se puede abrir para escritura.<br>";}} else {echo "$ruta no existe.";}?>

Manejo de directorios

PHP ofrece muchas funciones para manejar directorios, pero lo más probable es queen la mayoría de los casos lo único que nos interese de un directorio es conocer losarchivos que tiene. Una vez que conozcamos este dato podremos construir rutasrelativas a sus subdirectorios y a su vez listarlos y así de forma sucesiva.

Abrir un directorio

De forma similar a com sucedía con los archivos, antes de trabajar con un directorio lotendremos que abrir. Nos serviremos de la función opendir() que devuelve unmanejador del directorio.

opendir(ruta al directorio )

Listar los archivos de un directorio

Programación en PHP

Plataforma de Teleformación de IFES Página 85 de 143

Page 86: ProgramacionenPHP

Para conocer los ficheros y subdirectorios que contiene un directorio se usa la funciónreaddir() . Por cada vez que llamemos a esta función nos devolverá el nombre de cadaarchivo encontrado o FALSE si no quedan más archivos en el directorio.

readdir(directorio )

Ejemplo 3.5.8. Aquí se puede ver como listar todos los contenidos del directorio actual(referenciado mediante la ruta relativa " . ") indicando a su vez si son ficheros odirectorios.

<?php$directorio = opendir(".");while ($archivo = readdir($directorio)) {

if (is_file($archivo)) {echo "$archivo es un fichero.<br>";

}if (is_dir($archivo)) {

echo "$archivo es un directorio.<br>";}

}?>

Subir archivos al servidor

El envío de archivos desde el cliente, es una de las posibilidades más atractivas parauna aplicación web. Se subir de esta forma fotos, un curriculum, un documento PDF,etc..

Ejemplo 3.5.9. Se va a explicar como subir un archivo a través de un ejemplo. Enprimer luga necesitamos un formulario especial, que llamaremos subir.html .

• subir.html

<html><head>

<title>Elija el archivo a subir</title></head><body><form name="subir" method="post" action="guardar.php"

enctype="multipart/form-data">Archivo a subir <input type="file" name="miarchivo"><br><input type="submit" value="Subir el archivo">

Programación en PHP

Página 86 de 143 Programación en PHP

Page 87: ProgramacionenPHP

</form></body></html>

Además de este formulario necesitaremos una página dinámica en PHP que reciba elarchivo y lo guarde en el disco duro. Esto se hace en 3 pasos:

• El servidor guarda el archivo en un fichero temporal.• Movemos el archivo en la posición definitiva usando la función

move_uploaded_file(). Esto es imprescindible ya que pasado cierto tiempo elservidor web eliminará automáticamente el fichero temporal.

• Si la operación de mover el archivo falla mostramos un mensaje de error.

El código que se ha escrito en este caso, en el script guardar.php es:

• guardar.php

<?php$temporal = $_FILES["miarchivo"]["tmp_name"];$destino = "uploads/" . $_FILES["miarchivo"]["name"];if (move_uploaded_file($temporal, $destino)) {

echo "Archivo subido con éxito";} else {

echo "Ocurrió un error, no se ha podido subir el archivo";}?>

Hay que tener cuidado, en este script se supone que el directorio uploads ya existe. Sino es así la operación fallaría.

Programación en PHP

Plataforma de Teleformación de IFES Página 87 de 143

Page 88: ProgramacionenPHP

Módulo IV. PHP y las bases de datos

U.D.1. Estructura de una aplicación web con bases de datos

Según una definición muy acertada de Niklaus Wirth un programa está compuesto poralgoritmos y estructuras de datos.

En lo que llevamos de curso hemos estudiado a fondo la primera parte, los algoritmospara resolver problemas. Pero conocemos poco sobre la segunda parte, los datos.

Internet se basa principalmente en el tráfico de datos, no en vano se le llama laautopista de la información. Por lo tanto cualquier lenguaje de programación web quese precie estará orientado a recibir, procesar y enviar información.

Pero para hacerlo necesita un respaldo potente como almacen de información. Hastaahora el único mecanismo que hemos visto para guardar datos de forma permanentees escribir y leer en ficheros alojados en el servidor. Esto, para grandes cantidades deinformación es inviable. Es preferible delegar esta función a software especializado, lossistemas de gestión de bases de datos (o sencillamente, bases de datos).

Al añadir bases de datos a una aplicación web se amplía el esquema que interviene enla generación de una página web con un nuevo elemento.

Programación en PHP

Página 88 de 143 Programación en PHP

Page 89: ProgramacionenPHP

A esta disposición se la denomina arquitectura web de tres capas:

• Capa primera: cliente web (navegador).• Capa segunda: servidor web con interprete de PHP.• Capa tercera: sistema gestor de bases de datos.

El sistema gestor de bases de datos puede estar instalado en el mismo equipo que elservidor web o en uno diferente. En nuestro entorno (suponiendo que estemos usandoXampp), tenemos el servidor Apache y la base de datos MySQL en el mismoordenador.

PHP es el encargado de la comunicación entre la segunda y la tercera capa. Esto lopuede hacer de dos formas.

• Mediante el API específico de la base de datos.• Mediante ODBC, el estandar de comunicación con bases de datos.

Nosotros usaremos la primera forma ya que es más sencilla y eficiente.

U.D.2. ¿Qué es MySQL?

Programación en PHP

Plataforma de Teleformación de IFES Página 89 de 143

Page 90: ProgramacionenPHP

Bases de datos relacionales

El tipo de bases de datos más generalizado es el de las bases de datos relacionales.Es el modelo más adecuado para modelar problemas reales y resulta sencillo de usar yadministrar. El usuario se puede desentender de donde y como se almacenan losdatos. La información puede ser recuperada o almacenada mediante "consultas" queofrecen una amplia flexibilidad y poder para administrar la información.

Las bases de datos relacionales guardan la información en tablas formadas porregistros (las filas de la tabla) que están formados por campos (las columnas de untabla).

MySQL

MySQL es un producto desarrollado por la compañía MySQL AB. Es el sistema gestorde bases de datos más utilizado en las aplicaciones web de Internet. En sus comienzoscarecía de muchas funcionalidades habituales en este tipo de bases de datos comointegridad referencial o soporte para transacciones pero incluso conestos inconvenientes se volvió muy popular. La versión actual ha evolucionadonotablemente y es mucho más completa.

MySQL es una base de datos relacional y destaca por las siguientes características.

• Es sencilla de usar y administrar.• Es segura.• Es eficiente.• Es sofware libre y por lo tanto gratuita.• Soporta el lenguaje de consultas SQL.• Está disponible para casi todos los sitemas operativos.• Ofrece posibilidades avanzadas de administración• Su sencillez no es un inconveniente, la versión actual incluye muchas de las

características avanzadas que ofrecen otras bases de datos de pago.

MySQL es la pareja perfecta para las aplicaciones programadas en PHP.

U.D.3. El lenguaje SQL

¿Qué es SQL?

SQL es el acrónimo del término inglés Structured Query Language , lenguaje deconsultas estructurado. Es un lenguaje que se usa para comunicarnos con el sistema

Programación en PHP

Página 90 de 143 Programación en PHP

Page 91: ProgramacionenPHP

gestor de bases de datos. Es a la vez potente y sencillo a la hora de recuperarinformación de forma estructurada.

Trabajar con MySQL

El lenguaje de consultas SQL se va a explicar a través de ejemplos sobre MySQL. Unode los inconvenientes que tiene MySQL es que para administrar esta base de datos seha de hacer a través de una consola en modo texto (no tiene un interfaz en modográfico amigable). No obstante, con un poco de práctica encontraremos que la consolaes un medio rápido para conseguir nuestros objetivos.

Para poder acceder a la consola de MySQL es necesario seguir los siguientes pasos,suponiendo que hayamos instalado el paquete Xampp en Windows.

1. Xampp debe estar iniciciado. De no ser así iremos a la carpetaC:\CursoPhp\xampplite (el directorio donde hemos instalado Xampp) y ejecutaremosxampp_start.exe.

2. Una vez arrancado Xampp ejecutaremos el comando mysql -u root . Esto se puedehacer en Windows desde Inicio --> Ejecutar o desde MS-DOS (símbolo de sistema).

Programación en PHP

Plataforma de Teleformación de IFES Página 91 de 143

Page 92: ProgramacionenPHP

La consola es igual tanto en Windows como en Linux, por lo que una vez dentro no seapreciarán diferencias.

Sintaxis de SQL

A diferencia de PHP MySQL no distingue entre mayúsculas y minúsculas y lasinstrucciones se pueden escribir tanto en una como en la otra forma. Pero para hacermás legible lo que leemos lo habitual es escribir las palabras clave del lenguaje enmayúsculas y el resto del código en minúsculas. Esta es la convención que se sigue eneste texto.

Otra característica de MySQL es que las sentencias se terminan siempre en punto ycoma, como en PHP.

Crear la estructura de la base de datos

Antes de poder almacenar datos hemos de crear una estructura que los puedacontener.

Creación de una base de datos

MySQL es un sistema gestor de bases de datos, que puede gestionarmás de una basede datos independiente. Por lo tanto lo primero que debemos hacer es crear nuestrabase de datos personal que utilizaremos durante las pruebas. Para ello se usa la

Programación en PHP

Página 92 de 143 Programación en PHP

Page 93: ProgramacionenPHP

sentencia SQL CREATE DATABASE.

CREATE DATABASE nombre_base_datos;

Ejemplo 4.3.1. Creamos nuestra base de datos que llamaremos curso_php.

Selección de una base de datos

Antes de poder trabajar con la base de datos hemos de seleccionarla. Para ellousaremos el comando USE.

USE nombre_base_datos ;

Ejemplo 4.3.2. A partir de ahora todas las sentencias SQL se harán sobre la base dedatos curso_php .

Creación de tablas

Las bases de datos almacenan la información en tablas, que son el pilar fundamentalde las bases de datos relacionales. La instrucción SQL que se utiliza para crear unatabla es CREATE TABLE.

CREATE TABLE nombre_tabla ( definicion_tabla );

La definción de la tabla está compuesta por una lista de sus campos (columnas). Loscampos

CREATE TABLE nombre_tabla (nombre_campo1 tipo_campo1 atributos_campo1,

nombre_campo2 tipo_campo2 atributos_campo2 ,...

);

Programación en PHP

Plataforma de Teleformación de IFES Página 93 de 143

Page 94: ProgramacionenPHP

La definición de cada campo, salvo del último, debe termninar en coma. Cada camposolo puede almacenar un tipo de datos, de momento nos bastará con conocer lossiguientes:

• INT - Almacena números enteros.• CHAR(longitud ) - Almacena cadenas de texto de un máximo de longitud

caracteres.• DATE - Almacena fechas• DATETIME - Almacena fechas con la hora

Los atributos de un campo estarán vacíos en la mayoría de los casos. Aunque hay unaexcepción. en casi todas las tablas se suele poner un campo id que contenga unidentificador único de cada registro. A este campo se le dan los atributos:

• PRIMARY KEY - Indica que el campo identifica de forma única el registro(fila).

• AUTO_ INCREMENT - El campo se rellena automáticamenteincrementándose su valor en 1 cada vez que se añade un registro.

Ejemplo 4.3.3. En este ejemplo se ve la creación de una tabla con datos sobre losempleados de una empresa.

CREATE TABLE empleados (id INT PRIMARY KEY AUTO_INCREMENT,nombre CHAR(50),puesto CHAR(20),fecha_nacimiento DATE,salario INT

);

Los campos que se han definido en la tabla tiene las siguientes características:

• id - Campo de tipo entero que identifica de forma única un registro. Cada vezque se añade un registro se incrementa automáticamente.

• nombre - Campo que puede almacenar una cadena de hasta 50 caracteres,destinado a guardar el nombre. No tiene atributos.

• puesto - Campo que puede almacenar una cadena de hasta 20 caracteres,destinado a guardar el puesto que desempeña. No tiene atributos.

• fecha_nacimiento - Almacena la fecha de nacimiento en formatoYYYY-MM-DD (4 cifras para el año, guión, 2 cifras para el mes, guión, 2cifras apra el día). No tiene atributos.

• salario - Campo de tipo entero que guarda el sueldo en euros del empleado.No tiene atributos.

Programación en PHP

Página 94 de 143 Programación en PHP

Page 95: ProgramacionenPHP

Para ejecutar esta sentencia SQL podemos copiarla y pegarla en la consola de MySQL.

Listar tablas

Para ver todas las tablas que hay disponibles en una base de datos se usa lainstrucción SHOW TABLES.

SHOW TABLES;

Ejemplo 4.3.4. Al listar las tablas de la base de datos comprobamos que solo hay una,la que acabamos de crear.

Mostrar la definición de una tabla

Esto se hace mediante la sentencia SQL DESCRIBE.

DESCRIBE nombre_tabla ;

Ejemplo 4.3.5. Al mostrar la descripción de la tabla empleados se puedecomporbar que coincide con la definición que hemos puesto al crearla.

Programación en PHP

Plataforma de Teleformación de IFES Página 95 de 143

Page 96: ProgramacionenPHP

Borrar tablas

Para borrar una tabla se usa la sentencia SQL DROP DATABASE. Hay que tenermucho cuidado ya que al borrar una tabla borramos de forma irrecuperable todos losdatos que hubieramos introducido.

DROP TABLE nombre_tabla ;

Ejemplo 4.3.6. Vamos a eliminar la tabla empleados . Todos los datos que contenga seborrarán.

Creación de tablas mediante un script

La definición de una base de datos es costosa de escribir y de introducir manualmentecomo hemos visto en las ultimas consultas de creación de tablas. Un pequeño errornos obligará a volver a introducir la consulta.

Para solventar este inconveniente, y dado que SQL es un lenguaje textual,almacenaremos todas estas consultas en un fichero de texto de extensión .sql , paradistinguirlo de otros ficheros. De esta manera podremos editarlo fácilmente concualquier editor de texto plano (sin formato).

Este fichero contendrá (para MySQL) la selección de la base de datos y tantasconsultas de creación (e incialización mediante inserción de datos, para así tenercontenido inicial) como se desee.

Ejemplo 4.3.7. Nuestra base de datos curso_php quedará definida así en el ficherocurso_php.sql .

CREATE DATABASE IF NOT EXISTS curso_php;USE curso_php;CREATE TABLE IF NOT EXISTS empleados (

id INT PRIMARY KEY AUTO_INCREMENT,nombre CHAR(50),puesto CHAR(20),fecha_nacimiento DATE,salario INT

);

Nótese que se ha aplicado el modificador IF NOT EXISTS. Su efecto es que crea la

Programación en PHP

Página 96 de 143 Programación en PHP

Page 97: ProgramacionenPHP

tabla en el caso de que no exista y si existe no muestra ningún mensaje de error.

Este código, como hemos observado, lo guardaremos en un archivo llamadocurso_php.sql . Un buen sitio es la carpetaC:\CursoPHP\xampplite\htdocs\practicasPHP\sql (que tendremos que crear).

Una vez guardado el script, para ejecutarlo lo haremos con el comando SOURCE:

Operaciones con datos

Ya tenemos la estructura que va a dar soporte a los datos, ahora nos falta saber comopodemos añadirlos, consultarlos, modificarlos y eliminarlos.

Introducir datos en una tabla

Las tablas que hemos creado están vacías, y así sirven de poco. Son como unarmazón, pero para que la base de datos sea útil hemos de introducir datos.

Para insertar un registro en una tabla se usa la sentencia SQL INSERT.

INSERT INTO tabla (campo1, campo2, ...)VALUES (dato1, dato2, ...);

Ejemplo 4.3.8. Vamos a insertar un primer dato en la tabla empleados. Al igual que enPHP los datos que son cadenas de texto los ponemos entre comillas, al igual que lafecha. El campo id no hace falta insertarlo ya que lo hemos definido comoautoincremental.

Ejemplo 4.3.9. Se pueden insertar varios registros (filas) en una tabla con unasentencia insert, separando los conjuntos de valores entre paréntesis por comas.

Programación en PHP

Plataforma de Teleformación de IFES Página 97 de 143

Page 98: ProgramacionenPHP

Leyendo datos de una tabla

Aquí es donde se despliega la potencia de SQL, que además tiene una sintaxis muyfácil de comprender. Los datos se leen de la tabla a través de consultas, que son comopreguntas que le hacemos a la base de datos.

La sentencia básica para hacer consultas es SELECT.

SELECT campo1, campo2, ... FROM tabla ;

Ejemplo 4.3.10. Una consulta sobre la tabla empleados.

Ejemplo 4.3.11. En muchos casos querremos seleccionar todos los campos de latabla. Para ello se usa el comodín asterísco " * ", de tal forma que esta consultamuestra exáctamente el mismo resultado que la anterior.

SELECT * FROM tabla ;

Ejemplo 4.3.12. En este caso restringimos el rango de la consulta al campo nombre.

Programación en PHP

Página 98 de 143 Programación en PHP

Page 99: ProgramacionenPHP

Filtrando datos de una tabla

La clausula WHERE en una consulta SELECT permite poner condiciones de maneraque se nos muestren solo los registros que la cumplen. Esta es la sintaxis de lasentencia SELECT ampliada con esta cláusula.

SELECT campos FROM tabla WHERE condiciones ;

Ejemplo 4.3.13. Esta consulta devuelve todos los datos de los empleados cuyo salarioes mayor de 1400 euros.

Se pueden unir varias condiciones mediante los operadores lógicos AND, OR y NOT(cuyo funcionamiento es muy similar a PHP). Se pueden usar paréntesis si se tienendudas sobre las reglas de precedencia.

Ejemplo 4.3.14. Empleados que cobran más de 1400 euros y que nacieron antes de1975.

Ejemplo 4.3.15. Empleados que tabajan de comerciales o programadores.

Programación en PHP

Plataforma de Teleformación de IFES Página 99 de 143

Page 100: ProgramacionenPHP

Ejemplo 4.3.16. Búsqueda textual. En ocasiones se quiere buscar los registros cuyotexto contiene otro. Para ello, en lugar de comparar con el operador igual " = " se usa eloperdor LIKE y la cadena son la que se compara se pone entre comillas y signos deporcentaje "%cadena %". Esta consulta muestra los registros cuyo nombre contiene lacadena "an".

Ordenar datos de una consulta

En muchas ocasiones querremos que los datos devueltos nos lleguen devueltos. Paraello usaremos con el SELECT la clausula ORDER BY a la que le acompaña el campopor el que queremos ordenar. En el caso de que haya una clausula WHERE, ORDERBY ha de ir detras necesariamente. La sintaxis nueva queda de la siguiente forma.

SELECT campos FROM tabla WHERE condiciones ORDER BY campo;

Ejemplo 4.3.17. Aquí se muestran todos los registros de la tabla ordenados por elnombre del empleado en orden alfabético.

Ejemplo 4.3.18. Mediante el modificador DESC se pueden devolver los resultados enorden inverso.

Programación en PHP

Página 100 de 143 Programación en PHP

Page 101: ProgramacionenPHP

Actualizar datos

Además de añadir datos necesitaremos saber como modificar los existentes. Lasentencia UPDATE se encarga de esto. Se suele usar en combinación con unacondición (similar a las que se usan en los SELECT) que filtra los registros a cambiar.

UPDATE tabla SET campo = valor WHERE condiciones;

Ejemplo 4.3.19. Vamos a usar la sentencia UPDATE para subir el sueldo al empleadoAna. Como la tabla tien un campo id es por este por el que filtraremos. Al final se haceun SELECT para comprobar que la tabla se ha actualizado.

Ejemplo 4.3.20. Si no filtramos la actuallización se verán afectados todos los registrosde la tabla.

Programación en PHP

Plataforma de Teleformación de IFES Página 101 de 143

Page 102: ProgramacionenPHP

En una sentencia UPDATE se pueden sustituir varios campos a la vez separandolospor comas.

UPDATE tabla SET campo1 = valor1, campo2 = valor2, ...

Borrado de registros de una tabla

Para el borrado de datos de una tabla se usa la sentencia DELETE. Se suele usar encombinación con una condición que filtra los datos a borrar, si se usara sola borraríatodos los datos de la tabla. Su uso tiene cierta similitud con el de SELECT, con ladiferencia de que no hay que indicar campos ya que se borra toda la fila.

DELETE FROM tabla WHERE condiciones;

Ejemplo 4.3.21. Borrado del empleado Juan. Una vez más se selecciona por el id .

Ejemplo 4.3.22. Al usar la sentencia DELETE sin filtrar se están borrando todos losdatos de la tabla (pero no su definición). Luego al hacer el SELECT el mensaje Emptyset nos indica que la tabla está vacía.

U.d.4. Funciones de PHP con MySQL

Una vez que conocemos las características básicas de MySQL y las sentencias SQLque se pueden ejecuar vamos a ver como se integra MySQL con PHP.

Las definiciones de bases de datos y tablas las haremos desde la consola de MySQL(preferiblemente a través de un script SQL con las sentencias de creación einicialización de tablas). La manipulación de datos en cambio se hará desde PHP. Lasoperaciones que nos interesan son, por lo tanto:

Programación en PHP

Página 102 de 143 Programación en PHP

Page 103: ProgramacionenPHP

• Leer datos.• Añadir datos.• Modificar datos.• Eliminar datos.

PHP accede a MySQL a través del API. Dispone de una extensión (biblioteca defunciones) con muchas funciones para acceder a la base de datos.

Conectar con la base de datos

Antes de empezar a consultar información tenemos que conectar con el sistema gestorde bases de datos y declarar la base de datos que vamos a usar. Esto se deberá haceren cualquier script que posteriormente quiera leer, añadir, modificar o eliminar datos.

mysql_connect()

Esta función conecta el script a un sistema gestor de bases de datos.

mysql_connect(servidor, usuario, contraseña )

Los parámetros que recibe son:

• servidor - Nombre o dirección IP del servidor donde está alojada la base dedatos. Si está instalado en la misma máquina que el servidor web lo normales que sea localhost . Se puede elegir un número de puerto diferente del quese usa por defecto poniendo detras del servidor dos puntos " : " y el númerodel puerto. P.ej.: localhost:3340 .

• usuario - Nombre de usuario con privilegios para acceder a la base de datos.• contraseña - Contraseña del usuario.

Esta función devuelve una referencia a la base de datos que guardaremos en unavariable para usarla en posteriores funciones de PHP con MySQL.

mysql_select_db()

Usa como parámetros la base de datos que queremos seleccionar y la variable en laque tengamos la referencia a la base de datos. Es equivalente en MySQL a lasentencia USE.

mysql_select_db(nombre_base_datos , referencia_bd )

Ejemplo 4.4.1. Los ejemplos de esta unidad didáctica usaran la base de datos creada

Programación en PHP

Plataforma de Teleformación de IFES Página 103 de 143

Page 104: ProgramacionenPHP

en la unidad didáctica anterior llamada curso_php con la tabla empleados y con loscuatro registros creados.

<?php//Conecta a la BD, guarda en la variable $con la referencia a la BD$con = mysql_connect("localhost", "root", "");//Selecciona la BD que se va a usar a partir de estemomento.mysql_select_db("curso_php", $conn);?>

Ejemplo 4.4.2. Una buena idea es guardar el proceso de conexión a la base de datos yluego utilizarlo en nuestros scripts mediante un include() . Aquí se ha creado el ficheroconectar_bd.php.

<?phpDEFINE(DB_HOST, "localhost");DEFINE(DB_USER, "root");DEFINE(DB_PASSWORD, "");DEFINE(DB_NAME, "curso_php");$con = @mysql_connect(DB_HOST,DB_USER, DB_PASSWORD);if (!$con || !mysql_select_db("curso_php", $con)) {

die("Error conectando a la BD: " . mysql_error());}?>

La función mysql_error() devuelve un texto con el error que se produjo en nuestraúltima operación sobre la base de datos. Se ha utilizado la función de PHP die() quetermina la ejecución del script sacando un mensaje por pantalla. También se ha usadoel operador de supresión de errores "@ ".

Al incluir este fichero de configuración en el siguiente script se comporta igual que enejemplo 4.4.1., solo que mejorado para emitir mensajes de error.

<?phpinclude("conectar_bd.php");echo "Establecida la conexión a la base de datos";?>

Leer datos

Aquí nos encontramos con la función clave de este capítulo. Se trata de la funciónmysql_query() . Su potencia es enorme ya que permite enviar una instrucción SQL,

Programación en PHP

Página 104 de 143 Programación en PHP

Page 105: ProgramacionenPHP

como las vistas en el capítulo anterior, a la base de datos. Para leer datos la sentenciaque usaremos será obviamente un SELECT.

mysql_query()

La sintaxis de esta función es muy sencilla. La sentencia SQL es la misma quepondríamos en la consola de MySQL, aunque no es necesario poner el punto y comafinal de la sentencia SQL (que sí al final de la instrucción PHP).

mysql_query(sentencia_SQL , referencia_bd )

Hay que tener en cuenta que esta función solo ejecuta la sentencia, no muestra ningúndato. Por ello devuelve un identificador del resultado que se usa en otras funcionespara visualizar los valores devueltos por la consulta.

Ejemplo 4.4.3. Aquí se muestra como se ejecuta una sentencia SQL.

<?phpinclude("conectar_bd.php");$res = mysql_query("SELECT * FROMempleados", $con);?>

Ejemplo 4.4.4. Mejoraremos la claridad del código si guardamos la sentencia SQL enuna variable.

<?phpinclude("conectar_bd.php");$sql = "SELECT * FROM empleados";$res = mysql_query($sql, $con);?>

mysql_num_rows()

Antes de acceder al resultado nos interesa saber cuantos registros se han obtenido.Concretamente una consulta podría no devolver ningún resultado y esto podría causarun error en nuestro código.

Esta función nos dará el número de filas que tiene un resultado obtenido de unaconsulta de tipo select (y sólamente de este tipo, las consultas deinserción/borrado/actualización tienen otra función, mysql_affected_rows).

mysql_num_rows(identificador_de_resultado )

Programación en PHP

Plataforma de Teleformación de IFES Página 105 de 143

Page 106: ProgramacionenPHP

mysql_result()

De acuerdo, ya hemos ejecutado la sentencia SQL, pero ¿como accedemos alresultado?. Para ello nos sirve la función mysql_result() .

mysql_result(identificador_de_resultado, fila, nombre_campo )

El campo se puede seleccionar también mediante un número, que es su posición entrelos campos devueltos.

Ejemplo 4.4.5. mysql_result() se suele usar en conjunción con la funciónmysql_num_rows() para controlar las filas que se están recuperando. La estructuraideal es un bucle for . En este ejemplo se muestra una consulta limitada en el rango(solo se recupera el campo nombre ).

<?phpinclude("conectar_bd.php");$sql = "SELECT nombre FROM empleados";$res = mysql_query($sql, $con);$filas = mysql_num_rows($res);for ($i = 0; $i < $filas; $i++) {

$nombre = mysql_result($res, $i, "nombre");echo "$nombre<br>";

}?>

Ejemplo 4.4.6. Aquí se pone junto todo lo que hemos visto hasta ahora y se muestrala tabla empleados dentro de una tabla HTML.

<?phpinclude("conectar_bd.php");?><table border="1">

<tr><td>id</td><td>nombre</td><td>puesto</td><td>fecha_nacimiento</td><td>salario</td>

</tr><?php include("conectar_bd.php");

$sql = "SELECT * FROM empleados";$res = mysql_query($sql, $con);

Programación en PHP

Página 106 de 143 Programación en PHP

Page 107: ProgramacionenPHP

$filas = mysql_num_rows($res);for ($i = 0; $i < $filas; $i++) {

echo "<tr>"; $id = mysql_result($res, $i, "id");echo "<td>$id</td>";$nombre = mysql_result($res, $i, "nombre");echo "<td>$nombre</td>";$puesto = mysql_result($res, $i, "puesto");echo "<td>$puesto</td>";$f_nacimiento = mysql_result($res, $i, "fecha_nacimiento");echo "<td>$f_nacimiento</td>";$salario = mysql_result($res, $i, "salario");echo "<td>$salario</td>";echo "</tr>";

}?></table>

Ejemplo 4.4.7. Con un pequeño cambio en la sentencia SQL mostraremos las filasordenadas por el nombre.

$sql = "SELECT * FROM empleados ORDER BY nombre";

Ejemplo 4.4.8. Y con solo otro pequeño cambio obtenemos un resultado filtrado.

$sql = "SELECT * FROM empleados WHERE salario > 1400";

Ejemplo 4.4.9. Con el sistema que hemos seguido que consiste en separar lasentencia SQL veamos lo fácil que resulta parametrizar un parámetro de búsqueda.

$salario = 1250;$sql = "SELECT * FROM empleados WHERE salario > $salario";

mysql_fetch_array()

Es una alternativa a usar mysql_result() a la hora de recuperar los datos. La diferenciaes que en lugar de extraerse las celdas de la tabla de una en una se recupera un arrayasociativo por cada fila que tiene como índices los nombres de los campos.

Cada vez que se llama a esta función recupera una de las filas resultado de la consulta,hasta que no queda ninguna. entonces devuelve FALSE.

Programación en PHP

Plataforma de Teleformación de IFES Página 107 de 143

Page 108: ProgramacionenPHP

mysql_fetch_array(identificador_de_resultado )

Ejemplo 4.4.10. Mediante esta función se puede conseguir un código más compacto, yque para algunos será más legible. Como cada llamada a la función recupera una fila ypasa a la siguiente no es necesario recuperar mediante mysql_num_rows() el númerode filas que contiene el resultado. Este código es equivalente al del ejercicio 4.4.6.

<?phpinclude("conectar_bd.php");?><table border="1">

<tr><td>id</td><td>nombre</td><td>puesto</td><td>fecha_nacimiento</td><td>salario</td>

</tr><?php$sql = "SELECT * FROM empleados";$res = mysql_query($sql, $con);

$fila = mysql_fetch_array($res);while($fila) {

echo "<tr>";echo "<td>{$fila["id"]}</td>";echo "<td>{$fila["nombre"]}</td>";echo "<td>{$fila["puesto"]}</td>";echo "<td>{$fila["fecha_nacimiento"]}</td>";echo "<td>{$fila["salario"]}</td>";echo "</tr>";$fila = mysql_fetch_array($res);

}?>

</table>

Añadir datos

Para añadir datos no necesitamos conocer nada nuevo. Se usa la funciónmysql_query() pero en esta ocasión se encapsula una sentencia SQL INSERT, que

Programación en PHP

Página 108 de 143 Programación en PHP

Page 109: ProgramacionenPHP

añada datos.

Ejemplo 4.4.11. Vamos a añadir un nuevo empleado. Para ello se usará la sentenciaSQL "parametrizada", como si se hubiesen recibido los datos de un formulario y sequisieran guardar en la base de datos. Como la consulta es muy larga se ha troceadoen varias líneas usando el operador concatenar cadena " . ".

<?phpinclude("conectar_bd.php");

$nombre = "Paola";$puesto = "Programador";$fecha_nacimiento = "1958-01-23";$salario = 1800;

$sql = "INSERT INTO empleados ". "(nombre, puesto, fecha_nacimiento, salario) ". "VALUES ". "('$nombre', '$puesto', '$fecha_nacimiento', $salario)";

$res = mysql_query($sql, $con);?>

Podemos comprobar que se ha realizado la inserción tecleando SELECT * FROMempleados desde la consola de MySQL o ejecutando el código del ejercicio 4.4.6. (odel 4.4.10.)

Modificar datos

Una vez más usamos la función mysql_query() , con una sentencia SQL del tipoUPDATE.

Ejemplo 4.4.12. Vamoa a modificar los datos del empleado que ñadimos en laconsulta anterior.

<?phpinclude("conectar_bd.php");

$id = 5; //id del registro a modificar$nuevo_salario = 2100;$sql = "UPDATE empleados SET salario =$nuevo_salario "

. "WHERE id = $id";$res = mysql_query($sql, $con);?>

Programación en PHP

Plataforma de Teleformación de IFES Página 109 de 143

Page 110: ProgramacionenPHP

Eliminar datos

En esta ocasión usamos la función mysql_query() , con una sentencia SQL del tipoDELETE.

Ejemplo 4.4.13. Vamos a modificar los datos del empleado que ñadimos en laconsulta anterior.

<?phpinclude("conectar_bd.php");$id = 5; //Id del registro a borrar$sql = "DELETEFROM empleados WHERE id = $id";$res = mysql_query($sql, $con);?>

Programación en PHP

Página 110 de 143 Programación en PHP

Page 111: ProgramacionenPHP

Módulo V. Aplicaciones comunes enPHP

U.D.1. Fecha y hora

Timestamp

El concepto de timestamp procede del mundo Unix/Linux. A nivel interno, PHP guardalas fechas como un número entero que corresponde con el nº de segundos que hanpasado desde una fecha de referencia, concretamente el 1 de enero de 1970. A esteformato para almacenar una fecha se le llama timestamp .

Ejemplo 5.1.1. Las dos fechas que se muestran a continuación son la misma, solo quela segunda está en formato timestamp .

Ejemplo 5.1.2. El timestamp tiene la ventaja para PHP de que, al ser un númeroentero, es fácil operar con él. Es sencillo sumar, restar o comparar dos fechas. Siempreque queramos hacer este tipo de operaciones las hemos de hacer en formatotimestamp .

Programación en PHP

Plataforma de Teleformación de IFES Página 111 de 143

Page 112: ProgramacionenPHP

La fecha en formato timestamp tiene la desventaja de que su significado no es obvio.Afortunadamente PHP ofrece múltiples funciones que sirven para convertir fechas enformatos timestamp en fechas reconocibles, similares a "12 de octubre de 2005" o"12/02/2005".

Funciones de fecha y hora

mktime()

Esta función permite crear una marca timestamp para una fecha y hora dados.

mktime(hora, min, seg, mes, día, año )

Es muy importante observar el orden de los argumentos, que no es al que estamosacostumbrados. Concretamente el mes se encuentra antes del día.

Ejemplo 5.1.3. En este ejemplo se usa la función strftime() para ver la fecha en modotexto. Su funcionamiento se explica más adelante.

<?php$fecha = mktime(14, 30, 0, 12, 25, 2005);strftime("%c", $fecha);?>

Ejemplo 5.1.4. Nos encontraremos con multitud de ocasiones en las quenecesitaremos conocer la fecha actual. mktime() también se puede usar sinargumentos para obtener el timestamp del momento actual.

<?php

Programación en PHP

Página 112 de 143 Programación en PHP

Page 113: ProgramacionenPHP

$fecha = mktime();strftime("%d/%m/%Y %H:%M:%S", $fecha);?>

getDate()

Esta función recibe una fecha en formato timestamp y devuelve un array asociativo contodos los datos de esa fecha.

getDate(timestamp )

Ejemplo 5.1.5. Como es un array asociativo podemos ver su contenido usando lafunción print_r() .

<pre><?php$fecha = mktime(); //timestamp del momento actual$datos_fecha = getDate($fecha);print_r($datos_fecha);?></pre>

Ejemplo 5.1.6. Podemos concatenar los campos de un array asociativo para darformato a una fecha.

<?php$fecha = mktime(); //timestamp del momento actual$datos_fecha = getDate($fecha);echo "Hoy es ";echo$datos_fecha["mday"] . "/" . $datos_fecha["mon"] . "/"

. $datos_fecha["year"] . ".<br>";echo "Son las ";echo $datos_fecha["hours"] . ":" . $datos_fecha["minutes"] . ":"

. $datos_fecha["seconds"] . ".<br>";?>

strftime()

Esta función se usa para dar formato a las fechas de forma sencilla.

strftime(formato, timestamp )

Programación en PHP

Plataforma de Teleformación de IFES Página 113 de 143

Page 114: ProgramacionenPHP

La cadena de texto formato está formada por texto corriente mezcladocon especificadores de conversión. Cada especificador de conversión empieza con elsímbolo porcentaje "%". Esta es la lista de los especificadores de los que disponemos.

• %a - nombre del día de la semana abreviado• %A - nombre del día de la semana completo• %b - nombre del mes abreviado• %B - nombre del mes completo• %c - representación de fecha y hora preferidas en el idioma actual• %d - día del mes en número (de 00 a 31)• %H - hora como un número de 00 a 23• %I - hora como un número de 01 a 12• %j - día del año como un número de 001 a 366• %m - mes como un número de 01 a 12• %M - minuto en número• %p - `am' o `pm', según la hora dada, o las cadenas correspondientes en el

idioma actual• %S - segundos en número• %U - número de la semana en el año, empezando con el primer domingo

como el primer día de la primera semana• %W - número de la semana en el año, empezando con el primer lunes como

el primer día de la primera semana• %w - día de la semana en número (el domingo es el 0)• %x - representación preferida de la fecha sin la hora• %X - representación preferida de la hora sin la fecha• %y - año en número de 00 a 99• %Y - año en número de cuatro cifras• %Z - nombre o abreviatura de la zona horaria• %% - carácter "%"

Ejemplo 5.1.7. Este código produce el mismo resultado que el del ejemplo 5.1.6. peroes mucho más conciso y legible.

<?php$fecha = mktime(); //timestamp del momento actualecho strftime("Hoy es %d/%m/%Y", $fecha) . ".<br>";echo strftime("Son las %H:%M:%S", $fecha) . ".<br>";?>

Ejemplo 5.1.8. Formateo de una fecha usando diferentes patrones.

<?php$fecha = mktime(); //timestamp del momento actualechostrftime("%d/%m/%Y %H:%M:%S", $fecha) . ".<br>";

Programación en PHP

Página 114 de 143 Programación en PHP

Page 115: ProgramacionenPHP

echo strftime("%A %d de %B de %Y", $fecha) . ".<br>";echo strftime("%Hh, %Mm y %Ss", $fecha) . ".<br>";echo strftime("%I:%M %p", $fecha) . ".<br>";?>

Esta función tiene la ventaja adicional de que nos puede dar la fecha en castellano(lunes en lugar de monday). Para ello antes hay que informar al servidor de cual es elidioma que deseamos.

setlocale()

Si se incluye esta función antes de llamar a strftime() se establece que todas las fechasse darán ahora en el idioma elegido.

strftime(LC_TIME, idioma )

Ejemplo 5.1.9. Vamos a usar esta función para mostrar los resultados del ejemploanterior pero esta vez en castellano. La cadena que identifica al idioma castellano es"esp" en Windows.

<?php$fecha = mktime(); //timestamp del momento actual

setlocale(LC_TIME ,"esp");

echo strftime("%d/%m/%Y %H:%M:%S", $fecha) . ".<br>";echo strftime("%A %d de %B de %Y", $fecha) . ".<br>";echo strftime("%Hh, %Mm y %Ss", $fecha) . ".<br>";echo strftime("%I:%M %p", $fecha) . ".<br>";?>

Validación de fechas

checkdate()

En ocasiones, por ejemplo cuando recibamos datos de un formulario, nos interesarácomprobar que la fecha realmente existe. La función checkdate() comprueba que unafecha es correcta, devolviendo TRUE o FALSE según su validez. Las fechas anterioresal año 1 no son válidas.

Programación en PHP

Plataforma de Teleformación de IFES Página 115 de 143

Page 116: ProgramacionenPHP

checkdate(mes, día, año )

Una vez más, el orden en el que se introducen los parámetros no es el tradicional. Elmés se pone antes que el día.

Ejemplo 5.1.10. No hay un 31 de abril. Y 29 de febrero solo en los años que sonbisiestos.

<?php$dia = 31;$mes = 4;$anyo = 2005;if (checkdate($mes, $dia, $anyo)) { echo "El $dia/$mes/$anyo es unafecha válida.<br>";} else { echo "El $dia/$mes/$anyo no existe.<br>";}$dia = 29;$mes = 2;$anyo = 2005;if (checkdate($mes, $dia, $anyo)) {

echo "El $dia/$mes/$anyo es una fecha válida.<br>";} else { echo "El $dia/$mes/$anyo no existe.<br>";}$dia = 29;$mes = 2;$anyo = 2004;if (checkdate($mes, $dia, $anyo)) {

echo "El $dia/$mes/$anyo es una fecha válida.<br>";} else { echo "El $dia/$mes/$anyo no existe.<br>";}?>

U.D.2. Envío de emails

Consideraciones preliminares

El envío de emails no se puede hacer directamente desde PHP. PHP se limita aencargar a un servidor de correo SMTP que envíe el mail y es este quien pone elcorreo en la red. Por lo tanto para poder enviar emails necesitaremos, además delservidor web un servidor SMTP al que tengamos acceso.

Esto puede resultar complicado ya que podemos no disponer de un servidor SMTP.También puede suceder que aunque dispongamos de un servidor de SMTP no poderusarlo de forma remota por motivos de seguridad.

Programación en PHP

Página 116 de 143 Programación en PHP

Page 117: ProgramacionenPHP

Desafortunadamente el paquete Xampp, en la versión Lite que hemos elegido paraeste curso no dispone de un servidor de correo SMTP, así que para poder probar losejemplos de este curso habrá que buscar uno.

Configuración del correo

Para configurar el correo tendremos que proporcionarle a la configuración de PHP elnombre del servidor SMTP y una dirección de una cuenta de correo alojada en dichoservidor. Para ello se usa la función init_set() con la que hay que configurar dosparámetros.

ini_set("SMTP", nombre_servidor_SMTP )ini_set("sendmail_from", dirección_email )

Ejemplo 5.2.1. Los usuarios de Microsoft Outlook Express probablemente podránhacer uso de la cuenta de email que tengan configurada. Por un lado han de poner sudirección de correo electrónico y por otro el nombre del servidor SMTP. Este último sepuede encontrar en Menú Herramientas --> Cuentas --> Botón Propiedades -->Lengüeta Servidores.

<?phpini_set("SMTP", "smtp.pernambuco.com");

Programación en PHP

Plataforma de Teleformación de IFES Página 117 de 143

Page 118: ProgramacionenPHP

ini_set("sendmail_from", "juanpalomo @pernambuco.com ");?>

Esta configuración se puede guardar en un archivo de configuración específico para elemail llamado email_config.php o bien en un archivo de configuración de uso másgeneral. Será imprescindible importarla antes de usar la función mail() .

Envío de emails desde PHP

Si bien configurar el servidor de correo electrónico puede ser complicado, una vezhecho el envío de emails no puede ser más sencillo.

mail()

La función mail() tiene sólo tres parámetros. La dirección de correo del destinatario, elasunto del correo y el contenido del mismo.

mail(destinatario, asunto, mensaje);

Para crear saltos de línea en el cuerpo del mensaje se utiliza la cadena "\n\r" quesimboliza un salto de línea en Windows.

Ejemplo 5.2.2. Para probar este script se puede poner como dirección de destino la deuna cuenta a la que tengamos acceso. El mansaje, al ser muy largo, se ha escrito envarias líneas usando el operador concatenar " . ".

<?phpinclude("email_config.php");

$destinatario = "[email protected] ";$asunto = "El sábado al cine.";$mensaje = "Hemos quedado el sábado a las 9 en el cine Odeón.\r\n"

. "Avisa si no puedes venir.\r\n"

. "\r\n"

. " Juan";

if (mail($destinatario, $asunto, $mensaje)) {echo "El mensaje se ha enviado con éxito.";

} else {echo "No se ha podido enviar el mensaje.";

}

Programación en PHP

Página 118 de 143 Programación en PHP

Page 119: ProgramacionenPHP

?>

Ejemplo 5.2.3. En la forma anterior no nos resulta muy útil. Sería mejor si añadieramosun formulario para elegir el destinatario, el asunto y redactar el correo.

• mail_form.html

<html><head>

<title>Enviar correo electrónico</title></head><body><form name="mail_form" method="post" action="enviar_mail.php">

Destinatario:<br><input type="text" name="destinatario" size="53"></br>Asunto:<br><input type="text" name="asunto" size="53"></br>Mensaje:<br><textarea name="mensaje" rows="5" cols="40"></textarea></br><input type="submit" value="Enviar correo"></br>

</form></body></html>

• enviar_mail.php

<?phpinclude("email_config.php");

//Las variables $destinatario, $asunto y mensaje se extraen// directamente del formularioif (mail($destinatario, $asunto, $mensaje)) {

echo "El mensaje se ha enviado con éxito.";} else {

echo "No se ha podido enviar el mensaje.";}?>

El aspecto que tendrá el formulario es el siguiente.

Programación en PHP

Plataforma de Teleformación de IFES Página 119 de 143

Page 120: ProgramacionenPHP

U.D.3. Sesiones

Las sesiones se usan siempre que haya que dar servicios personalizados o deidentificación. El protocolo HTTP es un protocolo sin estado. Esto significa que no haymanera de que un servidor web sepa qué estámos haciendo mientras navegamos porun sitio web, a no ser que pueda identificar/marcar al cliente (el navegante) de algúnmodo, para que, posteriores peticiones de este nos digan quién es.

Por supuesto, con una página dinámica en PHP podemos guardar información en algúnsitio (un fichero, una base de datos), pero las aplicaciones web no se componen de unasola página sino de varias, así que necesitaremos de algún mecanismo que nos faciliteel almacenaje de datos temporales relativos a una navegación (llamada sesión).

PHP incorpora el manejo de las sesiones de serie, y de manera muy simple,escondiendo la complejidad que tiene el proceso tras el protocolo HTTP. Para elmanejo de sesiones PHP incorpora una serie de funciones que permiten iniciar/terminaruna sesión así como funciones de escritura/lectura en la sesión.

Funciones para manejar sesiones

El uso de sesiónes en PHP se define en tres sencillos pasos:

1. Inicio de sesión. La primera página crea la sesión.

Programación en PHP

Página 120 de 143 Programación en PHP

Page 121: ProgramacionenPHP

2. Uso de la sesión. Las páginas que forman parte de la aplicaciónhacen uso de la sesión. Durante este transcurso se pueden escribir yleer datos en la sesión.3. Finalización de la sesión. La página de salida destruye la sesión.

session_start()

Esta función se usa para iniciar una sesión. Basta con incluirla al principiode cada página que vaya a usar sesiones. Eso sí, debe ir antes de cualquier códigoHTML, si no es así dará error.

Ejemplo 5.3.1. El primer código es correcto mientras que si probamos el segundo nosdará un error. Este es un motivo adicional por el que es recomendable acostumbrarse aponer el código PHP al principio de la página web.

<?php//Lo primero que se hace es crear la sesiónsession_start();?><html><head>

<title>Esta página es correcta</title></head>//...

<html><head>

<title>Esta página da error</title></head><?php//Esto dará error ya que hay código HTML antessession_start();?>//...

session_id()

Todas las sesiones tienen un número que las identifica de forma única. En ocasionespuede ser útil conocerlo y para eso se usa esta función.

session_destroy()

Mediante esta función se destruyen todos los datos que pudiera tener asociada la

Programación en PHP

Plataforma de Teleformación de IFES Página 121 de 143

Page 122: ProgramacionenPHP

sesión actual. En la página de salida es conveniente poner una llamada explícita a estafunción. Si se la llama se destruye la sesión y todos los datos asociada.

Ejemplo 5.3.2. Un caso básico. En iniciar_sesion.php se crea la sesión, ensesion_activa.php se hace uso de ella mostrando su id y en finalizar_sesion.php sedestruye la sesión.

• iniciar_sesion.php

<?phpsession_start();?>Sesión iniciada con id <?= session_id() ?>.<br><a href="sesion_activa.php">Seguir</a>

• sesion_activa.php

<?phpsession_start();?>Sesión activa con id <?= session_id() ?>.<br><a href="finalizar_sesion.php">Salir</a>

• finalizar_sesion.php

<?phpsession_start();?>Destruidos los datos asociados a la sesión <?= session_id() ?>.<?phpsession_destroy();?>

Aunque es conveniente llamarla para destruir la sesión cuando haya dejado de ser útillo habitual es que los usuarios de Internet abandonen nuestra página web cerrando elnavegador y por lo tanto no tendremos ocasión de saber que la sesión ha dejado de sernecesaria.

Afortunadamente el servidor web dispone de mecanismos para eliminar una sesión sinnuestra intervención poniéndoles un tiempo de caducidad.

Programación en PHP

Página 122 de 143 Programación en PHP

Page 123: ProgramacionenPHP

Variables de sesión

Una de las características que nos aportan las sesiónes es parala posibilidad de darpersistencia a ciertos datos a través de diferentes páginas.

En las versiones actuales de PHP esto es muy sencillo ya que se usa el array global$_SESSION. Este es un array asociativo (parejas de nombre -> valor), que estádisponible en todas las páginas a partir del momento que se haya iniciado la sesión consession_start() . A este array le podemos añadir elementos o modificarlos de la formaque ya conocemos.

Las variables que queremos que estén disponibles en todas las páginas lasguardaremos en este array.

Ejemplo 5.3.3. Aquí se modifica el ejemplo anterior para, al iniciar la sesión, añadirle lafecha y hora de comienzo como parámetro. También se guarda un contador con laspáginas visitadas. Esta información se muestra luego en las páginas intermedias y enla final se muestra la duración de la sesión junto con un mensaje de despedida.

• iniciar_sesion.php

<?phpsession_start();

//Almaceno en la sesión el instante actual.$comienzo = mktime();$_SESSION["comienzo"] = $comienzo;

//Inicializo el contador de páginas vistas.$_SESSION["contador"] = 1;?>

Sesión iniciada el día<?= strftime("%d/%m/%Y", $_SESSION["comienzo"]) ?>a las<?= strftime("%H:%M:%S", $_SESSION["comienzo"]) ?><br>

<a href="sesion_activa.php">Seguir</a>

Programación en PHP

Plataforma de Teleformación de IFES Página 123 de 143

Page 124: ProgramacionenPHP

• sesion_activa.php

<?phpsession_start();

//Incremento el contador de páginas vistas$_SESSION["contador"]++;?>

Sesión activa desde el día<?= strftime("%d/%m/%Y", $_SESSION["comienzo"]) ?>a las<?= strftime("%H:%M:%S", $_SESSION["comienzo"]) ?><br>

Páginas visitadas<?= $_SESSION["contador"] ?>.<br>

<a href="sesion_activa.php">Seguir</a> - -<a href="finalizar_sesion.php">Salir</a>

• finalizar_sesion.php

<?phpsession_start();

//Incremento el contador de páginas vistas$_SESSION["contador"]++;

//Calculo la duración en segundos de la sesión.

Programación en PHP

Página 124 de 143 Programación en PHP

Page 125: ProgramacionenPHP

$ahora = mktime();$duracion = $ahora - $_SESSION["comienzo"];?>

La sesión ha durado<?= floor($duracion / 3600) ?>h<?= floor(($duracion % 3600) / 60) ?>m<?= floor(($duracion % 60)) ?>s.<br>

En ese tiempo ha visitado<?= $_SESSION["contador"] ?> páginas.<br>

<?phpsession_destroy();?>

En finalizar_sesion.php se han usado operaciones matemáticas básicas para convertiruna duración en segundos a un formato de horas, minutos y segundos.

Usos prácticos de las sesiones

La persistencia de datos hace posible programar en Internet aplicaciones complejas.Algunas de las funciones populares que se programan haciendo uso de sesiones sonlas siguientes.

• Control de acceso: Es uno de los usos principales, se piden unoscredenciales al usuario (p.ej: correo-e y contraseña en un formulario), estosse comprueban con los existentes en la base de datos y si se autoriza elacceso, se inicia una sesión. En dicha sesión se almacena un identificadordel usuario, de manera que no hay que autenticar al usuario en cada página.Esta sesión caducará automáticamente por seguridad, o permitiremos que elusuario salga de la aplicación.

• Personalización: Un usuario puede preferir ciertoscolores/propiedades/elementos en una aplicación web, y estos se mantienenpor todas las páginas de la aplicación.

• Comercio electrónico: Manteniendo las compras del usuario en un carrito

Programación en PHP

Plataforma de Teleformación de IFES Página 125 de 143

Page 126: ProgramacionenPHP

virtual, hasta que decida pagar. El carrito se almacena en la sesión y sepuede mostrar en cada página de una tienda virtual. En dicho carrito seañaden/quitan productos, el usuario se puede marchar a ver otra página yvolver a la tienda y ahi está su carrito (mientras dure la sesión).

• Replicación de aplicaciones web: Los sitios web con muchas visitaspueden necesitar de mas de un servidor web o base de datos por si fallaalgo. Las sesiones se replican entre todos los servidores, de manera que elusuario no pierde su información (p.ej: su compra) en caso de falla.

U.D.4. Control de acceso

De los usos habituales de las sesiones vamos a desarrollar más a fondo el control deacceso ya que es seguro que habrá alguna página que queramos que tenga accesorestringido .

Para ello lo habitual es disponer de un formulario en el que se pida el nombre deusuario y la contraseña y una zona privada de páginas a las que solo se puede accedersi se ha autentificado. Esto mismo se puede decir de forma más ortodoxa:

Ejemplo 5.4.1. Este sistema de control de acceso está compuesto por cuatro págionas.acceso.html es un formulario web que solicita un nombre de usuario y contraseña.Estos datos llegan a autenticar.php que comprueba si son válidos. Si es así añade a lasesión una variable autorizado con el valor "si" y redirecciona a la páginazona_privada.php. Si la contraseña introducida es erronea redirecciona a la páginano_autorizado.php y muestra un error y ofrece un enlace para volver a registrarse.

No basta con redireccionar a la zona privada si la contraseña es correcta. Las páginasde la zona privada han de tener un código al principio que comprueba que el usuarioestá autorizado (mediantte la variable autorizado). De no ser así se podría acceder aellas escribiendo la URL en la barra de direcciones del navegador.

Si se intenta acceder a una página protegida de la zona privada y no es ha pasado porel proceso de autenticarse se redirecciona a la página de error.

Este sistema es similar al que se usa en un parque de atracciones. Al entrar te ponenuna pulsera (autenticación ) y posteriormente, en cada atracción a la que se deseaentrar comprueban que llevas la pulsera (autorización ).

Se incluye también una página salir.php para destruir la sesión cuando se sale de lazona privada.

Programación en PHP

Página 126 de 143 Programación en PHP

Page 127: ProgramacionenPHP

• acceso.html

<html><head>

<title>Acceso a la zona privada</title></head><body>Introduzca sus datos.<table><form name="acceso" method="POST" action="autenticar.php">

<tr><td>Usuario: </td><td><input type="text" name="usuario" size="20"></td>

</tr><tr>

<td>Contraseña: </td><td><input type="text" name="contrasena" size="20"></td>

</tr><tr>

<td colspan="2" align="right"><input type="submit" value="Entrar">

</td></tr>

</form></table></body></html>

• autenticar.php

<?php

Programación en PHP

Plataforma de Teleformación de IFES Página 127 de 143

Page 128: ProgramacionenPHP

session_start();if (($usuario == "alicia") && ($contrasena == "xanadu")) {//Marco la sesión como autorizada

$_SESSION["autorizado"] = TRUE;

//Redirecciono a la zona privadaheader("location:zona_privada.php");

} else {session_destroy();

//Redirecciono a la página de acceso denegadoheader("location:no_autorizado.html");

}?>

• zona_privada.php

<?phpsession_start();if (!$_SESSION["autorizado"]) {

//Redirecciono a la página de acceso denegadoheader("location:no_autorizado.html");

}?>Bienvenido a la zona privada.<br><a href="salir.php">Salir</a>

• no_autorizado.php

<html><head>

<title>Acceso denegado</title></head><body><b>Acceso denegado.</b><br>La página a la que intenta acceder requiere autenticación.<br><a href="acceso.html">Ir a la página de entrada.</a></body></html>

• salir.php

<?php

Programación en PHP

Página 128 de 143 Programación en PHP

Page 129: ProgramacionenPHP

session_start();session_destroy();?>Gracias por utilizar nuestros servicios.<br><a href="acceso.html">Ir a la página de entrada.</a>

Ejemplo 5.4.2. Una primera mejora obvia es extraer el código que comprueba si unusuario está autorizado a una biblioteca (en este caso autorizar.php ) e incorporarlo acada página de la zona privada mediante un simple include() .

• autorizar.php

<?phpsession_start();

if (!$_SESSION["autorizado"]) {//Redirecciono a la página de acceso denegadoheader("location:no_autorizado.html");

}?>

• zona_privada.php

<?phpinclude("autorizar.php");

?>Bienvenido a la zona privada.<br><a href="salir.php">Salir</a>

Ejemplo 5.4.3. Una segunda mejora obvia es crear un archivo externo que contengalos datos de los usuarios del sistema. Hay que crear este archivo (usuarios.php ) ymodificar autenticar.php.

• usuarios.php

<?php//Array asociativo que contiene los usuarios registrados$contrasenas["alicia"] = "xanadu";$contrasenas["alberto"] = "catai";$contrasenas["marta"] = "bombay";?>

Programación en PHP

Plataforma de Teleformación de IFES Página 129 de 143

Page 130: ProgramacionenPHP

• autenticar.php

<?phpinclude("usuarios.php");

session_start();

if (($contrasenas[$usuario] == $contrasena)) {//Marco la sesión como autorizada$_SESSION["autorizado"] = TRUE;

//Redirecciono a la zona privadaheader("location:zona_privada.php");

} else {session_destroy();

//Redirecciono a la página de acceso denegadoheader("location:no_autorizado.html");

}?>

Ejemplo 5.4.4. Si se necesita una gestión un poco más avanzada de los usuarios sepuede hacer uso de la base de datos MySQL. En el script usuarios.sql se incluye unadefinición de la tabla usuarios y su inicialización con unos pocos datos. En el códigoPHP sólo hay que modificar el archivo autenticar.php . En este ejemplo se usa elarchivo importado conectar_bd.php mostrado en el ejemplo 4.4.2. para establecer laconexión a la base de datos

• usuarios.sql

CREATE DATABASE IF NOT EXISTS curso_php;USE curso_php;/* Definición de la tabla de usuarios */CREATE TABLE IF NOT EXISTS usuarios(

id INT PRIMARY KEY AUTO_INCREMENT,usuario CHAR(20),contrasena CHAR(20)

);/* Inicialización de la tabla de usuarios */INSERT INTO usuarios (usuario,contrasena)

VALUES ("alicia", "xanadu"),("alberto", "catai"),("marta", "bombay");

Programación en PHP

Página 130 de 143 Programación en PHP

Page 131: ProgramacionenPHP

• autenticar.php

<?phpinclude("conectar_bd.php");

session_start();

//Busco en la base de datos el usuario$sql = "SELECT * FROM usuarios WHERE "

. "usuario = '$usuario' "

. "AND contrasena = '$contrasena'";$res = mysql_query($sql, $con);$filas = mysql_num_rows($res);

if ($filas != 0) {//Marco la sesión como autorizada

$_SESSION["autorizado"] = TRUE;

//Redirecciono a la zona privadaheader("location:zona_privada.php");

} else {session_destroy();

//Redirecciono a la página de acceso denegadoheader("location:no_autorizado.html");

}?>

Al confrontar con los bases de datos no es ni siquiera necesario ver el resultado de laconsulta, nos basta con saber el número de líneas devueltas. Si la consulta devuelve 0registros (filas) es porque no ha tenido éxito al buscar al usuario cuyos datos han sidointroducidos en el formulario.

U.D.5. Registro de accesos

Apache tiene registros que miden el tráfico en nuestra página web y que,en combinación con programas como AWStats procesan esta información sobreaccesos a nuestro sitio y la muestran en páginas web con gráficas explicativas.

Pero puede haber casos en los que queramos registrar determinados eventos y asociaresta información a la persona que los está produciendo. El evento más típico en estecaso es un acceso a la zona privada de nuestra página web.

Programación en PHP

Plataforma de Teleformación de IFES Página 131 de 143

Page 132: ProgramacionenPHP

Registro de accesos en un fichero de texto

Esta es la forma más sencilla. Hay un fichero en el servidor que guarda en cada líneaun intento de acceso. Se va a optar por un diseño modular que, como se verá másadelante, tiene muchas ventajas.

Ejemplo 5.5.1. Tomamos como base el ejemplo 5.4.4. de la unidad didáctica anterior.Se supone que ya existe la tabla usuarios . En este caso le vamos a añadir una funciónregistrar_acceso() que recibe un id de usuario y graba un registro de su entrada. Si sele pasa el valor -1 graba un intento fallido de entrada.

<?php// Función que registra la entrada de un usuario//Si recibe una id de usuario -1 es que el acceso ha sido fallidofunction registrar_acceso($id_usuario) {

$ahora = mktime();$mensaje = strftime("%d-%m-%Y %H:%M:%S ", $ahora); if ($id_usuario

!= -1) {$mensaje .= "El usuario con id $id_usuario "

. "ha entrado a la zona privada.";} else {

$mensaje .= "Intento fallido de acceso a la zona privada.";}$archivo = fopen("accesos.txt", "a");fwrite($archivo, "$mensaje\r\n");fclose($archivo);

}?>

Este es el programa completo autenticar.php (se han eliminado algunos comentariospara darle mayor claridad).

<?phpinclude("conectar_bd.php");

// Función que registra la entrada de un usuario//Si recibe una id de usuario -1 es que el acceso ha sido fallidofunction registrar_acceso($id_usuario) {

$ahora = mktime();$mensaje = strftime("%d-%m-%Y %H:%M:%S ", $ahora);

if ($id_usuario != -1) {$mensaje .= "El usuario con id $id_usuario "

. "ha entrado a la zona privada.";

Programación en PHP

Página 132 de 143 Programación en PHP

Page 133: ProgramacionenPHP

} else {$mensaje .= "Intento fallido de acceso a la zona privada.";

}$archivo = fopen("accesos.txt", "a");fwrite($archivo, "$mensaje\r\n");fclose($archivo);

}

session_start();

//Busco en la base de datos el usuario$sql = "SELECT * FROM usuarios WHERE "

. "usuario = '$usuario' "

. "AND contrasena = '$contrasena'";$res = mysql_query($sql, $con);if (mysql_num_rows($res) != 0) {

$_SESSION["autorizado"] = TRUE; $id = mysql_result($res, 0, "id");registrar_acceso($id); header("location:zona_privada.php");

} else {session_destroy(); registrar_acceso(-1);

header("location:no_autorizado.html");}?>

Tras varios accesos a esta página podemos ver el siguiente registro.

Registro de accesos en la base de datos

En lugar de guardar el acceso en un fichero de textos también se puede guardar en labase de datos. Para ello necesitaremos una tabla que llamaremos accesos y cuyadefinición es la siguiente.

CREATE DATABASE IF NOT EXISTS curso_php;USE curso_php;/* Definición de la tabla de usuarios */CREATE TABLE IF NOT EXISTS accesos(

Programación en PHP

Plataforma de Teleformación de IFES Página 133 de 143

Page 134: ProgramacionenPHP

id_usuario INT PRIMARY KEY AUTO_INCREMENT,hora_acceso DATETIME);

Ejemplo 5.5.2. Para guardar en la base de datos solo ha sido necesario modificar lafunción registrar_acceso.

<?phpinclude("conectar_bd.php");// Función que registra la entrada de un usuario// Si recibe una id de usuario -1 es que el acceso ha sido fallidofunction registrar_acceso($id_usuario) {

global $con; $ahora = mktime();$fecha_mysql = strftime("%Y-%m-%d %H:%M:%S ", $ahora); $sql =

"INSERT INTO accesos (id_usuario, hora_acceso) ". "VALUES ($id_usuario, '$fecha_mysql')";

mysql_query($sql, $con);}?>

En esta ocasión los accesos se pueden ver mediante la consola de MySQL.

Registro de eventos asociados a un usuario

Para poder registrar otros eventos de un usuario, aparte del acceso, la aplicación webtiene que conocer en todo momento qué usuario es el activo. Para ello, al autenticar aun usuario, hay que guardar su identidad en una variable de sesión.

Ejemplo 5.5.3. Hemos modificado el código de autenticar.php para almacenar unanueva variable de sesión con el id del usuario. Este id se puede usar más adelantepara personalizar los contenidos de las páginas que vea el usaurio, además de paracrear un registro de sus acciones.

<?phpinclude("conectar_bd.php");

session_start();

//Busco en la base de datos el usuario

Programación en PHP

Página 134 de 143 Programación en PHP

Page 135: ProgramacionenPHP

$sql = "SELECT * FROM usuarios WHERE ". "usuario = '$usuario' ". "AND contrasena = '$contrasena'";

$res = mysql_query($sql, $con);

if (mysql_num_rows($res) != 0) {$_SESSION["autorizado"] = TRUE;

$id = mysql_result($res, 0, "id");$_SESSION["id_usuario"] = $id; registrar_acceso($id);

header("location:zona_privada.php");} else {

session_destroy();registrar_acceso(-1); header("location:no_autorizado.html");

}?>

U.D.6. Plantillas

Uno de los objetivos que hemos ido persiguiendo a lo largo del curso es la separacióndel código HTML del PHP. Los sistemas plantillas suponen una contribución en estesentido ya que separan en diferentes archivos la presentación (el código HTML con eldiseño) de la lógica (el código PHP que realiza operaciones con los datos.

DTemplate

PHP no incorpora ningún sistema de plantilas en la librería de funciones del núcleo porlo que tendremos que hacer uso de una librería desarrollada por un tercero. En estecaso hemos elegido la librería DTemplate desarrollada por Peter Mallet por lossiguientes ventajas.

• Es muy fácil de instalar.• Es fácil aprender su funcionamiento.

Otros sistemas de plantillas más avanzados y completos usan una sintaxis similar aDTemplate, por lo que podremos aplicar lo que aprendamos a esos sistemas sipreferimos una versión más potente.

DTemplate se puede descargar desde este enlace.

http://prdownloads.sourceforge.net/dtemplate/dtemplate-120.zip

Programación en PHP

Plataforma de Teleformación de IFES Página 135 de 143

Page 136: ProgramacionenPHP

Instalación

DTemplate no requiere ninguna instalación especial. Lo único necesario es que elarchivo class.DTemplate.php se encuentre en el mismo directorio que las páginas PHPque usan plantillas.

Esquema de funcionamiento

Para usar plantillas hay que seguir los siguientes pasos.

• Definir la plantilla y sus variables.• Usar la plantilla dentro de la página PHP. Esto consta de:• • Crear una instancia de la librería y asociarla a la plantilla que

queremos usar.• Asignar valores a las variables.• Interpretar la plantilla y mostrarla.

Definición de la plantilla

Una plantilla es un documento que contiene exclusivamente código HTML y variables.Hay que crearla independientemente del código PHP. Algunas aplicaciones de diseñoweb se pueden configurar para trabajar con plantillas.

Las plantillas las guardaremos con la extensión .tpl (del inglés template).

Es importante tener en cuenta que no se puede poner código PHP en las plantillas.

Variables de plantilla

Las variables en las plantilas las reconoceremos porque se escriben entre corchetes " {... } " y contienen un identificador de la variable que normalmente escribiremos enmayúsculas y sin espacios en blanco. No hay que confundir las variables de plantillacon las variables de PHP.

{VARIABLE }

Ejemplo 5.6.1. La siguiente es una plantilla muy sencilla que tiene como variables eltítulo de la página y el mensaje dentro del cuerpo de la misma. La guardaremos con elnombre plantilla_mensaje.tpl.

<html><head>

Programación en PHP

Página 136 de 143 Programación en PHP

Page 137: ProgramacionenPHP

<title>{TITULO}</title></head><body>

{MENSAJE}</body></html>

Uso de la plantilla dentro de la página PHP

Antes de hacer uso de la librería hay que importarla mediante la sentencia include() .

<?phpinclude("class.DTemplate.php");//...

En primer lugar hay que crear una instancia de la librería y asignarla a una variable.Esto se hace con la instrucción new de la siguiente forma.

$tpl = new DTemplate();

Una vez creada una instancia de la librería, para hacer uso de las funciones de lalibrería lo haremos con la siguiente sintaxis.

$tpl -> funcion_de_DTemplate ();

define_template()

La primera función que usaremos nos servira para indicarle a la librería donde seencuentran los archivos .tpl con definiciones de plantillas. Esta función asocia unidentificador a una plantilla.

$tpl -> define_template("identificador ", "plantilla.tpl ");

Si son varias las plantillas podemos definirlas sucesivamente llamando una vez a estafunción por cada plantilla.

assign()

Programación en PHP

Plataforma de Teleformación de IFES Página 137 de 143

Page 138: ProgramacionenPHP

Esta función asigna un valor a una variable que esté presente en una definición deplantilla. Hay que asignar valores a todas las variables que aparezcan en la plantilla.

$tpl -> assign("VARIABLE ", valor );

process()

En este paso se interpretan las variables de la plantilla sustituyéndolas por los valoresque se les dieron al asignarlas.

$tpl -> process(identificador_plantilla );

DPrint()

Al final del script PHP hay que llamar a esta función para que pinte el resultado porpantalla.

$tpl -> DPrint(identificador_plantilla );

Ejemplo 5.6.2. Parecen muchas funciones y su uso un tanto enrevesado. Perosu aplicación es inmediata, solo hay que estar pendiente de cuales son las variables deplantilla. Afortunadamente como las escribimos en mayúsculas resulta fácildistinguirlas. Haremos uso de la definición de plantilla plantilla_mensaje.tpl que se creóen el ejemplo anterior.

<?phpinclude("class.DTemplate.php");

$titulo = "Prueba de plantillas";$mensaje = "¡Hola Mundo!";

$tpl = new DTemplate();$tpl -> define_template("plantilla", "plantilla_mensaje.tpl");$tpl -> assign("TITULO", "$titulo");$tpl -> assign("MENSAJE", "$mensaje");$tpl -> process("plantilla");$tpl -> DPrint("plantilla");?>

Plantillas anidadas

Programación en PHP

Página 138 de 143 Programación en PHP

Page 139: ProgramacionenPHP

Al igual que se le puede asignar a una variable de plantilla un valor, se le puede asignartambién el resultado de procesar una plantilla. De esta forma se pueden componerpáginas con muchos elementos a partir de trozos de código sencillos.

fetch()

La función fetch() nos resultará útil para conocer el resultado de la plantilla yaprocesada. Este resultado se usará luego como contenido de otra plantilla.

$tpl -> fetch(identificador_plantilla );

Ejemplo 5.6.3. Aquí se usa una plantilla principal cuyas dos variables{DATOS_COMERCIO} y {LISTA_PRECIOS} se rellenan haciendo uso de otras dosplantillas, una con los datos de una frutería y otra con una lista de precios.

• Plantilla ficha.tpl

<html><head>

<title>Ficha del establecimiento</title></head><body>

{DATOS}<br>

<hr>{LISTA_PRECIOS}</body>

</html>

• Plantilla datos.tpl

<b>{NOMBRE}</b><br>{DIRECCION}<br>{TELEFONO}<br><a href="mailto:{EMAIL}">{EMAIL}</a>

• Plantilla lista_precios.tpl

{PRECIOS}

El código PHP modificado que procesa las plantillas es el siguiente.

Programación en PHP

Plataforma de Teleformación de IFES Página 139 de 143

Page 140: ProgramacionenPHP

• ficha_comercio.php

<?phpinclude("class.DTemplate.php");

$nombre_comercio = "Frutería Pernambuco";$direccion_comercio = "c/ Don Juan Tenorio 17";$tfno_comercio = "866 713 137";$email_comercio = "[email protected] ";$productos = array("Limones", "Naranjas", "Peras", "Tomates");$precioskg = array("Limones" => 3.50,

"Naranjas" => 1.80,"Peras" => 1.20,"Tomates" => 2.40);

$tpl = new DTemplate();$tpl -> define_template("ficha", "ficha.tpl");$tpl -> define_template("datos", "datos.tpl");$tpl -> define_template("lista_precios", "lista_precios.tpl");

//Asignamos primero valores a la plantilla datos$tpl -> assign("NOMBRE", $nombre_comercio);$tpl -> assign("DIRECCION", $direccion_comercio);$tpl -> assign("TELEFONO", $tfno_comercio);$tpl -> assign("EMAIL", $email_comercio);$tpl -> process("datos");

//Asignamos los valores a la plantilla con la lista de precios$precios = "";for ($i = 0; $i < count($productos); $i++) {

$precios .= "$productos[$i] {$precioskg[$productos[$i]]} ". "euros/kg<br>";

}$tpl -> assign("PRECIOS", $precios);$tpl -> process("lista_precios");

//Juntamos las dos plantillas procesadas dentro de la ficha$tpl -> assign("DATOS", $tpl -> fetch("datos"));$tpl -> assign("LISTA_PRECIOS", $tpl -> fetch("lista_precios"));$tpl -> process("ficha");$tpl -> DPrint("ficha");?>

Programación en PHP

Página 140 de 143 Programación en PHP

Page 141: ProgramacionenPHP

Plantillas anidadas en bucles

Esta estrategia se sigue en plantillas en las que hay un tipo de elemento que se repitemuchas veces, como pueden ser las filas de un listado.

Ejemplo 5.6.4. Sería mucho más práctico poner la lista de precios en una tabla. Elproblema es que con los mecanismos que conocemos hasta ahora esto nos requeriríaguardar en una variable también las etiquetas de comienzo y final de fila y de comienzoy final de celda <tr><td>...</td></tr> .

En lugar de esto vamos a hacer una nueva plantilla para cada fila.

• Plantilla producto.tpl

<tr><td>{NOMBRE_PRODUCTO}</td><td align="right">{PRECIO} euros el kg.</td>

</tr>

También hay que adaptar la plantilla lista_precios.tpl para que use una tabla.

• Plantilla lista_precios.tpl

<table border="1" width="300">{PRODUCTO}</table>

El código PHP modificado que procesa las plantillas es el siguiente.

• ficha_comercio.php

<?phpinclude("class.DTemplate.php");

$titulo = "Ficha";$nombre_comercio = "Frutería Pernambuco";$direccion_comercio = "c/ Don Juan Tenorio 17";$tfno_comercio = "866 713 137";$email_comercio = "[email protected] ";$productos = array("Limones", "Naranjas", "Peras", "Tomates");$precioskg = array("Limones" => 3.50,

"Naranjas" => 1.80,"Peras" => 1.20,

Programación en PHP

Plataforma de Teleformación de IFES Página 141 de 143

Page 142: ProgramacionenPHP

"Tomates" => 2.40);

$tpl = new DTemplate();$tpl -> define_template("ficha", "ficha.tpl");$tpl -> define_template("datos", "datos.tpl");$tpl -> define_template("lista_precios", "lista_precios.tpl");$tpl -> define_template("producto", "producto.tpl");

//Asignamos primero valores a la plantilla datos$tpl -> assign("NOMBRE", $nombre_comercio);$tpl -> assign("DIRECCION", $direccion_comercio);$tpl -> assign("TELEFONO", $tfno_comercio);$tpl -> assign("EMAIL", $email_comercio);$tpl -> process("datos");

//Añadimos una a una las filasfor ($i = 0; $i < count($productos); $i++) {

$tpl -> assign("NOMBRE_PRODUCTO", $productos[$i]);$tpl -> assign("PRECIO", $precioskg[$productos[$i]]);

//Es necesario procesar una vez por cada fila$tpl -> process("producto");

}

//Asignamos este resultado a la plantilla lista_precios$tpl -> assign("PRODUCTO", $tpl -> fetch("producto"));$tpl -> process("lista_precios");

//Juntamos las dos plantillas procesadas dentro de la ficha$tpl -> assign("TITULO", $titulo);$tpl -> assign("DATOS", $tpl -> fetch("datos"));$tpl -> assign("LISTA_PRECIOS", $tpl -> fetch("lista_precios"));$tpl -> process("ficha");$tpl -> DPrint("ficha");?>

El resultado final es el siguiente.

Programación en PHP

Página 142 de 143 Programación en PHP

Page 143: ProgramacionenPHP

La librería DTemplate tiene muchas otras funciones y otros modos de acceder a lasmismas que pueden servir para múltiples situaciones. Quien esté interesado puedeampliar conocimientos con la documentación del producto.

Programación en PHP

Plataforma de Teleformación de IFES Página 143 de143