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 Evaluación inicial...................................................................... 4 Módulo I. Introducción............................................................... 5 U.D.1. Lenguajes de programación Web...................................... 5 U.D.2. ¿Qué es PHP?............................................................ 9 U.D.3. ¿Qué es apache?....................................................... 12 U.D.4. Instalación................................................................. 13 Página estática / dinámica...................................................... 21 Resumen módulo I............................................................... 21 Práctica: nuestra primera página web........................................ 21 Autoevaluación módulo I........................................................ 22 Módulo II. Conceptos básicos..................................................... 25 U.D.1. Panorámica del lenguaje............................................... 25 U.D.2. Variables................................................................... 31 U.D.3. Operadores............................................................... 35 U.D.4. Sentencias de control................................................... 45 Resumen módulo II.............................................................. 58 Práctica: conceptos básicos.................................................... 58 Autoevaluación módulo II....................................................... 58 Módulo III. Conceptos avanzados................................................ 62 U.D.1. Cadenas................................................................... 62 U.D.2. Arrays...................................................................... 73 U.D.3. Funciones................................................................. 83
Plataforma de Teleformación de IFES
Página 1 de 240
U.D.4. Formularios............................................................... 94 U.D.5. Manejo de ficheros.....................................................105 Resumen módulo III............................................................ 114 Práctica: Conceptos avanzados.............................................. 114 Autoevaluación módulo III..................................................... 114 Práctica intermedia................................................................ 118 Evaluación primera................................................................ 119 Módulo IV. PHP y las bases de datos......................................... 120 U.D.1. Estructura de una aplicación web con bases de datos.......... 120 U.D.2. ¿Qué es MySQL?...................................................... 122 U.D.3. El lenguaje SQL........................................................ 123 U.D.4. Funciones de PHP con MySQL..................................... 154 Arquitectura de 3 capas....................................................... 162 Resumen módulo IV............................................................ 162 Práctica: PHP y las bases de datos......................................... 163 Autoevaluación módulo IV..................................................... 163 Videotutoriales................................................................... 166 Servidor local XAMPP....................................................... 166 Crear una base de datos................................................... 166 Evaluación segunda............................................................... 167 Módulo V. Aplicaciones comunes en PHP.................................... 168 U.D.1. Fecha y hora............................................................ 168 U.D.2. Envío de correo electrónico.......................................... 175 U.D.3. Sesiones................................................................. 183 U.D.4. Control de acceso...................................................... 191 U.D.5. Registro de accesos................................................... 201 U.D.6. Plantillas................................................................. 206 Resumen módulo V............................................................ 215 Práctica: Aplicaciones comunes en PHP................................... 215 Autoevaluación módulo V..................................................... 215 Evaluación tercera................................................................. 219 Página 2 de 240
Programación en PHP
Práctica final........................................................................ 220 Evaluación final.....................................................................221 Glosario.............................................................................. 222 FAQ................................................................................... 235 Bibliografía.......................................................................... 238 Enlaces.............................................................................. 239
Plataforma de Teleformación de IFES
Página 3 de 240
Programación en PHP
Evaluación inicial Este recurso es de tipo Evaluación. Debe conectarse a la plataforma para realizar la evaluación. Recuerde que las evaluaciones son obligatorias ya que determinan la nota final.
Página 4 de 240
Programación en PHP
Programación en PHP
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 poco interactivas. Solo permitían mostrar información (texto o imágenes) y seguir enlaces a nuevas páginas. Para compensar esta falta de interactividad aparecieron los lenguajes de programación del lado del cliente (el navegador de Internet) que permitían una interactividad limitada. En esta categoría el principal lenguaje es Javascript. Un ejemplo típico de programación mediante Javascript es el de un menú jerárquico desplegable. Pero hay multitud de funcionalidades que están fuera del alcance de los lenguajes de programación en el cliente. La interactividad que permiten se reduce prácticamente a mejorar la apariencia de la información en la página web, y a añadir efectos visuales que aunque puedan ser curiosos no aportan un valor añadido. Con la llegada de los lenguajes del lado del servidor aparecieron las primeras páginas diná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 una temática es una página dinámica. La Plataforma de Teleformación de IFES es también una 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ámica hay que tener presente el proceso que sigue una página web desde que la solicitamos (haciendo clic en un enlace del navegador) hasta que la recibimos y se muestra por pantalla.
Plataforma de Teleformación de IFES
Página 5 de 240
Página estática
Elementos del proceso: a) Navegador. Aplicación que permite al usuario recibir y mostrar pá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áginas web y mostrar los resultados. Para esto hace uso del Navegador. c) Internet. Red informática mundial, descentralizada, formada por la conexión directa entre computadoras u ordenadores mediante un protocolo especial de comunicación. d) Servidor web (hardware). Ordenador conectado a Internet que aloja páginas web. e) Servidor web (software). Programa que transfiere páginas web a los clientes mediante el protocolo HTTP.
Página 6 de 240
Programación en PHP
El término servidor web se usa indistintamente para denominar tanto al ordenador conectado a Internet que aloja páginas web como a la aplicación software que gestiona la transferencia de páginas web.
Página dinámica
Ahora hay un nuevo elemento, el servidor de aplicación. f) Servidor de aplicación . Es el programa que colabora con el servidor web para generar páginas dinámicas. A diferencia de las páginas estáticas, en las que se guardaba en el disco duro del servidor web el archivo html, las páginas dinámicas no están directamente almacenadas en el disco duro del servidor web. En su lugar, hay un programa que se ejecuta en el servidor de aplicaciones, que es el encargado de crear el archivo que se transferirá al cliente.
Plataforma de Teleformación de IFES
Página 7 de 240
Lenguajes de programación web Para generar páginas web se han usado a lo largo del tiempo un gran número de tecnologí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ón CGI (Common Gateway Interface o Pasarela de Interfaz Común). Hoy en día aún hay aplicaciones 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 construir páginas web dinámicas. El código se escribía de forma casi artesanal y era difícil de mantener y actualizar. Además el código que funcionaba en un servidor web podía no funcionar en otro o requerir de un esfuerzo grande para su instalación. Para colmo de todos los males, por lo general, los CGI son poco eficientes. Afortunadamente hoy en día el panorama ha cambiado. El éxito de Internet ha ido acompañado de la aparición de lenguajes de programación web que faciliten todo el proceso. Para especializarse en la creación de páginas web dinámicas estos lenguajes intentan 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ías disponibles, que lanzan los fabricantes con la intención de acaparar la mayor cuota de mercado posible. Aun así, hay tres tecnologías mediante las cuales se desarrollan la mayoría de los sitios web.
ASP- Active Server Pages Ésta es una tecnología propietaria de Microsoft. Actualmente está engloba en su estrategia .NET. Su principal ventaja es su sencillez, además de una muy buena integración con otros productos de Microsoft como su entorno de desarrollo .NET que permite crear aplicaciones en un tiempo récord. Se integra muy bien con el servidor web de Microsoft, el IIS (Internet Information Center).
Página 8 de 240
Programación en PHP
JSP - Java Server Pages Ésta 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 tres pero a su vez el más potente. La gran comunidad de usuarios garantiza la existencia de numerosas herramientas, librerías de código abierto y bases de conocimiento. Además se integra muy bien en el servidor web 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 e impulsado por una gran comunidad de programadores. Además es el más sencillo de los tres, por lo que atrae a usuarios de muy diferentes procedencias: programadores en lenguajes de programación más generalistas, diseñadores que desean completar sus conocimientos...
U.D.2. ¿Qué es PHP?
Un poco de historia Ya hemos visto que PHP responde a las siglas PHP Hypertext Procesor. Pero, ¿como surgió? En el año 1994 el programador danés-canadiense Rasmus Lerdorf lo creó para poder programar su página web personal, que consistía básicamente en un currículum vítae y un registro del tráfico que recibía. Un año más tarde lo publicó con el nombre de Personal Home Page Tools. En 1997 atrajo el interés de dos programadores israelíes del Technion que rescribieron el intérprete gramatical de este lenguaje creando la base de la primera versión realmente popular de PHP, PHP 3. En 1999 rescribieron el lenguaje y lo dotaron de mayor eficiencia mediante el motor Zend, dando lugar a la versión PHP 4. La 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 ventajas que provee el nuevo Zend Engine 2. Los cambios que incorpora la versión son notables, y posicionan a PHP como un lenguaje dinámico muy potente.
Plataforma de Teleformación de IFES
Página 9 de 240
Mientras se escriben estas líneas, se está trabajando en la versión 6 de PHP, aunque todavía no hay una fecha prevista para su lanzamiento.
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 otros lenguajes. En el código fuente se mezclan habitualmente fragmentos de código PHP con el cuerpo de la página HTML, generando dinámicamente el contenido de la 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 los sistemas operativos. También existen módulos interprete para casi todos los servidores web, y en muchos de ellos viene ya instalado en el paquete bá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, Postgres, Oracle, SQL Server...
Un uso común es dotar a una aplicación web de un servidor de base de datos, en el mundo PHP y Apache ésta es MySQL, lo que en conjunto se ha denominado como la solución LAMP (Linux, Apache, MySQL y Php).
Página 10 de 240
Programación en PHP
Durante este curso se recomienda el uso de Xampp 1.7.3, un servidor web local que podrá instalar en su ordenador, que viene con Apache, la versión 5.3.1 de PHP y la herramienta gráfica phpMyAdmin 3.2.4 para gestionar bases de datos MySql. Más adelante veremos cómo descargar, instalar y configurar este software libre.
¿Por qué PHP? Hay muchas razones para aprender a usar PHP: • • • •
Como ya se ha dicho con anterioridad el aprendizaje de este lenguaje es muy sencillo. No obstante PHP ofrece muchas características avanzadas al alcance del programador experto. Es seguro y robusto, cumpliendo con las exigencias de cualquier entorno profesional. Es gratuito (open source), por lo que ha atraído a una gran comunidad de usuarios. Todos contribuyen de una u otra forma. Los desarrolladores
Plataforma de Teleformación de IFES
Página 11 de 240
• •
expertos arreglando errores y aportando mejoras, los usuarios testeando el código e intercambiando ideas que podrían mejorar el lenguaje. Existe una gran cantidad de aplicaciones de código abierto que están desarrolladas en PHP. Conociendo PHP se tiene siempre la posibilidad de ampliarlas, personalizarlas y darles el mantenimiento adecuado. La práctica totalidad de los proveedores de alojamiento de páginas web ofrece 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 carácter no lucrativo, la Apache Software Foundation (ASF). La ASF no solo desarrolla el servidor HTTP Apache, también engloba múltiples proyectos, algunos como extensiones del servidor web y otros independientes. Dentro de toda la gama de servidores web, Apache es sin duda el que mejor considerado está por parte de los usuarios. La prueba es que cerca del 60% de los sitios web están alojados en servidores de este tipo (estadísticas de enero de 2011 de http://news.netcraft.com/archives/web_server_survey.html). Apache se ha ganado la confianza de los usuarios principalmente debido a las siguientes 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 usuarios que contribuyen a su continua mejora.
La mayor objeción que se le ha puesto a Apache es que no dispone de un modo gráfico amigable para su configuración, por lo que su aprendizaje puede suponer más esfuerzo que el de otros servidores. Durante este curso se propone la utilización de Apache como servidor al que se le añade como extensión el interprete de PHP.
Página 12 de 240
Programación en PHP
Otros servidores web La ventaja de este servidor es que dispone de un interfaz gráfico amigable que hace más sencilla su instalación, configuración y despliegue de sitios web. Existen otros servidores, que, o bien son pequeños productos con pocas características, o bien son 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 hemos visto, 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 siguientes desventajas: • • •
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 con agilidad.
La solución no puede ser más sencilla. Haremos que nuestro ordenador actúe como servidor web. A esta forma de trabajo se le llama coloquialmente desarrollar en local. Dependiendo de las habilidades de cada uno en el manejo e instalación de aplicaciones un poco más complejas, como es el caso que nos lleva, del servidor Apache y su módulo para PHP, se necesitaría un curso para todo ello. Apache se ha criticado en este aspecto de no contar con una instalación y/o configuración gráfica/ amigable al usuario, tanto novel como experto. Afortunadamente existen en el mercado soluciones que integran todo lo que necesitamos para trabajar, y además disponen de los llamados instaladores automáticos, que nos dejan preparado y, lo más importante, configurado de manera homogé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 cubre varios sistemas operativos (Windows, GNU/Linux y Mac), como dijimos anteriormente, se llama XAMPP y la versión será la 1.7.3. En el curso vamos a usar la versión para Windows, que será la referente por facilidad de uso para los usuarios menos avanzados, aunque veremos algunas pantallas de Linux como alternativa (99% idénticas).
Plataforma de Teleformación de IFES
Página 13 de 240
En Linux y otros sistemas, podemos usar XAMPP o nos instalaremos Apache+PHP +MySQL por nuestra cuenta. Esto último para usuarios avanzados, dado que hay que configurar el sistema, aunque últimamente, en algunas distribuciones de Linux es muy sencillo que el sistema nos instale y configure todo por si mismo bajo demanda.
XAMPP en la versión elegida instala las siguientes versiones de Apache, Php y Mysql: • • •
Apache: versión 2.2.14 Php: versión 5.3.1 PhpMyAdmin: versión 3.2.4
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 el momento de realizar el curso puede encontrarse en una versión posterior. De todas formas es de esperar que la instalación siga siendo muy similar o igual. Descargamos la versión deseada según el sistema operativo que tengamos desde las direcciones siguientes: • •
Windows: http://www.apachefriends.org/en/xampp-windows.html Linux: http://www.apachefriends.org/en/xampp-linux.html
Instalación paso a paso sobre Windows 1. Ejecutamos el fichero descargado. Nos aparecerá la siguiente ventana preguntándonos dónde instalará XAMPP:
Página 14 de 240
Programación en PHP
Le dejamos los valores que trae y hacemos clic en Install. En C:\ crearรก el directorio xampp. 2. Una vez instalado, entramos en la carpeta C:\xampp y ejecutamos el archivo xamppcontrol. Nos mostrarรก la siguiente ventana:
Plataforma de Teleformaciรณn de IFES
Pรกgina 15 de 240
3. Para poner en funcionamiento el servidor apache, haremos clic en el botón Start que tiene a su derecha. También haremos clic en el botón que hay a la derecha de MySql. Si todo ha ido bien, nos aparecerá la siguiente pantalla:
Página 16 de 240
Programación en PHP
La cual nos muestra el texto ”Running”, lo que indica que tanto Apache como Mysql están en funcionamiento. Mientras estemos utilizando PHP y/o MySql no debemos cerrar esta ventana. Cuando queramos dejar de usar XAMPP no se debe terminar haciendo clic en el botón cerrar de la ventana, ya que esto lo que hace es minimizar el programa junto al reloj que hay abajo a la derecha. Deberemos hacer clic en el botón Exit. Si XAMPP se ha quedado minimizado, al hacer clic sobre el icono, se muestra la ventana de control. 4. Vamos a comprobar que Apache está funcionando, para ello vamos a ir a la dirección http://localhost con nuestro navegador favorito y deberíamos ver la siguiente página:
Plataforma de Teleformación de IFES
Página 17 de 240
Esta página web está siendo servida por Apache y PHP (mira la dirección en el navegador). Pulsaremos en el idioma español (Spanish ) para continuar. 5. Pulsaremos en el enlace Estado para probar toda la instalación definitivamente:
Página 18 de 240
Programación en PHP
Deberíamos tener todos los componentes con el estado Activado (color verde) menos los tres últimos (color rojo). Los scripts que creemos deben estar guardados en la carpeta htdocs. Dentro de esta carpeta podremos crear más carpetas. Por ejemplo, si tengo la ruta c:\xampp \htdocs\ejercicios\ejercicio1.php, para probar mi script, en el navegador, y una vez funcionando XAMPP, escribiré lo siguiente http://localhost/ejercicios/ejercicio1.php y nuestro navegador deberá mostrar lo que haga nuestro script.
Instalación paso a paso sobre Linux 1. Entre como administrador root en su sistema Linux Su 2. Descomprima el archivo que ha bajado en /otp tar xvfz xampp-linux-1.7.3a.tar.gz –C /opt
Plataforma de Teleformación de IFES
Página 19 de 240
Use sólo este comando para instalar XAMPP. No use ninguna herramienta de Windows para descomprimir el archivo ya que no funcionará. Si tiene una versión anterior, ésta será sobrescrita.
Esto es todo. XAMPP ya está instalado en el siguiente directorio /opt/lampp 3. Para que XAMPP empiece a funcionar, escriba el siguiente comando: /opt/lampp/lampp start y en su pantalla deberá aparecer lo siguiente: Starting XAMPP 1.7.3a... LAMPP: Starting Apache... LAMPP: Starting MySQL... LAMPP started. Lo que indica que Apache y MySql están ejecutándose. Para detener XAMPP deberemos escribir el siguiente comando: /opt/lampp/lampp stop y en la pantalla deberá aparecer el siguiente mensaje: Stopping LAMPP 1.7.3a... LAMPP: Stopping Apache... LAMPP: Stopping MySQL... LAMPP stopped. 4. Vamos a comprobar que está funcionando. Para ellos escribiremos en nuestro navegador favorito: http://localhost (XAMPP debe estar ejecutándose). Si todo ha ido bien, deberíamos ver la siguiente pantalla
Página 20 de 240
Programación en PHP
Los scripts que creemos deben estar guardados en el siguiente directorio /opt/lampp/ htdocs/. Dentro de ese directorio podremos crear más directorios. Por ejemplo, si tengo la ruta /opt/lampp/htdocs/ejercicios/ejercicio1.php, para probar mi script, en el navegador, y una vez funcionando XAMPP, escribiré lo siguiente http://localhost/ ejercicios/ejercicio1.php y el navegador deberá mostrar lo que haga nuestro script.
Página estática / dinámica Este recurso es de tipo Multimedia. Tiene que conectarse a la plataforma para acceder a este recurso.
Resumen módulo I Este recurso es de tipo Multimedia. Tiene que conectarse a la plataforma para acceder a este recurso.
Plataforma de Teleformación de IFES
Página 21 de 240
Práctica: nuestra primera página web Este recurso es de tipo Práctica. Tiene que conectarse a la plataforma para acceder a este recurso.
Autoevaluación módulo I Pregunta 1: Javascript es un lenguaje de programación que se ejecuta en la máquina cliente. • •
Verdadero Falso
Respuesta correcta: Verdadero Pregunta 2: Las páginas dinámicas se almacenan en el disco duro del servidor y cuando son solicitadas posteriormente, se recuperan y transfieren sin ningún procesado previo. • Verdadero • Falso Respuesta correcta: Falso Pregunta 3: Se puede programar una página web dinámica en el lenguaje de uso general C++ y comunicarla con el servidor web mediante la especificación CGI. • Verdadero • Falso Respuesta correcta: Verdadero Pregunta 4: PHP se encuentra actualmente en su versión 6. • •
Verdadero Falso
Respuesta correcta: Falso
Página 22 de 240
Programación en PHP
Pregunta 5: PHP no permite interconectividad de forma nativa con bases de datos. • Verdadero • Falso Respuesta correcta: Falso Pregunta 6: Una de las razones del éxito de PHP es que es un producto de pago y por lo tanto el usuario puede reclamar nuevas características. • Verdadero • Falso Respuesta correcta: Falso Pregunta 7: La solución LAMP consiste en un servidor web con: Linux, Apache, MySQL y PHP.
• •
Verdadero Falso
Respuesta correcta: Verdadero Pregunta 8: Instalar un servidor Apache es, por lo general, un proceso complejo que sólo está al alcance de usuarios expertos. • Verdadero • Falso Respuesta correcta: Verdadero Pregunta 9: La dirección base en la que se pueden ver las páginas que sirve nuestro servidor Apache‚ en local es http://localhost • Verdadero • Falso Respuesta correcta: Verdadero Pregunta 10:
Plataforma de Teleformación de IFES
Página 23 de 240
Las páginas web que queramos alojar en nuestro servidor de Apache en local las deberemos poner por debajo de C:\xampp\htdocs\ (donde C:\xampp es el directorio en el que hemos intalado Apache). • Verdadero • Falso Respuesta correcta: Verdadero
Página 24 de 240
Programación en PHP
Programación en PHP
Módulo II. Conceptos básicos U.D.1. Panorámica del lenguaje En este módulo y en el siguiente se van a describir los elementos y estructuras del lenguaje. Quien esté familiarizado con la programación estructurada encontrará que la mayoría le 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 del módulo I. Para ello hay que crear un fichero con un editor de textos, como puede ser el Bloc de Notas (ficheros planos), dándole un nombre y guardándolo con extensión .php en la carpeta de publicación C:\xampp\htdocs\practicasPHP. Puedes utilizar Notepad++, un editor de texto gratuito y con buenas prestaciones, que te permite guardar los archivos con extensión .php. Lo puedes decargar desde la siguiente dirección http://notepadplus-plus.org/downloads 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: código HTML y código PHP. El código de PHP que va a procesar el interprete puede estar dentro de una de las siguientes etiquetas: <?php ... ?>
Plataforma de Teleformación de IFES
Página 25 de 240
<script language="php"> ... </script> <% ... %> <? ... ?> Nosotros vamos a usar la primera (es la más usual), las dos últimas hay que activarlas exprésamente en la configuración de PHP. Ejemplo 2.1.1. Aquí podemos ver una página muy sencilla. Tiene tres bloques de código: al comienzo la cabecera HTML, después un fragmento en PHP y finalmente el cierre de la página otra vez en HTML.
En un fichero PHP pueden alternarse tantos bloques HTML con bloques PHP como se quiera, siempre que estos últimos estén abiertos y cerrados por las etiquetas adecuadas.
Sentencias en PHP Una sentencia es una instrucción básica que realiza alguna acción. También se le llama a veces línea de código, aunque estrictamente hablando no tiene que ocupar exactamente una línea en el fichero.
Página 26 de 240
Programación en PHP
Es imprescindible que las sentencias estén bien diferenciadas. Para ello en PHP toda sentencia debe ser terminada con un punto y coma " ; ". La única excepción a esto es la ú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 las sentencias, salvo la última, terminan con un punto y coma: <?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.") ?>
Las instrucciónes echo y print() Una de las instrucciones básicas de PHP es la instrucción echo . Se limita a interpretar el texto que se pone a continuación e insertarlo en la página web. Una forma alternativa de 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 tanto producen 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ágina de salida. En HTML el salto de línea se marca con la etiqueta <br> , por lo que para conseguir 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 HTML
Plataforma de Teleformación de IFES
Página 27 de 240
echo "Esta es la segunda línea."; ?> No se debe usar el formato corto de etiquetas cuando se desarrollen aplicaciones o bibliotecas con intención de redistribuirlas, o cuando se desarrolle para servidores que no están bajo nuestro control, porque puede ser que el formato corto de etiquetas no esté soportado en el servidor. Para generar código portable y redistribuíble, asegúrate de no usar el formato corto de etiquetas.
Funciones en PHP En PHP hay dos tipos de funciones, las que están definidas por el propio lenguaje y las que puede crear a medida el programador. Estas últimas las veremos en la U.D.3. del módulo III. Pero en los trozos de código que vienen a continuación nos encontraremos que para hacer acciones complejas deberemos usar las funciones predefinidas del lenguaje PHP. Éstas se caracterizan por un identificador seguido por un paréntesis,dentro del cual ponemos los parámetros que tenemos que pasarle a la función. A medida que las vayamos usando, iremos describiendo las funciones definidas. Un ejemplo de este tipo de funciones que hemos visto ya es la instrucción print() .
Comentarios en PHP Los cometarios son ignorados por el interprete a la hora de generar la página. De todas formas cumplen una función esencial, aumentar la legibilidad del código, para su posterior mantenimiento por nosotros o por otra persona. Con los comentarios describiremos 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 comentario
Página 28 de 240
Programación en PHP
que 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 y ,por lo tanto ,facilitan el mantenimiento del código por nuestra parte o por la de otras personas. Un abuso de los mismos puede hacer difícil distinguir a primera vista el propósito del código. Lo ideal es escribir un código limpio que resulte lo más legible posible y limitar el uso de comentarios a aquellas ocasiones en los que haya que hacer una 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 es conveniente 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 han de estar en bloques de código PHP (es decir, abiertos por la etiqueta "<¿php " y cerrados por la etiqueta "?> ".
Errores en PHP Sin lugar a dudas, cuando programemos, cometeremos errores, como olvidar poner un punto 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 de error (o varios) similar a éste.
Plataforma de Teleformación de IFES
Página 29 de 240
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 sí que nos muestra dónde (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 esto pondremos 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 abrir un 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"); Página 30 de 240
Programación en PHP
?>
U.D.2. Variables
Datos en PHP En PHP definimos los datos con los que vamos a trabajar como variables. Una variable no es más que una estructura de datos cuyo valor puede cambiar durante la ejecución del programa. PHP trabaja con cuatro tipos de datos sencillos: integer (número entero), float (número con decimales), string (cadena de texto) y boolean (verdadero o falso). El separador de decimales en PHP es el punto, como en la mayoría de los lenguajes de programación. Ejemplo 2.2.1. Veamos algunos ejemplos de los diferentes tipos de datos. Como se observa, los tipos string se escriben entre comillas, que pueden ser simples o dobles. 11 43.95 "Código postal" '08080' TRUE
//esto es un dato de tipo integer //esto es un dato de tipo double //esto es un dato de tipo string //esto también es un dato de tipo string // esto es un dato de tipo boolean
Para especificar un literal boolean, use alguna de las palabras clave TRUE o FALSE. Ambas son insensibles a mayúsculas y minúsculas. Ejemplo 2.2.2. Si queremos escribir un dato que contenga comillas dobles lo escribiremos encerrado entre comillas simples. Y si queremos escribir un dato que contenga 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 empezar
Plataforma de Teleformación de IFES
Página 31 de 240
necesariamente por una letra o el símbolo guión bajo "_" seguido por cualquier combinació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; $_tfno; $1apellido; $email@;
//nombre de variable válido //nombre de variable válido //no válido, empieza por un número //no válido, contiene el símbolo @
?>
El tipo de una variable usualmente no es declarado por el programador; en cambio, es decidido en tiempo de ejecución por PHP dependiendo del contexto en el que es usada la variable. En el siguiente código podemos comprobar que las variables $numero1 y $numero2 se han definido como string (van entre comillas), pero como la operación que realizamos entre ellas es una suma, PHP entienda que se tiene que tratar de números, por ello en la variable $resultado almacena 30. <?php $numero1 = "10"; $numero2 = "20"; $resultado = $numero1 + $numero2; echo "El resultado es $resultado"; ?> Otros lenguajes de programación usan el signo más para concatenar cadenas. No es el caso de PHP, el cual utiliza el punto. Si cambiamos el signo más por el punto, veremos que el resultado en este caso será 1020. El manejo de cadenas se estudiará más adelante.
Página 32 de 240
Programación en PHP
Es importante tener en cuenta que en los nombres de variables se distingue entre mayúsculas y minúsculas.
Ejemplo 2.2.4. Mediante este ejemplo se puede ver que PHP distingue entre mayúsculas y minúsculas en los nombres de variables. <?php $precio = 33; $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, es recomendable 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 ?>
Plataforma de Teleformación de IFES
Página 33 de 240
Asignación de datos a variables Como se ha ido viendo en los ejemplos, a las variables se les asigna un dato mediante el 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 tienen un tipo de datos predefinido, el tipo vendrá dado según el contenido de la variable o el contexto donde se trate. Este es el punto mas débil del lenguaje, aunque le aporta una sencillez y flexibilidad propias.
Constantes Las constantes son una manera de asignar a un identificador valores simples que no van 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 no lleva delante el símbolo del dólar, "$", ya que no es una variable. Una práctica habitual es poner los nombres de las constantes en mayúsculas. Ejemplo 2.2.7. Mostramos a continuación declaraciones de constantes. Algunas son correctas y otras incorrectas. <?php // Nombre de constantes correctos define("PAIS", "España"); define("CAPITAL2010","Madrid"); define("HABITANTES_ACTUALES", "46M"); // Nombres de constantes incorrectos define("2AUTONOMIAS", 17); // No puede comenzar por número ?>
Página 34 de 240
Programación en PHP
Ejemplo 2.2.8. Sabemos a ciencia cierta que el número PI no va a cambiar. En lugar de tener que teclearlo varias veces a lo largo del código podemos definir una constante con el identificador PI. <?php $define("PI", 3.1416); echo PI; //No se pone el símbolo dólar ?> Existen constantes predefinidas por el núcleo de PHP. Pero por el momento no las vamos a utilizar. Si en mi código coincide una constante que yo defina con otra predefinida por PHP, no me mostraría el valor indicado en la función define(), si no el valor que PHP le tiene asignado. Ejemplo 2.2.9. En el siguiente fragmento de código el valor mostrado no será España, mostrará 5.3.1 que es el valor predefinido por PHP para esa constante. Que es la versión que estoy ejecutando de PHP. <?php define("PHP_VERSION", "España"); echo PHP_VERSION; ?>
U.D.3. Operadores Los operadores son utilizados para realizar cálculos y manipular datos en el ámbito de una 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 de la 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.
Plataforma de Teleformación de IFES
Página 35 de 240
Ejemplo 2.3.1. Los datos pueden ser introducidos directamente o estar almacenados en variables. El resultado de la operación se suele asignar a una variable, aunque puede formar parte de una expresión mayor. Esta variable a la que se asigna el resultado puede ser parte de la expresión. <?php echo "La variable z vale "; $z = 1 + 5; //Los datos se introducen directamente echo $z; echo "<br>"; echo "La variable z vale "; $x = 2; $y = 3; $z = $x + $y; //Los datos están almacenados en variables echo $z; echo "<br>"; echo "La variable z vale "; $z = $x + $z; //La variable $z aparece en la expresión echo $z; ?> Lo habitual es clasificar a los operadores según el tipo de cálculo o manipulación que realizan.
Operadores aritméticos En PHP hay cinco operadores que realizan operaciones matemáticas entre dos datos y un operador unario, el signo de negación.
Página 36 de 240
Programación en PHP
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 ";
Plataforma de Teleformación de IFES
Página 37 de 240
$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. Éstas utilizan el resultado de unas expresiones especiales para decidir cuáles serán las instrucciones que ejecutarán luego. Las expresiones básicas que utilizan son el resultado de una condición. Este resultado solo puede tomar dos valores: verdadero o falso. PHP tiene dos constantes predefinidas para designar los valores verdadero y falso, que son, 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 las constantes en mayúsculas. Cuando el resultado es verdadero la expresión de comparación devolverá TRUE, si la evaluación de la expresión de comparación es falsa PHP devolverá como resultado FALSE.
Página 38 de 240
Programación en PHP
A nivel interno PHP no almacena TRUE o FALSE, sino que interpreta el valor 0 como falso y el 1 como verdadero (realmente interpreta como verdadero cualquier valor que sea 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 la proxima 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"; } Plataforma de Teleformación de IFES
Página 39 de 240
echo "<br>"; echo "¿Es 5 menor que 3? "; if (5 < 3) { echo "TRUE"; } else { echo "FALSE"; } echo "<br>"; echo "¿Es 5 mayor que 3? "; 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 representar expresiones del tipo ¿Es cierto que Madrid es la capital de España y que a la vez Madrid es la ciudad más poblada de España?
Página 40 de 240
Programación en PHP
Ejemplo 2.3.4. Al conjunto de combinaciones de valores que pueden tomar los operandos 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 forma similar 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) { Plataforma de Teleformación de IFES
Página 41 de 240
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 { echo "FALSE"; } ?> </pre>
Operador de unión de cadenas En la mayoría de ejemplos anteriores, cuando hemos querido imprimir un texto por pantalla que estaba formado por varios fragmentos, hemos tenido que usar una instrucción echo por cada uno de los fragmentos. El operador de unión de cadenas nos permite unir los fragmentos para, por ejemplo, usar una sola instrucción echo.
Página 42 de 240
Programación en PHP
Ejemplo 2.3.5. Se pueden concatenar directamente cadenas de texto con datos de tipo entero. Los datos que se concatenan se pueden introducir directamente o extraer de variables. <?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 una operación y una asignación a la vez y, por lo tanto, producen un código más comprimido. El uso de estos operadores es desaconsejable para el programador principiante ya que puede llevar a un código poco legible y como consecuencia a asignaciones erróneas. Los operadores de asignación comprimidos y sus equivalencias son:
Plataforma de Teleformación de IFES
Página 43 de 240
Precedencia de operadores Un último aspecto que conviene mencionar es, ¿qué pasa cuando en una expresión compleja aparece más de un operando? En ese caso, ¿qué operaciones se evaluan antes?. Cuando hay expresiones complejas con más de un operando, hay unos que se evaluan antes de otros, con el siguiente orden, teniendo en cuenta que los de arriba se evalúan antes que los de abajo, y que los de la misma fila tienen igual precedencia (se evalúan de izquierda a derecha):
En cualquier caso podemos alterar la precedencia mediante la inclusión de partentesis alrededor de las expresiones. De hecho es muy recomendable hacerlo incluso aunque
Página 44 de 240
Programación en PHP
exista una regla de precedencia que produzca el mismo resultado, para dar mayor claridad al código. Ejemplo 2.3.6. La multiplicación tiene precedencia sobre la suma por lo que, sin paréntesis, en la expresión 2 + 5 * 4 se evalúa primero 5 * 4 y luego se le suma 2. <?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ás legible si ponemos lo que sigue echo "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 lo único que podíamos hacer con ellas es ejecutarlas secuencialmente. Pero, ¿tenemos herramientas para elegir una alternativa entre dos? ¿O para escribir 5 veces un texto por pantalla? Para hacer frente a estas situaciones se incluyen las sentencias de control.
Estructuras condicionales. Instrucción if Las instrucciones condicionales permiten ejecutar diferentes fragmentos de código en función del resultado de una expresión condicional. La instrucción básica es if . La sintaxis es: if (condición ) { Código a ejecutar si la condición es cierta }
Plataforma de Teleformación de IFES
Página 45 de 240
Cuando el código a ejecutar si la condición es cierta es una sola sentencia se pueden omitir las llaves "{" "}". En cualquier caso es preferible no omitirlos ya que dan mayor claridad a cuáles son exáctamente las sentencias que se ejecutan en el caso de cumplirse la condición. Ejemplo 2.4.1. Las dos construcciones siguientes son equivalentes, aunque es preferible siempre usar la primera por claridad: <?php $hora = 8; // La hora en formato de 24 horas if ($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 de texto entre llaves y no hacerlo: <?php $hora = 11; // La hora en formato de 24 horas if ($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ón sino que querremos elegir entre dos opciones alternativas y mutuamente excluyentes.
Página 46 de 240
Programación en PHP
En estos casos la sentencia if se completa con un bloque de código que se ejecuta solo si es falsa la condición: if (condición ) { 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 horas if ($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 se puede encadenar una sentencia else con un nuevo condicional. A su vez la nueva sentencia 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 }
Plataforma de Teleformación de IFES
Página 47 de 240
Ejemplo 2.4.4. Se pueden encadenar varias sentencias else if como se ve en el siguiente programa: <?php $hora = 14; // La hora en formato de 24 horas if ($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 nos ofrece una instrucción que nos facilita la tarea, siempre que haya que elegir entre varias posibles. A diferencia de la instrucción if , si queremos que se ejecuten varias instrucciones, no será necesario englobarlas entre llaves "{" "}". La ejecución seguirá hasta que encuentre el siguiente break. switch (expresion ) { case etiqueta1 : Código a ejecutar si expresión == etiqueta1 break; case etiqueta2 : Código a ejecutar si expresión == etiqueta1 break; case default : Código a ejecutar si no se verifica ninguna etiqueta break; }
Página 48 de 240
Programación en PHP
El bloque de código detras de default se ejecuta en el caso de que no se haya verificado ninguno de los casos anteriores. Terminar el bloque de instrucciones default con una instrucción break es opcional, pero es recomendable ya que mejora la legibilidad. Ejemplo 2.4.5. Puede haber tantas sentencias case como sea necesario. <?php $hora = 14; // La hora en formato de 24 horas switch ($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 en algunos casos. La primera es formar un grupo de alternativas que producen un resultado. La segunda es omitir intencionadamente la instrucción break al final de un bloque. <?php $hora = 19; // La hora en formato de 24 horas switch($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:
Plataforma de Teleformación de IFES
Página 49 de 240
}
echo "Ya he desayunado."; break; default: echo "Tengo hambre"; break;
?>
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 este efecto, pero esto nos conduciría a un código redundante y muy largo. Además, ¿qué sucede 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 de código mientras la evaluación de la condición sea cierta. La forma que tenemos de controlar cuantas veces se repite el bucle while es a través de la condición. Por lo tanto, en el cuerpo del bucle se han de modificar las variables que intervienen en la condición de 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 importante observar dos cosas: 1. La variable $i se inicializa fuera del bucle. 2. La variable $i se modifica en la última instrucción del cuerpo del bucle. 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;
Página 50 de 240
Programación en PHP
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 bucle se hace uso de una constante por primera vez en los ejemplos. <?php define(HORA_DE_CENAR, 21); //Constante $hora = 12; // La hora en formato de 24 horas while ($hora < HORA_DE_CENAR) { echo "Son las " . $hora . ". "; 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 anterior evalúa la condición al final en lugar de al principio del bucle. De esta forma el bucle se ejecuta siempre al menos una vez y a partir de ese momento se repite mientras la condició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 un Plataforma de Teleformación de IFES
Página 51 de 240
dato hasta que se recibe el dato esperado. Como aún no conocemos ninguna forma de recibir datos, se ha optado por generarlos aleatoriamente. En este ejemplo se simula el lanzamiento de un dado de parchís. <?php do { $dado = rand(1,6); //rand() devuelve un valor aleatorio echo "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 que están aprendiendo a programar, dado que, en la mayoría de los casos se conoce el número de veces que se va a ejecutar el bucle antes de entrar al mismo. La sintaxis que tiene PHP es: for (inicialización ; condición ; incremento ) { Código a ejecutar } El bucle se ejecutará mientras la condición sea TRUE. Ejemplo 2.4.10. Aquí se puede ver un bucle for sencillo que, al igual que el bucle while del ejemplo 2.4.7., imprime 10 líneas numeradas. Como se puede observar es habitual utilizar la variable $i en el cuerpo del bucle. A esta variable se le llama a veces índice. <?php for ($i = 1; $i <= 10; $i++) { echo "Línea " . $i; echo "<br>"; }
Página 52 de 240
Programación en PHP
?> Ejemplo 2.4.11. La instrucción de incremento no tiene por qué hacer aumentar el valor, también lo puede hacer retroceder. En este ejemplo se imprime una cuenta atrás. <?php echo "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 el valor en cada paso un número distinto de 1. El siguiente programa cuenta los números del 3 al 15 de 3 en 3. <?php for ($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 variable declarada como índice . En este ejemplo se puede observar esto. El resultado es el mismo que con el ejercicio anterior. <?php $j = 3; for ($i = 1 ; $j <= 15 ; $i++) { $j = $i * 3;
Plataforma de Teleformación de IFES
Página 53 de 240
echo $j; echo "<br>"; } ?> De todas formas es muy recomendable que la condición sea sobre el índice. También hay que evitar alterar el contenido del índice en el cuerpo del bucle, pues puede llevar a 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 en la mayoría de las situaciones nos encontraremos que para obtener el resultado esperado hemos de hacer que trabajen juntas. Esto no supone ningún problema. Un bloque de código dentro de una sentencia de control puede contener varias sentencias condicionales, y a su vez los bloques de código de éstas, nuevas sentencias condicionales. Ejemplo 2.4.14. Aquí se puede ver un caso típico del uso de sentencias de control anidadas. <?php for ($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 poco legible. Para evitarlo es recomendable poner espacios delante de cada bloque de código de tal forma que el comienzo de las instrucciones comience a diferentes
Página 54 de 240
Programación en PHP
distancias del margen dependiendo del bloque en el que se está. A esta técnica se le llama sangrado. El sangrado 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 con este estilo de sangrado con el que es más frecuente encontrárselos. Ejemplo 2.4.15. Este código es idéntico al anterior pero sin sangrado. Es obvio que en éste es mucho más difícil comprender el flujo del programa. <?php for ($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 sangrado no es obligatorio, el código funcionaría igual sin hacerlo, pero como se ha visto en este ejemplo, los programas se vuelven prácticamente ilegibles. Ejemplo 2.4.16. Mediante el anidamiento se pueden conseguir resultados interesantes con muy poco código. En el siguiente ejemplo se va a dibujar una tabla de multiplicar. <table> <?php for ($i = 1; $i <= 10; $i++) { echo "<tr align='right'>"; for ($j = 1; $j <= 10; $j++) { echo "<td width='25'>" . ($i*$j) . "</td>"; } }
echo "</tr>";
Plataforma de Teleformación de IFES
Página 55 de 240
?> </table>
Terminación de los bucles Si no controlamos bien la condición del bucle, ésta nunca se evaluará a falso y el bucle se evaluará indefinidamente, dando lugar a un bucle infinito. Éste es uno de los errores más habituales. En bucles complejos puede ser fácil perder de vista cuáles son las variables que intervienen en la evaluación de la condición. Ejemplo 2.4.17. Éste es un bucle infinito que escribirá indefinidamente una frase por pantalla. El bucle no se detiene hasta que no paremos la descarga desde el navegador o nos quedemos sin memoria. <?php while (TRUE) { echo "Hasta el infinito "; echo "y más allá..."; echo "<br>"; } ?> Antes de ejecutar este ejemplo, guarda lo que estés haciendo. Puede ser que se te bloquee el ordenador y tengas que reiniciarlo.
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 break causa la finalización del mismo sin ejecutarse ninguna sentencia más del cuerpo del bucle. En otras palabras, en cuanto se encuentra una sentencia break, se interrumpe la 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.
Página 56 de 240
Programación en PHP
<?php while (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 se pretende romper con una sentencia break en su cuerpo. <?php define(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 se ignoran 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
Plataforma de Teleformación de IFES
Página 57 de 240
ese momento la condición del bucle es verdadera, el bucle comenzará una nueva ejecución. Ejemplo2.4.20. Este programa lista los números del 1 al 10, indica los que son múltiplos de 3, y si son divisibles por 3 nos muestra el resultado de esta división. <?php for ($i = 1; $i <= 10; $i++) { echo "El número " . $i; if (($i % 3) != 0) { echo " no es multiplo de 3."; 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 y propenso a errores, por lo que no se recomienda su uso por parte del programador principiante.
Resumen módulo II Este recurso es de tipo Multimedia. Tiene que conectarse a la plataforma para acceder a este recurso.
Práctica: conceptos básicos Este recurso es de tipo Práctica. Tiene que conectarse a la plataforma para acceder a este recurso.
Autoevaluación módulo II Página 58 de 240
Programación en PHP
Pregunta 1: En las páginas dinámicas programadas en PHP se alternan bloques de código HTML y bloques de código PHP. • Verdadero • Falso Respuesta correcta: Verdadero Pregunta 2: Todas las instrucciones, salvo la última, han de acabar con un punto y coma. • •
Verdadero Falso
Respuesta correcta: Verdadero Pregunta 3: En PHP hay solo una forma de mostrar un texto en la página web, y es mediante la sentencia echo . • Verdadero • Falso Respuesta correcta: Falso Pregunta 4: PHP es un lenguaje de programación fuertemente tipado. Soporta los tipos de dato integer , long , float , double , boolean y string. • •
Verdadero Falso
Respuesta correcta: Falso Pregunta 5: "$4ruedas" es un nombre de variable válido. • •
Verdadero Falso
Respuesta correcta: Falso Pregunta 6: Plataforma de Teleformación de IFES
Página 59 de 240
Cuando una expresión contiene varios operadores estos se evalúan siempre de izquierda a derecha. • Verdadero • Falso Respuesta correcta: Falso Pregunta 7: La siguiente expresión es verdadera para todos los individuos que tiene el pelo rubio y los ojos azules. ($pelo == "rubio") && ($ojos != "azules") • •
Verdadero Falso
Respuesta correcta: Falso Pregunta 8: El siguiente código pintará por pantalla la frase "Inés es una chica muy alta." <?php $altura = 1.82; echo "Inés es una chica "; if ($altura >= 1.80) { echo "muy alta."; } else if ($altura >= 1.70) { echo "alta."; } else if ($altura >= 1.60) { echo "de altura media."; } else { echo "bajita."; } ?> • Verdadero • Falso
Página 60 de 240
Programación en PHP
Respuesta correcta: Verdadero Pregunta 9: Si al entrar en un bucle la condición es verdadera y no se modifica en el cuerpo del bucle nunca se podrá salir de él. Se trata de un bucle infinito. • Verdadero • Falso Respuesta correcta: Falso Pregunta 10: En PHP solo se puede anidar un máximo de una estructura condicional o iterativa dentro de otra. • Verdadero • Falso Respuesta correcta: Falso
Plataforma de Teleformación de IFES
Página 61 de 240
Programación en PHP
Módulo III. Conceptos avanzados U.D.1. Cadenas El manejo de cadenas en PHP es de vital importancia, ya que la única forma que tenemos de comunicarnos con el usuario es a través de texto. Hay que tener en cuenta que el resultado 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, lo mejor es mantenerlos bien diferenciados. Hay que ser especialmente cuidadoso procurando que el código sea muy legible. Esto facilitará el mantenimiento de la página y 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 PHP sin tener que preocuparse de la programación que contiene. En el módulo V veremos una breve introducción a las plantillas que nos facilitan notablemente la tarea de separar el código HTML del código PHP.
Variables dentro de cadenas Hasta ahora, siempre que hemos necesitado mostrar un texto compuesto por una cadena y el valor de una variable los hemos tenido que unir usando el operador concatenar " . ". Pero PHP ofrece una sintaxis alternativa que resulta más compacta y puede ser de utilidad en muchos casos. <?php $edad = 46; echo "Belinda tiene " . $edad . " años."; ?> <?php $edad = 46; Página 62 de 240
Programación en PHP
echo "Belinda tiene $edad años."; ?>
Uso de la sentencia echo Es recomendable usar esta forma de conseguir salida cuando es predominante la cantidad de código PHP sobre la cantidad de código HTML. Lo mismo se aplica al uso de la función print() que produce los mismos resultados. Hay partidarios de usar una forma y partidarios de usar la otra, lo que no es muy recomendable es mezclarlas dentro del mismo programa. Ejemplo 3.1.2. En este pequeño programa predomina el código PHP sobre el código HTML. <html> <head> <title>Números primos</title> </head> <body> <?php define(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 primo for ($j =2; $j < $i; $j++) { if(($i % $j) == 0) { //Tiene un divisor $es_primo = FALSE; //Luego no es primo break; } } if ($es_primo) { echo "$i"; echo "<br>"; } } ?>
Plataforma de Teleformación de IFES
Página 63 de 240
</body> </html>
Uso de la sintaxis <?= ... ?> A la inversa, cuando predomina el código HTML sobre el código PHP es interesante mostrar la salida usando esta sintaxis, siempre y cuando la hayamos activado en la configuración de PHP. Para activarlo hay que acceder al archivo php.ini, dentro del directorio C:\xampp\php, y añadirle la siguiente línea: short_open_tag=1. Se puede añadir al final del archivo, pero antes aseguraos de que no existe ya dicha línea. Una vez añadida esta línea, debéis reiniciar el servidor Apache para que los cambios surtan efecto. En cualquier caso, no os aconsejo esta sintaxis, porque puede ocurrir que no esté activado en la configuración PHP del sistema que aloje los scripts que estáis creando y no tengáis acceso al archivo de configuración. Ojo al manipular el archivo de configuración php.ini. Un uso incorrecto puede provocar que vuestro servidor Apache no funcione bien.
Ejemplo 3.1.3. En este pequeño programa predomina el código HTML sobre el código PHP. <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>
Página 64 de 240
Programación en PHP
<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 encuentra dentro de una estructura condicional, puede ser muy pesado construirlos a base de sentencias echo . En este caso es preferible volver a cerrar el bloque de código PHP con la etiqueta ?>, escribir el código HTML que se ejecuta condicionalmente, y abrir otra 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 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">’;
Plataforma de Teleformación de IFES
Página 65 de 240
}
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 } ?>
Distribución del código La última cuestión que nos queda por resolver es dónde situar el código. Salvo el código que muestra resultados por pantalla, que tiene que aparecer en el lugar
Página 66 de 240
Programación en PHP
apropiado de la página, el código PHP se puede situar en cualquier lugar. La mejor opció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 las operaciones que se quieran mostrar se almacenan entonces en variables auxiliares y se muestran en el cuerpo de la página HTML donde corresponda haciendo uso de las etiquetas <?= ... ?>. Ejemplo 3.1.5. Ésta es una página web en PHP bien construida. Usa un algoritmo para hallar el máximo común divisor de dos números generados aleatoriamente. <?php //Inicialización DEFINE(LIMITE, 100); //Lectura de datos $i = rand(1, LIMITE); //Simulamos la lectura $j = rand(1, LIMITE); //Operaciones con los datos if ($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> Plataforma de Teleformación de IFES
Página 67 de 240
</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 11 resultados el bucle que los recorre deberá estar mezclado con el código HMTL. De todas formas con la experiencia iremos aprendiendo poco a poco a extraer la mayor parte 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 hacer operaciones con los textos almacenados en cadenas. Ya hemos visto las función echo y 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 carácter que 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 la cadena 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ón echo "Caracter en la posición 0: '$cadena[0]'<br>"; //Caracteres de posiciones intermedias echo "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 7: '$cadena[7]'<br>"; //La cadena tiene longitud 10, la última posición es la 9
Página 68 de 240
Programación en PHP
echo "Caracter en la posición 9: '$cadena[9]'<br>"; //La cadena tiene longitud 10, en la posición 12 no hay nada echo "Caracter en la posición 12: '$cadena[12]'<br>"; ?>
strlen() strlen(cadena ) Por lo general no conceremos la longitud de la cadena a priori. Esta función nos permite obtenerla
strpos() En ocasiones nos interesará conocer la posición de la primera aparición de un carácter en una cadena. Si no se encuentra el carácter devuelve FALSE. strpos(cadena , carácter ) Alternativamente podemos indicarle la posición a partir de la cual queremos que empiece a buscar. strpos(cadena, carácter, posición inicial )
substr() Habrá muchos casos en los que nos interesará extraer un trozo del texto de una cadena. Para hacerlo disponemos de esta función. substr(carácter, posición inicial, posición final ) Ejemplo 3.1.7. El funcionamiento de las funciones se va a explicar con un ejemplo típico, la comprobación de que una dirección de correo electrónico es correcto y la extracción de datos del mismo. <?php $email = "maurodosantos@pernambuco.com ";
Plataforma de Teleformación de IFES
Página 69 de 240
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); 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 )
Página 70 de 240
Programación en PHP
Ejemplo 3.1.8. En este ejemplo se supone que podemos recibir direcciones de correo electrónico erróneas, y las intentamos arreglar. El primer error que eliminamos es la aparición de espacios en blanco al principio y al final de la dirección. El segundo cuando los usuarios escriben el dominio pernambuco.es cuando el correcto es pernambuco.com. <?php $email = " maurodosantos@pernambuco.es "; echo "Dirección recibida: $email<br>"; //Eliminamos los espacios en blanco $email = trim($email); // Posición que ocupa el signo arroba $posicion_arroba = strpos($email, "@"); //Nos quedamos con el nombre de usuario $usuario = substr($email, 0, $posicion_arroba); //Reemplazamos pernambuco.es por pernambuco.com $dominio = str_replace($email, "pernambuco.es","pernambuco.com");// Esta es la nueva dirección $nuevoemail=$usuario."@".$dominio; echo "Dirección corregida: $nuevoemail"; ?>
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 = " MAUROSOSANTOS@PERNAMBUCO.ES "; echo "Dirección recibida: ’$email’.<br>"; //Convertimos a minúsculas $email = strtolower($email); echo "Dirección corregida: ’$email’."; ?>
Plataforma de Teleformación de IFES
Página 71 de 240
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 estas funciones se pueden comparar como iguales. <?php echo "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>"; } ?>
number_format() Esta función es útil cuando hay que mostrar datos de tipo double, es decir, números con decimales. Permite especificar el número de decimales que queremos que se muestren, 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 decimales
Página 72 de 240
Programación en PHP
echo "A pagar " . number_format($a_pagar, 2) . " euros."; ?>
U.D.2. Arrays Hasta ahora hemos trabajado en nuestros programas con una pequeña cantidad de datos, y la cantidad de los mismos no variaba a lo largo del programa. Pero la mayoría de los programas que hacen algo útil requieren tratar gran cantidad de datos. En este caso sería muy incomodo tener una variable para cada dato. Afortunadamente cuando se tratan muchos datos, éstos suelen ser de unos tipos muy similares entre sí. Para tratarlos en grupos, PHP ofrece tipos de datos compuestos, es decir, 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. Cada elemento almacena un valor diferente. Y para poder localizar un elemento, disponemos del índice (algo así como una dirección).
Arrays indexados numéricamente El tipo más sencillo de array es el indexado numéricamente, en los que el índice de cada elemento corresponde con su posición. Hay que tener en cuenta que, al igual que sucedía con las cadenas, el primer elemento de un array tiene índice 0 (y no 1 como cabría esperar).
Inicializar 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 la vez que se crea. Para ello primero declaramos el nombre de la variable y usamos la
Plataforma de Teleformación de IFES
Página 73 de 240
función array() , a la que le pasamos como parámetros un grupo de valores separados por 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. Para añ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 cómo se crea un array mediante la adición de elementos. <?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 array directamente y cuando sea necesario ir añadiendo elementos. <?php $frutas = array("melón", "sandía", "naranja"); $frutas[] = "manzana"; $frutas[] = "melocoton"; ?>
Página 74 de 240
Programación en PHP
Acceder a un elemento de un array Necesitaremos acceder a los elementos de un array para asignarles valores o para leer su contenido. Esto es muy sencillo, basta poner el índice del elemento al que queremos acceder entre corchetes "[ ... ]". Ejemplo 3.2.4. Aquí se leen los valores de los elementos de un array para sacarlos por 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 1 echo "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 las acciones más habituales, es recorrerlos de principio a fin para leer o modificar uno o varios de ellos. Las estucturas iterativas (bucles) que se vieron en la unidad didáctica 4 del módulo II son idóneas para recorrer arrays. Lo único que hay que hacer es limitar el número de iteraciones al número de elementos del array. Para esto disponemos de la función count(). 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"); Plataforma de Teleformación de IFES
Página 75 de 240
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>"; } ?> Ejemplo 3.2.7. Recorriendo un array para modificar todos sus elementos. Aquí se usan dos 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>"; } ?>
Página 76 de 240
Programación en PHP
Ejemplo 3.2.8. Recorriendo un array para buscar un elemento. Se vuelve a hacer uso de dos arrays relacionados por las posiciones de sus índices. En este código se da por supuesto que se va a encontrar el valor buscado. No es seguro, fallaría si preguntaramos por la edad de una persona cuyo nombre estuviera en el array nombres. <?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 por cadenas 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 el procedimiento normal. Luego se muestra la forma de ordenar el mismo array sin hacer distinción entre mayúsculas y minúsculas. <?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>";
Plataforma de Teleformación de IFES
Página 77 de 240
} 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 er
Hasta ahora lo arrays que hemos visto tenían como índices la sucesión 0 (1 elemnto), º
er
1 (2 elemento), 2 (3 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ícil de usar y aunque permite una mayor flexibilidad, pueden ser fuente de muchos errores difíciles de detectar si no se usan con cuidado.
Arrays asociativos Éstos son un caso específico de arrays no secuenciales en los que el índice es una cadena de texto. Pueden resultar útiles para guardar listas en las cuales se asocia un valor a una palabra clave.
Página 78 de 240
Programación en PHP
La creación de este tipo de arrays se puede hacer de dos formas. La primera es mediante la función array() de forma parecida a como lo hacíamos antes, solo que ahora deberemos especificar un valor para el índice. Ejemplo 3.2.10. Cuando se declaran explícitamente los índices se escribe el valor del indice 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 de un array indexado por una cadena dentro de un texto entre comillas, lo tendremos que encerrar entre llaves "{ }". Si no, nos dará un error al interpretar la comilla de apertura del índice del array como la comilla final de la cedena. Ejemplo 3.2.11. En la siguiente sentencia, PHP dará un error. <?php echo "La capital de Francia es $capitales["Francia"]"; ?> La segunda forma de crear un array asociativo es añadiendo elementos al array y asignándoles de forma explícita cual es su índice. Ejemplo 3.2.12. Veamos esta segunda forma de inicializar arrays declarando explícitamente sus índices.
Plataforma de Teleformación de IFES
Página 79 de 240
<?php $alturas["Aneto"] = 3404; $alturas["Teide"] = 3718; $alturas["Mulhacen"] = 3748; echo "El Aneto mide {$alturas["Aneto"]} metros"; ?> Hay que tener cuidado con este sistema de creación pues se usa indistintamente para crear 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 del segundo. <?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>"; } ?> Aun así, al igual que ocurría con los arrays no secuenciales, su uso no es recomendable 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 los arrays. Aunque hasta el momento todos los arrays que hemos visto los hemos usado para manipular datos del mismo tipo (arrays de enteros, arrays de cadenas...) ésta es una restricción que no era necesaria.
Página 80 de 240
Programación en PHP
PHP permite mezclar en los elementos de los array valores de diferentes tipos. Incluso permite que los índices de los elementos de un mismo array sean de diferentes tipos. Pero una vez más esta es una estrategia peligrosa a seguir y a la que en la mayoría de los casos no será necesario recurrir.
Arrays multidimensionales El contenido de un elemento de un array puede, a su vez, ser un array. De esta forma se pueden construir arrays multidimensionales. Ejemplo 3.2.14. Aquí se muestra como almacenar una matriz (array de dos dimensiones) que contiene una sopa de letras generada aleatoriamente (la función chr() devuelve un carácter dado su número ascii). <?php DEFINE(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>"; }
Plataforma de Teleformación de IFES
Página 81 de 240
?>
Mostrar el contenido de un array Ejemplo 3.2.15. PHP dispone de la función print_r() a la que se le pasa como argumento un array e imprime por pantalla su contenido. Para poderlo ver bien se usa la etiqueta HTML <pre>... </pre> que sirve para mostrar el texto y los saltos de línea tal cual. <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 devolverá la cadena vacía (""). Ésta es una causa de error muy habitual, sobre todo si luego vamos a hacer operaciones con ese dato.
Página 82 de 240
Programación en PHP
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]; ?>
Otra forma de recorrer un array foreach PHP 4 introdujo un constructor foreach, muy parecido al de Perl y algunos otros lenguajes. Proporciona un modo fácil de iterar sobre arrays. foreach trabaja solo sobre arrays y dará un error al intentar usarlo en una variable con un tipo de datos diferente o una variable no inicializada. foreach (array as $valor){ sentencias } En cada ciclo, el valor del elemento actual es asignado a $valor y el índice interno del array avanza en uno (así en el próximo ciclo se estará mirando el siguiente elemento). Ejemplo 3.2.17. Recorremos el array, y nosotros no tenemos que controlar el índice. <?php $frutas = array("melón", "sandía", "naranja"); echo "El array contiene los siguientes elementos: <br>"; foreach ($frutas as $valor) { echo $valor; echo '<br>'; } ?>
Plataforma de Teleformación de IFES
Página 83 de 240
U.D.3. Funciones PHP es un lenguaje estructurado y como tal dispone de funciones. Las funciones no son más que fragmentos de código a los que se puede llamar desde cualquier 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 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 que se suelen situar las funciones es al comienzo del archivo, de tal forma que estén disponibles a partir de ese momento. Situarlas al comienzo también ayuda a una estructuración del código más lógica. Las funciones se declaran, como las variables, con un nombre , precedido de la palabra function , unos paréntesis (para albergar los datos de entrada, llamados argumentos o parámetros) y unas llaves que incluyen el cuerpo de la función. Dentro del cuerpo de la función podemos declarar variables, llamadas a otras funciones y demás sentencias. function nombre_funcion (arg1, arg2, arg3, ...) { bloque de código return valor ; //Opcional }
Llamada a una función Para utilizar una función se escribe su nombre, seguido de paréntesis y dentro de éstos se escriben los datos que se quieren pasar a la función (o variables que contienen dichos datos). nombre_funcion (arg1, arg2, arg3, ...);
Página 84 de 240
Programación en PHP
Si la función devuelve un dato, éste se puede asignar a una variable o usar directamente como parte de una expresión. Ejemplo 3.3.1. A continuación se muestra una función muy sencilla, que no tiene argumentos. <?php function hola_mundo() { // Declaración de la función echo "¡Hola Mundo!"; } hola_mundo(); // Llamada a la función ?>
Devolución de un valor Las funciones son mucho más útiles si pueden devolver un dato. Para ello usan la sentencia return . Una vez que se llega a esta instrucción, no se ejecuta el código que se pueda encontrar a continuación. Ejemplo 3.3.2. La siguiente función devuelve aleatoriamente un día de la semana. <?php function 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
Plataforma de Teleformación de IFES
Página 85 de 240
Aun así, estas funciones que hemos visto son muy sencillas y no permiten hacer grandes cosas. Lo más habitual es que a las funciones se les pasen datos, que luego operen con éstos y que al terminar la función devuelva el resultado. A los datos que 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 la funció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 variable cualquiera. 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 a 10; <?php function cuadrado($numero) { return $numero * $numero; } for ($i = 1; $i <= 10; $i++) { echo "$i al cuadrado es igual a " . cuadrado($i) . ".<br>"; } ?>
Paso de argumentos por valor Cuando se pasan valores a las funciones hay varias formas de hacerlo. El comportamiento predefinido es lo que se conoce como paso por valor. Esto quiere decir que la variable que recibe el valor hace una copia del mismo y a partir de ese momento actúa como una variable independiente de manera que si cambias el valor del argumento 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 puede interesar cuando se trabaje con arrays (la copia de muchos datos puede perjudicar el tiempo de ejecución del programa) o, más comunmente, cuando se quiere alterar el valor de la variable para obtener algún efecto. A esto se le llama paso de parámetros por
Página 86 de 240
Programación en PHP
referencia. Para indicar que un parámetro se pasa por referencia se le antepone el sí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. <?php function 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>"; ?> Ejemplo 3.3.5. No se puede hacer que una función devuelva dos valores. Pero en su lugar es posible pasar por referencia las variables a devolver y modificar su contenido en el cuerpo de la función. Aquí se emplea esta estratagema para intercambiar el contenido de dos variables. <?php function intercambiar(&$argumento1, &$argumento2) { $auxiliar = $argumento1;
Plataforma de Teleformación de IFES
Página 87 de 240
}
$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, ¿qué pasa si hay una variable dentro de una función que se llama igual que una variable que se encuetra fuera de la función? La respuesta es que la variable de dentro de la función es diferente 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 de una 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ún argumento. <?php function 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(); echo "Después de llamar a la función vale $ciudad.<br>"; ?>
Página 88 de 240
Programación en PHP
Ejemplo 3.3.7. Puede darse el caso de que queramos acceder a una variable global dentro del cuerpo de la función. Para conseguirlo le antepondremos la palabra clave global a la primera referncia de la variable, con lo que el interprete PHP sabe que estamos llamando a la variable externa. <?php function 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 variables diferentes a los de las variables del programa principal para evitar confusiones. Tampoco es conveniente usar variables globales dentro de las funciones. Siempre que se pueda es mejor pasar estas variables como parámetros, mejora notablemente la fiabilidad y claridad del código.
Creación de bibliotecas Para conseguir un código lo más claro posible es deseable que éste sea breve. Una forma de conseguirlo es extraer las funciones que se declaran a un archivo independiente con extensión .php. Una ventaja de esta estrategia es que se pueden 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 ha optado por poner un breve comentario antes de cada función explicando su cometido para contribuir a la legibilidad y mantenibilidad del código. <?php // Biblioteca de funciones de usuario
Plataforma de Teleformación de IFES
Página 89 de 240
// Archivo utils.php // Devuelve el argumento elevado al cuadrado function cuadrado($numero) { return $numero * $numero; } // Devuelve la raíz cuadrada del argumento function raiz($numero) { return sqrt($numero); } // Devuelve verdadero si el número es igual o mayor que cero function 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ódigo PHP que las ha de incorporar al script actual. Mediante estas instrucciones se incluye un fichero en el punto en el que se importa. La diferencia es que require() lanza un error fatal en el caso de no encontrar el fichero mientras que include() no lo hace.
Página 90 de 240
Programación en PHP
Ejempo 3.3.10. La inclusión de bibliotecas se suele poner al principio para que estén disponibles en el resto del código. <?php include("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); 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 todo si 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 de muchos ejemplos hemos ido usando funciones como rand() o number_format() que ya estaban disponibles en el lenguaje. Éstas son funciones del núcleo de PHP y, por lo tanto, no hace falta hacer un include() para poder usarlas. Extensiones de PHP Las funciones que incorpora de forma predefinida PHP están agrupadas en extensiones. Ejemplo 3.3.11. Para saber qué extensiones están instaladas en nuestro interprete de PHP tenemos una opción muy útil, la función phpinfo() que genera una página con la información del intérprete que tenemos instalado. Plataforma de Teleformación de IFES
Página 91 de 240
<?php phpinfo(); ?> Debe aparecernos una pantalla similar a la siguiente:
P谩gina 92 de 240
Programaci贸n en PHP
Plataforma de Teleformaci贸n de IFES
P谩gina 93 de 240
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 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 una característica, no eran interactivas. Hacían operaciones en función de los datos de los que ya disponí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 web dinámica es a través de formularios web. Estrictamente hablando, los formularios no son parte del lenguaje PHP sino del lenguaje HTML. Pero para recibir los datos de un formulario 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 que permiten el envío de datos a páginas web, como Flash u otras páginas web dinámicas.
Formularios HTML Los formularios pueden llegar a ser muy complejos, con una gran cantidad de campos de entrada, validación de datos por Javascript, campos ocultos... Pero el objetivo del curso 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.
Página 94 de 240
Programación en PHP
Declaración del formulario Un formulario se distingue por estar encuadrado entre una etiqueta de comienzo de formulario <form ...> y una de final de formulario </form>. La etiqueta de comienzo de formulario ha de tener al menos tres atributos. • • • •
name - No es obligatorio pero sí muy recomendable darle un nombre al formulario para que sea fácil de identificar. method - Este parámetro puede tomar dos valores según la forma de enviar los datos: • get - Los datos se envían codificados en la URL (dirección de la página destino). • 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 datos Botones de acciones </form>
Campos Una vez declarado el formulario hemos de poner un campo para cada uno de los datos que 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 opciones que 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">
Plataforma de Teleformación de IFES
Página 95 de 240
<input type="checkbox" name="musica"> <input type="checkbox" name="lectura"> •
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 lista desplegable. <select name="sexo"> <option>hombre</option> <option>mujer</option> </select>
•
Área de texto - Sirve para poder recibir textos largos compuestos por varias líneas. <textarea name="opinion"></textarea>
•
Campo oculto - En ocasiones queremos pasar un dato a la página PHP que procesará el formulario pero no queremos que éste se muestre en un campo visible. Puede ser útil para pasar información entre páginas PHP independientes. <input type="hidden" name="referencia">
En todos ellos es importante poner el atributo name que es el nombre de variable con el cual vamos a recibir los datos. El atributo value es opcional e indica el valor predefinido que se les da.
Botones Todos los formularios han de tener un botón para enviar los datos una vez que se han rellenado. <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">
Página 96 de 240
Programación en PHP
Ejemplo 3.4.1. A continuación se muestra un formulario formado por algunos de los tipos de campos descritos con anterioridad y se guarda en un archivo llamado encuesta.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> 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:
Plataforma de Teleformación de IFES
Página 97 de 240
Recepción de datos de formularios Recibir los datos no puede ser más sencillo. El script de destino tendrá definida un variable por cada campo con el mismo nombre que se le haya dado en el formulario. Y esta variable contendrá el valor que se haya introducido en el campo. Esta variable ya está disponible desde el comienzo del script, no hay que hacer nada especial, sólo leer su contenido. Ejemplo 3.4.2. Esta página PHP recibe los datos de la encuesta y los muestra. Para que funcione hay que guardarla con el nombre verificar.php , que es el que aparecía en el atributo action del formulario. <?php echo "Comprueba si tus datos son correctos.<br>";
Página 98 de 240
Programación en PHP
echo "<br>"; echo "$nombre.<br>"; echo "Nivel de internet $nivel.<br>"; 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 un array asociativo con nombre de variable $_REQUEST. Podemos ver su contenido
Plataforma de Teleformación de IFES
Página 99 de 240
usando la función print_r() que se vió en la unidad didáctica anterior. Esto nos ofrece otra forma de acceder a los datos recibidos, que es más explícita y por lo tanto hace el código más legible. <pre> <?php print_r($_REQUEST); ?> </pre> Ejemplo 3.4.4. El ejemplo 3.4.3. Podría haber sido escrito también de la siguiente forma (se muestran sólo las primeras líneas, un buen ejercicio sería completarlas). <?php echo "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ón de los mismos. El atributo action de la etiqueta form ha de ser el mismo que el nombre de la página. Para ello usamos la variable predefinida $PHP_SELF que contiene el nombre de archivo de la misma página. Podemos guardar este archivo con el nombre juegoppt.php. <?php $opciones = array("piedra", "papel", "tijera"); $jugada=$_POST['jugada']; if ($_POST) { $mijugada = $opciones[rand(0, 2)]; if ($jugada == $mijugada) { $resultado = "Empates.";
Página 100 de 240
Programación en PHP
} else { if (($jugada == "piedra" && $mijugada == "tijera") || ($jugada == "tijera" && $mijugada == "papel") || ($jugada == "papel" && $mijugada == "piedra")) { $resultado = "Tu ganas."; } else { $resultado = "Gano yo."; } } } ?> <!-- Mientras no se seleccione una opción, aunque hagamos clic en jugar, se mostrará el formulario. --> <html> <head> <title>Piedra, papel o tijera</title> </head> <body> <?php if ($jugada) { ?>Has elegido <?php echo $jugada ?>, yo he elegido <?php echo $mijugada ?>. <?php echo $resultado ?> <br>¿Quieres jugar otra vez?<br> <?php } ?> <form name="juego" method="post" action="<?php echo $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="tijera"> <input type="submit" value="Jugar"> </form> </body> </html> El código que se incluye al principio solo se ejecuta si el dato $jugada no llega vació, es decir, cuando se le ha dado al menos una vez al botón de enviar.
Plataforma de Teleformación de IFES
Página 101 de 240
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ágina al navegador sino que se vuelva a la inicial. Esto se puede hacer con un formulario que envía, recibe y procesa datos. Una alternativa es hacer una página que procese los datos y que al terminar se redirija automáticamente a otra. Para poder hacerlo PHP nos ofrece la función header(), que se 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 hay que tener en cuenta que una vez que se llega a la función header no se sigue ejecutando el resto de la página, por lo que las operaciones que queramos hacer las habremos de ejecutar antes. Ejemplo 3.4.6. Éste es un ejemplo típico de recepción de datos. En primer lugar se incluye una sencilla página web con un formulario que pide el nombre y un comentario para almacenarlo en un registro de visitas. En el script insertar.php se almacena en la base de datos y se redirecciona a una página para dar las gracias. •
visita.html <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
Página 102 de 240
Programación en PHP
// Aquí vendría el código para guardar en la base de datos header("location:gracias.html"); //Redirección ?> Mucho ojo. Ni siquiera dejar un espacio en blanco al principio, antes de <?php, del archivo insertar.php, ya que se interpreta como HTML y no funcionará la instrucción header. •
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 de error en el caso de que haya fallos en los datos. En este ejemplo se pide una dirección de 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 name="suscripcion" method="post" action="guardar.php"> Email: <input type="text" name="email" size="40"><br>
Plataforma de Teleformación de IFES
Página 103 de 240
<input type="submit" value="Enviar"> </form> </body> </html> •
guardar.php <?php $email=$_POST[email]; // Asigna el valor que se indicó en el formulario. //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, "."); if ($posicion_arroba && $posicion_punto) { // Aquí vendría el código para guardar en la base de datos header("location:confirmacion.html"); //Redirección } else { // Aquí vendría el código para guardar en la base de datos header("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>
Página 104 de 240
Programación en PHP
<body> Introdujo una dirección de correo no válida.<br> Por favor vuelva a solicitar la suscripción. <a href="suscripcion.html"> Volver </a> </body> </html >
U.D.5. Manejo de ficheros Mediante los formularios hemos conseguido aportar interactividad a nuestra páginas web. Pero otra de las limitaciones fundamentales de lo que podemos hacer con lo que sabemos hasta el momento es que una vez que se cierra una página web los datos que contiene 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 casos en los que la información que queremos guardar es pequeña. En esta unidad didáctica veremos cómo podemos usar PHP para acceder al sistema de archivos del servidor para poder leer o guardar datos.
Manejo de ficheros Abrir Para acceder a un archivo primero es necesario abrirlo. Para ello usaremos la función fopen() que tiene dos argumentos, el nombre del archivo a acceder y el modo de acceder a éste. fopen(ruta al archivo, modo de acceso ) PHP ofrece los siguientes modos de acceso:
Plataforma de Teleformación de IFES
Página 105 de 240
El apuntador es la posición del archivo en la que leemos o escribimos. Como podemos ver lo más habitual es que lo situemos al principio para leer todo su contenido o al final para ir añadiendo datos. La función devuelve un manejador que usaremos posteriormente para manipular el archivo (y que guardaremos en una variable), o devuelve FALSE si no ha podido acceder por alguna causa (permisos, ruta, memoria,etc.).
Cerrar Mientras hacemos operaciones con el archivo, éste lo hemos de mantener abierto, pero al terminar de trabajar con él, hay que cerrarlo para que el sistema operativo pueda disponer de este archivo (mientras está abierto el sistema operativo lo bloquea para que no puedan 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 la variable que contiene el manejador del archivo. fclose(archivo ) Ejemplo 3.5.1. En este código se abre un fichero en modo lectura. Si la función de apertura se ha conseguido, se muestra un mensaje de confirmación, y si ha fallado se muestra un mensaje de error. Finalmente el archivo se cierra.
Página 106 de 240
Programación en PHP
<?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); ?> Si la apertura o el cierre falla, se genera un error de nivel E_WARNING. Se puede usar @ para suprimir esta advertencia. @$archivo = fopen($ruta, "r"); y @fclose($archivo); Ejemplo 3.5.2. El fichero que abrimos lo podemos localizar mediante una ruta absoluta o relativa. Aunque en Windows las rutas se construyan usando la contrabarra " \ " PHP admite que se separen los directorios con la barra normal " / " como en Linux. Ésta es la forma que elegiremos ya que las rutas relativas que contruyamos de esta forma serán válidas tanto si instalamos nuestra aplicación en Linux como en Windows. <?php $ruta_absoluta = "c:/xampp/htdocs/index.php"; $ruta_relativa = "../practicasPHP/config.php"; if ($archivo1 = fopen($ruta_absoluta, "r")){ echo "El archivo $ruta_absoluta ha sido abierto"; echo "<br>"; } if ($archivo2 = fopen($ruta_relativa, "r")){ echo "El archivo $ruta_relativa ha sido abierto"; echo "<br>"; } fclose($archivo1); fclose($archivo2); ?> Plataforma de Teleformación de IFES
Página 107 de 240
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 de hacerlo. Una de las más sencillas es mediante la función fread() que lee un número de caracteres de un archivo. En conjunción con la función filesize() que nos devuelve el tamaño del archivo en bytes se puede usar para leer todo el archivo. fread(archivo, tamaño ) Ejemplo 3.5.4. Lectura del archivo prueba.txt . Para que el archivo funcione tendremos que 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 ello se usa una función muy sencilla, fwrite() que escribe en la posición en la que está el Página 108 de 240
Programación en PHP
apuntador (normalmente, si hemos abierto el archivo en modo "a" escribiremos al final del archivo). La función fwrite() usa dos parámetros. El primero el manejador del archivo y el segundo 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 dos frases en el archivo. <?php $archivo = fopen("refranes.txt", "a"); fwrite($archivo, "Si las barbas de tu vecino 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 sistema operativo Windows. En Linux se usa solo la cadena " \n ". Si lo que queremos es sobrescribirlo, abriremos el archivo en modo "w", de tal forma que 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, 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 el caso de que no lo haya conseguido (por no tener permisos o sencillamente porque no existe el archivo) devuelve FALSE. unlink(archivo )
Plataforma de Teleformación de IFES
Página 109 de 240
Ejemplo 3.5.6. Este programa intenta borrar un archivo y en el caso de no conseguirlo muestra un mensaje de error. <?php if (!unlink("prueba.txt")) { echo "No se ha podido borrar el archivo."; } else { echo "El archivo ha sido borrado"; } ?>
Atributos de un archivo Para manejar de forma segura un archivo, es conveniente que conozcamos sus atributos. Por ejemplo, antes de abrir un archivo para escritura convendría comprobar si tenemos permisos de escritura. 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 del mismo.
is_file() Devuelve TRUE si el archivo es un fichero.
is_dir() Devuelve TRUE si el archivo es un directorio.
Página 110 de 240
Programación en PHP
is_readable() 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 archivo prueba.txt. <?php $ruta = "prueba.txt"; if (file_exists($ruta)) { echo "$ruta tiene un tamaño de "; echo filesize($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 que en la mayoría de los casos lo único que nos interese de un directorio es conocer los
Plataforma de Teleformación de IFES
Página 111 de 240
archivos que tiene. Una vez que conozcamos este dato, podremos construir rutas relativas a sus subdirectorios y a su vez listarlos y así de forma sucesiva.
Abrir un directorio De forma similar a como sucedía con los archivos, antes de trabajar con un directorio lo tendremos que abrir. Nos serviremos de la función opendir() que devuelve un manejador del directorio. opendir(ruta al directorio)
Listar los archivos de un directorio Para conocer los ficheros y subdirectorios que contiene un directorio se usa la función readdir(). Cada vez que llamemos a esta función, nos devolverá el nombre de cada archivo 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 o directorios. <?php $num_dir=0; // Cuenta el número de directorios $num_fic=0; // Cuenta el número de ficheros $contador=1; // Enumera los que va habiendo $directorio = opendir("."); while ($archivo = readdir($directorio)) { if (is_file($archivo)) { echo "$contador.- $archivo es un fichero.<br>"; $num_fic++; $contador++; } if (is_dir($archivo)) { echo "$contador.- $archivo es un directorio.<br>"; $num_dir++; $contador++; } Página 112 de 240
Programación en PHP
} echo "El número de directorios es $num_dir <br> "; echo "El número de ficheros es $num_fic"; ?>
Subir archivos al servidor El envío de archivos desde el cliente, es una de las posibilidades más atractivas para una aplicación web. Se pueden subir de esta forma fotos, un currículum, un documento PDF, etc.. Ejemplo 3.5.9. Se va a explicar cómo subir un archivo a través de un ejemplo. En primer 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"> </form> </body> </html>
Además de este formulario necesitaremos una página dinámica en PHP que reciba el archivo 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 el servidor 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
Plataforma de Teleformación de IFES
Página 113 de 240
<?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. Si no es así la operación fallaría. El tamaño máximo de subida viene indicado con la variable upload_max_filesize, que se encuentra definida en el archivo de configuración de php. Este valor se puede variar, pero teniendo presente que valores muy elevados podrían provocar que nuestro servidor se quedara sin espacio de disco duro. Si el archivo existe, éste se sobrescribe.
Resumen módulo III Este recurso es de tipo Multimedia. Tiene que conectarse a la plataforma para acceder a este recurso.
Práctica: Conceptos avanzados Este recurso es de tipo Práctica. Tiene que conectarse a la plataforma para acceder a este recurso.
Autoevaluación módulo III
Página 114 de 240
Programación en PHP
Pregunta 1: No se puede acceder a un carácter aislado de un dato de tipo cadena. • •
Verdadero Falso
Respuesta correcta: Falso Pregunta 2: Cuando se incluyen determinados caracteres entre comillas, es necesario "escaparlos" para que los reconozca el interprete de PHP. • Verdadero • Falso Respuesta correcta: Verdadero Pregunta 3: En un array los índices han de ser siempre números enteros. • •
Verdadero Falso
Respuesta correcta: Falso Pregunta 4: Las sentencias más adecuadas para recorrer arrays son las estructuras iterativas (bucles) como por ejemplo while y for. • •
Verdadero Falso
Respuesta correcta: Verdadero Pregunta 5: Este programa imprime un 8 por pantalla: <?php function dividir($numero) { $numero = $numero / 2; }
Plataforma de Teleformación de IFES
Página 115 de 240
$numero = 8; dividir($numero); echo $numero; ?> • Verdadero • Falso Respuesta correcta: Verdadero Pregunta 6: Para hacer uso de una función del núcleo de PHP (predefinida del lenguaje PHP) es necesario incluir antes la extensión correspondiente mediante la instrucción include(). • •
Verdadero Falso
Respuesta correcta: Falso Pregunta 7: Tenemos el siguiente formulario(no se muestra la cabecera HTML): <form name="formulario" method="get" action="procesar.php"> <input type="text" name="edad"> <input type="submit" value="Enviar"> </form> Y la siguiente página llamada procesar.php . <?php echo "$edad años, estás hecho un chaval"; ?> Este código tiene el comportamiento esperado, es decir, si en el fomulario ponemos edad: 33 y pulsamos enviar el navegador mostrará una página con "33 años, estás hecho un chaval". • Verdadero • Falso
Página 116 de 240
Programación en PHP
Respuesta correcta: Falso Pregunta 8: Para pasar datos entre páginas PHP independientes se pueden usar formularios con campos ocultos (del tipo hidden ). • Verdadero • Falso Respuesta correcta: Verdadero Pregunta 9: Desde un script PHP podemos abrir cualquier fichero, independientemente de que esté protegido por el sistema operativo del servidor. • Verdadero • Falso Respuesta correcta: Falso Pregunta 10: PHP no permite borrar ficheros a menos que su contenido esté vacío. • •
Verdadero Falso
Respuesta correcta: Falso
Plataforma de Teleformación de IFES
Página 117 de 240
Programaciรณn en PHP
Prรกctica intermedia Este recurso es de tipo Prรกctica. Tiene que conectarse a la plataforma para acceder a este recurso.
Pรกgina 118 de 240
Programaciรณn en PHP
Programación en PHP
Evaluación primera Este recurso es de tipo Evaluación. Debe conectarse a la plataforma para realizar la evaluación. Recuerde que las evaluaciones son obligatorias ya que determinan la nota final.
Plataforma de Teleformación de IFES
Página 119 de 240
Programación en PHP
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 por algoritmos y estructuras de datos.
En lo que llevamos de curso hemos estudiado a fondo la primera parte, los algoritmos para 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 la autopista de la información. Por lo tanto, cualquier lenguaje de programación web que se precie estará orientado a recibir, procesar y enviar información. Pero para hacerlo necesita un respaldo potente como almacen de información. Hasta ahora el único mecanismo que hemos visto para guardar datos de forma permanente es escribir y leer en ficheros alojados en el servidor. Esto, para grandes cantidades de información es inviable. Es preferible delegar esta función a software especializado, los sistemas 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 en la generación de una página web con un nuevo elemento.
Página 120 de 240
Programación en PHP
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 el servidor web o en uno diferente. En nuestro entorno (suponiendo que estemos usando XAMPP), tenemos el servidor Apache y la base de datos MySQL en el mismo ordenador. PHP es el encargado de la comunicación entre la segunda y la tercera capa. Esto lo puede hacer de dos formas.
Plataforma de Teleformación de IFES
Página 121 de 240
• •
Mediante el API específico de la base de datos. Mediante ODBC, el estándar 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?
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 y administrar. El usuario se puede desentender de dónde y cómo se almacenan los datos. La información puede ser recuperada o almacenada mediante "consultas" que ofrecen una amplia flexibilidad y poder para administrar la información. Las bases de datos relacionales guardan la información en tablas formadas por registros (las filas de la tabla) que están formados por campos (las columnas de un tabla).
MySQL MySQL es un producto desarrollado por la compañía MySQL AB. Es el sistema gestor de bases de datos más utilizado en las aplicaciones web de Internet. En sus comienzos carecía de muchas funcionalidades habituales en este tipo de bases de datos, como integridad referencial o soporte para transacciones. Pero incluso con estos inconvenientes se volvió muy popular. La versión actual ha evolucionado notablemente 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.
Página 122 de 240
Programación en PHP
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 de consultas estructurado. Es un lenguaje que se usa para comunicarnos con el sistema gestor de bases de datos. A la hora de recuperar información es potente y sencillo, y lo hace de forma estructurada.
Trabajar con MySQL El lenguaje de consultas SQL se va a explicar a través de ejemplos sobre MySQL. Para ello haremos uso de phpMyAdmin, una interfaz gráfica que nos facilitará el manejo del Gestor de Bases de Datos MySql. Para poder acceder a phpMyAdmin, en nuestro navegador escribiremos lo siguiente: http://localhost/phpmyadmin 1. XAMPP debe estar iniciado. De no ser así, iremos a la carpeta C:\xampp y ejecutaremos xampp_control.exe. Nos aparecerá la siguiente pantalla.
Plataforma de Teleformación de IFES
Página 123 de 240
2. Una vez arrancado XAMPP, hacemos clic en el botón Start que está a la derecha de Apache y en el botón Start que está a la derecha de MySql. Ambos servicios se pondrán en marcha y la pantalla anterior deberá mostrarse con los textos running, tal y como muestra la imagen que puede ver seguidamente.
Página 124 de 240
Programación en PHP
3. Ya puede ejecutar phpMyAdmin, para ello teclee en su navegador: http://localhost/phpmyadmin También puede acceder haciendo clic en el botón admin que hay a la derecha, en la misma fila, que MySql. Esto hará que se le abra el navegador con la siguiente pantalla:
Plataforma de Teleformación de IFES
Página 125 de 240
Gracias a esta herramienta, podremos crear nuestras Bases de Datos sin necesidad de escribir las instrucciones en SQL, aunque nosotros aquí explicaremos los dos métodos, esto nos ayudará a entender qué es lo que estamos haciendo. Para practicar, puedes realizar los dos métodos, pero recuerda que debes utilizar nombres distintos, ya que no pueden existir dos Bases de Datos con el mismo nombre.
Sintaxis de SQL A diferencia de PHP, MySQL no distingue entre mayúsculas y minúsculas y las instrucciones se pueden escribir tanto en una como en la otra forma. Pero para hacer más legible lo que leemos, lo habitual es escribir las palabras clave del lenguaje en mayúsculas y el resto del código en minúsculas. Ésta es la convención que se sigue en este texto.
Página 126 de 240
Programación en PHP
Otra característica de MySQL es que las sentencias se terminan siempre en punto y coma, como en PHP. Para escribir las sentencias, debemos hacer clic en la pestaña SQL, lo que hará que se nos muestre la siguiente opción:
Crear la estructura de la base de datos Antes de poder almacenar datos hemos de crear una estructura que los pueda contener.
Creación de una base de datos MySQL es un sistema gestor de bases de datos, que puede gestionar más de una base de datos independiente. Por lo tanto lo primero que debemos hacer es crear nuestra base de datos personal que utilizaremos durante las pruebas. Para ello se usa la sentencia SQL CREATE DATABASE. CREATE DATABASE nombre_base_datos; Ejemplo 4.3.1. Creamos nuestra base de datos que llamaremos curso_php.
Plataforma de Teleformación de IFES
Página 127 de 240
Una vez escrita la sentencia, haremos clic en el botón continuar. Podremos comprobar como a la izquierda aparece el nombre de la base de datos. La siguiente imagen nos muestra el resultado.
Se puede ver que a la derecha del nombre no hay ningún número entre paréntesis, como ocurre con los otros nombres. Esto quiere decir que nuestra Base de Datos todavía no tiene ninguna tabla. Según vayamos creando tablas, este número irá aumentando. Las otras Bases de Datos que aparecen, y que nosotros no hemos creado, están ahí porque las creó phpMyAdmin cuando se instaló. No se deben tocar, ya que cualquier modificación podría provocar que el sistema no funcione correctamente.
Página 128 de 240
Programación en PHP
Selección de una base de datos Antes de poder trabajar con la base de datos hemos de seleccionarla. Para ello usaremos 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 de datos curso_php .
Como estamos trabajando con phpmyadmin, para seleccionar una tabla, hacemos clic sobre su nombre en el menú de la izquierda. Se nos mostrará la siguiente imagen:
Plataforma de Teleformación de IFES
Página 129 de 240
Y, como podemos ver, todavía no tiene ninguna tabla. El cero entre paréntesis así nos lo indica.
Creación de tablas Las bases de datos almacenan la información en tablas, que son el pilar fundamental de las bases de datos relacionales. La instrucción SQL que se utiliza para crear una tabla es CREATE TABLE. CREATE TABLE nombre_tabla ( definicion_tabla ); La definción de la tabla está compuesta por una lista de sus campos (columnas). Los campos CREATE TABLE nombre_tabla ( nombre_campo1 tipo_campo1 atributos_campo1, nombre_campo2 tipo_campo2 atributos_campo2 , ... ); La definición de cada campo, salvo del último, debe termninar en coma. Cada campo solo puede almacenar un tipo de datos, de momento nos bastará con conocer los siguientes: Página 130 de 240
Programación en PHP
• • • •
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 una excepción. en casi todas las tablas se suele poner un campo id que contenga un identificador ú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áticamente incrementá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 los empleados de una empresa. CREATE TABLE empleados ( id INT PRIMARY KEY AUTO_INCREMENT, nombre CHAR(50), puesto CHAR(20), fecha_nacimiento DATE, salario INT); Para ejecutar esta sentencia SQL podemos copiarla y pegarla en la consola de MySQL.
Plataforma de Teleformación de IFES
Página 131 de 240
Hacemos clic en el botón continuar para que se ejecute la sentencia. Nos aparecerá la siguiente pantalla, indicándonos que se ha creado la tabla. Observe como ahora hay un uno entre paréntesis.
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 vez que 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 formato YYYY-MMDD (4 cifras para el año, guión, 2 cifras para el mes, guión, 2 cifras apra el día). No tiene atributos. salario - Campo de tipo entero que guarda el sueldo en euros del empleado. No tiene atributos.
Listar tablas Para ver todas las tablas que hay disponibles en una base de datos se usa la instrucción SHOW TABLES.
Página 132 de 240
Programación en PHP
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 puede comporbar que coincide con la definiciรณn que hemos puesto al crearla.
Plataforma de Teleformaciรณn de IFES
Pรกgina 133 de 240
Borrar tablas Para borrar una tabla se usa la sentencia SQL DROP TABLE. Hay que tener mucho cuidado ya que al borrar una tabla borramos de forma irrecuperable todos los datos que hubieramos introducido. DROP TABLE nombre_tabla ; Ejemplo 4.3.6. Vamos a eliminar la tabla empleados . Todos los datos que contenga se borrarรกn. Una vez ejecutada la sentencia, se mostrarรก la siguiente imagen:
Pรกgina 134 de 240
Programaciรณn en PHP
Si ha eliminado la tabla, vuelva a crearla tal y como hizo anteriormente. Necesitamos la tabla empleados para poder ejecutar los siguientes ejemplos.
Operaciones con datos Ya tenemos la estructura que va a dar soporte a los datos, ahora nos falta saber cómo podemos 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 un armazó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 datos en la tabla empleados. Al igual que en PHP, los datos que son cadenas de texto los ponemos entre comillas, al igual que la fecha. El campo id no hace falta insertarlo ya que lo hemos definido como autoincremental. INSERT INTO empleados (nombre, puesto, fecha_nacimiento,salario) VALUES ("Silvia","Administrativo","30-09-1967",1200);
Plataforma de Teleformación de IFES
Página 135 de 240
Ejemplo 4.3.9. Se pueden insertar varios registros (filas) en una tabla con una sentencia insert, separando los conjuntos de valores entre paréntesis por comas. INSERT INTO empleados (nombre, puesto, fecha_nacimiento,salario) VALUES ("Ana","Programadora","1967-04-06", 1500), ("Juan","Abogado","1971-08-30"1300), ("Berta","Comercial","1980-11-12",2000);
Página 136 de 240
Programación en PHP
La fecha debe tener el formato año/mes/día
Leyendo datos de una tabla Aquí es donde se despliega la potencia de SQL, que además tiene una sintaxis muy fácil de comprender. Los datos se leen de la tabla a través de consultas, que son como preguntas 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.
Plataforma de Teleformación de IFES
Página 137 de 240
SELECT id, nombre, puesto, fecha_nacimiento, salario FROM empleados;
Ejemplo 4.3.11. En muchos casos querremos seleccionar todos los campos de la tabla. Para ello se usa el comodín asterísco " * ", de tal forma que esta consulta muestra exáctamente el mismo resultado que la anterior. SELECT * FROM tabla ;
Página 138 de 240
Programación en PHP
Ejemplo 4.3.12. En este caso restringimos el rango de la consulta al campo nombre. SELECT nombre FROM empleados;
Plataforma de Teleformaci贸n de IFES
P谩gina 139 de 240
Filtrando datos de una tabla La clausula WHERE en una consulta SELECT permite poner condiciones de manera que se nos muestren solo los registros que la cumplen. Esta es la sintaxis de la sentencia 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 salario es mayor de 1400 euros. SELECT * FROM empleados WHERE salario>1400;
Pรกgina 140 de 240
Programaciรณn en PHP
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 tienen dudas sobre las reglas de precedencia. Ejemplo 4.3.14. Empleados que cobran más de 1400 euros y que nacieron antes de 1975. SELECT * FROM empleados WHERE salario>1400 AND fecha_nacimiento<"1975-01-01";
Plataforma de Teleformación de IFES
Página 141 de 240
Ejemplo 4.3.15. Empleados que tabajan de comerciales o programadores. SELECT * FROM empleados WHERE puesto="Comercial" OR puesto="Programador" OR puesto="Programadora";
P谩gina 142 de 240
Programaci贸n en PHP
Ejemplo 4.3.16. Búsqueda textual. En ocasiones se quiere buscar los registros cuyo texto contiene otro. Para ello, en lugar de comparar con el operador igual " = " se usa el operdor LIKE y la cadena son la que se compara se pone entre comillas y signos de porcentaje "%cadena %". Esta consulta muestra los registros cuyo nombre contiene la cadena "an". SELECT * FROM empleados WHERE nombre LIKE "%an%";
Plataforma de Teleformación de IFES
Página 143 de 240
Ordenar datos de una consulta En muchas ocasiones querremos que los datos devueltos nos lleguen ordenados. Para ello usaremos con el SELECT la cláusula ORDER BY a la que le acompaña el campo por el que queremos ordenar. En el caso de que haya una cláusula WHERE, ORDER BY ha de ir detrás 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 el nombre del empleado en orden alfabético. SELECT * FROM empleados ORDER BY nombre;
Página 144 de 240
Programación en PHP
Ejemplo 4.3.18. Mediante el modificador DESC se pueden devolver los resultados en orden inverso. SELECT * FROM empleados ORDER BY salario DESC;
Plataforma de Teleformaci贸n de IFES
P谩gina 145 de 240
Actualizar datos Además de añadir datos, necesitaremos saber cómo modificar los existentes. La sentencia UPDATE se encarga de esto. Se suele usar en combinación con una condició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 a la empleada Ana. Como la tabla tiene un campo id, es por éste por el que filtraremos. Después hacemos un SELECT para comprobar que la tabla se ha actualizado. UPDATE empleados SET salario = 1800 WHERE id = 2;
Página 146 de 240
Programación en PHP
Y al realizar la consulta, vemos que el salario de Ana ha cambiado a 1800. SELECT * FROM empleados;
Plataforma de Teleformaci贸n de IFES
P谩gina 147 de 240
Ejemplo 4.3.20. Si no filtramos la actuallización se verán afectados todos los registros de la tabla. UPDATE empleados SET salario = 2500; Al ejecutar esta sentencia, el campos salario será 2500 para todos los registros. En una sentencia UPDATE se pueden sustituir varios campos a la vez separandolos por 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 en combinación con una condición que filtra los datos a borrar. Si se usara sola, borraría todos los datos de la tabla. Su uso tiene cierta similitud con SELECT, con la diferencia de que no hay que indicar campos ya que se borra toda la fila.
Página 148 de 240
Programación en PHP
DELETE FROM tabla WHERE condiciones; Ejemplo 4.3.21. Borrado del empleado Juan. Una vez más se selecciona por el id . DELETE FROM empleados WHERE id = 3; Si ahora hacemos una consulta de toda la tabla, veremos que la fila de Juan ya no está. Ejemplo 4.3.22. Al usar la sentencia DELETE sin filtrar se están borrando todos los datos de la tabla (pero no su definición). Luego al hacer el SELECT el mensaje Empty set nos indica que la tabla está vacía. DELETE FROM empleados;
Crear la estructura de la base de datos mediante phpMyAdmin Ahora vamos a crear la base de datos y las tablas haciendo uso de la herramienta gráfica. No será necesario escribir sentencias de SQL, lo que haremos será seleccionar las opciones que nos interesen para definir la estructura de nuestra base de datos. Anteriormente se hizo uso de SQL para conocer dichas sentencias, ya que sí las utilizaremos embebiéndolas en nuestro código PHP.
Crear la base de datos Tenemos que situarnos en la siguiente sección de la ventana general e indicar los siguientes valores. Una vez indicados, hacemos clic en el botón Crear.
Si todo ha ido bien, nos aparecerá un mensaje diciendo que la base de datos se ha creado.
Plataforma de Teleformación de IFES
Página 149 de 240
No puede haber dos bases de datos con el mismo nombre. Si en los pasos anteriores se le puso el nombre curso_php, ahora será necesario indicarle otro nombre. O borrar la base de datos y volver a crearla.
Crear tablas en la base de datos Al hacer clic en el menú de la izquierda sobre el nombre de la base de datos que hemos creado, nos aparece la siguiente pantalla, donde indico el nombre de la tabla y el número de campos que tendrá. En la siguiente imagen vemos como quedaría.
Como hicimos anteriormente, el nombre de la tabla es empleados, y el número de campos es 5. Pulsamos sobre el botón continuar y, en la nueva pantalla, indicamos los nombres de los campos así como los tipos.
Página 150 de 240
Programación en PHP
como no podemos ver toda la pantalla, nos movemos hacia la derecha para poder definir el resto de valores, como se indica en la siguiente imagen.
Plataforma de Teleformaci贸n de IFES
P谩gina 151 de 240
Y finalmente hacemos clic en el bot贸 grabar. Si todo ha ido bien se muestra la siguiente pantalla:
P谩gina 152 de 240
Programaci贸n en PHP
Plataforma de Teleformaci贸n de IFES
P谩gina 153 de 240
Esta operación deberemos hacerla para cada una de las tablas que constituyan nuestra base de datos. Una vez creadas las tablas de nuestra base de datos, para introducir, borrar, modificar, consultar tablas, lo haremos a través de PHP haciendo uso de las sentencias que vimos anteriormente.
U.D.4. Funciones de PHP con MySQL Una vez que conocemos las características básicas de MySQL y las sentencias SQL que se pueden ejecuar vamos a ver cómo se integra MySQL con PHP. Las definiciones de bases de datos y tablas las hacemos desde phpMyAdmin. La manipulación de datos en cambio se hará desde PHP. Las operaciones que nos interesan son, por lo tanto: • • • •
Leer datos. Añadir datos. Modificar datos. Eliminar datos.
PHP accede a MySQL a través del API. Dispone de una extensión (biblioteca de funciones) 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 gestor de bases de datos y declarar la base de datos que vamos a usar. Esto se deberá hacer en 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:
Página 154 de 240
Programación en PHP
•
servidor - Nombre o dirección IP del servidor donde está alojada la base de datos. Si está instalado en la misma máquina que el servidor web lo normal es que sea localhost . Se puede elegir un número de puerto diferente del que se usa por defecto poniendo detras del servidor dos puntos " : " y el número del 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 una variable 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 la que tengamos la referencia a la base de datos. Es equivalente en MySQL a la sentencia USE. mysql_select_db(nombre_base_datos , referencia_bd ) Ejemplo 4.4.1. Los ejemplos de esta unidad didáctica usarán la base de datos creada en la unidad didáctica anterior llamada curso_php con la tabla empleados y con los cuatro 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 este momento. mysql_select_db("curso_php"); ?> Ejemplo 4.4.2. Una buena idea es guardar el proceso de conexión a la base de datos y luego utilizarlo en nuestros scripts mediante un include() . Aquí se ha creado el fichero conectar_bd.php. <?php DEFINE(DB_HOST, "localhost");DEFINE(DB_USER, "root"); DEFINE(DB_PASSWORD, "");DEFINE(DB_NAME, "curso_php");
Plataforma de Teleformación de IFES
Página 155 de 240
$con = @mysql_connect(DB_HOST, DB_USER, DB_PASSWORD); if (!$con || !mysql_select_db("curso_php")) { 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() que termina la ejecución del script sacando un mensaje por pantalla. También se ha usado el operador de supresión de errores "@ ". Al incluir este fichero de configuración en el siguiente script, se comporta igual que en ejemplo 4.4.1., solo que mejorado para emitir mensajes de error. <?php include("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ón mysql_query(). Su potencia es enorme ya que permite enviar una instrucción SQL, como las vistas en el capítulo anterior, a la base de datos. Para leer datos la sentencia que usaremos será obviamente un SELECT.
mysql_query() La sintaxis de esta función es muy sencilla. La sentencia SQL es la misma que pondríamos en la consola de MySQL, aunque no es necesario poner el punto y coma final 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ún dato. Por ello devuelve un identificador del resultado que se usa en otras funciones para visualizar los valores devueltos por la consulta. Página 156 de 240
Programación en PHP
Ejemplo 4.4.3. Aquí se muestra como se ejecuta una sentencia SQL. <?php include("conectar_bd.php"); $resultado = mysql_query("SELECT * FROM empleados"); ?> Ejemplo 4.4.4. Mejoraremos la claridad del código si guardamos la sentencia SQL en una variable. <?php include("conectar_bd.php"); $consulta = "SELECT * FROM empleados"; $resultado = mysql_query($consulta); ?>
mysql_num_rows() Antes de acceder al resultado nos interesa saber cuántos registros se han obtenido. Concretamente una consulta podría no devolver ningún resultado y esto podría causar un error en nuestro código. Esta función nos dará el número de filas (registros) que tiene un resultado obtenido de una consulta de tipo select (y solamente de este tipo, las consultas de inserción/ borrado/actualización tienen otra función, mysql_affected_rows). mysql_num_rows(identificador_de_resultado )
mysql_result() De acuerdo, ya hemos ejecutado la sentencia SQL, pero ¿cómo accedemos al resultado?. Para ello nos sirve la función mysql_result() . mysql_result(identificador_de_resultado, fila, nombre_campo)
Plataforma de Teleformación de IFES
Página 157 de 240
El campo se puede seleccionar también mediante un número, que es su posición entre los campos devueltos. Ejemplo 4.4.5. mysql_result() se suele usar en conjunción con la función mysql_num_rows() para controlar las filas que se están recuperando. La estructura ideal es un bucle for . En este ejemplo se muestra una consulta limitada en el rango (solo se recupera el campo nombre ). <?php include("conectar_bd.php"); $consulta = "SELECT nombre FROM empleados"; $resultado = mysql_query($consulta); $filas = mysql_num_rows($resultado); for ($i = 0; $i < $filas; $i++) { $nombre = mysql_result($resultado, $i, "nombre"); echo "$nombre<br>"; } ?> Ejemplo 4.4.6. Aquí se pone junto todo lo que hemos visto hasta ahora y se muestra la tabla empleados dentro de una tabla HTML. <?php include("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 $consulta = "SELECT * FROM empleados"; $resultado = mysql_query($consulta); $filas = mysql_num_rows($resultado);
Página 158 de 240
Programación en PHP
for ($i = 0; $i < $filas; $i++) { echo "<tr>"; $id = mysql_result($resultado, $i, "id"); echo "<td>$id</td>"; $nombre = mysql_result($resultado, $i, "nombre"); echo "<td>$nombre</td>"; $puesto = mysql_result($resultado, $i, "puesto"); echo "<td>$puesto</td>"; $f_nacimiento = mysql_result($resultado, $i, "fecha_nacimiento"); echo "<td>$f_nacimiento</td>"; $salario = mysql_result($resultado, $i, "salario"); echo "<td>$salario</td>"; echo "</tr>"; } ?> </table> Ejemplo 4.4.7. Con un pequeño cambio en la sentencia SQL mostraremos las filas ordenadas 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 la sentencia 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 diferencia es que en lugar de extraerse las celdas de la tabla de una en una se recupera un array asociativo por cada fila que tiene como índices los nombres de los campos.
Plataforma de Teleformación de IFES
Página 159 de 240
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. mysql_fetch_array(identificador_de_resultado ) Ejemplo 4.4.10. Mediante esta función se puede conseguir un código más compacto, y que para algunos será más legible. Como cada llamada a la función recupera una fila y pasa a la siguiente no es necesario recuperar mediante mysql_num_rows() el número de filas que contiene el resultado. Este código es equivalente al del ejercicio 4.4.6. <?php include("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 $consulta = "SELECT * FROM empleados"; $resultado = mysql_query($consulta); $fila = mysql_fetch_array($resultado); 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($resultado); } ?> </table>
Página 160 de 240
Programación en PHP
Añadir datos Para añadir datos no necesitamos conocer nada nuevo. Se usa la función mysql_query() pero en esta ocasión se encapsula una sentencia SQL INSERT, que añada datos. Ejemplo 4.4.11. Vamos a añadir un nuevo empleado. Para ello se usará la sentencia SQL "parametrizada", como si se hubiesen recibido los datos de un formulario y se quisieran guardar en la base de datos. <?php include("conectar_bd.php"); $nombre = "Paola"; $puesto = "Programadora"; $fecha_nacimiento = "1958-01-23"; $salario = 1800; $consulta = "INSERT INTO empleados (nombre, puesto, fecha_nacimiento, salario) VALUES ('$nombre', '$puesto', '$fecha_nacimiento', '$salario')"; $resultado = mysql_query($consulta); ?> Podemos comprobar que se ha realizado la inserción tecleando SELECT * FROM empleados desde la consola de MySQL o ejecutando el código del ejercicio 4.4.6. (o del 4.4.10.)
Modificar datos Una vez más usamos la función mysql_query() , con una sentencia SQL del tipo UPDATE. Ejemplo 4.4.12. Vamoa a modificar los datos del empleado que ñadimos en la consulta anterior. <?php include("conectar_bd.php"); $id = 5; //id del registro a modificar Plataforma de Teleformación de IFES
Página 161 de 240
$nuevo_salario = 2100; $consulta = "UPDATE empleados SET salario = $nuevo_salario WHERE id = $id"; $resultado = mysql_query($consulta); ?> Para comprobar que la actualización se ha realizado correctamente, podemos ejecutar el ejercicio 4.4.6 o también ejecutar phpMyAdmin, seleccionar la base de datos curso_php, la tabla empleados y, finalmente, hacer clic en la opción Examinar. Recuerda que para acceder a phpMyAdmin debe estar el servicio en funcionamiento y después escribir en tu navegador la dirección http://localhost/phpmyadmin
Eliminar datos En esta ocasión usamos la función mysql_query() , con una sentencia SQL del tipo DELETE. Ejemplo 4.4.13. Vamos a modificar los datos del empleado que añadimos en la consulta anterior. <?php include("conectar_bd.php"); $id = 5; //id del registro a modificar $consulta = "DELETE FROM empleados WHERE id = $id"; $resultado = mysql_query($consulta); ?> Si accedemos nuevamente a la tabla empleados, tal y como hicimos en el ejercicio anterior, podremos ver que ya no tenemos la fila del empleado Paula, cuyo id era 5.
Arquitectura de 3 capas Este recurso es de tipo Multimedia. Tiene que conectarse a la plataforma para acceder a este recurso.
Página 162 de 240
Programación en PHP
Resumen módulo IV Este recurso es de tipo Multimedia. Tiene que conectarse a la plataforma para acceder a este recurso.
Práctica: PHP y las bases de datos Este recurso es de tipo Práctica. Tiene que conectarse a la plataforma para acceder a este recurso.
Autoevaluación módulo IV Pregunta 1: En una arquitectura web en tres capas el servidor web y el sistema gestro de bases de datos están siempre en ordenadores diferentes. • Verdadero • Falso Respuesta correcta: Falso Pregunta 2: MySQL es muy popular en internet por su sencillez, a pesar de que incluso en la version actual carece de funcionalidades consideradas imprescindibles en este tipo de bases de datos. • Verdadero • Falso Respuesta correcta: Falso Pregunta 3: Un sistema gestor de bases de datos puede contener muchas bases de datos independientes. • Verdadero • Falso Respuesta correcta: Verdadero Pregunta 4:
Plataforma de Teleformación de IFES
Página 163 de 240
En MySQL, antes de utilizar una base de datos es necesario seleccionarla mediante la instrucción SELECT. • Verdadero • Falso Respuesta correcta: Falso Pregunta 5: Las siguientes sentencias SQL, sobre una tabla agenda con los campos id, nombre‚ telefono, email son equivalentes: SELECT nombre, telefono, email FROM agenda; SELECT * FROM agenda; • Verdadero • Falso Respuesta correcta: Falso Pregunta 6: Sobre la tabla agenda, la siguiente sentencia nos muestra los datos de aquellas personas de las que no tenemos la dirección de email. SELECT * FROM agenda WHERE email = ""; • Verdadero • Falso Respuesta correcta: Verdadero Pregunta 7: Las dos instrucciones SQL a continuación tienen exactamente el mismo efecto, ya que ambas borran la tabla agenda . DROP TABLE agenda; DELETE FROM agenda; • Verdadero • Falso Respuesta correcta: Falso Pregunta 8:
Página 164 de 240
Programación en PHP
Después de llamar a una función del API de MySQL podemos llamar a la función mysql_error(). Si no se ha producido un error devuelve la cadena vacía "". Si se ha producido un error nos da un mensaje con una descripción del mismo. • Verdadero • Falso Respuesta correcta: Verdadero Pregunta 9: Antes de poder trabajar con una base de datos en un script PHP es necesario establecer una conexión con el sistema gestor de bases de datos mediante la función mysql_select_db(). • •
Verdadero Falso
Respuesta correcta: Falso Pregunta 10: La función mysql_query() permite ejecutar consultas del tipo SELECT, pero no hacer INSERT, UPDATE o DELETE. • Verdadero • Falso Respuesta correcta: Falso
Plataforma de Teleformación de IFES
Página 165 de 240
Programaci贸n en PHP / M贸dulo IV. PHP y las bases de datos
Videotutoriales Servidor local XAMPP Este recurso es de tipo Multimedia. Tiene que conectarse a la plataforma para acceder a este recurso.
Crear una base de datos Este recurso es de tipo Multimedia. Tiene que conectarse a la plataforma para acceder a este recurso.
P谩gina 166 de 240
Programaci贸n en PHP
Programación en PHP
Evaluación segunda Este recurso es de tipo Evaluación. Debe conectarse a la plataforma para realizar la evaluación. Recuerde que las evaluaciones son obligatorias ya que determinan la nota final.
Plataforma de Teleformación de IFES
Página 167 de 240
Programación en PHP
Módulo V. Aplicaciones comunes en PHP U.D.1. Fecha y hora
Timestamp El concepto de timestamp procede del mundo Unix/Linux. A nivel interno, PHP guarda las fechas como un número entero que corresponde con el número de segundos que han pasado desde una fecha de referencia, concretamente el 1 de enero de 1970. A este formato 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 que la segunda está en formato timestamp .
Ejemplo 5.1.2. El timestamp tiene la ventaja para PHP de que, al ser un número entero, es fácil operar con él. Es sencillo sumar, restar o comparar dos fechas. Siempre que queramos hacer este tipo de operaciones las hemos de hacer en formato timestamp . Con el siguiente ejemplo, podemos ver el timestamp. La función time() nos lo devuelve. <?php
Página 168 de 240
Programación en PHP
echo "El timestamp es ".time(); ?>
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 en formatos timestamp en fechas reconocibles, similares a "12 de octubre de 2010" o "12/02/2010".
Funciones de fecha y hora Setlocale() Si imprimimos con normalidad la fecha en nuestra página, seguramente aparecerá en inglés. tenemos que configurar las locales y PHP hará el resto por nosotros. Las locales nos permiten ajustar el sistema operativo a nuestra cultura y en este caso, nos permiten ajustar las fechas a nuestro idioma. setlocale(LC_ALL, idioma) Veamos cómo configurar las locales para el idioma español. La cadena que identifica al idioma castellano es "esp" en Windows. setlocale(LC_ALL,"esp"); Hay otras, “es_ES@euro y "es_ES", que deberá utilizar si su sistema no es Windows.
Plataforma de Teleformación de IFES
Página 169 de 240
time() Como hemos visto, esta función permite crear una marca timestamp para una fecha y hora dados. time(hora, min, seg, mes, día, año ) Es muy importante observar el orden de los argumentos, que no es al que estamos acostumbrados. 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 modo texto. Su funcionamiento se explica más adelante. <?php $fecha = time(14, 30, 0, 12, 25, 2005); echo @strftime("%c", $fecha); ?> Ejemplo 5.1.4. Nos encontraremos con multitud de ocasiones en las que necesitaremos conocer la fecha actual. time() también se puede usar sin argumentos para obtener el timestamp del momento actual. <?php $fecha = time(); echo @strftime("%d/%m/%Y %H:%M:%S", $fecha); ?>
getDate() Esta función recibe una fecha en formato timestamp y devuelve un array asociativo con todos los datos de esa fecha. getDate(timestamp)
Página 170 de 240
Programación en PHP
Ejemplo 5.1.5. Como es un array asociativo podemos ver su contenido usando la función print_r(). <pre> <?php $fecha = time(); //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 dar formato a una fecha. <?php $fecha = time(); //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, que hemos estado utilizando en los ejemplos anteriores, se emplea para dar formato a las fechas de forma sencilla. Formatea una fecha/hora local según la configuración regional. Los nombres del mes y del día de la semana y otras cadenas dependientes del lenguaje están subordinados a la configuración regional local establecida con setlocale(). strftime(formato, timestamp )
Plataforma de Teleformación de IFES
Página 171 de 240
La cadena de texto formato está formada por texto corriente mezclado con especificadores de conversión. Cada especificador de conversión empieza con el sí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. pero es mucho más conciso y legible. <?php $fecha = time(); //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.
Página 172 de 240
Programación en PHP
<?php $fecha = time(); //timestamp del momento actual 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>"; ?> Esta función tiene la ventaja adicional de que nos puede dar la fecha en castellano (lunes en lugar de monday). Si no fuera así, debemos informar al servidor de cuál es el idioma que deseamos, y para ello utilizamos la sentencia setlocale(LC_ALL,"esp");. Ejemplo 5.1.9. Vamos a usar esta función para mostrar los resultados del ejemplo anterior pero esta vez en español .La cadena que identifica al idioma español es "esp" en Windows. <?php setlocale(LC_TIME ,"esp"); $fecha = time(); //timestamp del momento actual 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 una fecha es correcta, devolviendo TRUE o FALSE según su validez. Las fechas anteriores al año 1 no son válidas. checkdate(mes, día, año )
Plataforma de Teleformación de IFES
Página 173 de 240
Una vez más, el orden en el que se introducen los parámetros no es el tradicional. El mé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 son bisiestos. <?php $dia = 31; $mes = 4; $anyo = 2010; 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 = 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>"; } ?> debemos evitar la utilización de tildes o ñ en los nombres de variables, ya que no serían nombres correctos y, por tanto, PHP ignora dicha variable.
Página 174 de 240
Programación en PHP
U.D.2. Envío de correo electrónico
Consideraciones preliminares El envío de correo electrónico no se puede hacer directamente desde PHP. PHP se limita a encargar a un servidor de correo SMTP que envíe el correo y es éste quien pone el correo en la red. Por lo tanto, para poder enviar correos electrónicos, necesitaremos, además del servidor 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 poder usarlo de forma remota por motivos de seguridad. .
El paquete XAMPP, que hemos elegido para este curso, dispone de un servidor de correo SMTP, llamado Mercury, pero no lo vamos a utilizar ya que su configuración es compleja. En su lugar, utilizaremos Postcast Server. Dispone de una edición libre, que nos podemos descargar, y cuya configuración es muy sencilla.
Plataforma de Teleformación de IFES
Página 175 de 240
1.- Para descargarlo, accedemos a la siguiente dirección: http:// www.postcastserver.com/Download/ y hacemos clic sobre PostCast Server Free Edition v2.6.0 y a continuación hacemos clic en Version 2.6, mirror location 1. La descarga se iniciará automáticamente. Guarden el archivo en su disco duro. 2.- Una vez descargado, descomprimimos el archivo. Para llevar a cabo la instalación, ejecutamos el archivo setup.exe 3.- La instalación consiste en aceptar las condiciones de uso y hacer clic en los botones Next, dejar los valores que aparezcan por defecto y cuando termine la instalación, clic en el botón Finish.
4.- Para poner en funcionamiento el programa, lo hacemos a través del icono que ha creado en el escritorio.
Página 176 de 240
Programación en PHP
5.- Ahora entramos en la configuraciรณn. Para ello, haz clic en el botรณn que hay a la izquierda, llamado settings. Nos mostrarรก la siguiente pantalla:
Plataforma de Teleformaciรณn de IFES
Pรกgina 177 de 240
En la casilla Host name, deberá aparecer el nombre de vuestro ordenador. El valor de DNS server address, también puede cambiar, pero no tienes que cambiarlo por los valores que aquí aparecen, sino por los que te haya suministrato tu proveedor de Internet. El resto de valores deben ser los mismos. 6.- Ahora tenemos que acceder al archivo php.ini, que para los sistemas windows está en C:\xampp\php. Una vez estemos en la carpeta, hacemos doble clic sobre él y se abrirá con el Bloc de notas (suficiente para lo que tenemos que hacer). Nos desplazamos hasta la sección [mail function] y ponemos los valores como se indica en la siguiente imagen:
Página 178 de 240
Programación en PHP
Una vez modificados, guardamos el archivo. Para que estos cambios surtan efecto, debes reiniciar Apache. Para ello, ve al panel de control de XAMPP, haz clic en Stop y después clic en Start. Si todo ha ido bien, ya tenemos configurado nuestro servidor local para mandar correos electrónicos desde PHP. Si estás utilizando un servicio de hosting, tendrás configurado SMTP, y no tendrás que hacer nada de lo anteriormente mencionado. Si no fuera así, deberás contactar con tu proveedor de hosting.
Envío de correo electrónico desde PHP La función que nos permite mandar correos electrónicos desde PHP es mail(). Veamos su funcionamiento.
mail() La función mail() tiene sólo tres parámetros. La dirección de correo del destinatario, el asunto del correo y el contenido del mismo. mail(destinatario, asunto, mensaje);
Plataforma de Teleformación de IFES
Página 179 de 240
Para crear saltos de línea en el cuerpo del mensaje se utiliza la cadena "\n\r" que simboliza un salto de línea en Windows. Ejemplo 5.2.1. Para probar este script se puede poner como dirección de destino la de una cuenta a la que tengamos acceso. El mansaje, al ser muy largo, se ha escrito en varias líneas usando el operador concatenar " . ". <?php $destinatario = "micorreo@direccion.es "; //poner aquí vuestra dirección $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."; } ?> Antes de ejecutar nuestro script, debe estar en funcionamiento PostCast Server. Para comprobarlo, miremos junto al reloj que hay abajo y a la derecha de la pantalla. Debemos tener esta imagen:
Está el icono de XAMPP y el icono de PostCast Server. Si no está, vayamos al escritorio y ejecutémoslo. Cuando estemos seguros de que se está ejecutando PostCast Server, vayamos a nuestro navegador para ejecutar el script. Debería aparecer “El mensaje se ha enviado con éxito.” Pero para que el mensaje salga de nuestro servidor, debemos acceder a PostCast Server haciendo clic en el icono que mostramos anteriormente, junto a la hora. Nos aparecerá la siguiente pantalla:
Página 180 de 240
Programación en PHP
Para que se lleve a cabo el envío, hacemos clic en Start. Si todo va bien, desaparecerá la dirección que se está mostrando en pantalla. Si como destino pusiste tu propia dirección, es cuestión de unos minutos comprobar que lo has recibido. Además de mirar tu bandeja de entrada, mira la bandeja de correo no deseado o Spam. Pudiera ser que tu sistema de correo así lo detecte.
Ejemplo 5.2.2. En la forma anterior no nos resulta muy útil. Sería mejor si añadieramos un formulario para elegir el destinatario, el asunto y redactar el correo.
Plataforma de Teleformación de IFES
Página 181 de 240
•
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 <?php $destinatario=$_POST[destinatario]; $asunto=$_POST[asunto]; $mensaje=$_POST[mensaje]; if (@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.
Página 182 de 240
Programación en PHP
Recuerda que estamos en un servidor local. Para que el envío se realice accede a PostCast Server y haz los mismos pasos que en el ejemplo anterior.
U.D.3. Sesiones Las sesiones se usan siempre que haya que dar servicios personalizados o de identificación. El protocolo HTTP es un protocolo sin estado. Esto significa que no hay manera de que un servidor web sepa qué estamos haciendo mientras navegamos por un sitio web, a no ser que pueda identificar/marcar al cliente (el navegante) de algún modo, para que, posteriores peticiones de éste nos digan quién es. Por supuesto, con una página dinámica en PHP podemos guardar información en algún sitio (un fichero, una base de datos), pero las aplicaciones web no se componen de una sola página sino de varias, así que necesitaremos de algún mecanismo que nos facilite el 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 el manejo de sesiones PHP incorpora una serie de funciones que permiten iniciar/terminar una sesión así como funciones de escritura/lectura en la sesión.
Plataforma de Teleformación de IFES
Página 183 de 240
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. 2. Uso de la sesión. Las páginas que forman parte de la aplicación hacen uso de la sesión. Durante este transcurso se pueden escribir y leer 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 principio de cada página que vaya a usar sesiones. Eso sí, debe ir antes de cualquier código HTML, si no es así dará error. Ejemplo 5.3.1. El primer código es correcto mientras que si probamos el segundo nos dará un error. Éste es un motivo adicional por el que es recomendable acostumbrarse a poner el código PHP al principio de la página web. <?php //Lo primero que se hace es crear la sesión session_start(); ?> <html> <head> <title>Esta página es correcta</title> </head> <body>Este texto podrá leerse. </body> </html> <html> <head> <title>Esta página no es correcta</title> </head> <body>Después de este texto aparecerá un error. </body> </html> Página 184 de 240
Programación en PHP
<?php session_start(); ?>
session_id() Todas las sesiones tienen un número que las identifica de forma única. En ocasiones puede 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 sesión actual. En la página de salida es conveniente poner una llamada explícita a esta funció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, en sesion_activa.php se hace uso de ella mostrando su id y en finalizar_sesion.php se destruye la sesión. •
iniciar_sesion.php <?php session_start(); ?> Sesión iniciada con id <?php echo session_id() ?> <br> <a href="sesion_activa.php">Seguir</a>
•
sesion_activa.php <?php session_start();
Plataforma de Teleformación de IFES
Página 185 de 240
?> Sesión activa con id <?php echo session_id() ?> <br> <a href="finalizar_sesion.php">Salir</a> •
finalizar_sesion.php <?php session_start(); ?> Destruidos los datos asociados a la sesión <?php echo session_id(); ?> <?php session_destroy(); ?>
Aunque es conveniente llamarla para destruir la sesión cuando haya dejado de ser útil, lo habitual es que los usuarios de Internet abandonen nuestra página web cerrando el navegador y, por lo tanto, no tendremos ocasión de saber que la sesión ha dejado de ser necesaria. Afortunadamente el servidor web dispone de mecanismos para eliminar una sesión sin nuestra intervención poniéndoles un tiempo de caducidad.
Variables de sesión Una de las características que nos aportan las sesiones es la posibilidad de dar persistencia a ciertos datos a través de diferentes páginas.
Página 186 de 240
Programación en PHP
En las versiones actuales de PHP esto es muy sencillo ya que se usa el array global $_SESSION. Éste 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 con session_start() . A este array le podemos añadir elementos o modificarlos de la forma que ya conocemos. Las variables que queremos que estén disponibles en todas las páginas las guardaremos en este array. Ejemplo 5.3.3. Aquí se modifica el ejemplo anterior para, al iniciar la sesión, añadirle la fecha y hora de comienzo como parámetro. También se guarda un contador con las páginas visitadas. Esta información se muestra luego en las páginas intermedias y en la final se muestra la duración de la sesión junto con un mensaje de despedida. •
iniciar_sesion.php <?php session_start(); setlocale(LC_ALL,"esp"); //Almaceno en la sesión el instante actual. $comienzo = time(); $_SESSION["comienzo"] = $comienzo; //Inicializo el contador de páginas vistas. $_SESSION["contador"] = 1; ?> Sesión iniciada el día <?php echo @strftime("%d/%m/%Y", $_SESSION["comienzo"]) ?> a las <?php echo @strftime("%H:%M:%S", $_SESSION["comienzo"]) ?> <br> <a href="sesion_activa.php">Seguir</a>
Plataforma de Teleformación de IFES
Página 187 de 240
•
sesion_activa.php <?php session_start(); setlocale(LC_ALL,"esp"); //Incremento el contador de páginas vistas $_SESSION["contador"]++; ?> Sesión activa desde el día <?php echo @strftime("%d/%m/%Y", $_SESSION["comienzo"]) ?> a las <?php echo @strftime("%H:%M:%S", $_SESSION["comienzo"]) ?> <br>Páginas visitadas <?php echo $_SESSION["contador"] ?> <br> <a href="sesion_activa.php">Seguir</a> - -<a href="finalizar_sesion.php">Salir</a>
Página 188 de 240
Programación en PHP
•
finalizar_sesion.php <?php session_start(); setlocale(LC_ALL,"esp"); //Incremento el contador de páginas vistas $_SESSION["contador"]++; //Calculo la duración en segundos de la sesión. $ahora = time(); $duracion = $ahora - $_SESSION["comienzo"]; ?> La sesión ha durado <?php echo floor($duracion / 3600) ?> h <?php echo floor(($duracion % 3600) / 60) ?> m <?php echo floor(($duracion % 60)) ?> s. <br> En ese tiempo ha visitado <?php
Plataforma de Teleformación de IFES
Página 189 de 240
echo $_SESSION["contador"]." "; ?> páginas. <br> <?php session_destroy(); ?>
En finalizar_sesion.php se han usado operaciones matemáticas básicas para convertir una 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 son las siguientes. •
• •
Control de acceso: Es uno de los usos principales, se piden unas credenciales al usuario (p.ej: correo electrónico y contraseña en un formulario), éstas se comprueban con los existentes en la base de datos y si se autoriza el acceso, se inicia una sesión. En dicha sesión se almacena un identificador del 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 el usuario salga de la aplicación. Personalización: Un usuario puede preferir ciertos colores/propiedades/ elementos en una aplicación web, y éstos se mantienen por todas las páginas de la aplicación. Comercio electrónico: Manteniendo las compras del usuario en un carrito virtual, hasta que decida pagar. El carrito se almacena en la sesión y se puede mostrar en cada página de una tienda virtual. En dicho carrito se
Página 190 de 240
Programación en PHP
•
añaden/quitan productos, el usuario se puede marchar a ver otra página y volver a la tienda y ahi está su carrito (mientras dure la sesión). Replicación de aplicaciones web: Los sitios web con muchas visitas pueden necesitar de más de un servidor web o base de datos por si falla algo. Las sesiones se replican entre todos los servidores, de manera que el usuario 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 de acceso ya que es seguro que habrá alguna página que queramos que tenga acceso restringido . Para ello lo habitual es disponer de un formulario en el que se pida el nombre de usuario y la contraseña y una zona privada de páginas a las que solo se puede acceder si 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áginas. 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 la sesión una variable autorizado con el valor "si" y redirecciona a la página zona_privada.php. Si la contraseña introducida es errónea, redirecciona a la página no_autorizado.php y muestra un error y ofrece un enlace para volver a identificarse. No basta con redireccionar a la zona privada si la contraseña es correcta. Las páginas de la zona privada han de tener un código al principio que comprueba que el usuario está autorizado (mediantte la variable autorizado). De no ser así se podría acceder a ellas 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 se ha pasado por el 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 ponen una pulsera (autenticación ) y posteriormente, en cada atracción a la que se desea entrar 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 la zona privada.
Plataforma de Teleformación de IFES
Página 191 de 240
•
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="password" 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 session_start();
Página 192 de 240
Programación en PHP
$usuario=$_POST[usuario]; $contrasena=$_POST[contrasena]; if (($usuario == "alicia") && ($contrasena == "xanadu")) { //Marco la sesión como autorizada $_SESSION["autorizado"] = TRUE; //Redirecciono a la zona privada header("location:zona_privada.php"); } else { session_destroy(); //Redirecciono a la página de acceso denegado header("location:no_autorizado.html"); } ?> •
zona_privada.php <?php session_start(); if (!$_SESSION["autorizado"]) { //Redirecciono a la página de acceso denegado header("location:no_autorizado.html"); } ?> <center> <h1>Bienvenido a la zona privada.</h1> <br> <a href="salir.php">Salir</a> </center>
•
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>
Plataforma de Teleformación de IFES
Página 193 de 240
</body> </html> •
salir.php <?php 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 un usuario está autorizado a una biblioteca (en este caso autorizar.php ) e incorporarlo a cada página de la zona privada mediante un simple include() . •
autorizar.php <?php session_start(); if (!$_SESSION["autorizado"]) { //Redirecciono a la página de acceso denegado header("location:no_autorizado.html"); } ?>
•
zona_privada.php <?php include("autorizar.php"); ?> <center> <h1>Bienvenido a la zona privada.</h1> <br> <a href="salir.php">Salir</a> </center>
Página 194 de 240
Programación en PHP
Ejemplo 5.4.3. Una segunda mejora obvia es crear un array que contenga los datos de los usuarios del sistema. Hay que modificar autenticar.php. •
autenticar.php <?php session_start(); //Array asociativo que contiene los usuarios registrados $contrasenas["alicia"] = "xanadu"; $contrasenas["alberto"] = "catai"; $contrasenas["marta"] = "bombay"; $usuario=$_POST[usuario]; $contrasena = $_POST[contrasena]; if (($contrasenas[$usuario] == $contrasena)) { //Marco la sesión como autorizada $_SESSION["autorizado"] = TRUE; //Redirecciono a la zona privada header("location:zona_privada.php"); } else { session_destroy(); //Redirecciono a la página de acceso denegado header("location:no_autorizado.html"); } ?>
Ejemplo 5.4.4. Si se necesita una gestión un poco más avanzada de los usuarios, se puede hacer uso de la base de datos MySQL. Vamos a crear una tabla en la base de datos que teníamos, curso_php. La tabla se llamará usuarios, y tendrá tres campos. Para crearla, primero pon en fucionamiento MySQL desde el panel de control de XAMPP. Cuando esté en funcionamiento, haz clic en admin. para que tengamos acceso a phpMyAdmin. Selecciona la base de datos curso_php y rellena los campos como se muestra en la siguiente imagen:
Plataforma de Teleformación de IFES
Página 195 de 240
El nombre de la tabla es usuarios y el n煤mero de campos 3. Haz clic en el bot贸n Continuar. En la pantalla que te aparece, rellena los campos tal y como se muestra en la siguiente imagen:
P谩gina 196 de 240
Programaci贸n en PHP
Una vez indicados los valores, haz clic en el bot贸n Grabar. Te deber谩 aparecer la siguiente pantalla:
Plataforma de Teleformaci贸n de IFES
P谩gina 197 de 240
El siguiente paso es introducir valores en la tabla. Éstos son los valores que vamos a introducir: Idusuario Nombre usuario Contraseña alicia xanadu alberto catai marta bombay
Página 198 de 240
Programación en PHP
Como se observa, no he indicado valores para idusuario. No es necesario ya que al ser auto incrementado, el sistema automáticamente le asignará un valor. Para introducir los datos deberemos hacer clic en la opción Insertar del menú superior. Nos aparecerá la siguiente pantalla:
que ya aparece con los valores, pero que debes escribir. Una vez indicados, hacemos clic en el botón continuar. Nos mostrará una nueva ventana en la cual nos indica que se ha insertado una nueva fila. Para insertar el resto de usuarios, procedemos de la misma manera. Hacemos clic en Insertar e indicamos los nuevos valores. Para comprobar que efectivamente los datos se han grabado, hacemos clic en la opción Examinar del menú superior. Nos aparecerá la siguiente pantalla:
Plataforma de Teleformación de IFES
Página 199 de 240
En el cรณdigo PHP sรณlo hay que modificar el archivo autenticar.php. Se realiza una consulta a la tabla usuarios para comprobar que los datos que se han indicado en le formulario estรกn en esta tabla.
โ ข
autenticar.php <?php session_start(); //Busco en la base de datos el usuario mysql_connect("localhost","root",""); mysql_select_db("curso_php"); $usuario=$_POST[usuario]; $contrasena=$_POST[contrasena]; $consulta = "SELECT * FROM usuarios WHERE nombreusuario = '$usuario' AND contrasenausuario = '$contrasena'";
Pรกgina 200 de 240
Programaciรณn en PHP
$resultado = mysql_query($consulta); $fila = mysql_num_rows($resultado); if ($fila != 0) { //Marco la sesión como autorizada $_SESSION["autorizado"] = TRUE; //Redirecciono a la zona privada header("location:zona_privada.php"); } else { session_destroy(); //Redirecciono a la página de acceso denegado header("location:no_autorizado.html"); } ?> Al confrontar con la bases de datos, no es ni siquiera necesario ver el resultado de la consulta, nos basta con saber el número de líneas devueltas. Si la consulta devuelve 0 registros (filas) es porque no ha tenido éxito al buscar al usuario cuyos datos han sido introducidos 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 sobre accesos 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 asociar esta información a la persona que los está produciendo. El evento más típico en este caso es un acceso a la zona privada de nuestra página web.
Registro de accesos en un fichero de texto Ésta es la forma más sencilla. Hay un fichero en el servidor que guarda en cada línea un intento de acceso. Se va a optar por un diseño modular que, como se verá más adelante, 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ón
Plataforma de Teleformación de IFES
Página 201 de 240
registrar_acceso() que recibe un id de usuario y graba un registro de su entrada. Si se le pasa el valor -1 graba un intento fallido de entrada. Este es el programa completo autenticar.php (se han eliminado algunos comentarios para darle mayor claridad). <?php // Funci贸n que registra la entrada de un usuario // Si recibe una id de usuario -1 es que el acceso ha sido fallido function registrar_acceso($id_usuario) { $ahora = time(); $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); } session_start(); //Conecto a la base de datos mysql_connect("localhost","root",""); mysql_select_db("curso_php"); //Asigno a las variables los valores del formulario $usuario=$_POST[usuario]; $contrasena=$_POST[contrasena]; //Busco en la base de datos el usuario $consulta = "SELECT * FROM usuarios WHERE nombreusuario = '$usuario' AND contrasenausuario = '$contrasena'"; $respuesta = mysql_query($consulta); if (mysql_num_rows($respuesta) != 0) { $_SESSION["autorizado"] = TRUE; $id = mysql_result($respuesta, 0, "idusuario"); registrar_acceso($id); header("location:zona_privada.php"); } P谩gina 202 de 240
Programaci贸n en 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 texto, también se puede guardar en la base de datos. Para ello necesitaremos una tabla que llamaremos accesos y que tendrá tres campos. Esta tabla la crearemos a través de phpMyAdmin, tal y como hicimos con la tabla usuarios. Por tanto, una vez que lleguemos a la imagen siguiente (donde puedes ver la definición de los campos), hacemos clic en Grabar.
Plataforma de Teleformación de IFES
Página 203 de 240
En este caso, no introduciremos datos, ya que lo haremos a trav茅s del script que vamos a crear. Ejemplo 5.5.2. Para guardar en la base de datos solo ha sido necesario modificar la funci贸n registrar_acceso. function registrar_acceso($id_usuario) { $ahora = time(); $fecha_mysql = @strftime("%d-%m-%Y %H:%M:%S ", $ahora); $consulta = "INSERT INTO accesos (idusuario, hora_acceso) VALUES ('$id_usuario', '$fecha_mysql')"; mysql_query($consulta); }
P谩gina 204 de 240
Programaci贸n en PHP
Para ver los acceso, entraremos en phpMyAdmin, seleccionamos la base de datos curso_php, después seleccionamos la tabla accesos y ,finalmente, hacemos clic en Examinar del menú superior. Tras la realización de varios accesos, nos aparecerá algo parecido a lo mostrado en la siguiente imagen.
Registro de eventos asociados a un usuario Para poder registrar otros eventos de un usuario, aparte del acceso, la aplicación web tiene que conocer en todo momento qué usuario es el activo. Para ello, al autenticar a un 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 una nueva variable de sesión con el id del usuario. Este id se puede usar más adelante para personalizar los contenidos de las páginas que vea el usaurio, además de para crear un registro de sus acciones. <?php // Función que registra la entrada de un usuario // Si recibe una id de usuario -1 es que el acceso ha sido fallido
Plataforma de Teleformación de IFES
Página 205 de 240
function registrar_acceso($id_usuario) { $ahora = time(); $fe cha_mysql = @strftime("%d-%m-%Y %H:%M:%S ", $ahora); $consulta = "INSERT INTO accesos (idusuario, hora_acceso) VALUES ('$id_usuario', '$fecha_mysql')"; mysql_query($consulta); } session_start(); setlocale("LC_ALL","esp"); //Conecto a la base de datos mysql_connect("localhost","root",""); mysql_select_db("curso_php"); //Asigno a las variables los valores del formulario $usuario=$_POST[usuario]; $contrasena=$_POST[contrasena]; //Busco en la base de datos el usuario $consulta = "SELECT * FROM usuarios WHERE nombreusuario = '$usuario' AND contrasenausuario = '$contrasena'"; $respuesta = mysql_query($consulta); if (mysql_num_rows($respuesta) != 0) { $_SESSION["autorizado"] = TRUE; $id = mysql_result($respuesta, 0, "idusuario"); $_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รณn del cรณdigo HTML del PHP. Los sistemas de plantillas suponen una contribuciรณn en este Pรกgina 206 de 240
Programaciรณn en PHP
sentido ya que separan en diferentes archivos la presentación (el código HTML con el diseñ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 por lo que tendremos que hacer uso de una librería desarrollada por un tercero. En este caso hemos elegido la librería DTemplate desarrollada por Peter Mallet por los siguientes 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 a DTemplate, por lo que podremos aplicar lo que aprendamos a esos sistemas si preferimos una versión más potente. DTemplate se puede descargar desde este enlace. http://prdownloads.sourceforge.net/dtemplate/dtemplate-120.zip Como es un archivo comprimido, lo primero que haremos es descomprimirlo. El archivo que utilizaremos es class.DTemplate.php.
Instalación DTemplate no requiere ninguna instalación especial. Lo único necesario es que el archivo class.DTemplate.php se encuentre en el mismo directorio que las páginas PHP que 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.
Plataforma de Teleformación de IFES
Página 207 de 240
•
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ño web 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 por lo general no se pondrá código PHP en las plantillas (aunque existen algunas excepciones).
Variables de plantilla Las variables en las plantilas las reconoceremos porque se escriben entre llaves " { ... } " y contienen un identificador de la variable que normalmente escribiremos en mayúsculas y sin espacios en blanco. No hay que confundir las variables de plantilla con las variables de PHP. {VARIABLE } Ejemplo 5.6.1. La siguiente es una plantilla muy sencilla que tiene como variables el título de la página y el mensaje dentro del cuerpo de la misma. La guardaremos con el nombre plantilla_mensaje.tpl. <html> <head> <title>{TITULO}</title> </head> <body> {MENSAJE} </body> </html>
Página 208 de 240
Programación en PHP
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() . <?php include("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 la librerí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 dónde se encuentran los archivos .tpl con definiciones de plantillas. Esta función asocia un identificador a una plantilla. $tpl -> define_template("identificador ", "plantilla.tpl "); Si son varias las plantillas, podemos definirlas sucesivamente llamando una vez a esta función por cada plantilla.
assign() Esta función asigna un valor a una variable que esté presente en una definición de plantilla. Hay que asignar valores a todas las variables que aparezcan en la plantilla. $tpl -> assign("VARIABLE ", valor );
Plataforma de Teleformación de IFES
Página 209 de 240
process() En este paso se interpretan las variables de la plantilla sustituyéndolas por los valores que 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 por pantalla. $tpl -> DPrint(identificador_plantilla ); Ejemplo 5.6.2. Parecen muchas funciones y su uso un tanto enrevesado. Pero su aplicación es inmediata, solo hay que estar pendiente de cuales son las variables de plantilla. Afortunadamente como las escribimos en mayúsculas resulta fácil distinguirlas. Haremos uso de la definición de plantilla plantilla_mensaje.tpl que se creó en el ejemplo anterior. <?php include("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"); ?>
Página 210 de 240
Programación en PHP
Plantillas anidadas Al igual que se le puede asignar a una variable de plantilla un valor, se le puede asignar también el resultado de procesar una plantilla. De esta forma se pueden componer pá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 ya procesada. 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 dos plantillas, 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
Plataforma de Teleformación de IFES
Página 211 de 240
{PRECIOS} El código PHP modificado que procesa las plantillas es el siguiente. •
ficha_comercio.php <?php include("class.DTemplate.php"); $nombre_comercio = "Frutería Pernambuco"; $direccion_comercio = "c/ Don Juan Tenorio 17"; $tfno_comercio = "866 713 137"; $email_comercio = "maurodosantos@pernambuco.com "; $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"));
Página 212 de 240
Programación en PHP
$tpl -> process("ficha"); $tpl -> DPrint("ficha"); ?>
Plantillas anidadas en bucles Esta estrategia se sigue en plantillas en las que hay un tipo de elemento que se repite muchas 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. El problema es que con los mecanismos que conocemos hasta ahora esto nos requeriría guardar en una variable también las etiquetas de comienzo y final de fila y de comienzo y 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 <?php include("class.DTemplate.php"); $titulo = "Ficha"; $nombre_comercio = "Frutería Pernambuco"; $direccion_comercio = "c/ Don Juan Tenorio 17";
Plataforma de Teleformación de IFES
Página 213 de 240
$tfno_comercio = "866 713 137"; $email_comercio = "maurodosantos@pernambuco.com "; $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"); $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 filas for ($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"); ?>
Página 214 de 240
Programación en PHP
El resultado final es el siguiente.
La librería DTemplate tiene muchas otras funciones y otros modos de acceder a las mismas que pueden servir para múltiples situaciones. Quien esté interesado puede ampliar conocimientos con la documentación del producto.
Resumen módulo V Este recurso es de tipo Multimedia. Tiene que conectarse a la plataforma para acceder a este recurso.
Práctica: Aplicaciones comunes en PHP Este recurso es de tipo Práctica. Tiene que conectarse a la plataforma para acceder a este recurso.
Autoevaluación módulo V Pregunta 1: En PHP se puede operar directamente con fechas en formato DD/MM/YYYY. Un ejemplo de esto es la siguiente línea de código, que produce la fecha que corresponde a una semana después del 7 de julio del 2005. Plataforma de Teleformación de IFES
Página 215 de 240
<?php $fecha = "07/07/2005" + "00/07/0000"; ?> • Verdadero • Falso Respuesta correcta: Falso Pregunta 2: La siguiente línea de código almacena en la variable $fecha la fecha correspondiente al instante actual en formato timestamp . <?php $fecha = time(); ?> • Verdadero • Falso Respuesta correcta: Verdadero Pregunta 3: En PHP se pueden enviar emails sin la colaboración de un servidor de correo externo gracias a la función mail() . • Verdadero • Falso Respuesta correcta: Falso Pregunta 4: Las sesiones se pueden utilizar para hacer una aplicación de comercio electrónico con un carrito de la compra. • Verdadero • Falso Respuesta correcta: Verdadero Pregunta 5: El siguiente código almacena como variable de sesión la fecha actual en formato timestamp .
Página 216 de 240
Programación en PHP
<?php $_SESSION["ahora"] = time(); session_start(); ?> • Verdadero • Falso Respuesta correcta: Falso Pregunta 6: En todas las páginas de la zona privada de una aplicación web hay que incluir, al principio, la verificación de que la sesión está autorizada. • Verdadero • Falso Respuesta correcta: Verdadero Pregunta 7: El registro de accesos se puede programar para que guarde las entradas tanto en un fichero de texto como en la base de datos. • Verdadero • Falso Respuesta correcta: Verdadero Pregunta 8: Usar sistemas de plantillas nos ayuda a separar completamente el código PHP del código HTML. • Verdadero • Falso Respuesta correcta: Verdadero Pregunta 9: Las plantillas del sistema DTemplate usan la extension .pla • •
Verdadero Falso
Respuesta correcta: Falso
Plataforma de Teleformación de IFES
Página 217 de 240
Pregunta 10: Las variables de plantilla son iguales que las variables de PHP, y como tales se pueden reconocer porque comienzan con el símbolo del dolar " $ ". • Verdadero • Falso Respuesta correcta: Falso
Página 218 de 240
Programación en PHP
Programación en PHP
Evaluación tercera Este recurso es de tipo Evaluación. Debe conectarse a la plataforma para realizar la evaluación. Recuerde que las evaluaciones son obligatorias ya que determinan la nota final.
Plataforma de Teleformación de IFES
Página 219 de 240
Programaciรณn en PHP
Prรกctica final Este recurso es de tipo Prรกctica. Tiene que conectarse a la plataforma para acceder a este recurso.
Pรกgina 220 de 240
Programaciรณn en PHP
Programación en PHP
Evaluación final Este recurso es de tipo Evaluación. Debe conectarse a la plataforma para realizar la evaluación. Recuerde que las evaluaciones son obligatorias ya que determinan la nota final.
Plataforma de Teleformación de IFES
Página 221 de 240
Programación en PHP
Glosario Alcance de una variable Bloques de código en los cuales se puede acceder a la variable. Suele ser a partir de su primer uso hasta el final del script a menos que sea ocultada por una variable de nombre similar dentro de una función. Algoritmo Secuencia de instrucciones sobre unos datos que sirven para resolver un problema. Apache Servidor web (servidor HTTP) de código abierto desarrollado por la fundación de carácter no lucrativo Apache Software Foundation (ASF). API Siglas inglesas de Aplication Programming Interface. Es el conjunto de las especificaciones necesarias para hacer uso de un software sin que sea necesario conocer cómo está construido. De esta forma se puede hacer uso de las funciones de una biblioteca sin necesidad de saber cómo está programada, solo la defininción de sus funciones y la descripción de su funcionamiento. Aplicación web Programa al que se accede de forma remota desde un navegador web. Argumento Cada uno de los datos que necesita recibir una función. También se les llama parámetros. Arquitectura web de tres capas Esquema de funcionamiento de una página web dinámica que consiste en tres capas: el cliente, el servidor de aplicaciones con el interprete de PHP y el sistema gestor de bases de datos. Array
Página 222 de 240
Programación en PHP
Tipo de datos compuesto formado por una sucesión de elementos a los que se accede mediante un índice o clave. Array asociativo Array cuyas claves son cadenas de texto. De esta forma se asocian parejas de cadenas de texto con alguna relación. Array indexado numéricamente Array cuyos elementos están referenciados por un índice de tipo entero y que suelen estar en posiciones consecutivas empezando por el 0 (0, 1, 2, ...). Array multidimensional Array que a su vez contiene arrays. Un ejemplo típico es la estructura matemática de una matriz de 2 dimensiones. ASP Active Server Pages. Tecnología para la creación de páginas web dinámicas impulsada por Microsoft. Autenticación Parte del control de acceso que consiste en la comprobación de la identidad del usuario, generalmente mediante un nombre de usuario y contraseña. Autorización Parte del proceso de control de acceso que consiste en permitir o denegar el acceso dependiendo de si se autentifico con anterioridad. Base de datos Conjunto de datos almacenados sistemáticamente. Habitualmente se designa por este término también al sistema gestor de bases de datos (SGBD) que almacena y administra los datos. Biblioteca Conjunto de funciones, generalmente agrupadas por su finalidad, que se encapsulan en un mismo archivo. Para hacer uso de ellas es necesario importar el archivo que las contiene.
Plataforma de Teleformación de IFES
Página 223 de 240
Bucle Estructura basada en una sentencia de control que permite que un bloque de código se ejecute repetidas veces. También se la denomina estructura iterativa. Cadena Tipo de datos que contiene texto. Vease tipo de datos cadena. Campo o columna Categoría que se usa para clasificar la información de una tabla de una base de datos y que está asiociada a un nombre y a un tipo de datos. Celda Contenedor mínimo de información en una tabla. Un registro o fila la forman tantas celdas como campos tiene la tabla. Clave Campo o conjunto de campos de una base de datos que identifican de forma unica un registro. En otras palabras, no puede haber dos registros que contengan el mismo valor en un campo clave. Clave Apuntador, generalmente una cadena de texto, de la posición de un elemento en un array. Cuando es numérico se le suele llamar índice. 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áginas web y mostrar los resultados. Comentario Línea o líneas de código que ignora el interprete de PHP y que se usan para añadir anotaciones aclaratorias al programa. Consola de MySQL Pantalla en modo texto en la que se ejecutan sentencias de MySQL. Consola del sistema operativo
Página 224 de 240
Programación en PHP
Pantalla en modo texto sobre la que se ejecutan comandos del sistema operativo. Constante Dato definido cuyo valor no puede cambiar a lo largo de la ejecución del programa. Consulta Es una operación básica para recuperar información de una base de datos. Por extensión se llama también consultas a otras operaciones sobre la base de datos. Control de acceso Sistema que permite regular el acceso de los usuarios a un conjunto de páginas restringidas, también llamadas zona privada. Consta de dos pasos: autenticación y autorización. Elemento Dato indivisible de un tipo de datos compuesto. Entorno de desarrollo Conjunto de herramientas usadas por un programador. Suelen consistir en un editor de textos con características avanzadas y los medios para poder probar la aplicación. Si están integrados en un solo paquete informático se les llama con las siglas inglesas IDE (Integrated Development Environment). Estructura condicional Sentencia de control que permite elegir una vez entre una o varias alternativas dependiendo de una condición. Estructura de datos Forma de organizar un conjunto de datos elementales con el objetivo de que sean fáciles de manipular. Estructura iterativa Estructura basada en una sentencia de control que permite que un bloque de código se ejecute repetidas veces. También se la denomina bucle. Expresión
Plataforma de Teleformación de IFES
Página 225 de 240
Conjunto de uno o varios operandos enlazados mediante uno o varios operadores que es evaluado y produce un resultado. Extensión de PHP Biblioteca de funciones que se instala para que pueda disponer de ella el intérprete de PHP. Filtrar una consulta Restringir mediante condiciones los resultados que se deben mostrar al recuperar datos de una base de datos. Formulario HTML Página web con campos de entrada para introducir datos desde el cliente (navegador web). Función Subprograma que realiza una tarea específica y puede devolver un valor. Función definida por el usuario Función que no está disponible dentro de las predefinidas de PHP y que el programador ha implementado para su uso dentro de sus programas. Función del núcleo de PHP Función que está disponible dentro de la especificación del lenguaje. Puede ser usada por el programador sin definirla ni importarla. HTML HyperText Markup Language. Lenguaje para escribir páginas web que permite la incorporación a las mismas de texto, imágenes y enlaces a otras páginas. HTTP HyperText Transfer Protocol. Sistema que se encarga de regular como se hacen las peticiones de páginas web por parte del cliente y cómo son transferidas de vuelta al cliente por parte del servidor web. Identificador
Página 226 de 240
Programación en PHP
Cadena de texto que se asocia a una estructura de PHP para manejarla. Algunos casos son los identificadores (nombres) de las variables, los identificadores de las funciones... Identificador de sesión Número único que se asocia a una sesión de navegación. Las páginas web dinámicas lo pueden usar para identificar al usuario que está navegando y ofrecerle servicios personalizados. Índice Apuntador, generalmente numérico, de la posición de un elemento en un array. Cuando es una cadena de texto se le suele llamar clave. Internet Red formada por multitud de redes a nivel mundial y a la que se puede tener acceso público. Los principales servicios que ofrece son la nevegación de páginas web, el correo electrónico y la transferencia de archivos. Internet Information Server (IIS) Servidor web (servidor HTTP) desarrollado por la empresa Microsoft. Interprete de PHP Módulo del servidor web encargado de procesar el código PHP para componer páginas que se puedan enviar a través de Internet. Javascript Lenguaje de programación web que se ejecuta en el cliente (el navegador de internet). JSP Java Server Pages. Lenguaje de programación de páginas web impulsado por la empresa Sun Microsystems. LAMP LAMP es una solución integral para alojar páginas web dinámicas. Consiste en la combinación de Linux (sistema operativo), Apache (servidro web), MySQL (sistema gestor de bases de datos) y PHP (lenguaje de programación web). Lenguaje compilado
Plataforma de Teleformación de IFES
Página 227 de 240
Los lenguajes de programación compilados no se pueden ejecutar directamente. El código fuente ha de ser convertido a archivos binarios ejecutables que sean comprensibles por el ordenador. Lenguaje interpretado Los lenguajes de programación interpretados necesitan para ser ejecutados un interprete de instrucciones que analiza y ejecuta el código fuente. Lenguajes de programación web Lenguajes que se emplean para dotar de interactividad a las páginas web. Pueden funcionar en el cliente (Javascript) o en el servidor (PHP, JSP, ASP...). Llamada a una función Uso de una función mediante su identificador y argumentos. Si la función devuelve un valor su resultado se puede asignar a una variable o usar directamente. Modo de acceso a un archivo Parámetro que indica lo que se puede hacer con un archivo al abrirlo. Leer, esrcibir o ejecutar. MySQL Sistema Gestor de Bases de Datos de código abierto. Es una base de datos de respaldo muy popular en las aplicaciones web. ODBC Siglas inglesas de Open DataBase Connectivity, un estándar de acceso a bases de datos. Mediante este sistema se puede acceder a cualquier base de datos sin necesidad de usar instrucciones específicas de la misma. Operador Símbolo que afecta (enlaza) a uno o varios operandos y que define cómo se evalúa la expresión en la que interviene. Operando Cada uno de los datos que intervienen en una expresión (operación) Página web
Página 228 de 240
Programación en PHP
Documento con formato HTML que contiene, típicamente, texto, imágenes y enlaces a otras páginas web. Página web dinámica Página que es capaz de mostrar contenidos variables gracias a la programación que incorpora, disponiendo de mayor interactividad. Página web estática Página que requiere de la intervención de su autor para modificar sus contenidos. Parámetro Cada uno de los datos que necesita recibir una función. También se les llama argumentos. Paso de argumentos por referencia Paso de datos a una función mediante una referencia a la variable. No se hace una copia de los mismos sino que se comparten las variables. Cualquier cambio en el contenido de la variable dentro de la función se reflejará en la variable fuera. Paso de argumentos por valor Paso de datos a una función que consiste en hacer una copia de los mismos. De esta forma las variables del programa que usa la función no se ven afectadas si cambian las variables de dentro. PHP PHP Hypertext Prepocesor. Lenguaje de programación web de gran difusión. Es sencillo de aprender, potente y fiable. Es open-source. Plantilla Archivo con extensión .tpl que contiene exclusívamente código HTML y variables de plantilla. Estas serán sustituidas por su contenido al ser procesadas por una página PHP. Precedencia Orden en el que se evalúan las operaciones de una expresión en el caso de que intervengan varios operandos. Un ejemplo típico es la multiplicación, que se evalúa antes de la suma (2 + 5 * 4 da como resultado 22).
Plataforma de Teleformación de IFES
Página 229 de 240
Programa Según una definición tradicionalmente aceptada, un programa es un conjunto de acciones que se realizan sobre unos datos, es decir, es el resultado de aplicar algoritmos a unas determinadas estructuras de datos. Programación estructurada Metodología de diseño de software basada en la utilización como elementos básicos de variables para almacenar la información y sentencias de control para dirigir el flujo del programa. Programación orientada a objetos Metodología de diseño de software que define los programas a partir de objetos. Los objetos son entidades que pueden almacenar información y a su vez interactuar con otros objetos a través de sus métodos. Redirección Acción que consiste en que una página solicita la carga de otra, pasando a mostrarse el contenido de la segunda. Registro o fila Un registro (también llamado fila o tupla) representa un objeto único de datos implícitamente estructurados en una tabla. Cada fila de una tabla representa un conjunto de datos relacionados, y todas las filas de la misma tabla tienen la misma estructura. Ruta absoluta Señalan la ubicación de un archivo o directorio desde el directorio raíz del sistema de archivos. Por ejemplo es una ruta absoluta /home/direct1/archiv1.fil que señala la ubicación de arcchiv1.fil desde la raíz del sistema de archivos. Ruta relativa Señala la ubicación de un archivo o directorio a partir de la posición actual del sistema operativo en el sistema de archivos. Por ejemplo, es una ruta relativa direct1/archiv1.fil que señala al archivo archiv1.fil dentro del directorio direct1 en la ubicación actual. Sangrado
Página 230 de 240
Programación en PHP
Estrategia que se sigue para diferenciar los diferentes bloques de código anidados, poniendo espacios en blanco a la izquierda. Sentencia Es el fragmento más pequeño en el que se puede dividir un programa. En ocasiones se denomina línea de código. Sentencia de control Son sentencias que permiten alterar el flujo secuencial del programa. Lo común es que permitan elegir la siguiente instrucción a ejecutar según la evaluación de una condición. Servidor de aplicación Programa que trabaja en colaboración con el servidor web para generar y transferir páginas web dinámicas (programadas). Servidor de correo SMTP Programa que se encarga del envío de correos electrónicos utilizando el protocolo SMTP (Simple Mail Transfer Protocol) Servidor web (hardware) Es el ordenador que aloja páginas web. Este término se utiliza indistintamente para designar tanto el equipo físico como el software. Servidor web (software) Programa que está preparado para transferir páginas web a los clientes, mediante el protocolo HTTP Sesión de navegación Secuencia de páginas que visita un cliente dentro de un sitio web. Mediante el control de las sesiones se puede ofrecer servicios personalizados al usuario. Sistema de plantillas Módulo de PHP, generalmente en la forma de una librería, que permite separar la presentación (el código HTML) de la lógica (código PHP) de una página web dinámica. Sistema gestor de bases de datos (SGBD)
Plataforma de Teleformación de IFES
Página 231 de 240
Aplicación informática que permite almacenar y después acceder a los datos de forma rápida y estructurada. A veces se les denomina simplemente base de datos. SQL El Lenguaje de Consulta Estructurado (Structured Query Language) es un lenguaje declarativo que se usa para comunicarnos con el sistema gestor de bases de datos. Básicamente permite definir bases de datos y almacenar y recuperar datos en tablas. Tabla Estructura básica de almacenamiento de datos en las bases de datos relacionales. Esta definida por sus campos (columnas) y contiene registros(filas de datos). Cada dato de la tabla se denomina celda. Timestamp Formato de fecha en un solo número entero que equivale a los segundos transcurridos desde el 1 de enero de 1970 hasta el momento actual. Tipo de dato entero (integer) Tipo de datos compuesto por los números enteros, es decir, aquéllos sin parte decimal, tanto positivos como negativos, incluyendo el 0. Tipo de datos Es un atributo de los datos que indica al ordenador (y/o al programador) algo sobre la clase de datos sobre los que se va a procesar. Esto incluye imponer restricciones en los datos, como qué valores pueden tomar y qué operaciones se pueden realizar. Tipo de datos cadena Tipo de datos que se usa para almacenar texto, es decir, una sucesión de letras, números y símbolos. Tipo de datos compuesto Los datos que puede contener se pueden descomponer en datos más pequeños. Cada uno de los datos elementales que lo componen se llama elemento. Tipo de datos decimal (double)
Página 232 de 240
Programación en PHP
Tipo de datos que puede representar cualquier número real, incluyendo los números con decimales. Se pueden representar valores muy grandes o pequeños usando la notación "mantisa-exponente" (p.ej. 1.345e-23) Tipo de datos simple Los datos que pueden contener son indivisibles o perderían su significado. En PHP hay tres: entero (integer), decimal (double) y cadena (string). URL Uniform Resource Locator. Cadena de caracteres que identifica de forma única un recurso de internet. Es la dirección de Internet que permite que el navegador la localice. URL absoluta URL completamente definida partiendo del descriptor del protocolo (http://) el dominio, y la ruta hasta el recurso deseado. URL relativa URL que toma como punto de origen el recurso activo. Variable contenedor de datos cuyo contenido puede variar a lo largo de la ejecución del programa. En PHP todas las variables se distinguen por comenzar con el símbolo del dolar, "$". Variable de plantilla Identificador que marca la parte de una página web que será sustituido por su contenido al procesar la plantilla por parte del código PHP. Variable global Variable externa a una función que se declara global para poder acceder a su contenido desde dentro de la función. Variables de sesión Datos que se asocian a una sesión de navegación. En PHP se suelen usar para compartir información entre páginas web independientes. W3C
Plataforma de Teleformación de IFES
Página 233 de 240
World Wide Web Consortium. Organización que produce estándares para la WWW. Word Wide Web Conjunto de páginas enlazadas entre sí que forman los contenidos navegables de Internet. XAMPP Paquete de software "todo en uno" que contiene un servidor web (Apache), un interprete de PHP y un gestor de bases de datos (MySQL). Zona privada Conjunto de páginas de un sitio web que tienen el acceso restringido. Antes de entrar en ellas hay que pasar por un proceso de autenticación. Zona pública Conjunto de páginas de un sitio web a las que se puede acceder sin necesidad de autenticarse.
Página 234 de 240
Programación en PHP
Programación en PHP
FAQ ¿Que es PHP? PHP es un lenguaje interpretado que dota de comportamiento dinámico a las páginas web HTML. ¿Qué significa PHP? PHP significa PHP: Hypertext Preprocessor (PHP: Pre-procesador de Hipertexto). Esto confunde a muchas personas ya que la primera palabra del acrónimo es el acrónimo mismo. Este tipo de acrónimo es llamado recursivo. ¿Cómo puedo instalar PHP? La mayoría de los servidores web como Apache llevan ya incorporado un interprete de PHP. Si no se dispone de PHP ni del servidor web apache es recomendable instalar un paquete todo en uno como Xampp (ver sección Links) ¿Qué es un servidor web? Es el software que está dedicado a recibir solicitudes de páginas web y transferirlas a los clientes, mediante el protocolo HTTP. También se llama así al ordenador que tiene instalado este software. ¿Qué es Apache? Apache es uno de los servidores web más populares, se usa para alojar el 70% de las páginas web de Internet. ¿Que es MySQL? MySQL es un sistema gestor de bases de datos gratuito muy popular para dar soporte a aplicaciones web. ¿Qué significa LAMP? LAMP es una solución integral para alojar páginas web dinámicas. Consiste en la combinación de Linux (sistema operativo), Apache (servidro web), MySQL (sistema gestor de bases de datos) y PHP (lenguaje de programación web). ¿Qué son las constantes predefinidas?
Plataforma de Teleformación de IFES
Página 235 de 240
PHP proporciona una gran cantidad de constantes a cualquier script que se ejecute. Algunas, como la constante M_PI son parte del núcleo de PHP. Otras dependen de las extensiones que tengamos instaladas en nuestro servidor. Podemos obtener información de ellas mediante la función phpinfo(). ¿Qué son las variables predefinidas? PHP proporciona una gran cantidad de variables predefinidas a cualquier script que se ejecute. Algunas, como la variable $_SESSION son parte del núcleo de PHP. Otras dependen de las extensiones que tengamos instaladas en nuestro servidor. Podemos obtener información de ellas mediante la función phpinfo(). ¿Puede conocer una página PHP su nombre de archivo? Sí, haciendo uso de la variable predefinida $_SERVER['PHP_SELF'] ¿Cómo se pueden ocultar los errores que produce una instrucción? Es muy sencillo, basta con anteponer el símbolo arroba '@' a la línea en la que se produce el error. ¿Cómo puedo cambiar la configuración de PHP? Hay un archivo de configuración, php.ini, con todos los parámetros del interprete. De todas formas no es recomendable alterarlo sin saber a ciencia cierta lo que se hace y siempre habiendo hecho antes una copia de seguridad. ¿Puedo usar hojas de estilo CSS con PHP? Por supuesto, cualquier tecnología que se integra con HTML se integra también con PHP. Además es muy recomendable. ¿Puedo incrustar películas en Flash en mi página en PHP? Por supuesto, sin ninguna dificultad adicional. ¿Puedo combinar el uso de PHP con Flash? PHP puede interactuar con Flash para generar páginas dinámicas. Para ello es necesario tener también conocimientos de Actionscript. En el fondo no tiene ningún misterio. La película Flash hace solicitudes de información, la página PHP genera dinámicamente la información y la envía de vuelta a la película en Flash, que se encarga de mostrarla. ¿Qué otras tecnologías se integran bien con PHP? Página 236 de 240
Programación en PHP
Para el intercambio de datos es interesante el estándar XML. ¿Admite PHP programación orientada a objetos? En la versión 4 se dio un soporte básico a objetos, que ha sido notablemente mejorado en la versión 5. ¿Hay alguna estructura recomendable a la hora de distribuir los archivos de un sitio web dinámico? Poner todos los archivos mezclados en el directorio raíz no es lo mejor. Suponiendo que se usan todas las tecnologías disponibles es recomendable tener una carpeta para cada tipo de archivos que no son html o php, es decir: - Una carpeta lib/ que contenga las bibliotecas de funciones. - Una carpeta css/ que contenga las hojas de estilo. - Una carpeta tpl/ que contenga las plantillas. - Una carpeta upload/ en la que se guarden los archivos que se suben. - Una carpeta img/ con las imágenes comunes. - Una carpeta swf/ con las películas en Flash. - Una carpeta doc/ con los archivos binarios para descargar (Word, PDF, ZIP...)
Plataforma de Teleformación de IFES
Página 237 de 240
Programación en PHP
Bibliografía PHP a través de ejemplos. ABRAHAM GUTIÉRREZ, G. BRAVO. Editorial RAMA, Madrid 2005. PHP. CHRISTOPHER COSENTINNO. Editorial Prentice Hall, Madrid 2005. PHP 5. DAVE MERCER, ALLAN KENT, STEVEN NOWICKI. Editorial Anaya Multimedia, Madrid 2005. PHP 5. FRANCISCO CHARTE OJEDA. Editorial Anaya Multimedia, Madrid 2005. La biblia de PHP 5. JOHN COGGESHALL. Editorial Anaya Multimedia, Madrid 2005. Desarrollo web con PHP 5 y MySQL. JUAN DIEGO GUTIÉRREZ GALLARDO. Editorial Anaya Multimedia, Madrid 2005. PHP 5. LUIS MIGUEL CABEZAS GRANADO. Editorial Anaya Multimedia, Madrid 2005.
Página 238 de 240
Programación en PHP
Programación en PHP
Enlaces Página oficial de PHP (en inglés) PHP, páginas oficiales. http://www.php.net Tutorial en castellano de la página oficial Tutoriales de PHP. http://es.php.net/manual/es/index.php Tutorial en castellano Tutoriales de PHP. http://www.phpbuilder.com/manual2/manual/es/ Referencia de funciones en castellano Referencia PHP. http://www.php.net/manual/es/funcref.php Extensiones (en inglés) Recursos PHP. http://pear.php.net/ PHPLib, popular conjunto de librerías (en inglés) Recursos PHP. http://phplib.sourceforge.net Sistema de plantilas DTemplate (en inglés) Recursos PHP. http://desolatewaste.com/ Página oficial de Apache (en inglés) Apache. http://www.apache.org Paquete de instalación Xampp Apache. http://www.apachefriends.org/en/xampp.html Página oficial (en inglés) MySQL. http://dev.mysql.com/
Plataforma de Teleformación de IFES
Página 239 de 240
Manual de referencia de la versión 4.1.(en inglés) MySQL. http://dev.mysql.com/doc/refman/4.1/en/index.html World Wide Web Consortium, organismo estandarizador de Internet Programación web en general. http://www.w3c.es/
Página 240 de 240
Programación en PHP