Вы находитесь на странице: 1из 526

PHP y MySQL

Tecnologas para el desarrollo de aplicaciones web

III

IV

NGEL COBO PATRICIA GMEZ DANIEL PREZ ROCO ROCHA

PHP y MySQL
Tecnologas para el desarrollo de aplicaciones web

ngel Cobo, Patricia Gmez, Daniel Prez y Roco Rocha, 2005


No est permitida la reproduccin total o parcial de este libro, ni su tratamiento informtico, ni la transmisin de ninguna forma o por cualquier medio, ya sea electrnico, mecnico por fotocopia, por registro u otros mtodos, sin el permiso previo y por escrito de los titulares del Copyright. Ediciones Daz de Santos Internet: http//www.diazdesantos.es/ediciones E-mail: ediciones@diazdesantos.es ISBN: 84-7978-706-6 Depsito Legal: M. 27.919-2005 Fotocomposicin: P55 Servicios Culturales Diseo de cubierta: P55 Servicios Culturales Impresin: Fernndez Ciudad Encuadernacin: Rstica-Hilo Printed in Spain - Impreso en Espaa

VI

A Valeria

VII

VIII

ndice

Agradecimientos .............................................................................................

VII

Prefacio

.............................................................................................

XVII

1. INTERNET Y LA PROGRAMACIN DE ORDENADORES ............. 1.1. INTRODUCCIN ............................................................................ 1.2. INTERNET ....................................................................................... 1.2.1. El servicio web ..................................................................... 1.2.2. Relacin cliente/servidor ...................................................... 1.2.3. Proceso de creacin y publicacin de pginas web ............. 1.2.4. Dinamismo e interactividad en las pginas web .................. 1.3. PROGRAMACIN DE ORDENADORES ..................................... 1.3.1. Tipos de lenguajes de programacin .................................... 1.4. PROGRAMACIN EN INTERNET ............................................... 1.4.1. Programacin del lado del cliente vs programacin del lado del servidor ................................................................... 1.4.2. Tecnologas de programacin del lado del cliente ................ 1.4.3. Tecnologas de programacin del lado del servidor ............. 2. OPEN SOURCE Y SOFTWARE LIBRE .................................................. 2.1. INTRODUCCIN ............................................................................ 2.1.1 Qu es open source? ..........................................................

1 1 3 4 5 7 8 9 11 15 16 18 20 25 25 27

IX

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

2.2.

2.3. 2.4.

2.5.

2.6.

BREVE RESEA CRONOLGICA ............................................... 2.2.1. Primera etapa, antecedentes ................................................. 2.2.2. Segunda etapa, desarrollo .................................................... 2.2.3. Tercera etapa, expansin ..................................................... LA CORRIENTE OPEN SOURCE Y SOFTWARE LIBRE, FILOSOFA Y CARACTERSTICAS ............................................. LICENCIAS ...................................................................................... 2.4.1. Licencias propietarias .......................................................... 2.4.2. Licencias libres .................................................................... 2.4.3. Licencias semilibres ............................................................. SITUACIN ACTUA DEL SOFTWARE OPEN SOURCE ............ 2.5.1. Software open source, aplicaciones para todo .................... 2.5.2. Comunidades open source ................................................... 2.5.3. Usuarios de software open source ....................................... VENTAJAS, INCONVENIENTES Y PERSPECTIVAS DE FUTURO ........................................................................................... 2.6.1. Ventajas ................................................................................ 2.6.2. Inconvenientes ...................................................................... 2.6.3 Perspectivas de futuro ..........................................................

28 28 28 29 31 35 36 37 38 40 40 47 48 51 51 52 52

3. CREACIN DE PGINAS WEB MEDIANTE EL LENGUAJE HTML ................................................................................. 3.1. INTRODUCCIN ............................................................................ 3.1.1. Definicin de HTML ........................................................... 3.2. HISTORIA DE HTML ..................................................................... 3.3. SOFTWARE NECESARIO PARA TRABAJAR CON HTML ....... 3.3.1. Navegadores......................................................................... 3.3.2. Editores ................................................................................ 3.4. ESTRUCTURA DE UNA PGINA WEB ....................................... 3.4.1. Complementos a la estructura bsica: metatags .................. 3.5. CARACTERSTICAS GENERALES DEL LENGUAJE Y SINTAXIS DE SUS COMANDOS .............................................. 3.5.1. Caracteres especiales ........................................................... 3.6. COMANDOS BSICOS .................................................................. 3.6.1. Comandos de cabeceras para definicin de ttulos y secciones ........................................................................... 3.6.2. Comandos de cambio de estilo de texto ............................... 3.6.3. Bloques de texto y prrafos ................................................. 3.6.4. Comandos para la generacin de listas ................................

55 55 57 58 60 60 60 62 62 66 67 68 68 68 69 71

NDICE

3.7.

3.8.

3.6.5. Creacin de Tablas ............................................................... 3.6.6. Insercin de imgenes .......................................................... 3.6.7. Tratamiento del color ........................................................... 3.6.8. Enlaces o hipervnculos ....................................................... MARCOS O FRAMES ...................................................................... 3.7.1. Construccin de pginas con marcos ................................... 3.7.2. Enlaces en pginas con marcos ............................................ FORMULARIOS ..............................................................................

76 79 81 82 85 85 87 90 99 99 100 102 108 111 111 112 113 113 114 119 120 124 137 137 139 141 143 144 145 146 147 153

4. INTRODUCCIN A PHP .......................................................................... 4.1. EL LENGUAJE PHP ........................................................................ 4.2. ORGENES Y EVOLUCIN DEL LENGUAJE ............................. 4.3. PROGRAMACIN EN PHP: PRIMEROS EJEMPLOS ................ 4.4. FORMAS DE INCRUSTAR EL CDIGO PHP EN LOS DOCUMENTOS HTML ................................................... 4.5. ESCRITURA DEL CDIGO FUENTE PHP .................................. 4.5.1. Aspectos sobre la sintaxis del lenguaje ................................ 4.5.2. Insercin de comentarios en el cdigo ................................. 4.6. ELEMENTOS BSICOS DEL LENGUAJE ................................... 4.6.1. Tipos de datos ...................................................................... 4.6.2. Variables .............................................................................. 4.6.3. Constantes ............................................................................ 4.6.4. Cadenas de caracteres y variables ....................................... 4.6.5. Operadores ........................................................................... 5. PHP Y LOS FORMULARIOS DE HTML ............................................... 5.1. FORMULARIOS DE HTML ........................................................... 5.2. ENVO DE DATOS A PROGRAMAS PHP .................................... 5.3. MTODOS DE ACCESO A LAS VARIABLES DEL FORMULARIO........................................................................ 5.4. MTODOS DE TRANSFERENCIA DE DATOS EN FORMULARIOS........................................................................ 5.4.1. Mtodo GET ........................................................................ 5.4.2. Mtodo POST ...................................................................... 5.4.3. Diferencias entre ambos mtodos ........................................ 5.5. TRANSFERENCIA DE DATOS AL SCRIPT DESDE EL URL ............................................................................................. 5.6. TRATAMIENTO DE FORMULARIOS CON LISTAS DE SELECCIN MLTIPLE ..........................................................

XI

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

6. SENTENCIAS DE CONTROL ................................................................. 6.1. INTRODUCCIN ............................................................................ 6.2. ESTRUCTURAS CONDICIONALES ............................................ 6.2.1. Sentencia IF ......................................................................... 6.2.2. La clusula ELSE ................................................................ 6.2.3. Sentencia If ... ELSEIF ... ELSE ......................................... 6.2.4. Sintaxis alternativa de las sentencias IF .............................. 6.2.5. Estructuras condicionales SWITCH ... CASE .................... 6.3. ESTRUCTURAS ITERATIVAS ...................................................... 6.3.1. Sentencia WHILE ................................................................ 6.3.2. Sentencia DO ... WHILE ..................................................... 6.3.3. Sentencia FOR ..................................................................... 6.3.4. Sentencia FOREACH .......................................................... 6.3.5. Sentencias BREAK y CONTINUE ..................................... 7. DEFINICIN DE FUNCIONES ............................................................... 7.1. CMO SE DEFINEN FUNCIONES EN PHP? ............................. 7.2. LLAMADA A LAS FUNCIONES ................................................... 7.3. ARGUMENTOS DE UNA FUNCIN ............................................ 7.3.1. Argumentos opcionales ........................................................ 7.3.2. Argumentos con valores por defecto .................................... 7.3.3. Listas de argumentos de longitud variable ........................... 7.3.4. Paso de argumentos por valor o por referencia ................... 7.4. MBITO DE LAS VARIABLES ..................................................... 7.4.1. Variables locales .................................................................. 7.4.2. Variables globales ................................................................ 7.4.3. Variables estticas ................................................................ 7.5. CLUSULAS INCLUDE Y REQUIRE ........................................... 7.6. FUNCIONES VARIABLES ............................................................. 8. ARRAYS ............................................................................................. 8.1. CONCEPTOS FUNDAMENTALES ............................................... 8.1.1. Construccin de arrays ........................................................ 8.1.2. Arrays multidimensionales ................................................... 8.2. RECORRIDO DE TODOS LOS ELEMENTOS DE UN ARRAY ............................................................................................. 8.3. FUNCIONES DE MANIPULACIN DE ARRAYS ....................... 8.3.1. Transformacin de los ndices ............................................. 8.3.2. Subdivisin ..........................................................................

157 157 158 158 162 165 167 169 175 175 176 179 187 188 193 193 196 199 199 200 201 203 206 206 207 208 209 211 215 215 216 218 219 225 225 226

XII

NDICE

8.3.3. 8.3.4. 8.3.5. 8.3.6. 8.3.7. 8.3.8. 8.3.9.

Contabilizacin de elementos ............................................... Bsqueda de datos ............................................................... Generacin de arrays ........................................................... Prolongacin o truncamiento de un array ............................ Combinacin de arrays ........................................................ Aplicacin de funciones ....................................................... Ordenacin de los elementos de un array .............................

227 228 232 237 238 240 244 249 249 250 250 250 253 254 256 256 258 259 259 267 269 269 272 275 277 278 281 283 285 285 286 288 291 294

9. FUNCIONES PREDEFINIDAS ................................................................ 9.1. INTRODUCCIN ............................................................................ 9.2. FUNCIONES DE MANIPULACIN DE CADENAS DE CARACTERES .......................................................................... 9.2.1. Reconocimiento de caracteres .............................................. 9.2.2. Conversiones entre cadenas y arrays ................................... 9.2.3. Prolongacin de una cadena................................................. 9.2.4. Modificacin de una cadena ................................................ 9.2.5. Comparacin de cadenas ..................................................... 9.2.6. Bsqueda de datos ............................................................... 9.2.7. Subdivisin de cadenas ........................................................ 9.2.8. Longitud de una cadena ....................................................... 9.3. FUNCIONES DE FECHA Y HORA ................................................ 9.4. FUNCIONES MATEMTICAS ...................................................... 10. PROGRAMACIN ORIENTADA A OBJETOS ................................... 10.1. INTRODUCCIN ............................................................................ 10.2. DEFINICIN DE UNA CLASE ...................................................... 10.2.1. Constructores ....................................................................... 10.3. CONSTRUCCIN DE OBJETOS ................................................... 10.3.1. Acceso a las variables y mtodos del objeto ........................ 10.4. HERENCIA ...................................................................................... 10.4.1. Definicin de subclases ........................................................ 11. COOKIES ............................................................................................. 11.1. QU SON LAS COOKIES? ........................................................... 11.2. GENERACIN DE COOKIES ........................................................ 11.3. RECUPERACIN DE LOS VALORES DE LAS COOKIES ........ 11.4. COOKIES DE SESIN Y COOKIES PERMANENTES ............... 11.5. VISIBILIDAD DE LAS COOKIES EN EL SITIO WEB ................

XIII

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

12. MANEJO DE FICHEROS ........................................................................ 12.1. MECANISMOS DE ALMACENAMIENTO DE DATOS .............. 12.2. OPERACIONES DE MANIPULACIN DE FICHEROS .............. 12.2.1. Apertura y cierre de ficheros ............................................... 12.2.2. Operaciones de lectura de datos ........................................... 12.2.3. Lectura con formato ............................................................. 12.2.4. Operaciones de escritura de datos ........................................ 12.2.5. Otras funciones de manipulacin de ficheros ...................... 12.3. ENVO DE FICHEROS A TRAVS DE FORMULARIOS HTML ... 13. BASES DE DATOS RELACIONALES Y EL LENGUAJE SQL ............ 13.1. INTRODUCCIN ............................................................................ 13.2. DISEO DE BASES DE DATOS .................................................... 13.2.1. Modelo relacional ................................................................ 13.2.2. Diagramas entidad/relacin ................................................ 13.3. UN EJEMPLO ILUSTRATIVO: CINEM@S .................................. 13.4. EL LENGUAJE SQL ........................................................................ 13.4.1. Introduccin ......................................................................... 13.4.2. Sentencias de definicin de datos ......................................... 13.4.3. La sentencia INSERT .......................................................... 13.4.4. La sentencia DELETE ......................................................... 13.4.5. La sentencia UPDATE ......................................................... 13.4.6. La sentencia SELECT ......................................................... 14. EL SISTEMA GESTOR DE BASES DE DATOS MYSQL .................. 14.1. QU ES MYSQL? .......................................................................... 14.2. UTILIZACIN DE MYSQL ............................................................ 14.2.1. Arranque del servidor MySQL ............................................ 14.2.2. Inicio del monitor de MySQL .............................................. 14.3. EJECUCIN DE SENTENCIAS SQL ............................................ 14.4. GESTIN DE USUARIOS .............................................................. 14.4.1. La tabla USER ..................................................................... 14.4.2. Eliminacin de usuarios ....................................................... 14.4.3. Establecimiento de contraseas para los usuarios ............... 14.4.4. Creacin de nuevos usuarios................................................ 14.5. BASES DE DATOS Y TABLAS EN MYSQL ................................. 14.6. TIPOS DE DATOS ........................................................................... 14.6.1. Tipos Numricos ..................................................................

295 295 296 296 298 300 303 306 307 309 309 310 310 311 311 316 316 317 324 328 329 330 339 339 340 340 342 344 346 346 349 350 352 354 356 356

XIV

NDICE

14.7.

14.8.

14.6.2. Tipos cadena de caracteres .................................................. 14.6.3. Tipos enum y set .................................................................. 14.6.4. Tipos fecha/hora .................................................................. INTEGRIDAD REFERENCIAL EN MYSQL ................................ 14.7.1. Definicin de claves forneas .............................................. 14.7.2. Insercin de registros en tablas relacionadas ....................... 14.7.3. Eliminacin de registros en tablas relacionadas .................. 14.7.4. Actualizacin de registros en tablas relacionadas................ IMPORTACIN Y EXPORTACIN de datos ................................. 14.8.1. Importacin de datos ............................................................ 14.8.2. Exportacin de datos............................................................

359 361 362 364 365 372 373 379 381 381 385

15. PHPMYADMIN: ADMINISTRACIN DE BASES DE DATOS MYSQL DESDE LA WEB ......................................................... 15.1. INTRODUCCIN ............................................................................ 15.2. ENTRADA A PHPMYADMIN ........................................................ 15.3. GESTIN DE BASES DE DATOS ................................................. 15.3.1. Consulta de las bases de datos ............................................. 15.3.2. Manipulacin de las tablas .................................................. 15.3.3. Estructura de las tablas ........................................................ 15.4. CREACIN DE NUEVAS BASES DE DATOS ............................. 15.4.1. Creacin de tablas ................................................................ 15.5. OPERACIONES DE IMPORTACIN Y EXPORTACIN DE DATOS ....................................................................................... 15.5.1. Importacin de datos externos en las tablas ........................ 15.5.2. Exportacin de datos............................................................ 15.6. GESTIN DE USUARIOS .............................................................. 15.6.1. Usuarios y privilegios .......................................................... 15.6.2. Creacin de usuarios ............................................................ 16. CONECTIVIDAD A BASES DE DATOS MYSQL DESDE PHP ........ 16.1. INTRODUCCIN ............................................................................ 16.2. CONEXIN CON MYSQL DESDE PHP ....................................... 16.2.1. Apertura de la conexin ....................................................... 16.2.2. Cierre de la conexin ........................................................... 16.3. SELECCIN DE LA BASE DE DATOS ........................................ 16.4. EJECUCIN DE SENTENCIAS SQL SOBRE LA BASE DE DATOS SELECCIONADA ........................................................

389 389 390 392 392 393 398 400 401 403 403 405 407 407 408 413 413 414 414 415 416 417

XV

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

16.5.

16.4.1. Insercin de datos a travs de formularios........................... 419 16.4.2. Recuperacin de los resultados de las consultas .................. 424 OTRAS FUNCIONES DE MANIPULACIN DE DATOS ........... 450 453 453 454 455 458 460 465 465 466 468 468 470 471 471 473 474 475 476 477 478 479 480 480 484 486 488 490 493 495

17. IMPLEMENTACIN DE FOROS .......................................................... 17.1. INTRODUCCIN ............................................................................ 17.2. ESTRUCTURA DE LA TABLA DE LA BASE DE DATOS .......... 17.3. GENERACIN DE LA PGINA PRINCIPAL DE LOS FOROS .... 17.4. CONSULTA DE UN MENSAJE CON SUS RESPUESTAS .......... 17.5. INSERCIN DE NUEVOS MENSAJES ........................................ 18. SOLUCIONES OPEN SOURCE BASADAS EN PHP Y MYSQL ....... 18.1. INTRODUCCIN ............................................................................ 18.2. GESTORES DE CONTENIDO ....................................................... 18.2.1. Funcionamiento .................................................................... 18.2.2. Caractersticas ..................................................................... 18.2.3. Ventajas e inconvenientes ..................................................... 18.3. GESTORES DE CONTENIDO BASADOS EN PHP Y MYSQL ......................................................................................... 18.3.1. PHP-NUKE ......................................................................... 18.3.2. POSTNUKE ........................................................................ 18.3.3. MAMBO SERVER.............................................................. 18.3.4. PHPWEBSITE .................................................................... 18.3.5. PHP-WCMS ........................................................................ 18.3.6. XOOPS ................................................................................ 18.3.7. DRUPAL .............................................................................. 18.3.8. SITEFRAME ....................................................................... 18.4. OTRAS SOLUCIONES OPEN SOURCE ....................................... 18.4.1. Weblogs ................................................................................ 18.4.2. Sistemas de foros ................................................................. 18.4.3. Plataformas de e-learning ................................................... 18.4.4. Entornos de comercio electrnico ........................................ 18.4.5. Sistemas de atencin al cliente ............................................. 18.4.6. Herramientas de gestin de proyectos .................................. 18.4.7. Otras herramientas ............................................................... ndice alfabtico

............................................................................................. 497

XVI

Prefacio

El presente libro aborda una temtica de plena actualidad y de gran auge en los ltimos aos, como es el uso de soluciones open source para el desarrollo de aplicaciones web. El uso conjunto del lenguaje PHP y el sistema gestor de bases de datos MySQL permite la construccin, de una manera sencilla y eficiente, de verdaderos sitios web dinmicos. En los ltimos tiempos se est observando cmo son cada vez ms las empresas que optan por estas tecnologas para el desarrollo de sus portales; incluso, en el caso de particulares, algunos de los servicios gratuitos de alojamiento de pginas web ofrecen la posibilidad de usar PHP en conjuncin con MySQL. Los autores de este libro somos profesores de la Universidad de Cantabria, con experiencia en la imparticin de cursos sobre tecnologas de programacin, desarrollo de aplicaciones web, informtica de gestin y sistemas de informacin. Fruto de nuestra dilatada experiencia docente de estos aos surge el presente libro. Parte del material que incluye ha sido usado exitosamente para la imparticin de varios cursos de verano y un mdulo de desarrollo de aplicaciones web en el Mster en e-Business que organiza la Universidad de Cantabria. Nuestra intencin ha sido escribir un libro que pueda ser seguido por personas con conocimientos muy bsicos de lenguajes de programacin y con inquietudes por el desarrollo de sitios web. En el campo de la informtica, especialmente, existe un gran nmero de personas autodidactas y con un carcter claramente vocacional; este tipo de libros va dirigido a ellos.

XVII

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Es por ello que se ha buscado un enfoque eminentemente prctico, ilustrando los diferentes conceptos con un gran nmero de ejemplos. De hecho, se pretende que a lo largo de los diferentes captulos se vaya describiendo paso a paso todo el proceso de desarrollo de un sitio web verdaderamente dinmico y profesional. Para ello hemos optado por mostrar el desarrollo del sitio web de una empresa ficticia; en concreto consideraremos el sitio web de un multicine que hemos bautizado como Cinem@s y que ofrecer la posibilidad de consultar carteleras dinmicas (mostrando siempre la informacin actualizada), consultar disponibilidades de localidades, registrarse como cliente,... El libro comienza con una rpida presentacin de las caractersticas generales de Internet y las diferentes tecnologas de programacin que pueden ser usadas. Para pasar posteriormente a analizar la filosofa y evolucin de la conocida como corriente open source. El tercer captulo tiene por objeto presentar los comandos bsicos del lenguaje HTML que permitan disear unas sencillas pginas web en torno a las que construir posteriormente la aplicacin web. Tras estos tres captulos iniciales, los siguientes se dedican a la presentacin del lenguaje PHP, su interaccin con los formularios de HTML, as como a presentar las estructuras bsicas presentes en todo lenguaje de programacin (sentencias de control, funciones y estructuras de datos). Se ha dedicado tambin un captulo a una introduccin muy bsica a la programacin orientada a objetos; as como sendos captulos dedicados a manejo de cookies y ficheros. La segunda parte del libro se centra en el uso del sistema MySQL, para lo que se ha considerado oportuno introducir un captulo previo de estudio del modelo relacional de bases de datos y el lenguaje SQL. Tras analizar las caractersticas de MySQL se muestra cmo es posible la administracin remota de las bases de datos mediante una aplicacin desarrollada en PHP. Una vez analizada esta aplicacin de administracin, los siguientes captulos muestran la sencillez de los procesos de conectividad a MySQL desde PHP. El libro finaliza con un captulo en el que se presentan muy brevemente algunas de las aplicaciones open source ms conocidas en Internet y que se basan en las tecnologas explicadas en el libro. Llegado a este punto se espera que el lector pueda no solo hacer uso de esas aplicaciones, sino tambin modificarlas y adaptarlas a sus necesidades particulares, aprovechando de esta forma la gran ventaja de las aplicaciones de cdigo abierto. Finalmente, quisiramos mostrar nuestro agradecimiento a los Departamentos de Matemtica Aplicada y Ciencias de la Computacin y de Administracin de Empresas de la Universidad de Cantabria por sus facilidades y apoyo para escribir
XVIII

PREFACIO

este libro. Agradecimiento que hacemos extensivo a todos nuestros alumnos durante estos aos; ellos nos han servido de incentivo para embarcarnos en este proyecto editorial. ngel Cobo Patricia Gmez Daniel Prez Roco Rocha Santander, febrero de 2005

XIX

ALERTA!

XX

INTERNET Y LA PROGRAMACIN DE ORDENADORES


1.1. INTRODUCCIN
La aparicin a principios de los noventa del servicio web supuso una verdadera revolucin en el campo de la informtica y las telecomunicaciones. Con la irrupcin de este nuevo servicio, Internet inici una rpida transicin hacia el mbito empresarial y supuso un enorme impulso al crecimiento de la red. Lo que haba surgido en plena guerra fra como un proyecto militar y que posteriormente fue dirigindose hacia el mbito cientfico y acadmico, se empez a convertir en un perfecto escaparate virtual en el que las empresas pudieran ofrecer sus productos y servicios rompiendo barreras geogrficas y de comunicaciones. En la actualidad las empresas no ven nicamente el servicio web como un mero escaparate o medio publicitario de enorme difusin. Internet, y en particular el servicio web, abre a las empresas enormes posibilidades. La utilizacin de tecnologas web permite agilizar los procesos, mejorar la productividad y aumentar la eficacia, adems de abrir las puertas a nuevas formas de negocio en el mercado global que facilita Internet (e-business).

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Por supuesto, no han sido las empresas las nicas beneficiadas con el desarrollo de Internet y del servicio web. Las instituciones pblicas tienen tambin nuevas formas de ofrecer servicios a los ciudadanos (e-governement), los usuarios individuales tienen nuevas formas de adquirir productos (e-commerce) o nuevas formas de formarse e instruirse (e-learning),... Para poder realmente obtener todos estos beneficios ha sido preciso desarrollar nuevas tecnologas que consigan hacer del servicio web un servicio dinmico e interactivo. En sus orgenes el servicio World Wide Web fue concebido como un sistema flexible de compartir informacin multimedia entre equipos heterogneos a travs de redes informticas. Para ello fue desarrollado un sistema de generacin de documentos a travs de un lenguaje estndar: el lenguaje HTML. Los documentos generados de esta forma podan incorporar texto y elementos grficos, pero eran documentos totalmente estticos. Posteriormente fueron desarrollndose diferentes tecnologas que, trabajando en conjuncin con el lenguaje HTML, pudieran paliar estas carencias. As por ejemplo, Netscape incorpor en la versin 2.0 de su clebre navegador un intrprete de un nuevo lenguaje que poda ser intercalado entre el cdigo HTML y que permita realizar operaciones no disponibles en un lenguaje puramente descriptivo como es HTML; dicho lenguaje, llamado en sus orgenes LiveScript, adquiri posteriormente el nombre de JavaScript. Unos aos ms tarde la empresa Sun Microsystems lanz un revolucionario lenguaje de programacin, el lenguaje Java, que permita incrustar en las pginas web programas con las prestaciones propias de cualquier lenguaje de programacin. Microsoft por su parte tambin se uni a esta evolucin primero con sus lenguajes de script: VBScript basado en Visual Basic y JScript, versin Microsoft de JavaScript, y, ms recientemente, con las tecnologas .NET. Igualmente se han venido desarrollando diferentes extensiones del propio lenguaje HTML con objeto de aumentar su dinamismo; en este contexto se podra citar el HTML dinmico (DHTML) y el lenguaje XML. Internet ha jugado un papel esencial en la expansin de la denominada corriente open source. Los defensores de esta corriente defienden el desarrollo de aplicaciones informticas y su distribucin libre, de forma gratuita; pero no solo eso sino que tambin ponen a disposicin de los usuarios el cdigo fuente de los programas desarrollados. Se trata, en definitiva, de que los usuarios puedan utilizar los programas sin ninguna restriccin y puedan conocer si lo desean su funcionamiento interno. El ejemplo ms emblemtico de esta corriente open source lo constituye el sistema operativo Linux. En los ltimos aos est corriente se ha desarrollado enormemente y ya se pueden obtener en la propia red Internet todo tipo de programas basados en esta filosofa: servidores y navegadores web, entornos de programacin, editores, herramientas ofimticas,... Grandes empresas como IBM o Yahoo, por ejemplo, han apostado muy fuerte por las soluciones open

INTERNET Y LA PROGRAMACIN DE ORDENADORES

source y, sin lugar a dudas, el impacto de este tipo de soluciones parece destinado a incrementarse en el futuro debido a sus altas prestaciones y calidad, su menor coste y su alta difusin. Las dos herramientas que se analizarn en este libro surgen de esta corriente. Por un lado el lenguaje PHP, que naci como un lenguaje para realizar un seguimiento de visitas de pginas personales, se ha convertido en uno de los referentes actuales en los denominados lenguajes de script. Por otro lado, el sistema gestor de bases de datos MySQL se presenta como una herramienta con altas prestaciones para el desarrollo de bases de datos, especialmente apropiado para ser usada por pequeas organizaciones o empresas. La utilizacin conjunta de ambos: PHP y MySQL permite llegar a desarrollar interesantes aplicaciones web que puedan cubrir las necesidades de pequeas empresas que quieran fortalecer su presencia en Internet o usuarios individuales que quieran generar verdaderas pginas dinmicas. Como complemento a ambas herramientas, en Internet se pueden encontrar igualmente gestores de contenidos, aplicaciones basadas en PHP que permiten a los usuarios finales aprovechar las ventajas de estas tecnologas sin necesidad de tener grandes conocimientos sobre su funcionamiento y sintaxis de los lenguajes. En el presente libro se darn referencias de algunas de estas herramientas de gestin de contenidos y otras herramientas para la creacin de aplicaciones web que han sido desarrolladas igualmente haciendo uso de las dos tecnologas que se analizarn en este libro: el lenguaje PHP y el gestor de bases de datos MySQL. El Captulo 18 presentar algunas de estas herramientas.

1.2. INTERNET
El objeto de esta seccin no es tanto definir lo que es Internet como el poner de manifiesto algunas de las caractersticas ms destacadas de la misma que influyen decisivamente en las tecnologas de desarrollo vinculadas al servicio web, como es el caso del lenguaje PHP. Se asume que cualquier lector interesado en este libro es usuario de Internet y conoce los diferentes servicios que la red ofrece, posiblemente tambin su inters en el desarrollo de aplicaciones web es el que le ha impulsado a adquirir este libro. Internet (INTERconected NETwork) es una red de redes de ordenadores de todo tipo que se comunican mediante un lenguaje comn: el conocido como protocolo TCP/IP. Esa primera caracterstica de la heterogeneidad de los equipos conectados es clave para entender el funcionamiento de todos los servicios de la red y para comprender la necesidad de la portabilidad en cualquier desarrollo que se quiera hacer en el mbito de Internet. A nivel de programadores de aplicaciones web, que

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

es en el que se sita el presente libro, no es necesario disponer de conocimientos tcnicos sobre los protocolos de comunicacin en los que se basa Internet. Los desarrollos de aplicaciones realizados en Internet tienen tambin un campo de aplicacin en aquellas redes privadas que usan los mismos sistemas y protocolos que Internet: las denominadas Intranets. Otro de los aspectos a tener en cuenta es el carcter distribuido de la red. Ese carcter totalmente distribuido se concreta a todos los niveles: en el aspecto geogrfico no existe ningn nodo central de la red, de hecho, los orgenes de Internet se sitan en un proyecto militar del Gobierno de los Estados Unidos para crear una red que no fuera vulnerable ante el ataque a alguno de sus nodos. En el aspecto econmico, tampoco existe ningn gobierno o institucin que mantenga la red sino que son las propias subredes que la componen las encargadas de su propio mantenimiento. El carcter distribuido tambin se manifiesta en el aspecto poltico ante la ausencia de un gobierno central de la red; lo que s existen son diversas organizaciones o asociaciones que tratan de establecer diferentes estndares para el desarrollo de la red. Aunque el servicio web es actualmente el servicio ms conocido y utilizado de la red Internet, conviene recordar que no es el nico. Los tres servicios originarios de la red: correo electrnico (e-mail), transferencia de fichero (FTP) y acceso remoto (Telnet), siguen estando presentes y siguen siendo ampliamente utilizados. Pero podran citarse otros servicios, algunos muy conocidos y otros en cierta decadencia al haber absorbido el propio servicio web sus funciones: servicios de noticias (news), gopher, servicios de bsqueda de archivos (Archie), Vernica, servicios de localizacin,... En los ltimos aos tambin estn teniendo mucho auge las aplicaciones P2P.

1.2.1. EL SERVICIO WEB


El servicio WWW, o simplemente Web, se podra definir como un amplio sistema multimedia de acceso a informacin heterognea distribuida por toda la red en forma de documentos hipertextuales (hipertextos). Como ya fue comentado en la introduccin de este captulo, este servicio surgi en 1990 en el CERN (Centre Europen de Recherche Nuclaire) con el objetivo de facilitar la distribucin de informacin entre equipos investigadores geogrficamente dispersos. Se buscaba que los recursos disponibles en formato electrnico fuesen accesibles para cada investigador desde su propia terminal de forma clara y simple, posibilitando el salto entre elementos de informacin conexos. En definitiva, se trataba de integrar todos los recursos existentes en una red hipertextual. Aunque el nacimiento del

INTERNET Y LA PROGRAMACIN DE ORDENADORES

servicio se sita en 1990, es en 1991 cuando el sistema desarrollado en el CERN se abre a Internet, apareciendo en 1992 el primer navegador web: Mosaic. El trmino hipertexto que empez a hacerse popular a partir de la aparicin de este servicio tiene, sin embargo, su definicin en un trabajo de Ted Nelson en 1965, la definicin original del trmino es: "Un cuerpo de material escrito o grfico interconectado de un modo complejo que no se puede representar convenientemente sobre el papel; puede contener anotaciones, adiciones y notas de los estudiosos que lo examinan". En una definicin ms moderna y aplicable al concepto de hipertexto en Internet, se podra decir que un hipertexto es un documento multimedia, es decir, integrando bajo una plataforma informtica todas las tecnologas de la informacin, y que incorpora relaciones estructurales que enlazan el documento con otros documentos o recursos. Algunas de las caractersticas destacadas de los hipertextos son: Almacenamiento de un gran volumen de informacin. Facilidad de acceso y consulta. Presentacin de una forma ms agradable. Uso de todas las tecnologas de la informacin. Permiten una navegacin individualizada. Estructuracin multidimensional. Multiplataforma. Dinamismo e interactividad.

1.2.2. RELACIN CLIENTE/SERVIDOR


Todos los servicios que ofrece Internet, y por supuesto entre ellos el servicio web, se basan en la denominada relacin cliente/servidor. El comprender bien esta relacin es esencial para entender el funcionamiento posterior de lenguajes como PHP. En Internet se pueden encontrar dos tipos de equipos conectados: Servidores: ordenadores que ofrecen sus servicios al resto de equipos conectados. Suelen tener una presencia estable en la red, lo que se concreta en tener asignadas direcciones IP permanentes. En ellos es donde estn alojadas, por ejemplo, las pginas web.

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Clientes: equipos que los usuarios individuales utilizan para conectarse a la red y solicitar servicios a los servidores. Durante el tiempo de conexin tienen presencia fsica en la red. Normalmente los proveedores de acceso a Internet asignan a estos equipos una direccin IP durante su conexin, pero esa direccin es variable, es decir, cambia de unas conexiones a otras (IP dinmica). Los conceptos de cliente y servidor se suelen utilizar con dos significados diferentes, en referencia al hardware el sentido es el indicado anteriormente, el servidor hace referencia al equipo remoto al que se realiza la conexin y el cliente sera el equipo local utilizado para efectuar dicha conexin. Pero tambin se utilizan esos conceptos en referencia al software: Programa servidor es el programa que debe estar ejecutndose en el equipo servidor para que este pueda ofrecer su servicio. Un documento HTML sin ms almacenado en el equipo remoto no basta para que sea accesible como pgina web por el resto de usuarios de Internet, en ese equipo debe estar ejecutndose una aplicacin servidor web. Uno de los programas servidores web ms conocido y utilizado es Apache, programa que tambin pertenece a la corriente open source. Existen otros servidores web como el Personal Web Server (PWS) o el IIS disponibles en los equipos Windows. En el caso de otros servicios como el correo electrnico o la transferencia de ficheros se necesitaran igualmente los correspondientes programas en el servidor. Programa cliente es en este caso el software necesario en el equipo cliente para tener acceso al correspondiente servicio. As por ejemplo, los navegadores como el Internet Explorer o Mozilla son ejemplos de clientes web; un programa como Outlook es un ejemplo de cliente de correo electrnico y programas como WS_FTP o CuteFTP son ejemplos de clientes FTP.

Figura 1.1 Relacin cliente/servidor. Los clientes realizan peticiones de servicio a los servidores

INTERNET Y LA PROGRAMACIN DE ORDENADORES

1.2.3. PROCESO DE CREACIN Y PUBLICACIN DE PGINAS WEB


El proceso de creacin y publicacin de una pgina web debe pasar por una serie de fases: Definicin de la pgina: toda pgina web tiene detrs un cdigo fuente que la define. Cuando se accede a una pgina web, aunque en el monitor se puedan visualizar documentos con imgenes y texto de diferentes tamaos, colores y formatos, debe tenerse presente que detrs de eso hay un documento de texto sin ningn tipo de formato y que incorpora una serie de instrucciones o comandos que son los que realmente generan la pgina que se visualiza. Ese documento fuente est definido en un lenguaje especial: el conocido HTML (HyperText Markup Language). Se trata de un lenguaje puramente descriptivo que incorpara una serie de comandos o etiquetas (tags) que permiten definir la estructura lgica del documento, dar formato al texto, aadir elementos no textuales,... Se asume que los lectores interesados en este libro tienen un cierto conocimiento de este lenguaje de definicin de hipertextos, no obstante, se ha considerado oportuno incluir un captulo introductorio en el que se presenten los comandos bsicos de HTML (Captulo 3). Para aquellos lectores sin conocimientos de HTML, una comprensin rpida de los comandos expuestos en dicho captulo es ms que suficiente para poder entender el resto del libro. Publicacin del documento: una vez creado el documento HTML que define la pgina web, el siguiente paso es evidentemente publicarla para que est disponible para el resto de usuarios de Internet. La publicacin implica la transferencia del documento a un equipo servidor que disponga de un programa de servidor web. Puede optarse por utilizar algn servidor de alojamiento gratuito de pginas o utilizar los espacios que los proveedores de acceso a Internet suelen ofrecer a sus clientes. Otra posibilidad sera configurar un equipo propio para que acte de servidor, para ello sera preciso contratar con algn proveedor una direccin IP fija y registrar el dominio que se quiera utilizar. Acceso a las pginas web: en el momento en que una pgina es publicada en el servidor, cualquier usuario de Internet podra acceder a ella. Para ello es preciso, por un lado que el usuario utilice un programa adecuado (el navegador, explorador o cliente web), y que el cdigo que define la pgina sea transferido por la red utilizando el protocolo http (hypertext transfer protocol). Sobre este ltimo aspecto, en principio la mayora de usuarios no deberan preocuparse. El navegador web es el que se encarga de interpretar los

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

comandos HTML que se reciben y producir a partir de ellos la pgina web. Existen diferentes navegadores web que se pueden utilizar, por ejemplo, Internet Explorer, Netscape Navigator, HotJava, Mozilla,... este ltimo sigue la corriente open source.

1.2.4. DINAMISMO E INTERACTIVIDAD EN LAS PGINAS WEB


HTML es un lenguaje puramente descriptivo que permite definir las pginas web pero que en modo alguno se puede considerar un lenguaje de programacin. Con HTML no se pueden generar estructuras iterativas o condicionales, no se pueden definir funciones que sean utilizadas en distintos puntos del documento, no se pueden declarar variables, no se pueden realizar clculos matemticos,... Las pginas creadas nicamente con HTML son bsicamente estticas, es decir, siempre muestran la misma informacin y no ofrecen ningn grado de interactividad con el usuario. Los nicos elementos de HTML que podran de alguna forma considerarse interactivos son los formularios a travs de los cuales se solicita informacin al usuario. Si se requiere aumentar el dinamismo e interactividad de las pginas se hace por tanto obligado el recurrir a otros lenguajes y tecnologas como las que se abordan en este libro. Esas dos caractersticas: dinamismo e interactividad son los dos elementos clave que se deben tratar de potenciar para desarrollar verdaderas aplicaciones web. Pero, qu es una pgina dinmica? Pinsese, por ejemplo, en un multicine que quiere publicar en Internet la informacin actualizada sobre horarios y pelculas que se proyectan en cada una de sus salas. Evidentemente, sera muy sencillo generar una simple pgina en HTML con una tabla en la que se muestre esa informacin; incluso sin necesidad de tener ningn tipo de conocimiento sobre HTML, por ejemplo, se podra escribir en Word y usar la opcin de Guardar como pgina web.... Hasta aqu sencillo, pero la informacin en s es un elemento dinmico, las pelculas que se proyectan en cada sala cambian y por tanto la pgina web debera ser actualizada. Tiene sentido tener que modificar el documento HTML cada vez que se produzca un cambio en la cartelera?, no sera muchsimo ms rentable disponer de un sistema que modifique de forma automtica la informacin que muestra la pgina web? Esto es dinamismo, y esto no se puede conseguir solo con HTML. A lo largo de los diferentes captulos de este libro el usuario aprender cmo resulta muy sencillo generar una base de datos con MySQL con toda la informacin de las pelculas a proyectar y una pgina web con un programa PHP que se encargue, cada vez que un usuario solicita la pgina, de hacer una consulta a la base de datos para obtener la cartelera actualizada y generar con ella de forma automtica el cdigo HTML que se enva al usuario. Este mismo ejemplo se ir desarrollando paso a paso en los prximos captulos y servir de hilo conductor del resto del libro.

INTERNET Y LA PROGRAMACIN DE ORDENADORES

Otro ejemplo de dinamismo puede ser el preprocesamiento de datos introducidos en formularios, comprobando por ejemplo la validez sintctica de direcciones de correo electrnico o la pertenencia a determinados rangos de valores numricos. En lo referente a interactividad, se trata de permitir que entre el usuario que acceda a la pgina y la propia pgina exista un cierto grado de comunicacin que no se limite a que la pgina muestre la informacin al usuario. El usuario, por ejemplo, le podra solicitar a la pgina que realice algn clculo. Volviendo al ejemplo de los multicines, supongamos que se desea que el usuario pueda hacer un clculo de forma automtica de los importes de las entradas; mediante un formulario el usuario puede introducir el nmero de entradas a adquirir, la sesin para la que se desean y determinados parmetros que puedan afectar al precio (ser estudiante, disponer de un vale de descuento,...) y la pgina debe calcular de forma automtica el importe total a pagar. Esto es interactividad.

1.3. PROGRAMACIN DE ORDENADORES


La programacin de ordenadores se podra definir como el conjunto de tcnicas, mtodos y reglas para poder construir programas de ordenador legibles, correctos y eficientes. Un programa de ordenador no es ms que una secuencia de instrucciones en las que se le indican a la mquina las rdenes o acciones a realizar; se podra entender por tanto la programacin como el arte de decir a una mquina lo que queremos que haga de una manera que pueda entenderlo. Como todos los campos de la informtica, la programacin de ordenadores ha sufrido una importante evolucin en las ltimas dcadas. Los orgenes se sitan en la dcada de los 50 con la aparicin de los primeros lenguajes de programacin: Fortran (1954), Cobol (1954) y Algol (1957). Estos primeros lenguajes estaban muy orientados hacia aplicaciones concretas; as por ejemplo, Fortran es un lenguaje orientado hacia el clculo cientfico mientras que Algol lo es hacia aplicaciones de gestin. Los aos 60 vienen marcados por el nacimiento de la programacin estructurada y la aparicin de lenguajes como PL/1 de IBM (1960) o el BASIC (1963). Es en los aos 70 cuando aparecen dos de los lenguajes estructurados de mayor difusin: el Pascal (1970) y el C (1972); este ltimo evolucionara posteriormente hacia el C++ y hoy en da es el lenguaje ms utilizado en el desarrollo de aplicaciones. La programacin estructurada se basa en el desarrollo de mdulos o funciones independientes que puedan ser utilizadas en cualquier momento. Es destacable tambin en esta dcada de los 70 el desarrollo del modelo relacional de

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

bases de datos, modelo en el que se basan la mayora de los sistemas gestores de bases de datos actuales, entre ellos MySQL. Los 80 vienen marcados por la aparicin del ordenador personal y el nacimiento de la microinformtica. La informtica deja de ser algo exclusivo de las grandes empresas e instituciones y se acerca al pblico en general. En esta poca aparecen tambin los primeros sistemas operativos con interfaces de usuario grficas: el clebre Mac de Apple Macintosh. Aos ms tarde Microsoft seguira esos pasos con su sistema operativo Windows. La aparicin de este tipo de interfaces tambin afectara notablemente a la evolucin de los lenguajes de programacin, en concreto surge la necesidad de desarrollo de tcnicas de programacin basadas en eventos. En los aos 80 aparece tambin una nueva forma de entender la programacin: la programacin orientada a objetos, as surgen los lenguajes ADA (1980) y C++ (1985). La base en la que se apoya este estilo de programacin es el entender los objetos como entidades compuestas de acciones y datos y, por tanto, a la hora de programar las funciones (acciones) y las variables (datos) deben entenderse como componentes de una misma unidad. La dcada de los 90 se inicia con la aparicin del revolucionario servicio web y la necesidad cada vez ms patente de orientar los desarrollos hacia la integracin de aplicaciones. El servicio web, como ya se coment, rpidamente crea la necesidad de nuevas formas de programacin y as en 1995 nace el lenguaje Java, primer lenguaje pensado para integrar directamente programas en las pginas web. Los programas Java que se integran en esas pginas se denominan applets. En la actualidad, la evolucin en los diferentes sistemas operativos, de los nuevos servicios de Internet y del propio hardware influyen en las prestaciones recomendadas que debe tener un lenguaje de programacin, algunas de las que se podran citar son: Programacin estructurada: en la actualidad todos los lenguajes de programacin soportan este tipo de programacin, en la que las instrucciones se agrupan en bloques constituyendo mdulos que se llaman unos a otros. Programacin orientada a objetos: los lenguajes de programacin de mayor xito se basan en la construccin de clases de objetos. Cada clase engloba, por un lado las acciones que pueden ser realizadas con esos objetos y, por otro, los datos o caractersticas asociadas a los mismos. Algunos lenguajes actuales, aunque no pueden ser considerados orientados a objetos, s que incorporan algunas caractersticas propias de estos lenguajes, trabajando tambin con objetos.

10

INTERNET Y LA PROGRAMACIN DE ORDENADORES

Programacin guiada por eventos: los programas deben ser capaces de dar respuesta a las diferentes acciones que el usuario efecta sobre la interfaze del programa. Por ejemplo, cuando un usuario elige una opcin de men o pulsa un botn se genera un evento que debe ser detectado, identificado y tratado por el programa. Programacin concurrente: la aparicin cada vez con ms frecuencia de equipos con ms de un procesador plantea nuevas formas de programacin; un programa podra ser susceptible de dividir en varias tareas que puedan estar realizndose de forma simultnea, cada tarea puede ser ejecutada por un procesador diferente o bien utilizar mecanismos de reparto del tiempo de procesador. Esta es la base de la programacin paralela o concurrente. Prestaciones multimedia: los programas deben ser capaces de manejar todo tipo de informacin y recursos; deben de estar preparados para trabajar con elementos grficos en diferentes formatos, animaciones o vdeo, sonido,... Portabilidad: evidentemente los programas son desarrollados para que puedan ser utilizados por diferentes usuarios y no siempre est garantizado que los usuarios tengan equipos similares. La portabilidad de los programas permite que estos puedan ser ejecutados sobre diferentes plataforma informticas. Sin embargo, la portabilidad puede entenderse a dos niveles: a nivel de cdigo fuente la portabilidad implica que el cdigo puede ser compilado sobre las dos plataformas para obtener dos versiones diferentes del programa. En algunos casos, la portabilidad se consigue a nivel no de cdigo fuente sino del cdigo resultado del proceso de compilacin; esto es lo que ocurre por ejemplo con el lenguaje Java. En Internet, la portabilidad es un concepto clave por cuanto a la red estn conectados todo tipo de equipos. Integracin de aplicaciones: cada vez es ms necesario que los lenguajes de programacin incorporen mecanismos sencillos para conectarse con otras aplicaciones. Quizs el caso ms claro de ello sea la conectividad a bases de datos; los programas deben ser capaces de establecer esa conexin y realizar consultas sobre los datos almacenados.

1.3.1. TIPOS DE LENGUAJES DE PROGRAMACIN


Los lenguajes de programacin pueden ser clasificados de acuerdo a varios criterios. Una de las primeras clasificaciones que se suele efectuar es la distincin entre lenguajes de bajo nivel y de alto nivel. La programacin en los primeros resulta ms dificultosa puesto que las instrucciones estn muy prximas al

11

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

hardware del equipo y resultan difciles de entender por un programador no especialista. El ejemplo clsico de lenguaje de bajo nivel es el lenguaje ensamblador. La mayor parte de los programadores optan por utilizar lenguajes cuyo cdigo resulta ms fcil de entender, por cuanto sus reglas sintcticas se asemejan ms a la forma de comunicarse las personas; son lenguajes que estn ms cerca del programador pero ms lejos de la mquina a la que van dirigidos. Estos lenguajes son los denominados "lenguajes de alto nivel" y a ellos pertenecen los lenguajes de programacin ms conocidos. Cuando se est desarrollando un programa usando un lenguaje de programacin se genera un cdigo (cdigo fuente) que es comprensible para todo aquel usuario que tenga los conocimientos suficientes sobre el correspondiente lenguaje, pero que en ningn caso es comprensible directamente para la mquina. Los ordenadores trabajan internamente mediante circuitos electrnicos que admiten dos posiciones: abierto o cerrado (1 0) y por tanto, toda orden a dar a la mquina debe ser planteada en ltima instancia como secuencias de ceros y unos (cdigo binario). Parece claro por tanto que se necesita un proceso de traduccin del cdigo fuente que nosotros entendemos a instrucciones entendibles por la mquina. Ese proceso de traduccin se puede realizar de dos maneras, y eso da pie a establecer una nueva clasificacin de los lenguajes de programacin: Lenguajes compilados: en un lenguaje compilado el cdigo fuente pasa por un proceso denominado "compilacin" en el que se genera un cdigo denominado "objeto", que una vez enlazado con otros posibles mdulos de cdigo objeto necesarios, genera el fichero ejecutable con el programa. Ese fichero ejecutable es lo nico necesario para poder utilizar el programa y contiene todas las instrucciones del mismo pero en el formato entendible por la mquina. El aspecto ms importante a destacar es que el proceso de compilacin se realiza con anterioridad a cualquier ejecucin o uso del programa; en ese proceso se comprueba la validez sintctica del programa y si todo es correcto se genera el ejecutable. Si se produce un error en la compilacin el programa no podr ser utilizado. Lenguajes interpretados: en los lenguajes interpretados, la traduccin de las instrucciones se va realizando de forma secuencial por una aplicacin, denominada "intrprete", al mismo tiempo que se ejecuta el programa. De esta forma, si llegado un punto del programa el intrprete se encuentra con una instruccin errnea, el programa no contina pero s que habr podido ejecutar todas las sentencias previas. A diferencia de los lenguajes

12

INTERNET Y LA PROGRAMACIN DE ORDENADORES

compilados, la verificacin de la correccin sintctica del programa no se realiza antes de la ejecucin sino al mismo tiempo. Por poner un smil que sirva para clarificar la diferencia entre ambos tipos de programas, supngase que una persona recibe una lista con una serie de tareas a realizar. Podra optar por utilizar dos estrategias: Antes de comenzar la persona pierde unos minutos leyendo toda la lista y analizando la coherencia o factibilidad de las tareas que se le estn encomendando. Si todas las tareas son coherentes realiza un proceso de planificacin para determinar la forma de realizarlas todas. Pero si detecta alguna tarea que no entiende o le resulta incoherente, informa a la persona que le ha encargado las tareas y opta por no iniciar sus labores a la espera de una posible rectificacin en el listado de tareas (enfoque de un programa compilado) Nada ms recibir la lista de tareas, la persona lee la primera labor encomendada y la realiza. A continuacin pasa a la segunda, la lee y la realiza, y as sucesivamente. Si todo ha ido bien, habr realizado todas las tareas, pero si al llegar a un punto de la lista se encuentra con una tarea errnea o no coherente, opta por abandonar el resto del trabajo e informar a la persona que le encarg las tareas de tal extremo (enfoque de un programa interpretado)

Traduccin if(x<0) return 1; else ... 01101101110 10111101000 111....

Figura 1.2 Necesidad de un proceso de traduccin del cdigo fuente para que el ordenador pueda entenderlo. Dicha traduccin puede realizarse mediante un proceso de complicacin o mediante el uso de un intrprete

13

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

A primera vista, se podra pensar que un lenguaje compilado es ms seguro en el sentido de no producir errores a la hora de ejecutar el programa. En principio, si se producen errores sintcticos en el programa, estos son detectados en la compilacin y por tanto el programa nunca se ejecutara hasta que estos errores fuesen corregidos. Efectivamente, esto es as, pero tampoco se puede descartar que, a pesar de no haber errores sintcticos en el cdigo fuente, se produzcan errores a la hora de ejecutar el programa. Pinsese en un programa que tiene una instruccin en la que se deben dividir dos nmeros almacenados en dos variables y guardar el resultado en una tercera variable; la instruccin puede ser sintcticamente correcta, pero qu pasa si a la hora de ejecutar el programa el segundo de los nmeros es cero?, se producir un error de tipo aritmtico debido a la divisin por cero y si el programa no est preparado para ello, se abortar bruscamente su ejecucin. Este tipo de errores son los que se denominan errores en tiempo de ejecucin. En un lenguaje interpretado, todos los errores son detectados en tiempo de ejecucin, tanto los debidos a errores sintcticos como los debidos a condiciones singulares producidas a la hora de ejecutar el programa. Desde un punto de vista prctico los lenguajes compilados resultan ms poderosos pero los interpretados resultan ms flexibles. El proceso de compilacin genera cdigos ejecutables fuertemente dependientes de la mquina a la que van dirigidos, con lo que se pierde la portabilidad del programa final aunque s que se puede en algunos casos tener portabilidad del cdigo fuente. Por ejemplo, si se ha desarrollado un programa en lenguaje C siguiendo el estndar ANSI, ese cdigo puede ser compilado por un compilador de C en Windows para generar la versin ejecutable en Windows del programa, y posteriormente repetir la compilacin en Unix con un compilador diferente para obtener la versin Unix. Por supuesto, la portabilidad del cdigo solo es posible si no se hace uso en el programa de aspectos particulares de una plataforma concreta. Con un lenguaje interpretado se facilita la portabilidad, ya que lo nico necesario es disponer en cada plataforma del intrprete adecuado. Esta es la razn por la cual muchos de los lenguajes para el desarrollo de aplicaciones web son interpretados, ya que en Internet la portabilidad es imprescindible. Ejemplos de lenguajes interpretados son JavaScript, VBScript y el propio PHP. Otra de las ventajas de los lenguajes interpretados puede ser la mayor facilidad para su aprendizaje y la simplificacin en el proceso de desarrollo de las aplicaciones. En el caso de los lenguajes interpretados para el desarrollo de aplicaciones web, no se requiere adems ningn tipo de herramienta de desarrollo como puedan ser compiladores; los intrpretes van integrados en los navegadores web en un caso y en los servidores web en otro. El cdigo fuente adems se

14

INTERNET Y LA PROGRAMACIN DE ORDENADORES

incrusta dentro del cdigo HTML con lo que incluso no sera necesario ningn tipo de editor especfico. Mencin especial merece el lenguaje Java: se dice de l que es un lenguaje que combina el poder de los lenguajes compilados y la flexibilidad de los interpretados. Cuando se quiere integrar en una pgina web un programa Java (applet Java), se necesita un proceso de compilacin que genera un cdigo binario a partir del cdigo fuente, pero este cdigo no es ejecutable directamente sino que se ejecuta por un intrprete que incorpora el navegador web que el usuario utilice al acceder a la pgina. Este pequeo artificio es el que permite conseguir la portabilidad del cdigo compilado Java. Los lenguajes interpretados que se utilizan en Internet para aumentar las prestaciones de las pginas web se suelen denominar lenguajes de script y a los programas con ellos desarrollados se les denomina scripts o guiones. Como ya se ha comentado, el lenguaje PHP pertenece a esta categora al igual que los otros dos lenguajes de script ms conocidos: JavaScript y VBScript.

1.4. PROGRAMACIN EN INTERNET


Como ya ha quedado de manifiesto, para poder hacer uso de toda la potencialidad del servicio web cada vez ms se requiere la utilizacin de lenguajes de programacin que complementen al lenguaje HTML. A la hora de decidir qu tecnologa o lenguaje concreto se puede utilizar para el desarrollo de una aplicacin web deben plantearse algunas preguntas cuya respuesta puede condicionar la eleccin final: Cundo se realizarn las acciones? Por ejemplo, se puede querer que el programa sea ejecutado al cargar la pgina que lo integra o, por el contrario, no ejecutar el programa hasta que se produzca determinado evento sobre la pgina (mover el ratn, pulsar un botn, situar el curso sobre algn elemento de la pgina,...). En este segundo caso se requiere un lenguaje que admita programacin guiada por eventos, y la eleccin de un lenguaje como JavaScript, por ejemplo, sera ms adecuada que la eleccin de PHP. Cul ser el formato del conjunto de ordenes? Se puede optar por generar programas de forma independiente que se integren en la pgina despus de un proceso de compilacin, tal como ocurre en el caso de Java, o por el contrario se puede desarrollar la aplicacin en base a scripts o guiones que, sin necesidad de compilacin, sean incrustados directamente entre el cdigo HTML, tal como se hace en PHP, JavaScript o VBScript.

15

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Quin ejecutar o interpretar las ordenes? Como se ha comentado, en el servicio web intervienen dos equipos, el servidor en el que est alojada la pgina y el cliente que recibe el cdigo HTML y genera la pgina en s. Cuando existe tambin un programa o script integrado en la pgina, la duda es cul de los dos equipos es el encargado de ejecutar las rdenes. En PHP, los programas son ejecutados por el servidor mientras que en JavaScript es el cliente el que los ejecuta.

1.4.1. PROGRAMACIN DEL LADO DEL CLIENTE VS PROGRAMACIN DEL LADO DEL SERVIDOR
La respuesta a la ltima pregunta planteada en la seccin anterior da pie a la clasificacin de las tecnologas de programacin en Internet en dos categoras: Programacin del lado del cliente: los programas residen junto a la pgina web en el servidor pero son transferidos al cliente para que este los ejecute. Java, JavaScript, VBScript son lenguajes de programacin del lado del cliente. Programacin del lado del servidor: los programas son ejecutados por el servidor y lo que se enva al cliente es la respuesta o resultado de dicha ejecucin. Lenguajes como PHP o Perl pertenecen a esta categora.

Figura 1.3 Diferencia entre la programacin del lado del servidor y la del lado del cliente

16

INTERNET Y LA PROGRAMACIN DE ORDENADORES

Cada una de estas estrategias tiene evidentemente sus ventajas y sus inconvenientes, en cualquier caso no son excluyentes, ya que en una misma pgina pueden incorporarse por ejemplo scripts en PHP para ser ejecutados por el servidor y scripts en JavaScript para ser ejecutados por el cliente. En definitiva, se trata de aprovechar las ventajas de cada tecnologa en el desarrollo de las aplicaciones web.
Programacin del lado del cliente Los programas residen en el servidor pero se ejecutan en el cliente Se descarga de trabajo a los servidores Programacin del lado del servidor Los programas residen y son ejecutados por el servidor El trabajo recae sobre los servidores pudiendo llegar a sobrecargarse Al cliente solo se les transfiere el resultado de la ejecucin del programa Una vez enviada al usuario la respuesta del programa, cualquier peticin adicional del cliente requiere una nueva conexin con el servidor y la ejecucin en l de un nuevo programa En los equipos de los clientes no se necesita ningn software especial, todo lo necesario debe estar instalado en el servidor Todos los clientes podrn visualizar correctamente la pgina El cdigo fuente permanece en el servidor, se conserva su privacidad y los clientes no tienen acceso a l La mayora de los servicios de alojamiento gratuito de pginas no admiten este tipo de programacin

La ejecucin del programa requiere una transmisin por la red del cdigo necesario para ello Las respuestas a las acciones de los usuarios sobre el programa pueden ser invocadas sin necesidad de realizar transmisiones por la red Para la correcta ejecucin del programa se requiere que el cliente tenga instalados programas o plug-ins adecuados Si en un cliente no est instalado alguno de los programas intrpretes o plug-ins, la pgina no se ejecutar correctamente Al transferirse el cdigo, el cliente tiene acceso a dicho cdigo y puede obtener a partir de l informacin que pueda resultar comprometida Se pueden integrar los programas en las pginas alojadas en cualquier servidor web

Tabla 1.1 Diferencias entre la programacin del lado del cliente y del lado del servidor

17

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

1.4.2. TECNOLOGAS DE PROGRAMACIN DEL LADO DEL CLIENTE


En esta seccin se presentan algunas de las tecnologas de programacin del lado del cliente ms conocidas y utilizadas. Se trata nicamente de conocer sus principales caractersticas para compararlas posteriormente con las del lenguaje PHP.

JavaScript
JavaScript es un lenguaje interpretado basado en guiones que son integrados directamente en el cdigo HTML. El cdigo es transferido al cliente para que este lo interprete al cargar la pgina. Con JavaScript no pueden crearse programas independientes. La primera versin de este lenguaje apareci con el navegador Netscape 2.0 en 1995, con el nombre original de LiveScript y soportando gran cantidad de las instrucciones que tiene en la actualidad. La versin JavaScript 1.1 se dise con la llegada de las versiones 3.0 de los navegadores e incorpor algunas funcionalidades nuevas como el tratamiento dinmico de imgenes y la creacin de arrays. Es esta versin la primera que se incorpora al explorador de Microsoft. En los navegadores 4.0 de Microsoft y Netscape se incorpor ya un intrprete para una nueva versin del lenguaje, el JavaScript 1.2. Con esta versin se inicia un proceso de diferenciacin en algunos aspectos de la implementacin en los dos navegadores, proceso que culminara con el nacimiento de JScript, nombre con el que Microsoft denomina a su versin de JavaScript. En la actualidad Microsoft ha desarrollado su JScript.net. Las principales caractersticas de este lenguaje son: Es un lenguaje interpretado. No necesita compilacin. Multiplataforma. Lenguaje de alto nivel. Admite programacin estructurada. Basado en objetos. Maneja la mayora de los eventos que se pueden producir sobre la pgina web. No se necesita ningn kit o entorno de desarrollo.

18

INTERNET Y LA PROGRAMACIN DE ORDENADORES

A diferencia de Java, JavaScript no dispone de elementos para crear interfaces de usuario propias para los programas y tiene que utilizar para ello los formularios de HTML a travs de los denominados manejadores de eventos.

Java
Java es un lenguaje de programacin clsico en cuanto a que requieren un proceso de compilacin. El cdigo compilado puede ser integrado en la pgina web para que sea ejecutado por el cliente. El nacimiento formal del lenguaje se sita en enero de 1996 con el lanzamiento por parte de la empresa creadora, Sun Microsystems, del JDK 1.0 (Java Development Kit). Este entorno de desarrollo Java puede obtenerse de forma totalmente gratuita a travs de Internet (http://www.javasoft.com) e incorpora los elementos bsicos necesarios para el desarrollo de aplicaciones Java. Con Java se pueden crear dos tipos de programas: Applets: programas que se integran en las pginas web y que, residiendo en el servidor, son ejecutados por el cliente. La ejecucin necesita de la interpretacin del cdigo compilado por el software cliente. Aplicaciones: programas autnomos que se pueden ejecutar en cualquier equipo. En este ltimo caso puede optarse por generar cdigo compilado similar al de los applets y que para su ejecucin necesita de un intrprete o cdigo compilado ejecutable directamente como en cualquier otro lenguaje de programacin.

En el caso de los applets, el cdigo fuente no se incrusta directamente en el documento HTML, sino que lo que se aade es un cdigo binario resultado de la compilacin, el denominado JBC (Java Byte Code). Esto permite proteger el cdigo fuente, aunque hasta cierto punto, ya que las particularidades de este cdigo compilado hacen que sea factible el proceso inverso, es decir, la decompilacin, recuperar el cdigo fuente a partir del compilado. En la propia Internet pueden encontrarse programas capaces de hacerlo. La razn de todo esto est en el hecho de que para conseguir la portabilidad de los programas el cdigo compilado es un cdigo que se encuentra a mitad de camino entre un cdigo fuente y un cdigo objeto fuertemente dependiente de una plataforma. Es por ello que se suele decir de Java que es un lenguaje que combina la flexibilidad de los lenguajes interpretados y el poder de los compilados.

19

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Por supuesto, Java es un lenguaje con unas altas prestaciones, mucho mayores que las de lenguajes interpretados. Algunas de sus caractersticas son: Es un lenguaje orientado a objeto. Admite programacin concurrente. Dispone de clases de objetos para la generacin de interfaces grficas de usuario. Tiene prestaciones multimedia. Resulta un lenguaje familiar, al tener una sintaxis similar al C++, aunque eliminando algunos de los problemas ms engorrosos del lenguaje C: el uso de punteros, la gestin de la memoria y el control de accesos a los elementos de arrays. Es un lenguaje simple, robusto y seguro. A travs de Internet se puede acceder a todo lo necesario para desarrollar applets Java.

VBScript
VBScript es, al igual que JavaScript, un lenguaje basado en guiones que permite integrar programas directamente en el cdigo HTML. Admite un doble uso, por un lado como lenguaje del lado del cliente, pero tambin como lenguaje del lado del servidor para la generacin de pginas ASP. Es un lenguaje desarrollado por Microsoft tomando como referente de sintaxis el VBA, Visual Basic para Aplicaciones. Por supuesto, no ofrece todas las funcionalidades de un entorno de desarrollo visual como Visual Basic, pero si se presenta como un herramienta poderosa y de fcil uso para generar pginas web interactivas.

1.4.3. TECNOLOGAS DE PROGRAMACIN DEL LADO DEL SERVIDOR


Al igual que se hizo en la seccin anterior, se presentan a continuacin algunas de las tecnologas de programacin del lado del servidor ms conocidas. Dentro de esta categora es en la que se sita el lenguaje PHP, que se estudiar con detalle en los prximos captulos.

20

INTERNET Y LA PROGRAMACIN DE ORDENADORES

Programacin CGI
CGI son las siglas de Common Gateway Interface (Interfaz de Pasarela Comn) y lo que define es un estndar para establecer la comunicacin entre un servidor web y un programa. Esta interfaz define una forma cmoda y simple de ejecutar programas que se encuentran en la mquina en la que se aloja el servidor, a travs de la definicin de una serie de reglas que deben cumplir tanto las aplicaciones como los servidores para hacer posible la ejecucin de los programas. Al tratarse de una interfaz, no existe ningn tipo de dependencia con el lenguaje de programacin empleado. Para desarrollar programas CGI se puede utilizar cualquier lenguaje. Los ms habituales son: C, C++, Fortran, Perl, Tcl, Visual Basic, AppleScript. Los lenguajes interpretados como Tcl y Perl, tienen mayor facilidad de mantenimiento y depuracin, presentan ventajas de seguridad, pero resultan ms lentos. Los lenguajes compilados (C, C++,...), por su parte, son mucho ms rpidos. En el caso de CGI la velocidad de ejecucin es importante, ya que habr que sumar el tiempo de ejecucin al tiempo de espera de red y a la velocidad de transmisin.

ASP: Pginas de Servidor Activas


ASP (Active Server Pages) es la tecnologa diseada por Microsoft para facilitar la creacin de sitios web con una mayor sencillez que la empleada en la programacin CGI. El principal inconveniente es la fuerte dependencia del entorno Microsoft, ya que requiere un servidor web de Microsoft, como puede ser el Internet Information Server (IIS) o el Personal Web Server (PWS). Para utilizar la tecnologa ASP sobre otros servidores, por ejemplo servidores Unix, se necesita un software intrprete (Chilisoft, Instant ASP). El ncleo de funcionamiento de ASP es una aplicacin ISAPI (Internet Server API). Una aplicacin ISAPI es una DLL de Windows que se ejecuta en el mismo espacio de direcciones que el servidor web y que puede soportar varias peticiones simultneas. ASP no es realmente un lenguaje como tal, el lenguaje usado en realidad para programar ASP es Visual Basic Script o Jscript (versin Microsoft de JavaScript).

Servlets y JSP: Pginas de Servidor Java


Los servlets y Java Server Pages (JSPs) son dos mtodos de creacin de pginas web dinmicas en servidor usando el lenguaje Java. Se trata de tecnologas desarrolladas por la empresa Sun Microsystems.

21

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Las JSP se diferencian de otras tecnologas del lado del servidor como los CGI o las ASP en dos aspectos principalmente: por un lado, los JSP y servlets se ejecutan en una mquina virtual Java, lo cual permite que, en principio, se puedan usar en cualquier tipo de ordenador, siempre que tenga instalado esa mquina virtual. Por otro lado, un programa JSP se compila a un programa en Java la primera vez que se invoca, y del programa en Java se crea una clase que se empieza a ejecutar en el servidor como un servlet. De esta manera los servlets no se ejecutan cada vez que se recibe una peticin, sino que persisten de una peticin a la siguiente, lo que permite realizar operaciones como la conexin a bases de datos o manejo de sesiones de una manera ms eficiente. Un JSP es una pgina web con etiquetas especiales y cdigo Java incrustado, mientras que un servlet es un programa que recibe peticiones y genera a partir de ellas una pgina web. En ambos casos se necesita un programa servidor que se encargue de recibir las peticiones, distribuirlas entre los servlets y realizar las tareas de gestin propias de un servidor web. Estos programas suelen llamarse contenedores de servlets o servlet engines, y, entre otros, podran citarse como ejemplos Resin, BEA Weblogic, JRun de Macromedia, Lutris Hendir, o, quizs el ms popular y conocido: Toncat.

ColdFusion
ColdFusion es una tecnologa desarrollada inicialmente por Allarie, que en la actualidad pertenece a Macromedia. Es una herramienta sencilla de aprender y bastante potente que funciona sobre la mayora de servidores web. Los scripts se desarrollan por medio de etiquetas al estilo HTML (ColdFusion en realidad se denomina Cold Fusion Markup Language -CFML-). Estas etiquetas se sitan dentro del documento HTML y son ejecutadas por el servidor, de forma que el cliente solo ve el resultado, no el cdigo. Bsicamente ColdFusion est formado por tres componentes: una aplicacin servidor, un lenguaje de marcacin (ColdFusion Markup Language, CFML) y un programa administrador. La aplicacin servidor es la encargada de leer e interpretar las instrucciones que le son pasadas a travs de pginas ColdFusion. Estas pginas se identifican por tener la extensin .cfm o .cfc y contienen etiquetas HTML y etiquetas especficas del lenguaje propio de ColdFusion: CFML. Las etiquetas del lenguaje CFML tienen una sintaxis similar a las de HTML y se distinguen del resto por tener nombres que siempre comienzan con cf. Adems de las etiquetas predefinidas, el programador puede crear nuevas etiquetas e incluso puede integrar cdigo en otros lenguajes como C, C++ o Java.

22

INTERNET Y LA PROGRAMACIN DE ORDENADORES

Las aplicaciones ColdFusion pueden interactuar con cualquier base de datos que soporte ODBC o JDBC.

PHP
PHP es un lenguaje interpretado del lado del servidor que surge dentro de la corriente denominada cdigo abierto (open source). Se caracteriza por su potencia, versatilidad, robustez y modularidad. Al igual que ocurre con tecnologas similares, los programas son integrados directamente dentro del cdigo HTML. En este libro se explicar en detalle la sintaxis y el funcionamiento de este lenguaje, de momento se realiza a continuacin una breve comparativa con las otras tecnologas del lado del servidor descritas previamente. Comparado con ASP, la principal ventaja de PHP es su carcter multiplataforma. Por otro lado, los programas en ASP resultan ms lentos y pesados, y tambin menos estables. En los entornos Microsoft la ventaja de ASP es que los servidores web de Microsoft soportan directamente ASP sin necesidad de ninguna instalacin adicional Sealar tambin la existencia de herramientas que permiten convertir programas desarrollados en ASP al lenguaje PHP, una de las ms conocidas es asp2php. Comparando el lenguaje PHP con el lenguaje Perl, utilizado habitualmente en la programacin CGI, puede decirse que PHP fue diseado para desarrollo de scripts orientados a web, mientras que Perl fue diseado para hacer muchas ms cosas y debido a esto, se hace muy complicado. La sintaxis de PHP es menos confusa y ms estricta, pero sin perder la flexibilidad. En comparacin con ColdFusion, PHP es ms rpido y eficiente para tareas complejas de programacin, adems PHP resulta ms estable y usa una menor cantidad de recursos. Por el contrario, ColdFusion posee un mejor gestor de errores, un buen motor de bsquedas, abstracciones de bases de datos y un gran nmero de funcionalidades para el procesamiento de fechas. Finalmente, ColdFusion no est disponible para todas las plataformas. En definitiva, PHP es uno de los lenguajes ms utilizados actualmente en el desarrollo de aplicaciones web y viene experimentado un constante crecimiento en su nivel de utilizacin en Internet. Este libro trata de humildemente contribuir a continuar con el proceso de difusin de esta tecnologa.

23

OPEN SOURCE Y SOFTWARE LIBRE


2.1. INTRODUCCIN
El actual entorno mundial est claramente caracterizado por el fenmeno de la 1 globalizacin , que puede entenderse como un efecto accin reaccin que ocurre a gran velocidad, casi de forma simultnea, por el cual los acontecimientos significativos que ocurren en una parte del planeta repercuten o hacen reaccionar casi inmediatamente al resto. Como rasgos caractersticos de este entorno globalizante podemos destacar, por un lado, la tendencia a la estandarizacin econmica, social, cultural y, como no, tecnolgica, siguiendo como modelo los patrones del bloque econmico ms fuerte, Estados Unidos. Y, por otro, el uso intensivo de las tecnologas de la informacin y las comunicaciones (TIC). En este sentido, el constante crecimiento del numero de actividades sociales y empresariales, que necesitan de las computadoras, y la incorporacin y presencia masiva de dispositivos digitales en cualquier actividad humana han aumentado la cantidad y

Las definiciones de globalizacin son mltiples, aqu interesa ms comprender su significado general que entrar en los matices de las distintas definiciones. No obstante, para una mayor profundidad sobre el concepto se recomienda consultar las siguientes obras Globalizacin: oportunidades y desafos. (Maesso Corral, 2003) y Los limites a la globalizacin (Noam Chomsky, 2002).

25

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

complejidad de los sistemas software, haciendo crecer por tanto la inversin y dependencia de dichos sistemas y en definitiva de sus creadores. Segmentos Hardware Software Servicios TI Telecomunicaciones Total 2003 Diciembre 140.129 61.017 114.938 292.287 608.371 2004 Noviembre 142.032 63.758 117.301 303.507 626.598 % Cto 03/04 1.35 4.5 2.05 3.83 2.99 Previsin 2005 147.351 67.854 122.272 316.941 654.418

Tabla 2.1 Facturacin del mercado de las TIC (en millones de euros) en Europa por segmentos. Elaboracin propia a partir de los datos de noviembre obtenidos en el Centro de Prediccin Econmica de la Universidad Autnoma de Madrid (CEPREDE) y el Observatorio de Tecnologas de la Informacin Europeo (EITO)

En el mbito informtico, que es el que interesa en este libro, este proceso de homogenizacin y dependencia queda claramente reflejado en el software y en especial en los sistemas operativos, donde las posibilidades de eleccin del tipo de sistema para el usuario no tcnico son muy reducidas, e incluso son los propios fabricantes y no las necesidades del usuario los que obligan a cambiar de una versin a otra en una aplicacin. Como ejemplo de lo anterior basta con preguntarse cuntos sistemas operativos conocemos, por qu tenemos instalado y utilizamos ese sistema operativo y no otro, y si fue esta nuestra la eleccin. Inicialmente la estandarizacin de aplicaciones informticas se ha visto propiciada por los avances en las TIC, especialmente por la red Internet y sus protocolos y servicios, que han eliminado las barreras fsicas y geogrficas permitiendo una sociedad global comunicada de forma colectiva e interactiva. Pero Internet, que crece y madura conforme aumenta su nmero de usuarios2, se acerca de forma pausada, a su filosofa inicial, convirtindose en un medio de comunicacin de informacin, conocimiento y experiencias plural y diverso, que se aleja de la estandarizacin y busca una mayor libertad favoreciendo el desarrollo de importantes avances. Uno de los acontecimientos ms fascinantes se ha producido en el mbito informtico y de desarrollo de
Las ltimas cifras registradas en agosto del 2004 por el Centro de Prediccin Econmica de la Universidad Autnoma de Madrid (CEPERDE) revelan que en el mundo existen ms de 797millones de internautas, lo que supone un incremento del 121% respecto al ao 2000, de los que ms de 14 millones de usuarios estn en Espaa, aproximadamente el 36 % de la poblacin del pas.
2

26

OPEN SOURCE Y SOFTWARE LIBRE

aplicaciones con la aparicin de la corriente denominada free software u open source, que merece, como se ver a continuacin, una especial atencin por cuanto supone una ruptura con los planteamientos tradicionales de la industria del software, dominados por el principio de beneficio econmico.

2.1.1. QU ES OPEN SOURCE?


A modo de aproximacin inicial se puede decir que el trmino open source hace referencia a la libre disponibilidad por parte del usuario de un software y de su cdigo fuente. El cdigo fuente est formado por lneas de instrucciones escritas en un determinado lenguaje de programacin que permiten desarrollar una aplicacin o software y que este ejecute las tareas para las que ha sido creado. Para los que se acercan al mundo de la informtica por primera vez o no dominan aspectos ms tcnicos podemos utilizar como smil del cdigo fuente la formula de elaboracin de un medicamento. La importancia de conocer el cdigo fuente no es trivial, pues quien conozca el cdigo, o frmula siguiendo con el ejemplo, y disponga de los elementos tcnicos y conocimientos necesarios podr generar por s mismo el producto final software o modificarlo segn sus necesidades. Evidentemente, toda organizacin empresarial con nimo de lucro dedicada al desarrollo de aplicaciones guarda y protege el cdigo fuente de los programas que desarrollan como el mayor de sus tesoros. Es importante aclarar que open source hace referencia a la libre disponibilidad en cuanto a utilizar, modificar y distribuir el software y su cdigo fuente y no al coste o precio de adquisicin. Por tanto, es posible encontrar software open source y software libre que no sea gratis, que presente un precio de adquisicin, que de haberlo es generalmente muy reducido. Conceptos muy diferentes son los trminos free software y Shareware. El primero, designa un software sin precio de adquisicin, gratuito, que el usuario en algunos casos, y segn lo que exprese la licencia del producto, podr copiar y distribuir, incluso acceder a su cdigo fuente o modificarlo. El segundo, Shareware, hace referencia a software o versiones de software que es posible utilizar de forma gratuita durante un periodo de tiempo, y una vez expirado este, para seguir utilizando el programa con todas sus funcionalidades es necesario abonar un precio y aceptar una licencia de uso. En realidad el software Shareware no constituye un tipo de software, ms bien responde a una estrategia promocional del tipo periodo de prueba gratuito y, en ningn caso permite acceso al cdigo fuente ni durante el periodo promocional ni despus del pago. Con este primer acercamiento al significado de open source, que obviamente no recoge de forma completa los planteamientos de la citada corriente, se pretende dar 27

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

un punto de partida para poder comprender los siguientes epgrafes en los que se analizar la evolucin cronolgica de este movimiento, su filosofa y caractersticas y la expansin espectacular que est teniendo en la actualidad.

2.2. BREVE RESEA CRONOLGICA


Para entender un fenmeno en su toda su magnitud no basta con tener una definicin del mismo (Yin, 20003), sino que es necesario tener en consideracin cmo y por qu se produce ese fenmeno, as como su evolucin en el tiempo. En este sentido, con la intencin de lograr una mayor comprensin de lo que representa la corriente open source, antes de dar una definicin y mostrar sus principales caractersticas, se realizar un breve repaso sobre su desarrollo cronolgico.

2.2.1. PRIMERA ETAPA, ANTECEDENTES


El precedente del open source est en los inicios de la informtica moderna. Entorno a los aos sesenta y primeras dcadas de los setenta, poca en la que la disponibilidad de equipos informticos era muy limitada, casi exclusiva de universidades y centros de investigacin financiados generalmente por los gobiernos. Adems, en este periodo las computadoras no disponan de un entorno tan amigable para el usuario como en la actualidad. No haba distincin entre desarrolladores de aplicaciones o informticos y usuarios pues eran en realidad la misma cosa, formando una comunidad reducida. En este periodo la mayora del software existente era compartido libremente entre los usuarios, desarrolladores, con el fin de mejorarlo y avanzar en el desarrollo y creacin de nuevos programas.

2.2.2. SEGUNDA ETAPA, DESARROLLO


A partir de los aos ochenta los avances en hardware con equipos ms potentes, pequeos y a menor coste que en periodos anteriores favorece la expansin intensiva de las computadoras a los puestos de trabajo y hogares. Todo esto produce un gran aumento de usuarios, cada vez menos tcnicos, que favorece el emergente negocio del desarrollo de aplicaciones, cada vez ms fciles de utilizar.
Yin R. (2000). Case study evaluations: a decade of progress? En: Evaluation models. Viewpoints on educational and human services evaluation. Boston. Kluwer Academic Publishers, 2000.
3

28

OPEN SOURCE Y SOFTWARE LIBRE

Ante esta situacin solo era cuestin de tiempo que el software libre desapareciera y se implantara el software comercial o Closed Source (cdigo fuente cerrado), que supone para el usuario adquirir nicamente el derecho a la utilizacin de las aplicaciones.
Es este contexto el que en 1984 inspir a Richard Stallman, miembro del staff del laboratorio de inteligencia artificial del Instituto de Tecnologa de Massachusetts (MIT), a renunciar a su puesto y dar inicio al proyecto GNU, acrnimo del ingls GNU is not Unix, con el propsito de crear una comunidad para compartir software de forma libre. Libre en cuanto a la posibilidad de ver su cdigo fuente, modificarlo y poder distribuirlo con o sin coste, pero siguiendo la distribucin esos mismos principios. Para conseguir ese objetivo, la primera tarea que se propuso fue desarrollar un sistema operativo completo tipo Unix4 que siguiera esos criterios de libertad.

En 1985 los componentes del proyecto GNU crearon la Fundacin para el Software Libre, free software Fundation (FSF), organizacin sin nimo de lucro creada para el fomento del software libre que pasa a ocuparse de tareas organizativas y de distribucin de este tipo de software tanto procedente del proyecto GNU como ajeno. Esta asociacin establece la definicin de free software, software libre, indicando que un software para tener esta calificacin debe cumplir con cuatro condiciones, denominadas las cuatro libertades: 1. Libertad para ejecutar el programa con cualquier propsito. 2. Libertad de acceso al cdigo fuente, permitiendo la modificacin del programa segn las necesidades del usuario. 3. Libertad para redistribuir copias, tanto gratis como por un canon. 4. Libertad para distribuir versiones modificadas del programa.

2.2.3. TERCERA ETAPA, EXPANSIN


La principal dificultad del proyecto GNU para el desarrollo de su sistema operativo completo era disponer de un ncleo o kernel libre, no comercial. Esto se soluciona cuando en 1991 Linus Trovalds desarroll un ncleo libre compatible con Unix que denomin Linux. Al combinar el sistema GNU con Linux se obtuvo un sistema operativo libre completo, GNU/LINUX.

La intencin de hacer el nuevo sistema compatible con Unix fue debida a que ...ese era el sistema operativo ms utilizado y por tanto el ser compatible con dicho sistema facilitara el trasvase de usuarios de uno a otro...... Stallman, 1999.

29

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

En 1993 Ian Murdock da lugar al proyecto Debian como una asociacin de personas, cerca de un millar de desarrolladores voluntarios dispersos por todo el mundo, que trabajan a travs de la Red y hacen causa comn para el desarrollo y distribucin de software de forma abierta en la lnea de Linux y GNU, dando lugar al sistema operativo que han denominado Debian GNU/Linux5. Un hecho crucial para toda la corriente es la creacin por parte de esta asociacin del denominado Contrato social de Debian con la comunidad de software libre. El primer borrador de este documento fue elaborado por Bruce Parens en 1997 y en l se recogen las llamadas directrices de software libre de Debian, formadas por diez puntos en los que se recoge la filosofa a seguir por el proyecto Debian y que servirn de base a la futura definicin de open source. Esta definicin se produce en febrero de 1998 cuando dentro de la comunidad de software libre un grupo, formado entre otros por Raymond, E; Parens, B; Peterson, C, crea la open source Initiative (OSI) que elabora y promueve el uso de la nomenclatura open source. La OSI, tomando como base las directrices del software libre de Debian y eliminando las referencias especficas a dicha asociacin, establece la definicin de open source que se rige por los siguientes puntos que a continuacin se muestran de forma resumida: 1. Libre redistribucin. 2. Acceso al cdigo fuente. 3. Trabajos derivados. 4. Integridad del cdigo fuente del autor. 5. No discriminacin contra personas y grupos. 6. No discriminacin contra campos de trabajo. 7. Distribucin de licencia. 8. La licencia no debe ser especfica a un producto. 9. La licencia no debe restringir otro tipo de software. 10. La licencia debe ser tecnolgicamente neutral. Como conclusin a este epgrafe se recoge en la Tabla 2.2 un resumen de los acontecimientos ms importantes dentro del movimiento software libre y open source.
Si bien en la mayora de ocasiones la utilizacin de este sistema operativo suele designarse solo como Linux, la expresin correcta sera GNU/Linux. Linux por si solo es un ncleo y no un sistema operativo completo.
5

30

OPEN SOURCE Y SOFTWARE LIBRE

1984 1985 1991 1991 1993 1997 1998 1998

Richard Stallman crea el proyecto GNU. Los componentes del proyecto GNU crean la FSF (free software Foundation). Linux Trovalds desarrolla el Kernel Linux. Primer sistema operativo libre Linux, combinacin de GNU/LINUX. Ian Murdock crea el proyecto Debian. Debian establece el Contrato social Debian con la comunidad del Software libre. Un grupo de la comunidad Software Libre crea la OSI (open source Initiative). Bruce Parents miembro de OSI establece la definicin de open source.

Tabla 2.2 Acontecimientos ms importantes dentro del movimiento software libre y open source

2.3. LA CORRIENTE OPEN SOURCE Y SOFTWARE LIBRE FILOSOFA Y CARACTERISTICAS


Antes de seguir avanzando en el significado de la denominada corriente open source es necesario, tanto desde el punto de vista acadmico o cientfico como del educativo, hacer una distincin entre dos vocablos que en la escasa literatura existente aparecen confusos, unas veces utilizados como sinnimos y otras como trminos distintos para hacer referencia a una misma realidad. Los trminos free software, que en castellano puede traducirse por software libre, donde libre no se refiere al precio sino a la libertad de uso y disponibilidad de una aplicacin y de su cdigo fuente, y open source que tiene por expresin homnima cdigo fuente abierto, son dos formas distintas utilizadas para designar no solo un tipo particular de software y licencia sino un modo de pensar, una filosofa distinta en lo referido a produccin, distribucin y venta de software.

31

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Si bien es cierto que estos trminos no son exactamente idnticos ya que cada uno de ellos tiene su origen en una corriente distinta de un mismo movimiento (Stallman, 19996), no es menos cierto que son ms las coincidencias que los unen que las diferencias, siendo las propias tendencias las que intentan hacer prevalecer los matices de su concepto sobre el otro.

GNU y open source dos corrientes de un mismo movimiento Son numerosos los artculos que circulan por la Red hablando de enfrentamiento entre las dos corrientes, pero en honor a la verdad y acudiendo a la informacin que las propias organizaciones FSF y OSI ofrecen, dicho enfrentamiento no existe, ms bien todo lo contrario, colaboran y participan en distintos proyectos y eventos, aunque siempre dejando claro que no son organizaciones idnticas. Sin entrar en profundidades filosficas, las dos corrientes tienen en comn un aspecto fundamental, la obligacin de que su software permita acceso al cdigo fuente, es decir, que sus aplicaciones sean de cdigo abierto. Su punto clave de distensin se encuentra en la posicin diferente que mantienen respecto de la distribucin del cdigo fuente y de los programas que de l pueden derivarse, puesto que la FSF establece como condicin obligatoria para considerar un software como libre que dicha aplicacin, su cdigo fuente y las aplicaciones que de l se deriven permanezcan siempre libres, utilizando para ello unas licencias de software especiales que se estudiarn en el epgrafe siguiente. Por el contrario, la OSI no establece restricciones y permite que un software con cdigo abierto sea modificado y posteriormente cerrado. De hecho, a tenor de lo anterior, todo software libre admitido por la FSF estara admitido por la OSI como software open source, sin embargo, no todo el software open source de la OSI es considerado libre por la FSF. No se entrar a juzgar cul de los dos vocablos es el ms idneo para designar en sentido amplio a todo el movimiento. Pero por ser necesario en aras de la claridad utilizar uno de los dos, se usar el trmino open source puesto que, como se ha
6

Stallman, R; Raymond, E. S; Bruce. P; O'Reilly.T et al.: open sources: Voices from the open source Revolution. Edited by Chris DiBona, Sam Ockman, Mark Stone. (1999).

32

OPEN SOURCE Y SOFTWARE LIBRE

visto, engloba tanto al software open source como al software libre de la FSF y su uso es ms extendido y reconocido en los foros internacionales. Como ejemplo de la utilizacin y reconocimiento del termino open source se pueden citar los siguientes acontecimientos recientes: La Unin Europea ha puesto en funcionamiento el 15 de diciembre del ao 2003 el open source Observatory dedicado al estudio del fenmeno open source en el mbito de la Unin Europea. Bajo el ttulo open source World Conference se ha celebrado en Mlaga los das 18, 19 y 20 de febrero del ao 2004 un congreso7 internacional para el anlisis de la situacin mundial del software considerado open source.

Open source no es solo una definicin de un tipo de software sino que representa todo un movimiento, con una filosofa y formas de trabajar distintas que implican unas repercusiones tecnolgicas, sociales y econmicas que requieren de un anlisis detallado que se realizar a continuacin. Open source busca dar la libertad total a los usuarios en la utilizacin del software, lo que implica la necesidad de poner a total disposicin de estos el cdigo fuente que en la mayora de las ocasiones adems de ser accesible puede ser copiado, modificado y redistribuido sin restricciones. Esta filosofa cargada de libertad y apertura no puede crecer en los tradicionales entornos cerrados y requiere la bsqueda y definicin de nuevos espacios abiertos y colaborativos, que dan lugar a las denominadas comunidades. Una comunidad es una agrupacin de personas que con independencia de su perfil econmico, social, cultural y geogrfico presentan un inters comn y de forma voluntaria se incorporan a un grupo, inicialmente pequeo, que crece en torno a un mismo inters hasta crear una comunidad organizada. Este fenmeno social de agrupacin voluntaria de personas, generalmente de forma virtual, en torno al desarrollo de software open source constituye el motor de todo el movimiento. Motor social que se ha visto favorecido en su desarrollo por la aparicin y uso intensivo de Internet, que acta como espacio fsico en el que estas comunidades se instalan y comunican y como catalizador del movimiento open source. Es por ello que se reconoce la existencia de una estrecha vinculacin entre Internet y el open source, pues sin una red libre del tipo de Internet sera imposible el desarrollo de esta tendencia, y sin esta no se habran desarrollado numerosos elementos que contribuyen al mantenimiento y crecimiento de la Red.
Congreso que pese al ttulo open source cont con la presencia de prestigiosos representantes de ambas corrientes, free software y open source.
7

33

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

El movimiento open source tiene importantes consecuencias econmicas, relacionadas con las sociales, que repercuten favorablemente en los usuarios. En primer lugar, altera la forma tradicional de produccin de software, puesto que no hay una organizacin empresarial con finalidad lucrativa propietaria del software que se desarrolle, ni se paga una contraprestacin econmica a los desarrolladores. El modelo de produccin del movimiento open source se basa en la comunidad, formada por desarrolladores y usuarios cuya finalidad principal es generar y disponer de un software de calidad, ocupando el lucro una posicin marginal, lo que permite que el precio del software generado sea bajo o nulo. Un segundo punto a considerar es que el open source supone una anomala en el funcionamiento del mercado, debido a que las comunidades, salvo excepciones, no pueden ser compradas o absorbidas como si de una empresa se tratase; incluso en el caso de que una comunidad fuera eliminada, segn el tipo de licencia que esta hubiera incorporado en sus programas, estos y los posteriores desarrollos que se hicieran sobre los mismos seguiran siendo igual de libres. Por ltimo, open source ha supuesto una apertura del mercado, generando competencia y reduciendo los efectos negativos de las situaciones prximas al monopolio, obligando a las empresas a ser ms competitivas, lo que se traduce en ofertar mejores productos a menores precios. La tendencia monopolstica que viene presentando el sector tecnolgico de desarrollo de software en el que unas pocas compaas controlan los productos existentes en el mercado ha generado un retroceso en la ingeniera del software debido a: El desarrollo de software no se basa en optimizar este, sino en los adelantos y mayores requerimientos de hardware. La aparicin de nuevas versiones y mejoras de software se rigen por criterios econmicos y no tecnolgicos, y generalmente se producen de forma dilatada en el tiempo para sacar el mayor rendimiento econmico a cada versin.

La forma de trabajo de open source, con un amplio nmero de desarrolladores y usuarios revisando y testando los productos continuamente, favorece que los avances y mejoras sean rpidas y regidas por criterios de calidad tecnolgica. Los desarrolladores-usuarios pueden colaborar en distintas comunidades y estas aliarse entre s para determinados proyectos, que generan colaboraciones y sinergias desinteresadas econmicamente, difciles de encontrar en el entorno

34

OPEN SOURCE Y SOFTWARE LIBRE

empresarial, y que repercuten en diversidad de enfoques ante un mismo problema tecnolgico. Por ltimo, una cuestin fundamental en el open source es que la aparicin de nuevos productos deriva de los intereses de los usuariosdesarrolladores, que son quienes dirigen la comunidad.

2.4. LICENCIAS
La comunidad open source y software libre se basan en la bsqueda de la libertad duradera y permanente del software, pero en una libertad siempre conforme al derecho y la jurisprudencia y nunca sustentada en la violacin de las normas legales. Es precisamente la normativa jurdica la que permite y ampara que el software se mantenga libre frente a intentos de apropiacin por terceros. Esta libertad se consigue dotando al software de los correspondientes derechos de autor y licencias. La licencia, en un lenguaje coloquial, puede definirse como la forma en la que el autor de una obra, en este caso software, permite el uso y distribucin de su creacin por terceras personas de la manera que l considera ms oportuna, siendo por tanto responsabilidad del autor incluir la licencia que especifique de qu forma puede ser utilizado un programa. La cuestin de las licencias es uno de los temas ms complejos de cuantos rodean al open source, y ello es debido tanto a la dificultad propia del mbito jurdico que supone redactar una licencia sin ambigedades ni contradicciones, que no entre en conflicto con la ley y sobre todo que sea sostenible ante los tribunales en caso de litigio; como a la gran variedad de licencias existentes. Es prctica habitual y recomendada8 entre los desarrolladores de software libre a la hora de crear una licencia para el software desarrollado, tomar como base la licencia libre GPL (General Public License), que posteriormente se analizar, y a partir de ella si no se est de acuerdo en algn punto modificarlo hasta lograr una licencia a medida. Buena muestra de lo anterior es la Tabla 2.3, que recoge algunas de las licencias ms habituales. Para simplificar, el anlisis y tratamiento de las licencias de software pueden clasificar estas segn su pertenencia a uno de estos tres grupos:
8

Licencias propietarias. Licencias libres. Licencias semilibres.

Esta recomendacin se debe a la mencionada complejidad que entraa el desarrollar una licencia conforme al derecho.

35

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Academic Free License Apache Software License Apple Public Source License Artistic license Attribution Assurance Licenses BSD license Common Public License GNU General Public License (GPL) GNU Library or "Lesser" General Public License (LGPL) IBM Public License Intel open source License Jabber open source License MIT license
Tabla 2.3 Licencias principales open source y Software Libre

2.4.1. LICENCIAS PROPIETARIAS


Son todas aquellas licencias que acompaan al software que no cumple los requisitos para ser considerado libre o de cdigo abierto por la FSF y la OSI, y se corresponde con la mayora del software comercial. Un ejemplo caracterstico es la licencia de Microsoft. Pese a que el anlisis de estas licencias no es el objetivo central de este apartado, se recogen a continuacin una serie de rasgos distintivos de las licencias propietarias a fin de que el lector pueda con posterioridad comparar con los otros tipos de licencias. As, son caractersticas genricas de las licencias propietarias: La aceptacin a priori de la licencia, es decir, sin dar la posibilidad a utilizacin y evaluacin del producto. 36

OPEN SOURCE Y SOFTWARE LIBRE

Prohibicin de realizar copias de la aplicacin. Con ciertas reservas son admitidas la realizacin de copias de los programas informticos para uso privado con fines de seguridad, las llamadas copias de seguridad9. Prohibicin de realizar y distribuir modificaciones de la aplicacin. Cada licencia permite utilizar el producto en un solo equipo informtico. Un ejemplo aclaratorio de esta clusula consiste en que un usuario que adquiere una licencia de una aplicacin si tiene dos equipos informticos solo podr utilizar esa licencia en uno de ellos.

2.4.2. LICENCIAS LIBRES


Las licencias libres son el medio legal que tiene la corriente open source y software libre de garantizar que un software desarrollado como libre se mantenga como tal en el tiempo. La variedad de licencias libres, como se ha comentado, es muy amplia, si bien la base de la gran mayora de ellas est en la primera licencia libre que se cre: la GPL10 (General Public License) desarrollada por la FSF (free software Foundation) que recoge unas condiciones de distribucin que impiden que el software libre se transforme en software propietario mediante la denominada clusula Copyleft. El trmino copyleft11 tiene por objetivo preservar el carcter libre de un programa, prohibiendo que del mismo se obtenga otro no libre o que se redistribuya con restricciones adicionales. Su principal requerimiento es, en palabras de Stallman, cualquier cosa agregada o combinada con un programa bajo copyleft debe ser tal que la versin combinada total sea tambin libre y bajo copyleft. Algunas de las licencias libres ms utilizadas son: GPL, ya mencionada, y la GPL-2 segunda versin que respeta el ncleo central de la licencia inicial, la clusula Copyleft.

As queda regulado en el artculo 25.3 de la Ley de Propiedad Intelectual RDL 1/1996 de 12 de abril. 10 La figura legal ms prxima en Espaa sera la llamada obra colectiva. regulada en los artculos 8 y 97 de la Ley de Propiedad Intelectual, Real Decreto Legislativo 1/1996 de 12 de abril. 11 Copyleft no es lo contrario de Copyright pues la clusula Copyleft la impone el autor del programa original en uso de sus facultades de copyright.

37

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

FDL (Free Document License), licencia que recoge las mismas condiciones que la GPL pero adaptada al tema de la documentacin, manuales y textos derivados del software libre. LGPL (Lesser General Public License), que consiste en una modificacin de la GPL con un carcter menos restrictivo al permitir la creacin de libreras abiertas que puedan incorporarse tanto a programas libres como propietarios sin obligar a estos ltimos a cambiar de licencia.

Las caractersticas genricas de este tipo de licencias con respecto a las licencias de software propietario son: Posibilidad de instalar el software en tantas mquinas como se quiera. Aceptacin de la licencia a posteriori, utilizada una aplicacin el usuario decide si quiere redistribuirla, siguiendo la licencia inicial y, por tanto, acatndola. Posibilidad de hacer tantas copias como se quiera. No restriccin en la distribucin, incluso mediante venta12.

No obstante, hay que destacar que es en el mbito de las licencias donde mejor queda reflejada la distincin entre las dos corrientes, open source y software libre, puesto que la OSI admite licencias, como la BSD (Berkeley Systmen Distribution), que aaden determinadas restricciones a los trminos de distribucin de originales y de redistribucin de programas derivados, al eliminar la obligatoriedad de mantener el software como libre suprimiendo la clusula Copyleft. La licencia BSD tiene como principal caracterstica permitir que un programa libre pueda ser modificado obtenindose de l un programa derivado que se cierra, deja de ser libre su cdigo fuente, cambiando la licencia.

2.4.3. LICENCIAS SEMILIBRES


Un caso especial que refleja lo que son las denominadas licencias semilibres ha sido la licencia QPL referida al uso de las libreras grficas QT, caracterizadas por requerir licencia y pago si se van a utilizar para desarrollos comerciales y ajustndose a la GPL en los dems casos. Por tanto, no es propietaria en cuanto a
12

Siguiendo los principios de libre mercado la oferta y la demanda mantendrn un coste bajo o nulo, puesto que si los vendedores obtienen un margen de beneficios elevado entrarn nuevos vendedores en el mercado y la competencia har que los precios disminuyan

38

OPEN SOURCE Y SOFTWARE LIBRE

que da libre acceso al cdigo fuente, siendo posible modificar y distribuir el programa, pero no es libre en los trminos de la FSF al ser necesario pagar licencia cuando se use en proyectos comerciales. Para finalizar este apartado se identificarn las licencias a las que estn sujetas las aplicaciones open source que se van a utilizar y desarrollar en los captulos siguientes: PHP, que es uno de los lenguajes de programacin ms utilizados por la comunidad open source adopta su propia licencia, la PHP License 3.0 que puede ser consultada integramente en (www.php.net/license/3_0.txt) licencia que tomando como base la licencia BSD presenta una gran libertad en su uso y redistribucin con las nicas limitaciones que pueden resumirse en: Indicar en las redistribuciones la nota de copyright y condiciones de la licencia original. No utilizar en los programas derivados el nombre de PHP, ni como nombre ni con fines publicitarios sin permiso de PHP Group.

MySQL, considerada la base de datos por excelencia del open source, ha generado recientemente un pequeo sobresalto entre la comunidad de cdigo abierto, pues de su licencia inicial, la licencia LGPL que permite que sus libreras sean utilizadas por programas de cdigo abierto y no abierto, ha pasado en la versin MySQL 4 a la licencia GPL (www.mysql.com/products/licensing.html), que obliga a que todo cdigo que quiera utilizar las librerias oficiales de MySQL deba ser GPL, lo que supona romper la compatibilidad con PHP regida por una licencia no GPL. Finalmente MySQL AB, compaa propietaria de MySQL, ante las repercusiones que poda tener esta medida ha publicado una excepcin13 a la licencia GPL de MySQL que permite incluir las libreras en otros proyectos de cdigo abierto que usen licencia distinta a GPL. Esto supone que permitir que las libreras de acceso MySQL sean incluidas en PHP 5 como suceda hasta ahora en PHP 4.

13

La publicacin se ha realizado el 12 de marzo del 2004 y puede ser consultada ntegramente en la siguiente direccin www.mysql.com/products/foss-exception.html

39

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

2.5. SITUACIN ACTUAL DEL SOFTWARE OPEN SOURCE


La historia universal est llena de ejemplos en distintas ramas y campos del saber, desde los epicreos en filosofa hasta los planteamientos del comunismo radical en economa, de movimientos que por sus propios planteamientos utpicos fueron desapareciendo progresivamente. Pero este no parece ser el caso de la corriente open source si se analiza la evolucin de los datos y cifras relativas al uso y aplicacin del software perteneciente a dicho movimiento y a las comunidades y proyectos que surgen dentro del mismo. En el mbito general, del software open source se conoce principalmente su sistema operativo ms extendido, Linux (GNU/Linux), pero que no se conozcan otro tipo de aplicaciones no quiere decir que no existan, sino que simplemente por ser recientes en comparacin con la mayora de aplicaciones cerradas o propietarias existentes no han adquirido todava popularidad entre los usuarios. Esto es lgico, pues no se puede pensar en un cambio radical de un tipo de aplicaciones a otro sino en un cambio progresivo, fruto en primer lugar del conocimiento de las alternativas existentes y en segundo lugar de la comparacin entre las mismas.

2.5.1. SOFTWARE OPEN SOURCE, APLICACIONES PARA TODO


Los movimientos de open source y software libre tienen como finalidad ltima evitar la dependencia del software cerrado y para ello buscan dar una cobertura total a las necesidades de los usuarios mediante software libre. Esto supone desarrollar todo tipo de software no solo de base o sistema14, sistemas operativos, sino tambin de aplicacin como procesadores de texto, hojas de clculo, compresores, aplicaciones multimedia y herramientas de desarrollo web.

14

El software de infraestructura, tambin llamado de base o de sistema, es aquel conjunto de programas que tienen como misin facilitar el uso del ordenador por parte de los usuarios. Entre sus funciones estn comunicar la computadora con sus perifricos, asignndolos y administrndolos y actuar como intermediario entre el hardware y el software de aplicacin. Este tipo de software suele dividirse en sistema operativo y programas de utilidades.

40

OPEN SOURCE Y SOFTWARE LIBRE

Software open source de sistema


En primer lugar hay que recordar que el software de sistema hace referencia principalmente al sistema operativo y matizar que este est formado por dos partes, un kernel o ncleo y a un conjunto de utilidades y programas bsicos que unidos al ncleo forman un entorno completo. Existen distintos sistemas operativos open source a parte de Linux como FreeBSD (www.freebsd.org), caracterizado por proporcionar servicios de red robustos con una excelente gestin de memoria y un alto rendimiento en los accesos a disco y libreras compartidas que reducen el tamao de los programas, OpenBSD (www.openbsd.org) sistema operativo que concentra sus esfuerzos en la seguridad y la portabilidad, GNU/HURD (http://hurd.es.gnu.org), novedoso sistema basado en un conjunto de servidores, que se ejecutan sobre un microkernel formando la parte del sistema operativo que sustituye al ncleo tradicional. Pero como ya se ha comentado en apartados anteriores el sistema operativo open source por excelencia es el que generalmente se denomina como LINUX, basado en el ncleo o kernel Linux ms las libreras y utilidades GNU. En la actualidad son numerosas las variantes de distribuciones, comerciales y no comerciales, de sistemas operativos basados en Linux (GNU/Linux) pero con distintas utilidades y complementos alcanzando un elevado grado de especializacin. A continuacin se recogen las distribuciones ms destacadas: Comerciales RedHat (www.redhat.es), es la distribucin Linux ms extendida, est orientada principalmente a empresas y acompaa sus distribuciones con atencin y soporte al usuario junto con una amplia documentacin. Mandrake, (www.mandrakelinux.com), basada inicialmente en Redhat, pero con una orientacin al usuario medio. Es sencilla de instalar y consta de asistentes y ayudas visualmente atractivas. United Linux (www.unitedlinux.com), distribucin fruto de la colaboracin de cuatro empresas Conectiva S.A., SCO Group, SuSElinux AG y Turbolinux, Inc. que tienen por objetivo el desarrollo de un sistema operativo Linux estandarizado, que acte como distribucin base a partir de la cual cada empresa aada y comercialice las utilidades y mejoras propias.

No comerciales Debian (www.debian.org), Debian GNU/Linux es junto con Redhat la distribucin de uso ms extendido. Desde el punto de vista tcnico sus

41

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

controles son muy rigurosos y es considerada la distribucin Linux ms estable. Las aplicaciones tienen su propio formato .deb y un cmodo instalador apt. La distribucin completa consta de ms de 8.000 paquetes con utilidades y aplicaciones de todo tipo: programas matemticos, grabadores de CD, editores de imgenes, etc. Desde su origen es una distribucin creada y mantenida por los usuarios, su licencia es GPL y es una distribucin apoyada pblicamente por la FSF y el proyecto GNU. LinEx (www.linex.org), distribucin gratuita, incluido el soporte y atencin al usuario, desarrollada y promovida por la administracin autonmica de Extremadura. Su desarrollo se basa en la distribucin GNU/Debian de la que hereda sus ventajas, con una gran variedad de software que permite cubrir todas las necesidades de un usuario medio con software libre, e intenta eliminar algunos de sus inconvenientes, facilitando al mximo la instalacin15. Guadalinex (www.guadalinex.org), distribucin gratuita desarrollada por la administracin autonmica de Andaluca fruto de la colaboracin establecida con la junta de Extremadura destinada a dar cumplimiento al Decreto 72/2003, en el que la Junta de Andaluca opta por el software libre como instrumento para el impulso de la Sociedad del Conocimiento en Andaluca. Guadalinex se desarrolla a partir de Linex de forma que LinEx y Guadalinex ofrecen sus funcionalidades con las mismas aplicaciones mantenidas en un mismo repositorio y por un nico equipo de control de calidad, diferencindose en los programas y contenidos que sean de inters solo en una de las dos comunidades. Knoppix, distribucin GNU/Linux alemana totalmente gratuita y basada en Debian que presenta como ventaja el no necesitar instalacin, puesto que permite arrancar desde el CD que puede ser descargado desde Internet (www.cylnux.org) y Slackware (www.eslack.org). Es una de las ms antiguas y conocidas distribuciones GNU/Linux gratuitas que destacan por su facilidad de instalacin y estabilidad.

Software open source de aplicacin


El software de aplicacin fue en un principio el gran olvidado de los desarrolladores open source, centrados casi de forma exclusiva en la bsqueda de sistemas operativos libres. En la actualidad, superado ese primer estadio de crear una base libre, si bien las comunidades siguen trabajando en el desarrollo y mejora de los sistemas operativos, es el mbito del software de aplicacin el que est
15

La distribucin Linex ha sido reconocida dentro del apartado Linux, con el premio a la mejor distribucin de 2003 por la empresa Softonic

42

OPEN SOURCE Y SOFTWARE LIBRE

despertando un gran inters entre la comunidad open source que se ha lanzado a la bsqueda de aplicaciones libres con la calidad necesaria para sustituir a las comerciales. La oferta de software open source de aplicacin es amplia y abarca desde suites ofimticas y aplicaciones de gestin empresarial hasta gestores de correo y aplicaciones multimedia. Establecer una enumeracin de todas las aplicaciones existentes sera complicado tanto por el nmero como por la poca calidad de muchas de ellas que han comenzado a desarrollarse recientemente y requerirn un tiempo de maduracin; sin embargo, s se podra indicar dentro de cada tipo aplicaciones ya contrastadas que, por supuesto, siguen mejorndose. As, dentro de la ofimtica destaca el paquete OpenOffice (www.openoffice.org), suite ofimtica gratis y compatible con distintos sistemas operativos y diferentes arquitecturas. Est compuesto por hoja de clculo, procesador de texto, editor de frmulas, editor de presentaciones, etc., por tanto tiene todas las funcionalidades de Microsoft Office, con el que es totalmente compatible y adems incorpora otras propias como la posibilidad de exportar documentos de texto a otros formatos como Pdf, Flash, XML, etc. En el desarrollo de software de gestin empresarial los avances hechos pblicos son menores que en el resto de actividades, posiblemente por el recelo y desconfianza que todava muestra el mbito empresarial hacia herramientas que son consideradas de dominio pblico pero, que analizando la situacin real con detenimiento, son prcticamente igual de accesibles para la competencia que los productos licenciados de pago, con la ventaja de un menor coste o incluso ser gratuitas. Hoy en da no tiene sentido pensar que una empresa es la nica que utiliza en exclusiva una aplicacin, salvo determinadas aplicaciones realizadas a medida, es ms, en el mundo empresarial la dificultad no est en el acceso a la tecnologa o a un programa concreto, sino en sacar el mximo rendimiento de su uso.

Algunas aplicaciones empresariales que podran citarse son: FacturLinEx y ContaLinEx (www.gnulinex.net), herramientas de gestin liberadas y de acceso gratuito desarrolladas y cedidas por el gobierno de Extremadura. Fisterra (www.fisterra.org), herramienta ERP (Enterprise Resource Planning), que naci como aplicacin empresarial a medida, de pago y con cdigo cerrado y posteriormente se liber su cdigo bajo licencia GPL, ofrecindose de forma gratuita.

43

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

FacturaLUX (www.facturalux.org), que pretende ser un software ERP creado con software de cdigo abierto que permita la gestin integral de la empresa.

En cuanto a gestores de correo, como alternativas al omnipresente Microsoft Outlook, se tienen varias opciones, las ms reconocidas Evolution y Mozilla Thunderbird, anteriormente conocido como Mozilla mail, que es el cliente de correo del proyecto Mozilla. (www.mozilla.org). Por ltimo, en lo que se refiere a las aplicaciones multimedia, verdadera revolucin del software, que permiten entre otras cosas ver y escuchar audio y video, tratamiento de imgenes, etc. tambin existen aplicaciones abiertas capaces de hacer sombra a los productos de cdigo cerrado. Como principales ejemplos, en la Tabla 2.4 se recoge para cada software de cdigo cerrado un posible homlogo open source.
Cerrado MSN Messenger MSN Netmeeting WinAmp Winzip Windows Media Player Photoshop Acrobat Reader ACDSEE Abierto AMSN GnomeMeeting XmmS Gzip, zip Mplayer, Xine Gimp Gpdf GThumb Direccin http://amsn.sourceforge.net/ www.gnomemeeting.org www.xmms.org www.gnu.org/software/gzip/gzip.html www.mplayerhg.hu www.gimp.org www.purl.org/net/gpdf http://gthumb.sourceforge.net

Tabla 2.4 Aplicaciones open source

Los ltimos proyectos open source que mayor inters han despertado entre la comunidad son KDE y Gnome, orientados a dotar al usuario de un escritorio intuitivo y amigable desarrollado con software totalmente libre: KDE, (The K Desktop Enviroment www.kde.org), es el entorno grfico desarrollado en C++ que ha constituido el escritorio tradicional en los sistemas Unix. Este desarrollo ha pasado por dos etapas muy distintas. Una inicial, desde los comienzos del proyecto, en octubre de 1996, hasta octubre de 2000 con licencia no libre en sus libreras QT, lo que gener el rechazo por parte de la comunidad open source, y la actual, a partir de octubre del 2000, con la versin KDE 2.0 en la que todo el desarrollo es software open source bajo licencia GPL. Gnome, (Gnu Network Object Model Environment www.gnome.org), surge como proyecto liderado por Miguel de Icaza y Federico Mena dentro de GNU

44

OPEN SOURCE Y SOFTWARE LIBRE

en respuesta al desarrollo no libre de KDE con el objetivo de dotar al software GNU de un escritorio libre. El proyecto est muy evolucionado y en realidad no es solo un escritorio puesto que integra distintas aplicaciones ofimticas. Recientemente la empresa Novell ha anunciado que dos de sus divisiones Ximian y SuSE, trabajarn juntas para crear un escritorio Linux comn, con las mejores caractersticas de GNOME y KDE .

Herramientas de desarrollo Web


Es sin duda en el rea del desarrollo web donde la corriente open source ha alcanzado un protagonismo indiscutible con alternativas para todos los elementos que intervienen en dicho desarrollo y aplicaciones que cubren todas las fases del desarrollo web: Servidores web. Bases de datos. Lenguajes de programacin Herramientas de desarrollo o gestores de contenido. De tal forma que cualquier desarrollo web puede llevarse a cabo por completo mediante la utilizacin de herramientas open source. Los servidores web son programas que instalados en equipos conectados a una red, principalmente Internet, permiten que dichos equipos puedan recibir peticiones http de otros ordenadores y satisfacerlas sirviendo pginas web. Algunos de los servidores web open source ms conocidos son: Apache, AOL Server, Roxen y Thttpd, de los cuales el servidor Apache es el que tiene mayor presencia en Internet, tal como puede apreciarse en la Tabla 2.5. Servidores
Apache Microsoft-IIS Netscape-Enterprise Zeus Rapidsite Tigershark Thttpd OTROS TOTAL Nmero 38.028.642 11.923.178 1.743.421 739.006 369.532 246.962 221.446 1.266.961 54.539.148 Porcentaje 69,73% 21,86% 3,20% 1,36% 0,68% 0,45% 0,41% 2,32% 100%

Tabla 2.5 Servidores activos en Internet en ms de 5.000 sitios (noviembre 2004). Elaboracin propia a partir de datos ofrecidos por la consultora de Informacin Netcraft

45

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

El servidor Apache, desarrollado por ms de cien desarrolladores voluntarios dentro del proyecto Apache, gestionado por la Fundacin Apache, The Apache Software Foundation (www.apache.org), es el servidor web ms utilizado en el mundo y esto es debido a sus caractersticas: robustez, rapidez, ser multiplataforma con versiones para Linux, Win32, MacOs, Unix, modularizable, dispone de mdulos para ejecutar PHP, Perl, etc. En cuanto a las aplicaciones gestoras de bases de datos, son numerosos los ejemplos que siguen la corriente open source: MySQL, Postgrade, Sap DB, Interbase Borland,... de las cuales, merece especial mencin MySQL, que presenta como caractersticas destacadas su carcter multiplataforma, una buena integracin con PHP, licencia GPL que garantiza su libertad, gran velocidad y estabilidad. En una encuesta sobre desarrollo de bases de datos realizada por Evans Data Corporation en enero del 2004, se puso de manifiesto que SQL Server y Access continan dominando el desarrollo de bases de datos, pero las bases de datos open source estn ganando terreno. El uso de SQL Server y Access haba crecido casi un 6%, mientras que el uso de MySQL se haba incrementado ms del 30% en los seis meses anteriores a la realizacin de la encuesta. Los lenguajes de programacin son las herramientas bsicas utilizadas por los desarrolladores para crear aplicaciones web. Dentro del desarrollo web la comunidad open source parece mostrar sus predileccin por el lenguaje PHP. Aunque no se va a profundizar en este apartado en este lenguaje, por ser objeto de estudio de los prximos captulos, s se puede adelantar que se trata de un lenguaje interpretado especialmente diseado para embeber su cdigo en el HTML de las pginas web y especial facilidad para interactuar con bases de datos. Los sistemas gestores de contenido, ms conocidos como CMS (Content Management Systems) son aplicaciones desarrolladas para facilitar la creacin y gestin de portales en Internet. Estas herramientas, que sern estudiadas con ms detalle en el Captulo 18, han alcanzado una gran difusin debido a su simplicidad de uso y potencia de desarrollo; basan su funcionamiento en tres elementos fundamentales: una base de datos, por ejemplo MySQL, un servidor web como Apache y un lenguaje de programacin que permita la interaccin con la base de datos como por ejemplo PHP. Ejemplos de gestores de contenido son PHPNuke, Postnuke, Drupal,... En el Captulo 18 se darn referencias a estos productos y otro tipo de herramientas de desarrollo web basadas en PHP y MySQL.

46

OPEN SOURCE Y SOFTWARE LIBRE

2.5.2. COMUNIDADES OPEN SOURCE


Las comunidades, como agrupacin voluntaria de personas con intereses comunes representan y son una muestra del espritu de colaboracin y libertad de la corriente open source y en ellas generalmente usuarios y desarrolladores llegan a ser la misma cosa. Las comunidades y sus miembros son el verdadero alma del open source, las comunidades actan como centro de trabajo y los miembros de la comunidad, tcnicos o no, son la fuerza productiva del software abierto, unos de forma directa si tienen los conocimientos y medios tcnicos participando directamente en el desarrollo de las aplicaciones, y otros testando y experimentando con los programas, comunicando cualquier incidencia o sugiriendo vas de mejora. Las comunidades, como centros de trabajo, ofrecen el entorno necesario para el trabajo en grupo orientado al desarrollo y mejora de software open source, facilitando para ello una serie de servicios. Entre los elementos o servicios comunes que presentan estas comunidades se pueden citar: CVS (Concurrent Versions System) sistema de control de versiones, son aplicaciones que utilizando una arquitectura cliente-servidor, facilitan la gestin y trabajo simultneo sobre el cdigo mediante repositorios o bases de datos que mantienen un histrico de los cdigos fuente, almacenando solo las diferencias entre versiones. Listas de discusin y foros como elementos de comunicacin. Seguimiento de errores. Copias de seguridad.

En su origen las comunidades nacan del espritu de colaboracin de usuarios y desarrolladores independientes en la bsqueda de software libre y de calidad. Eran comunidades creadas y mantenidas por los usuarios. Con el tiempo el nmero de comunidades open source se ha incrementado notablemente, en gran medida debido al apoyo y soporte econmico recibido de grandes empresas como IBM a la comunidad Eclipse y Compaq a Sourceforge, por ejemplo. Las comunidades organizan su trabajo en proyectos, cada proyecto se corresponde generalmente con el desarrollo y mejora de una aplicacin concreta, tarea realizada por los usuarios de la comunidad que de forma libre deciden participar en uno o varios proyectos. Intentar enumerar las comunidades sera adems de imposible, pues continuamente aparecen nuevas iniciativas, injusto, pues se corre el riesgo de no mencionar a

47

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

todas. No obstante, tomando como criterios la tradicin y aos de trabajo, los proyectos desarrollados y en vas de desarrollo y los usuarios (vase Tabla 2.6) destacan especialmente dos comunidades: Sourceforge (http://sourceforge.net/) Savannah (http://savannah.gnu.org/) Comunidad SourceForge Savannah Proyectos 90.625 2.176 Usuarios registrados 952.696 31.392

Tabla 2.6 Proyectos activos y usuarios registrados de dos de las comunidades open source ms importantes a fecha de noviembre de 2004. Fuente: Web de las propias comunidades

2.5.3. USUARIOS DE SOFTWARE OPEN SOURCE


Todas las organizaciones, tanto pblicas como privadas, se rigen en su gestin por la bsqueda de la eficacia y eficiencia, unas para satisfaccin de los ciudadanos y otras de sus accionistas y stakeholders. En este sentido, el software open source no ha pasado desapercibido para dichas organizaciones por sus beneficios tanto tcnicos como econmicos. En el siguiente epgrafe se muestran distintas referencias de utilizacin del software open source en distintas administraciones pblicas y privadas.

Open source y la Administracin Pblica


Las iniciativas gubernamentales a favor del software open source se han producido en todas las partes del mundo, desde Asia, donde el gobierno de una de las mayores potencias tecnolgicas del mundo, la Repblica Popular China, ha establecido disposiciones legales a favor del uso de software open source para los servidores pblicos, o Taiwn dnde las previsiones son ahorrar 300 millones de dlares en pago de licencias a Microsoft, gracias a un programa de desarrollo y adopcin de software open source en toda la administracin estatal. Hasta el gobierno de Estados Unidos, que si bien no ha legislado a favor del software open source s lo

48

OPEN SOURCE Y SOFTWARE LIBRE

utiliza, ejemplo claro es el sitio web de la Casa Blanca16 soportado con sistema operativo Linux y servidor web Apache. Y latinoamrica, con pases como Per y Chile en los que se han sucedido las propuestas de leyes que obliguen al uso exclusivo de software open source en la administracin pblica. En Europa las iniciativas no se han quedado atrs a la hora de apostar por el open source, ejemplos claros son la administracin alemana que en junio del 2002 anunci la migracin de sus sistemas a Linux, o Noruega pas que decidi no renovar las licencias de Microsoft e invertir en favor del software libre. En el caso espaol, si bien no se han producido hasta el momento iniciativas a nivel estatal17, s pueden encontrarse ejemplos en distintos gobiernos autonmicos y municipales. Destaca especialmente el caso de la Junta de Extremadura, entidad pionera de la introduccin de software libre en la administracin pblica espaola, que rescindi sus licencias de sistema operativo pertenecientes a Microsoft y ha desarrollado un sistema operativo propio, GNU/LINEX (www.linex.org), lo que ha servido de ejemplo a otras comunidades como la andaluza, que ha desarrollado el sistema Guadalinux (www.guadalinex.org), o la Generalitat Valenciana, que ha comunicado su intencin de migrar todas las aplicaciones utilizadas por sus organismos hacia el software libre.

Open source y la empresa privada


En cuanto a las empresas privadas, caracterizadas tradicionalmente por el principio de maximizar los beneficios para los accionistas, que se puede traducir en apostar solo por aquellas inversiones capaces de generar beneficios futuros, la penetracin del open source es muy superior a la de las administraciones pblicas. La implantacin del software open source en las organizaciones empresariales se ha concentrado de forma inicial en grandes empresas y multinacionales, que hay que recordar son siempre las pioneras en innovacin y desarrollo y paulatinamente se van incorporando las pequeas y medianas empresas que, como en otras circunstancias similares de innovacin, suelen ir un paso por detrs de las grandes compaas. El despegue e implantacin del open source en las pymes se producir en un futuro no muy lejano.

16

Informacin tomada de Netcraft, empresa britanica de servicios de Internet reconocida internacionalmente por sus estudios sobre la Red. 17 La nica iniciativa con carcter estatal ha sido una Proposicin de Ley para promocionar el uso del software libre en la Administracin del estado en general y en las administraciones autonmicas en particular, presentada por el Grupo Mixto y debatida en el Congreso de los Diputados el 24-09-2002, sesin plenaria nmero 181, donde fue rechazada.

49

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Como ejemplos de multinacionales y grandes empresas de distintos sectores econmicos que han confiado e invertido en el software open source se recogen las siguientes: Sector tecnolgico e informtico: Oracle, ha realizado la migracin de sus aplicaciones de negocio de Unix a un cluster de mquinas Intel bajo Linux. IBM, desde el ao 2001 ha realizado inversiones superiores a 1.000 millones de dlares en Linux y utiliza Apache en su aplicacin de comercio electrnico WebSphere, adems de mantener una colaboracin muy activa con la comunidad open source Eclipse como estrategia y apuesta de futuro. Hewlett-Packard/Compaq y Sun Microsystems, mantienen y dan soporte a distintas comunidades open source como opensource.compaq.com, en el caso de la primera, y sunsource.net, en el caso de la segunda.

Sector ventas y distribucin: Toyota Motor Sales Usa, eligi Linux como sistema operativo de su red de 1.200 servidores. Amazon, basa sus sistemas en la utilizacin de servidores Apache sobre Linux.

Media y comunicacin: Walt Disney Feature Animation, utiliza Linux en sus proyectos. El Pas, basa sus sistemas en Apache, PHP4 y Linux. El prestigioso grupo editor Forbes presenta como base de sus plataformas Linux y Apache y contribuye activamente con el open source Software Institute (www.oss-institute.org)

Financiero: Morgan Stanley, prestigiosa firma financiera, utiliza como sistema operativo Linux. El Banco Herrero, se sirve de Linux sobre un servidor Apache. El Banco Sabadell pas del sistema operativo Solaris 8 sobre Netscape/Enterprise 4.1 a Linux corriendo sobre un servidor Apache

50

OPEN SOURCE Y SOFTWARE LIBRE

2.6. VENTAJAS, INCONVENIENTES Y PERSPECTIVAS DE FUTURO


A lo largo de este captulo se han dejado entre ver algunas de las ventajas del software open source, poco se ha hablado de los inconvenientes que puede tener y del futuro que puede esperar al software desarrollado bajo los principios del cdigo abierto.

2.6.1. VENTAJAS
Se enumeran a continuacin algunas de las ventajas que proporciona el software open source, destacando que, si bien las econmicas18 son las ms visibles, hay otras ventajas importantes: Ahorro de costes, las distribuciones de software open source son generalmente gratuitas o a un coste muy bajo, teniendo en cuenta que con sus licencias dan al usuario libertad para hacer con la aplicacin las modificaciones o distribuciones que consideren oportunas sin ningn coste aadido. El cdigo de los programas es abierto y por tanto no depende de una sola empresa desarrolladora ni de su poltica y permite total flexibilidad para adaptar el programa a las necesidades de los usuarios. Mayor calidad y seguridad en los programas. Esto es debido tanto a que el cdigo sea libre como a la metodologa de trabajo de las comunidades, que permite que un elevado nmero de programadores pueda revisar y trabajar simultneamente sobre un mismo cdigo, detectando errores que de otra manera seran difciles de detectar. Reactiva la competencia en un mercado con tendencias monopolsticas. Rapidez de desarrollo, la evolucin19 y lanzamiento de versiones mejoradas en el software open source es muy superior al software cerrado.

Beneficios que no solo se deben cuantificar como diferencia entre, el pago actual por las licencias de software y el que se pagara, en caso de ser necesario, al utilizar software open source, pues hay otras cuestiones como ahorro en costes de actualizaciones, estabilidad del sistema que repercute en la productividad, etc. 19 Atendiendo al estudio de IBM que se puede obtener integro en: http://www-1.ibm.com/linux/LinuxInSight.pdf, Linux es el sistema operativo que ms rpido ha evolucionado en la historia de la ingeniera de software.

18

51

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Escucha activa a los usuarios y retroalimentacin entre la produccin del software, desarrolladores, y los usuarios mediante una relacin directa y de colaboracin.

2.6.2. INCONVENIENTES
Por supuesto no todo son ventajas, la utilizacin de este tipo de software puede tener sus inconvenientes: Dificultad en cambiar o dejar de utilizar determinadas aplicaciones de software cerrado que se han convertido en un estndar. La utilizacin de software open source no es la mejor opcin para determinadas empresas que basen su negocio en algoritmos secretos o patentados. La utilizacin de aplicaciones open source generalmente requiere, tanto para el usuario domstico como para el personal de empresas, un proceso de adaptacin y formacin, no porque las herramientas open source sean ms complicadas sino simplemente debido a que los usuarios nunca han trabajado con ellas. Existencia de proyectos de desarrollo y comunidades en algunos casos sin estructuras jerrquicas ni organizativas claras que dan al usuario sensacin de desorganizacin. Dentro del movimiento hay algunas comunidades con una tendencia excesiva a la bsqueda del elitismo que aleja al usuario domestico no tcnico.

2.6.3. PERSPECTIVAS DE FUTURO


A modo de conclusin de este captulo dedicado al estudio del movimiento open source y software libre y todo lo que con ellos est relacionado se desea apuntar tres ideas finales. Hablar de open source es ms que hablar de software gratis o de disponer de un cdigo fuente. Supone una nueva forma de producir, desarrollar y distribuir software en la que el usuario, las comunidades e Internet adquieren un papel protagonista.

52

OPEN SOURCE Y SOFTWARE LIBRE

El continuo incremento de usuarios pblicos y privados, de comunidades de desarrollo y de mejoras tcnicas afianzan que la corriente open source no es una moda pasajera dentro del desarrollo del software. Ms an, predicen y hacen aventurar que su verdadero esplendor est por llegar, siendo indicativo de esto mismo la creacin del Observatorio del software de fuente abierta por parte de la Unin Europea para estudiar este fenmeno en los actuales y futuros estados miembros y la elaboracin desde la UNESCO de un programa de actuaciones en apoyo del software libre. Por ltimo, las voces ms optimistas predicen en artculos y comentarios la rpida desaparicin de las compaas de software cerrado. Desde aqu, manifestar que aunque la situacin actual parece indicar que se producir un importante cambio en el mbito del software, estas compaas no tienen porqu desaparecer, aunque s posiblemente reorientar su ncleo de actividad de la produccin de software hacia la prestacin de servicios de valor aadido. No obstante, en ningn caso se puede pensar que este cambio ocurra de un da para otro sino que, como en todo periodo de transformacin, ser fruto de un proceso continuo que comienza ahora a caminar con paso firme.

53

CREACIN DE PGINAS WEB MEDIANTE EL LENGUAJE HTML


3.1. INTRODUCCIN
En el primer captulo, en el que se ha sido analizado el funcionamiento del servicio web, se explic que Internet utiliza para la transferencia de informacin entre clientes y servidores el protocolo HTTP (HiperText Transfer Protocol), protocolo de transferencia de hipertexto. Este protocolo establece los requisitos que se deben cumplir para la transferencia de la informacin, y exige que la informacin a transferir sea definida mediante un sistema estndar, comprensible para cualquier equipo. Con la intencin de satisfacer esta necesidad se desarroll un lenguaje de definicin de hipertextos, el conocido actualmente como HTML. En este captulo se analizar dicho lenguaje y su sintaxis desde un punto de vista prctico, mediante pequeos ejemplos. El objetivo que persigue este captulo introductorio es situar al lector en las condiciones mnimas necesarias para poder desarrollar un sitio web y dotarle posteriormente de diversas funcionalidades mediante el uso de PHP y MySQL. Por supuesto, no se pretende hacer una presentacin exhaustiva del lenguaje, simplemente

55

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

se mostrar el proceso de construccin de un sencillo sitio web, tomando como referencia lo que podra ser el objetivo de una empresa ficticia, a la que se denominar Cinem@s. Esta empresa ficticia pertenece al sector del entretenimiento y dispone de un multicine, el objetivo final que persigue es ofrecer a sus clientes un cmodo servicio de informacin y reserva de localidades a travs de Internet. El primer paso para ello ser la creacin de unas sencillas pginas web de presentacin, en torno a las cuales se desarrollar posteriormente la aplicacin web deseada. La Figura 3.1 muestra la pgina web de inicio de Cinem@s, el proceso de creacin de est pgina ser explicado a lo largo del captulo, y contendr enlaces a otras pginas que se desarrollarn en la segunda parte del libro para implementar el sistema de consulta y compra de localidades.

Figura 3.1 Pgina de inicio de Cinem@s

56

CREACIN DE PGINAS WEB MEDIANTE EL LENGUAJE HTML

3.1.1. DEFINICIN DE HTML


Las definiciones existentes de HTML son mltiples y ms o menos complejas. Una definicin sencilla y de marcado carcter prctico es la que se propone a continuacin: HTML es un lenguaje de descripcin de hipertexto compuesto por una serie de comandos, marcas, o etiquetas, tambin denominadas Tags que permiten definir la estructura lgica de un documento web y establecer los atributos del mismo (color del texto, contenidos multimedia, hipervnculos, etc...). En resumen, es un lenguaje que permite crear pginas web y para ello utiliza unos comandos o etiquetas que indican o marcan qu se debe mostrar y de qu forma. Los comandos siempre van incluidos entre los signos < > e insertados en el propio texto que compone el contenido de la pgina. Especifican su estructura (las distintas partes de la pgina) y formato. Adems, permiten la insercin de contenidos especiales como imgenes, videos, sonidos, etc. Ejemplo 3.1: Un primer ejemplo sencillo de creacin de una pgina web, puede ser realizado utilizando un simple editor de texto, por ejemplo el bloc de notas de Windows. Si se escribe el cdigo:
<H1> Primer ejemplo de pgina web </H1> realizado con <B> HTML y el bloc de notas.</B>

y se guarda el documento con un nombre con extensin .htm o .html, ya se habr creado una primera pgina web. Dicho documento abierto desde el navegador genera una pgina como la que se puede ver en la Figura 3.2.

NOTA

Toda pgina web debe ser guardada en un documento de texto con la extensin .htm o .html..

Si se analiza detalladamente el cdigo HTML que ha producido esta pgina puede verse cmo los diferentes comandos van sealando los diferentes elementos de la

57

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

pgina. Por ejemplo, los comandos <H1> y </H1> sealan el inicio y el fin, respectivamente, del texto que se mostrar con formato de ttulo: Primer ejemplo de pgina web. De la misma manera, los comandos <B> y </B> encierran el texto que se mostrar en negrita.

Figura 3.2 Primera pgina web

Toda pgina web desarrollada con HTML oculta un documento de texto sin formato, texto ASCII, que incorpora todas las instrucciones o etiquetas del lenguaje HTML necesarias para conseguir que la pgina tenga la apariencia que se visualiza en el navegador. Este documento de texto que aparece oculto al usuario final, es lo que se denomina cdigo fuente de la pgina. Las herramientas de navegacin web permiten la consulta de ese cdigo fuente; por ejemplo, Internet Explorer dispone de la opcin Cdigo fuente del men Ver.

3.2. HISTORIA DE HTML


El nacimiento y desarrollo del lenguaje HTML no fue algo casual y espontneo. Desde el comienzo de la utilizacin de las primeras redes de ordenadores por parte de las grandes empresas y organismos cientficos y militares surge la preocupacin por desarrollar un sistema que permita la edicin estructurada de documentos, de forma que se evite la disparidad de formatos y a la vez se facilite el intercambio de los mismos.

58

CREACIN DE PGINAS WEB MEDIANTE EL LENGUAJE HTML

El antecedente ms remoto de HTML se encuentra en el lenguaje de marcado generalizado, GML, desarrollado por Charles Goldfarb, Ed Mosher y Ray Lorie dentro de IBM, en los primeros aos de la dcada de los setenta con el objetivo de dotar de un formato comn a los documentos de la empresa con independencia de su tipo. Este lenguaje fue posteriormente mejorado por sus creadores dando lugar a la primera tecnologa de informacin estandarizada y estructurada: el lenguaje de marcado generalizado estndar, SGML, que en 1986 es aceptado por la Organizacin Internacional de Estandarizacin (ISO), como un estndar. A pesar de esto, no se consigui evitar una elevada complejidad para el usuario final, que unido a un alto coste impidi que dicho lenguaje se convirtiera en un estndar aceptado, aunque s sent las bases de lo que sera posteriormente HTML. El salto cualitativo se produce en 1989 cuando Tim Berners-Lee y Anders Berglund, investigadores del Laboratorio Europeo de Fsica de Partculas (CERN), crearon un lenguaje basado en etiquetas para editar documentos con el fin de compartirlos entre diferentes equipos de investigacin que trabajaban para el CERN. Esta aplicacin simplificada del SGML se llam HTML, lenguaje de marcas de hipertexto, y se convirti por su simplicidad en el primer formato de informacin estndar de Internet, dando lugar a la aparicin del servicio ms popular de la red: el servicio web. El lenguaje HTML ha ido evolucionando mediante distintas versiones, desde la HTML 2.0 de 1994, hasta la actual, adaptando el lenguaje en cada momento a las necesidades y caractersticas de los usuarios de Internet, pasando, desde la transferencia de documentos de texto plano, a la incorporacin de posibilidades multimedia (imgenes, vdeo, Flash, applets de Java), de dinamismo (HTML Dinmico), de presentacin (CSS) y de operatividad (CGI, ASP, JSP, PHP,...) que no estaban presentes en un principio. Cambios y modificaciones no siempre realizados de forma coordinada, como ejemplo claro la implementacin de distintas etiquetas y extensiones del lenguaje en funcin del navegador, lo que provoca que en ocasiones una misma pgina no se visualice de igual forma en todos los navegadores. Con la intencin de solucionar estos problemas se cre en 1996 el consorcio W3C (www.w3.org), formado por ms de 350 organizaciones, entre las que se encuentran las principales empresas del sector: Microsoft, Netscape,... y distintos organismos pblicos internacionales como el MIT, INRIA,... con el propsito de promover el crecimiento de la Web, desarrollando especificaciones y software de referencia disponibles para todos los usuarios sin coste alguno. La tarea principal del W3C es la de recomendar a las empresas y desarrolladores interesados en la Web una serie de pautas sobre cmo deben implementarse los diferentes lenguajes (HTML, CSS, XML, etc.) y tecnologas.

59

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

3.3. SOFTWARE NECESARIO PARA TRABAJAR CON HTML


Trabajar con un lenguaje siempre conlleva la necesidad de utilizar herramientas informticas, generalmente de edicin, compilacin y otras utilidades. En el caso del lenguaje HTML esto se simplifica notablemente siendo estrictamente necesario solo dos tipos de aplicaciones: navegadores y editores.

3.3.1. NAVEGADORES
Son programas instalados en el equipo del usuario que se encargan de ejecutar las rdenes contenidas en el cdigo HTML. Cuando un usuario desea visitar una pgina web, su equipo debe conectarse con un servidor remoto y efectuar una peticin al servidor web. Como respuesta a esta peticin se inicia, a travs de la red y basndose en el protocolo HTTP, la transferencia del cdigo fuente que define la pgina. Una vez que ese cdigo llega al equipo del usuario, el navegador que este tenga instalado interpreta lnea a lnea el cdigo recibido y genera la pgina tal y como se ver finalmente. Por tanto, los navegadores web o browsers son las aplicaciones encargadas de realizar las peticiones de pginas web y otros recursos al servidor y de presentar luego los resultados de la peticin al usuario. Si adems la pgina HTML contiene imgenes, vdeos, documentos PDF u otro tipo de ficheros diferentes, el navegador es el encargado de intentar presentar en pantalla de forma correcta dichos contenidos y, si no puede hacerlo, de arrancar la aplicacin necesaria para la visualizacin de los mismos. Los navegadores ms conocidos son Internet Explorer y Netscape Comunicator, pero existen otros navegadores menos conocidos como Neoplanet, Opera, Hot Java, Mozilla, etc. Este ltimo cada vez adquiere mayor importancia, y como se indic en el Captulo 2, es el navegador estandarte de la corriente open source.

3.3.2. EDITORES
La labor de creacin de una pgina web est a mitad de camino entre la programacin y el diseo grfico o maquetacin. Aunque se utiliza un lenguaje (HTML), este est lejos de ser un lenguaje de programacin como C, C++, Java, etc. Por otro lado, crear la pgina no se reduce nicamente a buscar una combinacin de colores y colocacin de diferentes elementos multimedia con una apariencia visual atractiva.

60

CREACIN DE PGINAS WEB MEDIANTE EL LENGUAJE HTML

Hasta el momento se ha visto que para trabajar en HTML simplemente se necesita un procesador de textos, por ejemplo el bloc de notas, con el que se crea la pgina escribiendo directamente cdigo HTML, y un navegador que interprete dicho cdigo. Pero trabajar de esta manera requiere dominar completamente el lenguaje, de ah que para facilitar la labor de creacin de pginas web se hayan desarrollado unos programas, editores de HTML, que pueden ser clasificados en dos grandes grupos: Editores WYSIWYG (What You See Is What You Get): con este tipo de editores el usuario no trabaja directamente sobre el cdigo, sino sobre un documento que muestra la apariencia de la pgina tal como llegara al usuario final (lo que tu ves es lo que tu obtienes). Se trata de editores ideales para personas que comienzan a utilizar el lenguaje HTML y quieren llegar a crear una pgina sin necesidad de dominar el lenguaje, ya que estos editores se encargan de generar automticamente ese cdigo de forma oculta para el usuario. Por supuesto, el usuario tiene la posibilidad de consultar el cdigo generado y, en algunos casos, dependiendo del editor, tambin modificarlo. Editores no WYSIWYG: en este tipo de editores, el usuario en todo momento puede ver y editar el cdigo fuente. Por supuesto, estos editores disponen de opciones que permiten generar automticamente la estructura de los diferentes elementos de la pgina y ayudan a la utilizacin de los comandos sin necesidad de que el usuario los conozca con todo detalle.

Cualquier persona que quisiera crear su pgina web sin ningn tipo de complicaciones, podra utilizar el procesador de texto Microsoft Word. Tras incluir todo el contenido, con el formato deseado, se elegira la opcin de Guardar como pgina web..., y el propio Word generara una pgina web con el cdigo fuente correspondiente. Otro tipo de editores especficamente creados para generar pginas web, como por ejemplo FrontPage, tambin permiten al usuario crear sus pginas de esta forma tan simple. En ambos casos se estara trabajando con un entorno de edicin perteneciente a la primera categora de editores (WYSIWYG). A pesar de su simplicidad de uso, estos editores tambin tienen sus inconvenientes; el principal es la falta de control por parte del usuario del cdigo generado, llegndose a generar en ocasiones un cdigo excesivamente complejo y no optimizado. Dentro de la segunda categora de editores se podran citar los siguientes: HomeSite 1stPage2000 (www.allaire.com) (www.evrsoft.com)

61

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

arachnophilia (www.arachnoid.com/arachnophilia) AceHTML (http://freeware.acehtml.com)

La mayora de los editores que se utilizan a un nivel profesional incorporan las dos funcionalidades o modos de edicin. Normalmente, los desarrolladores prefieren trabajar directamente sobre el cdigo y utilizar el otro modo para comprobar nicamente la apariencia final de la pgina.

3.4. ESTRUCTURA DE UNA PGINA WEB


La estructura bsica de todo documento HTML, an no siendo obligatoria, debera ajustarse al siguiente esquema:
<HTML> Indica el inicio de la pgina <HEAD> Comienzo de la cabecera <TITLE> Comienzo del ttulo Aqu ir el titulo de la pgina </TITLE> Fin del ttulo </HEAD> Fin de la cabecera <BODY> Comienzo del cuerpo Aqu ir el contenido de la pgina: texto, tablas, imgenes,... junto con los comandos HTML </BODY> Fin del cuerpo </HTML> Indica el fin de la pgina

3.4.1. COMPLEMENTOS A LA ESTRUCTURA BSICA: METATAGS


Generalmente, cuando un internauta visualiza el cdigo fuente de una pgina web esta presenta una estructura ms compleja que la indicada anteriormente como estructura bsica. Esto es debido principalmente a dos elementos: por un lado, el cdigo HTML que forma una pgina puede llevar embebido en distintas partes de la estructura cdigo de otros lenguajes, como por ejemplo JavaScript, con la intencin de dotar a la pgina de efectos o funcionalidades imposibles de lograr con la utilizacin exclusiva de HTML. Por otro, es posible tambin encontrar unas etiquetas especiales llamadas metatags o metaetiquetas, que por su importancia se estudian a continuacin.

62

CREACIN DE PGINAS WEB MEDIANTE EL LENGUAJE HTML

Las metatags, se pueden agrupar segn su funcionalidad en dos bloques. El primero, formado por metatags orientadas a definir una pgina web de acuerdo con los estndares del lenguaje HTML, consiguiendo con ello que no solo los navegadores, sino tambin las aplicaciones que estos puedan necesitar para visualizar la pgina, sepan de forma clara cmo tienen que tratarla, consiguiendo as la mxima compatibilidad y accesibilidad. Y, el segundo, formado por metatags orientadas a conseguir la promocin de la pgina o sitio web.

Etiquetas de compatibilidad
Dos son las principales etiquetas que contribuyen a dotar al sitio de un correcto aspecto formal y que, an no siendo obligatorias, es al menos necesario conocer para poder interpretar su significado. La primera es la etiqueta META HTT-EQUIV="Content-Type", cuya finalidad es solucionar el problema derivado de la disparidad de caracteres e idiomas en los que se puede elaborar una pgina web. Problema, que de forma resumida, se debe a la elaboracin de una pgina en un determinado idioma y la posterior posibilidad de que dicha pgina sea solicitada por un navegador desde cualquier punto del mundo y con un idioma distinto, lo que con frecuencia impide que dicho navegador pueda interpretar correctamente todos los caracteres que componen la web. Un ejemplo claro es el carcter . Surge as la necesidad de dotar de un estndar a todos los documentos HTML, que permita indicar al navegador qu conjunto de caracteres debe utilizar para presentar las pginas. Este patrn viene dado por la metaetiqueta:
<META HTTP-EQUIV= "Content-Type" CONTENT= "text/html;charset= caracteres a usar">

donde el atributo charset fijar el conjunto de caracteres de la pgina. El navegador al recibir la pgina obtiene en la cabecera esta metaetiqueta y solicita al sistema operativo que cargue los caracteres necesarios para poder presentar la pgina tal y como se cre. Para las pginas elaboradas en castellano se deber usar el conjunto de caracteres ISO 8859-1, tambin denominado Latin1, que incluye las letras acentuadas y la letra , tanto en maysculas como en minsculas. La metaetiqueta a incluir ser entonces:
<META HTTP-EQUIV= "Content-Type" CONTENT="text/html;charset= ISO-8859-1">

Por ltimo, indicar que esta etiqueta debe situarse entre el <HEAD> y <TITLE>. 63

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

La segunda metaetiqueta a destacar es DOCTYPE, y permite cumplir con las recomendaciones del W3C en las que se indica la necesidad de que se declare el tipo de documento y en la versin de HTML utilizada, facilitando de esta forma la compatibilidad y accesibilidad a los navegadores. El texto de la declaracin debe colocarse al principio del documento, en la seccin de precabecera, antes de la etiqueta <HTML>, de forma que sea lo primero que recibe el navegador cliente al solicitar una pgina web. En HTML, atendiendo a las recomendaciones del consorcio W3C20, es posible establecer tres tipos diferentes de documentos: Strict: el documento debe estar elaborado de una forma estricta conforme a las reglas del estndar HTML aprobadas por la W3C para cada versin de HTML. La etiqueta para establecer este tipo de documento es la siguiente:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">

El inconveniente de este tipo de definicin es que los navegadores antiguos pueden no admitirla y que su rigidez no permite errores de cdigo en la elaboracin de la pgina web. Transitional: es la declaracin utilizada con mayor frecuencia, con ella adems de incluir los elementos y atributos del HTML estricto se incorporan otros elementos no aceptados por el consorcio W3C y se dispone de ms flexibilidad a la hora de escribir el cdigo. La declaracin de este tipo de documento se consigue mediante la siguiente etiqueta:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.O1 Transitional//EN">

Frameset: es la declaracin de documento a utilizar cuando la pgina utiliza marcos o frames. La declaracin se establece del siguiente modo:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">

20

El consorcio W3C pone a disposicin de los desarrolladores un servicio gratuito que permite verificar y confirmar que el documento est elaborado siguiendo las directrices establecidas. El servicio est disponible en The W3C MarkUp Validation Service: http://validator.w3.org/

64

CREACIN DE PGINAS WEB MEDIANTE EL LENGUAJE HTML

Etiquetas de promocin
An a riesgo de simplificar en exceso, se puede decir que el objetivo ltimo de una pgina web es ser visitada, y para lograrlo debe ser conocida, algo extremadamente complicado de conseguir debido a la ingente cantidad21 de sitios web en la red. Los usuarios de Internet en su bsqueda de informacin utilizan buscadores y directorios, es habitual que consulten solo las pginas que ocupan las primeras posiciones. Es por tanto un hecho que estos buscadores y directorios son la principal fuente de visitas de una web, y que la posicin que una pgina ocupa dentro de ellos es clave para conseguir visitas. A tenor de lo comentado, los desarrolladores se han esforzado primero en conocer el funcionamiento de los buscadores22 y robots y, posteriormente, desarrollar un medio de facilitar el indexado de sus pginas en las bases de datos de dichos buscadores. Surgen as una serie de metatags entre las que destacan las siguientes: META NAME="keywords", ofrece a los buscadores palabras clave (keywords) del contenido de la pgina. Su sintaxis completa es:
<META NAME="keywords" CONTENT="palabra1, palabra2, palabra3, palabra4, palabra 5, palabra6, palabra 7">

META NAME="description", permite establecer una descripcin general y concisa de la pgina, como norma general se recomienda utilizar las palabras que aparecen en las metatags keywords y no utilizar ms de 255 caracteres. La sintaxis es:
<META NAME="description" CONTENT=" Texto que forma la descripcin del sitio web .....">

21

El buscador Google, considerado en la actualidad el ms completo de la red, tiene indexadas un total de 3.300 millones de pginas web. 22 De forma resumida se puede considerar que, en funcin de la forma de operar, existen tres tipos de buscadores o robots: los que venden el posicionamiento, los que utilizan robots que leen las pginas webs, dando un peso fundamental a las metatags, e indexan las pginas en funcin de las veces que aparece un trmino y Google, que utiliza el sistema denominado pagerank en el que no importan tanto las metatags de una web y s el nmero de pginas de contenido similar que se dirigen o enlazan con ella.

65

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

3.5.

CARACTERSTICAS GENERALES DEL LENGUAJE Y SINTAXIS DE SUS COMANDOS

Antes de analizar los principales comandos de HTML es necesario conocer algunas de sus caractersticas: Los navegadores ignoran los cambios de lnea dentro del cdigo HTML, as como la existencia de ms de un espacio en blanco entre palabras. Todo comando que carezca de sentido es ignorado por el navegador sin generar ningn mensaje de error. Hay distintos tipos de navegadores e incluso un mismo navegador tiene distintas versiones, esto hace que no todos funcionen igual, por lo que la visualizacin de una misma pgina puede variar de un navegador a otro si no se respetan los estndares del lenguaje. Los comandos o etiquetas van encerrados entre los signos < > y suelen tener una orden de inicio y otra de fin con la misma forma que la de inicio pero precedida de /. Ejemplo, para sealar que un texto se debe visualizar en negrita se utiliza el comando <B> para sealar el inicio del texto y el comando </B> para el final. Para escribir los comandos en HTML es indiferente el uso de maysculas o minsculas, pues producen el mismo efecto. Si bien, es bastante comn utilizar maysculas para hacer ms identificables los comandos dentro del cdigo fuente. Los comandos o etiquetas pueden anidarse, combinarse, obteniendo como resultado la suma de los efectos de cada uno de ellos. Por ejemplo, si se desea que un texto aparezca en negrita y subrayado se podra realizar el siguiente anidamiento de comandos:
<B><U> El texto deseado </U></B>

Los comandos pueden requerir parmetros, elementos que especifican o concretan la orden indicada por el comando. Los parmetros se introducen a continuacin del inicio del comando. Por ejemplo, la etiqueta <HR> genera una lnea horizontal que permite separar partes de una pgina; este comando puede llevar los parmetros ALIGN, que indicar la posicin de la lnea (centrada, izquierda, derecha), SIZE, que indica el grosor de la lnea en pxeles, y WIDTH, que marca la longitud de la lnea.

66

CREACIN DE PGINAS WEB MEDIANTE EL LENGUAJE HTML

Si los comandos requieren parmetros, estos pueden indicarse en cualquier orden, el valor del parmetro es asignado con el signo de igualdad y en caso de existir ms de uno, los parmetros se separan por espacios en blanco. Por ejemplo, los dos comandos siguientes seran equivalentes:
<HR SIZE=20 WIDTH=40 ALIGN=center> <HR ALIGN=center WIDTH=40 SIZE=20>

Los valores de los parmetros deben ser dados entrecomillados, salvo en el caso de que estos valores no incluyan espacios en blanco o caracteres especiales.

3.5.1. CARACTERES ESPECIALES


Existe una serie de caracteres que originalmente no podan ser incluidos directamente en el documento HTML; si bien, la evolucin del lenguaje ha permitido el desarrollo de especificaciones concretas para cada idioma, recurdese una de las funciones de las metatags. No obstante, una forma de conseguir que dichos caracteres especiales sean reconocidos por cualquier navegador, con independencia del idioma que tenga predefinido, es introducirlos mediante una codificacin especial en HTML. La Tabla 3.1 muestra alguno de estos caracteres especiales.
Carcter < & Cd. HTML &lt; &amp; &iquest; &Aacute; &Eacute; &Iacute; &Oacute; &Uacute; &Auml; &Ntilde; Carcter > " i Cd. HTML &gt; &quot; &iexcl; &aacute; &eacute; &iacute; &oacute; &uacute; &auml; &ntilde;

Tabla 3.1 Caracteres especiales en HTML

67

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

3.6. COMANDOS BSICOS


Los comandos o tags existentes en el lenguaje HTML son mltiples. Para facilitar su compresin se van a presentar agrupados segn su finalidad (para qu sirven o qu permiten hacer).

3.6.1. COMANDOS DE CABECERAS PARA DEFINICIN DE TTULOS Y SECCIONES:


HTML dispone de seis cabeceras o tipos de letra predefinidos de distinto tamao, que se utilizan para marcar los ttulos en las pginas. Mediante estos comandos se puede estructurar el documento en secciones y diferentes niveles de subsecciones. Las cabeceras se activan con el comando <Hn> y se desactivan con </Hn> donde es un nmero de 1 a 6. Las cabeceras provocan automticamente un salto de lnea aunque no se indique explcitamente. En concreto, los 6 comandos de cabecera se muestran en la Tabla 3.2. Los comandos de cabecera admiten el parmetro ALIGN, que especifica la forma de alineacin de la cabecera con respecto al resto del documento, y cuyo valor puede ser LEFT, RIGHT, o CENTER .
Cdigo HTML Visualizacin con un tamao de letra de 24 puntos con un tamao de letra de 18 puntos con un tamao de letra de 14 puntos con un tamao de letra de 12 puntos con un tamao de letra de 10 puntos con un tamao de letra de 8 puntos

<H1>Cabecera <H2>Cabecera <H3>Cabecera <H4>Cabecera <H5>Cabecera <H6>Cabecera

tipo tipo tipo tipo tipo tipo

1</H1> 2</H2> 3</H3> 4</H4> 5</H5> 6</H6>

Tabla 3.2 Comandos de cabecera

3.6.2. COMANDOS DE CAMBIO DE ESTILO DE TEXTO


Para indicar atributos del texto (negrita, subrayado, etc...) se dispone de varias directivas que a continuacin se muestran. Hay que puntualizar que algunas de ellas no son reconocidas por determinados navegadores, por lo que el resultado final depender del navegador con que se visualice la pgina. Un ejemplo de esto es el comando <BLINK>, especfico del navegador Netscape y que no produce efecto en

68

CREACIN DE PGINAS WEB MEDIANTE EL LENGUAJE HTML

otros navegadores. Los comandos ms habituales para cambiar el estilo del texto son los que se muestran en la Tabla 3.3.
Cdigo HTML <B>..................</B> <I>........... ......</I> <U>..................</U> <SUP> .............</SUP> <SUB>..............</SUB> <S>..................</S> <BLINK> ..........</BLINK> Visualizacin Texto en negrita Texto en itlica Texto subrayado Texto como superndice Texto como subndice Texto tachado Texto parpadeante

Tabla 3.3 Comandos de cambio de estilo del texto

Para variar el tamao, color y tipo de letra de un texto tambin es muy til el comando <FONT> </FONT>. Algunos de los parmetros de este comando son: SIZE = +n/-n permite asignar al texto un tamao n veces superior (+) o inferior (-) respecto al tamao normal de la fuente. COLOR = "cdigo del color". Ms adelante se analizar la codificacin de los colores en HTML. FACE = "nombre del tipo de fuente". Si el tipo de letra indicado no existe en el ordenador que visualiza el texto, aparecer escrito en la fuente predeterminada del navegador.

Ejemplo 3.2: Si se desea que el texto sea mostrado utilizando un tipo de letra de tamao 2 veces superior al normal, en color rojo y con fuente arial, el comando sera:
<FONT SIZE=+2 COLOR="#FF0000" FACE="arial"> Texto </FONT>

3.6.3. BLOQUES DE TEXTO Y PRRAFOS


El bloque de texto bsico de un documento es el prrafo. Los prrafos del documento pueden ser delimitados con los comandos:

69

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

<P> .................... </P>

El comando <P> admite el parmetro ALIGN, cuyo valor puede ser LEFT, RIGHT o CENTER y especifica la forma de alineamiento del prrafo. Como se ha comentado anteriormente, los cambios de lnea en el cdigo fuente HTML son ignorados por el navegador. Para forzar un salto de lnea, basta colocar el comando <BR>. Existe un caso en el que los cambios de lnea y espacios en blanco extra dentro del cdigo fuente s tienen efecto sobre la visualizacin de la pgina, este caso corresponde a los denominados bloques de texto preformateado. La forma de definir estos bloques de texto en HTML es:
<PRE>................</PRE>

Ejemplo 3.3: Supngase que se desea incluir en la pgina una estadstica de las proyecciones y espectadores de Cinem@s durante el ltimo ao. Se podra generar una sencilla estructura tabular mediante un bloque de texto preformateado:
<PRE> Trimestre Trimestre Trimestre Trimestre 1 2 3 4 ---------------------------------------------------------Proyecciones 456 502 399 487 Expectadores 3.446 6.782 2.947 5.821 ---------------------------------------------------------</PRE>

Cuando el navegador interprete este cdigo, se visualizar ese bloque de texto tal como aparece en l, respetando el espaciado entre palabras y los cambios de lnea. Puede comprobarse cmo, de no usar los comandos <PRE> y </PRE>, los datos se mostraran separados entre s por un nico espacio en blanco y los cambios de lnea se produciran en los lugares que determine la anchura de la ventana del navegador. Otro de los tipos de bloques de texto disponibles est constituido por los bloques con sangras (texto sangrado), la definicin de uno de estos bloques se realiza con los comandos:
<BLOCKQUOTE>................</BLOCKQUOTE>

70

CREACIN DE PGINAS WEB MEDIANTE EL LENGUAJE HTML

3.6.4. COMANDOS PARA LA GENERACIN DE LISTAS


La presentacin de informacin en forma de listas se puede realizar bsicamente de dos formas: Listas numeradas, representan los elementos de la lista numerando cada uno de ellos de forma consecutiva segn el lugar que ocupan en la misma. Listas sin numerar, representan los elementos de la lista con una marca o vieta que antecede a cada uno de ellos.

Para la construccin de listas numeradas se utilizan los comandos <OL> y </OL>, que sealan el inicio y el fin, respectivamente, de la lista. Cada elemento o tem de lista se seala con el comando <LI>. El propio intrprete de HTML se encargar de asignar la numeracin a cada tem. El comando <OL> tiene algunos parmetros opcionales, entre ellos: START: especifica el nmero de orden del primer elemento de la lista, por defecto empezar en 1. TYPE: Indica el tipo de numeracin a emplear, el valor para este parmetro puede ser: 1 i I a A nmeros (valor por defecto). nmeros romanos en minscula. nmeros romanos en mayscula. letras en minscula. letras en mayscula.

Ejemplo 3.4: Supngase que se desea mostrar en una pgina las 10 pelculas ms taquilleras de todos los tiempos en Espaa. El cdigo HTML que genera esta pgina podra ser el siguiente:
<H2> LAS PELCULAS MAS TAQUILLERAS DE TODOS LOS TIEMPOS EN ESPAA </H2> <OL>

71

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

<LI>Titanic (1997)</LI> <LI>El seor de los anillos, El retorno del rey (2003)</LI> <LI>El seor de los Anillos, La comunidad del anillo (2001)</LI> <LI>El seor de los anillos, Las dos Torres (2002)</LI> <LI>Harry Potter y la piedra filosofal (2001)</LI> <LI>Los otros (2001)</LI> <LI>El sexto sentido (1999)</LI> <LI>Shrek 2 (2004)</LI> <LI>Harry Potter y la cmara secreta (2002)</LI> <LI>La guerra de las galaxias, Episodio I, La amenaza fantasma (1999)</LI> </OL>

Los comandos de finalizacin de cada tem de la tabla (</LI>) son opcionales. La visualizacin de la pgina en el navegador se muestra en la Figura 3.3.

Figura 3.3 Lista de las pelculas ms taquilleras

72

CREACIN DE PGINAS WEB MEDIANTE EL LENGUAJE HTML

En el caso de las listas sin numerar, su construccin es similar, salvo en el uso de comandos diferentes para sealar el inicio y el fin de la lista. Estos comandos son <UL> y </UL>; cada elemento de la lista ir precedido del comando <LI>. El comando <UL> puede llevar el parmetro opcional TYPE, que indica el tipo de smbolo utilizado para marcar los elementos de la lista. Los valores posibles son: Ejemplo 3.5: La Figura 3.4 corresponde a una pgina web del sitio de Cinem@s en la que se muestra informacin sobre las salas de proyeccin disponibles. Esta pgina contiene en su parte inferior una lista sin numerar cuyo cdigo HTML es:
Todas nuestras salas estn equipadas con: <UL TYPE="disc"> <LI>Aire acondicionado</LI> <LI>Pantallas de grandes dimensiones</LI> <LI>Sistema de sonido Dolby Digital Soundround</LI> <LI>Cmodas butacas equipadas con portarefrescos</LI> <LI>Cmodos accesos y espacios entre butacas</LI> </UL>

circle disc square

Crculos huecos Crculos rellenos Cuadrados rellenos

73

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Figura 3.4 Pgina de presentacin de las caractersticas de las salas de Cinem@s

Por ltimo, indicar que los diferentes tipos de listas se pueden anidar es decir, incluir una lista dentro de otra, incluso siendo listas de diferentes tipos. Ejemplo 3.6: La pgina que se puede ver en la Figura 3.5 incorpora una serie de listas anidadas, la lista de nivel superior es una lista numerada, mientras que las de los niveles inferiores son listas sin numerar. El cdigo fuente de esa pgina es:
<H2> Nuestros mens especiales </H2> Para disfrutar del mejor cine le ofrecemos nuestros packs especiales:

74

CREACIN DE PGINAS WEB MEDIANTE EL LENGUAJE HTML

<OL TYPE=A> <LI> Men <I>Junior</I> </LI> <UL TYPE=square> <LI>Palomitas pequea</LI> <LI>Bebida a elegir:</LI> <UL TYPE="circle"> <LI>Agua mineral</LI> <LI>Refresco pequeo</LI> </UL> </UL> <LI> Men especial <I>Cinem@s</I> </LI> <UL TYPE=square> <LI>Palomitas grande</LI> <LI>Snack</LI> <LI>Bebida a elegir:</LI> <UL TYPE="circle"> <LI>Agua mineral</LI> <LI>Refresco grande</LI> </UL> </UL> </OL>

NOTA

Aunque no es estrictamente necesario, y no tiene ningn efecto sobre la visualizacin de la pgina, s que es recomendable tratar de escribir el cdigo fuente de una manera que mejore su legibilidad y depuracin. En el ejemplo anterior, las diferentes listas anidadas han sido incluidas en el cdigo con diferentes niveles de sangrado precisamente para eso.

75

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Figura 3.5 Estructura de listas anidadas

3.6.5. CREACIN DE TABLAS


Otra de las estructuras bsicas de HTML para mostrar y organizar datos son las tablas. Estas estructuras van a resultar especialmente tiles cuando se desee recuperar datos de una base de datos y visualizarlos en una pgina web; es por ello que, en funcin de los objetivos de este libro, resulta importante conocer en detalle los diferentes comandos HTML que permiten generar estas estructuras. Las tablas se generan siempre con la siguiente estructura: Toda tabla queda delimitada por los comandos <TABLE> y </TABLE>. Cada fila de la tabla queda delimitada por los comandos <TR> y </TR>. Se pueden definir dos tipos de celdas: o Celdas de cabecera o titulares: sealadas con los comandos <TH> y </TH>.

76

CREACIN DE PGINAS WEB MEDIANTE EL LENGUAJE HTML

Celdas de contenido: sealadas con los comandos <TD> y </TD>.

Los diferentes comandos de creacin de tablas disponen de una serie de argumentos opcionales que permiten, entre otras cosas, establecer bordes para las celdas, tipos de alineacin, fusin de celdas, dimensiones,... A continuacin se recogen algunos de estos parmetros.
Parmetros opcionales del comando <TABLE>:

BORDER: indica que debe dibujarse un borde a la tabla. Si se da un valor a este parmetro, ese valor indica el grosor en pxeles del borde. Si no se indica este parmetro la tabla aparecer sin borde. CELLPADDING: permite indicar el espacio que se debe dejar entre el borde de cada celda y su contenido. El valor por defecto es 1. CELLSPACING: fija la anchura, en pxeles, de las lneas de divisin internas de la tabla. El valor por defecto es 2. WIDTH: controla la anchura de la tabla. Se puede indicar un valor en pxeles o un porcentaje respecto al ancho total de la pgina. ALIGN: permite situar la tabla respecto al texto que tiene a su alrededor. Los valores que puede tomar este parmetro son CENTER, LEFT y RIGHT.

Parmetros adicionales de los comandos <TD> y <TH>: ALIGN: indica el tipo de alineacin del contenido de las celdas. Los valores pueden ser LEFT, RIGHT y CENTER. Este parmetro tambin puede aplicarse sobre el comando <TR> y tendr efecto sobre todas las celdas de esa fila. VALIGN: indica el tipo de alineacin vertical del contenido de las celdas. Los valores pueden ser TOP, BOTTOM, MIDDLE (valor por defecto). BGCOLOR: indica un color de fondo para la celda. Tambin puede ser aplicado sobre toda una fila o la tabla completa. COLSPAN: indica el nmero de columnas que ocupa la celda. El valor por defecto es 1. ROWSPAN: indica el nmero de filas que ocupa la celda. Por defecto es 1. NOWRAP: obliga al navegador a no partir las lneas de la celda. El ancho de la celda estar fijado por la longitud del texto que contendr. WIDTH: indica el ancho de la celda. Se puede indicar un ancho en pxeles o un porcentaje respecto al ancho total de la tabla.

77

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Ejemplo 3.7: Cinem@s tiene establecido un sistema por el cul todos sus clientes acumulan puntos cada vez que adquieren una entrada. Los puntos acumulados pueden ser canjeados por entradas gratis y otros regalos. Dentro del sitio web, Cinem@s quiere incluir una tabla como la que se ve en la Figura 3.6 para indicar la correspondencia entre puntos y premios.

Figura 3.6 Tabla de premios

El cdigo HTML que genera esta pgina es:


<H1 ALIGN="center"> Nuestros premios </H1> <TABLE BORDER ALIGN=center> <TR BGCOLOR=#99CCFF> <TH> Puntos </TH> <TH> Premio </TD> </TR> <TR> <TH> 20 </TH> <TD> Entrada gratis </TD> </TR> <TR> <TH> 25 </TH> <TD> Gorra <I>Cinem@s</I> </TD> </TR>

78

CREACIN DE PGINAS WEB MEDIANTE EL LENGUAJE HTML

<TR> <TH> 30 </TH> <TD> Camiseta <I>Cinem@s</I> </TD> </TR> <TR> <TH> 35 </TH> <TD> Pelcula en DVD o VHS </TD> </TR> <TR> <TH> 40 </TH> <TD> Reproductor de CDs porttil </TD> </TR> </TABLE>

3.6.6. INSERCIN DE IMGENES


Las imgenes son un elemento esencial para disear pginas elegantes. Sin embargo, un excesivo nmero de imgenes en una pgina puede hacer que esta pierda su esttica, a la vez que supone hacer ms lento el proceso de visualizacin (las imgenes son las partes de las pginas que ms espacio en bytes ocupan, por lo que su transferencia requiere ms tiempo que la del texto). Los visualizadores pueden admitir distintos formatos de imgenes, los ms extendidos son GIF y JPG. Cada uno de ellos tiene sus ventajas; por ejemplo, las imgenes JPG ocupan menos espacio, con la consiguiente reduccin de tiempo en la transferencia, pero tambin tienen peor calidad que el formato GIF. El comando utilizado para la insercin de imgenes es <IMG> cuya sintaxis mnima exige indicar en su parmetro SRC el fichero grfico que contiene la imagen:
<IMG SRC = "fichero grfico con la imagen">

En el caso de que el fichero grfico se encuentre almacenado en un directorio diferente al de la propia pgina web, ser preciso indicar junto con el nombre del fichero la ruta relativa necesaria para localizarlo.
El comando <IMG> tiene una serie de parmetros opcionales, los ms importantes son los que se citan a continuacin:

ALIGN: especifica el modo en el que la imagen se alinea con el texto que la rodea. Los valores que puede tomar este parmetro son: TOP, BOTTOM, MIDDLE, LEFT, RIGHT. ALT: especifica un texto alternativo que se utilizar para sustituir a la imagen en el caso de que el visualizador utilizado no pueda mostrar imgenes o esta no pueda ser localizada o cargada.

79

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

HEIGHT y WIDTH: indican al navegador la altura y la anchura en pxeles de la imagen. Si estas dimensiones no corresponden con las reales la imagen ser escalada. BORDER: indica la anchura del borde que rodear a la imagen en la pgina. HSPACE y VSPACE: fijan mrgenes horizontales y verticales a dejar entre la imagen y el texto que la rodea. Una opcin interesante es insertar una imagen como fondo de la pgina. La forma de hacerlo es utilizando el parmetro BACKGROUND al mismo tiempo que se declara el inicio del cuerpo del documento:
<BODY BACKGROUND="Fondo.gif">

En este caso la imagen se repetir tantas veces como sea necesario para cubrir todo el rea visible de la pgina. Ejemplo 3.8: La pgina de inicio de Cinem@s que se vio en la Figura 3.1 incorpora varias imgenes. La pgina est dividida en dos reas diferentes, correspondientes a lo que en HTML se denomina marcos o frames, en la de la parte superior se incluyen tres imgenes que han sido insertadas dentro de una tabla para poder posicionarlas en la pgina de una manera sencilla. El cdigo siguiente muestra la construccin de esa tabla y la insercin de las tres imgenes:
<TABLE WIDTH="100%" BORDER=1> <TR BORDERCOLOR="#FFFFFF" BGCOLOR="#0066CC"> <TH WIDTH=110> <IMG SRC="images/CARRETEPELI1.gif" WIDTH=77 HEIGHT=60></TH> <TH WIDTH ="*"> <IMG SRC="images/logo.gif" WIDTH=143 HEIGHT=73> </TH> <TH WIDTH =110> <IMG SRC="images/CARRETEPELI1.gif" WIDTH=77 HEIGHT=60></TH> </TR> </TABLE>

80

CREACIN DE PGINAS WEB MEDIANTE EL LENGUAJE HTML

3.6.7. TRATAMIENTO DEL COLOR


En el ltimo ejemplo se utiliz el parmetro BGCOLOR para definir un color de fondo para determinadas celdas la tabla. El valor de ese parmetro es una cadena de caracteres con la codificacin hexadecimal de un color. En esta seccin se explica el significado de este tipo de codificaciones. Todo color en HTML viene definido por su formato RGB (Red-Green-Blue), identificado mediante un cdigo numrico de seis dgitos hexadecimales precedidos del signo "#". Segn este formato, todo color es una combinacin de los tres colores bsicos: rojo (R), verde (G) y azul (B); cada uno de ellos puede expresarse desde la ausencia de color (valor 0) a saturacin de color (255). La expresin de los valores debe hacerse en forma hexadecimal, el valor mnimo (0) se expresa como 00, y el mximo (255) como FF. De esta forma el cdigo de un color estar formado por 6 dgitos hexadecimales: Los dos primeros dgitos indican la componente del color primario rojo. Los dos dgitos intermedios indican la componente del color primario verde. Los dos ltimos dgitos indican la componente azul.

La Tabla 3.4 muestra los cdigos hexadecimales de algunos de los colores habituales. Para alguno de esos colores HTML acepta la utilizacin de identificadores alfanumricos, por ejemplo, el color azul puede ser identificado como blue o el color rojo como red.
Color Blanco Azul Ciano Azul cielo Violeta Gris Turquesa Rosa Oro Magenta Cdigo #FFFFFF #0000FF #00FFFF #3299CC #4F2F4F #C0C0C0 #7093DB #BC8F8F #CC7F32 #FF00FF Color Negro Verde Verde mar Verde oscuro Verde lima Salmn Marrn Naranja Rojo Amarillo Cdigo #000000 #00FF00 #238E6B #2F4F2F #32CC32 #6F4242 #A52A2A #CC3232 #FF0000 #FFFF00

Tabla 3.4 Codificacin RGB de colores habituales

Los editores de HTML suelen disponer de una paleta de colores para facilitar la utilizacin de los mismos sin tener que realizar conversiones a formato hexadecimal.

81

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

En el momento de declarar el cuerpo del documento HTML mediante el comando <BODY>, se pueden utilizar una serie de parmetros para indicar el color de distintos elementos que intervienen en la pgina como el fondo, el texto y los enlaces:

BGCOLOR : TEXT : LINK : VLINK :

permite dar un color al fondo de la pgina. permite indicar el color del texto. permite designar el color de los enlaces an no visitados. permite designar el color de los enlaces ya visitados.

Ejemplo 3.9: Si se desea que el fondo de la pgina sea de color azul oscuro, el texto amarillo (combinacin de rojo y verde a partes iguales), el texto asociado a los enlaces no visitados en color verde y el de los visitados en rojo, la definicin del cuerpo del documento debera hacerse de la siguiente manera:
<BODY BGCOLOR="#OOOOCC" TEXT="#FFFFOO" LINK="#OODDOO" VLINK="#FFOOOO">

3.6.8. ENLACES O HIPERVNCULOS


Los enlaces permiten la navegacin a travs de la informacin de una pgina a puntos concretos de la misma pgina, a otras pginas diferentes de un mismo sitio web o a cualquier pgina en Internet. Todo enlace consta de dos elementos esenciales: un elemento de enlace y un destino. El elemento de enlace puede ser texto, una imagen o ambas cosas, y la activacin se produce mediante un "click" del ratn sobre l. El elemento de enlace debe ser sealado encerrndolo entre los comandos <A> y </A>. En cuanto al destino del enlace, este puede ser otro documento HTML, cualquier punto intermedio dentro del documento HTML en curso o de otro documento HTML, e incluso cualquier otro documento de otro tipo (binarios, imgenes,...). El destino del enlace se define mediante el parmetro HREF del comando <A>. Ejemplo 3.10: La pgina de inicio de Cinem@s (Figura 3.1) tiene un conjunto de enlaces que dan acceso a las restantes pginas del sitio. Estos enlaces se encuentran situados en una tabla que consta de tres filas y tres columnas, estando la columna central reservada

82

CREACIN DE PGINAS WEB MEDIANTE EL LENGUAJE HTML

para una imagen. El cdigo que define esa estructura tabular con los enlaces correspondientes es el que se incluye a continuacin:
<TABLE CELLSPACING=2 CELLPADDING=5 WIDTH=100%> <TR ALIGN="center" BGCOLOR="#0066CC"> <TD WIDTH=25%> <A HREF="proyecciones.php"> <FONT SIZE=4 COLOR="#FFFFFF"> Nuestra cartelera</FONT> </A> </TD> <TD WIDTH=50% ROWSPAN=4> <IMG SRC="images/cineportada.jpg" WIDTH="295" HEIGHT="303"> </TD> <TD WIDTH=25%> <A HREF="salas.htm"> <FONT SIZE=4 COLOR="#FFFFFF"> Nuestras salas</FONT> </A> </TD> </TR> <TR ALIGN=center BGCOLOR="#0066CC"> <TD> <A HREF="clientes.htm"> <FONT SIZE=4 COLOR="#FFFFFF"> rea de clientes</FONT> </A> </TD> <TD> <A HREF="entradas.htm"> <FONT SIZE=4 COLOR="#FFFFFF"> Compra de entradas</FONT> </A> </TD> </TR> <TR ALIGN=center BGCOLOR="#0066CC"> <TD> <A HREF="estrenos.htm"> <FONT SIZE=4 COLOR="#FFFFFF"> Prximos estrenos</FONT> </A> </TD> <TD> <A HREF="foros/index.php"> <FONT SIZE=4 color="#FFFFFF"> El foro Cinem@s</FONT>

83

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

</A> </TD> </TR> </TABLE>

Como puede apreciarse, los diferentes enlaces apuntan hacia nuevas pginas HTML o documentos PHP. Un caso particular de enlaces son los denominados marcadores o anclas internos, enlaces a puntos concretos de un documento HTML. Para crear un marcador se debe, en primer lugar, sealar el punto de destino con el siguiente comando:
<A NAME=" nombre_marcador"> Texto opcional </A>

El nombre del marcador no puede contener ni espacios en blanco ni los caracteres =, +, <, >, , / y %. Adems, estos nombres son sensibles al uso de maysculas y minsculas. Una vez marcado el destino, se debe crear el enlace, para ello la sintaxis es: Si el lugar de destino y el enlace se encuentran en el mismo documento, el valor del parmetro HREF debe ser el nombre dado al marcador precedido del signo "#":

<A HREF="# nombre_marcador"> Elemento de enlace </A> Cuando el lugar de destino se encuentra en un documento diferente al del enlace, el parmetro HREF toma como valor el URL absoluto o relativo del documento de destino, seguido del signo "#" y el nombre del marcador:
<A HREF="URLdestino#nombre_marcador"> Elemento de enlace </A>

Finalmente, otro de los enlaces o hipervnculos ms caractersticos es el que permite enviar un correo electrnico a una determinada direccin. El comando a utilizar vuelve a ser el comando <A> pero con un valor diferente para el parmetro HREF:
<A HREF="MAILTO:admin@cinemas.es">Enviar mensaje</A>

84

CREACIN DE PGINAS WEB MEDIANTE EL LENGUAJE HTML

Como se pueda apreciar, el valor de HREF es en este caso la palabra MAILTO seguida de dos puntos y la direccin de correo electrnico de destino.

3.7. MARCOS O FRAMES


Una de las opciones ms interesantes para el diseo y presentacin de sitos web es la utilizacin de los denominados marcos o frames. Los marcos en HTML permiten la creacin de un documento web con varias partes independientes, cada una de las cuales puede mostrar diferentes pginas web, lo que permite dotar a un sitio de cierto dinamismo a la vez que mejorar su funcionalidad y apariencia. Uno de los usos ms frecuentes de los marcos es el de reservar una zona de la pgina para mostrar cierta informacin siempre visible o fija, por ejemplo un logotipo de una empresa, un ndice con enlaces a otras pginas, etc. De esta forma, cuando se activa uno de esos enlaces se puede acceder a su contenido en otra parte de la pgina manteniendo tambin visible la parte fija. Esto es precisamente lo que se ha realizado en el diseo del sitio web de Cinem@s, cuya pgina de inicio muestra la Figura 3.1 y que contiene dos marcos: 1. El marco superior muestra en todo momento el logotipo de la empresa con dos imgenes flanquendole a ambos lados. 2. El marco inferior, o principal, contiene la tabla con los enlaces a las restantes pginas del sitio. Cada vez que un enlace se active se cargar en esa parte de la ventana la correspondiente pgina, pero quedando fijo el marco que contiene el logotipo.

3.7.1. CONSTRUCCIN DE PGINAS CON MARCOS


Los documentos HTML que contienen marcos de forma general suelen recibir el nombre de pginas de marcos, y tienen una estructura diferente a la de los documentos sin marcos. Un documento HTML tiene dos grandes secciones definidas por las etiquetas <HEAD>, para indicar la cabecera del documento, y <BODY> para introducir el cuerpo de la pgina. Sin embargo, esta estructura cambia en los documentos con marcos. Para crear un documento con marcos se debe crear una pgina web con una cabecera pero se sustituye el cuerpo por unas directivas o etiquetas especficas <FRAMESET> y </FRAMESET> mediante las que se define el conjunto de marcos del documento.

85

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Los parmetros que recibe el comando de definicin de marcos (<FRAMESET>) son: COLS: establece que la disposicin de los marcos ser en columnas, dividiendo la pantalla verticalmente en columnas. Adems, indica la extensin de cada espacio generado. Este parmetro recibe como valor una lista con las dimensiones de cada columna separadas por comas, cada una de estas dimensiones puede darse de tres formas: o o o Un nmero que represente la anchura en pxeles de la columna. Un porcentaje que la columna ocupar sobre el total del espacio libre. Un asterisco, indicando que la columna se extender por todo el espacio libre de la ventana.

ROWS: establece que la disposicin de los marcos ser en filas, dividiendo la pantalla horizontalmente. Como en el caso anterior debe indicarse la extensin de cada marco y para ello toma los mismos parmetros que el atributo COLS. FRAMEBORDER: dota de borde a los marcos segn tome los valores YES o NO. BORDER: seala el grosor, en pxeles, del borde. BORDERCOLOR: establece un color concreto para el borde. FRAMESPACING: indica la separacin entre marcos tomando.

Es conveniente sealar que los marcos se crean de izquierda a derecha para las columnas y de arriba a bajo para las filas. Adems, los marcos se pueden anidar es decir, introducir unos marcos dentro de otros o subdividir un marco en otros. Hasta el momento se ha visto cmo dividir una pgina en varias reas con la directiva <FRAMESET>. Una vez realizada esa divisin es necesario definir los contenidos que se mostrarn en cada marco, para ello se utiliza la etiqueta <FRAME>, etiqueta que no tiene comando de cierre y que ir situada en cada uno de los marcos que se definan entre las etiquetas <FRAMESET>. Los parmetros que pueden acompaar a esta etiqueta permiten indicar el contenido y modificar la apariencia del marco: SRC: indica el documento que se cargar o visualizar en el marco. El valor que toma es el nombre del documento HTML o su ruta.

86

CREACIN DE PGINAS WEB MEDIANTE EL LENGUAJE HTML

NAME: asigna un nombre al marco, este nombre identificar posteriormente al marco. FRAMEBORDER: permite que aparezca visible o no el borde del marco. Los valores que puede tomar son YES o NO. MARGINHEIGHT: altura del margen a dejar respecto a los bordes del marco. MARGINWIDTH: anchura del margen a dejar respecto a los bordes del marco. SCROLLING: permite indicar si se desea mostrar una barra de desplazamiento para el marco. Los valores que puede tomar son: o o o YES: mostrar siempre barra de desplazamiento. No: sin barra de desplazamiento. AUTO: (valor por defecto) se mostrar la barra de desplazamiento cuando sea necesario (el contenido de la pgina no se puede visualizar completamente en el espacio reservado a tal efecto).

NORESIZE: si est presente indica que el usuario no podr redimensionar el marco, es decir, aumentar o reducir el tamao. Los marcos, si bien permiten enriquecer un sitio con mayor dinamismo y sensacin de interactividad, tambin pueden generar problemas derivados principalmente del navegador que utilice el usuario, puesto que determinados navegadores o versiones de estos no estn preparados para permitir mostrar pginas construidas con marcos. El diseador del sitio web debe tener en cuenta este posible problema y anticiparse a l generando un contenido alternativo que pueda ser visualizado por los usuarios con navegadores que no admitan marcos. Para la creacin de este contenido alternativo se utilizan las etiquetas <NOFRAMES> y </NOFRAMES>. Estas etiquetas permiten indicar a los navegadores que no soporten marcos que el contenido que se debe mostrar es el contenido comprendido entre ellas.

3.7.2. ENLACES EN PGINAS CON MARCOS


Una cuestin importante cuando se trabaja con pginas con marcos es sealar claramente el marco en el que se desea visualizar cada enlace. Por ejemplo, podra ser interesante que el enlace se encuentre en un marco pero que al activarlo el contenido del destino se visualice en otro; sin embargo, las opciones son mltiples:

87

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

adems de visualizarlo en un marco concreto se podra ver en una ventana nueva del navegador, en la misma ventana haciendo desaparecer la pgina de marcos,... Para realizar esta tarea de asignacin de un lugar concreto de visualizacin a cada enlace, en la creacin del vnculo se debe introducir el parmetro TARGET, siendo su valor alguno de los siguientes: "Nombre_marco": seala el nombre del marco en el que debe cargarse el destino. _blank: abre el documento vinculado en una nueva ventana del navegador sin cerrar la anterior. _parent: muestra el contenido del enlace en el anterior marco definido. Si no hay ningn marco definido se muestra a pantalla completa. _self: abre el documento en el mismo marco o ventana en el que se encuentra el vinculo (opcin por defecto). _top: muestra el contenido del enlace a pantalla completa eliminando la ventana anterior.

Hay que hacer notar al lector que la decisin de asignar el lugar en el que se deben mostrar los contenidos no es trivial, imagnese que en un sitio web tiene una pgina que consta de diferentes enlaces a otros sitios web distintos; si se decide que al seleccionar un enlace este se abra en la misma ventana del navegador, implicara que el usuario al seleccionarlo sale del sitio web. Ejemplo 3.11: A continuacin se muestra el cdigo fuente de la pgina principal de Cinem@s (Figura 3.1), que como ya se ha comentado anteriormente est constituida por dos marcos divididos horizontalmente.
<HTML> <HEAD> <TITLE>Cinem@s</TITLE> </HEAD> <FRAMESET ROWS="105,*"> <FRAME NAME="encabezado" SCROLLING="no" NORESIZE SRC="encabezado.htm" FRAMEBORDER=0> <FRAME NAME="principal" SRC="principal.htm" FRAMEBORDER =0> <NOFRAMES> <BODY>

88

CREACIN DE PGINAS WEB MEDIANTE EL LENGUAJE HTML

<P>Esta pgina usa marcos, pero su explorador no los admite.</P> </BODY> </NOFRAMES> </FRAMESET> </HTML>

Como en todo documento HTML, la etiqueta de inicio es <HTML> seguida de la cabecera del documento que contiene el ttulo de la pgina. Finalizada la cabecera del documento en una pgina normal se encuentra el cuerpo (<BODY>), pero como ya se ha comentado, en las pginas de marcos lo que sigue a la cabecera del documento es la definicin de los marcos. En este caso:
<FRAMESET ROWS="105,*">

indica que la pgina se va a dividir horizontalmente en dos filas, una superior con una altura de 105 pxeles y la inferior, que ocupar el resto de espacio libre. Posteriormente se definen los dos marcos con el comando <FRAME>:
<FRAME NAME="encabezado" SCROLLING="no" NORESIZE SRC="encabezado.htm" FRAMEBORDER=0>

Este primer comando define el marco superior, asignndole un nombre, indicando que no tendr barra de desplazamiento y que no se podr redimensionar su tamao. Adems, establece que en el marco se mostrar la pgina encabezado.htm y que no aparecer visible el borde del marco. La segunda etiqueta <FRAME> establecer la apariencia y contenido de la segunda divisin de la ventana:
<FRAME NAME="principal" SRC="principal.htm" FRAMEBORDER =0>

El segundo espacio generado por el marco se denomina principal y en l se mostrar el documento principal.htm. En la siguiente lnea se define un contenido alternativo (<NOFRAMES>) para los visitantes cuyo navegador no admita marcos. Ntese que este contenido alternativo se sita entre las etiquetas <NOFRAMES> y </NOFRAMES>, antes de cerrar la definicin de la estructura de marcos.

89

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

3.8. FORMULARIOS
Los formularios son uno de los componentes esenciales en una pgina web, ya que permiten la interaccin con el usuario, consiguiendo as recoger informacin particular sobre sus gustos, opiniones, datos personales,... Los visitantes rellenan los campos del formulario y haciendo clic en un botn del propio formulario, se envan los datos al servidor en el que reside el sitio web, para que sean procesados, en su caso, por este. Especialmente tiles sern los formularios para actuar de interfaz de usuario en los programas PHP. Los formularios estn compuestos por campos de diferentes tipos (cuadros de texto, casillas de verificacin, botones de opciones, mens desplegables,...) en los que el usuario introduce los datos, y dispone de botones que ejecutan las acciones de enviar o borrar los datos del formulario. Para crear un formulario se utiliza el comando <FORM> y una serie de comandos especiales para crear cada uno de sus campos. Este comando <FORM> admite dos parmetros fundamentales: El parmetro ACTION indica quin ser el encargado de recibir y, en su caso procesar, los datos que se envan desde el formulario. Este parmetro puede tomar como valor: o El URL de un programa CGI alojado en el servidor y encargado de procesar la informacin recibida mediante un formulario. o El URL de un archivo, por ejemplo en PHP, creado ad hoc para procesar el formulario. o Una direccin de correo electrnico a la que ser enviada la informacin de los campos del formulario. El parmetro METHOD indica cmo debe realizarse la transferencia de los datos contenidos en el formulario. Los valores que puede tomar son: o GET: enva los datos formando parte del URL. o POST: transmite los datos separados del URL.

La diferencia entre estos dos mtodos de envo ser analizada en detalle en el Captulo 5, cuando se estudie la forma en la que PHP recibe y procesa los datos procedentes de formularios.

90

CREACIN DE PGINAS WEB MEDIANTE EL LENGUAJE HTML

Una vez delimitado el formulario entre los comando <FORM> y </FORM>, deben indicarse entre ellos los comandos necesarios para construir cada uno de sus campos. Un formulario consta de campos de diferentes tipos y cada uno de esos campos se define utilizando un comando <INPUT>, acompaado de un parmetro TYPE que ser el que indique el tipo de campo. Los valores que puede tomar este parmetro TYPE son los que muestra la Tabla 3.5. Otros parmetros del comando <INPUT> son: NAME: nombre que utilizar el programa encargado de procesar los datos para referirse al campo. VALUE: utilizado para dar al campo valores por defecto. SIZE: establece el tamao del campo (nmero de caracteres). MAXSIZE: indica el nmero mximo de caracteres que puede recibir el campo.
Valor de TYPE text password radio checkbox submit reset button hidden Tipo de campo Campo de texto. Campo especial para introducir contraseas. Botn de radio. Cajas de seleccin. Botn de envo de la informacin. Botn de borrado de la informacin. Botn de accin. Campo oculto.

Tabla 3.5 Tipos de campos de formulario

Adems de los campos de texto definidos con el comando <INPUT>, se pueden crear tambin otro tipo de campos: las reas de texto. Se trata de campos de texto que ocupan ms de una lnea. La definicin de un rea de texto responde al siguiente esquema:
<TEXTAREA NAME= "nombre_campo" ROWS=n COLS=m> </TEXTAREA>

donde n es el nmero de filas y m el nmero de columnas del rea de texto. Otro recurso de los formularios son las listas desplegables, que definen campos con valores predefinidos. Estas listas se crean igualmente con un comando especial: el

91

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

comando <SELECT>. Cada uno de los elementos de la lista se define con el comando <OPTION>. Ejemplo 3.12: El siguiente cdigo crea un men desplegable con cuatro opciones, apareciendo la primera seleccionada por defecto:
<SELECT NAME="nombre"> <OPTION SELECTED> Opcin por defecto <OPTION> Opcin 2 <OPTION> Opcin 3 <OPTION> Opcin 4 </SELECT>

Si en el comando <SELECT> aparece el parmetro MULTIPLE la lista ser de seleccin mltiple, adems la opcin seleccionada por defecto tiene que indicarse colocando el parmetro SELECTED en el correspondiente comando <OPTION>. Para concluir este captulo se incluyen a continuacin ejemplos de formularios que forman parte del sitio web de Cinem@s y que sern utilizados en los Captulos 16 y 17 para efectuar diversas operaciones de acceso a bases de datos. Ejemplo 3.13: Cinem@s incluye en su sitio web una pgina en la que sus clientes pueden registrarse y acceder a la consulta de sus datos. La pgina de este rea de clientes es la que se muestra en la Figura 3.7. Dicha pgina incluye dos formularios situados dentro de una tabla de dos columnas, el primero permite introducir un nmero de usuario y contrasea, mientras que el segundo sirve para enviar todos los datos necesarios para registrarse como cliente. El cdigo completo de la pgina del rea de clientes es:
<HTML> <HEAD><TITLE>rea de clientes</TITLE></HEAD> <BODY TEXT=blue> <!-- Barra de navegacin del sitio --> <TABLE WIDTH="100%" BORDER BGCOLOR=#99CCFF> <TR> <TH WIDTH="16%"> <A HREF="principal.htm">Pgina principal</A></TH> <TH WIDTH="17%"> <A HREF="proyecciones.php">Nuestra cartelera</A></TH>

92

CREACIN DE PGINAS WEB MEDIANTE EL LENGUAJE HTML

<TH WIDTH="17%"> <A HREF="salas.htm">Nuestras salas</A></TH> <TH WIDTH="17%"> <A HREF="entradas.htm">Compra de entradas</A></TH> <TH WIDTH="17%"> <A HREF="estrenos.htm">Prximos estrenos</A></TH> <TH WIDTH="16%"> <A HREF="foros/index.php">Foro Cinem@s</A></TH> </TR> </TABLE> <H1 ALIGN="center">rea de clientes</H1> <TABLE CELLSPACING=12> <TR> <TD WIDTH=35%> En Cinem@s queremos premiar la fidelidad de nuestros clientes. Por ello, te ofrecemos la posibilidad de registrarte como cliente y por cada entrada que compres online acumulars puntos canjeables por regalos o entradas gratuitas. <P> Si ya eres cliente registrado, entra en tu pgina: <!-- Formulario de acceso al rea personal --> <FORM ACTION=accesocliente.php METHOD=POST> Nmero de cliente: <INPUT TYPE=text SIZE="5" NAME="numcliente"><BR> Contrasea: <INPUT TYPE=password SIZE="6" NAME="pass"><BR> <INPUT TYPE=submit VALUE=Entrar> </FORM> </TD> <TD WIDTH=65%> <I>Si an no te has registrado hazlo aqu y comienza a disfrutar de enormes ventajas</I> <!-- Formulario de inscripcin de clientes --> <FORM ACTION="nuevocliente.php" METHOD=POST> <TABLE> <TR> <TD>Nombre (*):</TD> <TD><INPUT TYPE=text SIZE="40" NAME="nombre"></TD> </TR> <TR> <TD>Direccin:</TD> <TD><INPUT TYPE=text SIZE="50" NAME="direccion"></TD> </TR> <TR> <TD>NIF (*):</TD> <TD><INPUT TYPE=text SIZE="9" NAME="nif"></TD>

93

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

</TR> <TR> <TD>Fecha de Nacimiento:</TD> <TD>da <INPUT TYPE=text SIZE="2" NAME="dianac"> mes <INPUT TYPE=text SIZE="2" NAME="mesnac"> ao <INPUT TYPE=text SIZE="4" NAME="annonac"> </TD> </TR> <TR> <TD>Telfono:</TD> <TD><INPUT TYPE=text SIZE="20" NAME="telefono"></TD> </TR> <TR> <TD>Email:</TD> <TD><INPUT TYPE=text SIZE="30" NAME="email"></TD> </TR> </TABLE> Contrasea (*): <INPUT TYPE=password SIZE="6" NAME="pass1"> Repita su contrasea: <INPUT TYPE=password SIZE="6" NAME="pass2"> <BR> <FONT SIZE=-1> (*) campos obligatorios</FONT> <BR> <INPUT TYPE=submit VALUE=Enviar> <INPUT TYPE=reset VALUE=Borrar> </FORM> </TD> </TR> </TABLE> </BODY> </HTML>

Ejemplo 3.14: Para conocer la opinin de sus clientes y que estos compartan sus impresiones, Cinem@s implementar un foro (vase Captulo 17). Los mensajes sern enviados al foro a travs de una pgina con un formulario como el que puede verse en la Figura 3.8, y cuyo cdigo completo se incluye a continuacin:
<H1>Nuevo mensaje para el foro</H1> <FORM ACTION="nuevomensaje.php"> <TABLE> <INPUT TYPE="hidden" NAME="respuestas" VALUE="0"> <INPUT TYPE="hidden" NAME="identificador" VALUE="">

94

CREACIN DE PGINAS WEB MEDIANTE EL LENGUAJE HTML

<TR> <TD>Autor:</TD> <TD><INPUT TYPE="text" NAME="autor" SIZE=40></TD> </TR> <TR> <TD>Ttulo del mensaje:</TD> <TD> <INPUT TYPE="text" NAME="titulo" SIZE=40 VALUE=""> </TD> </TR> <TD>Mensaje:</TD> <TD><TEXTAREA NAME="mensaje" ROWS=6 COLS=30></TEXTAREA> </TD> </TR> <TR><TD> <INPUT TYPE=submit VALUE="Enviar"> </TD></TR> </TABLE> </FORM>

Este ltimo formulario tiene dos campos ocultos cuya utilidad se podr ver cuando se desarrolle completamente la pgina destino nuevomensaje.php en el Captulo 17.

95

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Figura 3.7 rea de clientes de Cinem@s

96

CREACIN DE PGINAS WEB MEDIANTE EL LENGUAJE HTML

Figura 3.8 Formulario para el envo de mensajes al foro

97

INTRODUCCIN A PHP

4.1. EL LENGUAJE PHP


PHP es un lenguaje interpretado del lado del servidor que se caracteriza por su potencia, versatilidad, robustez y modularidad. Los programas escritos en PHP son embebidos directamente en el cdigo HTML y ejecutados por el servidor web a travs de un intrprete antes de transferir al cliente que lo ha solicitado un resultado en forma de cdigo HTML puro. Al ser un lenguaje que sigue la corriente open source, tanto el intrprete como su cdigo fuente son totalmente accesibles de forma gratuita en la red. En concreto, la direccin oficial en la que puede descargarse es: http://www.php.net/ Por su flexibilidad, PHP resulta un lenguaje muy sencillo de aprender; especialmente para programadores familiarizados con lenguajes como C, Perl o Java, debido a las similitudes de sintaxis entre ellos. Por supuesto, es un lenguaje multiplataforma; los programas funcionan igual sobre diferentes plataformas, trabajando sobre la mayora de servidores web y estando preparado para interactuar con ms de 20 tipos de bases de datos. No obstante, al

99

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

ser un lenguaje inicialmente concebido para entornos Unix, es sobre este sistema operativo sobre el que se pueden aprovechar mejor sus prestaciones. En comparacin con otro tipo de tecnologas similares, PHP resulta ms rpido, independiente de la plataforma y ms sencillo de aprender y utilizar. Todas estas caractersticas han hecho de este lenguaje uno de los que mayor crecimiento ha experimentado en los ltimos aos, desde su aparicin en 1994. Es de destacar especialmente la facilidad para la conectividad con sistemas gestores de bases de datos a travs de un gran nmero de funciones especializadas. En este libro en concreto se analizar la conectividad con el sistema gestor MySQL. Esa facilidad de conexin ha hecho que PHP sea actualmente uno de los lenguajes ms utilizados para la generacin de pginas dinmicas, no solo personales sino tambin portales de empresas y organizaciones. Inicialmente diseado para realizar poco ms que contadores y libros de visita de pginas, en la actualidad PHP permite realizar una multitud de tareas tiles para el desarrollo web. Por ejemplo, dispone, entre otras, de:
Funciones de correo electrnico que pueden ser utilizadas para programar completos sistemas de correo electrnico va web. Funciones de administracin y gestin de bases de datos especficas para la mayora de gestores comerciales y funciones para conexiones ODBC con bases de datos en sistemas Microsoft. Funciones de gestin de directorios y ficheros, incluso para la transferencia mediante FTP. Funciones de tratamiento de imgenes y libreras de funciones grficas Funciones de generacin y lectura de cookies. Funciones para la generacin de documentos PDF.

A la innumerable cantidad de funciones predefinidas en PHP deben aadirse, por supuesto todas aquellas funciones propias de cada programador, y que pueden ser reutilizadas e intercambiadas a travs de foros especficos con otros programadores.

4.2.

ORGENES Y EVOLUCIN DEL LENGUAJE

En 1994 un programador de Groenladia, Rasmus Lerdorf, cre el lenguaje PHP con el objetivo inicial de hacer un seguimiento de los visitantes de su pgina personal. El sistema desarrollado originalmente por Lerdorf estaba formado por un conjunto 100

INTRODUCCIN A PHP

de scripts programados en Perl que posteriormente seran reimplementados en lenguaje C con el objeto de obtener mayores funcionalidades. El significado original del nombre PHP no era otro que Personal Home Page. Adicionalmente Lerdorf desarroll un sistema de procesamiento de formularios, sistema que fue bautizado como FI (Form Interpreter), constituyendo ambos sistemas la primera versin del actual lenguaje PHP: el PHP/FI. Lerdorf decidi hacer pblico el cdigo fuente de sus programas para que cualquiera pudiera utilizarlo; de esta forma el sistema rpidamente comenz a ser utilizado por otros usuarios de Internet y entre todos comenz a mejorarse el lenguaje, de manera que el actual PHP es progresivamente construido por colaboradores desinteresados que implementan nuevas funciones en nuevas versiones del lenguaje. La versin PHP 1 aparece en la primavera de 1995 y el PHP 2 fue desarrollado entre 1995 y 1997. En 1997 se estimaba que un 1% de los dominios de Internet hacan uso del PHP 2. A mediados de 1997 se produce un cambio importante en el lenguaje, se reprogram el analizador sintctico, se incluyeron nuevas funcionalidades como el soporte a nuevos protocolos de Internet y a la mayora de los sistemas gestores de bases de datos comerciales. Con estas nuevas funcionalidades nace el PHP 3, adems se decide rebautizar el lenguaje dando un nuevo significado a sus siglas: preprocesador de hipertexto. El PHP 3 se caracterizaba por su gran extensibilidad y por el diseo de una sintaxis mucho ms potente y consistente, adems del soporte de sintaxis orientado a objeto. Se estima, que en su apogeo el PHP 3 lleg a estar instalado sobre el 10% de los servidores web de Internet. En el ao 2000 surge la siguiente versin del lenguaje: el PHP 4, con una mayor independencia del servidor web y con un mayor nmero de funciones disponibles. Con esta versin se redefine el ncleo del programa, generando un nuevo motor que mejora la ejecucin de aplicaciones complejas, este nuevo motor es bautizado como motor Zend, en honor a sus autores: Zeev Zuraski y Andi Gutmans, quienes al mismo tiempo fundan la empresa Zend (http://www.zend.com) con el objetivo de ofrecer productos complementarios y herramientas para el desarrollo en PHP. La actual versin del lenguaje, PHP 5, fue lanzada oficialmente en septiembre 2004. Hoy en da se estima que PHP es usado por cientos de miles programadores y que est presente en ms del 20% de los servidores web Internet. Es el sexto lenguaje de programacin ms utilizado en el desarrollo software23, nicamente por detrs de C, Java, C++, Visual Basic y Perl.
23

de de en de

Estimacin de la TIOBE Programming Community en noviembre de 2004. Fuente: http://www.tiobe.com/tpci.htm

101

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Como prueba del crecimiento experimentado en estos aos, la Figura 4.1 muestra una grfica con la evolucin de dominios y direcciones IP que hacen uso de PHP. Como puede apreciarse, a inicio de 2005 ms de 18 millones de dominios y 1,3 millones de direcciones IP en Internet hacan uso de esta tecnologa.

Figura 4.1 Evolucin de la presencia de PHP en Internet (Fuente: http://www.php.net/usage.php )

4.3. PROGRAMACIN EN PHP: PRIMEROS EJEMPLOS


Para empezar a programar en PHP se necesita disponer de una serie de elementos bsicos: 1. Al ser PHP un lenguaje de programacin del lado del servidor, lo primero que se requiere es un servidor web. PHP puede trabajar con la totalidad de los servidores web ms conocidos. Lo ms habitual es encontrar PHP sobre un servidor Apache, pero tambin es posible instalarlo sobre los servidores de Microsoft: Microsoft Internet Information Server y Personal Web Server. Otros servidores posibles seran: Netscape, iPlanet, Oreilly Website Pro Server, Caudium, Xitami, OmniHTTPd,... En cuanto al sistema operativo a utilizar tambin hay diferentes posibilidades: Linux, Unix, Microsoft Windows, Mac OS X o RISC OS.

102

INTRODUCCIN A PHP

2. Sobre el servidor web es preciso instalar el intrprete de PHP. Este intrprete puede obtenerse en la direccin http://www.php.net y est disponible para varias versiones de sistemas operativos. En el proceso de instalacin debe configurarse adems el servidor web y decidir si dicho intrprete se ejecutar como mdulo o como un CGI independiente. 3. Una vez instalados el servidor web y el intrprete de PHP, ya se est en condiciones de crear las primeras pginas dinmicas con PHP. En principio para la creacin del cdigo fuente no es necesario disponer de ningn editor especial, cualquier editor de texto o de HTML podra ser utilizado. Sin embargo, en Internet pueden encontrarse algunos editores gratuitos especficos para el lenguaje PHP y que adems permiten probar el funcionamiento de los programas sin necesidad de salir del entorno de edicin. Una vez instalados sobre el equipo a utilizar todas las herramientas necesarias, es el momento de crear el primer programa en PHP. Por supuesto, se tratar de un programa muy simple y cuyo inters es meramente educativo. Ejemplo 4.1: En un nuevo documento escriba el siguiente cdigo y grbelo en un fichero con la extensin .php, por ejemplo con el nombre primer.php.
<HTML> <HEAD> <TITLE> Primer ejemplo </TITLE> </HEAD> <BODY> <U> <?PHP echo "Este es mi primer programa en PHP"; ?> </U> </BODY> </HTML>

Como puede apreciarse, el cdigo tiene la estructura bsica de cualquier documento HTML, con las correspondientes etiquetas que van sealando la cabecera del documento, el ttulo, el cuerpo,... Pero tambin puede observarse cmo dentro del cdigo se encuentra un bloque, sealado con letra negrita, con una sintaxis diferente. Este bloque es el que inserta dentro del documento un programa o script en PHP. En este caso se trata de un programa que simplemente usa la funcin echo para escribir un mensaje. 103

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

El documento anterior debe ser guardado con la extensin .php y no con la extensin .htm o .html habitual en los documentos HTML. De esta manera, cuando un cliente solicite al servidor la pgina, este ltimo sabr que esa pgina incorpora un programa PHP y que por tanto deber ser pasado al intrprete de PHP antes de remitir la pgina al cliente que la ha solicitado. Para hacer pblica esta primera pgina, el documento primer.php deber ser guardado en el directorio que el servidor web tenga establecido para alojar las pginas. Para probar que la pgina funciona correctamente, sin necesidad de tener una salida real a Internet, se podra abrir el navegador web en el propio equipo que tiene instalado el servidor web y en la barra de direcciones escribir: http://localhost/primer.php Por supuesto, es necesario que el servidor web se encuentre en marcha. En este caso se est usando el mismo ordenador como servidor y como cliente. El nombre localhost que aparece en la direccin podra ser tambin sustituido por el nombre que identifique al equipo. En la ventana del navegador se podr ver el resultado esperado (Figura 4.2).

Figura 4.2 Ejecucin del primer programa en PHP

104

INTRODUCCIN A PHP

La pgina generada muestra el mensaje indicado en el programa pero subrayado. Esto ltimo es debido a que el script en el documento se encontraba entre las etiquetas <U> y </U> que indican el estilo subrayado en HTML. Si desde el navegador se solicita a este que muestre el cdigo fuente de la pgina web que ha recibido, se podra comprobar que dicho cdigo es: <HTML> <HEAD> <TITLE> Primer ejemplo </TITLE> </HEAD> <BODY> <U> Este es mi primer programa en PHP</U> </BODY> </HTML> En este cdigo recibido en el cliente no hay ningn elemento que no sea HTML puro. Esto es debido a que el servidor web, antes de transferir la pgina al cliente, se la envi al intrprete de PHP y este ejecut el programa que estaba integrado en el documento. Al ejecutar la llamada a la funcin echo del programa, se escribi el correspondiente mensaje directamente sobre el cdigo transferido al cliente. Con este sencillo ejemplo puede verse claramente la forma de trabajo de una tecnologa del lado del servidor como es PHP. Para probar este ejemplo, se ha utilizado un mismo ordenador en un doble papel: como servidor web y como cliente que realiza una peticin al servidor. Es conveniente destacar que para poder hacer esto es necesario que la peticin de la pgina sea realizada desde la direccin del navegador usando el protocolo http, tal como se ha hecho anteriormente, y no abriendo directamente el documento como archivo local.
La extensin .php es la ms habitual en los documentos que contienen scripts PHP, sin embargo es posible tambin encontrar documentos con otras extensiones como .php3 para documentos que incluyan programas en PHP 3, .php4 para los programas en PHP 4, o incluso la extensin .phtml, actualmente en desuso.

NOTA

En Ejemplo 4.1 se ha utilizado la funcin echo para escribir un mensaje en la pgina web. Realmente echo es una sentencia del lenguaje ms que una funcin, obsrvese la no necesidad de utilizar los parntesis para pasar el argumento. En

105

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

PHP existe otra funcin que se puede utilizar para ese mismo cometido: la funcin print(). En cualquiera de los dos casos, al producirse la escritura sobre el cdigo HTML que ser pasado al cliente, es posible utilizar esas funciones para generar cdigo HTML dentro de un script PHP. Por ejemplo, el siguiente programa genera una tabla HTML con el ttulo y director de una pelcula que se encuentran almacenados en sendas variables ($t y $d). Ejemplo 4.2:
<?PHP $t = "Todo sobre mi madre"; $d = "Pedro Almodvar"; print("<TABLE BORDER>"); print("<TR> <TH>Ttulo</TH> <TH>Director</TH> </TR>"); print("<TR> <TD> "); print($t); print("</TD> <TD> "); print($d); print("</TD> </TR> </TABLE>"); ?>

El programa anterior generara el cdigo HTML necesario para que el cliente que accede a la pgina pueda ver una tabla como la siguiente:

Ttulo

Director

Todo sobre mi madre Pedro Almodvar

En este programa se ha utilizado la funcin print() en lugar de echo() para escribir las cadenas, adems se hace uso de dos variables inicializadas en el propio programa. Cuando ms adelante se presenten las diferentes formas de dar cadenas de caracteres en PHP y su relacin con las variables, se ver una forma de optimizar el cdigo anterior reduciendo el nmero de sentencias de escritura. Una de las funciones predefinidas en PHP es la funcin phpinfo()que genera diversas tablas con gran cantidad de informacin sobre la configuracin de PHP en el servidor, como por ejemplo, versin del lenguaje, ubicacin del fichero de inicializacin, opciones de compilacin, sistema operativo del servidor,...

106

INTRODUCCIN A PHP

Ejemplo 4.3: A continuacin se muestra un documento HTML que incorpora un script que hace una llamada a la funcin phpinfo():
<HTML> <HEAD><TITLE> Informacin PHP</TITLE></HEAD> <BODY> Opciones de configuracin de PHP: <?PHP phpinfo(); ?> </BODY> </HTML>

Ejemplo 4.4: Finalmente, se incluye a continuacin un nuevo sencillo ejemplo de programa en PHP que es capaz de detectar la hora actual del servidor y mostrar esa informacin con un formato preestablecido por el programador. En este caso se utiliza un nueva funcin predefinida del lenguaje: la funcin date(), que permite generar una cadena de caracteres con una fecha u hora dada y de acuerdo a una cadena de formato. En el captulo destinado a funciones predefinidas de PHP, se estudiarn esta y otras funciones de tratamiento de fechas y horas.
<HTML> <HEAD> <TITLE> Cuarto ejemplo </TITLE> </HEAD> <BODY> Bienvenido a esta pgina, la fecha y hora actual es:<BR> <B> <?PHP print(date("d \de M \de Y, H:i:s")); ?> </B> </BODY> </HTML>

La pgina que el usuario podra visualizar con su navegador tendra un contenido como el siguiente:
Bienvenido a esta pgina, la fecha y hora actual es: 27 de Nov de 2004, 22:43:59

107

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

4.4. FORMAS DE INCRUSTAR EL CDIGO PHP EN LOS DOCUMENTOS HTML


Como ha quedado de manifiesto en el primer ejemplo visto en la seccin anterior, el cdigo de los programas PHP se incrusta directamente entre el cdigo HTML. Cuando el documento es pasado al intrprete de PHP, este debe saber diferenciar lo que realmente es cdigo PHP de lo que son etiquetas de HTML. La forma de conseguirlo es utilizar etiquetas o comandos especiales que sealen el inicio y fin de cada script PHP; todo lo que quede fuera de esas etiquetas ser ignorado por el intrprete de PHP. Existen cuatro formas diferentes de diferenciar el cdigo PHP, dos de ellas estn siempre disponibles y las dos restantes dependen de la configuracin particular del servidor. Las dos formas siempre disponibles de delimitar el cdigo PHP son:
<?PHP ......................... ......................... ......................... ?>

o
<SCRIPT LANGUAGE="php"> ......................... ......................... ......................... </SCRIPT>

De estas dos formas, la primera es la sintaxis especfica del lenguaje PHP, mientras que la segunda es la sintaxis general que se utiliza para insertar scripts programados en diferentes lenguajes. Las otras dos formas de incrustar el cdigo PHP son:
<? ......................... ......................... ......................... ?>

108

INTRODUCCIN A PHP

<% ......................... ......................... ......................... %>

La primera de estas sintaxis es la que se denomina de "etiquetas de formato corto" y requiere que el servidor tenga configurado su fichero php.ini para aceptarlas. Finalmente, la ltima sintaxis es la que resulta compatible con ASP, pero tampoco es aceptada por todos los servidores. De las cuatro formas de incrustar el cdigo PHP, la ms recomendable es la primera (<?PHP .... ?>), por varias razones: por ser la especfica de PHP, por estar disponible en cualquier servidor, y por ser adems la nica que permite incrustar cdigo PHP tambin en XML y en XHTML. A lo largo de este libro se utilizar siempre esta sintaxis para insertar los scripts PHP. Una de las caractersticas destacadas de PHP es que los scripts pueden ser divididos en bloques, y aadir entre los bloques cdigo HTML puro. Esto resulta especialmente til cuando dentro de un programa se necesita escribir un texto que requerira en otro caso el uso de una serie de funciones echo. Ejemplo 4.5:
Dado el script siguiente: <?php if ($x<0) { echo "<B> Valor negativo </B>"; echo "<BR> Vuelva a intentarlo"; } else { echo "<B> Valor positivo </B>"; echo "<BR> Correcto"; } ?>

se podra conseguir el mismo resultado fraccionndolo en bloques y colocando cdigo HTML entre ellos:
<?php if ($x<0) { ?> <B> Valor negativo </B> <BR> Vuelva a intentarlo <?php

109

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

} else { ?> <B> Valor positivo </B> <BR> Correcto <?php } ?>

Ejemplo 4.6: El ejemplo anterior no tiene mucho inters, pero siguiendo ese mismo esquema se podra definir, por ejemplo, una pgina que mostrara diferentes contenidos dependiendo del navegador que est usando el cliente.
<?php if (strstr($_SERVER["HTTP_USER_AGENT"], "MSIE")) { ?> ................................ ................................ cdigo HTML si el navegador del cliente es Internet Explorer ................................ ................................ <?php } else { ?> ................................ ................................ cdigo HTML para otros navegadores ................................ ................................ <?php } ?>

En este ejemplo se utiliza por un lado la variable global de PHP $_SERVER para saber el navegador que ha utilizado el cliente para hacer la peticin, y la funcin strstr() para tratar de localizar la cadena de caracteres "MSIE" en la identificacin del navegador. Como puede verse en estos ejemplos, la flexibilidad y fluidez lgica del script permanece intacta a pesar de su ruptura en varios bloques.

110

INTRODUCCIN A PHP

4.5. ESCRITURA DEL CDIGO FUENTE PHP


4.5.1. ASPECTOS SOBRE LA SINTAXIS DEL LENGUAJE
La sintaxis del lenguaje PHP es muy similar a la de otros lenguajes conocidos como C o Perl, algunos aspectos iniciales sobre la sintaxis que deben ser considerados a la hora de abordar la escritura del cdigo fuente de los programas son: El uso de maysculas y minsculas es indiferente. A diferencia de otros lenguajes similares, PHP permite que las diferentes sentencias estn escritas con cualquier combinacin de letras maysculas o minsculas. Por ejemplo, en las estructuras condicionales sera totalmente equivalente utilizar la palabra reservada if o IF. Una excepcin importante a esta regla se produce en los nombres de las variables; como se ver ms adelante, no es lo mismo nombrar una variable con letras maysculas que hacerlo con minsculas. Se pueden colocar todos los espacios en blanco y cambios de lnea que se deseen con objeto de hacer ms legible el cdigo fuente. Esos espacios adicionales no tienen efecto alguno en la ejecucin del programa, el intrprete de PHP los ignora. Las diferentes instrucciones deben terminar con ";". Sin embargo PHP admite cierta flexibilidad a este respecto, ya que el terminador punto y coma no sera necesario en la ltima sentencia del script antes de terminador ?>, ni en los casos en los que al final de la instruccin se cierre un bloque de cdigo con una llave, por ejemplo en las estructuras condicionales o bucles. Las instrucciones se pueden partir en tantas lneas como se desee a efectos, de nuevo, de mejorar la legibilidad. Esta divisin de las instrucciones no afecta a su ejecucin. En una misma lnea se pueden colocar, si as se desea, varias instrucciones diferentes separadas por ";". Esto puede ser til en el caso, por ejemplo, de tener que hacer varias sentencias de asignacin diferentes.

111

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

4.5.2. INSERCIN DE COMENTARIOS EN EL CDIGO


La insercin de comentarios dentro del cdigo fuente no tiene ningn efecto sobre la ejecucin de los programas pero ayuda a hacerlos ms legibles. Sobre todo en proyectos de gran envergadura, la documentacin de los programas mediante comentarios es esencial para facilitar su mantenimiento, y muy especialmente cuando son varios los programadores que trabajan en un mismo proyecto. Debe destacarse igualmente que PHP crece gracias al esfuerzo de todos los programadores que distribuyen libremente sus desarrollos, por lo que el cdigo distribuido debe estar especialmente bien documentado. En PHP hay varias formas de incluir comentarios en el cdigo. En primer lugar estn los que usan el estilo de C o C++:
// Comentario estilo C. Hasta fin de lnea. /* Comentario estilo C. Puede extenderse durante varias lneas. */

Cuando PHP se encuentra la pareja de caracteres // considera como comentario todo lo que le sigue hasta alcanzar el fin de lnea o el fin del script, lo que antes ocurra. Con este estilo, si se quiere que el comentario abarque varias lneas, cada una de ellas debera ser precedida del correspondiente inicio de comentario //. Para evitar la innecesaria repeticin, se puede utilizar el segundo estilo de comentarios. Con l, el comentario puede extenderse por varias lneas hasta encontrar la seal de fin */. Con este segundo estilo hay que prestar especial atencin para evitar anidamientos de comentarios. El tercer estilo de comentarios es propio del lenguaje Perl, y consiste en utilizar el signo #, considerndose en este caso como comentario todo lo que le sigue hasta el fin de lnea:
# Comentario estilo Perl. Hasta fin de lnea.

112

INTRODUCCIN A PHP

4.6. ELEMENTOS BSICOS DEL LENGUAJE


4.6.1. TIPOS DE DATOS
Como todo lenguaje de programacin, PHP puede trabajar con una serie de tipos de datos bsicos. En concreto los tipos de datos admitidos son: Nmeros enteros: los enteros pueden ser dados tanto en base decimal como en base octal o hexadecimal (un 0 inicial indica que el valor est representado en octal, un 0x indica que es hexadecimal). o Ejemplos de nmeros en base 10: 45 -142 783 o Ejemplo de nmero en octal: 0123 (equivale a 83) o Ejemplos de nmeros en hexadecimal: 0x12 (equivale a 18) 0x21B (equivale a 539) Nmeros en coma flotante: los nmeros en coma flotante se pueden dar en dos formatos: como parte entera y parte decimal, usando el punto como separador, o en notacin cientfica: o Ejemplos: 14.67 -76.0023 1.4e3 -78.5e-4 Cadenas de caracteres: las cadenas de caracteres pueden ser dadas en dos formatos: usando comillas dobles o usando comillas simples. El uso de una u otra forma de delimitacin afecta a la forma en la que se tratan las posibles variables que pueda haber dentro de la propia cadena. Ms adelante se analizar este aspecto. o Ejemplos: "Casablanca"'Cantando bajo la lluvia' Arrays o matrices: los arrays constituyen colecciones de datos que se referencian bajo un nombre comn. Como se ver en el captulo dedicado a estas estructuras de datos, PHP admite la posibilidad de construir dos tipos de arrays: arrays asociativos e indexados. Objetos: finalmente PHP admite tambin la posibilidad de crear objetos y realizar acciones con ellos. Mediante el uso de objetos se pueden entender como una misma entidad los datos y las acciones que se realizan con ellos. Esta es la base de la programacin orientada a objetos. Al igual que ocurre con los arrays, los objetos sern tratados con detalle en un captulo posterior.

113

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

4.6.2. VARIABLES
Una vez analizados los tipos de datos bsicos soportados por PHP, lo siguiente que se necesita es disponer de "contenedores" que permitan guardar los datos y realizar operaciones con ellos. Estos contenedores son las variables. Algunas de la peculiaridades de las variables en PHP son: No es necesario declarar explcitamente las variables, sino que basta con utilizarlas cuando se necesite. En principio las variables no tienen un tipo predefinido, puede asignarse cualquier tipo de valor. La asignacin de valores a las variables se realiza utilizando el signo "=". Los nombres de las variables en PHP siempre comienzan por el signo "$". Se pueden utilizar nombres de variables de cualquier longitud, formados por letras, dgitos y signos de subrayado, pero nunca comenzando por un dgito. Entre las letras que pueden utilizarse se encuentran los caracteres cuyo cdigo ASCII se encuentren entre 127 y 255, por lo que se pueden utilizar letras acentuadas o "" en los nombres de las variables. En los nombres de las variables S se distingue el uso de maysculas y minsculas, de manera que $titulo y $TITULO seran variables diferentes. Una misma variable se puede reutilizar asignndole a lo largo del tiempo datos incluso de distinto tipo.

Seran ejemplos de nombres de variable vlidos:


$titulo $fecha_nacimiento $ao $precio2

En cambio no seran vlidos los siguientes:


$dir-pelicula $4fila genero $dto%

Ejemplo 4.7: A continuacin se incluye un sencillo script que utiliza dos variables para generar un mensaje:
<?php $titulo = "Buscando a Nemo"; $sala = 2;

114

INTRODUCCIN A PHP

echo "En la Sala $sala se proyectar la pelcula $titulo"; ?>

En este caso, a la primera variable se le asigna una cadena de caracteres y a la segunda un nmero entero. Las dos variables se utilizan dentro de la cadena a imprimir; cuando dicha cadena est delimitada por comillas dobles como en este caso, las variables que se encuentran en su interior sern sustituidas por sus valores. Adems de las variables propias que el programador pueda utilizar, en PHP existen un gran nmero de variables predefinidas a las que se tendr acceso dentro de los scripts. Ejemplo 4.8: Como se ha comentado, es posible reasignar valores a una misma variable an cuando sean de distinto tipo:
<?php $x = "Importe: "; echo $x; $x = 5; echo $x . " (precio normal) "; $x = $x * 0.85; echo $x . " (precio reducido) "; ?>

El resultado del programa sera:


Importe: 5 (precio normal) 4.25 (precio reducido)

Como puede observarse, en este programa se ha utilizado una nica variable $x a la que inicialmente se le asign una cadena de caracteres, despus se le asign un nmero entero y, finalmente, el resultado de una expresin que devuelve un nmero en coma flotante. En este caso se ha utilizado el operador punto para realizar concatenaciones entre cadenas de caracteres y variables. Esto es una alternativa a la inclusin de las variables directamente dentro de las cadenas. En el momento en el que se usa por primera vez una variable y se le asigna un valor, automticamente PHP asigna un tipo a dicha variable. Si el valor asignado cambia de tipo, implcitamente se produce una conversin de tipos en la variable.

115

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Adems de esta conversin implcita, el programador puede forzar a la conversin explcita usando la funcin settype() o la operacin de conversin o cast. Ejemplo 4.9: En la siguiente secuencia de instrucciones se producen tres conversiones de tipo implcitas y una explcita.
$a = $b = $c = $d = $e = echo "10 euros"; 2.25; $a - $b; (integer)$c; $d / 2; $e;

// // // // //

conversin implcita a conversin explcita a conversin implcita a conversin implcita a finalmente, se escribe

tipo float tipo integer tipo float tipo cadena el valor 3.5

La primera conversin se produce al realizar una operacin numrica como es la diferencia sobre dos variables de tipos diferentes, la primera una cadena de caracteres y la segunda un nmero en coma flotante (float). En esta conversin la cadena ser convertida a su valor numrico equivalente, siendo en este caso 10. Por tanto el valor de la variable $c sera 7.75. Este valor luego es convertido a entero, para lo cual se produce un truncamiento de la parte decimal, por tanto, la variable $d pasa a ser una variable entera con valor 7. Al hacer la divisin se produce de nuevo una conversin implcita del resultado a tipo float. Finalmente al utilizar una variable numrica en una operacin de escritura, esta debe ser convertida a cadena de caracteres. La conversin de tipo explcita se puede realizar mediante el operador de cast:
(tipo) expresin

o mediante la funcin settype():


$tlf = (string) 942323305; $x = (integer) 5.97; $y = 12.5; settype($y,"integer"); settype($y,"float");

Otro de los aspectos importantes a tener en cuenta a la hora de trabajar con variables es el denominado mbito de las variables. El mbito determina desde qu lugares esa variable es visible y, por tanto, puede ser utilizada.

116

INTRODUCCIN A PHP

Las variables por defecto tienen un mbito global que abarcara el documento completo en el que son definidas, a no ser que sean definidas dentro de una funcin, en cuyo caso solo pueden ser utilizadas dentro de la propia funcin (mbito local). Esto significa que una variable definida en un script del documento fuera de cualquier funcin, puede ser utilizada en cualquier otro lugar de ese script o incluso en otros posibles scripts que se encuentren en el mismo documento. Ejemplo 4.10: <?PHP ........... $fila = 12; $num = 6; ........... ?> ........... <?PHP ........... $asiento = "F$fila.$num"; ........... ?>

En este caso el documento incluye dos scripts, en el primero se definen dos variables que, al ser globales, pueden ser utilizadas posteriormente en un segundo script.

Una variable global puede ser utilizada dentro de cualquier funcin, pero para hacer referencia a ella debe declararse dentro de la funcin con la palabra global delante de su nombre. Ejemplo 4.11:
$precio = 4.5; function calcular_importe($num_entradas) { global $precio; $i = $precio * $num_entradas; return $i; }

117

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

En este caso la variable $precio est definida fuera de la funcin y es utilizada dentro de la funcin calcular_importe(). Por otro lado, la variable $i est definida dentro de la funcin y no puede ser utilizada fuera de ella. Ms adelante, cuando se explique con detalle la forma de construir funciones, se volver a analizar la diferencia entre las variables locales y globales. Otra peculiaridad del lenguaje PHP en relacin al trabajo con variables es la posibilidad de tener nombres de variables que sean a su vez variables, es decir, que los nombres puedan establecerse y usarse dinmicamente. Estas variables se identifican por ir precedidas de dos signos dlar. Ejemplo 4.12:
$nombrevariable = 'x'; ...................... ...................... $$nombrevariable = 150; $x=150

// asignacin equivalente a

Dado que en PHP las variables no tienen un tipo declarado explcitamente y que este puede cambiar a lo largo de la ejecucin de los programas, se necesita disponer de alguna forma de saber el tipo de dato que guarda la variable en cada instante. Para ello PHP incorpora una serie de funciones:
gettype(): is_array(): is_float(): is_int(): is_object(): is_string(): devuelve el tipo de la variable. determina si la variable contiene un array. determina si la variable contiene un nmero en coma flotante. determina si la variable contiene un nmero entero. determina si la variable hace referencia a un objeto. determina si la variable contiene una cadena de caracteres.

Otra funcin especialmente interesante es la funcin isset() que permite averiguar si una variable ha sido definida. Esta funcin es especialmente til cuando se quiere comprobar si se han recibido los valores correspondientes a todos los campos de un formulario. Por otro lado, la funcin unset() permite eliminar una variable, no solo borra el contenido de la variable sino que tambin libera el espacio de memoria reservado para ella. Cualquier intento posterior de acceso a esa variable generara un error.

118

INTRODUCCIN A PHP

En ocasiones puede interesar tambin saber si una variable existe pero tiene un valor nulo o vaco, la funcin que permite efectuar esta comprobacin es empty().

4.6.3. CONSTANTES
Una constante es un valor que permanece inalterable a lo largo de la ejecucin del script y a la que se le asigna un identificador. Solo pueden definirse constantes con valores escalares (nmeros o cadenas de caracteres). Por ejemplo, no podra definirse una constante cuyo valor fuese un array. La definicin de las constantes se realiza con la funcin define(), y una vez definidas su valor no puede cambiarse. En cuanto a los identificadores de las constantes, estos siguen las mismas reglas que los identificadores de las variables salvo que no comienzan con el signo $. Aunque no es una regla de obligado cumplimiento, por convenio se suelen utilizar identificadores con letras maysculas para las constantes. Otra diferencia con las variables est en la ausencia de cualquier restriccin de mbito en las constantes. Una constante definida en un documento ser accesible desde cualquier punto de cualquier script que est en el mismo documento. Ejemplo 4.13: A continuacin se muestra un sencillo ejemplo de definicin y uso de constantes:
define("NOMBRE_EMPRESA", "Cinem@s"); define("EDAD_JUBILACION", 65); define("TIPO_IVA", 0.16); echo NOMBRE_EMPRESA; if($edad > EDAD_JUBILACIN) { $base = 3; } else { $base = 4.5; } $importe = $base*(1 + TIPO_IVA); echo $total;

El uso de constantes puede resultar especialmente adecuado para definir determinados parmetros del programa que no se espera que cambien.

119

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

El propio PHP incorpora un amplio conjunto de constantes predefinidas; entre ellas por ejemplo se encuentran TRUE y FALSE que hacen referencia a los valores booleanos verdadero y falso, respectivamente.

4.6.4. CADENAS DE CARACTERES Y VARIABLES


Como ya se coment, las cadenas de caracteres constituyen uno de los tipos de datos bsicos del lenguaje PHP. En su definicin se pueden utilizar como delimitadores tanto las comillas simples como las dobles, lo que no es posible es combinar ambos tipos de delimitadores, por ejemplo abriendo la cadena con comillas dobles y cerrndola con comillas simples. Seran cadenas vlidas:
"Bailando con lobos" 'El ltimo samurai'

en cambio, no seran vlidas:


"Monstruos S.A. "Muln' "El "ltimo" emperador"

la primera de ellas, por no haber sido cerrada, la segunda, por utilizar diferentes delimitadores a cada lado, y la tercera, por el hecho de aparecer como un carcter de la propia cadena las comillas. En relacin a este ltimo error, debe sealarse que, al igual que ocurre en el lenguaje C, la inclusin de determinados caracteres en las cadenas exige la utilizacin de las denominadas secuencias de escape. Entre estos caracteres especiales estn las comillas, el signo dlar, la barra invertida y los caracteres de tabulacin y retorno de carro. La Tabla 4.1 muestra algunas de estas secuencias de escape.
Secuencia de escape \n \r \t \\ \' \" \xNum \Num Significado

Nueva lnea
Retorno de carro Tabulador Barra invertida Comillas simples Comillas dobles Carcter cuyo cdigo ASCII en hexadecimal es Num Carcter cuyo cdigo ASCII en octal es Num

Tabla 4.1 Secuencias de escape

120

INTRODUCCIN A PHP

Ejemplo 4.14: La instruccin PHP:


echo "Pgina creada por:\n \"CINEM@S\" \t \xA9 2004";

generara en la pgina web el mensaje:


Pgina creada por: "CINEM@S" 2004

En la cadena anterior se utilizan dos secuencias de escape que no tienen reflejo en la pgina que sera visualizada por el navegador del cliente, pero s en el cdigo fuente HTML: el carcter de nueva lnea y el tabulador se incluiran en el cdigo fuente HTML, pero, como todos los espacios extra, seran ignorados por el navegador. Las otras secuencias de escape que han sido utilizadas en el ejemplo son las que permiten incluir comillas en la propia cadena y que generan el signo copyright (correspondiente al carcter de cdigo ASCII 169 o A9 en hexadecimal). La diferencia entre el uso de comillas dobles o simples como delimitadores de las cadenas de caracteres est en la forma en la que se tratan los posibles identificadores de variables que aparezcan dentro de la cadena: Con las comillas dobles, las variables dentro de la cadena se expanden, es decir, se sustituyen por su valor. Con las comillas simples las variables no se expanden y por tanto en la propia cadena aparecern sus identificadores como cualquier otro carcter de la misma. Adems de eso, en este caso las nicas secuencias de escape reconocidas son \\ y \'.

Ejemplo 4.15: Si se tienen definidas las siguientes variables:


$titulo = "Todo sobre mi madre"; $director = "Pedro Almodvar"; $ao = 1999;

la sentencia:
print "Sesin especial: \"$titulo\" de $director ($ao)";

escribira el siguiente mensaje:


Sesin especial: "Todo sobre mi madre" de Pedro Almodvar (1999)

121

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Obsrvese cmo al utilizar las comillas dobles, los nombres de variables que aparecen dentro de la cadena son sustituidos por sus valores. Esta caracterstica de PHP es especialmente til y evita tener que recurrir a engorrosas operaciones de concatenacin de cadenas con variables, tal como ocurre en otros lenguajes. En cambio, la sentencia:
print 'Sesin especial: \"$titulo\" de $director ($ao)';

escribira el siguiente mensaje:


Sesin especial: \"$titulo\" de $director ($ao)

En este caso se observa cmo las secuencias de escape no son reconocidas y se escriben los nombres de las variables dentro de la cadena y no sus valores. Existe otra forma de expandir variables dentro de cadenas que PHP hereda del lenguaje Perl y que fue incorporada en la versin PHP 4. Se trata de la sintaxis de documento incrustado: se basa en sealar el inicio de la cadena con la secuencia <<< seguida de un identificador y cerrar la cadena con el identificador elegido. Entre el inicio y el fin, la cadena puede ocupar incluso varias lneas y en ella todas las variables que aparezcan se expandirn. Ejemplo 4.16: El siguiente cdigo
$titulo = "La gran evasin"; $nacionalidad = "norteamericana"; $director = "John Sturges"; $ao = 1963; $actores = " Charles Bronson, David McCallum, Donald Pleasence, Gordon Jackson, James Coburn, James Donald, James Garner, Richard Attenborough, Steve McQueen"; $dia = "12/5/2004"; $hora = "18:30"; $nsala = 2; $c = <<<FICHA <B>$titulo</B>: pelcula de nacionalidad $nacionalidad dirigida por $director en el ao $ao y protagonizada por $actores. <BR> La pelcula ser proyectada el <U>da $dia a las $hora</U> en la Sala $nsala.

122

INTRODUCCIN A PHP

FICHA; echo $c;

genera un mensaje como el que sigue:


La gran evasin: pelcula de nacionalidad norteamericana dirigida por John Sturges en el ao 1963 y protagonizada por Charles Bronson, David McCallum, Donald Pleasence, Gordon Jackson, James Coburn, James Donald, James Garner, Richard Attenborough, Steve McQueen. La pelcula ser proyectada el da 12/5/2004 a las 18:30 en la Sala 2.

Las cadenas de caracteres son un caso especial de un tipo de datos que se ver ms adelante: los arrays. Por tanto, como en todo array, se puede acceder a cualquiera de los caracteres que componen la cadena sin ms que utilizar un ndice numrico. Los ndices deben ser siempre dados entre corchetes y adems debe tenerse en cuenta que el primer carcter de la cadena es el correspondiente al ndice 0. Por ejemplo, dada la cadena: $genero="Comedia", se podra acceder a su primer carcter usando la sintaxis $genero[0], al segundo mediante $genero[1], y as sucesivamente. Al hablar de las conversiones de tipo en las variables, se coment cmo en determinadas ocasiones PHP realiza conversiones implcitas. Por ejemplo, cuando una cadena de caracteres interviene en una expresin aritmtica, esta es convertida a su valor numrico. Para la determinacin de ese valor numrico debe tenerse en cuenta que PHP intenta convertir la cadena en nmero hasta que se encuentra un carcter que no tiene sentido numrico, a continuacin pueden verse ejemplos de tales conversiones:
$x $x $x $x $x $x $x $x $x = = = = = = = = = 12 + "23"; 1 + "0.5"; 4000 + "-1.5e+3"; 4 + "5 dias"; "2 horas" + "10 min"; 2.5 "1.2Kg"; 4 + "Tarde"; 2 * "5 Eur"; 2 * "Eur 5"; // // // // // // // // // $x $x $x $x $x $x $x $x $x tendr tendr tendr tendr tendr tendr tendr tendr tendr el el el el el el el el el valor valor valor valor valor valor valor valor valor 35 1.5 2500 9 12 1.3 4 10 0

Por supuesto, PHP dispone de un gran nmero de funciones predefinidas para realizar operaciones habituales con cadenas de caracteres: localizacin de caracteres, conversiones entre maysculas y minsculas, determinacin de la longitud de las cadenas,... Estas funciones sern presentadas con detalle en el captulo destinado a anlisis de funciones predefinidas (Captulo 9).

123

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

4.6.5. OPERADORES
Una vez analizados los tipos de datos bsicos del lenguaje y la definicin de las variables y constantes, el siguiente aspecto a revisar lo constituyen el conjunto de operadores que se pueden utilizar para generar expresiones complejas. Los operadores se podran clasificar en diferentes categoras: Operadores aritmticos. Operadores de asignacin. Operadores de bit. Operadores de comparacin. Operadores lgicos. Otros operadores (concatenacin, supresin de error, ejecucin,...).

Operadores aritmticos
Los operadores aritmticos bsicos son los habituales de cualquier lenguaje de programacin:
$x $x $x $x $x + * / % $y $y $y $y $y Suma de dos nmeros Diferencia de dos nmeros Producto de dos nmeros Divisin de dos nmeros Resto de la divisin entera

Tabla 4.2 Operadores aritmticos

Adems de los operadores anteriores se dispone de los operadores de incremento y decremento que existen tambin en lenguajes como C o C++. ++$x
$x++ Incrementa una unidad el valor de $x Incrementa una unidad el valor de $x, pero despus de evaluar el resto de la expresin Decrementa una unidad el valor de $x Decrementa una unidad el valor de $x, pero despus de evaluar el resto de la expresin

--$x $x--

Tabla 4.3 Operadores de incremento y decremento

124

INTRODUCCIN A PHP

En su uso ms sencillo, los operadores de incremento estn pensados para actuar de contadores; as por ejemplo, las sentencias siguientes seran totalmente equivalentes:
$x++; ++$x; $x = $x + 1;

Sin embargo, el uso de estos operadores es especialmente til cuando se incluyen formando parte de expresiones u otras sentencias ms complejas, permitiendo optimizar el cdigo fuente. Adems en este caso el uso de los operadores delante o detrs de las variables determina el valor final de la expresin. Ejemplo 4.17: Para entender la diferencia entre la utilizacin de los operadores de incremento o decremento antes o despus de la variable, conviene analizar algunos sencillos ejemplos: $n = 5; $m = ++$n;
En este caso la variable $n tomar el valor 5 mientras que $m tendr el valor 6, ya que el operador de incremento delante de $n hace que el incremento se realice antes de efectuar la asignacin a $m.. Los valores finales de las variables sern 4, 8 y 3 para $z, $v y $w, respectivamente. En este caso, en la segunda sentencia se utiliza el operador de decremento despus de la variable, por lo que el decremento se produce despus de realizar la asignacin. Tras ejecutar estas tres sentencias la variable $a tendra el valor 10, la variable $b valdra 17 y $c valdra 8.

$z = 4; $v = 2*$z--; $w = $z; $a = 10; $b = 2*--$a; $c = ++$a-$b--;

Operadores de asignacin
En diversos ejemplos previos ya se ha utilizado el operador de asignacin para dar valores a variables, este operador se representa mediante el signo "=". Su sentido es el evidente: la variable de la izquierda del operador tomar el valor resultado de la expresin que se encuentre a la derecha.
$variable = valor expresin

125

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Cuando en PHP se realiza una asignacin, la sentencia devuelve como valor el propio valor asignado; esto permite por ejemplo utilizar asignaciones dentro de otras sentencias de asignacin:
$z = ($x = 4) + ($y = 5);

En la sentencia anterior se realizan 3 asignaciones diferentes, por un lado se asigna el valor 4 a la variable $x y el valor 5 a $y, pero adems, teniendo en cuenta que estas asignaciones devuelven el propio valor asignado, se aprovecha a asignar a $z el valor resultante de la suma de 4 y 5. Esta misma particularidad del lenguaje PHP hace que sea posible encadenar varias asignaciones en una misma sentencia, por ejemplo, las tres asignaciones siguientes:
$a = 1; $b = 1; $c = 1;

podran condensarse en una sola sentencia de la siguiente manera:


$a = $b = $c = 1;

Adems del operador bsico de asignacin (=), PHP permite la utilizacin de la asignacin combinada con otro tipo de operadores. La sintaxis de esta asignacin combinada es:
$v op= valor; que equivale a $v = $v op valor;

A continuacin pueden verse algunos ejemplos de utilizacin de estas asignaciones junto con su asignacin equivalente:
Asignacin combinada $x += 5; $y *= 2; $z %= 3; $c .= "fin"; Asignacin equivalente $x = $x + 5; $y = $y * 2; $z = $z % 3; $c = $c . "fin";

Tabla 4.4 Ejemplos de asignaciones combinadas

126

INTRODUCCIN A PHP

Operadores de bit
Los operadores de bit trabajan directamente sobre la representacin binaria de los nmeros enteros, realizando operaciones sobre los diferentes bits de los operandos. La Tabla 4.5 detalla cules son estos operadores y su funcionamiento.

$x & $y $x | $y $x ^ $y ~$x $x << $n $x >> $n

Se ponen en 1 los bits que en $x y en $y estn en 1 (Y) Se ponen en 1 los bits que en $x o en $y estn en 1 (O) Se ponen en 1 los bits que en $x o en $y estn en 1 pero no en ambos (O exclusivo) En la representacin binaria de $x cambia los 1 por 0 y viceversa (negacin) Los bits de $x se desplazan $n posiciones a la izquierda Los bits de $x se desplazan $n posiciones a la derecha Tabla 4.5 Operadores de bit

Para comprender mejor el funcionamiento de estos operadores se presenta a continuacin un sencillo ejemplo. Ejemplo 4.18: Supngase que se tienen dos variables $x e $y con valores de 214 y 178 respectivamente. Asumiendo una representacin binaria con 8 bits, estos dos valores estaran codificados con las siguientes cadenas de dgitos binarios:
$x = 214 $y = 178 1 1 1 0 0 1 1 1 0 0 1 0 1 1 0 0

Con estos datos, los resultados de algunas de las operaciones de bit anteriores seran:
$x $x $x $x & $y | $y ^ $y >> 2 1 1 0 0 0 1 1 0 0 1 1 1 1 1 0 1 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 1

Resultado: 146 Resultado: 246 Resultado: 100 Resultado: 53

127

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Operadores de comparacin
En cualquier lenguaje de programacin una de las estructuras ms comunes son las condicionales. En ellas se ejecutan una serie de sentencias en funcin del valor de una expresin de tipo lgico (verdadero/falso) que con frecuencia proviene de la realizacin de una comparacin de valores. Los operadores de comparacin son los que realizan estas comparaciones, devolviendo un valor verdadero si la comparacin es positiva o falso en otro caso.
$x == $y $x === $y $x != $y $x !== $y $x < $y $x > $y $x <= $y $x >= $y Compara si $x e $y tienen el mismo valor (operador de igualdad) Compara si $x e $y son iguales y adems son del mimo tipo (operador de identidad) Comprueba si $x e $y tienen distinto valor (negacin de igualdad) Comprueba si $x e $y tienen distinto valor y/o tipo (negacin de identidad) Comprueba si el valor de $x es menor que el valor de $y Comprueba si el valor de $x es mayor que el valor de $y Comprueba si el valor de $x es menor o igual que el valor de $y Comprueba si el valor de $x es mayor o igual que el valor de $y

Tabla 4.6 Operadores de comparacin

Quizs convenga realizar algunas observaciones relativas a los operadores de igualdad y de identidad. En primer lugar, no debe confundirse el operador de igualdad (==) con el operador de asignacin (=). Suele ser bastante frecuente en programadores principiantes dicha confusin, lo que puede conducir a situaciones aparentemente tan extraas como lo que ocurre en el siguiente programa. Ejemplo 4.19:
$x = 10; $y = 35; if ($x = $y) echo "Los dos valores son iguales"; else echo "Los dos valores son diferentes";

128

INTRODUCCIN A PHP

Sorprendentemente, este programa escribira el mensaje "Los dos valores son iguales". En ese programa se ha utilizado la estructura condicional if...else, que ser analizada con calma en el prximo captulo, para escribir un mensaje u otro en funcin del resultado de la expresin $x = $y. Pero, qu es lo que ha pasado para que el programa indique que las dos variables tienen el mismo valor cuando claramente eso no es cierto? El problema se ha debido a que se ha utilizado el operador de asignacin en lugar del operador de igualdad. La asignacin $x = $y asigna a la variable $x el valor de la variable $y y devuelve como valor el valor asignado, en este caso 35. En PHP cualquier expresin que de como resultado un valor numrico diferente de cero o una cadena de caracteres no vaca es considerada, a efectos de su participacin en expresiones lgicas, como valor "verdadero". Esta es la razn por la que el programa anterior escribe el mensaje "Los dos valores son iguales". Para que el programa realmente escriba ese mensaje cuando los dos valores de las variables sean iguales, se debera haber utilizado el operador de comparacin en lugar del de asignacin:
if ($x == $y) echo "Los dos valores son iguales"; else echo "Los dos valores son diferentes";

El operador de igualdad es un operador del que disponen todos los lenguajes de programacin; en cambio, el operador de identidad no es un operador muy frecuente en otros lenguajes, de hecho, en el propio PHP no exista hasta su aparicin en el PHP 4. Se trata de un operador que compara la igualdad de los valores pero tambin de los tipos de las respectivas variables. La mejor forma de entender la diferencia entre el operador de igualdad y el de identidad es a travs de un sencillo ejemplo, las dos variables siguientes
$a = 120; $b = "120";

tienen tipos diferentes, una corresponde a una variable numrica y la otra a una cadena de caracteres. Sin embargo, tras la correspondiente conversin, se puede entender que las dos variables tienen el valor numrico 120. Teniendo en cuenta esto, la comparacin $a == $b producira un valor "verdadero", mientras que la comparacin $a === $b producira un valor "falso".

129

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Operadores lgicos
Los operadores lgicos de PHP son los clsicos de cualquier lenguaje de programacin, permiten generar expresiones lgicas complejas conjugando diferentes subexpresiones.
$x and $y $x && $y $x or $y $x || $y $x xor $y Devuelve un valor cierto cuando tanto $x como $y tienen el valor cierto (operacin Y) Devuelve un valor cierto cuando $x o $y tienen el valor cierto (operacin O) Devuelve un valor cierto cuando $x o $y tienen un valor cierto pero no ambos a la vez (operacin O exclusivo) Devuelve un valor cierto cuando $x tiene un valor falso (operacin de negacin) Tabla 4.7 Operadores lgicos

!$x

Como puede observarse, para los operadores Y y O existen dos sintaxis vlidas, el funcionamiento de las dos es el mismo, la nica diferencia estriba en tener diferentes prioridades a la hora de ser evaluados en expresiones. Tras finalizar este repaso a los operadores de PHP, la Tabla 4.8 mostrar las diferentes prioridades de estos.

Otros operadores
Operador condicional: A continuacin se presentan algunos otros operadores que no pertenecen a las categoras anteriores. En primer lugar destaca la existencia de un operador ternario (que opera sobre tres argumentos): se trata del operador condicional, cuya sintaxis es la siguiente:
(condicion) ? (expresion1) : (expresion2)

El funcionamiento es el siguiente: se evala la condicin y en el caso de ser cierta se devuelve el valor de la expresin1, si la condicin es falsa se devuelve el valor de la expresin2.

130

INTRODUCCIN A PHP

Ejemplo 4.20: Con la siguiente sentencia se asignara un valor 1 a una variable $par si el valor de otra variable $n es un nmero par, y se asignara el valor 0 en otro caso. Para determinar si un nmero es par se utiliza el operador mdulo, que calcula el resto de la divisin entera (un nmero es par si el resto de la divisin entera entre 2 es 0):
$par = ($n % 2 == 0) ? 1 : 0;

Teniendo en cuenta que en PHP cualquier expresin numrica se considera como "cierto" si tiene un valor diferente de 0, la sentencia anterior tambin podra escribirse de la siguiente manera:
$par = !($n % 2) ? 1 : 0;

Operador de concatenacin: El operador de concatenacin permite concatenar cadenas de caracteres. Aplicado sobre dos cadenas, este operador devuelve como resultado una nueva cadena. La sintaxis es:
cadena1 . cadena2

Ejemplo 4.21: Ejemplo de uso de este operador sera:


$titulo = "El ltimo Samurai"; $protagonista = "Tom Cruise"; $anuncio = $titulo . ", con " . $protagonista;

En este caso la variable $anuncio tendra finalmente como valor la cadena "El ltimo Samurai, con Tom Cruise". El operador de concatenacin tambin puede ser utilizado combinado con el operador de asignacin:
$actores = "Tom Cruise"; $actores .= ", Timothy Spall";

El resultado final de estas sentencias sera que la variable $actores contendra la cadena "Tom Cruise, Timothy Spall".

131

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Operador de supresin de error El signo "@" se utiliza en PHP para identificar al operador denominado de supresin de error. Este operador hace que el intrprete de PHP no genere mensajes de error an cuando detecte situaciones que claramente son errneas, como por ejemplo errores de tipo aritmtico. Ejemplo 4.22: La sentencia
$x = 12/0;

produce un error de tipo aritmtico (divisin por cero) que generara en la pgina un mensaje como
Warning: Division by zero in fichero.php on line n

Estos mensajes en las pginas pueden ser eliminados bien mediante determinados parmetros de configuracin del servidor web o mediante el uso del operador de supresin de error en la sentencia causante del mismo. De esta manera, la sentencia
$x = @(12/0);

no genera ningn tipo de mensaje de error. Por supuesto, en este caso la variable $x no tendra ningn valor (variable vaca). Operador de ejecucin El operador de ejecucin (acento grave: `) se utiliza para indicar a PHP que la expresin encerrada entre esos acentos graves debe ser tratada como una sentencia a ejecutar directamente por el sistema operativo del servidor. Ejemplo 4.23: Si se quisiera generar una pgina web que muestre un listado con el contenido del directorio del servidor en el que est alojada la propia pgina web, se podra insertar en la pgina el script siguiente:

132

INTRODUCCIN A PHP

<?php $x=`dir`; echo "<pre> $x </pre>"; ?>

La pgina generada, mostrara un listado con el siguiente aspecto:


El volumen de la unidad C no tiene etiqueta. El nmero de serie del volumen es: 43F2-A53B Directorio de C:\home 11/03/2004 11/03/2004 21/11/2003 21/11/2003 14/11/2003 21/02/2004 21/11/2003 11/03/2004 11/03/2004 11/03/2004 18:23 . 18:23 .. 19:53 64 Comentarios.txt 18:07 361 cookie.php 10:23 315 index.php 23:24 478 ordenar.php 19:53 267 prueba.htm 18:23 205 prueba.php 18:23 0 ~out.htm 18:23 205 ~scp.php 8 archivos 1.895 bytes 2 dirs 33.409.753.088 bytes libres

Operador de conversin de tipo (cast) La conversin explcita del tipo de dato se realiza a travs del operador cast:
(tipo) expresin

Ejemplos de uso de este operador seran:


$x = (int)12.67; $p = (string)4.5;

Orden de prioridad de los operadores


Cuando en una expresin se combinan varios operadores, el orden en el que estos se aplican es determinante para el resultado final de la expresin.

133

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Ejemplo 4.24: En la expresin:


$x = 5/2+3*4;

intervienen cuatro operadores diferentes: uno de asignacin y tres aritmticos (divisin, suma y producto). En qu orden se aplican esos operadores? La respuesta viene dada por la prioridad que tenga cada uno en una tabla de prioridades que todo lenguaje de programacin maneja. En concreto, los operadores de asignacin son los que menor prioridad tienen, y por tanto este sera el ltimo en ser aplicado; en cuanto a los operadores aritmticos, los productos y divisiones tienen mayor prioridad que las sumas y las restas. En definitiva, la expresin anterior sera evaluada de la manera siguiente: 1. 2. 3. 4. Se realiza la divisin 5/2, obtenindose 2.5 Se realiza el producto 3*4, obtenindose 12 Se realiza la suma de los dos resultados anteriores, obtenindose 14.5 Se asigna a la variable $x el valor obtenido: 14.5

Si se quiere cambiar el orden de aplicacin de los diferentes operadores deben utilizarse parntesis para agrupar expresiones. Las expresiones entre parntesis sern siempre las que primero se evaluarn, y en el caso de parntesis anidados, siempre se comenzar por los ms internos. Como puede verse en los siguientes ejemplos, en la expresin anterior el uso de parntesis en diferentes lugares cambiara radicalmente el resultado final:
$x = 5/(2+3)*4; $x = 5/(2+3*4); $x = 5/((2+3)*4); // $x tendra el valor 4 // $x tendra el valor 0.35714 // $x tendra el valor 0.25

El orden de prioridad de los diferentes operadores es el que viene expresado en la Tabla 4.8, siempre considerados de mayor a menor prioridad.

134

INTRODUCCIN A PHP

Orden de prioridad de operadores (de mayor a menor) Parntesis (empezando por los ms internos). Operadores de incremento (++), decremento (--), conversin de tipo y supresin de error. Productos, divisiones y mdulos (evaluados de izquierda a derecha). Sumas y restas. Concatenacin de cadenas. Operadores de desplazamiento de bits. Operadores relacionales (igualdad, desigualdad e identidad). Operadores lgicos (& ^ | && ||) Operador condicional. Operadores de asignacin. Operadores lgicos (and, or, xor)
Tabla 4.8 Prioridades de los operadores

Obsrvese cmo en la tabla de prioridades los operadores lgicos Y y O se encuentran en dos niveles diferentes, dependiendo de la sintaxis utilizada (&& o and, || o or). En principio las dos sintaxis definen el mismo operador, pero la prioridad es diferente, eso hace que, por ejemplo, las dos expresiones siguientes produzcan resultados muy diferentes: $x = 2<5 and 8<7; $y = 2<5 && 8<7; El operador lgico Y con la sintaxis and es el que menos prioridad tiene, menos incluso que el operador de asignacin, por eso en la primera sentencia la secuencia de operaciones sera: 1. Se evalan las dos condiciones: 2<5 y 8<7, produciendo una de ellas un valor cierto y la otra falso. 2. A continuacin se procede a realizar la asignacin del resultado de 2<5 a la variable $x, por tanto, $x pasar a tener el valor "cierto", que equivale en un contexto numrico a 1. 3. Finalmente se aplica el operador and, que devolver un valor falso pero que no es asignado ya a ninguna variable. Por tanto, el valor de la variable $x ser 1. En cambio, en la segunda sentencia se utiliza el operador Y con la sintaxis &&, que tiene ms prioridad que la asignacin. La secuencia en este caso es:

135

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

1. Se evalan las dos condiciones: 2<5 y 8<7, produciendo una de ellas un valor cierto y la otra falso. 2. Se aplica sobre los dos resultados anteriores el operador &&, produciendo en este caso un valor falso. 3. El valor obtenido se asigna a la variable $y. En definitiva la variable $y tendra un valor falso, que es equivalente al valor numrico 0 o a la cadena de caracteres vaca. Si se deseaba que las dos sentencias tuvieran el mismo efecto, se tendran que haber utilizado los parntesis en la primera para alterar el orden de evaluacin.
$x = (2<5 and 8<7);

es equivalente a

$y = 2<5 && 8<7;

NOTA

El ejemplo anterior pone de manifiesto que en caso de dudas es mejor usar parntesis para asegurarse que el orden de evaluacin de las expresiones es el deseado. En una expresin el uso de parntesis innecesarios no produce ningn tipo de error pero s que puede ayudar a clarificar su significado. En definitiva, es preferible que "sobren" parntesis a que se obtengan resultados inesperados por su no utilizacin.

136

PHP Y LOS FORMULARIOS DE HTML


5.1. FORMULARIOS DE HTML
Los formularios de HTML constituyen el primer mecanismo de interaccin entre las pginas web y el usuario. A travs de sus diferentes campos, los formularios solicitan al usuario informacin que podr ser procesada directamente en la misma pgina, enviada al servidor para su procesamiento o enviada a una direccin de correo electrnico especificada. Para indicar la accin a realizar con esos datos se utiliza el parmetro ACTION de la etiqueta FORM de definicin del formulario. Por ejemplo, si se quisiera que los datos introducidos por el usuario fueran enviados automticamente a una direccin de correo electrnico, la definicin del formulario en HTML se hara de la siguiente manera:
<FORM ACTION="mailto:admin@mimail.com" METHOD="post"> ............................... ............................... ............................... </FORM>

137

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Cada uno de los datos que el usuario introduzca en el formulario estar asociado al correspondiente campo del mismo, es por ello necesario disponer de un sistema de identificacin de cada uno de esos campos. La identificacin se logra asignando a cada campo un nombre mediante el parmetro NAME de la etiqueta de definicin de campo. Ejemplo 5.1: Supngase que Cinem@s tiene establecidas diferentes tarifas para las localidades en funcin de la edad del cliente y de su condicin o no de estudiante, y que desea que los propios clientes puedan calcular exactamente el importe de sus entradas a travs de una sencilla pgina web. El primer paso resulta evidente: disear un formulario que permita "interrogar" al usuario. El aspecto de ese formulario podra ser el mostrado en la Figura 5.1.

Figura 5.1 Formulario para el clculo de precios de entradas

El cdigo HTML que genera este formulario es:


<FORM NAME="miformulario"> Edad: <INPUT TYPE="text" NAME="edad" SIZE="3"> Estudiante: <INPUT TYPE="radio" NAME="estudiante" VALUE=1> Si <INPUT TYPE="radio" NAME="estudiante" VALUE=0 CHECKED> No <BR> <INPUT TYPE="submit" VALUE="Calcular"> <INPUT TYPE="reset" VALUE="Borrar"> </FORM>

Como puede apreciarse, el formulario tiene asociado (miformulario) al igual que cada uno de sus controles:

un

nombre

El control para introducir la edad es un campo de texto de nombre edad. Para indicar si se es o no estudiante se incluye un grupo de dos botones de radio. Para que ambos botones estn conmutados el nombre asignado a cada uno debe coincidir (en este caso el nombre es estudiante), distinguindose por el valor de la propiedad VALUE.

138

PHP Y LOS FORMULARIOS DE HTML

Los dos ltimos controles del formulario son el botn para enviar los datos (submit) y el de reiniciar todos los valores de los campos (reset). A estos dos controles no es necesario asignarles un nombre ya que no tienen como funcin almacenar datos que luego se deban recuperar.

5.2. ENVO DE DATOS A PROGRAMAS PHP


Los datos que el usuario introduce en un formulario pueden ser enviados de una forma sencilla a un programa PHP para su procesamiento. Precisamente esta sencillez y facilidad de interaccin con los formularios HTML es una de las caractersticas ms destacadas del lenguaje PHP. En primer lugar es preciso indicar en el parmetro ACTION de la etiqueta FORM el documento PHP al que deben ser enviados los datos. Ejemplo 5.2: Si se desea que los datos del formulario anterior sean enviados a un programa que se encuentra en el archivo procesar.php, el formulario debera ser definido de la siguiente manera:
<FORM NAME="miformulario" ACTION="procesar.php"> Edad: <INPUT TYPE="text" NAME="edad" SIZE="3"> Estudiante: <INPUT TYPE="radio" NAME="estudiante" VALUE=1> Si <INPUT TYPE="radio" NAME="estudiante" VALUE=0 CHECKED> No <BR> <INPUT TYPE="submit" VALUE="Calcular"> <INPUT TYPE="reset" VALUE="Borrar"> </FORM>

En este caso se est suponiendo que el archivo procesar.php se encuentra alojado en el servidor en el mismo directorio que el documento HTML que define el formulario; de no ser as se debera indicar el nombre de ese archivo junto con la ruta absoluta o relativa para localizarlo. Una vez indicado el archivo de destino, la pregunta siguiente sera: cmo se reciben esos datos en el programa PHP?, la respuesta a esta cuestin sorprende por su simplicidad: el programa PHP recibir variables con los valores que el usuario introdujo en los campos del formulario; los nombres de esas variables correspondern adems con los nombres de los correspondientes controles.

139

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

NOTA

Para poder acceder a las variables de formulario utilizando directamente el nombre del correspondiente control, el intrprete de PHP debe estar configurado para ello. En la prxima seccin se describir exactamente cul es esa configuracin especial y qu otras opciones hay para referirse a las variables del formulario.

En el caso del formulario anterior, las variables que se enviarn al documento destino son: $edad y $estudiante. La primera de las variables contendr la cadena de caracteres que el usuario introduzca en el campo edad; la segunda de las variables contendr un valor 1 o 0 dependiendo del botn de radio que se encuentre seleccionado. Los valores posibles para esta ltima variable coinciden con los dados en el parmetro VALUE del control del formulario.
$edad $estudiante

Procesar.php

Ambas variables sern accesibles desde cualquier script que se incluya en el archivo destino: procesar.php. A continuacin puede verse cul podra ser el contenido de este archivo:
<html> <head> <title>Importe de la entrada</title> </head> <body> <?php if (($edad<12) or ($estudiante)) echo "El precio de la entrada es 3.5 euros"; else echo "El precio de la entrada es 5 euros"; ?> </body> </html>

Como puede observarse, el script PHP hace uso de las dos variables que provienen del formulario para determinar el precio de la entrada. Si la edad del usuario es menor que 12 o es un estudiante, la pgina mostrar un mensaje diciendo que el importe es 3,5 , en otro caso el importe ser 5 . La variable $estudiante tendr un valor numrico 1 si se ha elegido el primer botn de radio y el valor 0 en el caso del segundo. Cuando los valores numricos se

140

PHP Y LOS FORMULARIOS DE HTML

utilizan en expresiones lgicas, un valor diferente de cero se considera equiparable al valor lgico verdadero.

5.3. MTODOS DE ACCESO A LAS VARIABLES DEL FORMULARIO


Cmo ha podido apreciarse, el paso de datos desde los formularios HTML a los programas PHP es sorprendentemente simple y sencillo, no hay ms que hacer uso de las denominadas variables de formulario. A esas variables se puede hacer referencia de varias maneras, la ms simple es la que se utiliz en el ejemplo analizado en la seccin anterior: el uso de un identificador de variable igual al nombre del campo del formulario precedido del signo $ (esto es lo que se conoce como "estilo corto"). Sin embargo, esta opcin no siempre est disponible, para que esto sea posible el archivo de inicializacin del intrprete de PHP debe estar configurado de una manera especial. Este archivo de inicializacin lleva por nombre php.ini y la configuracin que se exige es la activacin del parmetro register_globals, en concreto, el archivo php.ini debera tener la siguiente lnea:
register_globals = On

En las primeras versiones del lenguaje PHP este parmetro se encontraba activado por defecto, sin embargo, en las ltimas versiones (desde la 4.2) viene desactivado por defecto:
register_globals = Off

Por tanto, si el programador quiere hacer uso del estilo corto para hacer referencia a las variables de formulario debe cambiar ese parmetro. La razn de este cambio de estrategia en los desarrolladores de PHP al dejar de considerarlo activado por defecto est en el hecho de que este estilo de acceso es ms proclive a cometer errores que puedan comprometer la seguridad en el cdigo. De hecho, en el propio archivo de configuracin se advierte de este riesgo. Lo que puede ocurrir al considerar las variables de formulario como globales es que el programa pueda recibir variables del exterior y que las considere como si fuesen variables provenientes de un formulario. En la prxima seccin se ver cmo es posible, por ejemplo, pasar variables a un programa directamente en el URL.

141

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

A pesar de estos riesgos, en este libro se utilizar habitualmente el estilo corto en las variables de formulario por resultar mucho ms prctico. En el caso de que el estilo corto no est habilitado, o simplemente no se desee hacer uso de l, en PHP existen otras dos formas de acceder a las variables de los formularios. La primera de ellas es el uso de un estilo intermedio en el que se accede a las variables a travs de un array asociativo con un ndice igual al nombre del campo del formulario. Esta opcin apareci por primera vez en el PHP 4.1. En concreto, todos los valores que el usuario introduzca en el formulario quedarn almacenados en el array:
$_REQUEST[]

Adicionalmente tambin se almacenarn en los arrays:


$_POST[] $_GET[]

dependiendo del mtodo utilizado para el envo de los datos del formulario. Precisamente en la prxima seccin se analizarn las diferencias entre ambos mtodos de envo (get y post). Ejemplo 5.3: En el caso del formulario de la Figura 5.1, desde el programa PHP se podra acceder a los datos introducidos por el usuario en los campos edad y estudiante de la manera siguiente:
$_REQUEST['edad'] $_REQUEST['estudiante'] $_GET['edad'] $_GET['estudiante']

En este caso, se puede utilizar el array $_GET[] porque el mtodo GET es el mtodo de envo por defecto de los formularios de HTML. El cdigo completo del script que recibe los datos del formulario sera:
<?php if (($_GET['edad']<12) or ($_GET['estudiante'])) echo "El precio de la entrada es 3.5 euros"; else echo "El precio de la entrada es 5 euros"; ?>

Finalmente, en PHP existe otra posibilidad para acceder a las variables del formulario; se trata de una notacin que garantiza el funcionamiento en todos los

142

PHP Y LOS FORMULARIOS DE HTML

servidores e independientemente de la configuracin de PHP. En este caso se vuelven a utilizar dos arrays asociativos:
$HTTP_POST_VARS[] $HTTP_GET_VARS[]

de nuevo dependiendo del mtodo de envo de los datos. Ejemplo 5.4: A las variables del formulario del Ejemplo 5.1 se puede acceder tambin de la siguiente manera:
$HTTP_POST_VARS['edad'] $HTTP_POST_VARS['estudiante']

En la actualidad, este estilo de acceso a las variables se considera obsoleto y es muy probable que desaparezca, por lo que no se recomienda su uso.

5.4. MTODOS DE TRANSFERENCIA DE DATOS EN FORMULARIOS


Los datos que el usuario introduzca en un formulario de una pgina web pueden ser transferidos al servidor para su procesamiento con dos mtodos diferentes: Mtodo GET: los datos son enviados dentro del URL de localizacin del destino. Mtodo POST: los datos son enviados de manera "invisible" para el usuario, haciendo uso del protocolo http y en un encabezado independiente.

El mtodo de transferencia se especifica en la definicin del formulario mediante el parmetro METHOD, asignndole el valor "Get" o "Post" en funcin del mtodo elegido. En caso de ausencia de ese parmetro, se considera como mtodo por defecto el mtodo GET. En el caso de que los datos deban ser transferidos por correo electrnico, es obligatorio el uso del mtodo POST.

143

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

5.4.1. MTODO GET


Ejemplo 5.5:

Considrese el formulario definido anteriormente. A pesar de que el mtodo de transferencia es por defecto GET, aqu se indica explcitamente:
<FORM NAME="miformulario" ACTION="procesar.php" METHOD="Get"> Edad: <INPUT TYPE="text" NAME="edad" SIZE="3"> Estudiante: <INPUT TYPE="radio" NAME="estudiante" VALUE=1> Si <INPUT TYPE="radio" NAME="estudiante" VALUE=0 CHECKED> No <BR> <INPUT TYPE="submit" VALUE="Calcular"> <INPUT TYPE="reset" VALUE="Borrar"> </FORM>

Si el usuario que accede a esa pgina rellena el formulario de la siguiente manera:

Figura 5.2 Envo de datos a travs del formulario

debera ser transferido el valor 35 para la variable edad y el valor 0 para la variable estudiante. Con el mtodo GET lo que se hace es aadir esas asignaciones a continuacin del URL de destino (el indicado en el parmetro ACTION) de la siguiente manera: ...URL...?variable=valor&variable=valor&variable=valor... En concreto, con los datos anteriores, el URL que se formara tendra el siguiente aspecto:
http://miservidor/procesar.php?edad=35&estudiante=0

Este URL sera visible en la barra de direccin del navegador al visualizar la pgina resultado (Figura 5.3). Si el usuario rellena el formulario de la siguiente manera:

144

PHP Y LOS FORMULARIOS DE HTML

el URL que se generara sera: http://miservidor/procesar.php?edad=23&estudiante=1

Figura 5.3 Pgina generada a partir del envo con el mtodo get

5.4.2. MTODO POST


Como ha podido apreciarse en los ejemplos anteriores, con el mtodo GET cualquier persona que vea la pgina resultado podr conocer los valores que el usuario introdujo en el formulario previo, ya que estos son visibles directamente en la barra de direcciones. Cuando se desea ocultar esa informacin debe usarse el otro mtodo de transferencia: el mtodo POST. Con este mtodo los datos son transferidos en una cabecera http independiente y no son visibles para el usuario. Ejemplo 5.6: Si el formulario se define de la siguiente manera:
<FORM NAME="miformulario" ACTION="procesar.php" METHOD="Post"> Edad: <INPUT TYPE="text" NAME="edad" SIZE="3"> Estudiante: <INPUT TYPE="radio" NAME="estudiante" VALUE=1> Si <INPUT TYPE="radio" NAME="estudiante" VALUE=0 CHECKED> No <BR>

145

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

<INPUT TYPE="submit" VALUE="Calcular"> <INPUT TYPE="reset" VALUE="Borrar"> </FORM>

El script recibir los datos y se ejecutar de la misma manera, pero en la barra de direccin del navegador cuando se visualice la pgina generada no podr verse ninguna informacin sobre las variables transferidas (vase Figura 5.4).

Figura 5.4 Pgina generada a partir del envo con el mtodo post

5.4.3. DIFERENCIAS ENTRE AMBOS MTODOS


El uso de uno u otro mtodo de transferencia de datos implica diferentes ventajas e inconvenientes que se deben tener presentes a la hora de optar por uno de ellos. Con el mtodo GET: La cantidad de informacin a transmitir est condicionada por la longitud mxima de los URL que pueden ser procesados por el servidor y el cliente web. Se permite aadir la URL con los datos a la lista de favoritos (bookmarks), de manera que por ejemplo no sera necesario que el usuario vuelva a introducir los datos en el formulario, ya que estos quedaran incluidos en el URL almacenado. No se conserva la privacidad de los datos transferidos (aparecen en el URL y por tanto en la barra de direcciones del navegador, quedan registrados en el historial,...)

146

PHP Y LOS FORMULARIOS DE HTML

Con el mtodo POST: No hay lmite en la cantidad de informacin a transferir, ya que esta se transfiere de manera independiente. No se puede agregar a la lista de favoritos la pgina destino, ya que para generarla es necesario que las variables sean transferidas de nuevo directamente del formulario.

Los datos transferidos no son visibles en la URL y no quedan registrados en el historial, conservando de este modo la privacidad. A la vista de esta diferencias, queda claro por ejemplo que cuando la informacin transferida sea confidencial (por ejemplo contraseas), se debera utilizar el mtodo POST, adems de poder establecer otro tipo de medidas (cifrado de datos, conexiones seguras,...).

5.5. TRANSFERENCIA DE DATOS AL SCRIPT DESDE EL URL


Cuando se coment el riesgo que supone la utilizacin del estilo corto para referenciar a las variables de los formularios, se indic que el usuario poda transferir directamente variables al script y que estas podran ser confundidas con variables que realmente provenan de un formulario. En esta seccin se indica una forma muy sencilla que tiene el usuario para transferir datos a los programas PHP. Utilizando la misma idea en la que se basa el mtodo GET, es posible transferir valores para las variables del script directamente desde la barra de direcciones del navegador o desde un enlace. Se trata, en definitiva, de incluir asignaciones de variables y valores al final del URL con la misma sintaxis que utiliza el mtodo GET:
http://servidor/script.php?variable1=valor1&variable2=valor2. ..

En el caso de que los valores de alguna de las variables transferidas incluyan espacios en blanco, estos deben ser sustituidos por el signo '+'. Ejemplo 5.7: Si el usuario en la barra de direccin de su navegador escribe el URL:
http://miservidor/favorita.php?titulo=Piratas+del+Caribe

147

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

estara indicando que se debe transferirse al script que se encuentra en el archivo favorita.php una variable de tipo cadena de caracteres de nombre titulo y valor "Piratas del Caribe". El script recibira esa variable como cualquier otra variable proveniente de un formulario. El siguiente script recoge esa variable y muestra a partir de ella un mensaje:
<?php echo "Su pelcula favorita es \"$titulo\". "; echo "Muchas gracias por su opinin"; ?>

Evidentemente, no es habitual ni recomendable que se solicite al usuario la introduccin de datos de esta manera. En este caso, si el usuario no aade al URL la variable titulo con su correspondiente valor, el script anterior generara un mensaje de error al encontrarse con una variable no definida. La forma de evitar ese error es utilizar la funcin isset() que permite averiguar si una variable concreta se encuentra definida o no: Ejemplo 5.8: El siguiente script hace uso de la funcin isset() para comprobar si la variable $titulo se encuentra definida, y en funcin de esa comprobacin genera un mensaje diferente en la pgina:
<?php if (isset($titulo)) { echo "Su pelcula favorita es \"$titulo\"."; echo "Muchas gracias por su opinin"; } else { echo "No nos ha indicado su pelcula favorita"; } ?>

Otra de las utilidades de esta forma de transferir datos a los scripts es la generacin dinmica de enlaces; en este caso, los URL con las variables son incluidos en etiquetas HTML de definicin de enlaces. Ejemplo 5.9: Supngase que se desea disear un formulario para introducir datos de pelculas y una serie de enlaces que permitan verificar y confirmar los datos antes de ser enviados al servidor.

148

PHP Y LOS FORMULARIOS DE HTML

El primer paso sera el diseo del formulario:

Figura 5.5 Formulario de recogida de datos sobre pelculas

El cdigo HTML que genera este formulario es:


<html> <head><title>Datos de pelculas</title></head> <body> <form action="procesarpelicula.php"> Titulo: <input type="text" name="titulo" size="90"> <br> Actores: <input type="text" name="actores" size="85"> <br> Director: <input type="text" name="direccion" size="40"> <br> Guin: <input type="text" name="guion" size="30"> Produccin: <input type="text" name="produccion" size="30"> <hr> Ao: <input type="text" name="anno" size="4"> Nacionalidad: <input type="text" name="nacionalidad" size="15"> Gnero: <select name="genero"> <option selected> Comedia <option> Drama <option> Accin <option> Terror <option> Suspense <option> Otras </select> Duracin: <input type="text" name="duracion" size="3"> (minutos) <br> Restricciones de edad: <input type="radio" name="edad" value="Apta">

149

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Todos los pblicos <input type="radio" name="edad" value="Mayores de 7"> Mayores de 7 aos <input type="radio" name="edad" value="Mayores de 18"> Mayores de 18 aos <br> <input type="submit" value="Enviar"> <input type="reset" value="Borrar"> </form> </body> </html>

El usuario podra cumplimentar el formulario con los datos que se muestran en la Figura 5.6.

Figura 5.6 Introduccin de datos de una pelcula

Cuando el usuario pulse el botn "Enviar", los datos sern transferidos al script que se encuentra en el archivo procesarpelicula.php y cuyo contenido se incluye a continuacin:
<html> <head><title>Confirmacin de datos</title></head> <body> Datos recibidos correctamente, si quiere confirmar los valores active el enlace correspondiente <br> <?php

150

PHP Y LOS FORMULARIOS DE HTML

$url1="confirmar.php?datos=a&titulo=$titulo&" . "actores=$actores&genero=$genero"; echo "<A HREF=\"$url1\"> Ficha artstica </A> <BR>"; $url2="confirmar.php?datos=t&direccion=$direccion&" . "produccion=$produccion&guion=$guion"; echo "<A HREF=\"$url2\"> Ficha tcnica </A> <BR>"; $url3="confirmar.php?datos=o&nacionalidad=$nacionalidad&" . "anno=$anno&duracion=$duracion&edad=$edad"; echo "<A HREF=\"$url3\"> Otros datos </A> <BR>"; ?> </body> </html>

Como puede apreciarse, este script recibe las variables con los datos introducidos por el usuario y genera de manera dinmica tres simples enlaces, obtenindose la pgina que muestra la Figura 5.7.

Figura 5.7 Pgina con los enlaces generados dinmicamente

Todos los enlaces tienen como destino un tercer archivo (confirmar.php), pero en cada uno de ellos se aaden al URL diferentes variables que sern transferidas al script. Adems se utiliza una nueva variable (datos) para que el script destino sepa cules son las variables que vienen dentro del URL que reciba. El cdigo que se encuentra en el archivo confirmar.php se incluye a continuacin. Como puede apreciarse, el script destino de los enlaces generar una pgina diferente en funcin de las variables que se reciben desde la pgina origen.

151

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

<html> <body> <?php if($datos=="a") { print "<h1> $titulo </h1>"; print "Gnero: $genero <br>"; print "Protagonizada por $actores <br>"; } elseif ($datos=="t") { print "Dirigida por $direccion <br>"; print "Producida por $produccion <br>"; print "Guin de $guion <br>"; } elseif ($datos=="o") { print "Nacionalidad: $nacionalidad <br>"; print "Ao: $anno <br>"; print "Duracin: $duracion minutos <br>"; print "Autorizada para: $edad <br>"; } ?> </body> </html> De esta manera, dependiendo de cul sea el enlace que active el usuario, la pgina mostrar una informacin u otra. En concreto, las pginas que se generarn por cada uno de los enlaces anteriores son las que muestran la Figura 5.8, la Figura 5.9 y la Figura 5.10.

Figura 5.8 Pgina generada despus de seleccionar el enlace "Ficha Artstica"

152

PHP Y LOS FORMULARIOS DE HTML

Figura 5.9 Pgina generada despus de seleccionar el enlace "Ficha tcnica"

Figura 5.10 Pgina generada despus de seleccionar el enlace "Otros datos"

5.6. TRATAMIENTO DE FORMULARIOS CON LISTAS DE SELECCIN MLTIPLE


Cuando los formularios incluyen listas de seleccin mltiple, debe tenerse en cuenta que si se desea que se transfieran al script todas las opciones seleccionadas

153

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

por el usuario en la lista, el correspondiente campo no puede tener un nombre simple como los restantes campos de formulario. Ejemplo 5.10: Si se desea disear un formulario en el que el usuario seleccione uno o varios temas de inters dentro de una lista, se podra optar por incluir en la definicin del formulario el siguiente cdigo HTML:
<SELECT MULTIPLE NAME=tema SIZE=5> <OPTION>Msica <OPTION>Cine <OPTION>Deportes <OPTION>Informtica <OPTION>Viajes </SELECT>

En este caso, la lista viene identificada por el nombre tema. Si el usuario opta por seleccionar varias opciones de la lista (por ejemplo, tal como muestra la Figura 5.11), cuando los datos se transfieran al script de destino, la variable $tema tendr el valor "Informtica"; es decir, la variable guardar el valor de la ltima opcin seleccionada por el usuario.

Figura 5.11 Pgina que muestra una lista de seleccin mltiple

Evidentemente, la principal utilidad de las listas de seleccin mltiple es permitir al usuario seleccionar varias opciones y que todas ellas puedan ser tratadas adecuadamente. Para conseguir que al script destino llegue no la ltima opcin

154

PHP Y LOS FORMULARIOS DE HTML

seleccionada sino todas ellas, a la hora de dar un nombre al campo del formulario se deberan utilizar un par de corchetes vacos para sealar que realmente se guardar todo un vector o array de valores.
<SELECT MULTIPLE NAME=tema[] SIZE=5> <OPTION>Msica <OPTION>Cine <OPTION>Deportes <OPTION>Informtica <OPTION>Viajes </SELECT>

El script recibir en este caso un array $tema[] que podr ser procesado para obtener todas sus componentes individuales. Como se ver en el prximo captulo existen incluso estructuras iterativas que permiten recorrer todos los elementos de un array de una manera simple.

155

SENTENCIAS DE CONTROL
6.1. INTRODUCCIN
Todo lenguaje de programacin requiere de estructuras que permitan variar el flujo normal de ejecucin de los programas en funcin del valor de una expresin o de la satisfaccin de determinadas condiciones. Las denominadas sentencias de control son las que permiten alterar el orden secuencial habitual en la ejecucin de las sentencias. Bsicamente las sentencias de control se clasifican en dos grandes bloques: Estructuras condicionales. Estructuras iterativas.

Las primeras son las que permiten seleccionar porciones de cdigo a ejecutar si se cumplen determinadas condiciones; las segundas permiten establecer un bloque de instrucciones que se ejecutarn un nmero determinado de veces o mientras se satisfaga una condicin. En las prximas secciones se analizarn las diferentes sentencias de control disponibles en PHP a partir de sencillos ejemplos prcticos.

157

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

6.2. ESTRUCTURAS CONDICIONALES


6.2.1. SENTENCIA IF
La primera de las estructuras condicionales con las que cuenta PHP es la sentencia if. Esta estructura permite ejecutar una sentencia o bloque de sentencias siempre que se cumpla determinada condicin. Esta sentencia condicional, con su sintaxis propia, est presente en todos los lenguajes de programacin. En el caso del lenguaje PHP la sintaxis es totalmente similar a la del lenguaje C:
if (expresin) sentencia

o bien
if (expresin) { bloque de sentencias }

Cuando la expresin se evala como verdadera, se ejecutan la sentencia o bloque de sentencias que siguen; en caso contrario, estas sentencias son ignoradas. Como puede apreciarse, en el caso de que se deseen ejecutar varias sentencias en funcin del valor de la expresin, estas deben introducirse entre llaves. Recordar igualmente que en PHP toda expresin que produzca como resultado un valor numrico distinto de cero, una cadena diferente de la cadena vaca o un array no vaco, si aparece dentro de un contexto lgico es tratada como el valor booleano verdadero (true).
Con objeto de que el cdigo de los programas resulte ms legible suele ser recomendable utilizar diferentes niveles de sangrado para identificar los bloques de sentencias que se ejecutan en caso de verificarse una condicin. Debe advertirse sin embargo que esto nicamente tiene un efecto "esttico" en el programa y no influye en la ejecucin del mismo.

NOTA

158

SENTENCIAS DE CONTROL

Ejemplo 6.1: Considrese el siguiente fragmento de programa en el que se genera un mensaje en la pgina solo cuando el valor de la variable $descuento es mayor que 0:
if ($descuento > 0) print "Artculo con precio rebajado";

Debe tenerse especial cuidado cuando se desea ejecutar ms de una sentencia si la condicin es cierta. Ejemplo 6.2: Por ejemplo, dada la estructura siguiente:
if ($x > 0) $y = 2 * $x; $z = 1 / $x;

si el valor de la variable $x fuese 0 generara un error de tipo aritmtico (divisin por cero). Por qu se produce ese error? La razn es que la segunda sentencia de asignacin (la de asignacin de valor a la variable $z) sera ejecutada siempre, independientemente del resultado de la condicin $x > 0. El hecho de que esa sentencia est en el mismo nivel de sangrado que la sentencia anterior no tiene ninguna relevancia a efectos de la ejecucin; el error que se est cometiendo al escribir la estructura anterior es el olvido de las llaves para delimitar todo el bloque de cdigo que debe ejecutarse cuando la condicin sea cierta. En ausencia de llaves, solo se ejecutara la primera sentencia que se encuentra, quedando la segunda, por tanto, fuera de la estructura condicional. La forma correcta de escribir la estructura condicional es:
if ($x > 0) { $y = 2 * $x; $z = 1 / $x; }

Por supuesto, la forma de colocar las llaves para delimitar el bloque se presta a que cada programador opte por un estilo propio; por ejemplo, se conseguira el mismo efecto escribiendo el cdigo de cualquiera de las siguientes maneras:
if ($x > 0) { $y = 2 * $x; $z = 1 / $x; }

159

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

if ($x > 0) {$y = 2 * $x; $z = 1 / $x;}

e incluso
if ($x > 0) { $y = 2 * $x; $z = 1 / $x; }

Las expresiones que determinan la condicin de ejecucin de las sentencias en la estructura condicional deben ser siempre dadas entre parntesis. En este sentido el lenguaje PHP es sintcticamente ms estricto que otros lenguajes. Ejemplo 6.3: La sentencia:
if $fila <= 5 $ocupada = true;

producira un error con el siguiente mensaje:


Parse error: parse error, unexpected T_VARIABLE, expecting '('

por no indicar entre parntesis la condicin. Incluso cuando la condicin es una simple variable de valor lgico, esta debe darse entre parntesis. Por ejemplo:
if ($ocupada) print "Lo siento, asiento no disponible";

En las expresiones condicionales es habitual tambin el uso de los operadores lgicos para definir condiciones ms complejas. Ejemplo 6.4: La siguiente estructura condicional escribira el mensaje "Lo siento, asiento no disponible" cuando la variable $fila tome un valor entre 10 y 12 o la variable $vendida tenga el valor true. Obsrvese de nuevo la necesidad de introducir toda la condicin entre parntesis y usar igualmente parntesis para establecer el orden de evaluacin de la expresin.
if ((($fila >= 10) and ($fila <= 12)) or $vendida) print "Lo siento, asiento no disponible";

160

SENTENCIAS DE CONTROL

Finalmente, en relacin a la condicin, advertir de nuevo algo que ya se coment a la hora de presentar los diferentes operadores del lenguaje: debe tenerse especial cuidado en no confundir el operador de comparacin de igualdad con el de asignacin. Ejemplo 6.5: La sentencia
if ($fila = 15) print "ltima fila de la sala";

escribira siempre el mensaje "ltima fila de la sala" independientemente del valor de la variable $fila, ya que en la propia estructura condicional se est realizando una asignacin del valor 15 a esa variable y no una comparacin. La estructura condicional correcta sera:
if ($fila == 15) print "ltima fila de la sala";

Por supuesto, las estructuras condicionales pueden anidarse unas dentro de otras. Ejemplo 6.6:
if ($fila <= 5) { print "Fila prxima a la pantalla"; if (($asiento == 1) or ($asiento == 20)) { print "Mala visibilidad de la pantalla"; } }

En este caso cuando la variable $fila toma un valor menor o igual que 5 se advierte al usuario de la proximidad a la pantalla; si adems de eso el asiento corresponde a los nmeros 1 20, se advierte de una mala visibilidad. Ya se ha comentado que las expresiones que se evalan en las condiciones, pueden ser no solo expresiones lgicas, sino tambin expresiones numricas, cadenas de caracteres o incluso arrays. Cualquier expresin numrica que d como resultado un nmero diferente de 0, o cualquier cadena o array no vaco equivale al valor lgico true.

161

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Ejemplo 6.7: La sentencia


if($precio) print "El precio es $precio euros";

escribira un mensaje con el precio cuando el valor de la variable sea diferente de cero (valor true). Ejemplo 6.8: La sentencia
if(!$nombre) print "Por favor, dganos su nombre";

mostrara el mensaje cuando la variable $nombre tenga como valor la cadena de caracteres vaca.

6.2.2. LA CLUSULA ELSE


Es frecuente encontrarse con situaciones en las que se quiere que un bloque de sentencias sea ejecutado cuando se cumpla cierta condicin, y otro bloque lo sea cuando esa condicin es falsa. En principio esto podra conseguirse encadenando dos sentencias condicionales if; sin embargo existe una forma mucho ms efectiva de programar estas estructuras: el uso de la clusula else dentro de la sentencia if. La sintaxis concreta de la sentencia if...else sera:
if (condicin) { sentencias a ejecutar si la condicin es cierta } else { sentencias a ejecutar si la condicin es falsa }

Las sentencias del bloque else se ejecutarn solamente si la condicin se evala como falsa.

162

SENTENCIAS DE CONTROL

De nuevo, en caso de que alguno de los bloques est constituido por una nica sentencia, las llaves podran suprimirse. Ejemplo 6.9: Supuesto que la variable $edad guarda la edad de una persona, y se desea asignar valores diferentes a la variable $precio para los nios menores de 12 aos o jubilados y para el resto de personas, se podra escribir una sentencia condicional con una clusula else:
if (($edad < 12) or ($edad >= 65)) $precio = 3.5; else $precio = 4.75;

Ejemplo 6.10: La sentencia


if($precio) print "El precio es $precio euros"; else print "Entrada gratuita";

escribira el mensaje con el precio cuando la correspondiente variable tenga un valor diferente de cero (equivalente a true) y escribira "Entrada gratuita" en otro caso (valor numrico 0, o equivalentemente false). Obsrvese cmo en ambos casos las llaves han podido suprimirse por estar constituidos los bloques por una sola sentencia. De todas formas debe tenerse un especial cuidado con la supresin de esas llaves porque pueden provocar errores que en ocasiones resultan difciles de detectar. Ejemplo 6.11: Considrese la estructura condicional siguiente:
if ($num == 126) $fila = 12; $asiento = 8; else $fila = 10; $asiento = 6;

163

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Tal como est escrita se generara el siguiente error:


Parse error: parse error, unexpected T_ELSE

debido a que al no utilizar llaves en el bloque a ejecutar en el caso de que la variable $num tome el valor 126, la segunda de las sentencias de ese bloque hara finalizar la estructura condicional. En cambio, la sentencia
if ($num == 126) { $fila = 12; $asiento = 8; } else $fila = 10; $asiento = 6;

no produce ningn error, pero tampoco produce el efecto deseado, ya que la ausencia de llaves en el bloque else hace que la segunda sentencia del bloque se considere fuera de la estructura condicional y por tanto se ejecuta siempre, independientemente del valor de la condicin. De manera que, por ejemplo, si la variable $num tiene el valor 126, despus de esas sentencias $fila valdra 12 pero $asiento valdra 6. En definitiva, la estructura condicional correcta requiere en este caso agrupar entre llaves cada uno de los bloques de sentencias a ejecutar:
if ($num == 126) { $fila = 12; $asiento = 8; } else { $fila = 10; $asiento = 6; } Adems de las sentencia if...else, PHP dispone del operador condicional que ya fue presentado cuando se mostraron los diferentes operadores del lenguaje. Este operador condicional resulta til para realizar sencillas asignaciones en las que el valor asignado dependa del resultado de una condicin.

NOTA

164

SENTENCIAS DE CONTROL

6.2.3. SENTENCIA IF ... ELSEIF ... ELSE


Por supuesto, las estructuras if pueden encadenarse una tras otra o anidarse para poder indicar bloques de sentencias a ejecutar en funcin de varias condiciones diferentes; de todas formas, existe una estructura condicional optimizada que permite realizar esta accin, se trata de la estructura if...elseif...if. La sintaxis general de esta sentencia es:
if (condicin1) { sentencias a ejecutar si la condicin1 es cierta } elseif (condicin2) { sentencias a ejecutar si la condicin2 es cierta } elseif (condicin3) { sentencias a ejecutar si la condicin3 es cierta } ... else { sentencias a ejecutar si ninguna de las condiciones anteriores es cierta }

Como en las estructuras condicionales anteriores, cuando los bloques de rdenes a ejecutar en cada caso estn compuestos por una nica sentencia, las llaves se pueden suprimir. Adems, debe indicarse que es igualmente opcional la utilizacin de la clusula else para indicar sentencias a ejecutar cuando todas las condiciones sean falsas. El funcionamiento de esta sentencia es el esperado: si la primera condicin es evaluada como cierta, entonces se ejecutan las sentencias del bloque correspondiente y tras ello finaliza la ejecucin de la sentencia. En el caso de que la primera condicin sea falsa, el intrprete continuar evaluando de manera consecutiva las siguientes condiciones hasta encontrar la primera que es cierta, en cuyo caso se ejecutan las sentencias de su bloque y se finaliza. Es de destacar, por tanto, que el orden en el que se indiquen las diferentes condiciones resulte decisivo, ya que nicamente se ejecutar el bloque asociado a la primera condicin cierta, ignorando los restantes bloques aunque su condicin pueda ser igualmente cierta.

165

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Ejemplo 6.12: La siguiente estructura condicional asigna diferente valor a la variable $precio en funcin del valor de la variable $edad:
if ($edad < 3) { $precio = 0; } elseif ($edad <= 16) { $precio = 8; } elseif ($edad > 16 and $edad < 65) { $precio = 12; } else { $precio = 10; }

En este caso, las llaves de cada bloque podran suprimirse. Comentar igualmente que la estructura anterior se podra escribir tambin en la forma:
if ($edad < 3) { $precio = 0; } else if ($edad <= 16) { $precio = 8; } else if ($edad > 16 and $edad < 65) { $precio = 12; } else { $precio = 10; }

En este caso se estaran utilizando tres sentencias condicionales anidadas. Como puede observarse en este ejemplo, en una estructura condicional se conseguira el mismo efecto utilizando la palabra elseif o las palabras else if, a pesar de tener diferente significado sintctico (en el primer caso se estara

166

SENTENCIAS DE CONTROL

ante una sola sentencia y en el segundo ante dos sentencias condicionales anidadas). Ejemplo 6.13: Supngase que se desea que una pgina web muestre un mensaje de bienvenida diferente dependiendo de la hora del da; por ejemplo, considrese el siguiente script:
$hora=date("H"); if ($hora<5) print("Buenas elseif ($hora<12) print("Buenos elseif ($hora<20) print("Buenas else print("Buenas print("bienvenido

noches, "); das, "); tardes, "); noches, "); a nuestra pgina web");

En este caso se generara un mensaje de "Buenas noches", "Buenos das" o "Buenas tardes" en funcin del valor de la variable $hora. Para saber la hora actual se hace uso de la funcin date() que ser estudiada con detalle en el captulo dedicado a las funciones predefinidas en PHP (Captulo 9). Esta funcin se puede utilizar para obtener tanto fechas como horas en diferentes formatos, para ello se debe indicar como argumento una cadena de caracteres que acta de patrn de formato. En este caso la cadena "H" indica que lo que se desea obtener es el nmero de hora de 0 a 23.
Debe recordarse que PHP es un lenguaje de programacin del lado del servidor, lo que significa que los programas son ejecutados en el servidor y no en el cliente. Por tanto, la fecha y la hora que se obtienen con la funcin date() seran las del servidor, que no necesariamente coinciden con la fecha y hora del cliente que acceda a la pgina.

NOTA

6.2.4.

SINTAXIS ALTERNATIVA DE LAS SENTENCIAS IF

PHP admite una sintaxis alternativa para la construccin de estructuras condicionales; con esta sintaxis el bloque de sentencias a ejecutar se delimita entre el signo ':' y la palabra reservada endif:

167

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

if (condicin) : sentencias a ejecutar si la condicin es cierta endif;

Ejemplo 6.14: Un sencillo ejemplo de construccin de una estructura condicional con esta sintaxis sera:
if ($x != 0) : $y = 1 / $x; endif;

en este caso se asigna a la variable $y el inverso del valor de $x siempre que este ltimo sea diferente de 0. En las estructuras if...elseif...else tambin es posible utilizar esta sintaxis alternativa; Ejemplo 6.15:
if ($y == 1): $z = 3; elseif ($y == 2): $z = 5; else: $z = 7; endif;

NOTA

Una de las caractersticas ms sorprendentes, pero al mismo tiempo ms tiles, del lenguaje PHP es la posibilidad de partir una estructura en dos scripts diferentes, integrando entre ellos cdigo HTML puro. En el caso de estructuras condicionales esta posibilidad permite enviar al cliente un cdigo HTML solo cuando se verifique determinada condicin.

La sintaxis alternativa de las sentencia if resulta especialmente apropiada cuando se desea fraccionar la estructura en dos o ms scripts, ya que el inicio y final de cada bloque queda sealado de forma muy clara y sin prestarse a confusin.

168

SENTENCIAS DE CONTROL

Ejemplo 6.16: El siguiente fragmento de cdigo incluye dos scripts entre los que se est colocando cdigo HTML puro. En este caso, el primer script comienza una estructura condicional en la que se pregunta si la variable $edad se encuentra definida y si su valor es menor que 7; en caso de que esto ocurra la pgina mostrar una lista HTML con un conjunto de pelculas autorizadas para todos los pblicos.
<?php if (isset($edad) and ($edad < 7)) : ?> Listado de pelculas <U>autorizadas para todos los pblicos</U>: <UL> <LI>Nemo <LI>Hermano Oso <Ul> <?php endif; ?>

Obsrvese cmo despus de incluir el cdigo HTML de definicin de la lista, un nuevo script PHP cierra la estructura condicional abierta en el primer script. Por supuesto, el mismo efecto se podra haber conseguido con un nico script en el que todas los comandos HTML fuesen generados con las funciones echo() o print(), pero sin lugar a dudas, esta posibilidad de "romper" la estructura condicional permite escribir ese cdigo HTML de una manera mucho ms sencilla.

6.2.5. ESTRUCTURAS CONDICIONALES SWITCH...CASE


La sentencia switch permite definir estructuras condicionales en las que diferentes bloques de sentencias sern ejecutados dependiendo del valor de una misma variable o expresin. En principio cualquier estructura switch se podra escribir de forma equivalente con una sentencia if...elseif...else, sin embargo, las sentencias switch facilitan la generacin de la estructura cuando lo que se quiere comprobar en todas las condiciones es el valor que toma una misma variable o expresin. La sintaxis bsica de la sentencia es:
switch (expresion) { case valor1: sentencias case valor2:

169

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

sentencias ... case valorN: sentencias default: sentencias }

Esta sentencia evala la expresin y sucesivamente compara el valor devuelto con los valores que van apareciendo en cada una de las clusulas case, cuando el valor coincide ejecuta las sentencias que van a continuacin hasta llegar al final de la estructura o encontrarse una sentencia de finalizacin break. La clusula default es opcional y permite indicar las sentencias a ejecutar cuando la expresin no toma ninguno de los valores anteriores. La expresin que se evala y compara en la estructura switch puede ser cualquier expresin que se evale a un tipo simple, es decir, nmeros enteros o de punto flotante y cadenas de caracteres. En cada una de las clusulas case se puede indicar uno de los valores admisibles de la expresin, pero no se pueden indicar condiciones lgicas sobre esos valores. Ejemplo 6.17: A continuacin se presenta un sencillo ejemplo de estructura condicional switch con su estructura equivalente if...elseif...else, en este caso la estructura se encarga de asignar diferentes valores a la variable $precio en funcin del valor que tome otra variable $dia:
switch ($dia) { case 'L': $precio break; case 'M': $precio break; case 'X': $precio break; case 'J': $precio break; case 'V': $precio

= 4;

= 3;

= 4.5;

= 4.5;

= 5;

170

SENTENCIAS DE CONTROL

break; case 'S': $precio = 5; break; case 'D': $precio = 4.5; break; }

La sentencia if equivalente sera:


if ($dia == 'L') $precio = 4; elseif ($dia == 'M') $precio = 3; elseif ($dia == 'X') $precio = 4.5; elseif ($dia == 'J') $precio = 4.5; elseif ($dia == 'V') $precio = 5; elseif ($dia == 'S') $precio = 5; elseif ($dia == 'D') $precio = 4.5;

En una sentencia switch la condicin, o expresin que la define, se evala solo una vez y el resultado se compara con cada uno de los valores que aparecen en las clusulas case. En una sentencia if..elseif...else, en cambio, la condicin se evala en cada una de las clusulas elseif, por lo que a efectos de ejecucin y dependiendo de la complejidad de la condicin, las estructuras switch pueden resultar ms rpidas que sus equivalentes estructuras if.
Debe tenerse presente la forma en la que se ejecuta la sentencia switch: cuando el valor de la expresin coincide con alguno de los valores dados en la sentencia, se ejecutan todas las sentencias que van a continuacin hasta encontrarse una sentencia break o alcanzar el final de la estructura. Si no aparece ningn break, se seguirn ejecutando las sentencias correspondientes a los siguientes bloques case. Esta particularidad suele ser fuente de errores en programadores noveles.

NOTA

171

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Ejemplo 6.18: Si la sentencia switch anterior se hubiese escrito de la forma siguiente:


switch ($dia) { case 'L': $precio case 'M': $precio case 'X': $precio case 'J': $precio case 'V': $precio case 'S': $precio case 'D': $precio }

= 4; = 3; = 4.5; = 4.5; = 5; = 5; = 4.5;

el valor de la variable $precio siempre sera 4.5 ya que al no existir ninguna sentencia break, en cuanto la variable $dia tome uno cualquiera de los 7 valores predefinidos, se ejecutaran todas las sentencias correspondientes hasta el final y por tanto la nica asignacin que tendra efecto es la ltima. Para evitar esto es para lo que se utiliza la orden break al final del bloque de sentencias que se deseen ejecutar en cada caso. De esta manera, cuando el valor de la variable coincide con uno de los valores preestablecidos se procede a la asignacin del valor correspondiente a $precio y se abandona la estructura. Evidentemente, el ltimo break no sera necesario. En el caso de que el valor de la variable $dia no coincida con ninguno de los valores predefinidos (L, M, X, J, V, S y D), la variable $precio no tendra ningn valor asignado. Si se desea evitar esto podra utilizarse la clusula default para establecer un valor a asignar por defecto:
switch ($dia) { case 'L': $precio case 'M': $precio case 'X': $precio case 'J': $precio

= 4; break; = 3; break; = 4.5; break; = 4.5; break;

172

SENTENCIAS DE CONTROL

case 'V': $precio case 'S': $precio case 'D': $precio default: $precio }

= 5; break; = 5; break; = 4.5; break; = 0;

Finalmente, indicar que es posible que la lista de sentencias de un case se encuentre vaca, en cuyo caso, al no encontrar tampoco ninguna sentencia break, el programa pasara a ejecutar las sentencias del siguiente case. Esta caracterstica permite optimizar el cdigo de estructuras switch en las que un mismo conjunto de sentencias se repiten para diferentes casos, tal como ocurre, por ejemplo, en la estructura anterior en la que hay asignaciones iguales en diferentes casos. Teniendo en cuenta esta observacin, la sentencia anterior podra escribirse de la siguiente manera:
switch ($dia) { case 'L': $precio break; case 'M': $precio break; case 'X': case 'J': case 'D': $precio break; case 'V': case 'S': $precio break; default: $precio }

= 4;

= 3;

= 4.5;

= 5;

= 0;

Al igual que ocurra con la sentencia if, la sentencia switch dispone de una sintaxis alternativa en la que el inicio del bloque de casos se seala con un signo ':' y el final de la estructura con la palabra endswitch. A continuacin se puede ver un sencillo ejemplo con esta nueva sintaxis.

173

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Ejemplo 6.19:
switch ($nombre) : case 'Juan': case 'Pedro': case 'Daniel': print("Soltero"); break; case 'Ana': case 'Luis': print("Casado"); break; default: print("Desconocido"); endswitch;

Ejemplo 6.20: Como ejemplo final, supngase que se desea calcular el nmero de das que tiene un mes concreto, considerando adems si el ao es bisiesto o no (un ao es bisiesto cuando es mltiplo de 4 pero no de 100, o bien cuando es mltiplo de 400). Supngase que las variables $mes y $anno identifican el mes concreto del que se desea conocer el nmero de das, el siguiente programa asigna ese nmero a la variable $nd:
switch($mes) { case 2: if((($anno%4==0) and ($anno%100!=0)) or ($anno%400==0)) $nd=29; else $nd=28; break; case 4: case 6: case 9: case 11: $nd=30; break; default: $nd=31; }

174

SENTENCIAS DE CONTROL

6.3. ESTRUCTURAS ITERATIVAS


La segunda categora de estructuras de control est constituida por las sentencias que permiten construir bucles; es decir, que permiten ejecutar varias veces de forma iterativa un mismo conjunto de instrucciones.

6.3.1. SENTENCIA WHILE


Los bucles construidos con la sentencia while constituyen las estructuras iterativas ms simples con las que cuenta el lenguaje PHP. En este caso, las sentencias que constituyen el cuerpo del bucle se ejecutarn mientras el valor de una expresin lgica sea verdadero. La sintaxis de la sentencia es:
while (expresin) sentencia

En el caso de que el cuerpo del bucle est formado por ms de una sentencia, estas deben ser dadas entre llaves:
while (expresin) { sentencias }

La expresin es evaluada cada vez que se inicie una iteracin del bucle, pudindose dar el caso incluso de que las sentencias del bucle no se ejecuten ni una sola vez si la expresin es inicialmente falsa. Por supuesto, dentro del bloque de sentencias a ejecutar en cada iteracin debe haber alguna que modifique el valor de la expresin, ya que en caso contrario se entrara en un bucle infinito. Al igual que ocurre con las restantes sentencias de control, existe una sintaxis alternativa de la sentencia while:
while (expresin) : sentencias endwhile;

Dentro del bloque de sentencias a ejecutar, en cada iteracin pueden incluirse sentencias condicionales u otras estructuras iterativas anidadas.

175

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Ejemplo 6.21: Mediante el siguiente programa se genera una lista HTML con los mltiplos de 5 menores o iguales que 100:
print "<OL>"; $n = 5; while ($n <= 100) { print "<LI> $n"; $n += 5; } print "</OL>";

6.3.2. SENTENCIA DO...WHILE


Los bucles do...while son muy similares a los bucles while, la nica diferencia es que la condicin es comprobada al final de cada iteracin en lugar de hacerlo al comienzo. Esta diferencia en el momento de comprobacin de la condicin hace que en un bucle do...while se tenga garantizada la ejecucin de las sentencias del cuerpo del bucle al menos una vez. La sintaxis de la sentencia do..while es la siguiente:
do { sentencias } while (condicin);

En el caso de esta sentencia, no existe sintaxis alternativa. El funcionamiento del bucle es el obvio: mientras la condicin sea cierta se ejecutan las sentencias del cuerpo del bucle. Ejemplo 6.22: El bucle para generar una lista con los mltiplos de 5 menores o iguales que 100 tambin podra construirse utilizando esta sentencia:
print "<OL>"; $n = 5; do { print "<LI> $n"; $n += 5;

176

SENTENCIAS DE CONTROL

} while ($n <= 100) print "</OL>";

En este caso concreto, ambas estructuras iterativas (bucle while y bucle do...while) producen exactamente el mismo resultado; sin embargo, en otros casos el uso de una u otra estructura puede conducir a resultados diferentes, tal como puede verse en el siguiente ejemplo. Ejemplo 6.23: Considrese el siguiente bucle:
$n = 0; while ($n > 0) { print $n; $n--; }

En este caso, al utilizarse la sentencia while, la condicin del bucle se comprueba al inicio de cada iteracin y por tanto, al no verificarse ni siquiera en la iteracin inicial el bucle no se ejecutara ni una sola vez. En cambio, si se utiliza la sentencia do...while para definir el bucle:
$n = 0; do { print $n; $n--; } while ($n > 0);

la condicin se comprobar despus de cada iteracin, por tanto, el cuerpo del bucle se ejecuta una vez y despus se comprueba la condicin; al no verificarse esta, el bucle finaliza. En definitiva, la sentencia habr escrito el valor 0 y al salir del bucle la variable $n tendr el valor 1. Ejemplo 6.24: A continuacin se muestra el uso de la sentencia do...while para comprobar la conjetura de Collatz, que establece que cualquiera que sea el nmero entero positivo n de partida, la sucesin de nmeros enteros f(n), f(f(n)), f(f(f(n))),... siempre llega a alcanzar el valor 1, siendo f(n) la siguiente funcin:

177

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

si n es par n / 2 f ( n) = (3n + 1) / 2 si n es impar


En el siguiente programa se asume que $n contiene el valor de partida (por ejemplo, podra venir de un formulario previo). Con ese valor inicial se construye un bucle que finaliza cuando se alcanza el valor 1. En cada una de las iteraciones del bucle se redefine $n aplicando sobre el valor previo la funcin de Collatz y se van introduciendo los resultados en un control de tipo lista de HTML.
print "<SELECT>"; print "<OPTION> Valor inicial: $n"; $niter = 0; do { if($n%2==0) { $n = $n/2; } else { $n = (3*$n+1)/2; } $niter++; print "<OPTION> Iteracin $niter: $n"; } while ($n!=1); print "</SELECT>";

Por ejemplo, asumiendo que el valor inicial es 23, se generara una lista como la que se muestra en la Figura 6.1.
.

Figura 6.1 Resultado de la ejecucin del programa para el valor inicial 23

178

SENTENCIAS DE CONTROL

6.3.3. SENTENCIA FOR


La sentencia for es la sentencia ms potente, y al mismo tiempo la ms compleja, con las que cuenta el lenguaje PHP para la construccin de bucles. Cualquier bucle construido con las sentencias while o do...while podra implementarse de manera equivalente con la sentencia for. La sintaxis y funcionamiento de esta sentencia es totalmente similar a su anloga en el lenguaje C. Su sintaxis general es:
for (inicializacin; condicin; modificacin) { sentencias a ejecutar mientras la condicin es cierta }

Como puede apreciarse, en la sintaxis de construccin del bucle intervienen cuatro elementos diferenciados: Inicializacin: las sentencias que aparezcan en esta parte se ejecutarn una sola vez al principio del bucle. Lo habitual es situar en esta parte las sentencias de inicializacin de las variables que acten de contadores de iteraciones del bucle. En el caso de querer indicar varias sentencias de inicializacin, estas debern separarse por comas. Condicin: expresin lgica que se evaluar al comienzo de cada una de las iteraciones, si esta expresin se evala como cierta entonces la iteracin se realiza, en caso contrario finaliza la ejecucin del bucle. Modificacin: sentencias que se ejecutan al finalizar cada una de las iteraciones del bucle. Lo normal es que estas sentencias modifiquen los valores de las variables que actan de contadores del bucle de manera que la condicin de continuacin del bucle pueda verse igualmente alterada. Al igual que ocurra en la parte de inicializacin, si se necesitan varias sentencias de modificacin, estas deben darse separadas por comas. Sentencias: bloque de sentencias a ejecutar en cada iteracin del bucle. En el caso de que este bloque est constituido por una nica sentencia, las llaves que lo delimitan podran suprimirse.

Para la sentencia for existe tambin una sintaxis alternativa:


for (inicializacin; condicin; modificacin) : sentencias a ejecutar mientras la condicin es cierta endfor;

179

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Ejemplo 6.25: A continuacin se muestra la construccin de un sencillo bucle que calcula la suma de los 100 primeros nmeros naturales: 1+2+3+4+...+99+100:
$suma = 0; for ($n=1; $n<=100 ; $n++){ $suma = $suma + $n; }

En este caso se utiliza una variable $suma en la que se irn acumulando las sumas parciales y una variable $n que actuar de contador en el bucle. La variable contador se inicializa con el valor 1, y mientras su valor sea menor o igual que 100 se seguir ejecutando el bucle. Al finalizar cada iteracin, la variable contador se incrementa en una unidad. El cuerpo del bucle lo nico que hace es sumar el valor de la variable contador a la suma parcial acumulada hasta el momento. A la hora de utilizar la sentencia for PHP admite bastante flexibilidad; como prueba de ello se muestra a continuacin la manera de escribir la estructura iterativa anterior de una forma mucho ms compacta:
for ($suma=0,$n=1; $n<=100 ; $n++, $suma+=$n);

En este caso, tanto la variable contador como la que acumula las sumas parciales, toman sus valores iniciales en la parte de inicializacin del bucle; obsrvese cmo ambas inicializaciones se separan con una coma. De la misma manera, la variable $suma actualiza su valor en cada una de las iteraciones en la parte de modificacin de variables del bucle junto con el incremento a la variable contador. Finalmente, obsrvese que en este caso el cuerpo del bucle no tiene ninguna sentencia, por lo que se finaliza con un punto y coma. En la sentencia for es opcional no solo la presencia del cuerpo del bucle sino tambin cualquiera de las otras tres partes que la forman. En el caso de que no se indique ninguna condicin, PHP asume que esta es siempre cierta, con lo que se estara definiendo un bucle infinito. Evidentemente, un bucle infinito no tiene ninguna utilidad prctica a no ser que dentro del cuerpo del bucle se utilice la sentencia break para forzar la salida del mismo. Aunque resulte sorprendente, la sentencia:
for( ; ; );

180

SENTENCIAS DE CONTROL

es sintcticamente correcta, pero evidentemente no tiene ningn inters, a no ser que se desee bloquear el programa con un bucle infinito que no produce ninguna accin en cada una de sus iteraciones. Ejemplo 6.26: Otro ejemplo de bucle infinito sera:
for($n=1; ;$n++) print $n;

En este caso se construye un bucle que escribe los nmeros 1,2,3,4,.... y as indefinidamente, ya que no hay condicin de finalizacin. PHP dispone de un mecanismo de seguridad para evitar situaciones como las que se producen en los bucles anteriores; se trata de limitar el tiempo mximo de ejecucin de un script, de manera que cuando se entra en un bucle infinito y se supera ese lmite, automticamente se aborta la ejecucin y se genera el mensaje de error:
Fatal error: Maximum execution time of 30 seconds exceeded in on line

NOTA

Por defecto el tiempo mximo de ejecucin de un script est fijado en 30 segundos; de todas formas ese tiempo puede ser modificado en el fichero de inicializacin de PHP (php.ini) asignando el tiempo deseado al parmetro max_execution_time

A continuacin se presentan algunos ejemplos adicionales de construccin de bucles. Ejemplo 6.27: Uno de los ejemplos "clsicos" de estructuras iterativas es el clculo del factorial de un nmero (n!=1*2*3*...*(n-1)*n). La implementacin de este bucle sera:
$fact = 1; for ($i = 2; $i <= $n; $i++ ) { $fact *= $i; }

181

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Al igual que en el caso del bucle que efectuaba la suma de los nmeros menores o iguales que 100, el bucle anterior puede escribirse de una forma ms compacta:
for ($fact=1, $i=2; $i <= $n; $fact*=$i, $i++);

Ejemplo 6.28: Supngase que se desea construir, de forma aleatoria, una contrasea formada por 8 letras. Se puede utilizar la funcin rand() para generar un nmero aleatorio entre 97 y 122 (cdigos ASCII correspondientes a las letras minsculas) y la funcin chr() para obtener el carcter asociado a un cdigo ASCII dado.
$codigo=""; for($i=1;$i<=8;$i++) { $letra = chr(rand(97,122)); $codigo = $codigo.$letra; } print("Contrasea asignada es:<B>$codigo</B>");

Ejemplo 6.29: En los bucles es posible utilizar ms de una variable que acte como contador, por ejemplo:
for ($i = 1,$j = 2; $i <= 10; $i++, $j += 2) { echo $i*$j . "--"; }

Como resultado de este bucle se generara la siguiente secuencia de nmeros:


2--8--18--32--50--72--98--128--162--200--

Como puede apreciarse, en cada iteracin se escribe el resultado del producto de dos variables ($i y $j); la primera se ir incrementando de uno en uno hasta llegar a su valor mximo (10) y la segunda lo har de dos en dos. Tambin es posible generar bucles anidados, es decir, bucles cuyas iteraciones ejecutan un nuevo bucle. Ejemplo 6.30: Supngase que se desea generar en la pgina web la tabla de multiplicar del 1 al 10; esto puede hacerse de una manera muy sencilla con dos bucles for anidados:

182

SENTENCIAS DE CONTROL

for ($i = 1; $i <= 10; $i++) { print("<B>Tabla de multiplicar del $i <BR></B>"); for ($j = 1; $j <= 10; $j++) { print("$i * $j =" . $i*$j . "<BR>"); } }

La salida de este bucle sera:


Tabla de multiplicar del 1 1 * 1 =1 1 * 2 =2 1 * 3 =3 1 * 4 =4 1 * 5 =5 1 * 6 =6 1 * 7 =7 1 * 8 =8 1 * 9 =9 1 * 10 =10 Tabla de multiplicar del 2 2 * 1 =2 2 * 2 =4 ............

El bucle anterior podra ser modificado para que la salida generada correspondiera realmente a un formato de tabla en HTML. En este caso, el propio bucle debera encargarse de ir generando las diferentes etiquetas de construccin de tablas HTML en los lugares adecuados:
print("<TABLE BORDER>\n"); // Generacin de la fila de cabecera print("<TR ALIGN=CENTER>\n <TH> * </TH>"); for ($i = 1; $i <= 10; $i++) print("<TH> $i </TH>"); print("\n</TR>\n"); // Generacin de las restantes filas for ($i = 1; $i <= 10; $i++) { print("<TR ALIGN=CENTER> <TH>$i</TH> "); for ($j = 1; $j <= 10; $j++) { print("<TD>" . $i*$j . "</TD>"); } print("\n</TR>\n"); } print('</TABLE>');

183

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Ahora s, el resultado de la ejecucin del script sera la tabla:


* 1 2 3 4 5 6 7 8 9 10 1 1 2 3 4 5 6 7 8 9 10 2 2 4 6 8 10 12 14 16 18 20 3 3 6 9 12 15 18 21 24 27 30 4 4 8 12 16 20 24 28 32 36 40 5 5 10 15 20 25 30 35 40 45 50 6 6 12 18 24 30 36 42 48 54 60 7 7 14 21 28 35 42 49 56 63 70 8 8 16 24 32 40 48 56 64 72 80 9 9 18 27 36 45 54 63 72 81 90 10 10 20 30 40 50 60 70 80 90 100

En ocasiones los bucles for pueden ser utilizados para generar dinmicamente campos de formularios. Ejemplo 6.31: A continuacin puede verse la definicin de un formulario HTML dentro del cul se incluye un script PHP con sendos bucles que generan las opciones de dos controles de tipo lista:

<FORM NAME=FORMHORA> <?php print("HORAS: <SELECT HORA>"); for($i=0; $i<=23; $i++) print("<OPTION VALUE=$i> $i"); print("</SELECT>"); print("<BR>MINUTOS: <SELECT MINUTOS>"); for($i=0; $i<=55; $i+=5) print("<OPTION VALUE=$i> $i"); print("</SELECT>"); ?> </FORM>

184

SENTENCIAS DE CONTROL

Ejemplo 6.32: Como ltimo ejemplo de construccin de bucles con la sentencia for se presenta a continuacin un programa ms complejo que es capaz de generar el calendario de un mes concreto. Se asume que las variables $mes y $anno contienen los valores del mes y ao cuyo calendario se quiere generar. El cdigo del programa sera:
$diasemana=date("w",mktime(0,0,0,$mes,1,$anno)); if($diasemana==0) $diasemana=7; switch($mes) { case 1: $nd=31; $nombremes="Enero"; break; case 2: if((($anno%4==0) and ($anno%100!=0)) or ($anno%400==0)) $nd=29; else $nd=28; $nombremes="Febrero"; break; case 3: $nd=31; $nombremes="Marzo"; break; case 4: $nd=30; $nombremes="Abril"; break; case 5: $nd=31; $nombremes="Mayo"; break; case 6: $nd=30; $nombremes="Junio"; break; case 7: $nd=31; $nombremes="Julio"; break; case 8: $nd=31; $nombremes="Agosto"; break; case 9: $nd=30; $nombremes="Septiembre"; break; case 10: $nd=31; $nombremes="Octubre"; break; case 11: $nd=30; $nombremes="Noviembre";

185

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

break; case 12: $nd=31; $nombremes="Diciembre"; break; } // generacin del calendario en una tabla HTML print("<B>$nombremes $anno </B>"); print("<TABLE BORDER ALING=CENTER>"); print("<TR> <TH>Lu</TH><TH>Ma</TH><TH>Mi</TH><TH>Ju</TH>"); print("<TH>Vi</TH><TH>Sa</TH><TH>Do</TH> </TR>"); print("<TR>"); $aux=1; // genera celdas en blanco hasta llegar el da // de comienzo del mes while($aux<$diasemana) { print("<TD>&nbsp;</TD>"); $aux++; } for($i=1;$i<=$nd;$i++) { if(($diasemana==6) or ($diasemana==7)) print("<TD BGCOLOR=#00FFFF>$i</TD>"); else print("<TD>$i</TD>"); $diasemana++; if($diasemana==8) { // comienza nueva semana print("</TR>"); print("<TR>"); $diasemana=1; } } print("</TR></TABLE>");

El modelo de calendario que genera el programa anterior es:


Julio 2004 Lu Ma Mi Ju Vi Sa Do 1 2 3 4 5 6 7 8 9 10 11

12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

186

SENTENCIAS DE CONTROL

Como puede apreciarse, el primer dato que se necesita es saber en qu da de la semana comienza el mes, para ello se utiliza la combinacin de las funciones date() y mktime(), ambas sern estudiadas con detalle en el Captulo 9; de momento, nicamente indicar que la funcin mktime() permite generar un instante de tiempo, en este caso el instante que se genera corresponde a las 0 horas, 0 minutos, 0 segundos del da 1 del mes y ao dados. Con ese instante de tiempo la funcin date() es capaz de devolver un valor numrico de 0 a 6 indicando el da de la semana (0 corresponde al domingo). Para que el programa quede ms claro, se asigna el valor 7 a los domingos. El siguiente paso es la definicin de una estructura condicional para determinar el nmero de das del mes y generar una cadena de caracteres con el nombre del mes correspondiente. Tras esa estructura condicional se incluyen las estructuras iterativas que generan las diferentes celdas de la tabla que mostrarn los das del calendario. Obsrvese que las celdas correspondientes a los fines de semana tendrn un color de fondo.

6.3.4. SENTENCIA FOREACH


La ltima de las sentencias de construccin de bucles con las que cuenta el lenguaje PHP es la sentencia foreach. Se trata de una sentencia que fue incorporada en la versin PHP 4, ya que hasta entonces no exista. La sentencia foreach permite recorrer todos los elementos de un array de una forma muy simple. Los arrays son estructuras de datos que permiten almacenar, bajo un nombre comn, una serie de valores a los que se puede acceder a travs de un ndice numrico o palabra clave; en el Captulo 8 se estudiarn estas estructuras de datos y se presentarn con ms detalle las estructuras iterativas que permiten recorrer todos sus elementos. Se incluye a continuacin la sintaxis bsica de la sentencia foreach y un sencillo ejemplo de aplicacin:
foreach (nombre_array as nombre_variable) { sentencias a ejecutar para cada elemento del array }

Como puede apreciarse, debe indicarse el nombre del array en el que estn almacenados todos los datos y el nombre de una variable. En la iteracin inicial esta variable contendr el valor del primer elemento del array y en las sucesivas iteraciones del bucle esta variable har referencia a los siguientes elementos.

187

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Ejemplo 6.33: Las siguientes sentencias


$lista = array ("Luis","Pedro","Ana","Susana"); foreach ($lista as $nombre) { print "Bienvenido, $nombre <BR>"; }

generaran los siguientes mensajes en la pgina:


Bienvenido, Luis Bienvenido, Pedro Bienvenido, Ana Bienvenido, Susana

6.3.5. SENTENCIAS BREAK Y CONTINUE


Las sentencias break y continue permiten alterar la ejecucin prevista de una estructura iterativa; la primera de ellas permite cancelar completamente la ejecucin del bucle y la segunda permite cancelar una de las iteraciones y pasar directamente a la siguiente. La sentencia break, adems de permitir abandonar una estructura iterativa se utiliza tambin dentro de las estructuras condicionales switch. En el caso de su uso dentro de bucles, break admite un parmetro opcional que determina el nmero de estructuras de control de las que hay que salir, el valor por defecto de este parmetro es 1. Ejemplo 6.34: Si se desea construir un bucle que escriba todos los nmeros pares menores o iguales que 100, se podra utilizar una sentencia for como la siguiente:
for ($i = 2; $i <= 100; $i+=2) { print $i; }

pero tambin es posible construir un bucle con condicin de finalizacin vaca en el que se fuerce la salida desde dentro del cuerpo del bucle.
for ($i = 2; ; $i+=2) { if ($i > 100)

188

SENTENCIAS DE CONTROL

break; print $i; }

En esta segunda opcin es obligado utilizar la sentencia break, ya que de no ser as se entrara en un bucle infinito. En el caso de estructuras de control anidadas, se puede utilizar el parmetro opcional de la sentencia break para indicar de cuntas estructuras se quiere salir. Ejemplo 6.35: Considrense los siguientes bucles anidados:
for($i=1;$i<=10;$i++) { $j=10; print "<BR> <B>$i</B>: "; while ($j>0) { if ($i>$j) { break; } else { print "$j "; } $j--; } }

En este caso, el bucle interno se ejecutara en principio mientras la variable $j tome un valor positivo, pero dentro del cuerpo de ese bucle se fuerza la salida cuando el valor de $i supere a $j. Al utilizarse la sentencia break sin ningn parmetro, se asume el valor por defecto (1) lo que implica que se sale solamente del bucle interior pero no del bucle for; en definitiva, la salida producida por las sentencias anteriores sera:
1: 10 9 8 7 6 5 4 3 2 1 2: 10 9 8 7 6 5 4 3 2 3: 10 9 8 7 6 5 4 3 4: 10 9 8 7 6 5 4 5: 10 9 8 7 6 5 6: 10 9 8 7 6 7: 10 9 8 7 8: 10 9 8 9: 10 9 10: 10

189

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

En cambio, si se utiliza la sentencia break pero con un valor de 2 para su parmetro opcional, cuando se verifique por primera vez la condicin $i>$j se producir la salida y terminacin de los dos bucles anidados. La salida producida por la construccin siguiente:
for($i=1;$i<=10;$i++) { $j=10; print "<BR> <B>$i</B>: "; while ($j>0) { if ($i>$j) { break 2; } else { print "$j "; } $j--; } }

sera:
1: 10 9 8 7 6 5 4 3 2 1 2: 10 9 8 7 6 5 4 3 2

Ejemplo 6.36: En el siguiente programa puede verse otro ejemplo de salida de dos estructuras de control anidadas, en este caso un bucle y una estructura condicional:
$n = 10; while (--$n) { switch ($n) { case 1:case 3:case 5:case 7:case 9: print "$n (impar) "; break; case 2:case 4:case 6:case 8: print "$n (par) "; break; case 0: break 2; } }

En este caso las sentencias break dentro de los primeros casos de la estructura condicional tienen por objeto nicamente salir de esa estructura; mientras que el

190

SENTENCIAS DE CONTROL

break situado dentro del ltimo caso fuerza la salida de las dos estructuras anidadas (la estructura condicional y el bucle). La salida producida por las sentencias anteriores sera:
9 (impar) 8 (par) 7 (impar) 6 (par) 5 (impar) 4 (par) 3 (impar) 2 (par) 1 (impar)

La sentencia continue, por su parte, permite abandonar una iteracin del bucle pero sin omitir el resto de iteraciones. Cuando el intrprete de PHP se encuentra una sentencia continue, ignora las posibles sentencias que queden por ejecutar en la iteracin actual del bucle y pasa directamente a las sentencias de la siguiente iteracin. Ejemplo 6.37: Una forma de calcular la suma de los nmeros pares menores o iguales que 100 sera:
$suma = 0; for($n=1;$n<=100;$n++) { if($n%2 != 0) // el nmero es impar continue; $suma = $suma + $n; }

En este caso, se construye un bucle que recorre todos los nmeros menores o iguales que 100, tanto los pares como los impares; en cada iteracin se comprueba si el nmero es impar, y de ser as se abandona esa iteracin y se pasa a la siguiente. Por supuesto, este ejemplo tiene por nico objeto mostrar el funcionamiento de la sentencia continue, ya que el clculo de la suma se podra realizar de una forma ms optimizada con un bucle que recorra solamente los nmeros pares. De hecho, la siguiente sentencia sera suficiente para conseguir el mismo efecto:
for($suma=0,$n=2;$n<=100;$n+=2);

Al igual que la sentencia break, la sentencia continue admite un parmetro opcional que determina, en el caso de estructuras anidadas, cuntos niveles deben ser saltados para continuar la ejecucin.

191

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Ejemplo 6.38: Los siguientes bucles anidados generan todos los pares de nmeros formados por combinaciones de los dgitos del 1 al 9, siendo adems los dos componentes del par diferentes. Obsrvese cmo cuando en la iteracin interna se comprueba que las dos componentes son iguales, se abandona dicha iteracin
for($i=1;$i<10;$i++) for($j=1;$j<10;$j++) if($i == $j) continue; else print "($i,$j) ";

El resultado generado por la estructura anterior es:


(1,2) (1,3) (1,4) (1,5) (1,6) (1,7) (1,8) (1,9) (2,1) (2,3) (2,4) (2,5) (2,9) (3,1) (3,2) (3,4) (3,5) (3,6) (3,7) (3,8) (3,9) (4,1) (4,2) (4,3) (4,8) (4,9) (5,1) (5,2) (5,3) (5,4) (5,6) (5,7) (5,8) (5,9) (6,1) (6,2) (6,7) (6,8) (6,9) (7,1) (7,2) (7,3) (7,4) (7,5) (7,6) (7,8) (7,9) (8,1) (8,5) (8,6) (8,7) (8,9) (9,1) (9,2) (9,3) (9,4) (9,5) (9,6) (9,7) (9,8) (2,6) (4,5) (6,3) (8,2) (2,7) (4,6) (6,4) (8,3) (2,8) (4,7) (6,5) (8,4)

En cambio, si se utiliza la sentencia continue 2, cuando se observa que las dos componentes son iguales se pasa a la siguiente iteracin pero no del bucle interno sino del externo (segundo nivel)
for($i=1;$i<10;$i++) for($j=1;$j<10;$j++) if($i == $j) continue 2; else print "($i,$j) ";

El resultado sera:
(2,1) (3,1) (3,2) (4,1) (4,2) (4,3) (5,1) (5,2) (5,3) (5,4) (6,1) (6,2) (6,3) (6,4) (6,5) (7,1) (7,2) (7,3) (7,4) (7,5) (7,6) (8,1) (8,2) (8,3) (8,4) (8,5) (8,6) (8,7) (9,1) (9,2) (9,3) (9,4) (9,5) (9,6) (9,7) (9,8)

192

DEFINICIN DE FUNCIONES
7.1. CMO SE DEFINEN FUNCIONES EN PHP?
PHP permite al programador la creacin de sus propias funciones, ahorrando tiempo y esfuerzo y facilitando un mejor diseo de los programas implementados. El programador puede crearse sus propias libreras de funciones o utilizar las innumerables funciones implementadas por la comunidad de desarrolladores en PHP. En este captulo se aborda el proceso de definicin y creacin de funciones para su posterior utilizacin dentro de un programa PHP. La sintaxis que debe adoptarse a la hora de definir una funcin en PHP sigue el siguiente esquema general:
function NombreFuncion (argumentos) { sentencias de definicin return ValorDevuelto; }

193

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Como puede apreciarse, toda definicin de funcin comienza con la palabra reservada function seguida del nombre asignado, la lista de argumentos y el bloque de definicin de la funcin. En los nombres de las funciones no se distingue entre maysculas y minsculas, aunque siempre es aconsejable efectuar la llamada a una funcin tal y como ha sido definida. Respecto a los argumentos, estos son unos parmetros formales que vienen representados por variables. Conviene recordar que en PHP no se declaran tipos para las variables, por tanto en los argumentos de la funcin tampoco es necesario indicar tipo alguno. Es posible definir funciones sin argumentos, en este caso, a continuacin del nombre deberan colocarse parntesis vacos:
function NombreFuncion()

La sentencia return permite que la funcin devuelva un valor de retorno. Una vez ejecutada esa sentencia se abandona la funcin, sin ejecutar cualquier sentencia posterior que se encuentre en el cuerpo de la misma. El valor devuelto puede ser una cadena de caracteres, un valor numrico, un valor booleano, un array,... Este valor ser recogido en una variable a la hora de efectuar la llamada a la funcin o utilizado directamente en alguna otra sentencia. Debe destacarse que a la hora de definir una funcin, no es indispensable que esta devuelva valores; en este sentido en PHP no hay distincin sintctica entre lo que en otros lenguajes son funciones y procedimientos. Se muestran a continuacin los primeros ejemplos de definicin de funciones en PHP. Ejemplo 7.1: En este primer caso, se define una funcin que calcula la suma de sus dos argumentos numricos. La sentencia return devuelve el resultado:
function Suma($x,$y) { return ($x+$y); }

Ejemplo 7.2: La siguiente funcin no devuelve ningn valor, simplemente imprime en pantalla una serie de cadenas de caracteres a modo de saludo:
function Saluda() { print("Bienvenido "); print("Cmo ests?"); }

194

DEFINICIN DE FUNCIONES

Ejemplo 7.3: Avanzando un paso ms se muestra cmo definir una funcin que calcula el factorial de un nmero dado:
function factorial ($n) { if ($n < 0 ) { return "Solo se admiten valores positivos!"; } else if($n==0) return 1; else { $aux = 1; for ($i = 2; $i <= $n; $i++) { $aux = $aux * $i; } return $aux; } }

En este caso se implementa el proceso iterativo de clculo del factorial de un nmero (n! = 1*2*3*...*n). Adems puede observarse que el valor devuelto por la funcin puede ser de tipo diferente segn determinadas condiciones, en el ejemplo la funcin devuelve una cadena de caracteres con un mensaje de error cuando $n es menor que 0, y un nmero entero en otro caso. Ejemplo 7.4: En este ejemplo se programa una funcin que genera un array a partir de dos valores numricos dados. El primer elemento es el menor valor de ambos. A partir de l se generan los siguientes elementos sumando una unidad al anterior hasta llegar al segundo de los valores dados. Los arrays sern estudiados en profundidad en el captulo siguiente.
function GeneraArray($min,$max) { $x = array(); $d = $min; while ($d<=$max){ $x[]=$d; $d++; } return $x; }

195

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

En la definicin de funciones se admite la recursividad, es decir, se permite la llamada a una funcin dentro de su propia definicin. Un ejemplo clsico que ilustra este concepto es de nuevo la funcin factorial de un nmero natural. De hecho, el factorial de un natural n se puede definir como:
n! = n* (n-1)!

Por tanto, la definicin de la funcin factorial del Ejemplo 7.3 se podra condensar en menos lneas de cdigo de la siguiente manera:
function factorial ($n) { if ($n < 0 ) { return "Solo se admiten valores positivos!"; } else if($n==0) return 1; else{ $aux = $n*factorial($n-1); return $aux; } }

De todas formas conviene advertir que el uso de recursividad en la definicin de funciones hace que estas requieran de ms memoria para su ejecucin y resulten en ocasiones ms lentas que sus funciones iterativas equivalentes.

7.2. LLAMADA A LAS FUNCIONES


Una vez definida una funcin, cmo acceder a ella?, cmo utilizarla cuando se necesite a lo largo del programa? Se deben tener en cuenta los siguientes puntos: La funcin debe encontrarse definida antes del lugar en el que se efectuar la llamada, a no ser que el servidor web trabaje con las versiones PHP 4 o 5. En ese caso, la llamada a la funcin puede realizarse con anterioridad a su definicin. No obstante, es prctica habitual y recomendable definir las funciones incluso antes de cualquier cdigo HTML, por ejemplo, colocar los scripts que las definen antes del comando <HTML> o dentro del encabezado del documento. En la llamada, los argumentos, en el caso de que existan, deben ser pasados en el mismo orden en el que aparecen en la definicin. Como argumentos pueden pasarse variables, valores o expresiones. Los valores numricos pueden ser

196

DEFINICIN DE FUNCIONES

escritos directamente o entrecomillados. En el caso de funciones que no reciban argumentos, en la llamada deben colocarse los parntesis vacos. Si se pasan menos argumentos que los que tiene la funcin en su definicin, los ltimos argumentos se asumirn como nulos, la funcin ejecutar las instrucciones pero se generarn mensajes de aviso (warnings). Si la funcin devuelve un valor, este puede ser asignado a una variable en la llamada o utilizado directamente en otra expresin.

Ejemplo 7.5: Dada la funcin:


function Suma($x,$y) { return ($x+$y); }

las siguientes llamadas son todas ellas vlidas:


$x=2; $y=3; $z=Suma($x,$y); $z=Suma(2,3); $x=2; echo SUMA($x,3); $z=Suma("2","3"); $z=suma((2+3)*5,4); echo suma(suma(2,3)*5,4);

Ejemplo 7.6: La siguiente pgina muestra la generacin de un array con ayuda de la funcin GeneraArray() definida en el Ejemplo 7.4. Como puede observarse, el cdigo de la pgina incorpora dos scripts PHP diferentes, el primero, situado antes del cdigo HTML, define la funcin; mientras que en el segundo es donde se realiza la llamada a la misma.
<?PHP function GeneraArray($min,$max) {

197

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

$x = array(); $d = $min; while ($d<=$max){ $x[]=$d; $d++; } return $x; } ?> <HTML> <HEAD> <TITLE>Generacin de un array</TITLE> </HEAD> <BODY> <?PHP print "<PRE>"; print_r(GeneraArray(3,10)); print "</PRE>";?> </BODY> </HTML>

La salida de este programa resulta ser.


Array ( [0] [1] [2] [3] [4] [5] [6] [7] )

=> => => => => => => =>

3 4 5 6 7 8 9 10

En este ejemplo se ha utilizado la funcin print_r() que permite visualizar los contenidos de variables o expresiones de cualquier tipo. Si estas variables son nmeros o cadenas de caracteres, la funcin print_r() produce exactamente el mismo efecto que la funcin print(); pero en el caso de arrays u objetos, print_r() permite visualizar todas sus componentes de una forma clara.

198

DEFINICIN DE FUNCIONES

7.3. ARGUMENTOS DE UNA FUNCIN


7.3.1. ARGUMENTOS OPCIONALES
En PHP todos los argumentos de las funciones pueden ser considerados opcionales, de manera que a la hora de realizar la llamada a una funcin, pueden pasarse un nmero de argumentos distinto del que acepta la funcin. Si se pasan menos argumentos de los esperados, los ltimos se asumir que tienen el valor nulo. En el caso de pasarse ms argumentos de los esperados, los que sobran pueden ser ignorados. En cualquiera de los dos casos la llamada y ejecucin de la funcin puede realizarse con normalidad. Ejemplo 7.7: Considrese una funcin que reciba tres argumentos correspondientes a una cantidad de horas, minutos y segundos, y devuelva el nmero total de segundos equivalentes a dicho periodo. A continuacin puede verse la definicin de esa funcin y tres llamadas a la misma con diferente nmero de argumentos.
<?PHP function Cuenta_segundos($horas,$minutos,$segundos) { return (3600*$horas + 60*$minutos + $segundos); } ?> <HTML> <HEAD> <TITLE>Generacin de un array</TITLE> </HEAD> <BODY> <?PHP $h=2; $m=15; $s=30; $ss = Cuenta_segundos($h,$m,$s); print "$h horas, $m minutos y $s segundos son $ss segundos <BR>"; $h=3; $m=20; $ss = Cuenta_segundos($h,$m); print "$h horas y $m minutos son $ss segundos <BR>"; $h=5; $ss = Cuenta_segundos($h); print "$h horas son $ss segundos <BR>"; ?> </BODY> </HTML>

199

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

La salida generada por el programa sera: 2 horas, 15 minutos y 30 segundos son 8130 segundos Warning: Missing argument 3 for cuenta_segundos() in C:\\www\~scp.php on line 2 3 horas y 20 minutos son 12000 segundos Warning: Missing argument 2 for cuenta_segundos() in C:\\www\~scp.php on line 2 Warning: Missing argument 3 for cuenta_segundos() in C:\\www\~scp.php on line 2 5 horas son 18000 segundos Como puede apreciarse, en la primera llamada se pasan los tres argumentos, mientras que en las dos llamadas restantes se pasan las horas y los minutos, y nicamente las horas, respectivamente. En estos dos casos los argumentos que no son pasados tomarn el valor 0 y la ejecucin de la funcin podr realizarse con normalidad. Sin embargo, como puede apreciarse, se generan unos mensajes de aviso notificando el hecho de recibirse menos argumentos de los previstos.
Puede configurarse el intrprete de PHP para que los avisos en tiempo de ejecucin (warnings) no sean presentados en la propia pgina web, evitando situaciones como la del ejemplo anterior, en la que a pesar de esos mensajes de aviso, el programa se ejecuta correctamente. Dentro del fichero de inicializacin php.ini se debe configurar el parmetro error_reporting para indicar al intrprete qu tipo de errores debe mostrar en la pgina. Por ejemplo, si se realiza en ese fichero la asignacin: error_reporting = E_ALL & ~E_WARNING PHP mostrara en la pgina los mensajes correspondientes a todos los errores salvo los errores no graves en tiempo de ejecucin (warnings).

NOTA

7.3.2. ARGUMENTOS CON VALORES POR DEFECTO


Al definir funciones pueden darse valores por defecto para argumentos, de tal forma que si un argumento no est presente en la llamada, se le asigna ese valor por defecto en lugar de tomar el valor nulo. Para indicar un valor por defecto basta asignar dicho valor con el signo "=" en la lista de argumentos de la cabecera de la funcin. Si la funcin tiene argumentos que no llevan valor por defecto y otros que s lo llevan, estos ltimos deben estar situados al final en la lista de argumentos de la funcin.

200

DEFINICIN DE FUNCIONES

Ejemplo 7.8: A continuacin se define una funcin que crea enlaces en una pgina web, a partir de dos argumentos: el texto del enlace y la direccin URL de destino. A este segundo argumento se le asignar un valor por defecto:
function CrearEnlace($texto,$url="http://www.cinemas.es") { echo "<a href=$url>$texto</a>"; }

Al llamar a la funcin anterior se podran indicar los dos argumentos o nicamente el primero, tomando en este caso el segundo su valor por defecto. Llamadas vlidas a esta funcin seran:
CrearEnlace("Pgina web de Cinem@s"); CrearEnlace("Disney","http://www.disney.es");

Por supuesto, todos los argumentos de la funcin pueden tomar valores por defecto:
function CrearEnlace($texto="Pulse aqu", $url="http://www.cinemas.es") { echo "<a href=$url>$texto</a>"; }

En este caso, una llamada podra ser simplemente:


CrearEnlace();

En este caso, los dos argumentos tomaran sus respectivos valores por defecto.

7.3.3. LISTAS DE ARGUMENTOS DE LONGITUD VARIABLE


A partir de PHP 4 se admite que las funciones definidas por el usuario puedan recibir listas de argumentos de longitud variable. En este caso, a la hora de definir la funcin se puede dejar la lista de argumentos vaca y utilizar una serie de funciones predefinidas para recuperar los argumentos que realmente han sido pasados a la hora de efectuar la llamada a la funcin.

201

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

La primera de las funciones que puede ser utilizada es:


func_num_args()

que devuelve el nmero de argumentos que efectivamente han sido pasados. Una vez que se sabe cuntos argumentos han sido pasados, es necesario tambin disponer de algn mecanismo para recuperar los valores de los mismos. La siguiente funcin permite recuperar el valor del argumento nmero n:
func_get_arg(n)

Debe tenerse en cuenta que la numeracin de los argumentos comienza en 0, es decir, para obtener el primer argumento habra que utilizar la sintaxis func_get_arg(0). Si se llama a la funcin con un ndice fuera del rango de argumentos recibidos, esta genera un aviso (warning) y devolver el valor booleano falso. Si lo que se quiere es recuperar todos los valores de los argumentos en una estructura de datos y en una sola operacin, puede usarse la funcin:
func_get_args()

que devuelve un array con todos los valores de los argumentos. Ejemplo 7.9: A continuacin se define una funcin que calcula la suma de los valores de todos sus argumentos. Como puede observarse, en la cabecera de la definicin no se declara ningn argumento y estos son recuperados en el cuerpo de la propia funcin.
function suma() { $n = func_num_args(); $aux = 0; for ($i=0;$i<$n;$i++) $aux += func_get_arg($i); return $aux; }

A la hora de efectuar la llamada a esta funcin, pueden ser pasados tantos argumentos como se desee. Por ejemplo, las sentencias
print suma(2,5,6) . "<BR>";

202

DEFINICIN DE FUNCIONES

print suma(1,5,7,2) . "<BR>"; print suma() . "<BR>";

generaran como resultado: 13 15 0

7.3.4. PASO DE ARGUMENTOS POR VALOR O POR REFERENCIA


A la hora de efectuar la llamada a una funcin, los argumentos pueden ser pasados por valor o por referencia. En el primer caso, lo que se pasa realmente es una copia del correspondiente valor para que la funcin lo reciba y realice con l las correspondientes operaciones. En el segundo caso, en cambio, cuando se pasa una variable como argumento, no se pasa a la funcin una copia de su valor sino la direccin de memoria donde se encuentra dicha variable. De esta forma la funcin puede acceder directamente a esa zona de memoria y leer o modificar el valor de la variable. Antes de analizar las diferencias entre el paso de argumentos por valor y por referencia, conviene entender ambos conceptos pero aplicados al caso de la asignacin de variables. Asignar a una variable dada un valor por referencia no supone almacenar un valor concreto, sino una direccin de memoria que remite a otra variable. Cualquier modificacin sobre esta segunda variable se ver reflejada en la variables asignada por referencia. Si se desea asignar por referencia a una variable $b la informacin de otra variable $a debera utilizarse el operador de direccin (&):
$b = &$a;

El siguiente ejemplo muestra las diferencias en el resultado final entre las dos formas de inicializacin de variables, la directa, o por valor, y la asignacin por referencia.

203

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Ejemplo 7.10: Dadas las sentencias de asignacin siguientes:


$a = $b = $a = echo "Hola!"; $a; "Adis!"; "$b"; //Se imprime "Hola!", el valor inicial de $a

cuando se da la orden de escribir el valor de $b, lo que realmente se escribe es el valor inicial de $a, ya que, en el momento de realizar la asignacin a $b, se realiza una asignacin por valor, es decir, se asigna a $b una copia del valor que en ese momento tena $a. Cualquier modificacin posterior de la variable $a no tiene ningn efecto sobre la asignacin previa. En cambio, si la asignacin a $b se realiza por referencia, $b en todo momento estar apuntando a la posicin de memoria de $a, con lo que las modificaciones posteriores de $a tienen reflejo tambin en $b.
$a = $b = $a = echo "Hola!"; &$a; "Adis!"; "$b"; //Se imprime "Adis!", el nuevo valor de $a

Se puede anular una asignacin por referencia mediante la funcin unset():


$a = "Hola!"; $b = &$a; unset($a); $a = "Adis!"; echo "$b"; //Se imprime "Hola!", el valor inicial de $a

En este caso, tras realizar la asignacin por referencia a la variable $b, la variable $a es destruida con la funcin unset(), quedando $b con el valor que hasta ese momento tena la variable destruida. Posteriormente, al hacer la ltima asignacin, la variable $a vuelve a ser creada pero ocupando una posicin de memoria diferente a la que tena en principio, por lo que la referencia de $b no es recuperada. De forma similar al caso de las variables, pasar un argumento de una funcin por referencia significa que lo que realmente se pasa es la direccin de memoria de una variable y no su valor. Para indicar que un argumento es pasado por referencia, se antepone, de nuevo, el signo "&" al nombre de la variable en la lista de argumentos

204

DEFINICIN DE FUNCIONES

de la funcin. Si los argumentos se pasan por referencia, cualquier modificacin que se haga dentro de la funcin tiene su efecto sobre la variable que se pas. Ejemplo 7.11: En la siguiente funcin se pasan dos argumentos por valor ($x y $y) y otros dos por referencia ($suma y $prod) para que la funcin guarde en estos dos ltimos el valor de la suma y del producto, respectivamente, de los dos primeros:
function Opera($x, $y, &$suma, &$prod) { $suma = $x+$y; $prod = $x*$y; }

A la hora de llamar a la funcin:


$a=3; $b=2; Opera($a,$b,$s,$p); // se puede acceder a las variables $s y $p // desde fuera de la funcin echo "Suma: $s Producto: $p";

Si en la definicin de la funcin se hubiera prescindido del signo & en los dos ltimos argumentos, al llamarla se estara trabajando no sobre las posiciones de memoria de las dos variables sino sobre una copia de su valor (paso por valor). Esto significa que al devolver el control del programa al punto en el que se efectu la llamada, las dos variables enviadas ($s y $p) no tendran ningn valor asignado. Ejemplo 7.12: Para apreciar la diferencia entre ambas maneras de pasar los argumentos de una funcin, se define a continuacin una funcin que toma como argumento una variable numrica y multiplica su valor por 20, pero implementando las dos versiones: pasando el argumento por valor (funcin Fvalor()) y pasndolo por referencia (funcin Frefer()).
function Fvalor($x){ $x *= 20; } function Frefer(&$x){ $x *= 20; }

205

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Con las funciones anteriores, las sentencias


$z = 3; Fvalor($z); echo "$z";

escribiran en la pgina el valor 3, valor inicial de la variable $z y que no se ve afectado por el cambio de valor del argumento dentro de la funcin, por ser pasado por valor. Por el contrario, si se pasa el argumento por referencia, al efectuar las sentencias:
$z = 3; Frefer($z); echo "$z";

escribira en la pgina el valor 60, ya que al pasar el argumento por referencia, la modificacin que sufre dentro de la funcin se mantiene fuera de ella.

7.4. MBITO DE LAS VARIABLES


7.4.1. VARIABLES LOCALES
Toda variable definida dentro de una funcin tiene un mbito local a la misma; es decir, nicamente podr ser utilizada dentro de la propia funcin. Ejemplo 7.13: Dada la funcin f(), en la que se define una variable local $titulo, cualquier referencia a esa variable fuera de la funcin devolvera un valor nulo (variable no definida). As, con las siguientes sentencias no se imprimira ningn mensaje:
function f() { $titulo = "Mar adentro"; print $titulo; } print $titulo;

206

DEFINICIN DE FUNCIONES

7.4.2. VARIABLES GLOBALES


Por otra parte, una variable declarada fuera de una funcin tiene un mbito global, y no puede ser utilizada dentro de una funcin, a no ser que se declare explcitamente su globalidad. Ejemplo 7.14: El siguiente programa tampoco escribira ningn mensaje, ya que al hacer la referencia a la variable $director dentro de la funcin, PHP buscar esa variable localmente.
$director = "Amenbar"; function g() { print $director; } g(); // variable de mbito global

// referencia a una variable local

// llamada a la funcin

Puede observarse que el funcionamiento de PHP en este sentido es diferente al de otros lenguajes como C, en los que cualquier variable global puede ser utilizada directamente dentro de las funciones, a no ser que se oculten por una variable local con el mismo nombre. En PHP las variables globales deben ser declaradas como tal dentro de la funcin que quiera utilizarlas, esta declaracin se hace utilizando la palabra reservada global. No existe ningn lmite al nmero de variables globales que pueden aceptar las funciones. Ejemplo 7.15: Si se desea utilizar la variable $director dentro de la funcin g(), la declaracin debera hacerse de la siguiente manera:
$director = "Amenbar"; // variable de mbito global

function g() { global $director; // declaracin de variable global print $director; // referencia a la variable global }

207

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Una segunda forma de acceder a las variables globales dentro de una funcin es utilizar el array $GLOBALS, que siempre almacena todas las variables globales definidas. As, en la funcin anterior, tambin se podra acceder a la variable $director utilizando la siguiente sintaxis:
function g() { print $GLOBALS["director"]; }

$GLOBALS es un array asociativo en el que para acceder a sus elementos se utiliza, en lugar de un ndice numrico, el propio nombre de la variable pero sin el signo $. En el Captulo 8 se estudiarn en detalle este tipo de arrays.

7.4.3. VARIABLES ESTTICAS


Otro aspecto importante relacionado con el mbito de las variables es la posibilidad de definir variables estticas. Una variable esttica tiene un mbito local a la funcin en la que se define pero no pierde su valor cuando se termina la ejecucin de la misma. Es decir, conserva el valor entre llamadas sucesivas a la funcin; en contra de lo que ocurre con las variable locales, que pierden su valor una vez que la ejecucin de la funcin ha finalizado. Ejemplo 7.16: La siguiente funcin declara una variable esttica, con valor inicial 0, y en cada iteracin la incrementa en una unidad y escribe su nuevo valor.
function h() { static $n = 0; $n++; print "$n "; }

Para comprobar que realmente la variable no se destruye al salir de la funcin, se podra implementar un bucle de llamadas sucesivas con el siguiente:
for($i=1;$i<=10;$i++) h();

208

DEFINICIN DE FUNCIONES

Puede comprobarse que el bucle generara el siguiente resultado:


1 2 3 4 5 6 7 8 9 10

Si la variable $n no hubiese sido declarada esttica, en cada llamada a la funcin se perdera el valor previo, inicializndose de nuevo en 0.

7.5. CLUSULAS INCLUDE Y REQUIRE


Al programar es bastante frecuente que unas mismas lneas de cdigo o conjunto de funciones se necesiten en varios documentos. Puede tratarse por ejemplo, de: Funciones de validaciones de datos. Funciones para mostrar cabeceras o pies de pginas. Cdigo de configuracin para acceso a una base de datos. Definicin de determinados parmetros del programa.

En lugar de copiar el cdigo, se puede optar por escribir el cdigo correspondiente en ficheros externos e incluirlos tantas veces como se quiera en otros ficheros diferentes. Las clusulas include y require permiten incluir y ejecutar el contenido del fichero indicado en aqul que contiene la clusula. De esta forma pueden escribirse completas libreras de funciones y facilitar su portabilidad y reusabilidad. La sintaxis de las dos sentencias de inclusin es idntica:
include("fichero.php"); require("fichero.php");

La inclusin puede realizarse en cualquier punto del programa, incluso puede depender del flujo de ejecucin, por ejemplo, una inclusin dentro de un bloque if. El nombre del fichero a incluir puede estar incluso almacenado en una variable y cambiar de valor durante la ejecucin del programa. Adems, en el caso de que el fichero a incluir se encuentre en un directorio diferente del que incluye al fichero que hace la llamada, el nombre del mismo debera ir acompaado de la ruta relativa para localizarlo.

209

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

La nica diferencia entre include y require es que, en caso de no localizar el fichero a incluir, require produce un Error Fatal y no ejecuta el resto del programa ni contina con la carga de la pgina. En cambio, con include, si el fichero no se encuentra, se genera un aviso pero se sigue con la ejecucin del resto del programa y carga de la pgina. Ejemplo 7.17: A continuacin se muestra el uso de la clusula require para incluir en un programa las asignaciones realizadas en el fichero de nombre definiciones.php. El contenido de este podra ser:
<?php $titulo = "Los increibles"; $director = "Brad Bird"; $genero = "aventuras"; ?>

Si otro documento quiere incluir estas definiciones, debera hacerlo de la siguiente manera:
<HTML> <BODY> <?php require("definiciones.php"); echo "Nuestro prximo estreno: $titulo, "; echo "pelcula del genero $genero, "; echo "dirigida por $director"; ?> </BODY> </HTML>

Por supuesto, la inclusin puede tener lugar en cualquier punto, incluso dentro de una funcin, tal como ocurre en el cdigo siguiente:
function estreno(){ include("definiciones.php"); echo "Nuestro prximo estreno: $titulo, "; echo "pelcula del genero $genero, "; echo "dirigida por $director"; }

En este ltimo caso, al incluirse las definiciones dentro del cuerpo de la funcin, las variables definidas pasarn a tener un mbito local, y por tanto solo podrn ser

210

DEFINICIN DE FUNCIONES

utilizadas dentro de esa funcin. Si se quiere acceder a cualquiera de las tres variables definidas desde una lnea de cdigo externa a la funcin, se debera indicar en la definicin de la misma que dicha variable sea declarada global:
function estreno(){ global $titulo; global $director; global $genero; include("definiciones.php"); echo "Nuestro prximo estreno: $titulo, "; echo "pelcula del genero $genero, "; echo "dirigida por $director"; }

7.6. FUNCIONES VARIABLES


PHP soporta el concepto de funciones variables, lo que significa que el nombre de una funcin puede estar almacenado en una variable, y por tanto, cambiar durante la ejecucin del programa. Cuando en un programa PHP una variable va seguida de los parntesis que se utilizan para dar valores a los argumentos de una funcin, PHP automticamente buscar una funcin cuyo nombre coincida con el valor de la correspondiente variable y tratar de aplicarla. Ejemplo 7.18: Supngase que se dispone de dos funciones diferentes que pueden realizar el clculo del precio total a pagar por un nmero $n de entradas a adquirir:
function precio_normal($n) { return ($n * 4.5); } function precio_reducido($n) { return ($n * 3); }

Como puede apreciarse, las dos funciones tienen nombres diferentes, una aplica un precio de 4.5 por entrada, mientras que para la otra el precio unitario es de 3. En el fragmento de cdigo que se incluye a continuacin se utiliza una variable $tarifa que guardar el nombre de la funcin concreta que se desea aplicar, y se utiliza esa variable para hacer una llamada a dicha funcin.

211

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

$num_entradas = 5; $tarifa = "precio_normal"; $importe = $tarifa($num_entradas); print "El importe total de las $num_entradas entradas es $importe euros.";

En este caso concreto, se est llamando a la funcin precio_normal(), y, por tanto, la salida del programa sera: El importe total de las 5 entradas es 22.5 euros. Por supuesto, el valor de la variable que hace referencia a la funcin podra ser asignado a partir de determinadas condiciones en el programa, por ejemplo, si el da actual es un mircoles se podra aplicar la tarifa reducida y en cualquier otro da la tarifa normal:
if(date("w") == 3) $tarifa = "precio_reducido"; else $tarifa = "precio_normal"; $importe = $tarifa($num_entradas);

Para obtener el da de la semana correspondiente al da actual se utiliza la funcin date() con el parmetro "w", en esta situacin esta funcin devuelve un valor de 0 a 6, correspondiendo el 0 al domingo y el 6 al sbado. Si se utilizan funciones variables, se debe tener especial cuidado en evitar la asignacin a la variable de un nombre de una funcin inexistente, ya que en caso contrario se producira un error grave en tiempo de ejecucin y se finalizara bruscamente la ejecucin del programa. Para asegurarse de que una funcin realmente existe, PHP dispone de la funcin function_exists(), que devuelve un valor booleano indicando si la funcin cuyo nombre se pasa como argumento existe o no. function_exists() busca la correspondiente funcin tanto entre la funciones internas del lenguaje como entre las definidas por el propio programador. De hecho, es posible obtener un array con los nombres de todas las funciones disponibles en el programa, para ello basta hacer una llamada a una nueva funcin de PHP:
get_defined_functions()

212

DEFINICIN DE FUNCIONES

Por ejemplo, una simple ejecucin de las sentencias


$f = get_defined_functions(); print_r($f);

mostrara en la pgina una lista con las ms de 700 funciones predefinidas en PHP.

213

ARRAYS
8.1. CONCEPTOS FUNDAMENTALES
Los arrays son estructuras de datos que estn presentes en prcticamente la totalidad de lenguajes de programacin. Permiten el almacenamiento y procesamiento de grandes volmenes de datos sin necesidad de tener que recurrir al uso de un elevado nmero de variables. Una vez almacenada la informacin en un array, puede accederse a ella y modificarse siempre que sea necesario, gracias a la multitud de funciones que permiten la gestin y manipulacin de arrays, aspecto este ltimo en el que destaca especialmente el lenguaje PHP. Este captulo se centra en explicar los procesos de construccin de arrays y sus caractersticas principales; para terminar abordando con detalle las funciones ms interesantes de manipulacin de arrays. Un array o matriz es un conjunto de datos que se almacenan bajo un nombre comn y a los que se puede acceder utilizando uno o ms ndices. En PHP los datos que componen el array pueden ser de diferente tipo, de manera que en un nico array pueden almacenarse indistintamente cadenas de caracteres, valores numricos, otros arrays,... Una de las particularidades que distinguen a PHP de otros lenguajes de programacin surge a la hora de crear el array: no es necesario determinar la dimensin antes de inicializarlo. Esto dota de una gran flexibilidad a

215

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

los programas, pues permite la modificacin posterior del array, suprimiendo o aadiendo nuevos elementos cuando sea necesario.

8.1.1. CONSTRUCCIN DE ARRAYS


Los elementos que componen un array, como cualquier otro elemento, son almacenados en una variable, para indicar que dicha variable contiene un array se utilizan los caracteres [], situando entre ellos un ndice numrico que permitir identificar a cada uno de los elementos individuales. Ejemplo 8.1: Una primera forma de definir un array consiste en asignar directamente sus valores, por ejemplo, a continuacin se define un array de nombre $x, con cuatro elementos indexados numricamente comenzando en la posicin 0:
$x[0] = 1; $x[1] = "hola!!"; $x[2] = 3; $x[] = "ltimo";

A la hora de aadir un ltimo elemento no es necesario indicar el ndice correspondiente. En este ejemplo, automticamente se asigna a la posicin 3. Adems, puede observarse cmo el array puede contener datos de tipos diferentes, en este caso dos valores numricos y dos cadenas de caracteres. Como alternativa se podra haber creado e inicializado el anterior array con ayuda de la funcin array(), de la siguiente forma:
$x = array(1, "hola!!",3, "ltimo");

En este caso no se han especificado ndices y se consideran por defecto los valores 0, 1, 2 Para acceder a cada uno de los elementos del array, de nuevo se utiliza el ndice, pudindose utilizar esos valores en una expresin como cualquier otra variable. Por ejemplo:
$z = $x[0] + 5*$x[2];

216

ARRAYS

En este primer ejemplo se ha mostrado la forma de construir un array indexado numricamente; pero en PHP es posible indexar los elementos de cualquier array con cadenas de caracteres, lo que permite al programador una identificacin ms efectiva de sus elementos. Este tipo de arrays se conocen como arrays asociativos. Ejemplo 8.2: Supngase que se desea almacenar los aos de un conjunto de pelculas. Se puede construir un array de elementos numricos (los aos) indexados mediante una cadena de caracteres (el ttulo de la pelcula correspondiente).
$peliculasAo["La costilla de Adn"] = 1949; $peliculasAo["La gran ilusin"] = 1937; $peliculasAo["Roma, ciudad abierta"] = 1944; $peliculasAo["Sabrina"] = 1954; $peliculasAo["Vive como quieras"] = 1938;

Opcionalmente, con ayuda de la funcin array() se podra generar el array de la siguiente manera:
$peliculasAo=array("La costilla de Adn" => 1949, "La gran ilusin" => 1937, "Roma, ciudad abierta" => 1944, "Sabrina" => 1954, "Vive como quieras" => 1938);

En este caso, al construir el array debe indicarse tanto la palabra clave que acta de ndice como el valor asociado a ese elemento del array. Aunque el array se haya construido con la funcin array(), en cualquier momento se podra aadir un nuevo elemento:
$peliculasAo["West Side Story"] = 1961;

Para acceder a los elementos del array se utiliza de nuevo la palabra clave:
echo "El ao de produccin de la pelcula <i>Sabrina</i> es $peliculasAo[Sabrina]";

En el caso de que la palabra clave no contenga espacios en blanco, basta con colocar dicha palabra entre los corchetes para acceder al elemento, pero cuando s contiene espacios en blanco o caracteres especiales, se debera dar, a su vez, entrecomillada.
$a = $peliculasAo["Roma, ciudad abierta"];

217

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

NOTA

Cualquier intento de acceso a un elemento del array mediante un ndice o palabra clave no definida produce una notificacin de error por parte del intrprete de PHP. Sin embargo, este tipo de errores no son considerados graves y las restantes sentencias del programa pueden seguir siendo ejecutadas.

8.1.2. ARRAYS MULTIDIMENSIONALES


El lenguaje PHP permite la creacin de arrays multidimensionales, es decir, arrays cuyos elementos son nuevos arrays. La sintaxis es similar al caso de una dimensin, siendo necesario indicar los dos ndices por separado. Ejemplo 8.3: A continuacin se crea un array de nombre $M y de dos dimensiones:
$M[0][0] $M[0][1] $M[1][0] $M[1][1] = = = = 5; 3; -2; 7;

La definicin equivalente usando la funcin array() sera:


$M=array(array(5,3),array(-2,7));

Para acceder a los elementos individuales del array se deberan utilizar los dos ndices:
$d = $M[0][0]*$M[1][1] - $M[0][1]*$M[1][0];

Por supuesto, es posible definir arrays asociativos multidimensionales, e incluso combinar ndices numricos y alfabticos Ejemplo 8.4:
$pelicula["George Cukor"][1949] = "La costilla de Adn"; $pelicula["Jean Renoir"][1937] = "La gran ilusin"; $pelicula["Roberto Rossellini"][1944] = "Roma, ciudad abierta"; $pelicula["Billy Wilder"][1954] = "Sabrina"; $pelicula["Frank Capra"][1938] = "Vive como quieras";

218

ARRAYS

Conviene advertir de la necesidad de tener especial cuidado al utilizar arrays multidimensionales dentro de cadenas de caracteres ya que para que se expandan correctamente deben ser encerrados entre llaves.
echo "Hoy se proyectar una produccin de 1937 dirigida por Jean Renoir: {$pelicula["Jean Renoir"][1937]}";

Ejemplo 8.5: Tambin es posible indexar los elementos de un array multidimensional:


$peliculas = array( "La costilla de Adn" => array("Director"=>"G. "La gran ilusin" => array("Director"=>"J. "Roma, ciudad abierta" => array("Director"=>"R. "Sabrina" => array("Director"=>"B. "Vive como quieras" => array("Director"=>"F. );

Cukor","Ao"=>1949), Renoir","Ao"=>1937), Rossellini","Ao"=>1944), Wilder, "Ao"=>1954), Capra","Ao"=>1938)

echo "El director de la pelcula <i>Roma, ciudad abierta</i> es {$peliculas["Roma, ciudad abierta"]["Director"]}";

8.2. RECORRIDO DE TODOS LOS ELEMENTOS DE UN ARRAY


Una vez creado e inicializado un array unidimensional o multidimensional, puede que se est interesado en mostrar o manipular todos sus elementos. Para mostrar todos los elementos de un array, una primera opcin es el uso de la funcin print_r(), que aplicada sobre un array muestra en la pgina la estructura del mismo de acuerdo al siguiente esquema:
([indice1]=>elemento1 [indice2]=>elemento2 .................... [indiceN]=>elementoN)

219

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Para la manipulacin de los elementos de arrays se dispone de estructuras iterativas que simplifican la tarea, en particular, es de destacar una sentencia especfica para recorrer todos los elementos de un array:
foreach(array as valor)

Ejemplo 8.6: La siguiente sentencia recorre todos los elementos de un array y los muestra en la pgina:
$actors = array("Marlon Brando","Gary Cooper", "Cary Grant","James Stewart"); foreach($actores as $nombre){ echo "$nombre <br>"; }

Cada elemento del array se asigna en cada iteracin a una misma variable, (en el ejemplo, la variable $nombre), que es la que se manipula. El ejemplo se limita a imprimir uno a uno todos los nombres que componen el array. Se ha aadido un comando <HTML> de cambio de lnea de forma que cada nueva iteracin comience a escribir en un nuevo rengln. El resultado sera: Marlon Brando
Gary Cooper Cary Grant James Stewart

Si adems de recuperar los elementos del array, se desea tambin conocer el ndice, tanto en el caso de ndices numricos como en arrays asociativos, se puede utilizar una sintaxis alternativa del bucle foreach:
foreach(array as ndice => valor)

Ejemplo 8.7: Dado el array y el bucle siguientes:


$pelculasAo = array("La costilla de Adn" => 1949, "La gran ilusin" => 1937, "Roma, ciudad abierta" => 1944, "Sabrina" => 1954, "Vive como quieras" => 1938); foreach($pelculasAo as $indice => $valor){

220

ARRAYS

echo "<i>$indice,</i> ($valor) <br>\n"; }

el resultado generado sera: La costilla de Adn, (1949) La gran ilusin, (1937) Roma, ciudad abierta, (1944) Sabrina, (1954) Vive como quieras, (1938) Tambin es posible construir bucles que recorran todos los elementos del array usando las restantes estructuras iterativas. El problema que surge habitualmente es que puede no saberse cuntos elementos existen en el array y cules son los ndices asociados a esos elementos, ya que una particularidad de los arrays de PHP es que no es necesario que sus elementos tengan asociados ndices numricos consecutivos. Estos problemas pueden salvarse mediante la funcin
each(array)

En cada llamada a dicha funcin se recupera un elemento del array; cuando se alcance el final del array la funcin devuelve un valor booleano falso. Realmente, en cada llamada a la funcin each() se recupera un array con dos elementos, el primero el ndice y el segundo el valor del correspondiente elemento del array. Se puede utilizar la funcin list() para asignar esos dos elementos a sendas variables y operar posteriormente con ellas. Esta funcin permite generar una lista cuyos elementos son los argumentos que se pasen, cuando se asigna a esa lista un array, PHP realiza una asignacin elemento a elemento con las variables de la lista y los elementos del array. Ejemplo 8.8: La siguiente estructura iterativa recorre e imprime todos los elementos del array $actores:
while(list($ind,$nombre) = each($actores)) echo "$nombre <br>";

Mientras no se alcance el final del array, en cada iteracin del ciclo, el ndice del elemento del array se almacena en la variable $ind y el elemento correspondiente en la variable $nombre. Tras alcanzar el ltimo elemento, la funcin each()toma el valor falso y el ciclo while finaliza.

221

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Por supuesto, tambin es posible utilizar estas estructuras iterativas anidadas para recorrer arrays multidimensionales. Ejemplo 8.9:
$peliculas=array( "La costilla de Adn" => array("Director"=>"G. Cukor","Ao"=>1949), "La gran ilusin" => array("Director"=>"J. Renoir","Ao"=>1937), "Roma, ciudad abierta" => array("Director"=>"R. Rossellini","Ao"=>1944), "Sabrina" => array("Director"=>"B. Wilder","Ao"=>1954), "Vive como quieras" => array("Director"=>"F. Capra","Ao"=>1938) ); foreach($peliculas as $indice => $titulo){ echo "Datos de $indice:<BR>\n"; foreach($titulo as $indice => $valor){ echo "&nbsp&nbsp $indice: $valor <BR>\n"; } }

El resultado generado por estas estructuras iterativas es: Datos de La costilla de Adn: Director: G. Cukor Ao: 1949 Datos de La gran ilusin: Director: J. Renoir Ao: 1937 Datos de Roma, ciudad abierta: Director: R. Rossellini Ao: 1944 Datos de Sabrina: Director: B. Wilder Ao: 1954 Datos de Vive como quieras: Director: F. Capra Ao: 1938

222

ARRAYS

Cuando se desea conocer el nmero de elementos de un array, puede usarse la funcin count(). Debe advertirse que esta funcin devuelve el nmero de elementos del array y que esa cantidad no necesariamente coincide con el ndice de su ltimo elemento, ya que en PHP no es necesario utilizar ndices consecutivos para los elementos del array. Ejemplo 8.10: A continuacin se define una funcin de creacin de tablas. Toma como argumento un array bidimensional, que se asume indexado numricamente con valores 0,1,2,..., y muestra todos sus elementos en una tabla HTML. La funcin tambin recibe como argumentos un array con los rtulos de las columnas y otro con los encabezamientos de las filas.
function crearTabla($a,$col,$f) { echo "<TABLE BORDER CELLPADDING=5>"; //Cabecera echo "<TR>"; echo "<TD>&nbsp</TD>"; for($i=0;$i<count($col);$i++){ echo "<TH>$col[$i]</TH>"; } echo "</TR>"; // Cuerpo de la tabla for($i=0;$i<count($a);$i++){ echo "<TR>"; // encabezado de la fila i-sima echo "<TH>$f[$i]</TH>"; // resto de la fila for($j=0;$j<count($a[$i]);$j++){ echo "<TD>{$a[$i][$j]}</TD>"; } echo "</TR>"; } echo "</TABLE>"; }

Considrese, por ejemplo, la necesidad de mostrar una tabla de distancias kilomtricas entre una serie de ciudades, tal como se ve en la Figura 8.1. El siguiente programa construye dicha tabla utilizando la funcin anterior y calcula la distancia en kilmetros de una ruta determinada. Se asume que la funcin anterior se encuentra definida en otro documento, de nombre funciones.php, y se utiliza la funcin include() para incluirla.

223

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Figura 8.1 Tabla de distancias kilomtricas <?php include("funciones.php"); echo "<H2>Clculo de distancias de rutas</H2><BR>"; $datos = array(array(0,100,124,198,235), array(100,0,224,98,34), array(124,224,0,115,56), array(198,98,115,0,122), array(235,34,56,122,0)); // Generacin de los arrays de cabeceras $cabecera = array(); for($i=0;$i<count($datos[0]);$i++){ $aux = $i+1; $cabecera[$i] = "Ciudad $aux"; } // Construccin de la tabla crearTabla($datos,$cabecera,$cabecera); // Determinacin de la ruta $ruta = array(1,3,5,1); $suma = 0; // Generacin de una lista con los datos de cada etapa echo "<UL>"; for($i=0;$i<count($ruta)-1;$i++){ $aux1 = $ruta[$i]; $aux2 = $ruta[$i+1]; $distancia = $datos[$aux1-1][$aux2-1];

224

ARRAYS

$suma += $distancia; echo "<LI>De la ciudad $aux1 a la ciudad $aux2: $distancia kilmetros"; } echo "<B>Distancia total: $suma kilmetros</B>"; echo "</UL>"; ?>

8.3. FUNCIONES DE MANIPULACIN DE ARRAYS


En esta seccin se describen las funciones ms representativas a la hora de manipular un array. Estas funciones permiten, entre otras cosas, la modificacin de los ndices o de los elementos de un array, la subdivisin o prolongacin, la comparacin de elementos entre arrays, la bsqueda de un ndice o de un elemento concretos, etc. Atendiendo a la tarea descrita se agruparn los diversos mtodos en categoras diferentes. Es de destacar la gran diversidad de funciones predefinidas para la manipulacin de arrays que existen en PHP.

8.3.1. TRANSFORMACIN DE LOS NDICES


array_change_key_case(array,caso): en el caso de arrays asociativos, esta funcin devuelve un nuevo array pero transformando las palabras clave a maysculas o minsculas, segn el argumento opcional caso. Los valores posibles de este segundo argumento son las constantes CASE_UPPER (conversin a maysculas) y CASE_LOWER (conversin a minsculas), siendo este ltimo el valor por defecto.

Ejemplo 8.11: El siguiente fragmento de cdigo:


$actores["Primer actor"] = "Gary Cooper"; $actores["Segundo actor"] = "Cary Grant"; $actores["Tercer actor"] = "Spencer Tracy"; $actoresMay=array_change_key_case($actores,CASE_UPPER); foreach($actoresMay as $indice => $valor) echo "$indice: $valor <BR>\n";

225

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

produce la siguiente salida: PRIMER ACTOR: Gary Cooper SEGUNDO ACTOR: Cary Grant TERCER ACTOR: Spencer Tracy

8.3.2. SUBDIVISIN
array_chunk(array,dimensin,valor_booleano): el array dado como argumento se subdivide en arrays ms pequeos de dimensin la indicada con el argumento dimensin. Se genera as un array multidimensional de ndices numricos que comienzan con el valor 0. El ltimo parmetro es un valor booleano que indica si se desea conservar los ndices del array original en los diferentes subarrays. Este parmetro es opcional, siendo su valor por defecto FALSE.

Ejemplo 8.12: El siguiente cdigo:


$oeste = array( "Solo ante el peligro","Fred Zinnemann","Gary Cooper", "Races profundas","George Stevens","Alan Ladd", "Horizontes de grandeza","William Wyler"); $oesteOrdenado = array_chunk($oeste,3); foreach($oesteOrdenado as $indice => $valor){ echo "$indice-> <BR>"; foreach($valor as $indice => $valor){ echo "&nbsp&nbsp&nbsp $indice-> $valor <BR>"; } }

da lugar a la salida: 0-> 0-> Solo ante el peligro 1-> Fred Zinnemann 2-> Gary Cooper 1-> 0-> Races profundas 1-> George Stevens 2-> Alan Ladd 2-> 226

ARRAYS

0-> Horizontes de grandeza 1-> William Wyler Se ha considerado el valor por defecto del ltimo argumento, lo que provoca que cada nuevo subarray se numere desde 0. Si se quieren conservar los ndices del array original, se debe dar como tercer argumento el valor TRUE:
$oesteOrdenado = array_chunk($oeste,3,TRUE);

De esta manera, el resultado obtenido sera: 0-> 0-> Solo ante el peligro 1-> Fred Zinnemann 2-> Gary Cooper 1-> 3-> Races profundas 4-> George Stevens 5-> Alan Ladd 2-> 6-> Horizontes de grandeza 7-> William Wyler

8.3.3. CONTABILIZACIN DE ELEMENTOS


array_count_values(array): devuelve un array formado por valores numricos que representan el nmero de veces que cada elemento del array inicial aparece repetido. Los ndices de esta nueva matriz son cada uno de los elementos iniciales. count(array): devuelve el nmero de elementos de un array. Es til en especial cuando se emplea un bucle for para acceder a cada elemento del array.

Ejemplo 8.13:
$a = array("a", "b", "c", "a", "d", "e", "b", "d", "a"); $n = count($a); echo "El array tiene $n letras, repartidas de la siguiente manera: <BR>";

227

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

$c = array_count_values($a1); foreach($c as $indice=>$valor) echo "$indice: $valor <BR>\n";

El resultado generado sera: El array tiene 9 letras, repartidas de la siguiente manera: a: 3 b: 2 c: 1 d: 2 e: 1

8.3.4. BSQUEDA DE DATOS


Para la realizacin de procesos de filtrado y bsquedas sobre los elementos de un array PHP dispone de funciones muy tiles. A continuacin se presentan brevemente alguna de ellas, acompaadas de sencillos ejemplos ilustrativos. array_filter(array,funcin): aplica una funcin de filtro booleana a cada uno de los elementos de un array dado. Aquellos para los que se obtiene el valor de retorno TRUE forman parte de un nuevo array de salida, conservando sus ndices originarios.

Ejemplo 8.14: A continuacin se muestra un ejemplo de seleccin de determinadas pelculas de una lista en funcin de su ao de produccin. En concreto, se trata de conseguir de las pelculas almacenadas, las realizadas desde el ao 1960 en adelante:
function ao($a){ return($a >= 1960); } $peliculas = array("El apartamento"=>1960,"Charada"=>1963, "Doctor Zhivago"=>1965,"Gig"=>1958, "El gran dictador"=>1940,"El hombre tranquilo"=>1952, "Lawrence de Arabia"=>1962,"West Side Story"=>1961 ); $seleccin = array_filter($peliculas,"ao");

228

ARRAYS

foreach($seleccion as $indice=>$valor) echo "$indice: $valor <BR>\n";

Como puede apreciarse, lo primero que se necesita es una funcin booleana que, dado un elemento del array, indique si debe ser seleccionado o no. El nombre de esa funcin es pasado a array_filter() como segundo argumento. El resultado final del programa anterior sera: El apartamento: 1960 Charada: 1963 Doctor Zhivago: 1965 Lawrence de Arabia: 1962 West Side Story: 1961
array_keys(array,elemento): devuelve un array con los ndices del array dado como primer argumento. Opcionalmente, se pueden pedir nicamente aquellos correspondientes a un elemento dado.

Ejemplo 8.15: El siguiente programa lista los nombres de los actores que aparecen como claves en un array asociativo:
$actores=array( "Gary Cooper" => array("Solo ante el peligro", "La gran prueba", "El secreto de vivir"), "Cary Grant" => array("La fiera de mi nia", "Arsnico por compasin","Historias de Filadelfia"), "Marlon Brando" => array("La ley del silencio", "Sayonara","Viva Zapata!") ); $busqueda=array_keys($actores); foreach($busqueda as $indice=>$valor) echo "$valor <br>\n";

Como resultado se obtiene la lista:


Gary Cooper Cary Grant Marlon Brando

229

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Ejemplo 8.16: En este segundo caso, se localizan los ndices asociados a un determinado valor. En concreto, se listan las pelculas almacenadas correspondientes al ao 1940:
$peliculas=array( "El apartamento"=>1960,"Charada"=>1963, "Doctor Zhivago"=>1965,"Gig"=>1958, "El gran dictador"=>1940,"Historias de Filadelfia"=>1940, "El hombre tranquilo"=>1952,"Lawrence de Arabia"=>1962, "Rebeca"=>1940 ); $busqueda=array_keys($peliculas,1940); foreach($busqueda as $indice=>$valor) echo "$valor <br>\n";

Se obtiene as el siguiente listado: El gran dictador Historias de Filadelfia Rebeca


array_key_exists(ndice,array): funcin booleana que devuelve el valor TRUE si el ndice dado est en el array.

Ejemplo 8.17: Dado el array $actores definido en el Ejemplo 8.15, se comprueba si el nombre de un actor est entre las palabras claves del array, y en caso afirmativo se muestra el listado de todas sus pelculas:
$actor="Gary Cooper"; if(array_key_exists($actor,$actores)) { echo "<B>Pelculas de $actor:</B><BR>"; foreach($actores[$actor] as $indice=>$valor) echo "$valor <BR>\n"; }

array_rand(array,num_elementos): devuelve un array formado al seleccionar aleatoriamente los ndices correspondientes a un nmero de elementos del array dado. El segundo parmetro es opcional, si no se indica se asume el valor 1.

230

ARRAYS

Ejemplo 8.18: En el siguiente ejemplo, se disea una pgina de manera que cada vez que un usuario accede a ella obtiene entradas gratis para dos pelculas de un ciclo de cine:
$peliculas=array("El halcn malts","Laura","Cayo Largo", "El sueo eterno","Forajidos"); // se obtienen al azar los ndices de dos pelculas $sorteo = array_rand($peliculas,2); echo "<H2>Enhorabuena! Ha conseguido entradas gratis para los pases de las siguientes pelculas del ciclo de cine negro:</H2>"; // se muestran las pelculas seleccionadas for ($i = 0; $i<count($sorteo); $i++ ){ $j = $sorteo[$i]; echo "<H3><I>$peliculas[$j]</I></H3>"; }

El resultado de la ejecucin de este programa es una pgina como la que aparece en la Figura 8.2; por supuesto, cada vez que se acceda a esa pgina el resultado vara, ya que el sorteo se repite.

Figura 8.2 Resultado del sorteo

array_search(elemento_buscado,array,valor_logico): devuelve el ndice de elemento_buscado si este pertenece al array dado. En caso contrario, devuelve FALSE. Si dicho elemento aparece ms de una vez dentro del array, solo se obtiene el ndice correspondiente a la primera aparicin. El tercer argumento es opcional y corresponde a un valor lgico que

231

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

indica si el elemento a buscar debe coincidir con el del array tanto en el valor como en el tipo. array_values(array): devuelve una lista con todos los elementos del array dado, donde ahora los ndices son los numricos por defecto, independiente de los que tuviera previamente. in_array(elemento,array): busca un elemento dado dentro de un array. Devuelve TRUE si dicho elemento pertenece al array, FALSE en caso contrario.

8.3.5. GENERACIN DE ARRAYS


A continuacin se recogen algunas funciones que permiten generar arrays a partir de valores individuales o a partir de otros arrays. array_combine(ndices,elementos): funcin que devuelve un array formado por los elementos dados como segundo argumento. Se indexan en correspondencia con el primer argumento de la funcin. Ambos argumentos deben ser arrays. La funcin devuelve el valor FALSE si ambos argumentos no tienen el mismo nmero de elementos. compact(ListaVariables): dada una lista de variables, se genera un array asociativo con los valores de esas variables, utilizando como palabras clave para los elementos del array el nombre de la correspondiente variable. Las variables se pueden pasar o bien con cadenas de caracteres conteniendo el nombre de las mismas, o bien introduciendo dichos nombres en un array.

Ejemplo 8.19: A partir de tres variables que almacenan los datos de una determinada pelcula, (ttulo, director y ao),
$pelcula = "La diligencia"; $director = "J. Ford"; $ao = 1939;

se desea generar un array formado por esos tres elementos e indexados con el nombre de sus respectivas variables. Esto se podra hacer de dos maneras:

232

ARRAYS

$listaAux=array("pelicula","director","ao"); $lista=compact($listaAux);

o bien:
$lista=compact("pelicula","director","ao");

extract(array,extraccin): este mtodo procede de forma inversa al anterior. En este caso, a partir de un array con elementos indexados se genera una serie de variables de nombre igual a cada uno de los ndices y de valor el elemento correspondiente. De forma opcional se puede indicar la forma de extraccin, es decir qu hacer si existe una variable inicializada previamente y de nombre igual a alguno de los ndices. En concreto, algunos de los valores que puede tomar el segundo argumento son las constantes: EXTR_OVERWRITE: la variable ya existente toma el nuevo valor. Este es el valor que se toma por defecto. EXTR_SKIP: la variable ya existente no modifica su valor. EXTR_PREFIX_SAME: se aade un prefijo (tercer argumento en forma de cadena de caracteres) a la nueva variable. EXTR_PREFIX_ALL: se aade un prefijo a todas las variables.

Ejemplo 8.20: A continuacin se crean tres variables a partir de los ndices de un array dado y se inicializan automticamente con los valores correspondientes. Obsrvese que previamente a la construccin del array y a la llamada a la funcin extract(), ya se ha inicializado una variable de nombre idntico a uno de los ndices del array.
$titulo = "Misin de audaces"; $pelcula = array("titulo"=>"La diligencia", "director"=>"J. Ford", "protagonista"=>"J. Wayne"); extract($pelicula); echo "$titulo, de "$director, con "$protagonista";

Al no indicarse forma de extraccin, la variable $titulo toma el nuevo valor, con lo que el mensaje que se genera es: La diligencia, de J. Ford, con J. Wayne

233

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Si en lugar de la llamada a la funcin extract() con un solo parmetro, se hace la llamada siguiente:
extract($pelicula,EXTR_SKIP);

el resultado sera: Misin de audaces, de J. Ford, con J. Wayne range(inicio,final,aumento): se genera un array numrico o de caracteres, comenzando en el valor inicial hasta llegar al valor final dado. Como argumento opcional, se incluye el criterio de paso de un elemento a otro, cuyo valor por defecto es 1. Este tercer argumento fue incorporado en la versin 4.4 del lenguaje. La Tabla 8.1 muestra algunos ejemplos de uso de la funcin range(). Sentencia range(3,15) range(15,3) range(3,10,2) range('b','k') range('k','b') range('casa','gato') Array generado (3,4,5,6,7,8,9,10,11,12,13,14,15) (15,14,13,12,11,10,9,8,7,6,5,4,3) (3,5,7,9) ('b','c','d','e','f','g','h','i','j','k') ('k','j','i','h','g','f','e','d','c','b') ('c','d','e','f','g')

Tabla 8.1 Ejemplos de usos de la funcin range()

array_slice(array,fragmento,dimensin): se obtiene un array a partir de determinados elementos de uno dado. Estos elementos se determinan con ayuda de los argumentos fragmento y dimensin, de acuerdo a los siguientes criterios: Si fragmento es positivo, indica la posicin a partir de la cual se extraen los elementos de la matriz dada. Si fragmento es negativo, extrae elementos comenzando por el final del array. El nmero de elementos a extraer coincide en este caso con el valor sin signo de fragmento. Si se indica el argumento dimensin, este representa el nmero de elementos a extraer, en el caso de ser positivo, o el nmero de elementos a dejar en el array, en el caso de que sea negativo.

234

ARRAYS

La Tabla 8.2 muestra algunos sencillos ejemplos del uso de esta funcin.

Sentencia
array_slice($a,3) array_slice($a,-2) array_slice($a,3,2) array_slice($a,-2,1) array_slice($a,1,-2) array_slice($a,-4,-2)

Array generado
(4,5,6) (5,6) (4,5) (5) (2,3,4) (3,4)

$a = array(1,2,3,4,5,6)

Tabla 8.2 Ejemplos de uso de la funcin array_slice()

array_splice(array,frag,dim,nuevo): si no se especifica como cuarto argumento una lista de elementos nuevos, este mtodo funciona exactamente igual que el anterior. En caso contrario, estos nuevos elementos sustituyen a los eliminados.

Ejemplo 8.21: Las siguientes sentencias permiten apreciar el funcionamiento de esta funcin:
$a = array(1,2,3,4,5,6); print_r($a); print "<br>"; /* insercin de tres nuevos elementos, en sustitucin del cuarto y el quinto: a1=(1,2,3,0,1,2,6) */ array_splice($a,3,2,array(0,1,2)); print_r($a); print "<br>";

El resultado de la ejecucin de estas sentencias es: Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 [5] => 6 ) Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 0 [4] => 1 [5] => 2 [6] => 6 ) Ejemplo 8.22: El siguiente ejemplo muestra una pgina de actualizacin del listado de directores de los que se tienen pelculas disponibles.
$directores = array("Frank Capra","John Ford", "Elia Kazan","Jean Renoir", "Roberto Rossellini","William Wyler");

235

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

//Lista de directores dados de baja $directoresAus = array("Jean Renoir","William Wyler"); // bucle que recorre todos los directores dados de baja for($i=0;$i<count($directoresAus);$i++){ // se comprueba si pertenece a la lista general if(in_array($directoresAus[$i],$directores)){ // en caso afirmativo se accede a su ndice $posicion = array_search($directoresAus[$i], $directores); //y se procede a la sustitucin array_splice($directores,$posicion,1, "$directoresAus[$i]=><b>No disponible</b>"); } } echo "<H2>Bienvenido. Esta es nuestra lista actualizada de directores</H2>"; foreach($directores as $indice=>$valor) echo "<i>$valor</i> <br>";

La pgina generada por este programa puede ver en la Figura 8.3.

Figura 8.3 Lista de directores

236

ARRAYS

8.3.6. PROLONGACIN O TRUNCAMIENTO DE UN ARRAY


array_fill(ndice,cantidad,elemento): funcin que devuelve un array en el que se ha introducido un elemento dado tantas veces como se desee a partir de un ndice tambin dado. array_pad(array,tamao_final,elemento_nuevo): prolonga el array dado con un nuevo elemento, hasta completar el tamao especificado. La prolongacin se realiza por la derecha o por la izquierda, dependiendo de si el valor del argumento tamao_final es positivo o negativo, respectivamente. El correcto funcionamiento de la operacin exige que el tamao especificado en el argumento sea mayor que la dimensin del array.

array_pop(array): extrae el ltimo elemento de una matriz dada, quedando esta modificada con un elemento menos.
array_push(array,elemento1,elemento2,...): aade al array dado los elementos que se indican como argumentos. La funcin devuelve la nueva dimensin del array. array_shift(array): extrae el primer elemento del array dado, quedando este modificado con un elemento menos. array_unique(array): elimina los elementos repetidos del array dado, conservndose nicamente la primera posicin encontrada de dichos elementos. La funcin devuelve un nuevo array, manteniendo los ndices anteriores de sus elementos.

Ejemplo 8.23: La funcin array_unique() considera elementos iguales aquellos cuya representacin en forma de cadena es idntica. Este ejemplo ilustra su funcionamiento:
$a = array(1,2,"1",3,4,5,"4",6,7,"6",8,6); $b = array_unique($a); foreach($b as $indice=>$valor) echo "$indice: $valor <BR>\n";

237

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

El resultado obtenido es: 0: 1 1: 2 3: 3 4: 4 5: 5 7: 6 8: 7 10: 8 array_unshift(array,elementos): funcin que aade al inicio del array dado los elementos indicados como argumentos y devuelve el nmero de elementos del nuevo array.

8.3.7. COMBINACIN DE ARRAYS


array_merge(array1,array2,array3,...): devuelve un nuevo array formado uniendo todos los elementos de los arrays pasados como argumentos. Si dos o ms elementos tienen el mismo ndice alfabtico en varios de los arrays iniciales, se incluye en la unin el ltimo de ellos.

Ejemplo 8.24: A continuacin se muestra la unin de dos arrays asociativos en los que una de las claves se repite en ambos.
$peliculas1 = array( "B. Wilder"=>"Primera plana", "J. Ford"=>"Ro Grande", "G. Cukor"=>"Cena a las ocho"); $peliculas2 = array( "F. Capra"=>"Sucedi una noche", "B. Wilder"=>"Sabrina", "W. Wyler"=>"Horizontes de grandeza"); $p = array_merge($peliculas1,$peliculas2);

Como resultado de la unin se generara un array $p con los siguientes elementos:


("B. Wilder"=>"Sabrina", "J. Ford"=>"Ro Grande", "G. Cukor"=>"Cena a las ocho", "F. Capra"=>"Sucedi una noche", "W. Wyler"=>"Horizontes de grandeza").

238

ARRAYS

array_diff_assoc(array1,array2,array3,...): funcin que devuelve un array formado por los elementos del array dado como primer argumento y que no se encuentren en ninguno de los restantes arrays. Los ndices de los elementos se tienen en cuenta en la comparacin, es decir, un mismo valor pero asociado a ndices diferentes en los dos arrays no se considera igual. array_diff(array1,array2,array3,...): a diferencia de la funcin anterior, aqu no se tienen en cuenta los ndices, se comparan exclusivamente los valores de los elementos; por lo dems el funcionamiento de la funcin es el mismo.
array_intersect_assoc(array1,array2,array3,...):

devuelve un array con los elementos comunes a todos los argumentos de la funcin. En la comparacin se tienen en cuenta los ndices.

array_intersect(array1,array2,array3,...): a diferencia de la

funcin anterior, en este caso, se realiza la interseccin pero los ndices de los elementos no se tienen en cuenta en la comparacin. Ejemplo 8.25: Dados los siguientes arrays:
$oeste = array("a"=>"J. Ford", "b"=>"W. Wyler", "c"=>"H. Hawks", "d"=>"G. Stevens"); $comedia = array("a"=>"J. Ford", "b"=>"F. Capra", "c"=>"G. Cukor", "d"=>"H. Hawks"); $drama = array("a"=>"W. Wyler", "b"=>"D. Sirk", "c"=>"R. Walsh", "d"=>"G. Cukor");

Si se realiza la operacin:
$c = array_diff_assoc($oeste,$comedia,$drama);

se obtendra un array con los siguientes elementos: ("b"=>"W. Wyler", "c"=>"H. Hawks", "d"=>"G. Stevens") pues, si bien los tres primeros elementos del array $oeste se repiten en posteriores arrays, nicamente el primero de ellos aparece repetido con el mismo ndice. Si en lugar de utilizar la funcin array_dic_assoc() se ejecuta la siguiente sentencia:
$c = array_diff ($oeste,$comedia,$drama);

239

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

el array $c sera: ("d"=>"G. Stevens") ya que ahora los tres primeros elementos del array $oeste deberan ser eliminados al estar repetidos en los otros, aunque los ndices o palabras clave puedan ser iguales.

8.3.8. APLICACIN DE FUNCIONES


array_map(funcin,array1,array2,...): funcin que devuelve un nuevo array donde cada uno de sus elementos es el resultado de aplicar la funcin dada como primer argumento, a los elementos respectivos elementos de array1, array2,. El nmero de argumentos de funcin deber coincidir con el de arrays dados. En cuanto a la longitud de estos, si es diferente, el de menor nmero de elementos se prolonga con elementos vacos.

Ejemplo 8.26: El siguiente programa toma una lista con los nombres y apellidos de una serie de directores de cine. El objetivo es crear una lista nueva donde el nombre de cada director aparece solo con su inicial. En el programa se utilizan algunas funciones de manipulacin de cadenas de caracteres que sern estudiadas con ms detalle en el prximo captulo.
/* funcin que toma la primera palabra de una cadena y la transforma en su inicial seguida de un punto. */ function abreviar($cadena){ // primera palabra de la cadena $separacion = strtok($cadena," "); // concatenacin de la inicial con un punto $abrev = substr($separacion,0,1)."."; // generacin de la cadena resultado return(str_replace($separacion,$abrev,$cadena)); } // Definicin del array $directores=array("D1"=>"Charles Chaplin", "D2"=>"Stanley Donen","D3"=>"John Ford", "D4"=>"David Lean","D5"=>"Vincent Minnelli"); // Aplicacin de la funcin sobre cada director

240

ARRAYS

$directoresAbrev = array_map("abreviar",$directores); // Impresin del resultado foreach($directoresAbrev as $indice=>$valor){ echo "$indice -> $valor<BR>"; }

La salida generada por el programa es: D1 -> C. Chaplin D2 -> S. Donen D3 -> J. Ford D4 -> D. Lean D5 -> V. Minnelli Ejemplo 8.27: En el caso de considerar ms de un array, la funcin a aplicar debe tener ms de un argumento. El siguiente programa muestra un ejemplo de esta situacin:
function union($a1,$a2){ return("El scar del ao $a1 es $a2."); } $aos = array(1940,1945,1951,1955,1960); $peliculas = array("Rebeca","Das sin huella", "Un americano en Pars","Marty", "El apartamento"); $oscar = array_map("union",$aos,$peliculas);

Tras aplicar la funcin array_map(), el array $oscar tendra el siguiente contenido: (0=>" El scar del ao 1940 es Rebeca.", 1=>" El scar del ao 1945 es Das sin huella.", 2=>" El scar del ao 1951 es Un americano en Pars.", 3=>" El scar del ao 1955 es Marty.", 4=>" El scar del ao 1960 es El apartamento.") Ejemplo 8.28: Con la ayuda de la funcin array_map() es posible construir un array multidimensional a partir de una serie de arrays unidimensionales. En el siguiente ejemplo se muestra el proceso:

241

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

$pelculas = array("El apartamento","Charada", "Doctor Zhivago","Gig", "El gran dictador","El hombre tranquilo"); $directores = array("B. Wilder","S. Donen","D. Lean", "V. Minnelli","C. Chaplin","J. Ford"); $a = array(1960,1963,1965,1958,1940,1952); //Se incluye como primer argumento null $listado=array_map(null,$peliculas,$directores,$a);

Si se indica como primer argumento de la funcin array_map() la palabra null, no se considerar ninguna funcin a aplicar y lo que se generar es un array bidimensional en el que cada elemento es un array con el ttulo de la pelcula, su director y su ao de realizacin. array_walk(array,nombreFuncin,argumentos): aplica una funcin determinada a cada elemento de la matriz dada y a su correspondiente clave. Los argumentos de la funcin aplicada deben ser, por este orden: elemento, ndice, otros argumentos.

Ejemplo 8.29: Dado un array de aos, correspondientes a pelculas dadas como ndices, a continuacin se utiliza la funcin array_walk() para escribir en la pgina un listado con el ttulo de cada pelcula junto con su ao entre parntesis. Para ello se define previamente una funcin que realiza genera el mensaje correspondiente a cada pelcula, y se pasa como segundo argumento a array_walk() el nombre de esa funcin:
function unir($a,$b){ echo "$b, ($a).<BR>"; } $peliculas = array( "El apartamento"=>1960, "Charada"=>1963, "Doctor Zhivago"=>1965, "Gig"=>1958, "El gran dictador"=>1940, "Historias de Filadelfia"=>1940, "El hombre tranquilo"=>1952, "Lawrence de Arabia"=>1962, "Rebeca"=>1940 );

242

ARRAYS

array_walk($peliculas,'unir');

El resultado final de la llamada a esta funcin es: El apartamento, (1960). Charada, (1963). Doctor Zhivago, (1965). Gig, (1958). El gran dictador, (1940). Historias de Filadelfia, (1940). El hombre tranquilo, (1952). Lawrence de Arabia, (1962). Rebeca, (1940). En la llamada a array_walk() se pueden pasar argumentos adicionales que sern enviados a la funcin a evaluar junto con el ndice y valor de cada elementos del array. Por ejemplo, definiendo la siguiente funcin:
function unir2($a,$b,$cadena){ echo "$b, $cadena $a.<BR>"; }

la sentencia
array_walk($peliculas,'unir2',"pelcula realizada en ");

generara una salida como esta: El apartamento, pelcula realizada en 1960. Charada, pelcula realizada en 1963. Doctor Zhivago, pelcula realizada en 1965. Gig, pelcula realizada en 1958. El gran dictador, pelcula realizada en 1940. Historias de Filadelfia, pelcula realizada en 1940. El hombre tranquilo, pelcula realizada en 1952. Lawrence de Arabia, pelcula realizada en 1962. Rebeca, pelcula realizada en 1940.

243

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

8.3.9. ORDENACIN DE LOS ELEMENTOS DE UN ARRAY


En el aspecto de funciones de ordenacin de arrays, PHP destaca especialmente por la disponibilidad de un buen nmero de funciones diferentes. asort(array) y arsort(array): estas funciones permiten ordenar los elementos de una lista dada, bien en orden ascendente (asort) o descendente (arsort). Su particularidad es que cada elemento conserva su ndice original.

Ejemplo 8.30: Dado el array del Ejemplo 8.29, si se desea que la lista mostrada incluya las pelculas en orden cronolgico, desde la ms actual a la ms antigua, podra realizarse una simple llamada a la funcin arsort() antes de la llamada a array_walk(). La ordenacin se produce sobre el valor de los elementos del array, permaneciendo la clave de cada uno inalterada.
arsort($peliculas); array_walk($peliculas,'unir',"pelcula realizada en ");

La salida obtenida sera: Doctor Zhivago, pelcula realizada en 1965. Charada, pelcula realizada en 1963. Lawrence de Arabia, pelcula realizada en 1962. El apartamento, pelcula realizada en 1960. Gig, pelcula realizada en 1958. El hombre tranquilo, pelcula realizada en 1952. Rebeca, pelcula realizada en 1940. El gran dictador, pelcula realizada en 1940. Historias de Filadelfia, pelcula realizada en 1940. ksort(array) y krsort(array): ordenan los elementos del array segn el ndice o clave correspondiente, bien en orden ascendente (ksort) o inverso (krsort). Se mantiene la relacin entre ndice y valor del elemento.

Ejemplo 8.31: Si en el ejemplo anterior se opta por el orden inverso de los ndices:

244

ARRAYS

krsort($peliculas);

el resultado sera: Rebeca, pelcula realizada en 1940. Lawrence de Arabia, pelcula realizada en 1962. Historias de Filadelfia, pelcula realizada en 1940. Gig, pelcula realizada en 1958. El hombre tranquilo, pelcula realizada en 1952. El gran dictador, pelcula realizada en 1940. El apartamento, pelcula realizada en 1960. Doctor Zhivago, pelcula realizada en 1965. Charada, pelcula realizada en 1963. natsort(array) y natcasesort(array): estas dos funciones ordenan cadenas alfanumricas de un array dado atendiendo al orden alfabtico natural. La diferencia entre ambos es que natcasesort() no distingue entre maysculas y minsculas. Se conserva la relacin entre ndice y elemento. array_reverse(array): devuelve un nuevo array con los elementos del array original, pero dispuestos en orden inverso. sort(array) y rsort(array): estos mtodos reordenan los elementos de una matriz en orden ascendente o inverso, respectivamente. Los ndices se reasignan segn la nueva disposicin.

Ejemplo 8.32: Como ejemplo final, se crea a continuacin una tabla a partir de un array de pelculas. Las pelculas sern clasificadas atendiendo a su director y a su ao de produccin. La pgina generada por el programa es la que se muestra en la Figura 8.4. Los datos a partir de los que se generar la tabla se encuentran almacenados en el siguiente array bidimensional:
$pelculas = array( "Ariane"=> array("Director"=>"B. Wilder","Ao"=>1957), "La costilla de Adn"=> array("Director"=>"G. Cukor","Ao"=>1949), "La gran ilusin"=> array("Director"=>"J. Renoir","Ao"=>1937),

245

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

"El hroe solitario"=> array("Director"=>"B. Wilder","Ao"=>1957), "Historias de Filadelfia"=> array("Director"=>"G. Cukor","Ao"=>1940), "Roma, ciudad abierta"=> array("Director"=>"R. Rossellini","Ao"=>1944), "Vive como quieras"=> array( "Director"=>"F. Capra","Ao"=>1938) );

El programa que genera la tabla es:


echo "<H2>Pelculas disponibles</H2><BR>"; // array de encabezados de filas: aos de produccin $filas = array(); $i = 0; foreach($peliculas as $titulo){ $filas[$i] = $titulo["Ao"]; $i++; } // eliminacin de aos repetidos $filas = array_unique($filas); // ordenacin en orden ascendente sort($filas); // array con nombres de directores $columnas = array(); $i = 0; foreach($peliculas as $titulo){ $columnas[$i] = $titulo["Director"]; $i++; } // eliminacin de repetidos $columnas = array_unique($columnas); // ordenacin alfabtica por apellidos function extraer($cadena){ return(strchr($cadena," ")); } $columnasAbrev = array_map("extraer",$columnas); natcasesort($columnasAbrev); $indices = array_keys($columnasAbrev); // encabezados ordenados de las columnas $columnasOrdenado = array(); for($i=0;$i<count($indices);$i++){ $columnasOrdenado[$i] = $columnas[$indices[$i]]; } // construccin de la tabla echo "<TABLE BORDER CELLPADDING=5>\n";

246

ARRAYS

echo "<TR>"; echo "<TD>&nbsp</TD>"; for($i=0;$i<count($columnasOrdenado);$i++){ echo "<TH>$columnasOrdenado[$i]</TH>"; } echo "</TR>"; // lista con los ttulos que hay que colocar en la tabla $datos = array_keys($peliculas); // en cada ao se recorren los nombres ordenados de los // directores y se disponen en la fila los ttulos de ese // ao que correspondan a uno o a varios de los directores for($i=0;$i<count($filas);$i++){ echo "<TR>"; echo "<TH>$filas[$i]</TH>"; for($j=0;$j<count($columnasOrdenado);$j++){ // se obtiene la lista de pelculas correspondientes // a la pareja director - ao $ps=array_keys($peliculas, array("Director"=>$columnasOrdenado[$j], "Ao"=>$filas[$i])); // si hay alguna pelcula se crea la celda con // los ttulos obtenidos if(count($ps)!=0){ echo "<TD ALIGN=CENTER>"; for($k=0;$k<count($ps);$k++){ echo $ps[$k]."<br>"; } echo "</TD>"; } // en caso contrario la celda es vaca else echo "<TD ALIGN=CENTER>"."----------"."</TD>"; } echo "</TR>"; } echo "</TABLE>";

247

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Figura 8.4 Pgina con la tabla de pelculas disponibles

248

FUNCIONES PREDEFINIDAS

9.1. INTRODUCCIN
PHP cuenta con un gran nmero de funciones predefinidas, ms de 700, que pueden ser usadas en cualquier programa sin necesidad de invocar a ninguna librera. En el captulo previo ya han sido presentadas muchas de ellas, en concreto, las relacionadas con el tratamiento y manipulacin de arrays. En este captulo se presentarn algunas funciones predefinidas adicionales, clasificndolas en diversos grupos atendiendo al cometido al que estn destinadas. Se empezar por presentar funciones de manipulacin de cadenas de caracteres, para finalizar con el repaso a las funciones de fechas y horas, y una lista de funciones matemticas. En captulos posteriores del libro se presentarn nuevas funciones, como son las relacionadas con ficheros y directorios, funciones de conectividad a base de datos,...

249

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

9.2. FUNCIONES DE MANIPULACIN DE CADENAS DE CARACTERES


9.2.1. RECONOCIMIENTO DE CARACTERES
Las funciones de tipo booleano que a continuacin se detallan permiten detectar los diversos tipos de caracteres que constituyen una cadena determinada. En concreto, pueden resultar muy tiles para realizar operaciones de validacin de los datos que los usuarios introducen en los formularios. A esta categora pertenecen las funciones siguientes: ctype_alnum(cadena): devuelve TRUE si cada carcter de la cadena es alfanumrico (letra o un nmero), FALSE en caso contrario. ctype_alpha(cadena): devuelve TRUE si cada carcter de la cadena es una letra, FALSE en caso contrario. ctype_digit(cadena): devuelve TRUE si cada carcter de la cadena es un dgito decimal, FALSE en caso contrario. ctype_lower(cadena): devuelve TRUE si cada carcter de la cadena es una letra minscula, FALSE en caso contrario. ctype_upper(cadena): devuelve TRUE si cada carcter de la cadena es una letra mayscula, FALSE en caso contrario. ctype_print(cadena): devuelve TRUE si cada carcter de la cadena es un carcter imprimible (letras, dgitos, signos, espacios en blanco,) ctype_punct(cadena): devuelve TRUE si cada carcter de la cadena es imprimible pero no es ni una letra, ni un dgito ni un espacio en blanco. ctype_space(cadena): devuelve TRUE si cada carcter de la cadena es un espacio en blanco, considerando como espacios en blanco tambin las tabulaciones, retornos de carro,...

9.2.2. CONVERSIONES ENTRE CADENAS Y ARRAYS


En muchas ocasiones se necesita obtener cadenas de caracteres a partir de los elementos de un array, o al revs, "trocear" una cadena de caracteres para formar un array con los elementos resultantes. Para este tipo de labores PHP dispone de las siguientes funciones: 250

FUNCIONES PREDEFINIDAS

explode(separador,cadena,lmite): funcin que devuelve un array resultado de fragmentar una cadena dada en segmentos delimitados por una cadena de separacin, (un espacio en blanco, por ejemplo). Si no se indica lmite, cada elemento del array es uno de esos segmentos. En caso contrario, este valor indica el nmero exacto de elementos que debe tener el array de salida. El ltimo de ellos corresponder al final de la cadena que no haya podido fragmentarse. implode( separador , array ) y join( separador , array ) : funciones que disponen los elementos de un array dado en una cadena de caracteres, pero separados por la cadena dada como primer argumento. Ambas funciones actan de igual forma.

Ejemplo 9.1: La sentencia


explode(" ","Hola, qu tal?");

genera un array de 3 cadenas de caracteres:


([0] => Hola, [1] => qu [2] => tal?)

Si al hacer la llamada a la funcin explode() se aade un valor lmite


explode(" ","Hola, qu tal?", 2);

el array que se obtendra es:


([0] => Hola, [1] => qu tal? )

Ejemplo 9.2: En el siguiente programa, dado un array de arrays, se aplica la funcin implode() a cada uno de sus elementos para obtener una serie de cadenas de caracteres.
$peliculasMusicales=array( array("Un americano en Pars","V. Minnelli",1951), array("Hello,Dolly!","G. Kelly",1968), array("Qu noche la de aquel da!","R. Lester",1964)); foreach($peliculasMusicales as $pelicula){ $p = implode("--->",$pelicula); print "$p<BR>"; }

251

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

El resultado generado es:


Un americano en Pars--->V. Minnelli--->1951 Hello, Dolly!--->G. Kelly--->1968 Qu noche la de aquel da!--->R. Lester--->1964

str_word_count(cadena,formato): contabiliza el nmero de palabras que forman una cadena dada. Si no se especifica ningn formato, se obtiene un nmero entero. Si el argumento formato toma el valor 1, entonces la funcin devuelve un array con todas las palabras de la cadena; si ese argumento es 2, devuelve el array con las palabras, pero asociando a cada una como ndice del array la posicin que ocupa dentro de la cadena.

Ejemplo 9.3: Dada la siguiente cadena:


$cadena = "Bienvenido a nuestro cine.";

la sentencia
str_word_count($cadena);

devuelve el nmero de palabras que forman la frase indicada, es decir, 4. Si la llamada se realiza de la siguiente forma:
str_word_count($cadena,1);

la funcin devolvera es siguiente array:


([0] => Bienvenido, [1] => a, [2] => nuestro, [3] => cine)

En cambio, con la llamada


str_word_count($cadena,2);

el array generado sera:


([0] => Bienvenido, [11] => a, [13] => nuestro, [21] => cine)

252

FUNCIONES PREDEFINIDAS

9.2.3. PROLONGACIN DE UNA CADENA


str_pad(cadena,longitud,cadena_aadida,clase_adicin) : devuelve una nueva cadena formada al prolongar la cadena dada al inicio, al final o en ambos lados hasta completar la longitud indicada. Si no se indica una nueva cadena, la prolongacin se realiza con espacios en blanco. El tipo de prolongacin viene determinado por el cuarto argumento de la funcin, cuyo valor pueder ser: STR_PAD_RIGHT: prolongacin al final de la cadena. Valor por defecto. STR_PAD_LEFT: prolongacin al inicio. STR_PAD_BOTH: prolongacin en ambas direcciones. Si la longitud indicada es negativa o menor que la de la cadena inicial, no se efecta la prolongacin. Ejemplo 9.4: Considrese una cadena de 27 caracteres de longitud, si se quiere prolongarla a ambos lados con 16 caracteres, repartidos a partes iguales a ambos lados, el cdigo necesario sera el siguiente:
echo str_pad("Bienvenido a nuestro cine!", 41,"********",STR_PAD_BOTH);

generndose de este modo la cadena


********Bienvenido a nuestro cine!********

Si como longitud se indica 30, 3 ms que la inicial, aunque la nueva cadena aporte 8 caracteres, se truncar en 3, repartidos a izquierda y derecha. As, el cdigo:
echo str_pad("Bienvenido a nuestro cine", 30,"********",STR_PAD_BOTH);

genera la cadena:
*Bienvenido a nuestro cine**

str_repeat(cadena,nmero): devuelve una cadena formado al repetir la cadena dada tantas veces como se indica en el segundo argumento.

253

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Ejemplo 9.5: La sentencia:


echo str_repeat("oOoxXx",5);

genera el siguiente mensaje:


oOoxXxoOoxXxoOoxXxoOoxXxoOoxXx

9.2.4. MODIFICACIN DE UNA CADENA


str_replace(buscar,reemplazar,cadena): funcin que devuelve una nueva cadena como resultado de reemplazar en la cadena dada todas las apariciones del argumento buscar por el argumento reemplazar.

Ejemplo 9.6: Dadas las variables


$cadena = "Bienvenido a nuestro cine."; $nombreCliente = "Pablo Gonzlez";

la sentencia
echo str_replace(".", ", $nombreCliente.", $cadena);

escribira el siguiente mensaje:


Bienvenido a nuestro cine, Pablo Gonzlez.

strrev(cadena): devuelve una nueva cadena como resultado de invertir la

cadena original.
strtolower(cadena) y strtoupper(cadena): funciones que, dada una

cadena, generan otra transformando todos los caracteres a minsculas o a maysculas, respectivamente.
substr_replace(cadena,reemplazar,posicin,longitud):

dada una cadena inicial se obtiene una nueva cadena como resultado de reemplazar la porcin delimitada por los argumentos posicin y longitud, por el

254

FUNCIONES PREDEFINIDAS

argumento reemplazar. consideraciones:

Se deben tener en cuenta las siguientes

Si el valor de posicin es positivo, la sustitucin comienza en la posicin correspondiente de la cadena; mientras que si es negativo, la sustitucin comienza en la posicin correspondiente de la cadena pero contando desde el final de la misma. Si no se especifica el argumento longitud, se entiende que la sustitucin se realiza hasta el final de la cadena. Por el contrario, si su valor es positivo indica la porcin de cadena a sustituir, y si es negativo indica el nmero de caracteres, contados desde el final de la cadena, que deben quedar intactos. En todo caso se considera que la posicin del primer carcter es 0.

Ejemplo 9.7: Dadas las cadenas


$cadena = "Bienvenido a nuestro cine. Ha efectuado usted la decisin correcta."; $nombreCliente = ", Pablo Gonzlez. ";

las llamadas siguientes


substr_replace($cadena,$nombreCliente,25,1); substr_replace($cadena,$nombreCliente,25,-41); substr_replace($cadena,$nombreCliente,-42,1); substr_replace($cadena,$nombreCliente,-42,-41);

generan todas el mismo resultado, la cadena Bienvenido a nuestro cine, Pablo Gonzlez. Ha efectuado usted la decisin correcta. ucfirst(cadena): convierte a maysculas el primer carcter de la cadena dada. ucwords(cadena): convierte a maysculas el primer carcter de cada palabra de la cadena dada.

255

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

9.2.5. COMPARACIN DE CADENAS


strcasecmp(cadena1,cadena2) y strcmp(cadena1,cadena2): comparan dos cadenas dadas segn el orden establecido por los cdigos ASCII de sus respectivos caracteres (orden computacional). Ambas funciones devuelven un valor menor que 0 si cadena1 es menor que cadena2; un valor mayor que 0 si cadena1 es mayor que cadena2 y 0 si ambas son iguales. La nica diferencia entre las dos funciones es que la segunda distingue maysculas y minsculas. strnatcasecmp( cad1 , cad2 ) y strnatcmp( cad1 , cad2 ) : comparan cadenas alfanumricas teniendo en cuenta el orden alfabtico natural. Se obtiene un valor menor que 0 si la primera cadena es menor que la segunda; un valor mayor que 0 si es mayor y 0 si ambas son iguales. La nica diferencia entre ambas funciones es que la primera no distingue entre maysculas y minsculas.

Ejemplo 9.8: La comparacin de cadenas alfabticas como las siguientes da el mismo resultado independientemente de la funcin de comparacin empleada:
strcasecmp("Pedro Colsa", "pedro colsa"); // devuelve 0 strcmp("Pedro Colsa", "pedro colsa"); // devuelve -1 strnatcasecmp("Pedro Colsa","pedro colsa"); // devuelve 0 strnatcmp("Pedro Colsa","pedro colsa"); // devuelve -1

En el caso de cadenas alfanumricas, el resultado vara:


//orden computacional: a11 < a2 strcasecmp("a11","a2"); // devuelve -1 strcmp("a11","a2"); // devuelve -1 //orden lgico: a11 > a2 strnatcasecmp("a11","a2"); // devuelve 1 strnatcmp("a11","a2"); // devuelve 1

9.2.6. BSQUEDA DE DATOS


strchr(cadena,carcter) y strrchr(cadena,carcter): encuentran la primera y ltima aparicin, respectivamente, de un carcter en

256

FUNCIONES PREDEFINIDAS

una cadena dada. Devuelven la cadena inicial desde la posicin localizada hasta el final. stristr(cadena,fragmento) y strstr(cadena,fragmento): devuelven la cadena dada desde la primera aparicin de un carcter o fragmento determinado. Si el fragmento no se encuentra, se obtiene el valor booleano FALSE. La diferencia entre ambos mtodos es que el primero no distingue entre maysculas y minsculas. strpos(cadena,fragmento,inicio_bsqueda): se obtiene la posicin correspondiente a la primera aparicin de un fragmento determinado dentro de una cadena dada. Como tercer argumento opcionalmente se puede indicar la posicin a partir de la cual iniciar la bsqueda. strrpos(cadena,carcter): devuelve la posicin correspondiente a la ltima aparicin de un carcter dentro de una cadena dada. substr(cadena,posicin_inicial,longitud): se extrae de una cadena dada, una subcadena delimitada por los dos ltimos argumentos. Si el valor de posicin_inicial es positivo, el fragmento comienza en la posicin correspondiente de la cadena; mientras que si es negativo, el fragmento comienza en la posicin correspondiente de la cadena pero contando desde el final de la misma. Si no se indica el argumento longitud, se extrae el fragmento hasta el final de la cadena. Por el contrario, si su valor es positivo, indica la dimensin del fragmento extrado, y si es negativo, la extraccin finaliza a tantos caracteres desde el final de la cadena como indica dicho valor. substr_count(cadena,fragmento): devuelve apariciones de un fragmento dado dentro de una cadena. el nmero de

Ejemplo 9.9: Dada la cadena:


$cadena = "Bienvenido a nuestros cines!"

la Tabla 9.1 muestra algunos ejemplos de usos de las funciones anteriores. De la misma manera, la Tabla 9.2 muestra nuevos ejemplos de usa de la funcin substr(), pero tomando como cadena de partida:

257

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

$cadena = "Bienvenido a nuestro cine. Ha efectuado usted la decisin correcta."; Llamada a la funcin strchr($cadena,'e'); strrchr($cadena,'e'); stristr($cadena,"nuestros"); stristr($cadena,'e'); strpos($cadena,"e"); strpos($cadena,"e",14); strpos($cadena,"nuestros"); Valor devuelto envenido a nuestros cines! es! nuestros cines! envenido a nuestros cines! 3 16 14

Tabla 9.1 Ejemplos de usos de funciones de bsqueda en cadenas Llamada a la funcin substr($cadena,27); substr($cadena,-27); substr($cadena,27,5); substr($cadena,27,-5); substr($cadena,-45,10); substr($cadena,-45,-5); Valor devuelto Ha efectuado usted la decisin correcta. usted la decisin correcta. Ha ef Ha efectuado usted la decisin corr ine. Ha ef ine. Ha efectuado usted la decisin corr

Tabla 9.2 Ejemplos de uso de la funcin substr()

9.2.7. SUBDIVISIN DE CADENAS


wordwrap(cadena,ancho,separacin): particiona el texto de la cadena dada en lneas del ancho indicado. Por defecto, si no se indica otra cosa, el texto se fragmenta al llegar a una anchura de 75 con un carcter de cambio de lnea: '\n'. strtok(cadena,delimitador): se fragmenta la cadena dada segn la delimitacin indicada. La primera llamada a este mtodo devuelve el primer fragmento. Las siguientes llamadas requieren como nico argumento el delimitador.

Ejemplo 9.10: El siguiente cdigo fragmenta una cadena dada considerando como delimitador la coma:
$p = "Solo ante el peligro, Fred Zinnemann, Gary Cooper"; // escritura del ttulo (hasta la primera coma)

258

FUNCIONES PREDEFINIDAS

echo strtok($p,','); echo "<BR>"; // $i cuenta el nmero de comas ledas $i = 1; // nmero total de comas dentro de la cadena inicial $frecuencia=substr_count($p,','); // bucle que fragmenta el resto de la cadena while($i<=$frecuencia){ echo strtok(','); echo "<BR>"; $i++; }

La salida generada por este programa sera: Solo ante el peligro Fred Zinnemann Gary Cooper

9.2.8. LONGITUD DE UNA CADENA


strlen(cadena): devuelve la longitud de una cadena, es decir, el nmero de caracteres que contiene.

9.3. FUNCIONES DE FECHA Y HORA


Otro grupo importante de funciones predefinidas en PHP est constituido por todas las que permiten realizar manipulaciones con fechas y horas. En PHP cualquier instante de tiempo viene determinado por un nmero entero que representa el nmero de segundos transcurridos desde las 00:00 del da 1 de enero de 1970; as por ejemplo, la funcin que calcula el instante de tiempo actual, funcin time(), devuelve en realidad un nmero entero. Por supuesto, es posible trabajar con fechas y horas en formatos ms sencillos para el usuario, para ello PHP dispone de la funcin mktime() que permite generar instantes de tiempo y la funcin date() para convertir el instante de tiempo en una cadena de caracteres siguiendo un formato preestablecido. A continuacin se recogen las funciones ms importantes para trabajar con instantes de tiempo y se ilustra su funcionamiento con algunos ejemplos.

259

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

time(): devuelve la hora actual expresada como el nmero de segundos transcurridos desde las 00 horas del 1 de enero de 1970. mktime(hora,minuto,segundo,mes,da,ao): devuelve un instante de tiempo identificado por el nmero de segundos transcurridos desde las 00:00 del 1 de enero de 1970 hasta el momento determinado por los argumentos pasados. Obsrvese el orden en el que deben ser pasados estos argumentos. Los argumentos son opcionales, de manera que cualquier argumento omitido tomar automticamente el valor correspondiente al instante actual. checkdate(mes,da,ao): devuelve el valor entero 1 si la fecha dada como argumento es vlida, entendiendo por fecha valida aquella que sigue los siguientes criterios: o El ao debe estar comprendido entre 0 y 32767. o El mes entre 1 y 12. o El da debe estar en el rango admisible del mes considerado. Se tienen en cuenta los aos bisiestos. date(formato,instante): devuelve una cadena de caracteres con la fecha y/o hora de acuerdo al formato indicado en el primer argumento. El segundo argmento ser un nmero entero que identificar el instante asociado a dicha fecha y hora. Este segundo argumento es opcional, en caso de omitirse se asumir automticamente la fecha y hora actual en el servidor.

La cadena de formato que recibe la funcin date() como primer argumento incluye determinados caracteres con un significado especial. La siguiente lista incluye alguno de estos caracteres, explicando el significado de su presencia en la cadena de formato: Formato para el ao: Y con cuatro dgitos. y con dos dgitos. Da del ao: z de 0 a 365. Formato para el mes: F el nombre completo en ingls. M nombre abreviado en ingls. m del 01 al 12. n del 1 al 12. t nmero de das del mes.

260

FUNCIONES PREDEFINIDAS

Formato para el da del mes: d del 01 al 31. j del 1 al 31. Formato para el da de la semana: l nombre completo en ingls. D nombre abreviado en ingls. w da de la semana del 0 (domingo) al 6 (sbado). Formato para la hora: g la hora de 1 hasta 12. G la hora de 0 a 23. h la hora de 01 a 12. H la hora de 00 a 23. i los minutos de 00 a 59. s los segundos de 00 a 59. a am o pm. A AM o PM. Aos bisiestos: L 1 si el ao es bisiesto, 0 en otro caso. Ejemplo 9.11: El siguiente programa genera una pgina de bienvenida en la que se muestra la fecha local del servidor con el formato escogido en el correspondiente argumento de la funcin date():
print("Bienvenido, la hora local en nuestro servidor es: "); print(date("h:i A")); print(" y estamos en el da "); print(date("z")); print(" del ao "); print(date("Y."));

En la pgina aparecer un mensaje como el siguiente: Bienvenido, la hora local en nuestro servidor es: 06:03 PM y estamos en el da 296 del ao 2004. Ejemplo 9.12: Si se quiere mostrar el mes en curso, basta la siguiente lnea de cdigo:
print(date("M"));

261

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Sin embargo, si se quiere mostrar un mes del ao, distinto al actual, se debe aadir como segundo argumento de la funcin date() una llamada a la funcin mktime() con los argumentos adecuados: en este caso, basta indicar el nmero de mes y un da del mes, (el 1, por ejemplo):
print(date("M",mktime(0,0,0,1,1,0)));

Ejemplo 9.13: Si se desea averiguar el da de la semana correspondiente al 2 de marzo de 1972 se podra escribir la siguiente lnea de cdigo:
print(date("w",mktime(0,0,0,3,2,1972)));

Se obtiene el valor 4, correspondiente al jueves. Ejemplo 9.14: Mediante el siguiente programa se generar el calendario del mes en curso en el momento de acceder a una pgina dada, incluyendo adems dos enlaces: uno al calendario del mes anterior y otro al del mes siguiente. El aspecto de este calendario puede verse en la Figura 9.1.

Figura 9.1 Calendario del mes actual

262

FUNCIONES PREDEFINIDAS

El programa se estructura en cuatro ficheros: Datos.php: fichero de datos generales, que almacena dos arrays con los nombres de los meses y de los das y variables relacionadas con la fecha en curso. Tambin implementa la funcin crearCalendario(), que permite construir el calendario de un mes y ao dados. Toda esta informacin ser aadida en los restantes ficheros con la sentencia include. Calendario.php: construye el calendario del mes en curso en el momento de acceder a la pgina y se crean dos enlaces que remiten al calendario del mes anterior y del mes siguiente, respectivamente. MesAnterior.php y MesSiguiente.php: generan el calendario correspondiente al mes anterior y al mes siguiente al mes en curso.

A continuacin se incluye el cdigo completo de cada fichero y se comentan sus sentencias ms significativas: Fichero Datos.php
<?php $meses = array("Enero", "Febrero", "Marzo", "Abril", "Mayo","Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"); $semana = array("Lu", "Ma", "Mi", "Ju", "Vi", "Sa", "Do"); $aoActual = date("Y"); $mesActual = date("n"); $mesActualTr = $meses[$mesActual-1]; $diaActual = date("j"); function crearCalendario($mes,$ao,$fechaActual){ $nummes = array_search($mes,$GLOBALS["meses"])+1 $diasemana=date("w",mktime(0,0,0,$nummes,1,$ao)); if($diasemana==0) $diasemana=7; $diasMes= date("t",mktime(0,0,0,$nummes,1,$ao)); // generacin del calendario echo "<B>$mes $ao</B>"; echo "<TABLE BORDER ALING=CENTER>"; echo "<TR>"; // cabeceras de la tabla for($i=0;$i<=6;$i++){

263

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

echo "<TH>".$GLOBALS["semana"][$i]."</TH>"; } echo "</TR>"; // das en blanco hasta el inicio del mes echo "<TR>"; $aux = 1; while($aux<$diasemana){ echo "<TD>&nbsp;</TD>"; $aux++; } // das del mes for($i=1;$i<=$diasMes;$i++) { if(($diasemana==6) or ($diasemana==7)){ if($fechaActual){ if($i==$GLOBALS["diaActual"]) echo "<TH BGCOLOR=#00FFFF >$i</TH>"; else echo "<TD BGCOLOR=#00FFFF >$i</TD>"; } else echo "<TD BGCOLOR=#00FFFF >$i</TD>"; } else{ if($fechaActual){ if($i==$GLOBALS["diaActual"]) echo "<TH>$i</TH>; else echo "<TD>$i</TD>"; } else echo "<TD>$i</TD>"; } $diasemana++; if($diasemana==8) { echo "</TR>"; echo "<TR>"; $diasemana=1; } } echo "</TR></TABLE>"; } ?>

Como puede apreciarse, este fichero comienza con las definicin de dos arrays, que almacenan los nombres de los meses y de los das de la semana, y cuatro

264

FUNCIONES PREDEFINIDAS

variables que almacenarn el ao, el mes y el da del mes correspondientes al momento de visitar la pgina. Para la obtencin de estos ltimos valores se utiliza la funcin date(). Posteriormente, se define la funcin crearCalendario() que toma como argumentos: un mes expresado como cadena de caracteres, un ao en cuatro dgitos y una variable booleana que toma el valor TRUE si el calendario a construir corresponde al del mes en curso. Dentro de esta funcin, para acceder a los arrays y variables globales definidas fuera de la misma se utiliza el array asociativo $GLOBALS[]; de esta manera, lo primero que se hace es obtener el nmero de mes asociado al mes cuyo nombre se ha recibido como argumento. Posteriormente se calcula el da de la semana correspondiente al primer da de ese mes, y el nmero total de das del mes. Para estas dos operaciones se utiliza de nuevo la funcin date(), pero en este caso indicando como ltimo argumento el instante de tiempo correspondiente a las 0:00 del primer da del mes; este instante de tiempo se genera con la funcin mktime(). En PHP, como ocurre en la cultura anglosajona, el primer da de la semana es el domingo, y dicho da queda identificado con el nmero 0; es por ello que, para considerar el domingo como ltimo da de la semana, se asigna el valor 7 cuando sea 0. Una vez establecidos todos los datos necesarios, la funcin crearCalendario() procede a la creacin del calendario mediante una tabla HTML generada dinmicamente. Las celdas correspondientes a los fines de semana tendrn un sombreado diferentes, y adems, en el caso de que el calendario que se crea corresponda al mes en curso, el da actual se mostrar en negrita. Fichero Calendario.php
<?php include("Datos.php"); crearCalendario($mesActualTr,$aoActual,true); $mesAnt = "MesAnterior.php"; $mesSig = "MesSiguiente.php"; echo "<BR><A HREF=$mesAnt>Mes anterior</A> <BR> <A HREF=$mesSig>Mes prximo</A>"; ?>

Este fichero es el principal, disea la pgina donde se muestra el calendario del mes en curso junto con dos enlaces a los calendarios anterior y prximo, respectivamente. Como puede observarse, lo primero que se realiza es la inclusin

265

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

del fichero Datos.php mediante la funcin include(), para posteriormente efectuar la llamada a la funcin crearCalendario(), y crear los dos enlaces. Fichero MesAnterior.php
<?php include("Datos.php"); if($mesActual==1){ $aux = 11; $ao = $aoActual-1; } else{ $aux = $mesActual-2; $ao = $aoActual; } crearCalendario($meses[$aux], $ao, false); ?>

Fichero MesSiguiente.php
<?php include("Datos.php"); if($mesActual==12){ $aux = 0; $ao = $aoActual+1; } else{ $aux = $mesActual; $ao = $aoActual; } crearCalendario($meses[$aux], $ao, false); ?>

Estos dos ltimos ficheros cargan de nuevo todos los datos y lo nico que realizan es una modificacin de las variables que identifican al mes en curso. Una vez modificadas esas variables se procede a efectuar la llamada a la funcin de creacin del calendario.

266

FUNCIONES PREDEFINIDAS

9.4. FUNCIONES MATEMTICAS


El lenguaje PHP cuenta con una serie de constantes numricas ya definidas y con un conjunto de funciones que manipulan valores numricos, tanto de tipo entero como en coma flotante. La Tabla 9.4 muestra las constantes de carcter matemtico predefinidas en PHP ms comnmente conocidas.
Respecto a las funciones matemticas, la Tabla 9.3 muestra algunas de las ms utilizadas. Funcin abs(n) round(n) ceil(n) Descripcin Obtiene el valor absoluto de un entero o en coma flotante. Redondea a entero un nmero dado. Obtiene el valor entero superior ms prximo a n.

floor(n)
cos(n) sin(n) tan(n) exp(a) log(n) min(n1,n2,...) min(array)

Obtiene el valor entero inferior ms prximo a n.


Calcula el coseno de un ngulo. Calcula el seno de un ngulo Calcula la tangente de un ngulo. Calcula el valor ea. Calcula el logaritmo neperiano de n.

Obtiene el menor valor de un nmero determinado de argumentos numricos o de los elementos de un array. Si alguno de estos nmeros es decimal, el resultado tambin tendr este formato. Obtiene el mayor valor de un nmero determinado de argumentos numricos o de los elementos de un array. Si alguno de estos nmeros es decimal, el resultado tambin tendr este formato.
Se calcula el valor de la potencia ab.

max(n1,n2,) max(array)

pow(a,b) rand(mn,mx) mt_rand(mn,mx)

Si no toman argumentos, estas funciones devuelven un valor aleatorio entre 0 y RAND_MAX. En caso contrario, se obtiene un nmero aleatorio entre mn y mx. El valor RAND_MAX es una cota superior entera definida por el sistema, que se puede obtener con una llamada a la funcin mt_getrandmax().
Raz cuadrada de a. Tabla 9.3 Funciones matemticas

sqrt(a)

267

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Constantes numricas M_PI M_E M_PI_2 M_SQRT2 M_SQRT3

Descripcin

nmero Pi (3.14159).
nmero e (2.718281). pi/2. raz cuadrada de 2. raz cuadrada de 3.

Tabla 9.4 Constantes predefinidas

268

PROGRAMACIN ORIENTADA A OBJETOS


10.1. INTRODUCCIN
Los dos elementos bsicos de todo lenguaje de programacin estructurada son las variables y las funciones. Las primeras se utilizan para almacenar datos, y las segundas realizan acciones sobre esos datos. En un esquema de programacin estructurada tradicional ambos elementos bsicos se encuentran perfectamente diferenciados, definiendo las variables por un lado y las funciones por otro. Sin embargo, a la hora de programar se puede pensar en objetos como entidades que maneja el programa y que funcionan de una determinada manera. Estos objetos poseen determinadas caractersticas (variables) y con ellos se pueden realizar diversas tareas (funciones). En un esquema de programacin orientada a objetos, las variables y las funciones no son considerados como elementos independientes sino como componentes de una misma entidad: el objeto; tal como ocurre con los objetos de la vida real.

269

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

En la programacin orientada a objetos, las funciones asociadas a cada objeto reciben el nombre de mtodos. Los mtodos permitirn no solo realizar acciones sobre los objetos sino tambin extraer informacin sobre sus variables, enviar mensajes a otros objetos,... Los objetos definidos son elementos dinmicos, en todo momento tienen un estado (determinado por los valores de sus variables) y un comportamiento (determinado por sus mtodos). Ejemplo 10.1: Pinsese en la gestin de un cine; en un cine se maneja informacin sobre pelculas, proyecciones, clientes,... En definitiva, se podra pensar en diferentes objetos con diferentes caractersticas (variables) y diferentes acciones (mtodos) que pueden realizar cada uno: Cada objeto pelcula tendr asociadas cuatro variables que indicarn el ttulo, el director, la lista de actores y el ao de produccin. Adems tendr un mtodo que permitir generar la ficha artstica de la pelcula (vase Figura 10.1). Cada objeto proyeccin tendr asociadas tres variables que indicarn el da y la hora de la proyeccin, y la pelcula a proyectar. Un mtodo del objeto permitir asignar una pelcula a la proyeccin (vase Figura 10.2). Cada objeto cliente tendr asociadas tres variables que indicarn el nombre y la edad del cliente y la lista de proyecciones para las que ha adquirido una entrada. Adems de sus variables, un cliente tambin dispondr de un mtodo que le permitir adquirir una entrada para una proyeccin (vase Figura 10.3).

Adems de los objetos anteriores, el cine en s puede verse tambin como un objeto: El objeto cine tendr asociadas cinco variables que indicarn el da de la semana que se considera da del espectador, la tarifa normal y la tarifa reducida, y las listas de proyecciones disponibles y de clientes del cine. El objeto cine tambin podr realizar una serie de acciones como buscar los datos de un cliente, calcular el importe de una localidad para un cliente y proyeccin concretos, y aadir nuevas proyecciones y clientes (vase Figura 10.4).

270

PROGRAMACIN ORIENTADA A OBJETOS

PELCULA

VARIABLES: Ttulo Director Actores Ao

MTODO: Generar ficha

Figura 10.1 Estructura de un objeto Pelcula

PROYECCIN

VARIABLES: Da Hora Pelcula

MTODO: Asignar pelcula

Figura 10.2 Estructura de un objeto Proyeccin

CLIENTE

VARIABLES: Nombre Edad Lista proyecciones

MTODO: Adquirir entrada

Figura 10.3 Estructura de un objeto Cliente

271

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

CINE

VARIABLES: Da del espectador Tarifa normal Tarifa reducida Proyecciones Clientes

MTODOS: Buscar cliente Calcular importe Crear proyeccin Crear cliente

Figura 10.4 Estructura del objeto Cine

Como puede comprobarse en este esquema, un objeto puede convertirse a su vez en variable de otro objeto, tal es el caso, por ejemplo, del objeto pelcula asociado al objeto proyeccin. Por ltimo, los objetos podran disponer de mtodos especficos para acceder a sus variables, tanto para consultar como para cambiar sus valores. Adems, los objetos suelen disponer de mtodos, denominados constructores, que son llamados cuando se crea el objeto. En las prximas secciones de este captulo, este esquema organizativo de objetos se traducir al lenguaje PHP, presentando conceptos bsicos de programacin orientada a objetos como son los de clases, objetos y variables de clase y herencia.

10.2. DEFINICIN DE UNA CLASE


Al igual que ocurre en la vida real, los objetos se agrupan en familias o clases de objetos que comparten caractersticas comunes. As por ejemplo, dos clientes diferentes tendrn las mismas variables, aunque lgicamente con diferentes valores para cada uno de ellos, y podrn realizar las mismas acciones; por tanto, seran dos objetos de una misma clase. La programacin orientada a objetos se basa en definir clases, crear objetos de esas clases y realizar acciones con ellos. La clase establecer las caractersticas (variables y mtodos) que compartirn todos los objetos de la misma; en este sentido la clase puede entenderse como un prototipo para los objetos.

272

PROGRAMACIN ORIENTADA A OBJETOS

La definicin de una clase en PHP comienza con la palabra clave class y un nombre elegido por el programador; su cdigo completo se delimita entre llaves. Dentro de ese cuerpo de la clase, las variables se declaran con la palabra var y los mtodos se definen como cualquier otra funcin en PHP.
class NombreClase { var variables de la clase mtodos }

Ejemplo 10.2: A continuacin se presenta el esquema de las clases de objetos que fueron presentados en el Ejemplo 10.1. En esta primera aproximacin se incluye nicamente la definicin de las variables de cada clase y la declaracin de los mtodos; posteriormente se aadir la implementacin completa de estos ltimos.
class Pelicula { var $titulo, $director, $actores, $ao; // implementacin de mtodos function generar_ficha() { } } class Proyeccion { var $dia_hora; var $pelicula; // implementacin de mtodos function asignar_pelicula($p) { } } class Cliente { var $nombre; var $edad; var $lista_proyecciones;

273

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

// implementacin de mtodos function adquirir_entrada($proy) { } } class Cine { var $dia_espectador, $tarifa_normal, $tarifa_reducida, $lista_proyecciones, $lista_clientes; // implementacin de mtodos function calcular_importe($c,$proy) { } function crear_proyeccion($t,$p) { } function crear_cliente($n,$e) { } function buscar_cliente($c) { } }

Obsrvese la manera de indicar la declaracin de variables dentro de una clase. Tras la palabra clave var, se puede optar por listar todas las variables seguidas de una coma, con un punto y coma al final de la lista; o bien, por anteponer la palabra clave antes de cada nueva variable, finalizando siempre en punto y coma.
En el caso de la clase Proyeccion, se ha optado por fusionar las variables dia y hora en una sola variable de nombre dia_hora. Esta variable almacenar un instante de tiempo generado con la funcin mktime(). A partir de este instante de tiempo se puede obtener, mediante la funcin date(), cualquier informacin necesaria, como la hora de la proyeccin, la fecha, el da de la semana,...

NOTA

274

PROGRAMACIN ORIENTADA A OBJETOS

10.2.1. CONSTRUCTORES
Las clases definen el prototipo de los objetos, definiendo sus mtodos y declarando sus variables; pero, cmo se inicializan estas variables? Entran aqu en juego dos nuevos elementos: la variable $this y el constructor de la clase. Un constructor es un tipo especial de mtodo que se caracteriza por tener el mismo nombre que la clase y que se utilizar posteriormente para crear los objetos. Este mtodo se ejecuta automticamente, por lo que es aqu donde se pueden inicializar las propiedades del objeto que interesa establecer en el momento de su creacin. La variable $this, en un contexto de programacin orientada a objetos, siempre hace referencia al objeto actual. A travs de ella se puede acceder a las variables particulares del objeto, utilizando la sintaxis:
$this -> nombre_variable

Ejemplo 10.3: La creacin de un objeto de la clase Pelicula exige el aportar la informacin necesaria para ese objeto, en este caso concreto, esa informacin se traduce en los valores para sus 4 variables. El constructor de la clase puede recibir como argumentos esos cuatro valores y asignarlos a las respectivas variables del objeto.
function Pelicula($t,$d,$as,$a){ $this->titulo = $t; $this->director = $d; $this->actores = $as; $this->ao = $a; }

Obsrvese cmo la sintaxis, para acceder a las variables del objeto, exige indicar el nombre de la variable a continuacin de -> pero sin el signo $. Esta misma sintaxis puede ser utilizada dentro de cualquier otro mtodo para acceder a las variables del objeto. Por ejemplo, a continuacin se incluye la definicin completa de la clase Pelicula, incluyendo el mtodo que genera su ficha artstica:
class Pelicula { var $titulo, $director, $actores, $ao;

275

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

// constructor function Pelicula($t,$d,$as,$a){ $this->titulo = $t; $this->director = $d; $this->actores = $as; $this->ao = $a; } // implementacin de mtodos function generar_ficha() { print "<H3> $this->titulo ($this->ao)</H3>"; print "Dirigida por $this->director y protagonizada por:<BR>"; foreach($this->actores as $ac) print "$ac <BR>"; } }

De manera similar, se podran definir constructores para las otras 3 clases analizadas. Se incluye a continuacin el cdigo completo de la clase Cliente, cuya estructura se muestra en la Figura 10.3:
class Cliente { var $nombre; var $edad; var $lista_proyecciones; // constructor function Cliente($n,$e){ $this->nombre = $n; $this->edad = $e; $this->lista_proyecciones = array(); }

// implementacin de mtodos function adquirir_entrada($proy) { array_push($this->lista_proyecciones,$proy); } }

Es posible que el constructor no reciba todos los valores iniciales para las variables del objeto y que se disponga de mtodos para realizar esa asignacin posteriormente, tal como ocurre en la clase Proyeccion:

276

PROGRAMACIN ORIENTADA A OBJETOS

class Proyeccion { var $dia_hora; var $pelicula; // constructor function Proyeccion($t){ $this->dia_hora = $t; } // implementacin de mtodos function asignar_pelicula($p) { $this->pelicula = $p; } }

Se puede optar por inicializar algunas variables con valores fijos desde el propio constructor, por ejemplo, asignando valores por defecto para dichas variables. El constructor de la clase Cine podra ser:
function Cine($d,$t=5,$tr=3.5){ $this->dia_espectador = $d; $this->tarifa_normal = $t; $this->tarifa_reducida = $tr; $this->lista_proyecciones = array(); $this->lista_clientes = array(); }

10.3. CONSTRUCCIN DE OBJETOS


Una vez definidas las clases que intervienen en el programa llega el momento de crear los objetos particulares. En la terminologa de la programacin orientada a objetos estos reciben el nombre de ejemplares de la clase. La creacin de un objeto implica la llamada a un constructor de la clase mediante el operador new. Si en la definicin de una clase no ha sido definido ningn constructor, entonces PHP utilizar un constructor por defecto; dicho constructor no recibe ningn argumento. La sintaxis de creacin de un nuevo objeto de una clase es:
obj = new nombreClase(argumentos);

277

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

El valor devuelto por el operador new debe ser asignado a una variable para poder hacer referencia posteriormente a dicho objeto. Ejemplo 10.4: Se podra crear un nuevo objeto de la clase Pelicula con la sentencia:
$p = new Pelicula("El halcn malts", "J. Huston", array("H. Bogart", "M. Astor"), 1941);

Como puede observarse el constructor recibe los cuatro argumentos necesarios para inicializar las cuatro variables del objeto. La tercera de las variables recibir como valor un array con los nombres de los protagonistas de la pelcula.

10.3.1. ACCESO A LAS VARIABLES Y MTODOS DEL OBJETO


Tanto a las variables como a los mtodos del objeto, se puede acceder utilizando el operador -> aplicado sobre la variable que almacena el objeto. La sintaxis para ello es:
Objeto -> variable Objeto -> metodo(argumentos)

Ejemplo 10.5: Dado el objeto $p creado en el Ejemplo 10.4, se podra efectuar una llamada
$p->generar_ficha();

El resultado obtenido sera: El halcn malts (1941) Dirigida por J. Huston y protagonizada por: H. Bogart M. Astor

278

PROGRAMACIN ORIENTADA A OBJETOS

Ejemplo 10.6: Para completar la definicin de las clases del Ejemplo 10.1, se incluye a continuacin la definicin de la clase Cine, con la implementacin de todos sus mtodos.
class Cine { var $dia_espectador, $tarifa_normal, $tarifa_reducida, $lista_proyecciones, $lista_clientes; // constructor function Cine($d,$t=5,$tr=3.5){ $this->dia_espectador = $d; $this->tarifa_normal = $t; $this->tarifa_reducida = $tr; $this->lista_proyecciones = array(); $this->lista_clientes = array(); } // implementacin de mtodos function calcular_importe($c,$proy) { // obtencin del dia de la semana de la proyeccin $dia_proy = date("w",$proy->dia_hora); if(($dia_proy == $this->dia_espectador)|| ($c->edad)<=15 || ($c->edad>=65)) $t=$this->tarifa_reducida; else $t=$this->tarifa_normal; return $t; } function crear_proyeccion($t,$p) { $proy = new Proyeccion($t); $proy->asignar_pelicula($p); array_push($this->lista_proyecciones,$proy); } function crear_cliente($n,$e) { $cl = new Cliente($n,$e); array_push($this->lista_clientes,$cl); } function buscar_cliente($n) { // bsqueda del nombre en el array de clientes

279

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

foreach($this->lista_clientes as $cliente) { if($cliente->nombre == $n) return $cliente; } return FALSE; } }

Ejemplo 10.7: Una vez definidas todas las clases del Ejemplo 10.1 en un fichero de nombre clases.php, se encuentran listas para ser utilizadas en cualquier otro programa. A continuacin se incluye un sencillo programa que crea diferentes objetos de las clases anteriores y realiza con ellos las acciones que permiten sus mtodos.
include "clases.php"; // // // $c creacin de un nuevo objeto Cine se asigna el mircoles (3) como da del espectador, y 6 y 4.5 como tarifas normal y reducida, respectivamente = new Cine(3,6,4.5);

// creacin de nuevos clientes con el mtodo del objeto $c->crear_cliente("Angel Antn",37); $c->crear_cliente("Rosa Minguez",36); $c->crear_cliente("Valeria Conde",7); // creacin de una pelcula y una proyeccin de la misma $p = new Pelicula("El halcn malts", "J. Huston", array("H. Bogart", "M. Astor"), 1941); $c->crear_proyeccion(mktime(16,0,0,12,23,2004),$p); // Generacin de un listado con las proyecciones disponibles print "<H2> Proyecciones disponibles </H2>"; foreach($c->lista_proyecciones as $pr) { $dia = date("d/m/Y",$pr->dia_hora); $hora = date("H:i",$pr->dia_hora); $pr->pelicula->generar_ficha(); print "Dia: $dia <BR> Hora: $hora <BR>"; } // Bsqueda de un cliente y clculo del importe de su

280

PROGRAMACIN ORIENTADA A OBJETOS

// localidad para la primera proyeccin disponible if($cl=$c->buscar_cliente("Valeria Conde")) { print "El cliente tiene $cl->edad aos"; $pr = $c->lista_proyecciones[0]; $precio = $c->calcular_importe($cl,$pr); print " y el importe de su entrada es $precio"; }

10.4. HERENCIA
La programacin orientada a objetos tiene por objetivo la estructuracin de los programas en clases; cada clase describe las caractersticas generales que un objeto debe poseer. A partir de las clases definidas es posible tambin disear objetos similares con nuevas particularidades; de esta forma surgen los conceptos de subclases y herencia. Al igual que ocurre con los objetos del mundo real, una clase de objetos puede ser vista como una subclase de otra; de manera que hereda todas las propiedades (variables y mtodos) de la superclase. Sin embargo, la verdadera utilidad de las subclases es el permitir a estas la definicin de nuevas variables, la modificacin de los mtodos heredados o la implementacin de nuevos mtodos. Ejemplo 10.8: Sobre el esquema de clases presentado en el Ejemplo 10.1 se podran realizar algunas modificaciones. En primer lugar se podran definir varias subclases que permitan clasificar las pelculas que el cine gestiona en funcin de su gnero (Figura 10.5). As por ejemplo, las comedias constituyen una subclase de pelculas; lo que significa que toda comedia tiene las caractersticas generales de una pelcula, pero puede tener caractersticas propias de este gnero. De la misma manera, se podra pensar en un tipo especial de clientes que recibirn un tratamiento especfico. Por ejemplo, se puede considerar el concepto de socio como un cliente que participa en un programa de fidelidad por el cual obtiene puntos a canjear por regalos. Surge as la necesidad de definir el socio como una subclase de cliente pero incorporando nuevas variables y nuevos mtodos.

281

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

PELCULA

POLICIACA

COMEDIA
Figura 10.5 Subclases de la clase pelcula

MUSICAL

CLIENTE

VARIABLES: Nombre Edad Lista proyecciones

MTODO: Adquirir entrada

SOCIO

VARIABLES PROPIAS: Nmero de socio Puntos acumulados

MTODOS PROPIOS: Adquirir entrada (*) Canjear regalo

Figura 10.6 Estructura de la clase socio, subclase de cliente

Como se aprecia en la Figura 10.6, la subclase Socio dispondr de dos nuevas variables no disponibles en un cliente general: una para almacenar un nmero de socio y otra para almacenar en todo momento los puntos acumulados por el socio. En lo que respecta a los mtodos, se observa la aparicin de uno nuevo (canjear regalo) y la necesidad de redefinir el mtodo heredado, ya que cuando un socio adquiera una entrada, se deber actualizar su saldo de puntos acumulados.

282

PROGRAMACIN ORIENTADA A OBJETOS

10.4.1. DEFINICIN DE SUBCLASES


Para la definicin de subclases en PHP se utiliza la palabra extends seguida del nombre de la clase de la que descienden (superclase). Dentro de la definicin de la subclase no es necesario volver a declarar todas las variables y mtodos de la superclase, ya que son automticamente heredados. La sintaxis general de la definicin de subclases es:
class NombreSubclase extends NombreSuperclase { var variables de la subclase mtodos de la subclase }

Ejemplo 10.9: La definicin de las subclases plateadas en el Ejemplo 10.8 seran:


class Policiaca extends Pelicula{ } class Musical extends Pelicula{ } class Comedia extends Pelicula{ }

En el caso de la subclase Socio, su definicin podra ser la siguiente:


class Socio extends Cliente{ // variables propias de la subclase var $num_socio, $puntos; // constructor function Socio($n,$e,$num){ $this->nombre = $n; $this->edad = $e;

283

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

$this->lista_proyecciones = array(); $this->num_socio = $num; $this->puntos = 0; } // implementacin de mtodos function adquirir_entrada($proy) { array_push($this->lista_proyecciones,$proy); $this->puntos += 10; } function canjear_regalo(){ $p = $this->puntos; if($p >= 100) { print "Enhorabuena! Le obsequiamos con nuestro regalo sorpresa!"; $this->puntos -= 100; } else{ $aux = 100-$p; print "Le faltan $aux puntos para conseguir un premio"; } } }

Como puede observarse, los objetos de esta subclase tienen todas las caractersticas de la clase general Cliente (nombre, edad y lista_proyecciones), pero adems poseen dos nuevos atributos: num_socio y puntos. Cuentan tambin con el mismo mtodo adquirir_entrada(), pero definido de nuevo, adaptndose as a las caractersticas de la subclase; en este caso, cada vez que se adquiera una entrada se incrementar en 10 unidades el valor de la variable puntos. La subclase incluye tambin un nuevo mtodo, canjear_regalo(), que ser propio de los objetos de esta nueva clase.

284

COOKIES
11.1. QU SON LAS COOKIES?
Las cookies constituyen un sencillo mecanismo para almacenar informacin en los equipos cliente que visitan una pgina web. La informacin es enviada por el servidor web y queda almacenada en el equipo del cliente, bien de forma temporal en la memoria principal, o permanentemente en la memoria secundaria en forma de ficheros de texto. La informacin almacenada en esos ficheros de texto puede ser recuperada por el servidor web cuando el usuario visite de nuevo la pgina web u otras pginas para las cules se haya establecido la visibilidad de la cookie. Las cookies no fueron diseadas para espiar o invadir la privacidad de los usuarios de Internet, su principal objetivo es identificar al usuario y poder de esta manera preparar pginas personalizadas. Son muy prcticas tambin para almacenar informacin como el nmero de visitas, preferencias, estado de conexin y, en general, informacin que sirva para realzar la navegacin del cliente y permita simular una conexin continua. Por ejemplo, gracias a las cookies el usuario podra continuar la navegacin por un sitio web en el ltimo punto en el que lo dej en su ltima conexin. Es de destacar que las cookies, como simples archivos de texto, no tienen la posibilidad de realizar ningn tipo de accin sobre el equipo del cliente; es decir,

285

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

no pueden abrir ficheros del usuario, ejecutar programas en el equipo cliente, establecer conexiones de red,... A pesar de ser inofensivas, el usuario puede, si as lo desea, configurar su navegador web para que no acepte ningn tipo de cookie, para que acepte nicamente las que proceden de determinados servidores o para que pregunte al usuario antes de generar cualquier cookie.

11.2. GENERACIN DE COOKIES


Como se ha comentado, las cookies son generadas en el cliente pero por orden del servidor; de manera que la generacin de una cookie puede realizarse perfectamente desde un programa PHP. En esta seccin se ver cmo este proceso es muy sencillo de realizar. Es de destacar que cuando se realiza una transferencia HTTP entre un servidor y un cliente, las cookies son incluidas en la cabecera HTTP, esto implica que cualquier orden de generacin de una cookie desde una pgina web debe ser dada antes de cualquier comando HTML. Para crear una cookie desde un programa PHP se utiliza la funcin setcookie(). La sintaxis mnima de esta funcin es:
setcookie(nombre, valor)

y define una cookie con el nombre y valor indicados en los argumentos. En cierta forma una cookie puede verse como una variable que tiene un identificador y un valor asignado, de hecho, el nombre de la cookie se convertir en nombre de una variable PHP cuando la cookie sea transferida desde el cliente al servidor. Recordar de nuevo que el script que incorpore la llamada a la funcin anterior debe ser colocado delante de cualquier comando HTML. La funcin setcookie() devuelve un valor numrico indicando si se produjo algn fallo en el proceso. Si devuelve un valor distinto de cero significa que el proceso de transferencia se realiz correctamente, aunque eso tampoco asegura que la cookie haya sido creada en el equipo del cliente, ya que este podra no haberla aceptado. El segundo de los argumentos de la funcin setcookie() es opcional, si no se especifica ningn valor para la cookie lo que se estara haciendo realmente es borrar del cliente la cookie de nombre dado:
setcookie(nombre)

286

COOKIES

Adems de este parmetro opcional, la funcin setcookie()tiene algunos parmetros opcionales ms, que permiten especificar, por ejemplo, una fecha de expiracin de la cookie, determinar la visibilidad de dicha cookie en el servidor web, indicar un dominio en el que estar disponible, o indicar que la cookie solo debe ser transferida bajo conexiones seguras HTTPS. En concreto, la sintaxis completa de la funcin setcookie() es:
setcookie(string nombre, string valor, int expiracion, string path, string dominio, int seguro)

Ejemplo 11.1: Supngase que se dispone de un formulario en el que se solicita al usuario que escriba su nombre y que se desea que ese nombre pueda ser utilizado directamente cuando el usuario visite otras pginas del servidor. El cdigo HTML de la pgina que define el formulario sera el siguiente:
<HTML> <HEAD><TITLE>Registro</TITLE></HEAD> <BODY> <H1>Registro como usuario</H1> Introduzca su nombre: <FORM ACTION="cookie.php" METHOD="GET"> <INPUT TYPE="text" NAME="nombre"><BR> <INPUT TYPE="submit" VALUE="Enviar"> </FORM> </BODY> </HTML>

Como puede apreciarse, la pgina dispone de un formulario con un campo de texto llamado nombre y la accin a realizar al pulsar el botn de enviar ser el envo de los datos a una nueva pgina llamada cookie.php. Es en esta nueva pgina en la que se generar la cookie, el cdigo completo correspondiente es:
<?php if (isset($nombre)) setcookie("nomusuario", $nombre); ?> <HTML> <HEAD><TITLE>Confirmacin</TITLE></HEAD> <BODY> Muchas gracias por registrarte. </BODY> </HTML>

287

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Obsrvese que el script PHP que tiene la definicin de la cookie est colocado antes de cualquier comando HTML, incluso antes del comando <HTML>. Adems se utiliza la funcin isset() para asegurar que la variable $nombre tiene un valor asignado correctamente desde el formulario. En el caso de que esta variable tenga un valor asignado se est generando una cookie de nombre nomusuario y con el valor introducido por el usuario en el formulario previo. Tambin es posible definir varias cookies bajo un nombre comn, es decir, definir arrays de cookies. Para ello se utiliza la notacin habitual de definicin de arrays en PHP. Ejemplo 11.2: Imagnese que se desea guardar en un array de cookies las ltimas pelculas vistas por cada cliente de Cinem@s, las cookies podran ser generadas de la siguiente manera:
setcookie( "peliculas[1]", "Mar adentro" ); setcookie( "peliculas[2]", "Peter Pan" ); setcookie( "peliculas[3]", "Shrek 2" );

En este caso, cuando se recupere el valor de estas tres cookies, se obtendr una variable de tipo array y de nombre $peliculas.

11.3. RECUPERACIN DE LOS VALORES DE LAS COOKIES


Un vez que la cookie ha sido generada, esta permanece en el equipo del cliente y ser enviada al servidor cuando se realice una nueva carga de una pgina del servidor para la que la cookie sea visible. Cualquier cookie enviada al servidor desde el cliente, automticamente se convertir en una variable PHP con nombre igual al nombre de la cookie pero precedida del signo $. Ejemplo 11.3: Supngase que el cliente que se registr en el formulario anterior, y para el que se ha generado una cookie con su nombre, visita ahora una nueva pgina del servidor;

288

COOKIES

esta nueva pgina tendr acceso a una variable $nomusuario con la que podr preparar un contenido personalizado:
<HTML> <HEAD><TITLE>Cartelera</TITLE></HEAD> <BODY> <H1> Nuestra cartelera </H1> <?php if (isset($nomusuario)) echo "$nomusuario, nuestros estrenos para ti son:"; else echo "Por favor, regstrese"; ?> <TABLE> ............. ............. ............. </TABLE> </BODY> </HTML>

En este caso el uso de la funcin isset() permite asegurarse de que la cookie se ha recibido correctamente desde el cliente, en caso de que no se reciba esa cookie se muestra un mensaje solicitando al cliente que se registre. Ejemplo 11.4: En este nuevo ejemplo los procesos de generacin y de recuperacin de la cookie tienen lugar en la misma pgina. Imagnese, que interesa en todo momento conocer la fecha y hora del ltimo acceso de cada cliente a la pgina; esto podra realizarse fcilmente con ayuda de una cookie que se almacene en cada cliente. El cdigo completo de la pgina sera:
<?php $v = date("d/m/Y \a \l\a\s H:i"); setcookie("visita", $v, time()+30*24*3600); ?> <HTML> <HEAD><TITLE>Pgina de inicio</TITLE></HEAD> <BODY> <H1>Bienvenido a nuestra pgina</H1> <?php if (isset($visita)) echo "La ltima vez que nos visitaste fue el $visita";

289

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

?> .................................... .................................... </BODY> </HTML>

Como puede verse, en primer lugar se genera una cookie con la fecha y hora de acceso; este script est colocado antes de cualquier otro cdigo. En el segundo script se utiliza esa cookie para escribir en la pgina el momento de ese ltimo acceso. Obsrvese igualmente, que en la generacin de la cookie anterior se ha utilizado un nuevo parmetro opcional de la funcin setcookie(), el parmetro que determina la fecha de expiracin de la cookie. En la prxima seccin se explicar con detalle el funcionamiento de este nuevo parmetro. Cuando un cliente accede a una pgina, el servidor solicita los valores de todas las cookies antes de realizar cualquier otra operacin, una vez recibidos esos valores comienza a procesar la pgina. Este hecho hace que la cookie generada en el primer script no ser visible hasta la siguiente carga de la pgina, ya que en primer lugar el servidor recibe las cookies generadas y posteriormente actualiza su valor para la siguiente carga. PHP dispone de una variable global de tipo array en la que siempre se encuentran almacenadas todas las cookies que el servidor ha recibido del cliente, dicho array es $HTTP_COOKIE_VARS y se trata de un array asociativo en el que el ndice de cada elemento es el nombre de una cookie y el valor almacenado en el array el valor de dicha cookie. Ejemplo 11.5: Si se ha definido una cookie de la siguiente manera:
setcookie("micookie", "Mar adentro");

se podr acceder a su valor con cualquiera de las dos sintaxis siguientes:


$micookie $HTTP_COOKIE_VARS["micookie"]

290

COOKIES

Utilizando la estructura iterativa foreach resulta muy sencillo generar en la pgina un listado con los nombres y valores de todas las cookies visibles en cada instante.
foreach($HTTP_COOKIE_VARS as $c) { echo "$c <BR>"; }

Otra posibilidad para recorrer todas las cookies definidas sera:


while (list($n,$v)=each($HTTP_COOKIE_VARS)) { echo "$n = $v <BR>"; }

A partir de la versin PHP 4.1.0 tambin se dispone del array de cookies definidas en otra variable global de nombre $_COOKIE.

11.4. COOKIES DE SESIN Y COOKIES PERMANENTES


Cuando se utiliza la sintaxis mnima para generar una cookie, es decir, la sintaxis en la que nicamente se indica el nombre y el valor, la cookie solo estar definida durante la sesin; cuando el usuario cierre su navegador, desaparecer. En estos casos la cookie, mientras dura la sesin, estar almacenada en la memoria principal del equipo cliente. Si se desea que la cookie permanezca en el equipo del usuario cuando este cierre la sesin, deber indicarse en su construccin un parmetro adicional con un periodo de expiracin. En este caso la cookie quedar almacenada en un fichero de texto en el equipo cliente hasta que expire el periodo establecido, momento en el que automticamente desaparecer.
setcookie(nombre,valor,expiracion)

El parmetro de expiracin de la cookie debe indicarse sumando a la funcin time() el nmero de segundos que se desea que permanezca la cookie en el equipo del usuario. A continuacin pueden verse algunos ejemplos de cookies con diferentes periodos de expiracin: Cookie con un periodo de expiracin de 60 segundos:
setcookie("Cookie1","Valor1",time() + 60);

291

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Cookie con un periodo de expiracin de 1 hora:


setcookie("Cookie2","Valor2",time() + 3600);

Cookie con un periodo de expiracin de 30 das:


setcookie("Cookie3","Valor3",time() + 30*24*3600);

Para borrar una cookie que tiene establecido un valor con periodo de expiracin antes de que dicho periodo finalice, debe utilizarse la sintxis:
setcookie("NombreCookie", "", time());

Ejemplo 11.6: En este ejemplo se utiliza una cookie para almacenar en el equipo cliente el instante de tiempo correspondiente al ltimo acceso a la pgina. El programa comprobar si han transcurrido ms de 7 das desde ese ltimo acceso y en caso afirmativo mostrar un mensaje avisando de ese hecho.
<?php $ahora = time(); setcookie("ultima", $ahora, $ahora + 30*24*3600); if(isset($ultima) and ($ahora - $ultima > 7*24*3600)) echo "Hace ms de una semana que no nos visitabas" ?> <HTML> <HEAD><TITLE>Pgina de inicio</TITLE></HEAD> <BODY> <H1>Bienvenido a nuestra pgina</H1> .................................... .................................... .................................... </BODY> </HTML>

En el script se utiliza la funcin time() para obtener el instante de tiempo actual, ese valor se almacena temporalmente en una variable y se genera con ella la cookie a la que se le da el nombre ultima. Esta cookie tendr una validez de 30 das. Por lo tanto, en caso de que transcurra ese plazo sin recibir una nueva visita del usuario, la cookie se borrar automticamente. Tras definir la cookie, en el programa se pregunta si la variable $ultima se encuentra definida. Conviene recordar que la generacin de la cookie se produce con anterioridad a la lectura de todas las cookies definidas, por tanto, cuando se leen esas cookies la variable $ultima tomar el valor correspondiente a la anterior carga de la pgina.

292

COOKIES

Finalmente, en la estructura condicional se compara el valor de las variables $ahora y $ultima que guardan los instantes de tiempo actual y del ltimo acceso, respectivamente. Si la diferencia entre ambas es mayor que 7 das (7*24*3600 segundos) se mostrar el mensaje en la pgina. Ejemplo 11.7: En este nuevo programa se utilizar una cookie para generar un contador de accesos individuales de cada usuario. El nmero de accesos acumulados por el usuario ser almacenado en una cookie de nombre nvis.
<?php if(isset($nvis)) { $nvis++; setcookie("nvis", $nvis, time() + 30*24*3600); } else { setcookie("nvis", 1, time() + 30*24*3600); $nvis=1; } ?> <HTML> <HEAD><TITLE>Pgina de inicio</TITLE></HEAD> <BODY> <H1>Bienvenido a nuestra pgina</H1> <?php echo "Esta es tu visita n $nvis"; ?> .................................... .................................... </BODY> </HTML>

En este caso el script inicial pregunta en primer lugar si la variable $nvis se encuentra definida, dicho de otra modo, si la cookie ya se defini en un acceso previo. En caso afirmativo, se incrementa en una unidad el valor de esa variable y se redefine la cookie para el siguiente acceso. En el caso de variable no definida, es decir, primer acceso, se le asignar el valor 1 y se definir la cookie. En ambos casos, la cookie generada permanecer en el equipo cliente 30 das. Finalmente, obsrvese cmo en el cuerpo del documento HTML se encuentra un nuevo script PHP que utiliza el valor de la variable $nvis para generar en todo momento un mensaje indicando cuntas veces ha accedido el usuario a la pgina.

293

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

11.5. VISIBILIDAD DE LAS COOKIES EN EL SITIO WEB


Por defecto, si una cookie ha sido generada desde una pgina del sitio web, su valor podr ser "visto" desde cualquier otra pgina del mismo directorio o subdirectorios en el que reside la pgina inicial. Si se desea cambiar esta visibilidad puede utilizarse un nuevo parmetro opcional en la definicin de la cookie, indicando la ruta concreta en el servidor a partir de la cual la cookie es visible. A continuacin se presentan dos ejemplos concretos: Cookie visible en todas las pginas alojadas en el servidor:
setcookie("miCookie","1",time()+60,"/");

Cookie visible en las pginas alojadas a partir del directorio sub:


setcookie("miCookie","1",time()+60,"/sub/");

294

MANEJO DE FICHEROS
12.1. MECANISMOS DE ALMACENAMIENTO DE DATOS
El almacenamiento de informacin suele ser una de las necesidades bsicas de cualquier aplicacin web. En muchas ocasiones esa informacin puede ser almacenada en formato de texto, para lo cual se dispone de diferentes alternativas. La primera es la estudiada en el captulo anterior: las cookies. En este caso se opta por descentralizar esa informacin, de manera que cada equipo cliente guarda en ficheros de texto propios la informacin correspondiente. En la mayora de ocasiones el uso de las cookies no es suficiente. Puede ocurrir que se desee tener siempre disponible la informacin de todos los clientes o que esa informacin requiera tratamientos ms complejos. En definitiva, lo que se trata es de poder almacenar la informacin no en los clientes sino en el propio servidor. Una primera alternativa es el uso de aplicaciones gestoras de bases de datos, tales como MySQL. En estos casos se aprovecha las funcionalidades propias de esas aplicaciones, se optimiza la gestin de los datos, la realizacin de bsquedas, la

295

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

generacin de informes,... En los prximos captulos se analizar cmo desde cualquier programa PHP se puede establecer la conexin a una base de datos MySQL y realizar todas estas operaciones. Sin embargo, en ocasiones, el uso de simples ficheros de texto que se almacenen en el servidor puede cubrir las necesidades de almacenamiento de datos de aplicaciones web. Esto es precisamente lo que se estudiar en el presente captulo. Por supuesto, aunque las bases de datos ofrecen unas prestaciones mucho mayores, en algunos casos el uso de ficheros puede tener algunas ventajas: Su uso resulta ms sencillo. No es necesario el conocimiento de lenguajes de manipulacin de datos. No requieren de la instalacin de aplicaciones adicionales. No todos los proveedores de acceso y alojamiento de pginas web permiten alojar pginas con acceso a bases de datos.

12.2. OPERACIONES DE MANIPULACIN DE FICHEROS


El uso de ficheros de texto en los programas PHP implica la utilizacin de una serie de operaciones bsicas. La primera de esas operaciones es la apertura; una vez abierto se realizarn las correspondientes operaciones de lectura/escritura, y finalmente se proceder al cierre del fichero.

12.2.1. APERTURA Y CIERRE DE FICHEROS


Para abrir un fichero de texto desde un programa PHP se utiliza la funcin fopen(). Como argumentos mnimos esta funcin recibe el nombre del fichero y una cadena de caracteres que indicar el modo de apertura:
fopen(Nombrefichero, ModoApertura)

El nombre del fichero se indicar con la ruta relativa de acceso desde la pgina que incorpora el script. La funcin fopen() devuelve un nmero entero que acta de identificador o puntero al fichero y que se utilizar en todas las operaciones posteriores sobre l. Si el nmero devuelto es 0 se entender que el proceso de apertura no ha podido realizarse satisfactoriamente (fichero no existente, falta de permisos para la apertura, daos en el fichero,...).

296

MANEJO DE FICHEROS

Respecto al modo de apertura del fichero, existen diferentes opciones dependiendo de la cadena que se utilice como segundo argumento de la funcin. La Tabla 12.1 muestra esta opciones.
'r' 'r+' 'w' 'w+' 'a' 'a+' Solo lectura. Puntero al inicio. Lectura/escritura. Puntero al inicio. Solo escritura. Crea el fichero si no existe. Borra el contenido previo del fichero. Lectura/escritura. Crea el fichero si no existe Borra el contenido previo. Solo escritura. Aade nuevos datos al final del fichero. Lo crea si no existe. Lectura/escritura. Aade nuevos datos al final del fichero. Lo crea si no existe. Tabla 12.1 Modos de apertura de un fichero

Ejemplo 12.1: Si el fichero es abierto con la siguiente sentencia:


$f = fopen("Datos.txt", "r");

sobre el fichero Datos.txt solo se permitirn operaciones de lectura. En cambio, una sentencia como la siguiente:
$f = fopen("Pruebas/comentarios.txt", "a");

abre el fichero comentarios.txt que se encuentra en el directorio Pruebas, subdirectorio del directorio actual, para realizar sobre l solo operaciones de escritura, crendole si no existe o aadiendo nuevos datos al final si ya existe. Una vez abierto un fichero se realizarn sobre l las operaciones de lectura y/o escritura y cuando ya no se utilice se debe proceder a cerrarlo. Para el cierre del fichero existe una nueva funcin que recibe como argumento el identificador de fichero que se genera en la operacin de apertura. Esta funcin es:
fclose(idfichero)

De esta manera, la estructura bsica de todo programa que trabaje con ficheros sera:

297

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

$f = fopen("mifichero.txt", "a"); .......................... .......................... fclose($f);

12.2.2. OPERACIONES DE LECTURA DE DATOS


PHP dispone de un catlogo bastante amplio de funciones de lectura y escritura de datos. En estas prximas secciones se presentarn algunas de las ms utilizadas, comenzando en primer lugar por analizar las operaciones que permiten leer los datos almacenados en ficheros. La primera funcin que se puede utilizar para la lectura de un fichero de texto es la funcin fgets() que permite efectuar una lectura lnea a lnea del contenido del fichero.
fgets(idfichero)

El parmetro de la funcin debe ser el identificador de un fichero abierto previamente con permiso de lectura. En cada llamada a la funcin una lnea completa es leda y el apuntador que seala la posicin de lectura del fichero avanza hasta la siguiente lnea. Para saber si el apuntador interno del fichero ha alcanzado el final se puede utilizar la funcin booleana feof(). Ejemplo 12.2: El siguiente programa realiza una lectura lnea a lnea del contenido de un fichero de texto y lo escribe en la propia pgina web:
<?php $f = fopen ("datos.txt","r"); while(!feof($f)){ $linea=fgets($f); print $linea."<BR>"; } fclose($f); ?>

Como puede comprobarse, la lectura se realiza mediante un bucle que finaliza cuando el fin del fichero sea alcanzado.

298

MANEJO DE FICHEROS

La funcin fgets() puede recibir opcionalmente un segundo argumento que indique un nmero mximo de caracteres a leer:
fgets(idfichero, n+1)

Con esta sintaxis la funcin leera, a partir del apuntador interno del fichero, n caracteres o hasta alcanzar un fin de lnea, lo que antes ocurra. Para la lectura de un nmero de caracteres predeterminado PHP dispone tambin de una nueva funcin:
fread(idfichero, n)

Esta funcin lee n caracteres del fichero o hasta alcanzar el fin del fichero (lo que antes ocurra). Si se desea saber el nmero de caracteres que contiene el fichero puede usarse la funcin:
filesize(nombrefichero)

Ejemplo 12.3: Si se desea transferir el contenido completo del fichero a una variable en un programa PHP se podran realizar las siguientes operaciones:
<?php $fnom = "/ficheros/mifichero.txt"; $f = fopen($fnom, "r"); $contenido = fread($f, filesize($fnom)); fclose($fd); ?>

Para una lectura completa del contenido del fichero en una sola operacin PHP dispone tambin de la funcin file(). Una ventaja de esta funcin es que no necesita realizar la apertura previa del fichero con fopen() ni el cierre con fclose(). La funcin devuelve directamente una array de cadenas de caracteres con cada una de las lneas del fichero.

299

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Ejemplo 12.4: El siguiente programa utiliza la funcin file() para hacer una lectura completa de un fichero en una sola operacin, y posteriormente recorre el array resultante para mostrar su contenido en la pgina:
<?php $contenido = file('datos.txt'); foreach($contenido as $linea) { print $linea; print "<BR>"; } ?>

Finalmente, dentro de las funciones de lectura bsicas puede citarse la funcin fgetc() que permite una lectura carcter a carcter.
fgetc(idfichero)

Ejemplo 12.5: El siguiente programa realiza una lectura completa del fichero y copia en la pgina nicamente aquellos caracteres que ocupan posiciones pares dentro del fichero.
<?php $f = fopen("mifichero.txt","r"); $nc = 0; while(!feof($f)){ $c = fgetc($f); $nc++; if ($nc % 2 == 0) print $c; } fclose($f); ?>

12.2.3. LECTURA CON FORMATO


Una de las funciones de lectura de ficheros ms completa es la funcin fscanf(), que permite leer datos de acuerdo a una especificacin de formato. La principal ventaja de esta funcin es el poder asignar valores a varias variables simultneamente en una nica operacin de lectura. La funcin fscanf() tiene dos sintaxis diferentes: 300

MANEJO DE FICHEROS

fscanf(idfichero,formato) fscanf(idfichero,formato,variables)

En la primera debe indicarse el identificador del fichero abierto para la lectura y una cadena de caracteres indicando el patrn o formato de lectura. Los datos ledos por la funcin sern devueltos por la funcin en un array. En la segunda de las sintaxis posibles, adems del identificador y la cadena de formato se pueden indicar una lista de variables pasadas por referencia para que la funcin almacene en ellas los datos ledos. Las cadenas de formato de lectura incluyen una serie de codificaciones que sealan el tipo de dato a leer. En concreto, los cdigos de formato son los que se muestran en la siguiente tabla: %b %c %d %u %f %o %s %x o %X Nmero entero en binario Carcter Nmero entero en base 10 Nmero entero sin signo Nmero decimal Nmero entero en octal (base 8) Cadena de caracteres Nmero entero hexadecimal (base 16)

Tabla 12.2 Cdigos de formato de lectura

Ejemplo 12.6: Supngase que Cinem@s dispone de un fichero de texto en el que guarda informacin sobre sus clientes registrados; en concreto, el fichero contendr el nombre de cada cliente, su edad y el gasto total realizado en el ltimo mes. El contenido de este fichero podra ser:
Luis Lpez Snchez Ana Antn Boo Pedro Marcos Dez Maria Martn Grau Mnica Abad Garca Jess Bernal Cos 18 21 24 33 43 22 76.4 50.2 82.5 12.7 45.8 52.1

Como puede apreciarse este fichero est constituido por diferentes lneas en las que se muestra para cada cliente su nombre, su edad y el gasto total separados por

301

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

tabulaciones. La lectura de los datos necesita conocer esta estructura para poder leer en cada operacin de lectura los tres datos de un cliente. El programa PHP que realiza la lectura del fichero anterior y genera una lista HTML a partir del contenido del mismo es:
<?php $f = fopen("clientes.txt","r"); print "<UL>"; while ($datos = fscanf($f, "%s\t%d\t%f")) { list($nombre, $edad, $gasto) = $datos; print "<LI> $nombre de $edad aos ha realizado " . " un gasto total de $gasto euros. <BR>"; } print "</UL>"; fclose($f); ?>

El programa anterior lo primero que realiza es la apertura del fichero con permiso de lectura. A continuacin genera la etiqueta HTML de inicio de lista y comienza el bucle de lectura. En cada una de las iteraciones del bucle se realiza la llamada a la funcin fscanf() para que lea, en este orden, una cadena de caracteres, un tabulador, un nmero entero, otro tabulador y un nmero en coma flotante (cadena de formato "%s\t%d\t%f"). Los tres valores ledos sern almacenados en el array de nombre $datos. Cuando se alcance el final del fichero, y por tanto no existan ms datos a leer, la funcin fscanf() devolver un valor booleano falso y por tanto el bucle de lectura finalizar. Dentro del cuerpo del bucle se utiliza la funcin list() para asignar valores a tres variables ($nombre, $edad y $gasto) a partir de los tres valores que han sido almacenados en el array $datos. Con esos tres valores de las variables se genera el correspondiente tem de la lista. En concreto, el resultado del programa anterior sera una lista como la siguiente: Luis Lpez Snchez de 18 aos ha realizado un gasto total de 76.4 euros. Ana Antn Boo de 21 aos ha realizado un gasto total de 50.2 euros. Pedro Marcos Dez de 24 aos ha realizado un gasto total de 82.5 euros. Maria Martn Grau de 33 aos ha realizado un gasto total de 12.7 euros. Mnica Abad Garca de 43 aos ha realizado un gasto total de 45.8 euros. Jess Bernal Cos de 22 aos ha realizado un gasto total de 52.1 euros.

302

MANEJO DE FICHEROS

La segunda de las sintaxis de la funcin fscanf() permita indicar en su lista de argumentos las variables en las que se desea que se almacenen directamente los valores ledos. Estas variables deben ser pasadas por referencia, lo que significa que deben ir precedidas del signo &. Ejemplo 12.7: Utilizando esta sintaxis alternativa, el programa del Ejemplo 12.6 podra escribirse de la siguiente manera:
<?php $f = fopen ("datos.txt","r"); print "<UL>"; while(!feof($f)){ $linea=fscanf($f,"%s\t%d\t%f",&$nombre,&$edad,&$gasto); print "<LI> $nombre de $edad aos ha realizado " . " un gasto total de $gasto euros. <BR>"; } print "</UL>"; fclose($f); ?>

12.2.4. OPERACIONES DE ESCRITURA DE DATOS


PHP dispone igualmente de funciones que permiten generar ficheros de texto o escribir nuevos datos en ficheros ya existentes. Por supuesto, para poder utilizar estas funciones es preciso que el fichero sea abierto con permiso de escritura, ya que de otro modo se generara un error. La funcin que permite escribir cadenas de caracteres en un fichero de texto es fwrite(), que admite dos sintaxis diferentes:
fwrite(idfichero, cadena) fwrite(idfichero, cadena, numCaracteres)

En ambos caso se deben indicar en primer lugar el identificador del fichero de destino y la cadena de caracteres a escribir. La segunda de las sintaxis recibe un tercer parmetro que representa el nmero mximo de caracteres a escribir; en este caso, si la cadena supera ese nmero ser truncada. La funcin fwrite() dispone de un alias o funcin sinnima que tiene exactamente la misma sintaxis y el mismo uso, se trata de la funcin fputs().

303

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Ejemplo 12.8: Programa que genera un fichero de texto con los 100 primeros nmeros pares:
<?php $f = fopen("NumerosPares.txt","a"); for($i=1;$i<100;$i++) { fwrite($f,2*$i."\t"); } fclose($f); ?>

Ejemplo 12.9: Utilizando las funcionalidades de lectura y escritura de ficheros en PHP se podra crear en una pgina un sencillo contador de accesos. Bastara con generar un fichero de texto cuyo contenido inicial sea el valor 0 e incluir el siguiente programa en la pgina correspondiente:
<?php $f = fopen("contador.txt","r+"); $c = fgets($f); $c++; rewind($f); fwrite($f,$c); fclose($f); print "Nmero de visitas de esta pgina: $c"; ?>

El programa anterior abre el fichero contador.txt con permisos de lectura y escritura, lee su contenido, almacenndolo en la variable $c, incrementa el valor de esa variable en una unidad, reinicia el puntero del fichero al inicio del mismo (funcin rewind()) y escribe el nuevo valor sobre el fichero borrando el anterior. Con el valor de la variable muestra adems un mensaje en la pgina indicando el nmero total de accesos. Otra sencilla utilidad de los ficheros podra ser la creacin de un registro de comentarios realizados por los visitantes de una pgina. En lugar de guardar todos los comentarios sobre una base de datos se podra optar por aadirlos a un fichero de texto. Para comenzar se debera disear un formulario HTML a travs del cual el usuario har sus comentarios. El formulario puede estar formado por una simple rea de texto y un botn de envo.

304

MANEJO DE FICHEROS

El aspecto final del formulario podra ser el que se muestra en la Figura 12.1 y su cdigo:
<html> <head><title>Comentarios</title></head> <body> Por favor, aydenos a mejorar. <br> Cualquier comentario que quiera realizar sobre nuestra empresa nos ser de utilidad <form action="observaciones.php"> <textarea name="ob" rows=4 cols=30 > </textarea> <input type="submit" value="Enviar comentario"> </form> </body> </html>

Figura 12.1 Formulario de envo de comentarios

Cuando el usuario pulse sobre el botn de envo, su comentario ser transferido en una variable $ob a la pgina observaciones.php donde se encontrar el programa que se encarga de escribirlo en el fichero. Este programa se incluye a continuacin:
<?php $f=fopen("Comentarios.txt","a"); fputs($f,"-------------------\n"); $fecha = date("d/m/Y"); fputs($f,"Fecha: $fecha \n");

305

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

fputs($f,"Comentario: \n$ob \n"); fclose($f); print "Cinem@s le agradece su comentario"; ?>

El fichero de texto generado tendr una estructura como la que sigue:


------------------Fecha: 12/10/2004 Comentario: Deberan hacer un esfuerzo por mejorar la limpieza de los aseos ------------------Fecha: 14/10/2004 Comentario: La verdad es que todo ha estado perfecto. Enhorabuena!!!

12.2.5. OTRAS FUNCIONES DE MANIPULACIN DE FICHEROS


Existen otras funciones de manipulacin de ficheros que pueden resultar tiles. Por ejemplo, si se desea realizar una copia de un fichero puede usarse la funcin copy(), cuya sintaxis es:
copy(nombreOrigen, nombreDestino)

Los argumentos que recibe esta funcin son los nombres del fichero de origen y el de destino. En el caso que estos se encuentren en un directorio diferente al del documento base (el que contiene el programa PHP) debern indicarse los nombres de los ficheros con sus respectivas rutas relativas. Cuando el fichero destino ya existe, la operacin de copiado borrar el fichero existente. La funcin copy() devolver un valor booleano indicando si la operacin se realiz satisfactoriamente. Ejemplo 12.10: Para realizar una copia de seguridad de un fichero cuyo nombre se encuentre en la variable $nfichero, se podra utilizar la sentencia:
if (copy($nfichero, $nfichero.'.bak')) { print ("Copia de seguridad realizada correctamente"); } else {

306

MANEJO DE FICHEROS

print ("Fallo en la copia de seguridad"); }

Si en lugar de hacer una copia del fichero lo que se desea es simplemente cambiarle el nombre, podra utilizarse la funcin rename():
rename(nombreAntiguo, nombreNuevo)

De nuevo, la funcin devuelve un valor booleano indicando la realizacin satisfactoria o no de la operacin. La operacin de eliminacin de un fichero de texto se puede realizar igualmente desde un programa PHP. Para ello se dispone de la funcin unlink():
unlink(nombreFichero)

Las operaciones de manipulacin de ficheros provocan errores cuando se tratan de aplicar sobre ficheros que no existen, por ello puede ser interesante asegurarse antes de la existencia de los mismos utilizando la funcin booleana file_exists():
file_exists(nombreFichero)

12.3. ENVO DE FICHEROS A TRAVS DE FORMULARIOS HTML


Para finalizar este captulo destinado a presentar las funciones bsicas de manipulacin de ficheros en PHP, se hace en esta seccin una presentacin de los mecanismos del lenguaje HTML para el envo de todo tipo de archivos a travs de formularios y cmo los archivos enviados por los usuarios pueden ser recogidos por los programas PHP. El diseo de un formulario que permita el envo de ficheros exige el incluir en el mismo un campo de tipo file e incluir en el comando de definicin del formulario el parmetro ENCTYPE indicando al formulario que se transferirn datos en archivos. Ejemplo 12.11: El siguiente formulario incluye uno de estos campos al que se le ha dado el nombre fichero:
<FORM ENCTYPE="multipart/form-data"

307

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

ACTION="RecibirFichero.php" METHOD=POST> <INPUT TYPE="hidden" name="MAX_FILE_SIZE" value="10000"> Fichero: <INPUT NAME="fichero" TYPE="file"> <INPUT TYPE="submit" VALUE="Enviar"> </FORM>

Como puede apreciarse, adems del campo de tipo file, el formulario incluye un campo oculto que permite indicar el tamao mximo de los ficheros que se permitir al usuario enviar (MAX_FILE_SIZE). El aspecto del formulario anterior sera el siguiente:

Cuando el usuario enva el fichero a travs del formulario, se reciben en el programa de destino (RecibirFichero.php en este caso) una serie de variables que permitirn guardar el fichero enviado en el servidor:
$fichero $fichero_name $fichero_size $fichero_type fichero temporal generado en el servidor nombre original del fichero tamao del fichero tipo de fichero

El nombre de estas variables viene determinado por el nombre del correspondiente campo del formulario HTML. En el caso del formulario anterior este campo tena precisamente como nombre fichero. Al recibir los datos del formulario se genera en el servidor un fichero temporal ($fichero) que si se desea conservar es preciso renombrar con la funcin rename(). Este proceso se podra realizar con el siguiente script:
<?php print "Fichero recibido"; rename($fichero,$fichero_name); ?>

308

BASES DE DATOS RELACIONALES Y EL LENGUAJE SQL


13.1. INTRODUCCIN
Las bases de datos constituyen hoy en da los elementos clave sobre los que se apoyan los sistemas de informacin de empresas e instituciones. Una base de datos podra definirse como una coleccin de datos interrelacionados que son almacenados en un soporte informtico. Algunas razones que justifican su uso son su capacidad para almacenar grandes volmenes de informacin, la optimizacin de su gestin, la facilidad para realizar consultas y la exactitud, rapidez y fiabilidad en su administracin. Aunque en ocasiones son trminos que se confunden, a la hora de hablar de las bases de datos debe distinguirse lo que es propiamente la informacin almacenada (datos, restricciones y relaciones) y el conjunto de programas que actan de intermediarios entre la informacin y el usuario (SGBD: Sistema Gestor de Bases de Datos). En este libro se mostrar uno de los sistemas gestores de bases de datos ms populares: MySQL.

309

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Por supuesto, en el desarrollo de aplicaciones web las bases de datos desempean un papel esencial. Muchas de las pginas web a las que accedemos habitualmente se generan como resultado de una consulta a una base de datos, poniendo de manifiesto su carcter dinmico. El objetivo final que persigue este libro es generar aplicaciones web dinmicas mediante el uso del lenguaje PHP, una parte importante de ese dinamismo se conseguir a travs de la conectividad a bases de datos. Es por ello que en estos tres prximos captulos se presentan los fundamentos de las bases de datos relacionales y el uso del sistema gestor MySQL, al igual que la sintaxis bsica del lenguaje de consulta SQL.

13.2. DISEO DE BASES DE DATOS


13.2.1. MODELO RELACIONAL
Para la generacin de bases de datos se utiliza habitualmente el denominado "modelo relacional". Este modelo se basa en representar los datos mediante tablas con diferentes atributos a modo de columnas. La existencia de atributos comunes en las tablas permite establecer relaciones entre ellas. Ejemplo 13.1: Un banco podra almacenar la informacin sobre sus clientes y los saldos en sus cuentas bancarias mediante dos simples tablas: Clientes Nombre Luis Lpez Ana Snchez Antonio Briz Antonio Briz Sara Salas DNI N cuenta 73456123 1001 56712765 1002 22871274 1002 22871274 1003 12567234 1004 Cuentas N cuenta Saldo 1001 12.523 1002 5.650 1003 24.758 1004 2.651

Cada una de las filas de las tablas se suele denominar tupla o registro, y a su vez est formada por una serie de valores cuyo tipo coincide con el del correspondiente atributo. En este caso, el atributo comn entre las dos tablas (N cuenta) es el que permite relacionar los clientes con sus cuentas. Adems, lo normal es que cada tabla tenga un atributo o conjunto de atributos cuyo valor identifique de forma nica a los registros, este atributo es el que se denomina clave. En el caso de la tabla de

310

BASES DE DATOS RELACIONALES Y EL LENGUAJE SQL

clientes, el atributo DNI es una clave, ya que es imposible que dos clientes distintos tengan el mismo DNI. En la definicin de una base de datos relacional se debe indicar claramente la estructura de cada tabla, con los nombres y tipos de cada uno de sus atributos, as como las diferentes claves y otras restricciones sobre los mismos. El ejemplo anterior ilustra una situacin bastante simplificada que, por supuesto, tiene algunos inconvenientes que podran ser superados con una mejor eleccin de tablas. Por ejemplo, con el diseo anterior, cuando un cliente tiene ms de una cuenta, tal como ocurre en este caso, se duplican sus datos. La utilizacin de una tabla intermedia que sirva de enlace entre los DNI y los nmeros de cuenta evitara este problema. En definitiva, el correcto diseo de una base de datos no es algo trivial y requiere una cuidadosa planificacin. A este respecto existe una teora bastante desarrollada sobre el diseo de bases de datos para evitar las redundancias e inconsistencias: la teora de la normalizacin. No es el objetivo de este libro profundizar en aspectos de diseo de bases de datos, aquel lector que est interesado en estos temas puede acudir a la amplia bibliografa especfica.

13.2.2. DIAGRAMAS ENTIDAD/RELACIN


Los diseos de bases de datos suelen apoyarse en diagramas a travs de los cuales se tratan de visualizar las diferentes entidades que intervienen, las relaciones entre ellas y el tipo de estas relaciones. Estos grficos son de ayuda para decidir las distintas tablas que deben ser utilizadas en la base de datos. Existe una amplia variedad de herramientas, pertenecientes a la categora de las denominadas herramientas CASE (Computer Added Software Engineering), que permiten realizar estos grficos y al mismo tiempo generar la base de datos propiamente dicha. En la prxima seccin se utilizar precisamente una de estas herramientas para generar una base de datos que servir para desarrollar en torno a ella toda una aplicacin web.

13.3. UN EJEMPLO ILUSTRATIVO: CINEM@S


Supngase que la empresa Cinem@s, cuyo sitio web se comenz a desarrollar en el Captulo 3, est interesada en desarrollar un sistema para la consulta de la cartelera y compra de entradas a travs de Internet. Parece evidente que en este caso necesitar disponer de una base de datos con toda la informacin relativa a las diferentes proyecciones de cada sala y generar a partir de ella las pginas web de su portal. Haciendo uso de PHP y MySQL se podr disear no solo un sistema de consulta de

311

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

cartelera actualizada, sino tambin un sistema de consulta de horarios, bsquedas de pelculas, consulta de disponibilidades de salas, compra de entradas,... En esta seccin se presentar la estructura de la base de datos a crear, para en los captulos posteriores analizar la forma de administrar esa base de datos con MySQL, y llegar a efectuar operaciones de actualizacin y consulta desde las pginas del propio sitio web. Una vez presentada la estructura, se har un rpido repaso a las sentencias bsicas del lenguaje de definicin y manipulacin de datos SQL. Para comenzar es preciso identificar las entidades que intervienen en el problema planteado, en este caso, estas podran ser: 1. Las pelculas. 2. Las salas disponibles. 3. Las proyecciones. 4. Las entradas. 5. Los clientes. Cada una de las entidades se caracterizar por unos atributos, as cada pelcula tiene un ttulo, un director, una lista de actores, un gnero, un ao de realizacin,... A cada atributo se le asignar un tipo de datos concreto, as por ejemplo, el ttulo de una pelcula puede ser tratado como una cadena de un mximo de 50 caracteres, o el ao como un nmero entero. Una vez establecidos los atributos de cada entidad, el siguiente paso es definir las relaciones entre las tablas o entidades. La existencia de una relacin se concretar en la inclusin como atributo en una tabla de la clave de la tabla relacionada. La Figura 13.1 ilustra el modelo concreto de la base de datos que desarrollar, incluyendo las entidades con sus atributos y tipos respectivos, y sus relaciones.
La Figura 13.1 ha sido generada mediante la herramienta CASEstudio (http://www.casestudio.com). Con esta herramienta Case se pueden disear bases de datos y crear diagramas Entidad/Relacin soportando ms de 20 diferentes tipos de gestores de bases de datos, por ejemplo Oracle, MySQL, MSSQL, Interbase, SybaseASE y otros sistemas de bases de datos. Adems del diagrama entidad/relacin, CASEstudio permitir generar de forma automtica el cdigo SQL que construye toda la base de datos.

NOTA

312

BASES DE DATOS RELACIONALES Y EL LENGUAJE SQL

Figura 13.1 Diagrama entidad/relacin para la base de datos de Cinem@s

El tipo de relaciones que se aprecian en el diagrama entidad/relacin corresponden a lo que se suele denominar relaciones de uno a varios, por ejemplo, la relacin entre los clientes y las entradas establece que un cliente puede comprar todas las entradas que desee, pero una entrada puede ser adquirida solo por un nico cliente. Los atributos que en cada tabla aparecen sealados con las siglas PK (Primary Key) corresponden a las claves de cada una de ellas. En cambio, los sealados con FK (Foreign Key) corresponden a atributos que son claves en otras tablas (claves forneas) y sirven para relacionar los registros de una tabla con los de la subordinada. Los atributos que tendr cada una de las entidades consideradas son descritos en detalle en la Tabla 13.1 (entidad Pelculas), Tabla 13.2 (entidad Proyecciones), Tabla 13.3 (entidad Salas), Tabla 13.4 (entidad Entradas) y Tabla 13.5 (entidad Clientes).

313

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

ENTIDAD PELCULAS
Nombre de atributo IDPELICULA TITULO ACTORES PRODUCCION DIRECCION GUION ANNO DURACION NACIONALIDAD GENERO Tipo de datos Nmero entero Cadena de caracteres Cadena de caracteres Cadena de caracteres Cadena de caracteres Cadena de caracteres Nmero entero Nmero entero Cadena de caracteres Cadena de caracteres Descripcin Valor numrico que actuar de identificador de cada pelcula Ttulo de la pelcula Listado de actores de la pelcula que se presentarn separados por comas Productor, o productores, en su caso, de la pelcula Director o directores de la pelcula Guionista o guionistas de la pelcula Ao de realizacin de la pelcula Duracin de la pelcula en minutos Nacionalidad de la pelcula Gnero de la pelcula elegido entre una serie de opciones predeterminadas: drama, comedia, accin.... Opcin que establece restricciones de edad para los espectadores: apta, mayores de 7, mayores de 13, mayores de 18 Breve resumen de la pelcula Imagen del cartel promocional de la pelcula

EDAD_RESTRICCION Cadena de caracteres SINOPSIS CARTELERA Cadena de caracteres Imagen

Tabla 13.1 Atributos de la entidad Pelculas

ENTIDAD PROYECCIONES
Descripcin Valor numrico que actuar de IDPROY Nmero entero identificador de cada proyeccin Valor numrico que identifica la IDPELICULA Nmero entero pelcula que se proyectar Nmero de la sala en donde se NUM_SALA Nmero entero proyectar la pelcula HORA Hora Hora de inicio de la proyeccin FECHA Fecha Fecha de la proyeccin Indica si la proyeccin tiene o no una TARIFA_REDUCIDA Lgico(verdadero/falso) tarifa reducida, por ejemplo, sesiones matinales, proyecciones especiales,... Indica si la proyeccin es emitida como ESTRENO Lgico(verdadero/falso) estreno o no Tabla 13.2 Atributos de la entidad Proyecciones Nombre de atributo Tipo de datos

314

BASES DE DATOS RELACIONALES Y EL LENGUAJE SQL

ENTIDAD SALAS
Nombre de atributo NUM_SALA AFORO NUM_FILAS OBSERVACIONES Descripcin Valor numrico identificativo de cada Nmero entero sala Nmero entero Nmero total de asientos de la sala. Nmero entero Nmero total de filas de la sala Cadena de caracteres que permitir Cadena de caracteres almacenar cualquier tipo de observacin sobre la sala Tabla 13.3 Atributos de la entidad Salas Tipo de datos

ENTIDAD ENTRADAS
Nombre de atributo NUM_ENTRADA IDPROY FILA NUM_ASIENTO NUM_CLIENTE RECOGIDA Tipo de datos Nmero entero Nmero entero Nmero entero Nmero entero Nmero entero Lgico(verdadero/falso) Descripcin Valor numrico que actuar de identificador de cada entrada Valor numrico que identifica la proyeccin correspondiente Nmero de fila de la entrada Nmero de asiento de la entrada Valor numrico que identifica al cliente que compra la entrada Indica si la entrada ha sido recogida o no por el cliente

Tabla 13.4 Atributos de la entidad Entradas

ENTIDAD CLIENTES
Nombre de atributo NUM_CLIENTE NOMBRE DIRECCION FECHANAC TELEF EMAIL PUNTOS_ACUM Tipo de datos Nmero entero Cadena de caracteres Cadena de caracteres Fecha Cadena de caracteres Cadena de caracteres Nmero entero Descripcin Valor de tipo numrico que actuar de identificacin del cliente. Nombre del cliente Direccin postal del cliente Indica la fecha de nacimiento del cliente Telfono del cliente. Direccin de e-mail del cliente Valor numrico que almacenar el nmero total de puntos que va acumulando el espectador por la compra de entradas Indica una clave secreta que el cliente tendr que utilizar para realizar cualquier operacin de compra de entradas

CLAVE

Cadena de caracteres

Tabla 13.5 Atributos de la entidad Clientes

315

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

En las prximas secciones se ver la forma en la que la base de datos diseada puede ser implementada en un sistema gestor como MySQL, para ello ser preciso estudiar previamente, y de forma breve, las sentencias bsicas del lenguaje SQL.

13.4. EL LENGUAJE SQL


13.4.1. INTRODUCCIN
SQL es un lenguaje de definicin y manipulacin de datos para bases de datos relacionales. Es un lenguaje de definicin porque permite definir la estructura de las tablas que componen la base de datos, y de manipulacin porque permite efectuar consultas y realizar operaciones como insercin, borrado y actualizacin de los datos que contiene. El lenguaje SQL tiene sus orgenes en el lenguaje SEQUEL (Structured English QUEry Language) desarrollado por IBM, un lenguaje para la especificacin de las caractersticas de las bases de datos que adoptaban el modelo relacional. En 1979 aparece el primer SGBD basado en SQL: ORACLE. Rpidamente comenzaron a aparecer en el mercado mltiples productos de bases de datos basados en SQL: SQL/DS, DB2, SYBASE, INTERBASE, INFORMIX y otros. El amplio desarrollo del lenguaje hizo necesario un proceso de estandarizacin para conseguir que el SQL soportado por los distintos sistemas tuviera una sintaxis comn. Las caractersticas destacables de este lenguaje son: Posee una firme base terica. Gran capacidad expresiva. Flexibilidad. Sus sentencias permiten manejar conjuntos de registros. Tiene una estructura simple. Alta productividad en la codificacin (con una sola sentencia pueden efectuarse consultas complejas). SQL no es un lenguaje de programacin (su cdigo no necesita compilarse).

SQL puede usarse de dos maneras:

316

BASES DE DATOS RELACIONALES Y EL LENGUAJE SQL

Interactivamente, escribiendo directamente las sentencias y obteniendo automticamente el resultado. Es decir, como lenguaje autocontenido. Como lenguaje embebido en un lenguaje de programacin anfitrin (4GL, Cobol, Fortran, C, Basic,...). De esta forma SQL se complementa con la capacidad expresiva, lgica y de clculo del lenguaje anfitrin. Este uso est reservado para los usuarios programadores.

En este libro se utilizar el SQL embebido dentro de programas PHP y tambin se har un uso interactivo a travs de la lnea de comandos de MySQL.

13.4.2. SENTENCIAS DE DEFINICIN DE DATOS Creacin de la base de datos


Las sentencias SQL de definicin de datos permiten crear la base de datos y los diferentes objetos que la componen, como por ejemplo, tablas, vistas, ndices, etc. La sentencia utilizada para la creacin de objetos es CREATE. La creacin de un objeto requiere la asignacin de un nombre que lo identifique una vez creado, cualquier referencia posterior a l hace uso de ese identificador. Los identificadores en SQL deben estar formados por letras, dgitos o signos de subrayado, pero siempre comenzando por una letra y, por supuesto, sin coincidir con ninguna de las palabras reservadas del lenguaje. El primer objeto a crear es la propia base de datos, para ello se utilizar el siguiente comando:
CREATE DATABASE nombre_base_de_datos

Donde nombre_base_de_datos es el identificador escogido para referenciar a la base de datos que se est creando. Ejemplo 13.2: Para crear la base de datos de la empresa Cinem@s que se utilizar a lo largo de los prximos captulos, la sentencia es la siguiente:
CREATE DATABASE CINEMAS;

317

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Todo objeto creado con la sentencia CREATE puede ser modificado con la sentencia ALTER o destruido con la sentencia DROP, de manera que, si se quisiera destruir la bases de datos anterior, la sentencia a utilizar sera:
DROP DATABASE CINEMAS;

NOTA

El lenguaje SQL no distingue el uso de maysculas y minsculas. En este libro se utilizar como convenio las maysculas para escribir todas las sentencias SQL, de esta manera sern ms fcilmente identificables.

Creacin de tablas
Una vez creada la base de datos, el paso siguiente es la creacin de la estructura de cada una de sus tablas. La sintaxis ms simple de la sentencia de creacin de tablas es la siguiente:
CREATE TABLE nombre_tabla (atrib1 dominio1, atrib2 dominio2, ............... ............... ............... atribN dominioN)

donde: nombre_tabla atribX dominioX es el identificador utilizado para referirse a la tabla. es el nombre de un atributo de la tabla. es el dominio en el que puede tomar valores el atributo correspondiente.

Respecto a los dominios de los atributos, SQL incorpora un conjunto de dominios bsicos, permitiendo definir atributos de tipo cadena de caracteres, de tipo numrico, de fecha y hora,... Adems de indicar el dominio de cada atributo, a la hora de definir las tablas pueden sealarse igualmente diferentes caractersticas de los mismos, como por ejemplo si no se permitirn valores nulos para ese atributo, si el valor debe ser nico, valores por defecto,...

318

BASES DE DATOS RELACIONALES Y EL LENGUAJE SQL

Ejemplo 13.3: El cdigo SQL que crea la tabla de la base de datos Cinem@s correspondiente a la entidad Clientes sera:
CREATE TABLE CLIENTES ( NUM_CLIENTE SMALLINT NOT NULL AUTO_INCREMENT, NOMBRE VARCHAR(40) NOT NULL, DIRECCION VARCHAR(50), FECHANAC DATE, TELEF CHAR(9), EMAIL CHAR(30), PUNTOS_ACUM SMALLINT NOT NULL DEFAULT 0, CLAVE CHAR(6) NOT NULL, PRIMARY KEY (NUM_CLIENTE));

En el cdigo anterior puede observarse cmo cada atributo tiene asociado un tipo de dato; por ejemplo, el atributo NOMBRE ser una cadena de un mximo de 40 caracteres (VARCHAR(40)), el atributo NUM_CLIENTE tendr un valor numrico de tipo entero en un rango pequeo (SMALLINT), o la fecha de nacimiento tendr un valor de tipo fecha (DATE). En el captulo destinado al estudio del sistema gestor MySQL se presentarn con detalle todos los tipos de datos admitidos. En la definicin de la tabla CLIENTES se observa igualmente cmo alguno de los atributos tienen a continuacin de su tipo las palabras NOT NULL; se trata de palabras reservadas del lenguaje SQL que indican que el correspondiente atributo no puede tomar valores nulos, es decir, todos los registros que sean incluidos en la tabla debern tener obligatoriamente un valor para ese atributo. Por ejemplo, en la tabla CLIENTES, tal como est definida, los nicos atributos que obligatoriamente deben tener un valor son: NUM_CLIENTE, NOMBRE, PUNTOS_ACUM y CLAVE, de manera que a la hora de dar de alta un nuevo cliente no sera necesario dar su direccin de correo electrnico o telfono, por ejemplo. Sobre el atributo NUM_CLIENTE de la tabla CLIENTES se deben hacer dos observaciones adicionales. Por un lado, en la ltima lnea de la definicin de la tabla se establece como clave de la tabla (PRIMARY KEY) precisamente ese atributo; de esta manera el nmero de cliente identificar a cada cliente. Adems de eso, en la definicin del atributo se ha utilizado la palabra AUTO_INCREMENT para indicar que el valor de ese atributo en cada registro se generar de forma automtica de manera incremental. Finalmente, la palabra DEFAULT se utiliza para dar valores por defecto a determinado atributo, de manera que si al crear un registro no se da valor a ese

319

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

atributo este tomar el valor por defecto. Tal como se aprecia en la definicin de la tabla CLIENTES, el nico atributo que tiene valor por defecto es PUNTOS_ACUM, siendo este valor 0; esto provoca que cuando se produzca el alta de un nuevo cliente, su saldo de puntos acumulados sea 0, a no ser que se d otro valor. La sentencia CREATE crea la estructura de la tabla pero no su contenido, es decir, sus registros. Estos debern ser aadidos posteriormente mediante la instruccin INSERT. Esta sentencia INSERT podr ser usada de forma interactiva o bien dentro de un programa que se encargue de leer los datos a insertar, por ejemplo de un fichero existente creado al efecto. Ejemplo 13.4: A continuacin se incluye el cdigo SQL completo de generacin de todas las tablas de la base de datos CINEMAS:
CREATE TABLE PELICULAS ( IDPELICULA SMALLINT NOT NULL AUTO_INCREMENT, TITULO CHAR(50) NOT NULL, ACTORES MEDIUMTEXT, PRODUCCION MEDIUMTEXT, DIRECCION MEDIUMTEXT, GUION VARCHAR(40), ANNO SMALLINT, DURACION SMALLINT NOT NULL, NACIONALIDAD VARCHAR(25), GENERO ENUM('infantil','comedia','drama', 'accin','terror','ertica'), EDAD_RESTRICCION ENUM('apta','mayores 7', 'mayores 13','mayores 18'), SINOPSIS LONGTEXT, CARTELERA BLOB, PRIMARY KEY (IDPELICULA)); CREATE TABLE SALAS ( NUM_SALA SMALLINT NOT NULL, AFORO SMALLINT NOT NULL, NUM_FILAS SMALLINT NOT NULL, OBSERVACIONES LONGTEXT, PRIMARY KEY (NUM_SALA)); CREATE TABLE PROYECCIONES ( IDPROY SMALLINT NOT NULL AUTO_INCREMENT, IDPELICULA SMALLINT NOT NULL, NUM_SALA SMALLINT NOT NULL,

320

BASES DE DATOS RELACIONALES Y EL LENGUAJE SQL

HORA TIME NOT NULL, FECHA DATE NOT NULL, TARIFA_REDUCIDA BOOL, ESTRENO BOOL, PRIMARY KEY (IDPROY)); CREATE TABLE ENTRADAS ( NUM_ENTRADA SMALLINT NOT IDPROY SMALLINT NOT NULL FILA SMALLINT NOT NULL , NUM_ASIENTO SMALLINT NOT NUM_CLIENTE SMALLINT NOT RECOGIDA BOOL , PRIMARY KEY (NUM_ENTRADA));

NULL AUTO_INCREMENT, , NULL , NULL ,

CREATE TABLE CLIENTES ( NUM_CLIENTE SMALLINT NOT NULL AUTO_INCREMENT, NOMBRE VARCHAR(40) NOT NULL, DIRECCION VARCHAR(50), FECHANAC DATE, TELEF CHAR(9), EMAIL CHAR(30), PUNTOS_ACUM SMALLINT NOT NULL DEFAULT 0, CLAVE CHAR(6) NOT NULL, PRIMARY KEY (NUM_CLIENTE));

NOTA

Para mejorar la legibilidad, las sentencias SQL pueden partirse en tantas lneas como se desee y utilizar todos los espacios en blanco extra que se quiera.

Modificacin de tablas
Una vez creada una tabla, es posible su modificacin utilizando la sentencia ALTER. Ejemplo 13.5: A continuacin se incluyen algunos ejemplos de usos de la sentencia ALTER para modificar la tabla CLIENTES:

321

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Cambio del nombre de la tabla CLIENTES:


ALTER TABLE CLIENTES RENAME TABLA_CLIENTES;

Cambio del nombre de un atributo de la tabla CLIENTES:


ALTER TABLE CLIENTES CHANGE FECHANAC FNACIMIENTO DATE;

Cambio del tipo de dato de un atributo de la tabla CLIENTES:


ALTER TABLE CLIENTES CHANGE CLAVE CLAVE VARCHAR(10);

Aadir un nuevo atributo a la tabla CLIENTES:


ALTER TABLE CLIENTES ADD E_CIVIL ENUM('soltero','casado', 'otros');

Eliminacin de un atributo de la tabla CLIENTES:


ALTER TABLE CLIENTES DROP E_CIVIL;

Creacin de ndices
Otro de los aspectos a considerar a la hora de construir las tablas de la base de datos es la posibilidad de definir ndices. Un ndice es un archivo estructurado que facilita el acceso a los datos en las operaciones de bsqueda. Los ndices se deben crear sobre aquellos atributos que suelen ser utilizados con frecuencia en las bsquedas. Normalmente los sistemas gestores crean automticamente un ndice sobre los atributos declarados como claves, y el programador puede optar por aadir nuevos ndices, pero siempre con precaucin de no abusar de su uso, ya que si se tienen demasiados ndices la gestin de los datos se hace ms costosa. Los ndices son creados, como cualquier elemento, con la sentencia CREATE, aunque con una sintaxis diferente. Ejemplo 13.6: A continuacin se incluyen dos ejemplos de creacin de ndices, uno sobre el atributo FECHA de la tabla PROYECCIONES y otro sobre el atributo TITULO de la tabla PELICULAS:

322

BASES DE DATOS RELACIONALES Y EL LENGUAJE SQL

CREATE INDEX FECHA_IDX ON PROYECCIONES(FECHA); CREATE INDEX TITULO_IDX ON PELICULAS(TITULO);

Tambin es posible utilizar la sentencia ALTER para aadir un ndice a una tabla creada previamente; por ejemplo:
ALTER TABLE CLIENTES ADD INDEX (NOMBRE);

Claves ajenas: relaciones entre tablas


En la definicin de tablas se pueden definir claves ajenas (FOREIGN KEY), es decir, atributos que son claves primarias de otras tablas, de esta manera ambas tablas quedan relacionadas. La forma de hacerlo es incluir en la definicin de la tabla una instruccin con la siguiente sintaxis:
FOREIGN KEY (atributo) REFERENCES Tabla_enlazada (atributo)

Ejemplo 13.7: En la tabla de PROYECCIONES se incluy un atributo (IDPELICULA) que haca referencia a otro atributo, en este caso del mismo nombre, de la tabla PELICULAS. En principio, si no se definen claves ajenas podra darse la situacin de existir una proyeccin con un cdigo de pelcula inexistente en la tabla de pelculas, con la correspondiente inconsistencia. La forma de evitar este problema es definir precisamente en la tabla de proyecciones el correspondiente atributo como una clave ajena que referencia a la tabla de pelculas. Como la tabla ya ha sido creada, esta modificacin se puede realizar mediante la sentencia ALTER:
ALTER TABLE PROYECCIONES ADD FOREIGN KEY (IDPELICULA) REFERENCES PELICULAS (IDPELICULA);

Otra posibilidad es definir las claves ajenas de cada tabla de la misma manera en la que se definen las claves primarias en la propia definicin de la tabla. Ejemplo 13.8: La tabla de ENTRADAS podra haber sido definida incluyendo dos claves ajenas, una referenciando a las proyecciones y otra a los clientes:
CREATE TABLE ENTRADAS ( NUM_ENTRADA SMALLINT NOT NULL AUTO_INCREMENT,

323

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

IDPROY SMALLINT NOT NULL , FILA SMALLINT NOT NULL , NUM_ASIENTO SMALLINT NOT NULL , NUM_CLIENTE SMALLINT NOT NULL , RECOGIDA BOOL , PRIMARY KEY (NUM_ENTRADA), FOREIGN KEY (IDPROY) REFERENCES PROYECCIONES (IDPROY), FOREIGN KEY (NUM_CLIENTE) REFERENCES CLIENTES (NUM_CLIENTE) );

Cuando se produce una operacin de modificacin o borrado de los datos de una tabla que se encuentra relacionada con otra, puede ser necesario que se produzca una actualizacin en cascada de la tabla relacionada. Ejemplo 13.9: Si una pelcula es dada de baja en la tabla PELICULAS, entonces se deberan eliminar de la tabla de PROYECCIONES todos aquellos registros que hacan referencia a esa pelcula. La forma en la que se indica esta necesidad de borrado en cascada es:
ALTER TABLE PROYECCIONES ADD FOREIGN KEY (IDPELICULA) REFERENCES PELICULAS (IDPELICULA) ON DELETE CASCADE ON UPDATE CASCADE;

En otros casos puede ser interesante que no se borren los registros relacionados y que simplemente a los campos que han quedado con un valor no existente les sean asignados el valor NULL, o incluso, que se queden con el valor inicial a pesar de su inconsistencia. Para hacer esto, en la sentencia anterior debera cambiarse la palabra CASCADE por SET NULL, en el primer caso, o NO ACTION, en el segundo.

NOTA

La forma en la que se trabaja con claves ajenas en MySQL es un tanto especial, por lo que se analizar con ms detalle cuando se estudie la integridad referencial en el captulo dedicado al sistema gestor MySQL.

13.4.3. LA SENTENCIA INSERT


Una vez creadas la base de datos y sus tablas, el siguiente paso es aadir los datos, ya que toda tabla generada con CREATE estar vaca.

324

BASES DE DATOS RELACIONALES Y EL LENGUAJE SQL

La sentencia INSERT permite aadir una o varias filas (registros) a una tabla. En la prctica, para insertar datos en una base de datos se utilizan programas de entrada orientados a formularios o rutinas que importan los datos desde ficheros o documentos, realizando procesos iterativos de lectura de datos. Uno de los objetivos finales que persigue este libro es poder realizar esas operaciones de insercin desde una pgina web, para ello ser preciso utilizar las sentencias SQL en programas PHP que a su vez estarn integrados en documentos HTML. La sintaxis bsica de la sentencia INSERT es la siguiente:
INSERT INTO nombre_tabla VALUES (lista_de_valores)

Con esta sintaxis, deben ser introducidos tantos valores como atributos de la tabla; adems, los valores deben darse en el mismo orden en el que se encuentren definidos los respectivos atributos. Por supuesto, los valores introducidos deben coincidir con el tipo del correspondiente atributo. SQL admite un valor especial, el valor NULL, que indica que el correspondiente atributo est vaco en el registro insertado. nicamente pueden utilizarse estos valores nulos sobre atributos que no tengan en su declaracin la clusula NOT NULL. Debe aclararse tambin que las filas de una tabla no estn ordenadas, por lo que no es posible insertar una fila "al comienzo" o "al final" o "entre dos filas" de la tabla. Ejemplo 13.10: A continuacin se muestran dos ejemplos de insercin de registros en la tabla SALAS y en la tabla CLIENTES:
INSERT INTO SALAS VALUES (1, 300, 15, 'Zona para minusvlidos');

Esta sentencia insertara una nueva sala, cuyo nmero correspondera al 1, con capacidad para 300 personas, distribuidas en 15 filas y se incluira en el campo de observaciones el hecho de tener una zona reservada para minusvlidos.
INSERT INTO CLIENTES VALUES (147, 'Luis Medina Ros', 'Los Laureles, 129 39005 Santander', '1965-2-21', '942323135', 'medinal@mimail.com', 0, 'lmr65b');

325

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Esta sentencia inserta un nuevo cliente con nmero de identificacin 147, de nombre "Luis Medina Ros", con la direccin indicada, nacido el 21 de febrero de 1965, siendo su telfono 942323135, su direccin de correo electrnico medinal@mimail.com, con un saldo de puntos inicial de 0 y con clave de operaciones 'lmr65b'.

NOTA

En SQL las cadenas de caracteres deben darse entre comillas simples. Las fechas y horas tambin son dadas entre comillas y en principio se pueden utilizar diferentes formatos. Al analizar el sistema MySQL se indicarn estos formatos.

En la ltima insercin realizada en la tabla CLIENTES se puede observar cmo, a pesar de que el atributo NUM_CLIENTE haba sido definido como autoincremental y el atributo PUNTOS_ACUM tena un valor por defecto de 0, al insertar el registro se asignaron tambin valores para esos dos atributos. Surge, a la vista de esta situacin, la necesidad de disponer de una sintaxis adicional de la sentencia INSERT que permita insertar valores solo para determinados atributos. En este caso, a la hora de insertar el registro se debern indicar los nombres de los atributos, sin ser necesario que el orden de los valores a incluir y el de los atributos en la tabla coincidan. La sintaxis de esta variante es:
INSERT INTO nombre_tabla (lista_atributos) VALUES (lista_valores)

Ejemplo 13.11: Se podra insertar un nuevo cliente en la tabla con la sentencia:


INSERT INTO CLIENTES (NOMBRE, FECHANAC, EMAIL, CLAVE) VALUES ('Andrea Fuentes Dvila', '1970-3-31', 'afd@tumail.com', 'and349');

Como puede observarse, en este caso no se dan valores para todos los atributos de la tabla. En concreto, el atributo NUM_CLIENTE al no tener valor y haber sido declarado como autoincremental, tomar automticamente como valor el nmero siguiente al valor ms alto que se encuentre almacenado en la columna NUM_CLIENTE de la tabla hasta ese momento. El atributo PUNTOS_ACUM, al no habrsele dado ningn valor y tener definido uno por defecto, tomar automticamente este ltimo (0 en este caso). Al resto de atributos a los que no se

326

BASES DE DATOS RELACIONALES Y EL LENGUAJE SQL

les ha dado valor (DIRECCION y TELEFONO) se les asignar automticamente el valor especial NULL, siempre y cuando el correspondiente atributo admita ese valor. Ejemplo 13.12: Se incluye a continuacin una sentencia que permitira dar de alta una nueva sala:
INSERT INTO SALAS (AFORO, NUM_FILAS, NUM_SALA) VALUES (400, 20, 3);

Como se aprecia, no se dan valores a todos los atributos (faltara el atributo OBSERVACIONES) y adems el orden en el que se dan los valores no coincide con el orden de los atributos en la tabla. Otra de las posibilidades de insercin de datos es la utilizacin de la conocida como "sentencia de insercin multifila". Esta sentencia permite aadir mltiples filas a una tabla en una sola sentencia. En este caso los valores para las nuevas filas no son especificados explcitamente, sino que se utiliza una consulta (sentencia SELECT) para obtener esos valores. Su sintaxis es:
INSERT INTO nombre_tabla (lista_atributos) Consulta_SELECT

La sentencia INSERT multifila proporciona un modo eficiente y compacto de copiar datos. Ejemplo 13.13: Si se dispone de una tabla adicional PELICULAS_TERROR para guardar en ella todas las pelculas del gnero de terror con una estructura totalmente similar a la de la tabla PELICULAS, estas podran insertarse con una sentencia como la que sigue:
INSERT INTO PELICULAS_TERROR SELECT * FROM PELICULAS WHERE GENERO = 'terror';

En este caso, el uso del signo "*" es una forma de indicar todos los atributos de la tabla.

327

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

13.4.4. LA SENTENCIA DELETE


Por supuesto, todo registro almacenado en una tabla puede ser eliminado en cualquier momento. La sentencia que permite eliminar una o varias filas de una tabla es DELETE, cuya sintaxis es: DELETE FROM nombre_tabla WHERE condicin Esta sentencia elimina de la tabla indicada todas las filas que cumplan la condicin sealada. Si se suprime la clusula WHERE, se borrarn todas las filas de la tabla, pero no la tabla; recurdese que la instruccin que destruye completamente la tabla (datos y estructura) es DROP TABLE. Las filas no pueden borrarse parcialmente, es decir, no pueden suprimirse valores concretos de una fila. Ejemplo 13.14:
Las sentencias de eliminacin de registros seran:

Eliminacin del cliente nmero 1456:


DELETE FROM CLIENTES WHERE NUM_CLIENTE = 1456;

Eliminacin de las entradas de las primeras 5 filas para la proyeccin nmero 231:
DELETE FROM ENTRADAS WHERE FILA <= 5 AND IDPROY = 231;

Las sentencias DELETE con condiciones simples permiten seleccionar las filas a suprimir basndose nicamente en los propios contenidos de las filas. Sin embargo, tambin es posible efectuar la seleccin de las filas a suprimir en base a los datos contenidos en otras tablas. Ejemplo 13.15: Si se desea eliminar todas las proyecciones de la pelcula Refugio en el paraso, se podra utilizar la sentencia:
DELETE FROM PROYECCIONES WHERE IDPELICULA = (SELECT IDPELICULA FROM PELICULAS WHERE TITULO = 'Refugio en el paraso');

328

BASES DE DATOS RELACIONALES Y EL LENGUAJE SQL

13.4.5. LA SENTENCIA UPDATE


La sentencia UPDATE permite modificar los valores de los atributos de uno o varios registros almacenados en la tabla. La sintaxis de la sentencia es:
UPDATE nombre_tabla SET lista_asignaciones WHERE condicin

La parte final de la sentencia, la clusula WHERE es opcional; en caso de no indicarse, la actualizacin afectara a todos los registros de la tabla.
En una misma sentencia se pueden actualizar los valores de varios atributos, indicando las asignaciones separadas por comas.

Ejemplo 13.16: Sentencias de actualizacin de registros seran: Reduccin del aforo de todas las salas en un 10%:
UPDATE SALAS SET AFORO = AFORO * 0.9;

Otorgar 100 puntos extra a todos los clientes que tengan un saldo de puntos acumulados menor que 500:
UPDATE CLIENTES SET PUNTOS_ACUM = PUNTOS_ACUM + 100 WHERE PUNTOS_ACUM < 500;

Modificar el aforo y el nmero de filas de la sala nmero 7:


UPDATE SALAS SET AFORO = 500, FILAS = 25 WHERE NUM_SALA = 7;

Al igual que ocurra con la sentencia DELETE, tambin es posible efectuar la seleccin de las filas a actualizar en base a los datos contenidos en otras tablas. Ejemplo 13.17: Se desea establecer tarifa reducida para todas las proyecciones de pelculas rodadas antes de 1990, la sintaxis de la sentencia sera:
UPDATE PROYECCIONES SET TARIFA_REDUCIDA = 1 WHERE IDPELICULA =

329

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

(SELECT IDPELICULA FROM PELICULAS WHERE ANNO < 1990); El tipo booleano o lgico no es uno de los tipos estndar de SQL; en el caso de MySQL, se dispone del tipo BOOL que realmente es un sinnimo del tipo TINYINT(1) que permite almacenar un nmero entero de 1 bit (0 1). El valor 1 puede identificarse con el valor lgico "verdadero" y el valor 0 con "falso".

NOTA

13.4.6. LA SENTENCIA SELECT


Las consultas son la base del SQL, mediante ellas se extrae informacin de las diferentes tablas de la base de datos, mostrndola en una estructura tabular. Toda consulta en SQL se realiza con la sentencia SELECT. Esta es sin duda la sentencia ms poderosa y completa con la que cuenta el lenguaje SQL. Su sintaxis completa es:
SELECT [Cuantificador_de_conjunto] items FROM Nombre_de_tabla [WHERE Condicin_de_bsqueda] [GROUP BY Columna_de_agrupacin] [HAVING Condicin_de_bsqueda] [ORDER BY Especificacin_de_ordenacin]

Todos los fragmentos que en esta sintaxis aparecen encerrados entre corchetes son opcionales. La sentencia SELECT consta de varias partes diferentes: Clusula SELECT: en ella se indican los datos a recuperar en la consulta. Los items indicados deben ir separados por comas y pueden ser: o Un nombre de columna (atributo) de una tabla. o Un asterisco (*), que es equivalente a especificar los nombres de todas las columnas de la tabla. o Una constante, indicando que el mismo valor constante va a aparecer en todas las filas de los resultados de la consulta. o Una expresin SQL, cuyo valor ser calculado a partir de los valores de los atributos. El cuantificador de conjunto es opcional, puede ser:

330

BASES DE DATOS RELACIONALES Y EL LENGUAJE SQL

o o

ALL (opcin por defecto): indica que en el resultado de la consulta deben mostrarse todas las filas, incluyendo las repetidas. DISTINCT: indica que en el resultado de la consulta no deben mostrarse las filas repetidas.

Clusula FROM: en ella se indican, separadas por comas, las tablas que contienen los datos que se desean recuperar en la consulta. Clusula WHERE: permite indicar una condicin de bsqueda. Clusula GROUP BY: permite obtener consultas resumen en las que todas las filas similares son agrupadas y se genera una fila resumen para cada grupo. Clusula HAVING: permite indicar condiciones o filtros a verificar por los diferentes grupos producidos por la clusula GROUP BY. Clusula ORDER BY: seala el modo de ordenacin de los resultados de la consulta. Si se omite, los resultados no aparecen ordenados.

Proyecciones de una tabla


Las nicas clusulas obligatorias son SELECT y FROM. Con esta sintaxis mnima se pueden generar las consultas ms sencillas en SQL, las proyecciones de una tabla, es decir, aquellas que solicitan columnas de datos de una nica tabla en la base de datos. La sintaxis mnima es:
SELECT lista_columnas FROM nombre_de_tabla

Ejemplo 13.18: Si se quisiera recuperar todos los registros de la tabla PELICULAS, se debera utilizar la sentencia:
SELECT * FROM PELICULAS;

En cambio, si lo nico que interesa es obtener un listado con los ttulos y nacionalidades de las pelculas, la sentencia a utilizar sera:
SELECT TITULO, NACIONALIDAD FROM PELICULAS;

331

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Una consulta SQL puede incluir columnas calculadas cuyos valores se obtienen a partir de los valores de los datos almacenados. Ejemplo 13.19: Se desea listar las salas disminuyendo el aforo en un 10%, la sentencia para ello sera:
SELECT NUM_SALA, AFORO * 0.9 FROM SALAS;

En estas consultas con campos calculados pueden utilizarse diferentes funciones de SQL adems de las propias de cada gestor de bases de datos. Por ejemplo, existen funciones para tratamiento de fechas y horas, para tratamiento de cadenas de caracteres,...

Eliminacin de duplicados
Si una consulta incluye la clave primaria de una tabla en su lista de seleccin, entonces cada fila de resultados ser nica; en cambio, si no se incluye la clave en la lista de seleccin pueden aparecer filas duplicadas en el resultado. Se pueden eliminar las filas duplicadas en la consulta insertando la palabra clave DISTINCT en la sentencia SELECT justo antes de la lista de seleccin. Ejemplo 13.20: Al seleccionar todos los directores de las pelculas de la tabla PELICULAS pueden aparecer algunos de ellos duplicados (los que han dirigido varias pelculas), por tanto habra dos opciones para esta consulta: Listar todos los directores de pelculas aunque se produzca duplicidad de informacin:
SELECT DIRECTOR FROM PELICULAS;

Listar todos los directores de pelculas, sin duplicidad:


SELECT DISTINCT DIRECTOR FROM PELICULAS;

Consultas con condiciones de seleccin


Para especificar condiciones de seleccin en las consultas se utiliza la clusula WHERE. En este caso el resultado de la consulta estar formado por todas las filas que cumplan la condicin de bsqueda especificada.

332

BASES DE DATOS RELACIONALES Y EL LENGUAJE SQL

Ejemplo 13.21: Algunas consultas con condiciones de seleccin seran: Obtener los ttulos de todas las pelculas de una duracin inferior a 120 minutos:
SELECT TITULO FROM PELICULAS WHERE DURACION < 120;

Obtener un listado con las direcciones de correo electrnico de todos los clientes que tengan 1.000 puntos acumulados:
SELECT EMAIL FROM CLIENTES WHERE PUNTOS_ACUM = 1000;

Seleccionar las entradas para la proyeccin de nmero de identificacin 341 y que correspondan a filas comprendidas entre la 10 y la 14:
SELECT * FROM ENTRADAS WHERE IDPROY = 341 AND FILA BETWEEN 10 AND 14;

Obtener los ttulos de todas las pelculas de nacionalidad espaola, francesa o italiana:
SELECT TITULO FROM PELICULAS WHERE NACIONALIDAD IN ('espaola','francesa','italiana');

Generar un listado con los ttulos y directores de todas las pelculas en las que participe Antonio Banderas:
SELECT TITULO,DIRECCION FROM PELICULAS WHERE ACTORES LIKE '%Banderas%';

Como se puede apreciar en estos ejemplos, el lenguaje SQL tiene una sintaxis muy similar al lenguaje natural, y ofrece una gran capacidad expresiva para generar consultas.

Ordenacin de los resultados de una consulta


Para ordenar los resultados de una consulta se utiliza la clusula ORDER BY seguida de una lista de especificaciones de ordenacin separadas por comas. La primera especificacin de ordenacin es la principal y las otras sern utilizadas en caso de igualdad de valor en la primera. Cada especificacin de ordenacin est dada por el nombre de un atributo seguido de una de las palabras siguientes:

333

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

ASC DESC

Indica orden ascendente. Indica orden descendente.

En caso de no indicar el tipo de orden, por defecto se entiende que es ascendente. Ejemplo 13.22: Se desea generar un listado de clientes en orden decreciente segn el atributo de puntos acumulados y en orden creciente segn el nombre, la sentencia sera:
SELECT * FROM CLIENTES ORDER BY PUNTOS_ACUM DESC,NOMBRE ASC;

Consultas multitabla
SQL permite tambin recuperar datos procedentes de diferentes tablas mediante una nica sentencia SELECT, esto es lo que se conoce como "composicin". Ejemplo 13.23: A continuacin se presentan algunos sencillos ejemplos de consultas multitabla: Se desea saber todas las fechas en las que se proyecta la pelcula El Seor de los Anillos:
SELECT FECHA FROM PELICULAS,PROYECCIONES WHERE TITULO = 'El Seor de los Anillos' AND PELICULAS.IDPELICULA = PROYECCIONES.IDPELICULA;

En este caso, la consulta utiliza dos tablas y es preciso en la condicin de seleccin indicar la igualdad entre los dos atributos comunes a las dos tablas. Se desea un listado con los nombres de todos los clientes que hayan adquirido alguna entrada para ver la pelcula El Seor de los Anillos:
SELECT NOMBRE FROM PELICULAS,PROYECCIONES,ENTRADAS,CLIENTES WHERE TITULO = 'El Seor de los Anillos' AND PELICULAS.IDPELICULA = PROYECCIONES.IDPELICULA AND PROYECCIONES.IDPROY = ENTRADAS.IDPROY AND ENTRADAS.NUM_CLIENTE = CLIENTES.NUM_CLIENTE;

334

BASES DE DATOS RELACIONALES Y EL LENGUAJE SQL

NOTA

Al intervenir en las consultas anteriores columnas o atributos con el mismo nombre, aunque en tablas diferentes, es necesario utilizar los nombres cualificados, es decir, precedidos de los nombres de las tablas a las que pertenecen. An cuando no exista conflicto de nombres, tambin es posible utilizar los nombres cualificados y evitar ambigedades.

Consultas resumen
SQL permite resumir los datos mediante un conjunto de funciones denominadas funciones de columna. Algunas de ellas son:
SUM() AVG() MIN() MAX() COUNT() Calcula la suma total de los valores de una columna. Calcula el valor promedio de una columna. Encuentra el valor ms pequeo de una columna. Encuentra el valor ms grande de una columna. Cuenta el nmero de valores de una columna.

Ejemplo 13.24: A continuacin se muestran ejemplos de consultas resumen:

Clculo de la duracin media de todas las pelculas del gnero comedia:


SELECT AVG(DURACION) FROM PELICULAS WHERE GENERO = 'comedia';

Obtencin de la capacidad de aforo de la sala ms grande:


SELECT MAX(AFORO) FROM SALAS;

Clculo de la suma de los puntos acumulados por los clientes nmero 321, 543, 287 y 721:
SELECT SUM(PUNTOS_ACUM) FROM CLIENTES WHERE NUM_CLIENTE IN (321,543,287,721);

Obtener el nmero total de pelculas de nacionalidad espaola:


SELECT COUNT(*) FROM PELICULAS WHERE NACIONALIDAD = 'espaola';

335

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Consultas agrupadas
Las consultas agrupadas o resumen producen una nica fila de resultados a modo de "totales"; sin embargo, en ocasiones es interesante obtener resmenes parciales o agrupados por categoras. Esto se consigue con la clusula GROUP BY. Ejemplo 13.25: Dos ejemplos de consultas agrupadas seran las siguientes: Obtener para cada gnero de pelculas, la duracin mxima:
SELECT MAX(DURACION) FROM PELICULAS GROUP BY GENERO;

Contar el nmero de entradas compradas por cada cliente:


SELECT NOMBRE, COUNT(NUM_ENTRADA) FROM CLIENTES,ENTRADAS WHERE CLIENTES.NUM_CLIENTE = ENTRADAS.NUM_CLIENTE GROUP BY NOMBRE;

Condiciones de bsqueda de grupos


De la misma manera que en las consultas agrupadas la clusula WHERE puede ser utilizada para rechazar filas individuales, la clusula HAVING puede emplearse para rechazar grupos de filas. El formato de la clusula HAVING es similar a la clusula WHERE y permite indicar una condicin de bsqueda para grupos. A diferencia de lo que ocurra en la clusula WHERE, s es posible utilizar funciones de columna en la condicin de la clusula HAVING. Ejemplo 13.26: Se desea obtener el nombre de todos los clientes que hayan adquirido 20 o ms entradas; la forma de conseguirlo sera utilizando la sentencia:
SELECT NOMBRE, COUNT(NUM_ENTRADA) FROM CLIENTES,ENTRADAS WHERE CLIENTES.NUM_CLIENTE = ENTRADAS.NUM_CLIENTE GROUP BY NOMBRE HAVING COUNT(NUM_ENTRADA) >= 20;

336

BASES DE DATOS RELACIONALES Y EL LENGUAJE SQL

En principio la clusula HAVING est pensada para su utilizacin conjunta con la clusula GROUP BY; sin embargo, tambin es posible utilizar HAVING sin GROUP BY, en este caso SQL considera el conjunto entero de resultados como un nico grupo y le aplica la condicin de seleccin de HAVING.

337

EL SISTEMA GESTOR DE BASES DE DATOS MYSQL


14.1. QU ES MySQL?
MySQL es un sistema de administracin de bases de datos relacionales rpido, slido y flexible. Es ideal para crear bases de datos con acceso desde pginas web dinmicas, para la creacin de sistemas de transacciones on-line o para cualquier otra solucin profesional que implique almacenar datos, teniendo la posibilidad de realizar mltiples y rpidas consultas. MySQL ofrece varias ventajas respecto a otros sistemas gestores de bases de datos: Tiene licencia pblica, permitiendo no solo la utilizacin del programa sino tambin la consulta y modificacin de su cdigo fuente. Resulta por tanto fcil de personalizar y adaptar a las necesidades concretas. El programa est desarrollado en C y C++, lo que facilita su integracin en otras aplicaciones desarrolladas igualmente en esos lenguajes. Puede ser descargado gratuitamente de Internet (http://www.mysql.com) haciendo uso de su licencia GPL. 339

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Para aquellos que deseen que sus desarrollos basados en MySQL no sean "cdigo abierto" existe tambin una licencia comercial. MySQL utiliza el lenguaje SQL (Structured Query Languaje Lenguaje de Consulta Estructurado) que es el lenguaje de consulta ms usado y estandarizado para acceder a bases de datos relacionales. Soporta la sintaxis estndar del lenguaje SQL para la realizacin de consultas de manipulacin, creacin y de seleccin de datos. Es un sistema cliente/servidor, permitiendo trabajar como servidor multiusuario y de subprocesamiento mltiple, es decir, cada vez que se establece una conexin con el servidor, el programa servidor crea un subproceso para manejar la solicitud del cliente, controlando el acceso simultneo de un gran nmero de usuarios a los datos y asegurando el acceso solo a usuarios autorizados. MySQL dispone de un sistema sencillo de ayuda en lnea, y de un monitor que permite realizar todas las operaciones desde la lnea de comandos del sistema, sin necesitar ningn tipo de interfaze de usuario grfica. Esto facilita la administracin remota del sistema utilizando telnet. Es portable, es decir, puede ser llevado a cualquier plataforma informtica. MySQL est disponible en ms de veinte plataformas diferentes incluyendo las distribuciones ms usadas de Linux, sistema operativo Mac X, UNIX y Microsoft Windows. Es posible encontrar gran cantidad de software desarrollado sobre MySQL o que soporte MySQL. En concreto, son de destacar diferentes aplicaciones open source para la administracin de las bases de datos a travs de un servidor web.

Todas estas caractersticas han hecho de MySQL uno de los sistemas gestores de bases de datos ms utilizado en la actualidad, no solo por pequeas empresas sino tambin por algunas grandes corporaciones, como puedan ser: Yahoo! Finance, Google, CISCO, MP3.com, Motorola, NASA, Silicon Graphics, Texas Instruments,... A mediados de 2004 se estimaba que existan ms de 5 millones de instalaciones activas del programa.

14.2. UTILIZACIN DE MySQL


14.2.1. ARRANQUE DEL SERVIDOR MySQL
MySQL dispone de dos programas principales: el servidor o motor y el cliente o monitor MySQL. El primero de ellos se encarga de estar a la espera de posibles

340

EL SISTEMA GESTOR DE BASES DE DATOS MYSQL

peticiones recibidas de los clientes; mientras que el segundo es el encargado de actuar de interfaz con el usuario. Para comenzar a utilizar el sistema MySQL lo primero que se debe hacer es arrancar su programa servidor. Este programa se ejecutar en un segundo plano como un proceso o servicio, no tiene una interfaz de usuario y su nico propsito es estar a la espera de que alguien se conecte a l y le enve una solicitud. La forma de arrancar el servidor MySQL es ejecutar el programa mysqld desde la lnea de comandos del sistema. Este programa puede encontrarse dentro del subdirectorio bin del directorio mysql. En el caso de Windows, la sentencia de arranque del servidor es:
C:\mysql\bin> mysqld

Para comprobar si el servidor se ha arrancado correctamente puede usarse el comando mysqlshow. Si el motor se ha iniciado, este comando mostrar un listado con las bases de datos disponibles en ese momento.
C:\mysql\bin> mysqlshow +-------------+ | Databases | +-------------+ | mysql | | test | +-------------+

Al instalar MySQL, se crean dos bases de datos: mysql y test. La primera contendr informacin necesaria para el sistema (usuarios registrados, privilegios,...) y la base de datos test es una base de datos vaca disponible para hacer pruebas sobre ella. El usuario podr generar posteriormente cuantas bases de datos desee. Si se desea detener el servidor de MySQL la sentencia a utilizar sera:
C:\mysql\bin> mysqladmin shutdown

Por supuesto, una vez detenido el servidor no se podr realizar ninguna operacin sobre las bases de datos.
Si se desea que el servidor se arranque automticamente, en Windows 2000/XP puede usarse el Panel de Control de Herramientas Administrativas, en concreto, el apartado de servicios.

NOTA

341

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

14.2.2. INICIO DEL MONITOR DE MYSQL


El programa cliente de MySQL, tambin conocido como monitor de MySQL, es una internaz que permite a un usuario conectarse al servidor MySQL para realizar operaciones sobre las bases de datos. Este monitor funciona a travs de la lnea de comandos del sistema y aunque este hecho parezca un tanto arcaico, facilita notablemente la administracin del sistema de forma remota, por ejemplo, a travs de conexiones telnet. Para poder arrancar el monitor de MySQL es preciso disponer de un usuario autorizado. En MySQL todo usuario queda identificado por un nombre de usuario, una contrasea y un servidor desde el que se realiza la conexin. Conviene aclarar este ltimo extremo, ya que el establecimiento de la conexin al servidor de MySQL puede realizarse desde el propio equipo en el que est instalado MySQL (localhost) o desde un equipo remoto. Al instalar MySQL se crean automticamente cuatro cuentas de usuario: Dos cuentas de usuario de nombre root y contrasea vaca, con todo tipo de privilegios sobre las bases de datos. Existen dos cuentas de usuario root porque en una de ellas se autoriza el acceso desde el mismo equipo en el que est instalado el servidor de MySQL (localhost) y en la otra el acceso se permite desde cualquier otro servidor (%). Dos cuentas de usuario invitado con nombre de usuario y contrasea vacas. De nuevo existen dos cuentas de invitado, una para las conexiones desde el localhost y otra para las conexiones desde otros servidores (%). Estas cuentas permiten a cualquier usuario establecer una conexin con el servidor MySQL. En principio estos usuarios nicamente tendran acceso a la base de datos test o cualquier base de datos cuyo nombre comience por 'test_', pero no podrn realizar operaciones de tipo administrativo sobre el sistema. Sin embargo, debe advertirse que en la versin Windows de MySQL los usuarios invitados que se conecten desde el propio servidor localhost tendrn plenos privilegios sobre todas las bases de datos.

Por supuesto, para garantizar la seguridad y privacidad de las bases de datos una de las primeras operaciones que debera hacerse es el establecimiento de contraseas para los usuarios, sobre todo para el usuario root, ya que al tener contrasea vaca cualquier persona podra acceder con todos los privilegios. Igualmente, en el caso de trabajar sobre Windows, se recomienda eliminar la cuenta de usuario invitado con privilegios de superusuario.

342

EL SISTEMA GESTOR DE BASES DE DATOS MYSQL

Ms adelante se explicar la forma de realizar estos cambios, de momento se usar una de las cuentas de usuario por defecto para entrar por primera vez en el monitor de MySQL. Para arrancar el monitor de MySQL debe escribirse en la lnea de comandos del sistema la instruccin:
C:\mysql\bin> mysql p

si se desea acceder con la cuenta de usuario invitado, o la instruccin:


C:\mysql\bin> mysql u root p

si se desea acceder con la cuenta de usuario root. En cualquiera de los dos casos, el sistema solicitara la introduccin del password, que cmo se ha comentado, inicialmente es vaco.
Enter password:

Tras introducir ese password vaco se entrara en el monitor de MySQL, apareciendo un mensaje de bienvenida como el siguiente:
Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 12 to server version:4.0.18-nt Type 'help;' or '\h' for help. Type 'c\' to clear the buffer. Mysql>

La Figura 14.1 ilustra el proceso de arranque del servidor de MySQL, comprobacin de la correcta ejecucin del mismo e inicio del monitor de MySQL con el usuario root de contrasea vaca. En general, la sintaxis para acceder al monitor con un usuario registrado es:
C:\mysql\bin> mysql h nombreservidor u nombreusuario p

Opcionalmente se puede incluso aadir al final de la sentencia el nombre de la base de datos con la que se desea trabajar. El modificador h se utiliza para especificar el equipo donde se encuentra el servidor MySQL, si es que es diferente del equipo desde el que se establece la conexin, -u permite indicar el nombre del usuario y p hace que se solicite a continuacin el password.

343

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Figura 14.1 Arranque del servidor de MySQL desde la lnea de comandos del sistema

14.3. EJECUCIN DE SENTENCIAS SQL


Una vez dentro del monitor de MySQL el smbolo o prompt del sistema cambia, pasando a ser:
mysql>

A travs de la lnea de comandos del monitor de MySQL se podrn escribir directamente sentencias en el lenguaje SQL que sern dirigidas al servidor. Cuando se desee salir del monitor de MySQL y regresar a la lnea de comandos del sistema, se tendra que ejecutar la sentencia:
mysql> EXIT

o
mysql> QUIT Dentro del monitor todas las sentencias SQL que se ejecuten debern finalizar con un signo de punto y coma, las sentencias pueden ocupar varias lneas y el uso de letras maysculas o minsculas es indiferente.

NOTA

Una vez dentro del monitor de MySQL, se pueden ejecutar directamente sentencias SQL de manera interactiva.

344

EL SISTEMA GESTOR DE BASES DE DATOS MYSQL

Ejemplo 14.1: Como primera orden se podra solicitar un listado de las bases de datos disponibles:
mysql> show databases; +----------+ | Database | +----------+ | mysql | | test | +----------+ 2 rows in set (0.01 sec)

Ejemplo 14.2: Tambin se podra ejecutar una sencilla consulta de seleccin para solicitar al servidor que muestre la fecha actual y la versin de MySQL que se encuentra instalada:
mysql> SELECT CURRENT_DATE, VERSION(); +--------------+-----------+ | CURRENT_DATE | VERSION() | +--------------+-----------+ | 2004-03-25 | 4.0.18-nt | +--------------+-----------+ 1 row in set (0.61 sec)

Ejemplo 14.3: Es posible realizar sencillas operaciones matemticas:


mysql> SELECT COS(EXP(2/3)), (3+5)*4; +---------------+---------+ | COS(EXP(2/3)) | (3+5)*4 | +---------------+---------+ | -0.368075 | 32 | +---------------+---------+ 1 row in set (0.11 sec)

Ejemplo 14.4: Tambin se puede solicitar que se muestre el usuario y la base de datos actual:
mysql> SELECT USER(),DATABASE(); +----------------+------------+ | USER() | DATABASE() | +----------------+------------+ | root@localhost | | +----------------+------------+ 1 row in set (0.00 sec)

345

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Como se aprecia en esta ltima consulta, los usuarios quedan identificados por un nombre formado por el nombre de usuario y la identificacin del servidor desde el que se conectan separados por el signo '@'. En el caso de que el servidor desde el que se conecta sea el mismo que el servidor en el que se encuentra instalado MySQL, esta identificacin se limita al nombre localhost. Tambin se aprecia en la consulta anterior que la base de datos actual aparece vaca. MySQL puede tener muchas bases de datos, pero para poder utilizar una de ellas debe ser seleccionada previamente. La sentencia para realizar esta operacin es USE. Ejemplo 14.5: Si se desea usar la base de datos mysql (una de las dos bases de datos creadas por defecto), la sentencia sera:
mysql> USE MYSQL; Database changed

Una vez seleccionada la base de datos con la que se desea trabajar, todas las operaciones posteriores irn dirigidas a ella, a no ser que explcitamente se seleccione una nueva base de datos. Si se realiza de nuevo la seleccin de la base de datos actual se podra apreciar cmo ahora s que aparece el nombre de la correspondiente base de datos
mysql> SELECT DATABASE(); +------------+ | DATABASE() | +------------+ | mysql | +------------+ 1 row in set (0.00 sec)

14.4. GESTIN DE USUARIOS


14.4.1. LA TABLA USER
La base de datos mysql consta de 6 tablas. Entre ellas destaca la tabla user, en la que se incluyen todos los usuarios registrados por el sistema. Esta tabla contiene no solo la informacin sobre los nombres, contraseas y servidores de los usuarios,

346

EL SISTEMA GESTOR DE BASES DE DATOS MYSQL

sino tambin un gran nmero de campos para establecer los diferentes privilegios de cada usuario; por ejemplo, si los usuarios pueden crear nuevas bases de datos, realizar operaciones de actualizacin, insercin, borrado,... Ejemplo 14.6: Si se desea consultar las tablas de la base de datos mysql se podra utilizar la siguiente instruccin:
mysql> SHOW TABLES; +-----------------+ | Tables_in_mysql | +-----------------+ | columns_priv | | db | | func | | host | | tables_priv | | user | +-----------------+ 6 rows in set (0.42 sec)

Cuando se desea ver una descripcin completa de la estructura de una tabla puede usarse la instruccin DESCRIBE o SHOW COLUMNS. Ejemplo 14.7: Para mostrar la estructura de la tabla user, se podra utilizar cualquiera de las dos sentencias siguientes:
mysql> DESCRIBE USER; mysql> SHOW COLUMNS FROM USER;

En ambos casos, en la consola aparecera una descripcin de los campos de la tabla, indicando el nombre de cada atributo, el tipo y otras caractersticas como la aceptacin de valores nulos o valores por defecto para el atributo. En concreto, los campos que componen la tabla user son los que se muestran en la Tabla 14.1. De todos los atributos de la tabla user, los tres primeros (host, user y password) identifican a cada usuario y los restantes establecen sus privilegios. Por ejemplo, el atributo Insert_priv puede tomar el valor 'N' (no) o el valor 'Y' (yes), siendo el primero el valor por defecto, y determina si el usuario tiene o

347

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

no privilegios para insertar datos en las tablas. El control de privilegios en MySQL es bastante completo, permitiendo incluso establecer privilegios individuales para cada tabla de cada base de datos; en el prximo captulo se explicar con ms detalle la gestin de privilegios de usuarios.
Campo Host User password Select_priv Insert_priv Update_priv Delete_priv Create_priv Drop_priv Reload_priv Shutdown_priv Process_priv File_priv Grant_priv References_priv Index_priv Alter_priv Show_db_priv Super_priv Create_tmp_table_priv Lock_tables_priv Execute_priv Repl_slave_priv Repl_client_priv ssl_type ssl_cipher x509_issuer x509_subject max_questions max_updates max_connections Tipo varchar(60) varchar(16) varchar(16) enum('N', 'Y') enum('N', 'Y') enum('N', 'Y') enum('N', 'Y') enum('N', 'Y') enum('N', 'Y') enum('N', 'Y') enum('N', 'Y') enum('N', 'Y') enum('N', 'Y') enum('N', 'Y') enum('N', 'Y') enum('N', 'Y') enum('N', 'Y') enum('N', 'Y') enum('N', 'Y') enum('N', 'Y') enum('N', 'Y') enum('N', 'Y') enum('N', 'Y') enum('N', 'Y') enum('','ANY','X509', 'SPECIFIED') blob blob blob int(11) int(11) int(11) Atributos BINARY BINARY Nulo Def. No No No No N No N No N No N No N No N No N No N No N No N No N No N No N No N No N No N No N No N No N No N No N No No No No No No No

BINARY BINARY BINARY UNSIGNED UNSIGNED

0 0 0

Tabla 14.1 Campos de la tabla user

348

EL SISTEMA GESTOR DE BASES DE DATOS MYSQL

Ejemplo 14.8: Si se desea obtener un listado con los nombres de usuario, contraseas y servidores de todos los usuarios registrados, se podra realizar una simple consulta de seleccin:
mysql> SELECT USER,PASSWORD,HOST FROM USER; +------+----------+-----------+ | USER | PASSWORD | HOST | +------+----------+-----------+ | root | | localhost | | root | | % | | | | localhost | | | | % | +------+----------+-----------+ 4 rows in set (0.00 sec)

En este momento pueden observarse los cuatro usuarios definidos por defecto, los dos superusuarios root y los dos usuarios invitados.

14.4.2. ELIMINACIN DE USUARIOS


Como se ha recomendado anteriormente, una de las primeras operaciones a realizar debera ser la supresin de los usuarios invitados (los que tienen nombre de usuario vaco). La supresin de un usuario implica la eliminacin del correspondiente registro de la tabla user; por tanto, debera usarse la sentencia DELETE. Ejemplo 14.9: La eliminacin de los usuarios de nombre vaco se hara de la siguiente manera:
mysql> DELETE FROM user WHERE user=''; Query OK, 2 rows affected (0.16 sec)

Una vez realizada la eliminacin, se puede repetir la consulta de seleccin de usuarios para comprobar que realmente los dos usuarios invitados han sido eliminados:
mysql> SELECT user,password,host FROM user; +------+----------+-----------+ | user | password | host | +------+----------+-----------+ | root | | localhost | | root | | % | +------+----------+-----------+ 2 rows in set (0.00 sec)

349

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Sin embargo, se puede comprobar que si se sale del monitor (sentencia EXIT) y se vuelve a entrar con usuario invitado (mysql p), el sistema permitira an el acceso. La razn es que para que los cambios de usuario tengan efecto, el servidor MySQL debe reiniciarse. La forma de reiniciar el servidor es mediante la ejecucin del programa mysqladmin con la opcin reload desde fuera del monitor MySQL. A continuacin se observa esta secuencia de operaciones:
mysql> exit Bye C:\mysql\bin>mysqladmin reload C:\mysql\bin>mysql -p Enter password: ERROR 1045: Access denied for user: 'ODBC@localhost' (Using password: NO) C:\mysql\bin>mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 22 to server version: 4.0.18nt Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

Como puede observarse, una vez eliminados los usuarios invitados y reiniciado el servidor, la nica posibilidad sera entrar con el usuario root.

14.4.3. ESTABLECIMIENTO DE CONTRASEAS PARA LOS USUARIOS


Otra de las operaciones que conviene realizar cuanto antes es el establecimiento de una contrasea para el usuario root, ya que este usuario viene por defecto con una contrasea vaca que evidentemente no ofrece ningn tipo de seguridad. Los passwords se pueden asignar de varias maneras, una primera forma es utilizar la sentencia SET PASSWORD. Ejemplo 14.10: Si se desea establecer como password la cadena 'miclave' para el usuario root cuando se conecte desde el propio servidor local, la sentencia sera:

350

EL SISTEMA GESTOR DE BASES DE DATOS MYSQL

mysql> SET PASSWORD FOR 'root'@'localhost' = -> PASSWORD('miclave');

La funcin PASSWORD() permite encriptar el password antes de guardarlo en la tabla. Aunque su uso no es obligado, s que resulta recomendable ya que de esta manera si un usuario tiene acceso a la tabla user no podr ver el password real al hacer una consulta de seleccin. Una vez realizada la operacin de asignacin de contrasea, se podra solicitar de nuevo el listado de los usuarios registrados:
mysql> SELECT user,password,host FROM user; +------+------------------+-----------+ | user | password | host | +------+------------------+-----------+ | root | 0ff1bdab147337f1 | localhost | | root | | % | +------+------------------+-----------+ 2 rows in set (0.04 sec)

Como puede comprobarse el usuario root conectndose desde el localhost tiene asignado un password, aunque el valor real de ese password no se muestra en el resultado de la consulta. La contrasea anterior tambin podra ser establecida usando la sentencia UPDATE para modificar directamente la tabla user:
mysql> UPDATE user SET password = PASSWORD('miclave') -> WHERE user = 'root';

En este ultimo caso se est asignando la contrasea al mismo tiempo para los dos usuarios root (el que se conecta desde el servidor local y el que lo hace desde cualquier otro servidor). Cuando se modifica directamente la tabla user, para que los cambios tengan efecto inmediato, debe decirse al sistema que vuelva a leer todas las tablas de privilegios, de otra manera, los cambios no tendran efecto hasta que se reinicie el servidor MySQL. Esto se realiza con la sentencia:
mysql> FLUSH PRIVILEGES;

Finalmente, tambin es posible asignar contraseas con el programa mysqladmin desde fuera del monitor MySQL.

351

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Para que cualquier cambio relativo a usuarios y sus privilegios tenga efecto, es necesario ejecutar la sentencia FLUSH PRIVILEGES o reiniciar el servidor MySQL desde fuera del monitor. Esto ltimo puede hacerse usando el programa mysqladmin:
C:\mysql\bin> mysqladmin reload

Una vez establecida la contrasea del usuario root, se debera entrar de nuevo en el monitor con la sentencia:
C:\mysql\bin> mysql u root -p

El monitor solicitar el nuevo password para entrar. Tambin es posible entrar en el monitor directamente introduciendo la contrasea sin esperar a que el programa la solicite:
C:\mysql\bin> mysql u root -pmiclave

En este caso la contrasea se indica a continuacin del parmetro p, sin dejar ningn espacio entre ambos. Adems si la contrasea contiene espacios en blanco o caracteres especiales, esta debera darse entre comillas dobles. Esta forma de indicar la contrasea no es recomendable por ser un mtodo sumamente inseguro de proporcionar la contrasea; ya que un usuario podra ver los comandos que se estn ejecutando en el sistema y en esos comandos aparecera esta contrasea. Por ltimo, conviene aclarar que si a continuacin del parmetro p se coloca un espacio, lo que sigue se interpreta como la base de datos sobre la que se desea trabajar. Por ejemplo, la sentencia siguiente permitira entrar en el monitor y seleccionar directamente la base de datos mysql:
C:\mysql\bin> mysql u root p mysql

14.4.4. CREACIN DE NUEVOS USUARIOS


La creacin de un nuevo usuario no es ms que la inclusin de un nuevo registro en la tabla user. En principio, no es necesario asignar explcitamente valores para todos los campos de esa tabla, ya que todos ellos tienen valores por defecto.

352

EL SISTEMA GESTOR DE BASES DE DATOS MYSQL

Ejemplo 14.11: Con la sentencia:


mysql> INSERT INTO user (Host , User , password) -> VALUES ('localhost', 'operador', PASSWORD('snoopy'));

se crea un nuevo usuario que se podr conectar desde el propio servidor local, con nombre de usuario operador y contrasea snoopy. Este usuario tendr los privilegios establecidos por defecto, estos privilegios solo le permiten el uso de la tabla test. A continuacin puede verse cmo efectivamente este nuevo usuario tendr un acceso a MySQL limitado.
C:\mysql\bin>mysql -u operador -p Enter password: ****** Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 48 to server version: 4.0.18nt Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> show databases; +----------+ | Database | +----------+ | test | +----------+ 1 row in set (0.00 sec)

Ejemplo 14.12: Si se desea crear un nuevo usuario que tenga permisos solo para seleccionar e insertar nuevos registros y que pueda conectarse desde cualquier servidor, la sentencia de insercin debera ser:
mysql> INSERT INTO user (Host , User , password, -> Select_priv , Insert_priv) -> VALUES ('%', 'mantenimiento', PASSWORD('mickey'), -> 'Y', 'Y');

353

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Con estos privilegios el usuario mantenimiento podra ver los datos almacenados en cualquier tabla de cualquier base de datos y podra insertar nuevos registros e incluso crear nuevas tablas para insertar registros en ellos. Lo que no podra hacer son operaciones de modificacin de datos, eliminacin de registros, creacin de nuevas bases de datos,... MySQL admite una gestin de privilegios de usuario bastante completa. Ms adelante en este libro se analizarn algunas herramientas de gestin de MySQL que permiten realizar las labores de administracin de usuarios de una manera mucho ms cmoda.

14.5. BASES DE DATOS Y TABLAS EN MySQL


MySQL viene provisto por defecto de dos bases de datos, la primera tiene un uso puramente administrativo y la segunda es una base de datos para la realizacin de pruebas. Por supuesto, todo usuario con los privilegios adecuados puede crear nuevas bases de datos. La creacin implica el uso de la instruccin CREATE DATABASE. Ejemplo 14.13: Para ilustrar el proceso completo de creacin de la base de datos se tomar como referencia la base de datos de los multicines Cinem@s que ya fue diseada en el captulo anterior. El primer paso, por supuesto, es arrancar el monitor MySQL con un usuario que tenga los privilegios necesarios. En este caso se utilizar el superusuario root:
C:\mysql\bin>mysql -u root -p Enter password: ****** Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 48 to server version: 4.0.18nt Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

Una vez dentro, se debe crear la base de datos, utilizando para ello la sentencia CREATE:
mysql> CREATE DATABASE cinemas; Query OK, 1 row affected (0.00 sec)

354

EL SISTEMA GESTOR DE BASES DE DATOS MYSQL

Una vez creada, debe usarse la sentencia USE para seleccionarla como base de datos activa.
mysql> USE cinemas; Database changed

Una vez creada la base de datos, lo siguiente es la creacin de las tablas que la compondrn. La creacin de esas tablas se realiza con la correspondiente instruccin SQL. Por ejemplo, una de las tablas de la base de datos de Cinem@s es la que permitir guardar la informacin de todos los clientes; en concreto, la creacin de esta tabla se hara de la siguiente manera:
mysql> CREATE TABLE CLIENTES ( -> -> -> -> -> -> -> -> NUM_CLIENTE SMALLINT NOT NULL AUTO_INCREMENT, NOMBRE VARCHAR(40) NOT NULL, DIRECCION VARCHAR(50), FECHANAC DATE, TELEF CHAR(9), EMAIL CHAR(30), PUNTOS_ACUM SMALLINT NOT NULL DEFAULT 0, CLAVE CHAR(6) NOT NULL,

-> PRIMARY KEY (NUM_CLIENTE)); Query OK, 0 rows affected (0.52 sec)

Se puede comprobar la correcta creacin de la tabla solicitando a MySQL que muestre las tablas de la base de datos:
mysql> SHOW TABLES; +-------------------+ | Tables_in_cinemas | +-------------------+ | clientes | +-------------------+ 2 rows in set (0.00 sec)

355

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Incluso se puede utilizar la sentencia DESCRIBE para solicitar a MySQL que muestre la estructura de la tabla recin creada:
mysql> DESCRIBE clientes; +-------------+-------------+------+-----+---------+-------+--------+ | Field | Type | Null | Key | Default | Extra | +-------------+-------------+------+-----+---------+-------+--------+ | NUM_CLIENTE | smallint(6) | | PRI | NULL auto_increment | | NOMBRE | varchar(40) | | | | | | DIRECCION | varchar(50) | YES | | NULL | | | FECHANAC | date | YES | | NULL | | | TELEF | varchar(9) | YES | | NULL | | | EMAIL | varchar(30) | YES | | NULL | | | PUNTOS_ACUM | smallint(6) | | | 0 | | | CLAVE | varchar(6) | | | | | +-------------+-------------+------+-----+---------+----------------+ 8 rows in set (0.69 sec)

14.6. TIPOS DE DATOS


En la creacin de una tabla debe indicarse un tipo de datos para cada uno de los atributos que la componen, en esta seccin se analizarn los diferentes tipos de datos soportados por MySQL. Cada uno de los tipos tiene asociado un espacio de almacenamiento en memoria del cual a su vez depende el rango admisible de valores que puede tomar el dato. Es responsabilidad del administrador de la base datos hacer un buen diseo de la misma, en particular eligiendo adecuadamente los tipos de datos de cada uno de los atributos de la tabla. Con esta eleccin debe buscarse la optimizacin del espacio de memoria y la eficiencia y rapidez en la consulta de los datos. Los diferentes tipos de datos pueden ser clasificados en varios grupos o categoras: numricos, cadena de caracteres, fecha y hora, conjuntos y enumeraciones,...

14.6.1. TIPOS NUMRICOS


Los tipos numricos pueden, a su vez, ser de dos tipos: enteros y de coma flotante o decimales. En ambos casos, existen diferentes opciones que permiten trabajar con nmeros en diferentes rangos.

356

EL SISTEMA GESTOR DE BASES DE DATOS MYSQL

Tipos Enteros
Nombre TINYINT BIT BOOL SMALLINT MEDIUMINT INT INTEGER BIGINT Rango -128 a 127 0o1 0o1 -32768 a 32767 -8388608 a 8388607 -2147483648 a 2147483647 -2147483648 a 2147483647 -9223372036854775808 a 9223372036854775807 Almacenamiento 1 byte 1 bit 1 bit 2 bytes 3 bytes 4 bytes 4 bytes 8 bytes Descripcin Entero pequeo Entero 0 o 1 Entero 0 o 1 Entero pequeo Entero mediano Entero normal Sinnimo de INT Entero grande

Tabla 14.2 Tipos de datos numricos enteros

Como puede apreciarse en la Tabla 14.2, existen varias posibilidades para trabajar con tipos enteros, la eleccin concreta depender de lo que realmente se almacenar en ese argumento; por ejemplo, si se desea definir un argumento para guardar edades de personas, no parecera muy lgico utilizar el tipo INTEGER por el enorme desperdicio de espacio en memoria que implicara. A la hora de definir un argumento de tipo entero se puede utilizar el argumento UNSIGNED (sin signo) para impedir que dicho argumento acepte valores con signo negativo, es decir, solo se podrn utilizar nmeros positivos. El uso de este atributo adems permite duplicar el tamao del nmero ms grande que puede ser almacenado; por ejemplo, el rango de valores del tipo TINYINT comprende todos los nmeros entre 128 y 127, en cambio, el rango de UNSIGNED TINYINT variar entre 0 y 255. Salvo en los tipos BIT y BOOL, en el resto de tipos de enteros se puede especificar entre parntesis el nmero mximo de dgitos con el que se mostrar el correspondiente nmero. El valor mximo de este parmetro es 255. Relacionado con esto, el argumento ZEROFILL utilizado para los valores numricos, completa con ceros a la izquierda los valores hasta alcanzar esa longitud mxima. Si se le asigna a un atributo el modificador ZEROFILL automticamente se le asignar UNSIGNED.

357

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Ejemplo 14.14: Si se define un atributo:


NUM_SALA SMALLINT(4) ZEROFILL,

los nmeros de las salas sern mostrados todos ellos con cuatro dgitos, completando a la izquierda con ceros si fuese necesario.

Tipos numricos en coma flotante


Bsicamente hay dos tipos numricos en coma flotante: FLOAT y DOUBLE; la diferencia entre ellos est en el nmero de bytes que se utilizan para almacenar los nmeros; en el tipo FLOAT se utilizan cuatro bytes y en el DOUBLE el doble, es decir, 8 bytes. Adems de estos dos tipos bsicos, existen una serie de tipos "sinnimos" que tienen un comportamiento idntico a ellos. Los tipos numricos en coma flotante admitidos por MySQL son los que se muestran en la Tabla 14.3.
Nombre FLOAT Rango 1.175494351E-38 a 3.402823466E+38 1.797693134862315E+308 a 2.2507385850720E-308 Almacenamiento 4 bytes Descripcin Coma flotante de precisin nica. Coma flotante de precisin nica. Sinnimos de double Un byte para cada dgito del nmero Nmero de coma flotante almacenado como cadena de caracteres

DOUBLE PRECISION REAL DECIMAL NUMERIC DEC

8 bytes

Tabla 14.3 Tipos de datos numricos en coma flotante

A la hora de definir atributos de tipo numrico en coma flotante tambin es posible especificar el nmero de lugares decimales y el nmero de dgitos totales con los que los nmeros sern visualizados. Para hacerlo se deben colocar entre parntesis a continuacin del nombre del tipo, y separados por coma, la longitud total de visualizacin del nmero y el nmero mximo de dgitos decimales.

358

EL SISTEMA GESTOR DE BASES DE DATOS MYSQL

Ejemplo 14.15: Si se define el atributo PRECIO de la siguiente manera:


PRECIO FLOAT(5,2) ZEROFILL,

Los valores sern visualizados con un mximo de 5 dgitos, dos de ellos correspondientes a la parte decimal. Conviene indicar que se permitira almacenar nmeros con un dgito ms siempre que sean positivos.

14.6.2. TIPOS CADENA DE CARACTERES


Para almacenar datos de tipo cadena de caracteres, MySQL incorpora varios tipos de datos diferentes, que podran ser clasificados en dos grupos. Por un lado se encuentran los tipos CHAR y VARCHAR, pensados para almacenar cadenas de pequea longitud. La nica diferencia entre ambos es que las cadenas de tipo CHAR se consideran de longitud fija y las VARCHAR de longitud variable; esto significa que, por ejemplo, cuando en una cadena de longitud fija se incluye un dato con menos caracteres que los previstos, la cadena se completa con espacios en blanco hasta alcanzar su longitud. Cuando las cadenas, en cambio, tienen mayor longitud que la admitida por el tipo de datos, los caracteres de la derecha se eliminan. En ambos casos, a la hora de definir un atributo con tipo CHAR o VARCHAR, debe indicarse entre parntesis la longitud mxima que admitir. La longitud mxima posible para esta cadena es, en cualquier caso, de 255 caracteres. Ejemplo 14.16: La forma de declarar un atributo NOMBRE para almacenar cadenas de longitud variable de 20 caracteres como mximo sera:
NOMBRE VARCHAR(20)

La principal ventaja de las cadenas de longitud fija respecto a las de longitud variable es que las primeras se procesan con mayor rapidez; pero en cambio son menos eficientes en el uso de memoria. Por ejemplo, si se almacena una cadena con 3 caracteres en un campo de tipo CHAR(10) se estaran usando 10 bytes (uno por cada carcter de la cadena ms los 7 espacios en blanco que se aadiran) para guardar ese dato. En cambio, esa misma cadena en un tipo de dato VARCHAR(10) requerira 4 bytes (3 para los caracteres y un byte adicional que sirve para identificar el fin de la cadena).

359

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

NOTA

MySQL no admite en la construccin de una tabla mezclar el uso de cadenas de longitud fija y variable. Cuando el usuario defina una tabla en la que aparezca, simultneamente tipos CHAR y VARCHAR, automticamente todos sern convertidos a tipo VARCHAR. La nica excepcin a esta regla se produce cuando se definen tipos VARCHAR de 4 o menos caracteres, en este caso sern convertidas a CHAR.

Por defecto, MySQL no distingue el uso de maysculas y minsculas en las cadenas de caracteres, de manera que, por ejemplo, las cadenas 'Shrek' y 'SHREK' son consideradas iguales a efectos de comparaciones en bsquedas, ordenaciones o cualquier otra operacin. Si se desea que s que se distingan las letras maysculas de las minsculas, se puede indicar delante del tipo el atributo BINARY. Ejemplo 14.17: La declaracin:
COD BINARY VARCHAR(5)

define un atributo que almacenar cadenas de un mximo de 5 caracteres y diferenciando maysculas de minsculas. El otro grupo de tipos de datos para almacenar cadenas de caracteres lo constituyen los tipos TEXT y BLOB, pensados para almacenar grandes cantidades de caracteres. Los atributos de tipo BLOB (binary large object, objeto binario grande) permiten adems almacenar cualquier tipo de fichero, como por ejemplo imgenes, sonidos, documentos, programas,... La diferencia entre un texto guardado en un dato TEXT o BLOB es que en el primer caso no se diferencian maysculas de minsculas, mientras que en un dato de tipo BLOB s que se produce tal diferenciacin, lo que afecta a las operaciones de comparacin y ordenacin. Existen diferentes variaciones de los tipos TEXT y BLOB que afectan nicamente a las longitudes mximas de las cadenas que admiten. En la Tabla 14.4 se incluyen estas versiones junto con los otros tipos de cadenas analizados.

360

EL SISTEMA GESTOR DE BASES DE DATOS MYSQL

Nombre CHAR CHAR(N)

Longitud mxima de caracteres 1 255

Almacenamiento 1 bytes N bytes

Descripcin Un carcter. Cadena de longitud fija de N caracteres. Cadena de longitud variable de N caracteres. Cadenas u objetos binarios de tamao pequeo Cadenas u objetos binarios de tamao normal Cadenas u objetos binarios de tamao mediano Cadenas u objetos binarios de tamao grande

VARCHAR(N) TINYTEXT TINYBLOB TEXT BLOB MEDIUMTEXT MEDIUMBLOB LONGTEXT LONGBLOB

255

N+1 bytes

255

L+1 bytes

65.535 16.777.215 (1,6 MB) 4.294.967.295 (4,2 GB)

L+2 bytes

L+3 bytes

L+4 bytes

Tabla 14.4 Tipos de cadenas de caracteres

14.6.3. TIPOS ENUM Y SET


Los tipos ENUM permiten definir atributos cuyos valores estn necesariamente en una lista de valores predeterminados. A la hora de definir el atributo, los valores deben ser dados entre parntesis y separados por comas. El nmero mximo de valores que admite MySQL es 65.535. Cuando se incorpore un nuevo registro a la base de datos, para el valor del atributo de tipo ENUM se deber elegir necesariamente uno de los de la lista o utilizar el valor especial NULL. Los tipos SET, en cambio, definen igualmente una lista de valores predeterminados, pero se podra asignar al correspondiente campo ninguno, uno o varios de esos valores. Cuando se inserte el registro, los valores de la lista debern ser introducidos dentro de una cadena entrecomillada y separados por comas. El nmero mximo de elementos que admite MySQL para los conjuntos (SET) es 64.

361

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Ejemplo 14.18: A continuacin se definen dos atributos, uno de tipo ENUM y otro SET:
SESION ENUM('matinal','tarde','noche') PROY SET('L','M','X','J','V','S','D') Debe destacarse que los tipos ENUM y SET son visualizados como si fuesen cadenas de caracteres, pero internamente son tratados y almacenados como valores numricos. Cada valor predeterminado tiene asociado el valor numrico correspondiente a su posicin en la lista que define el atributo. El hecho de que estos tipos de datos sean tratados como nmeros hace que su tratamiento sea mucho ms rpido y eficaz que el de las cadenas de caracteres.

NOTA

14.6.4. TIPOS FECHA/HORA


Para el tratamiento de datos que hagan referencia a instantes de tiempo (fechas y horas) MySQL tambin dispone de varios tipos de datos. Todos los valores correspondientes a fechas y horas deben ser dados como cadenas de caracteres, es decir, entrecomillados, aunque tambin es posible dar esos datos como valores numricos. Conviene advertir que MySQL utiliza un formato para las fechas en el cual en primer lugar se indica el ao, despus el mes y finalmente el da. Para las horas el formato es el habitual (horas:minutos:segundos). Es de destacar la gran flexibilidad de MySQL en el momento de introducir una fecha. Ejemplo 14.19: Para MySQL cualquiera de las cadenas siguientes correspondera a la misma fecha: el 31 de marzo de 1997:
'1997/3/31' '1997-3-31' 19970331

Respecto a las horas, necesariamente debe usarse el signo ':' como separador o bien indicar los dgitos correspondientes a las horas, minutos y segundos seguidos, sin ningn separador. Por ejemplo, las 17 horas 5 minutos y 20 segundos se puede expresar como:
'17:5:20' 170520

362

EL SISTEMA GESTOR DE BASES DE DATOS MYSQL

NOTA

MySQL no comprueba si una fecha es vlida en el momento de la insercin de los datos, solo hace dos simples comprobaciones: que el mes est comprendido entre 0 y 12 y el da est comprendido entre 0 y 31. Esto hace que MySQL considere como fecha vlida, por ejemplo, '2005-2-31' (31 de febrero de 2005).

En la Tabla 14.5 se puede observar la variedad de tipos de fecha-hora que MySQL soporta.
Nombre DATE Rango 1000-01-01 9999-12-31 -838:59:59 838:59:59 1000-01-01 00:00:00 9999-12-31 23:59:59 1970-01-01 00:00:00 2037-01-01 00:00:00 70-69 (de 1970 a 2069) 1901 - 2155 Tamao de almacenamiento 3 bytes 3 bytes Descripcin Almacena una fecha con el formato YYYY-MM-DD Almacena una hora con el formato HH:MM:SS Almacena una fecha y una hora con el formato YYYY-MM-DD HH:MM:SS Instante de tiempo, combinacin de fecha y hora segn diferentes formatos Almacena un ao con dos dgitos (p.e. 97 corresponde a 1997) Almacena un ao con cuatro dgitos

TIME

8 bytes

DATETIME

TIMESTAMP TIMESTAMP(M) YEAR(2) YEAR YEAR(4)

4 bytes

1 byte 1 byte

Tabla 14.5 Tipos de dato fecha-hora

El tipo TIMESTAMP resulta especialmente til ya que si una tabla dispone de un atributo con este tipo, en l se almacenar de forma automtica el "instante de tiempo" (fecha y hora) en el que se realiz la insercin o ltima actualizacin del correspondiente registro. El formato en el que son almacenados los instantes de tiempo depende del valor del parmetro que se haya colocado entre parntesis en la definicin del correspondiente atributo. La Tabla 14.6 muestra los diferentes formatos asociados a los diferentes parmetros. 363

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Tipo especificado TIMESTAMP TIMESTAMP(14) TIMESTAMP(12) TIMESTAMP(8) TIMESTAMP(6) TIMESTAMP(4) TIMESTAMP(2)

Formato AAAAMMDDHHMMSS AAAAMMDDHHMMSS AAMMDDHHMMSS AAAAMMDD AAMMDD AAMM AA

Tabla 14.6 Formato de tipos TIMESTAMP

14.7. INTEGRIDAD REFERENCIAL EN MYSQL


MySQL soporta diferentes tipos de tablas: MyISAM, ISAM, HEAP, BDB, InnoDB. En todas ellas el motor de MySQL admite el uso de la sintaxis para definir integridad referencial, pero en algunos de los tipos anteriores la integridad referencial no se encuentra actualmente implementada y por tanto el uso de esa sintaxis no produce efecto alguno. El primer tipo de tabla que realmente permite trabajar con restricciones de integridad referencial es el InnoDB, estando previsto que prximamente tambin sea implementado para las tablas MyISAM. A partir de la versin 4.0 de MySQL el soporte para tablas InnoDB es incluido en la instalacin bsica del sistema. Para asegurarse de que el servidor MySQL sobre el que se est trabajando soporta este tipo de tablas, podra consultarse el valor de la variable have_innodb tal como se muestra a continuacin:
mysql> show variables like 'have_innodb'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | have_innodb | YES | +---------------+-------+ 1 row in set (0.03 sec)

364

EL SISTEMA GESTOR DE BASES DE DATOS MYSQL

La integridad referencial est ntimamente relacionada con los conceptos de claves primarias y claves forneas; las primeras son las que permiten identificar los registros de una tabla y las segundas permiten relacionar un registro con otro registro de otra tabla diferente. Por ejemplo, en la tabla de PROYECCIONES se hace referencia al nmero de una sala y el identificador de una pelcula, de manera que la tabla proyecciones contendr dos claves forneas una que la relaciona con la tabla SALAS y otra que la relaciona con la tabla PELICULAS. La integridad referencial exige que cuando un registro haga referencia a otro registro relacionado este ltimo debe existir en la tabla relacionada; de esta forma se impide, por ejemplo, aadir proyecciones que referencien a salas o pelculas que no existan en las respectivas tablas. En las primeras versiones de MySQL no se inclua ningn tipo de control de integridad referencial, pasando la responsabilidad de evitar situaciones de inconsistencia (por ejemplo usar nmeros de sala inexistentes) al programador y a la aplicacin que se utilice para gestionar la base de datos. Esta era una de las razones por las que para muchos programadores MySQL no era apropiado para proyectos de cierta envergadura. Con las nuevas funcionalidades de las ltimas versiones de MySQL esta reticencia est siendo superada.

14.7.1. DEFINICIN DE CLAVES FORNEAS


Para que un atributo sea considerado como clave fornea debe ser explcitamente definido como tal en la sentencia de creacin de la tabla. Ya se ha comentado que, aunque la sintaxis es aceptada en todos los tipos de tablas, fueron las tablas InnoDB las primeras en las que realmente esta funcionalidad se encuentra implementada. En concreto, las tablas InnoDB permiten la definicin de claves forneas desde la versin MySQL 3.23.43. Para trabajar con claves forneas es necesario que las dos tablas relacionadas sean ambas definidas del tipo InnoDB, para ello se colocar al final de la tabla la clusula:
TYPE = INNODB

A continuacin debe usarse la sintaxis:


FOREIGN KEY(campo) REFERENCES tabla_relacionada

365

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

para indicar el campo de la tabla primaria que se encuentra asociado con la clave de la tabla relacionada. Por supuesto, ambos campos relacionados deben tener asociado el mismo tipo de datos. Finalmente es obligatorio crear un ndice sobre el campo que ha sido declarado como clave fornea. La creacin de este ndice se hace con la clusula INDEX. Ejemplo 14.20: A continuacin se muestra el cdigo completo de creacin de la base de datos Cinem@s haciendo uso de la integridad referencial:
CREATE DATABASE CINEMAS; USE CINEMAS; CREATE TABLE PELICULAS ( IDPELICULA SMALLINT NOT NULL AUTO_INCREMENT, TITULO CHAR(50) NOT NULL , ACTORES MEDIUMTEXT , PRODUCCION MEDIUMTEXT , DIRECCION MEDIUMTEXT , GUION VARCHAR(40) , ANNO SMALLINT , DURACION SMALLINT NOT NULL , NACIONALIDAD VARCHAR(25) , GENERO ENUM('infantil','comedia','drama','accin', 'terror','ertica') , EDAD_RESTRICCION ENUM('apta','mayores 7', 'mayores 13','mayores 18') , SINOPSIS LONGTEXT , CARTELERA BLOB , PRIMARY KEY (IDPELICULA)) TYPE = INNODB; CREATE TABLE SALAS ( NUM_SALA SMALLINT NOT NULL , AFORO SMALLINT NOT NULL , NUM_FILAS SMALLINT NOT NULL , OBSERVACIONES LONGTEXT , PRIMARY KEY (NUM_SALA)) TYPE = INNODB; CREATE TABLE CLIENTES ( NUM_CLIENTE SMALLINT NOT NULL AUTO_INCREMENT, NOMBRE VARCHAR(40) NOT NULL , DIRECCION VARCHAR(50) , FECHANAC DATE , TELEF CHAR(9) ,

366

EL SISTEMA GESTOR DE BASES DE DATOS MYSQL

EMAIL CHAR(30) , PUNTOS_ACUM SMALLINT NOT NULL DEFAULT 0 , CLAVE CHAR(6) NOT NULL , PRIMARY KEY (NUM_CLIENTE)) TYPE = INNODB; CREATE TABLE PROYECCIONES ( IDPROY SMALLINT NOT NULL AUTO_INCREMENT, IDPELICULA SMALLINT NOT NULL , NUM_SALA SMALLINT NOT NULL , HORA TIME NOT NULL , FECHA DATE NOT NULL , TARIFA_REDUCIDA BOOL , ESTRENO BOOL , PRIMARY KEY (IDPROY), INDEX (IDPELICULA), FOREIGN KEY (IDPELICULA) REFERENCES PELICULAS (IDPELICULA), INDEX (NUM_SALA), FOREIGN KEY (NUM_SALA) REFERENCES SALAS (NUM_SALA) ) TYPE = INNODB; CREATE TABLE ENTRADAS ( NUM_ENTRADA SMALLINT NOT NULL AUTO_INCREMENT, IDPROY SMALLINT NOT NULL , FILA SMALLINT NOT NULL , NUM_ASIENTO SMALLINT NOT NULL , NUM_CLIENTE SMALLINT NOT NULL , RECOGIDA BOOL , PRIMARY KEY (NUM_ENTRADA), INDEX (IDPROY), FOREIGN KEY (IDPROY) REFERENCES PROYECCIONES (IDPROY), INDEX (NUM_CLIENTE), FOREIGN KEY (NUM_CLIENTE) REFERENCES CLIENTES (NUM_CLIENTE) ) TYPE = INNODB;

Como puede observarse, todas las tablas han sido definidas del tipo InnoDB, y en las tablas PROYECCIONES y ENTRADAS se definen dos claves forneas en cada una con sus respectivos ndices. Otra posibilidad para crear la base de datos con las restricciones de integridad referencial es aadir las claves forneas y los ndices despus de crear todas las tablas haciendo uso en este caso de la sentencia ALTER TABLE. El cdigo completo correspondiente a esta alternativa se muestra a continuacin:
CREATE DATABASE CINEMAS;

367

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

USE CINEMAS; CREATE TABLE PELICULAS ( IDPELICULA SMALLINT NOT NULL AUTO_INCREMENT, TITULO CHAR(50) NOT NULL , ACTORES MEDIUMTEXT , PRODUCCION MEDIUMTEXT , DIRECCION MEDIUMTEXT , GUION VARCHAR(40) , ANNO SMALLINT , DURACION SMALLINT NOT NULL , NACIONALIDAD VARCHAR(25) , GENERO ENUM('infantil','comedia','drama','accin', 'terror','ertica') , EDAD_RESTRICCION ENUM('apta','mayores 7', 'mayores 13','mayores 18') , SINOPSIS LONGTEXT , CARTELERA BLOB , PRIMARY KEY (IDPELICULA)) TYPE = INNODB; CREATE TABLE SALAS ( NUM_SALA SMALLINT NOT NULL , AFORO SMALLINT NOT NULL , NUM_FILAS SMALLINT NOT NULL , OBSERVACIONES LONGTEXT , PRIMARY KEY (NUM_SALA)) TYPE = INNODB; CREATE TABLE CLIENTES ( NUM_CLIENTE SMALLINT NOT NULL AUTO_INCREMENT, NOMBRE VARCHAR(40) NOT NULL , DIRECCION VARCHAR(50) , FECHANAC DATE , TELEF CHAR(9) , EMAIL CHAR(30) , PUNTOS_ACUM SMALLINT NOT NULL DEFAULT 0 , CLAVE CHAR(6) NOT NULL , PRIMARY KEY (NUM_CLIENTE)) TYPE = INNODB; CREATE TABLE PROYECCIONES ( IDPROY SMALLINT NOT NULL AUTO_INCREMENT, IDPELICULA SMALLINT NOT NULL , NUM_SALA SMALLINT NOT NULL , HORA TIME NOT NULL , FECHA DATE NOT NULL , TARIFA_REDUCIDA BOOL , ESTRENO BOOL , PRIMARY KEY (IDPROY)) TYPE = INNODB;

368

EL SISTEMA GESTOR DE BASES DE DATOS MYSQL

CREATE TABLE ENTRADAS ( NUM_ENTRADA SMALLINT NOT IDPROY SMALLINT NOT NULL FILA SMALLINT NOT NULL , NUM_ASIENTO SMALLINT NOT NUM_CLIENTE SMALLINT NOT RECOGIDA BOOL , PRIMARY KEY (NUM_ENTRADA))

NULL AUTO_INCREMENT, , NULL , NULL , TYPE = INNODB;

ALTER TABLE PROYECCIONES ADD INDEX IX_SE_PROYECTA (IDPELICULA); ALTER TABLE PROYECCIONES ADD FOREIGN KEY (IDPELICULA) REFERENCES PELICULAS (IDPELICULA); ALTER TABLE PROYECCIONES ADD INDEX IX_PROYECTA (NUM_SALA); ALTER TABLE PROYECCIONES ADD FOREIGN KEY (NUM_SALA) REFERENCES SALAS (NUM_SALA); ALTER TABLE ENTRADAS ADD INDEX IX_TIENE (IDPROY); ALTER TABLE ENTRADAS ADD FOREIGN KEY (IDPROY) REFERENCES PROYECCIONES (IDPROY); ALTER TABLE ENTRADAS ADD INDEX IX_COMPRA (NUM_CLIENTE); ALTER TABLE ENTRADAS ADD FOREIGN KEY (NUM_CLIENTE) REFERENCES CLIENTES (NUM_CLIENTE);

La creacin de la base de datos anterior desde el monitor de MySQL puede resultar un tanto engorrosa; con objeto de facilitar la ejecucin de sentencias SQL, MySQL admite la posibilidad de ejecutar todas las sentencias que se encuentren en un fichero de texto con la extensin .sql. La forma de hacerlo es usar el comando SOURCE dentro del monitor, indicando a continuacin el nombre del fichero con su ruta de acceso. Ejemplo 14.21: Suponiendo que el fichero con las instrucciones de creacin de las tablas se llama cinemas.sql y que se encuentra en el directorio raz, la creacin de la base de datos se podra hacer de la manera siguiente:
mysql> SOURCE c:/cinemas.sql; Query OK, 1 row affected (0.10 sec) Database changed Query OK, 0 rows affected (0.78 sec) Query OK, 0 rows affected (0.13 sec) Query OK, 0 rows affected (0.23 sec) Query OK, 0 rows affected (0.34 sec) Query OK, 0 rows affected (0.15 sec)

369

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

NOTA

Desde dentro del monitor de MySQL es posible dar la orden de ejecucin de las sentencias que se encuentren incluidas en un fichero externo usando el comando SOURCE que se acaba de ver. Tambin es posible ejecutar ese fichero externo desde la lnea de comandos del sistema al mismo tiempo que se entra en el monitor, la manera de hacerlo es entrar en el servidor con la orden: mysql u usuario -p <C:\fichero.sql

En el caso de producirse algn error relativo a la integridad referencial, el monitor de MySQL mostrara un mensaje como el siguiente:
ERROR 1005: Can't create table '.\cinemas\proyecciones.frm' (errno: 150) ERROR 1005: Can't create table '.\cinemas\entradas.frm' (errno: 150)

Por ejemplo, estos mensajes apareceran si se tratan de crear las claves forneas sin crear los correspondientes ndices. Si no se produce ningn error, se puede comprobar que las cinco tablas de la base de datos habrn sido generadas correctamente:
mysql> show tables; +-------------------+ | Tables_in_cinemas | +-------------------+ | clientes | | entradas | | peliculas | | proyecciones | | salas | +-------------------+ 5 rows in set (0.00 sec)

Cuando se crea una tabla con una clave fornea MySQL asigna internamente un ID que har referencia a la restriccin que establece sobre la tabla. Para conocer estos ID se puede utilizar la instruccin SHOW CREATE TABLE. A continuacin se muestra a continuacin la aplicacin de esta sentencia sobre la tabla PROYECCIONES.

370

EL SISTEMA GESTOR DE BASES DE DATOS MYSQL

mysql> SHOW CREATE TABLE PROYECCIONES; +--------------+--------------------------------------------------------+ | Table | Create Table |

+--------------+--------------------------------------------------------+ | PROYECCIONES | CREATE TABLE `proyecciones` ( | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `IDPROY` smallint(6) NOT NULL auto_increment, `IDPELICULA` smallint(6) NOT NULL default '0', `NUM_SALA` smallint(6) NOT NULL default '0', `HORA` time NOT NULL default '00:00:00', `FECHA` date NOT NULL default '0000-00-00', `TARIFA_REDUCIDA` tinyint(1) default NULL, `ESTRENO` tinyint(1) default NULL, PRIMARY KEY (`IDPROY`), KEY `IX_SE_PROYECTA` (`IDPELICULA`), KEY `IX_PROYECTA` (`NUM_SALA`), CONSTRAINT `proyecciones_ibfk_2` FOREIGN KEY (`NUM_SALA`) | | | | | | | | | | | | | | | | | |

REFERENCES `salas` (`NUM_SALA`), CONSTRAINT `proyecciones_ibfk_1` FOREIGN KEY (`IDPELICULA`) REFERENCES `peliculas` (`IDPELICULA`) ) TYPE=InnoDB

+--------------+--------------------------------------------------------+ 1 row in set (0.13 sec)

Como se puede apreciar la clave fornea NUM_SALA de la tabla PROYECCIONES quedar identificada como proyecciones_ibfk_2 y la clave fornea IDPELICULA como proyecciones_ibfk_1. Estos identificadores se utilizan

371

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

por ejemplo para eliminar la correspondiente clave fornea con la sentencia ALTER TABLE. Por ejemplo, si se quisiese suprimir la clave fornea NUM_SALA se podra ejecutar la sentencia:
ALTER TABLE PROYECCIONES DROP FOREIGN KEY proyecciones_ibfk_1;

14.7.2. INSERCIN DE REGISTROS EN TABLAS RELACIONADAS


Para comprender el funcionamiento de la integridad referencial, se podran incluir en las tablas de la base de datos recin creada los primeros registros. Ejemplo 14.22: En primer lugar se insertar una pelcula y dos salas en las respectivas tablas:
mysql> INSERT INTO PELICULAS(IDPELICULA,TITULO,ANNO) -> VALUES(1,'Buscando a Nemo',2003); Query OK, 1 row affected (0.50 sec) mysql> INSERT INTO SALAS(NUM_SALA,AFORO,NUM_FILAS) -> VALUES (1,240,12); Query OK, 1 row affected (0.55 sec) mysql> INSERT INTO SALAS(NUM_SALA,AFORO,NUM_FILAS) -> VALUES (2,180,10); Query OK, 1 row affected (0.04 sec)

Una vez incluida la pelcula, cuyo identificador es 1, y las salas, con identificadores 1 y 2 respectivamente, es posible, por ejemplo, dar de alta una nueva proyeccin de la pelcula 1 en la sala 2 para las 16:30 del da 16 de mayo de 2004; esta proyeccin tendr como identificador el nmero 1:
mysql> INSERT INTO PROYECCIONES(IDPROY,IDPELICULA, -> NUM_SALA,HORA,FECHA) -> VALUES(1,1,2,'16:30:00','2004-5-16'); Query OK, 1 row affected (0.09 sec)

En cambio, si se trata de insertar una nueva proyeccin que referencie a una sala inexistente (sala 3) o una pelcula inexistente (pelcula 50), se produce una violacin de las restricciones de integridad referencial, MySQL detecta esa violacin, no incluye el registro y muestra un mensaje de error.

372

EL SISTEMA GESTOR DE BASES DE DATOS MYSQL

mysql> INSERT INTO PROYECCIONES(IDPROY,IDPELICULA, -> NUM_SALA,HORA,FECHA) -> VALUES(2,1,3,'16:30:00','2004-5-17'); ERROR 1216: Cannot add or update a child row: a foreign key constraint fails mysql> INSERT INTO PROYECCIONES(IDPROY,IDPELICULA, -> NUM_SALA,HORA,FECHA) -> VALUES(3,50,1,'20:15:00','2004-5-21'); ERROR 1216: Cannot add or update a child row: a foreign key constraint fails

14.7.3. ELIMINACIN DE REGISTROS EN TABLAS RELACIONADAS


Se pueden producir tambin violaciones de integridad referencial en las operaciones de borrado. Ejemplo 14.23: MySQL no permitira borrar la pelcula 1 ni la sala 2 porque existen proyecciones relacionadas que quedaran hurfanas en caso de producirse el borrado. En cambio s es posible borrar la sala 1 ya que no tiene ninguna proyeccin relacionada.
mysql> DELETE FROM PELICULAS WHERE IDPELICULA=1; ERROR 1217: Cannot delete or update a parent row: a foreign key constraint fails mysql> DELETE FROM SALAS WHERE NUM_SALA=1; Query OK, 1 row affected (0.11 sec) mysql> DELETE FROM SALAS WHERE NUM_SALA=2; ERROR 1217: Cannot delete or update a parent row: a foreign key constraint fails

Para poder borrar los registros correspondientes a la pelcula 1 y sala 2 deberan borrarse previamente el registro que lo relaciona en la tabla de proyecciones.
mysql> DELETE FROM PROYECCIONES WHERE IDPROY=1; Query OK, 1 row affected (0.12 sec) mysql> DELETE FROM PELICULAS WHERE IDPELICULA=1; Query OK, 1 row affected (0.15 sec)

373

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

mysql> DELETE FROM SALAS WHERE NUM_SALA=2; Query OK, 1 row affected (0.09 sec)

En el ejemplo anterior se ha visto cmo cuando se utilizan claves forneas no es posible eliminar un registro si previamente no se eliminan los registros relacionados. Sin embargo, la definicin de claves forneas permite que estos procesos de eliminacin encadenados se produzcan de manera automtica, esto es lo que se denomina eliminacin en cascada, o bien se realicen otro tipo de operaciones automatizadas. En concreto, son cinco las opciones de borrado que se pueden utilizar a la hora de definir la clave fornea: ON DELETE RESTRICT: esta es la opcin por defecto e impide cualquier operacin de borrado mientras existan registros relacionados. o Ejemplo: no se podr borrar una pelcula mientras existan proyecciones de la misma. ON DELETE NO ACTION: produce el mismo efecto que la opcin anterior, es decir, se restringe la eliminacin. ON DELETE SET DEFAULT: al eliminar un registro, a los registros relacionados con l se les asignar automticamente el valor que haya sido definido por defecto para la clave fornea (esta opcin no est actualmente disponible en MySQL). ON DELETE SET NULL: al eliminar un registro, a los registros relacionados con l se les asignar automticamente el valor NULL para la clave fornea, siempre que esta haya sido definida permitiendo este valor. o Ejemplo: al borrar una pelcula se pondr el valor NULL en el atributo IDPELICULA de todas las proyecciones relacionadas (para que esto sea posible se tendra que eliminar la opcin NOT NULL que aparece en la definicin del atributo IDPELICULA de la tabla PROYECCIONES). ON DELETE CASCADE: los registros sern eliminados en cascada. o Ejemplo: al borrar una pelcula se borrarn todas las proyecciones de la misma. Ejemplo 14.24: Si se quisiera que los procesos de borrado se produjeran en cascada en la tabla de proyecciones, lo primero que se debera hacer es modificar la definicin de sus dos

374

EL SISTEMA GESTOR DE BASES DE DATOS MYSQL

claves forneas para incluir la opcin ON DELETE CASCADE. Estas modificaciones se pueden realizar con la sentencia ALTER TABLE:
mysql> ALTER TABLE PROYECCIONES ADD FOREIGN KEY(IDPELICULA) -> REFERENCES PELICULAS(IDPELICULA) ON DELETE CASCADE; Query OK, 0 rows affected (0.72 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> ALTER TABLE PROYECCIONES ADD FOREIGN KEY(NUM_SALA) -> REFERENCES SALAS(NUM_SALA) ON DELETE CASCADE; Query OK, 0 rows affected (0.72 sec) Records: 0 Duplicates: 0 Warnings: 0

De esta forma, a partir de ahora cada vez que se suprima una pelcula o una sala, automticamente se eliminarn todas las proyecciones de esa pelcula o que tengan lugar en esa sala. Para comprobar el correcto funcionamiento de estas opciones se incluyen a continuacin unas series de registros en las tres tablas implicadas. En primer lugar se insertan 4 pelculas:
mysql> INSERT INTO PELICULAS(IDPELICULA,TITULO) -> VALUES (10,"Piratas del Caribe"); Query OK, 1 row affected (0.59 sec) mysql> INSERT INTO PELICULAS(IDPELICULA,TITULO) -> VALUES (11,"La ventana secreta"); Query OK, 1 row affected (0.59 sec) mysql> INSERT INTO PELICULAS(IDPELICULA,TITULO) -> VALUES (12,"Cuando menos te lo esperas"); Query OK, 1 row affected (0.11 sec) mysql> INSERT INTO PELICULAS(IDPELICULA,TITULO) -> VALUES (13,"La mala educacin"); Query OK, 1 row affected (0.15 sec)

A continuacin se insertan los registros correspondientes a 3 salas:


mysql> INSERT INTO SALAS(NUM_SALA,AFORO,NUM_FILAS) -> VALUES(1,180,10); Query OK, 1 row affected (0.55 sec) mysql> INSERT INTO SALAS(NUM_SALA,AFORO,NUM_FILAS) -> VALUES(2,120,12); Query OK, 1 row affected (0.05 sec)

375

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

mysql> INSERT INTO SALAS(NUM_SALA,AFORO,NUM_FILAS) -> VALUES(3,90,10); Query OK, 1 row affected (0.10 sec)

Finalmente, se aaden registros correspondientes a las proyecciones:


mysql> INSERT INTO PROYECCIONES(IDPROY,IDPELICULA, -> NUM_SALA,HORA,FECHA) -> VALUES(1,10,2,'16:15','2004-7-23'); Query OK, 1 row affected (0.12 sec) mysql> INSERT INTO PROYECCIONES(IDPROY,IDPELICULA, -> NUM_SALA,HORA,FECHA) -> VALUES(2,10,3,'20:30','2004-7-24'); Query OK, 1 row affected (0.09 sec) mysql> INSERT INTO PROYECCIONES(IDPROY,IDPELICULA, -> NUM_SALA,HORA,FECHA) -> VALUES(3,11,3,'20:30','2004-7-25'); Query OK, 1 row affected (0.05 sec)

mysql> INSERT INTO PROYECCIONES(IDPROY,IDPELICULA, -> NUM_SALA,HORA,FECHA) -> VALUES(4,12,1,'21:00','2004-7-25'); Query OK, 1 row affected (0.11 sec)

Con tres sencillas consultas de seleccin se podra consultar el contenido de las tres tablas en este momento.
mysql> SELECT IDPELICULA,TITULO FROM PELICULAS; +------------+----------------------------+ | IDPELICULA | TITULO | +------------+----------------------------+ | 10 | Piratas del Caribe | | 11 | La ventana secreta | | 12 | Cuando menos te lo esperas | | 13 | La mala educacin | +------------+----------------------------+ 4 rows in set (0.15 sec)

376

EL SISTEMA GESTOR DE BASES DE DATOS MYSQL

mysql> SELECT * FROM SALAS; +----------+-------+-----------+---------------+ | NUM_SALA | AFORO | NUM_FILAS | OBSERVACIONES | +----------+-------+-----------+---------------+ | 1 | 180 | 10 | NULL | | 2 | 120 | 12 | NULL | | 3 | 90 | 10 | NULL | +----------+-------+-----------+---------------+ 3 rows in set (0.00 sec) mysql> SELECT IDPROY,IDPELICULA,NUM_SALA,HORA,FECHA -> FROM PROYECCIONES; +--------+------------+----------+----------+------------+ | IDPROY | IDPELICULA | NUM_SALA | HORA | FECHA | +--------+------------+----------+----------+------------+ | 1 | 10 | 2 | 16:15:00 | 2004-07-23 | | 2 | 10 | 3 | 20:30:00 | 2004-07-24 | | 3 | 11 | 3 | 20:30:00 | 2004-07-25 | | 4 | 12 | 1 | 21:00:00 | 2004-07-25 | +--------+------------+----------+----------+------------+ 4 rows in set (0.00 sec)

Por ejemplo, se desea eliminar la pelcula Piratas del Caribe (cuyo identificador es 10); la sentencia sera:
mysql> DELETE FROM PELICULAS WHERE -> TITULO='Piratas del Caribe'; Query OK, 1 row affected (0.54 sec)

Como puede apreciarse, el servidor de MySQL en este caso acepta la operacin de borrado y automticamente borra esa pelcula y las proyecciones nmero 1 y 2 (proyecciones que se encontraban relacionadas con la pelcula 10). Esto puede comprobarse volviendo a ejecutar la consulta de seleccin sobre la tabla de PROYECCIONES.
mysql> SELECT IDPROY,IDPELICULA,NUM_SALA,HORA,FECHA -> FROM PROYECCIONES; +--------+------------+----------+----------+------------+ | IDPROY | IDPELICULA | NUM_SALA | HORA | FECHA | +--------+------------+----------+----------+------------+ | 3 | 11 | 3 | 20:30:00 | 2004-07-25 | | 4 | 12 | 1 | 21:00:00 | 2004-07-25 | +--------+------------+----------+----------+------------+ 2 rows in set (0.00 sec)

377

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

De la misma manera se puede borrar la sala nmero 3 y las proyecciones asociadas (en este caso la proyeccin 3).
mysql> DELETE FROM SALAS WHERE NUM_SALA=3; Query OK, 1 row affected (0.46 sec) mysql> SELECT IDPROY,IDPELICULA,NUM_SALA,HORA,FECHA -> FROM PROYECCIONES; +--------+------------+----------+----------+------------+ | IDPROY | IDPELICULA | NUM_SALA | HORA | FECHA | +--------+------------+----------+----------+------------+ | 4 | 12 | 1 | 21:00:00 | 2004-07-25 | +--------+------------+----------+----------+------------+ 1 row in set (0.00 sec)

El contenido de las dos restantes tablas puede verse a continuacin:


mysql> SELECT IDPELICULA,TITULO FROM PELICULAS; +------------+----------------------------+ | IDPELICULA | TITULO | +------------+----------------------------+ | 11 | La ventana secreta | | 12 | Cuando menos te lo esperas | | 13 | La mala educacin | +------------+----------------------------+ 3 rows in set (0.00 sec)

mysql> SELECT * FROM SALAS; +----------+-------+-----------+---------------+ | NUM_SALA | AFORO | NUM_FILAS | OBSERVACIONES | +----------+-------+-----------+---------------+ | 1 | 180 | 10 | NULL | | 2 | 120 | 12 | NULL | +----------+-------+-----------+---------------+ 2 rows in set (0.00 sec)

378

EL SISTEMA GESTOR DE BASES DE DATOS MYSQL

14.7.4. ACTUALIZACIN DE REGISTROS EN TABLAS RELACIONADAS


Al igual que ocurre en las operaciones de borrado, en las actualizaciones de registros tambin se pueden ver afectados registros de tablas relacionadas. Por ejemplo, un cambio en la numeracin de las salas afecta a la correspondiente clave fornea de las proyecciones de dicha sala. A la hora de definir las claves primarias se puede definir tambin la operacin a realizar cuando se modifican registros relacionados. En concreto, son tres las opciones: ON UPDATE RESTRICT: esta es la opcin por defecto e impide cualquier modificacin mientras existan registros relacionados. o Ejemplo: no se podr cambiar el identificador de una sala o pelcula mientras existan proyecciones asociadas. ON UPDATE SET NULL: se establecern valores nulos para los atributos relacionados cuando se produzca un cambio en la clave de la tabla principal. ON UPDATE CASCADE: se producirn las modificaciones en cascada de todos los registros relacionados. o Ejemplo: al cambiar el nmero de sala se cambiar automticamente el nmero de sala de todas las proyecciones que tenan lugar en esa sala. Si en la tabla ya se ha definido previamente alguna restriccin de clave fornea, esta tiene que ser previamente eliminada para poder incluir la restriccin de actualizacin. En la eliminacin de la restriccin debe usarse el identificador interno que MySQL asocia a cada restriccin de integridad referencial. Ejemplo 14.25:
mysql> ALTER TABLE PROYECCIONES -> DROP FOREIGN KEY proyecciones_ibfk_4; Query OK, 1 row affected (0.30 sec) Records: 1 Duplicates: 0 Warnings: 0

Una vez eliminada la restriccin anterior se vuelve a definir incluyendo en este caso las dos opciones: la de borrado y la de actualizacin.

379

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

mysql> ALTER TABLE PROYECCIONES ADD FOREIGN KEY(NUM_SALA) -> REFERENCES SALAS(NUM_SALA) ON DELETE CASCADE -> ON UPDATE CASCADE; Query OK, 0 rows affected (0.30 sec) Records: 0 Duplicates: 0 Warnings: 0

NOTA

Cuando en una misma definicin de clave fornea se incluyen las dos opciones: borrado (ON DELETE) y actualizacin (ON UPDATE), necesariamente debe indicarse en primer lugar la de borrado y en segundo lugar la de actualizacin.

Ejemplo 14.26: A continuacin se muestra el funcionamiento de la actualizacin en cascada. En primer lugar se puede observar que la tabla SALAS incluye dos registros, uno de los cuales (el correspondiente a la sala 1) se encuentra relacionado con un registro de la tabla PROYECCIONES:
mysql> SELECT * FROM SALAS; +----------+-------+-----------+---------------+ | NUM_SALA | AFORO | NUM_FILAS | OBSERVACIONES | +----------+-------+-----------+---------------+ | 1 | 180 | 10 | NULL | | 2 | 120 | 12 | NULL | +----------+-------+-----------+---------------+ 2 rows in set (0.00 sec) mysql> SELECT IDPROY,IDPELICULA,NUM_SALA,HORA,FECHA -> FROM PROYECCIONES; +--------+------------+----------+----------+------------+ | IDPROY | IDPELICULA | NUM_SALA | HORA | FECHA | +--------+------------+----------+----------+------------+ | 4 | 12 | 1 | 21:00:00 | 2004-07-25 | +--------+------------+----------+----------+------------+ 1 row in set (0.00 sec)

La siguiente sentencia modifica el nmero de la sala 1, pasando a ser a partir de ahora la sala 3:
mysql> UPDATE SALAS SET NUM_SALA=3 WHERE NUM_SALA=1; Query OK, 1 row affected (0.45 sec) Rows matched: 1 Changed: 1 Warnings: 0

380

EL SISTEMA GESTOR DE BASES DE DATOS MYSQL

Como puede apreciarse, la modificacin se produce sobre la tabla SALAS pero tambin en el registro seleccionado de la tabla PROYECCIONES:
mysql> SELECT * FROM SALAS; +----------+-------+-----------+---------------+ | NUM_SALA | AFORO | NUM_FILAS | OBSERVACIONES | +----------+-------+-----------+---------------+ | 2 | 120 | 12 | NULL | | 3 | 180 | 10 | NULL | +----------+-------+-----------+---------------+ 2 rows in set (0.00 sec) mysql> SELECT IDPROY,IDPELICULA,NUM_SALA,HORA,FECHA -> FROM PROYECCIONES; +--------+------------+----------+----------+------------+ | IDPROY | IDPELICULA | NUM_SALA | HORA | FECHA | +--------+------------+----------+----------+------------+ | 4 | 12 | 3 | 21:00:00 | 2004-07-25 | +--------+------------+----------+----------+------------+ 1 row in set (0.00 sec)

14.8. IMPORTACIN Y EXPORTACIN DE DATOS


14.8.1. IMPORTACIN DE DATOS
Una vez definida la base de datos y establecidas las restricciones de integridad referencial, se est en condiciones de hacer uso de la misma. Por supuesto, una de las primeras labores a realizar ser la inclusin en las diferentes tablas de los registros con los datos a manejar. Una primera opcin para insertar datos es el uso de la sentencia INSERT, tal como se ha venido utilizando en los ejemplos anteriores. Sin embargo, el uso de esta sentencia para la inclusin de un gran nmero de registros resulta excesivamente laborioso; por ello, MySQL incorpora mecanismos mucho ms giles para cargar datos en las tablas desde ficheros externos. En concreto, se puede utilizar el programa mysqlimport que se encuentra en el directorio mysql/bin o el comando LOAD DATA INFILE del monitor de MySQL. Adems de estas opciones tambin sera posible escribir todo un conjunto de sentencias INSERT en un fichero de texto y ejecutarlas todas ellas con el comando SOURCE.

381

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Ejemplo 14.27: Supngase que se dispone de un fichero de texto que contiene la siguiente informacin:
1 2 3 4 Luis Lpez Mara Anta Ana Palacios Valeria Vzquez Floranes 54, Santander San Juan 22, Oviedo San Andrs 39, Madrid Moro 120, Almera 1970-3-31 1981-11-22 1968-5-1 1990-2-13 942221133 686776612 null 645162377 llopez@coldmail.com manta@tumail.com apm55@tumail.com vv90@coldmail.com 0 0 0 0 llp70 as23b aaa45b basw25

Como puede apreciarse, cada una de las lneas del fichero contiene los datos correspondientes a un registro de la tabla CLIENTES, coincidiendo en nmero y tipo los respectivos datos con los atributos de esa tabla, y estando separados los datos por tabuladores. Si se desea importar directamente esos datos desde el fichero de texto a la tabla CLIENTES de la base de datos CINEMAS, lo primero que debe hacerse es nombrar ese fichero como clientes.txt, obsrvese que es obligatorio que el nombre del fichero coincida con el nombre de la tabla. Una vez disponible el fichero anterior, desde la lnea de comandos del sistema (no desde dentro del monitor de MySQL) se hara una llamada a la utilidad mysqlimport indicando, por este orden, el nombre de usuario para conectarse al servidor, el parmetro para solicitar la contrasea, el nombre de la base de datos de destino y el nombre y ruta del archivo de texto:
C:\mysql\bin>mysqlimport -u root -p cinemas c:\clientes.txt Enter password: ******* cinemas.clientes: Records: 4 Deleted: 0 Skipped: 0 Warnings: 0

Entrando al monitor de MySQL se observa que los datos han sido correctamente importados.
C:\mysql\bin>mysql -u root -p Enter password: ******* Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 97 to server version: 4.0.18nt Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> USE cinemas; Database changed

382

EL SISTEMA GESTOR DE BASES DE DATOS MYSQL

mysql> SELECT NUM_CLIENTE, NOMBRE FROM clientes; +-------------+-----------------+ | NUM_CLIENTE | NOMBRE | +-------------+-----------------+ | 1 | Luis Lpez | | 2 | Mara Anta | | 3 | Ana Palacios | | 4 | Valeria Vzquez | +-------------+-----------------+ 4 rows in set (0.00 sec)

El programa mysqlimport cuenta con un gran nmero de parmetros opcionales, algunos de los ms destacados son:
-d o -delete: esta opcin hara que se borraran todos los datos

existentes en la tabla antes de la importacin. -r o -replace: esta opcin hara que aquellos registros de la tabla cuya clave primaria coincida con alguna de las que se estn importando sean reemplazados. -fields-enclosed-by=char: esta opcin permite especificar el carcter que encierra a los datos en el fichero de texto, por ejemplo, los diferentes datos podran estar encerrados entre comillas. -fields-terminated-by=char: esta opcin permite especificar el carcter que delimita los campos en el fichero de texto. Por defecto el delimitador es el tabulador. -lines-terminated-by=str: esta opcin permite especificar el carcter o secuencia de caracteres que acta de delimitador de registro en el fichero de texto. Por defecto el delimitador es el cambio de lnea. Otra alternativa para importar datos que se encuentren en ficheros de texto es el uso del comando LOAD DATA INFILE del monitor de MySQL. Para poder hacer uso de este comando, a diferencia del caso anterior, se debe estar ya dentro del monitor de MySQL, e incluso es posible su uso desde aplicaciones programadas al efecto. En algunos aspectos el uso de este comando es muy similar al uso de la utilidad mysqlimport ya que, por ejemplo, se pueden especificar los caracteres que actan de separadores de campos y registros.

383

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Ejemplo 14.28: Supngase que se desea incluir en la tabla SALAS los 7 registros que se encuentran en un fichero de texto llamado relacionsalas.txt y cuyo contenido es: 1,300,15,Localidades para minusvlidos 2,240,20 3,240,12,Sala renovada recientemente 4,120,10,Localidades para minusvlidos 5,120,12 6,120,10,Poca visibilidad en zonas laterales 7,90,10

Como se aprecia, en este caso el carcter que acta de separador de campos es la coma y el separador de registros el cambio de lnea. Este ltimo es el separador de registros por defecto, pero en cambio el separador de campos por defecto es el tabulador. Desde dentro del monitor de MySQL la secuencia de operaciones necesaria para importar esos datos es:
mysql> USE CINEMAS; Database changed mysql> LOAD DATA INFILE "C:/relacionsalas.txt" -> REPLACE INTO TABLE SALAS -> FIELDS TERMINATED BY ','; Query OK, 7 rows affected (0.64 sec) Records: 7 Deleted: 0 Skipped: 0 Warnings: 3

El parmetro opcional REPLACE indica que en caso de que ya existan registros con la misma clave en la tabla destino, estos deben ser reemplazados. De igual manera, se utiliza otro parmetro opcional (FIELDS TERMINATED BY) para indicar el separador de campos. Con una consulta SELECT se puede comprobar que los datos han sido correctamente importados:

384

EL SISTEMA GESTOR DE BASES DE DATOS MYSQL

mysql> SELECT * FROM SALAS; +----------+-------+-----------+-------------------------------------+ | NUM_SALA | AFORO | NUM_FILAS | OBSERVACIONES +----------+-------+-----------+-------------------------------------+ | 1 | 300 | 15 | Localidades para minusvlidos | 2 | 240 | 20 | NULL | 3 | 240 | 12 | Sala renovada recientemente | 4 | 120 | 10 | Localidades para minusvlidos | 5 | 120 | 12 | NULL | 6 | 120 | 10 | Poca visibilidad en zonas laterales | 7 | 90 | 10 | NULL +----------+-------+-----------+-------------------------------------+ 7 rows in set (0.03 sec)

Otro de los parmetros opcionales del comando LOAD DATA IN FILE es el parmetro ENCLOSED BY, que permite indicar el carcter que se utiliza para encerrar los campos. Por ejemplo, si los campos de los registros en el fichero de texto se encontraran encerrados entre caracteres #, el comando a utilizar para la importacin sera:
LOAD DATA INFILE "C:/relacionsalas.txt" INTO TABLE SALAS FIELDS TERMINATED BY ',' ENCLOSED BY '#';

Las dos opciones de importacin de datos analizadas resultan especialmente tiles cuando se dispone de los datos en otros soportes; por ejemplo, si se dispone de una hoja de clculo, se puede generar fcilmente un fichero de texto con los separadores que se desee para luego importarlo desde MySQL.

14.8.2. EXPORTACIN DE DATOS


Al igual que resulta interesante disponer de mecanismos para importar los datos, no menos interesante resulta poder generar ficheros de texto con los datos de las tablas o resultados de consultas con objeto de ser exportados a otras aplicaciones. Existen varias formas o mecanismos de exportacin de datos; la primera es el uso del programa mysqldump que permite generar un fichero de texto con todos los comandos de SQL necesarios para reconstruir la base de datos. Este fichero incluira todas las sentencias de creacin de tablas (CREATE TABLE) con sus relaciones y todas las sentencias de insercin de los registros en cada tabla (INSERT); de manera que ejecutando este fichero en MySQL o en otro sistema gestor de bases de datos basado en SQL se podra reconstruir completamente la base de datos.

385

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

La generacin de este fichero debe hacerse desde la lnea de comandos del sistema, utilizando la sintaxis siguiente:
C:\mysql\bin>mysqdump -u root -p cinemas >respaldobd.txt Enter password: *******

Si despus del nombre de la base de datos se indica el nombre de una de sus tablas, el fichero generado nicamente contendr la definicin de esa tabla y las sentencias de insercin de sus registros. Ejemplo 14.29: Se puede generar un fichero de respaldo de la tabla clientes de la siguiente manera:
C:\mysql\bin>mysqdump -u root -p cinemas clientes >rclie.txt Enter password: *******

Incluso es posible indicar una condicin de filtrado de registros, por ejemplo, generar el fichero con los datos de las salas de aforo mayor que 200:
C:\mysql\bin>mysqdump -u root -p w "AFORO>200" cinemas salas >rsalas.txt Enter password: *******

Desde dentro del monitor de MySQL tambin es posible la exportacin de datos a ficheros de texto, en este caso se utiliza el comando SELECT INTO OUTFILE. A continuacin se muestran un par de ejemplos de su uso desde el monitor de MySQL. Ejemplo 14.30:
mysql> USE CINEMAS; Database changed mysql> SELECT NOMBRE,PUNTOS_ACUM -> INTO OUTFILE 'PuntosClientes.txt' -> FIELDS TERMINATED BY ':'FROM CLIENTES; Query OK, 4 rows affected (0.00 sec)

Con esta instruccin se generara un fichero de texto con los nombres y puntos acumulados de todos los clientes, siendo el contenido del fichero el siguiente:
Luis Lpez:0,Mara Anta:0,Ana Palacios:0,Valeria Vzquez:0,

386

EL SISTEMA GESTOR DE BASES DE DATOS MYSQL

Ejemplo 14.31: Tambin es posible indicar una condicin de seleccin de registros, en este caso se obtienen los nombres de todos los clientes de Santander:
mysql> SELECT NOMBRE INTO OUTFILE 'ClientesSant.txt' -> FIELDS TERMINATED BY ':' FROM CLIENTES -> WHERE DIRECCION LIKE '%Santander%'; Query OK, 1 rows affected (0.03 sec)

El fichero de salida generado contendr en este caso un solo registro.

387

PHPMYADMIN: ADMINISTRACIN DE BASES DE DATOS MYSQL DESDE LA WEB


15.1. INTRODUCCIN
La administracin y gestin de las bases de datos de MySQL mediante el propio monitor de MySQL resulta en ocasiones un tanto laboriosa, especialmente para aquellos usuarios acostumbrados al uso de herramientas con interfaz grfica de usuario. Afortunadamente existen alternativas para la administracin de las bases de datos que resultan ms intuitivas y sencillas de utilizar; muchas de estas herramientas de gestin estn desarrolladas en el lenguaje PHP y permiten la administracin remota a travs de un servidor web. En concreto, una de las ms conocidas es la herramienta phpmyadmin, disponible de forma gratuita a travs de Internet y

389

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

desarrollada en PHP por una comunidad de usuarios sin nimo de lucro (http://www.phpmyadmin.net). La aplicacin phpmyadmin no es ms que un conjunto de pginas escritas en PHP y que son copiadas directamente en el directorio que aloja las pginas web del servidor. Mediante las diferentes pginas se pueden consultar las bases de datos disponibles, crear nuevas bases de datos, tablas, realizar consultas, insertar registros, administrar los usuarios y sus privilegios, hacer copias de seguridad de las bases de datos,... Por supuesto, para poder hacer uso de esta aplicacin de administracin de MySQL es necesario disponer de un servidor web con un intrprete de PHP, ya que todas las pginas estn escritas en ese lenguaje. Adems es preciso establecer los valores de diferentes parmetros de configuracin que se encuentran dentro del fichero config.inc.php alojado en el directorio que contiene todas las pginas que componen la aplicacin. Dos de estos parmetros seran PmaAbsoluteUri, que permite indicar el URL que identifica la localizacin exacta de la aplicacin, y auth_type, que permite indicar el tipo de autentificacin que se utilizar (existen tres opciones: autentificacin basada en cookies, basada en http o inclusin en el fichero de configuracin de los datos de usuario).

15.2. ENTRADA A PHPMYADMIN


La forma de comenzar a utilizar phpmyadmin es simple, basta con utilizar el navegador web para acceder a la pgina index.php que se encontrar en el directorio correspondiente del servidor web. En el caso de tener instalado el servidor web sobre el propio equipo (localhost) que se utilizar para la administracin, se deber escribir en la barra de direcciones del navegador:
http://localhost/phpmyadmin/

Para ello es necesario tambin que el servidor web tenga configuradas las pginas index.php como pginas de inicio de directorio. La aplicacin dispone de tres mtodos de autentificacin diferentes basados en nombres de usuario y contraseas. El ms simple, pero al mismo tiempo ms inseguro, es la escritura del nombre de usuario y la contrasea directamente en el fichero de configuracin. El segundo de los mtodos se basa en cookies, y en este

390

PHPMYADMIN: ADMINISTRACIN DE BASES DE DATOS MYSQL DESDE LA WEB

caso solicita al usuario a travs de un formulario de una pgina web el nombre y contrasea cada vez que acceda. Una vez autentificado como usuario registrado, se accede a la pgina de inicio de phpmyadmin (vase Figura 15.1).

Figura 15.1 Pgina de inicio de phpmyadmin

A travs de la pgina de inicio de phpmyadmin se accede de una forma sencilla e intuitiva a las diferentes opciones disponibles. La pgina, como puede apreciarse, est dividida en dos marcos, en el de la izquierda se podr seleccionar en todo momento una de las bases de datos que se encuentren disponibles en MySQL. En el marco de la derecha aparecen una serie de enlaces que permiten realizar las diferentes operaciones sobre la base de datos activa. Como podr comprobarse, todas las opciones disponibles se encuentran bien documentadas a travs de diferentes documentos de ayuda.

391

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

15.3. GESTIN DE BASES DE DATOS


15.3.1. CONSULTA DE LAS BASES DE DATOS
Una de las primeras operaciones que se puede realizar en phpmyadmin es la consulta de las bases de datos disponibles en cada momento. Para ello, en el marco izquierdo de la ventana aparece una lista desplegable con los nombres de esas bases de datos; entre parntesis se indica adems el nmero de tablas de cada una de ellas, tal como puede apreciarse en la Figura 15.2.

Figura 15.2 Seleccin de la base de datos activa

Figura 15.3 Estructura de la base de datos de Cinem@s

392

PHPMYADMIN: ADMINISTRACIN DE BASES DE DATOS MYSQL DESDE LA WEB

Una vez seleccionada una base de datos en esta lista, el marco de la derecha de la ventana mostrar la estructura de dicha base de datos. Por ejemplo, al seleccionar la base de datos de Cinem@s, la ventana del navegador tendr el aspecto que muestra la Figura 15.3. A travs de los enlaces de la parte superior se puede consultar la estructura de la base de datos (vista por defecto), ejecutar sentencias SQL directamente sobre la base de datos seleccionada, acceder a diferentes opciones para exportar datos, realizar consultas de seleccin (bsquedas) de una forma intuitiva, sin necesidad de dar el cdigo SQL correspondiente, generar otro tipo de consultas de manera interactiva y, finalmente, la posibilidad de eliminar completamente la base de datos activa.

15.3.2. MANIPULACIN DE LAS TABLAS


Al analizar la estructura de la base de datos, se puede ver la lista de sus tablas, con una serie de iconos para ejecutar diferentes acciones. Igualmente se puede obtener informacin sobre el nmero de registros, tipo de tabla y tamao de cada tabla.

Al pulsar la accin Examinar, se mostrarn todos los registros de la tabla. Por ejemplo la Figura 15.4 muestra el contenido de la tabla SALAS. Mediante los enlaces grficos que aparecen delante de cada registro se podrn editar sus campos o borrar el registro completamente. Adems, pulsando sobre los nombres de los campos que aparecen en las cabeceras de las columnas se puede variar el orden en el que se muestran los registros (orden ascendente o descendente sobre ese campo).

393

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Figura 15.4 Contenido de la tabla SALAS

Por encima de la tabla anterior puede verse tambin la consulta SQL que el propio programa ha generado, as como el tiempo empleado en la ejecucin de la misma (vase Figura 15.5). Esta es una interesante caracterstica de phpmyadmin, ya que al mostrar en todo momento las sentencias SQL su uso tiene tambin un cierto grado pedaggico, permitiendo al usuario comprobar el cdigo SQL de las consultas que genere de manera interactiva.

Figura 15.5 Consulta SQL generad.

La segunda de las posibles acciones a realizar sobre las tablas es la de seleccionar. Esta opcin da acceso a una pgina en la que es posible generar de manera intuitiva sencillas consultas de seleccin (SELECT). Por ejemplo, la Figura 15.6 muestra la manera de obtener un listado, en orden decreciente de aforo, de los nmeros de sala y aforos de todas las salas con capacidad mayor o igual a 200. En la Figura 15.7 puede verse el resultado de esta consulta.

394

PHPMYADMIN: ADMINISTRACIN DE BASES DE DATOS MYSQL DESDE LA WEB

Figura 15.6 Consulta de los aforos de las salas

Figura 15.7 Resultado de la consulta de aforos

395

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

De nuevo, adems de mostrar los registros, se muestra la sintaxis SQL de la sentencia SELECT que se ha utilizado para obtenerlos. La tercera de las opciones de manipulacin de tablas es la insercin de nuevos registros. Al igual que ocurre en los casos anteriores, la insercin se realizar a travs de sencillos formularios que liberarn al usuario de la generacin de las correspondientes sentencias INSERT. Por ejemplo, si se desea aadir un nuevo registro a la tabla de clientes, se utilizara el formulario que se muestra en la Figura 15.8. Por supuesto, los datos introducidos en los diferentes campos del formulario deben coincidir en tipo con los de los correspondientes atributos de la tabla, que son mostrados en la segunda columna del mismo. En la tercera columna del formulario se encuentran a su vez una serie de listas desplegables que dan acceso a diferentes funciones predefinidas en MySQL. Por ejemplo, en la insercin se utiliza la funcin PASSWORD que hace que el contenido introducido en el correspondiente campo quede almacenado en la tabla utilizando tcnicas de encriptacin, de esta manera cualquier operacin de seleccin posterior no mostrara el valor verdadero de ese atributo.

Figura 15.8 Insercin de un nuevo cliente

En la parte inferior del formulario existen dos botones de opcin que permiten especificar si se desea aadir un nuevo registro o simplemente volver a la estructura de la base de datos.

396

PHPMYADMIN: ADMINISTRACIN DE BASES DE DATOS MYSQL DESDE LA WEB

Al pulsar el botn Contine se realizar la insercin del registro y se mostrar adems la sentencia INSERT utilizada para dicha operacin (vase Figura 15.9).

Figura 15.9 Sentencia de insercin del nuevo cliente

Puede examinarse la tabla CLIENTES para comprobar que la insercin se realiz correctamente. Adems puede comprobarse cmo el valor que se muestra en el campo correspondiente a la clave aparece encriptado (vase Figura 15.10).

Figura 15.10 Nuevo registro

En el caso de tablas que contengan campos de texto largo, el formulario de insercin incluye reas de texto con barras de desplazamiento para poder introducir los contenidos. La Figura 15.11 muestra parte del formulario para insertar nuevas pelculas.

Figura 15.11 Formulario de insercin de nuevas pelculas

Adems, para el caso de campos de tipo blob, preparados para recibir cualquier tipo de archivo, el formulario permite directamente examinar el contenido del equipo y seleccionar el archivo a almacenar en la tabla. Este es el caso del campo CARTELERA de la tabla de PELICULAS (Figura 15.12).

397

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Figura 15.12 Campo de tipo blob

La siguiente accin que se puede realizar sobre las tablas es la de ver sus propiedades. En este caso se mostrar la estructura de la tabla, con los nombres y tipos de sus argumentos, as como cualquier otra propiedad de la misma establecida en tiempo de diseo (claves primarias, atributos no nulos, valores predeterminados, ndices,...). A travs de esta opcin no solo es posible consultar las propiedades de la tabla sino tambin modificarlas. La prxima seccin mostrar detalladamente las distintas opciones accesibles desde la pgina de propiedades. Finalmente, las dos ltimas acciones a realizar sobre las tablas son las de eliminar y vaciar. La eliminacin borra la tabla completa (sentencia DROP TABLE), mientras que el vaciado nicamente borra los registros que contiene la tabla pero la mantiene vaca en la base de datos (sentencia TRUNCATE). Al utilizar el enlace grfico de eliminacin aparecer un cuadro de dilogo que exige la confirmacin de la accin, preguntando si realmente se quiere eliminar dicha tabla (vase Figura 15.13).

Figura 15.13 Cuadro de confirmacin de la accin de borrado

De la misma manera, cuando se realiza la accin de vaciado, se pide confirmacin al usuario. Cuando se trabaja en MySQL con tablas que soporten la integridad referencial, las operaciones de eliminacin de tabla o de vaciado de registros solo son permitidas cuando no se estn utilizando en otras tablas vinculadas.

15.3.3. ESTRUCTURA DE LAS TABLAS


A travs de phpmyadmin es posible analizar la estructura completa de cada una de las tablas, comprobando los nombres y tipos de los diferentes atributos,as como

398

PHPMYADMIN: ADMINISTRACIN DE BASES DE DATOS MYSQL DESDE LA WEB

cualquier otra propiedad que se haya establecido en su diseo. No solo es posible analizar esa estructura sino tambin modificarla, cambiando los tipos de los atributos, eliminando o aadiendo nuevos atributos,... Para analizar la estructura de una de las tablas se puede pulsar sobre el enlace correspondiente que aparece en el marco izquierdo de la pgina principal (Figura 15.14).

Figura 15.14 Lista de tablas de la base de datos

Al hacerlo, se accede a una pgina similar a la que aparece cuando se consultan las propiedades de una tabla. En la parte superior de esa misma pgina aparecen una serie de enlaces adicionales que permiten realizar todo tipo de acciones sobre la tabla: examinar sus registros, ejecutar sentencias SQL, generar consultas de seleccin, insertar nuevos registros, exportar datos, cambiar el nombre de la tabla, cambiar su ubicacin,... Algunas de estas acciones pueden realizarse tambin a travs de la pgina que muestra la estructura completa de la base de datos. Al seleccionar una tabla, la pgina muestra por defecto sus propiedades, tal como se ve en la Figura 15.15, para el caso de la tabla CLIENTES.

Figura 15.15 Propiedades de la tabla CLIENTES

399

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

La relacin de campos de la tabla viene acompaada por informacin sobre sus respectivos tipos, atributos especiales, posibilidad de admitir valores nulos, valores predeterminados, uso de funciones especiales y, finalmente, una serie de iconos que permiten realizar las siguientes acciones sobre cada uno de los atributos: 1. Cambiar el atributo: se pueden modificar su nombre, tipo, valor por defecto y otros atributos. 2. Eliminar el atributo de la tabla. 3. Establecer dicho atributo como clave primaria de la tabla. 4. Definir un ndice sobre ese atributo. 5. Establecer la propiedad de unicidad de valores en el atributo. Debajo de la relacin de campos de la tabla puede verse informacin sobre los ndices definidos sobre la misma y espacio utilizado por la tabla. Finalmente, la pgina incluye algunos enlaces que permiten realizar acciones interesantes (vase Figura 15.16). El primero de ellos (vista impresin) genera una pgina con toda la informacin de la tabla en un formato ms manejable de cara a su impresin. Tambin es posible incluir nuevas columnas o campos a la tabla y ejecutar consultas SELECT en formato SQL o a travs de un fichero externo. El ltimo enlace de la pgina permite introducir datos en la tabla procedentes de un fichero de texto. En este caso deben establecerse los caracteres delimitadores de los campos y de los registros.

15.4. CREACIN DE NUEVAS BASES DE DATOS


En la seccin anterior se ha explicado la forma de consultar y gestionar las bases de datos existentes en MySQL. Como ejemplo se ha tomado la base de datos de Cinem@s que en su momento fue creada directamente mediante sentencias SQL a travs del monitor de MySQL. En esta seccin se ver cmo con phpmyadmin resulta sencillo el proceso de creacin de una base de datos completa, sin necesidad de tener ningn conocimiento del lenguaje de definicin SQL. En la pgina de inicio de phpmyadmin, la primera de las opciones disponibles es precisamente la de creacin de una nueva base de datos (Figura 15.17).

400

PHPMYADMIN: ADMINISTRACIN DE BASES DE DATOS MYSQL DESDE LA WEB

Figura 15.16 Opciones adicionales de manipulacin de tablas

Figura 15.17 Opcin de creacin de una nueva base de datos

En primer lugar debe indicarse el nombre para la nueva base de datos, al pulsar el botn Crear se accede a una nueva pgina (Figura 15.18) en la que se crearn las diferentes tablas. En este caso se est creando una nueva base de datos de nombre recursos_humanos cuyo objetivo podra ser mantener informacin sobre los trabajadores de la empresa Cinem@s, turnos de trabajo, horas extraordinarias,... Al crear la base de datos, la pgina muestra tambin la sentencia SQL correspondiente e incluye un simple formulario para crear las diferentes tablas de la nueva base de datos.

15.4.1. CREACIN DE TABLAS


La creacin de nuevas tablas se realiza a travs del formulario que incluye la pgina de la Figura 15.18. En primer lugar debe indicarse el nombre de la tabla y el nmero de campos que contendr (estos valores podrn ser modificados posteriormente). Por

401

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

ejemplo, a continuacin se crear una tabla de nombre empleados y con 7 campos (Figura 15.19).

Figura 15.18 Creacin de nuevas tablas

Figura 15.19 Creacin de una tabla con 7 campos

Al formulario de creacin de tablas puede accederse tambin desde la pgina que muestra la estructura de una base de datos en el caso de bases de datos ya existentes. El siguiente paso, ser definir los 7 campos de la tabla; para ello phpmyadmin muestra un nuevo formulario en el que este proceso se realiza de forma intuitiva (Figura 15.20). El formulario permite indicar los nombres de los campos, sus tipos,

402

PHPMYADMIN: ADMINISTRACIN DE BASES DE DATOS MYSQL DESDE LA WEB

longitud, atributos, admisin de valores nulos, valores predeterminados, definicin de claves, ndices,... El formulario finaliza con una lista en la que es posible elegir el tipo de tabla entre los tipos soportados por MySQL.

Figura 15.20 Formulario de definicin de campos de la tabla

Al pulsar el botn Grabar del formulario, la tabla se crear y phpmyadmin mostrar la sentencia SQL que la genera. Accediendo a la pgina de la estructura de la base de datos se podr repetir el proceso para crear nuevas tablas.

15.5. OPERACIONES DE IMPORTACIN Y EXPORTACIN DE DATOS


15.5.1. IMPORTACIN DE DATOS EXTERNOS EN LAS TABLAS
Dada una base de datos con su conjunto de tablas, evidentemente, una de las operaciones ms habituales ser la insercin de nuevos registros. Esta operacin puede realizarse de diferentes maneras, por un lado la ejecucin directa de las correspondientes sentencias INSERT, por otro, la utilizacin de los formularios de insercin que phpmyadmin genera y que fueron presentados al explicar las operaciones de manipulacin de tablas. Una tercera opcin disponible para crear

403

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

nuevos registros es la importacin de datos de ficheros externos. Esta opcin es especialmente recomendable cuando se desea importar un gran volumen de registros en una sola operacin. Supngase que se dispone de un fichero de texto con el contenido de la Figura 15.21, como puede apreciarse, cada una de las lneas del fichero corresponder a un registro de la tabla EMPLEADOS, los valores para cada campo se encuentran entrecomillados y separados entre s por comas.

Figura 15.21 Fichero de texto con datos de empleados

Para importar todos esos datos a la tabla de empleados se tendra que pulsar sobre el enlace Insertar archivo de texto en la tabla que aparece al final de la pgina que muestra la estructura de la correspondiente tabla. Al hacerlo se accede al formulario que muestra la Figura 15.22, en l se debe especificar el fichero fuente de los datos y los diferentes caracteres que actuarn de separadores de campos y de registros.

Figura 15.22 Formulario para la importacin de datos desde ficheros de texto

404

PHPMYADMIN: ADMINISTRACIN DE BASES DE DATOS MYSQL DESDE LA WEB

Una vez pulsado el botn Enviar, se proceder a la insercin automtica de los correspondientes registros. Tras dicha operacin puede examinarse la tabla para comprobar la correcta insercin de los mismos (Figura 15.23).

Figura 15.23 Contenido de la tabla EMPLEADOS

NOTA

Si se desea importar datos que se encuentren en una hoja de clculo, como por ejemplo Excel, puede utilizarse la opcin de exportar a un fichero de texto los datos de la hoja, para posteriormente importarlos desde MySQL utilizando phpmyadmin.

15.5.2. EXPORTACIN DE DATOS


Cuando se desea utilizar los datos almacenados en MySQL por otras aplicaciones, o incluso por otros sistemas gestores de bases de datos, se pueden utilizar las opciones de exportacin que incorpora phpmyadmin. Existen dos posibilidades de exportacin: Exportar la base de datos completa. Exportar tablas individuales.

Para exportar una base de datos debe activarse el enlace Exportar que aparece en la pgina de inicio de phpmyadmin. Al hacerlo se accede a una nueva pgina en la que en primer lugar habra que seleccionar la o las bases de datos que se desean exportar y el formato de exportacin (Figura 15.24). Existen cuatro formatos de exportacin:

405

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

SQL: se generara un documento de texto con todas las sentencias SQL necesarias para crear la estructura de la base de datos y aadir todos sus registros. Este documento podra ser ejecutado en otro sistema gestor de bases de datos basado en SQL para reproducir exactamente la base de datos exportada. Este formato de exportacin incorpora una serie de opciones para indicar si se desea utilizar las sentencias DROP antes de la creacin. LaTeX: en este caso se generara un documento con el cdigo necesario para visualizar las tablas de la base de datos en el formato LaTeX. LaTeX es un editor de texto muy utilizado en el mbito cientfico y para la edicin de publicaciones. CSV para Excel: se generara un fichero de texto con los contenidos de las tablas de la base de datos en formato CSV (valores separados por comas). Este formato puede ser ledo directamente por Excel para mostrar los contenidos de las tablas en una hoja de clculo. Datos CSV: exporta los datos de las tablas a formato CSV, pero en este caso se permite que el usuario elija los caracteres delimitadores de campo y de registro, los caracteres de fin de lnea y los valores a utilizar para reemplazar los valores nulos.

Figura 15.24 Exportacin de bases de datos

Cualquiera que sea el formato de exportacin elegido, la pgina de exportacin permite finalmente indicar si el resultado se desea visualizar directamente en el navegador o enviar a un archivo. En el caso de que se opte por esta ltima opcin, 406

PHPMYADMIN: ADMINISTRACIN DE BASES DE DATOS MYSQL DESDE LA WEB

se debe indicar el nombre del archivo a crear e incluso es posible especificar si se desea que sea comprimido utilizando el formato ZIP o GZIP (Figura 15.25).

Figura 15.25 Opciones de envo a archivo

La exportacin de una nica tabla de la base de datos es una operacin muy similar. Se accede a ella seleccionado la tabla a exportar en el enlace correspondiente del marco izquierdo de la pgina y posteriormente activando el enlace Exportar de la parte superior del marco derecho. La pgina a la que se accede es prcticamente igual a la del caso anterior, pero con dos diferencias: Existe un nuevo formato de exportacin exclusivo para tablas: el formato XML. La segunda diferencia es la posibilidad de elegir el nmero de registros que se desean exportar y el registro a partir del cual se inicia la exportacin.

15.6. GESTIN DE USUARIOS


15.6.1. USUARIOS Y PRIVILEGIOS
Todos los usuarios registrados en MySQL se encuentran almacenados en la tabla user de la base de datos mysql. Por supuesto, el contenido de dicha tabla puede ser visualizado desde phpmyadmin como el de cualquier otra tabla, bastara seleccionar la base de datos mysql en el marco izquierdo y examinar la tabla user. En dicha tabla se almacena el nombre de usuario, su contrasea, servidor desde el que se conecta y los privilegios globales que tendr sobre las bases de datos de MySQL. Cuando un usuario tiene permisos especficos sobre una base de datos

407

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

concreta, una tabla, o incluso una sola columna de una tabla, estos privilegios quedan reflejados en sendos registros de las tablas: db, tables_priv y columns_priv. Existe otra manera de consultar desde phpmyadmin los usuarios registrados. Adems, con esta opcin resulta muy simple la creacin de nuevos usuarios y la asignacin de privilegios. En la pgina de inicio de phpmyadmin se encuentra el enlace Privilegios, que da acceso a la pgina que puede verse en la Figura 15.26. En esta pgina se muestran todos los usuarios registrados en MySQL y los privilegios globales de cada uno de ellos. En el caso que se muestra existe un nico usuario (el usuario root que se crea por defecto al instalar MySQL) que tiene adems todos los privilegios globales, esto quiere decir que este usuario podr realizar cualquier tipo de accin sobre cualquier tabla de cualquier base de datos. Por debajo de la informacin de usuarios se encuentra un enlace que permitir agregar nuevos usuarios.

Figura 15.26 Pgina de gestin de usuarios

15.6.2. CREACIN DE USUARIOS


Para crear un nuevo usuario se puede insertar directamente un nuevo registro en la tabla user o utilizar la opcin anterior (enlace Agregar nuevo usuario de la pgina de Privilegios). Esta ltima alternativa permite definir privilegios especficos de una manera simple.

408

PHPMYADMIN: ADMINISTRACIN DE BASES DE DATOS MYSQL DESDE LA WEB

Por ejemplo, supngase que se desea crear un usuario de nombre cinemasadmin que tenga todo tipo de privilegios sobre la base de datos cinemas, pero no sobre las restantes bases de datos disponibles. Al pulsar sobre el enlace Agregar nuevo usuario, se accede al formulario mostrado en la Figura 15.27. En este formulario debe indicarse el nombre, servidor desde el que puede conectarse y contrasea, adems de sealar los privilegios globales que tendr. Estos privilegios globales se referirn a todas las bases de datos de MySQL; en este caso, el usuario cinemasadmin no tendr ningn privilegio global.

Figura 15.27 Insercin de un nuevo usuario

Al pulsar el botn Contine, se accede a una nueva pgina en la que se podr especificar privilegios especficos (Figura 15.28).

409

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Figura 15.28 Definicin de privilegios especficos para el usuario

Lo primera ser indicar sobre qu base de datos el usuario tendr privilegios especficos, para ello en la pgina aparece una lista con todas las bases de datos disponibles. Al elegir la base de datos cinemas o escribir su nombre en el campo que acompaa a la lista y pulsar Contine, se acceder a una nueva pgina (Figura 15.29). En esta nueva pgina se pueden sealar los privilegios especficos sobre la base de datos cinemas; como puede apreciarse se han sealado todos los privilegios. Una vez sealados, bastara pulsar el botn Contine para que esos privilegios queden registrados.

Figura 15.29 Definicin de privilegios

Como puede apreciarse en la Figura 15.29, es posible incluso especificar privilegios especficos para tablas concretas. Por ejemplo, supngase que Cinem@s quiere generar un nuevo usuario cuya labor sea el mantenimiento de la tabla de pelculas, pero no se desea que tenga acceso a ninguna otra tabla. El proceso de creacin de este nuevo usuario se describe a continuacin.

410

PHPMYADMIN: ADMINISTRACIN DE BASES DE DATOS MYSQL DESDE LA WEB

Lo primero ser crear el nuevo usuario sin asignarle ningn privilegio global. El proceso es idntico al realizado con el usuario anterior. A continuacin, de nuevo, se sealar que se desea definir privilegios especficos para la base de datos cinemas, en el formulario correspondiente, no se sealar ningn privilegio especfico para la base de datos y se indicar la tabla sobre la que s se desean definir privilegios, tal como puede verse en la Figura 15.30.

Figura 15.30 Asignacin de privilegios especficos sobre una tabla

Tras sealar la tabla PELICULAS, se accede a una nueva pgina (Figura 15.31) en la que es posible indicar las acciones que el usuario podr realizar sobre las diferentes tablas e incluso sobre los diferentes campos de cada tabla. En el caso anterior se est indicando que el usuario podr efectuar operaciones de seleccin, insercin, actualizacin y borrado sobre todos los campos de la tabla de pelculas. Pulsando el botn Contine estos privilegios quedarn registrados en la base de datos mysql.

411

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Figura 15.31 Definicin de las acciones permitidas sobre la tabla

NOTA

Para que todos los cambios realizados sobre los usuarios tengan efecto sobre MySQL, suele ser conveniente reiniciar el servidor de MySQL. Para realizar esta accin, en la pgina de inicio de phpmyadmin hay un enlace: Reinicio de MySQL.

Tras todos los procesos realizados, en la tabla user de la base de datos mysql habr dos nuevos registros correspondientes a los dos nuevos usuarios; en la tabla db aparecer un nuevo registro en el que se indica que el usuario cinemasadmin tiene todos los privilegios sobre la base de datos cinemas; y finalmente, en la tables_priv habr un nuevo registro en el que se indican los privilegios del usuario pelculas_op sobre la tabla pelculas de la base de datos cinemas.

412

CONECTIVIDAD A BASES DE DATOS MYSQL DESDE PHP


16.1. INTRODUCCIN
El elemento esencial en todo proceso de generacin de pginas web dinmicas es la conectividad con aplicaciones de gestin de bases de datos. Muchas de las pginas que se pueden encontrar en Internet se generan como resultado de una consulta a una base de datos. En estos casos es preciso utilizar el lenguaje de consulta de las bases de datos relacionales (SQL) embebido dentro de un lenguaje de programacin que permita generar esas pginas. En este captulo se mostrar cmo es posible realizar este proceso usando el lenguaje PHP y cmo la conectividad a bases de datos en MySQL se caracteriza por su sencillez y efectividad. Al igual que en los captulos precedentes, el objetivo no ser una mera descripcin de las diferentes funciones de conexin y de sus sintaxis; ms bien se tratar de mostrar su funcionamiento a travs de sencillos ejemplos tomando como referencia el sitio web Cinem@s que se viene desarrollando a lo largo del libro. Usando PHP

413

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

resultar muy sencillo, por ejemplo, generar la cartelera de pelculas del da interrogando a la base de datos y generando una pgina dinmica. Aunque este captulo se centra en la conectividad a bases de datos MySQL, desde PHP es posible comunicarse con la mayora de aplicaciones gestoras de bases de datos (Oracle, Informix, SQL Server, dBase, Ingres,...) de una forma similar a la que se utilizar con MySQL. En PHP las funciones de conectividad son especficas del gestor de bases de datos al que se realiza la conexin. As por ejemplo, para abrir una conexin con una base de datos MySQL se utiliza la funcin mysql_connect() mientras que si se desea abrir la conexin con una base de datos Oracle debe utilizarse la funcin Ora_Open(). Los nombres de todas las funciones PHP relativas a conectividad a bases de datos comienzan por un prefijo identificativo del gestor al que se dirigen. Por ejemplo, los nombres de las funciones de conexin a algunos de los gestores de bases de datos ms conocidos siguen los siguientes patrones:
Funciones de conectividad con MySQL: Funciones de conectividad con Oracle: Funciones de conectividad con Informix: Funciones de conectividad con dBase: Funciones de conectividad con Ingres: mysql_nombrefuncion Ora_nombrefuncion ifx_nombrefuncion dbase_nombrefuncion ingres_nombrefuncion

16.2. CONEXIN CON MYSQL DESDE PHP


16.2.1. APERTURA DE LA CONEXIN
El primer paso para conseguir acceder a los datos de una base de datos MySQL es establecer la conexin con el servidor de bases de datos. Desde PHP esta conexin se realiza con la funcin:
mysql_connect(servidor,usuario,contrasea)

Los tres parmetros anteriores permiten identificar el servidor sobre el que est instalado MySQL, y el nombre de usuario y contrasea necesarios para conectarse. Por supuesto, estos dos ltimos datos deben coincidir con los de un usuario registrado en MySQL.

414

CONECTIVIDAD A BASES DE DATOS MYSQL DESDE PHP

Cuando el servidor MySQL y el servidor web se encuentran en el mismo equipo la identificacin del servidor para realizar la conexin es localhost; en este caso adems, este parmetro sera opcional en la funcin mysql_connect(), ya que precisamente el valor por defecto es localhost. La funcin mysql_connect() devuelve un valor entero que se utilizar como identificador de la conexin en las operaciones posteriores. Si se produce un error en la conexin, el valor devuelto por la funcin ser 0.

16.2.2. CIERRE DE LA CONEXIN


La conexin realizada se cierra automticamente al terminar la ejecucin del script en el que se ha establecido, o bien explcitamente con la funcin mysql_close(). Esta funcin recibe como nico argumento el identificador de la conexin:
mysql_close(identificador)

El identificador de la conexin en la funcin mysql_close() es opcional, en caso de que no se indique se cerrar la ltima conexin abierta. La funcin mysql_close() devuelve un valor entero que ser nulo en el caso de que se produzca algn error en el proceso. De esta manera, el esquema general de un programa que realiza conectividad con MySQL sera:
$c = mysql_connect("localhost", "root", "miclave"); if (!$c) { die("Lo siento, error en la conexin"); } else { print("Conexin establecida correctamente"); } ............... ............... ............... mysql_close($c);

Como puede apreciarse, en primer lugar se realiza la conexin con el servidor local y utilizando como nombre de usuario root y contrasea miclave. Se asigna el identificador de la conexin a la variable $c, y se comprueba si su valor es distinto

415

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

de cero. Si la variable $c toma el valor nulo se deber a un error de conexin, por tanto se utiliza la funcin die() para mostrar el correspondiente aviso de error y abortar la ejecucin del resto del programa. Si la conexin se estableci satisfactoriamente, se mostrar un mensaje, se realizarn las operaciones deseadas sobre la base de datos y, finalmente, se cerrar la conexin. En el caso de no utilizar la funcin mysql_close(), cualquier conexin realizada con mysql_connect() se cerrar automticamente al finalizar la ejecucin del script. No obstante, si se desea que la conexin permanezca abierta para ser utilizada en programas de otras pginas que se ejecuten posteriormente, puede utilizarse una funcin alternativa para la apertura:
mysql_pconnect(servidor,usuario,contrasea)

La sintaxis de esta funcin es idntica a la de la funcin mysql_connect(). Este tipo de conexiones que no se cierran automticamente se denominan conexiones persistentes. El cierre de las conexiones persistentes debe realizarse con una funcin especial:
mysql_pclose(identificador)

16.3. SELECCIN DE LA BASE DE DATOS


Una vez abierta la conexin con el servidor MySQL, el siguiente paso ser la seleccin de una de las bases de datos disponibles para la realizacin de las operaciones posteriores sobre ella. La funcin que permite seleccionar una base de datos es:
mysql_select_db(nombreBD, identificador)

El primer parmetro ser el nombre de la base de datos a seleccionar y el segundo el identificador de la conexin. Este segundo parmetro es opcional, en caso de no indicarse, se considerar la ltima conexin realizada. De nuevo, como en todas las funciones de conexin, si se produce un error, por ejemplo, porque la base de datos no existe, la funcin mysql_select_db() devolver el valor 0. El valor devuelto por la funcin puede utilizarse en estructuras condicionales para asegurar que las operaciones posteriores se realizan nicamente si la seleccin ha sido exitosa.

416

CONECTIVIDAD A BASES DE DATOS MYSQL DESDE PHP

Ejemplo 16.1: La siguiente estructura aborta el programa si no se puede seleccionar la base de datos cinemas:
$c = mysql_connect("localhost","root","miclave"); $bd = mysql_select_db("cinemas",$c); if(!$c) { die("Base de datos no existente"); }

Una vez seleccionada la base de datos, esta pasa a ser la base de datos activa, y cualquier operacin posterior se dirigir a ella. En cualquier momento, mientras la conexin permanezca abierta, puede cambiarse la seleccin de la base de datos activa con una nueva llamada a la funcin mysql_select_db().
Si en lugar de trabajar con una de las bases de datos existentes se desea crear una nueva desde un programa PHP, se debe utilizar previamente la funcin mysql_create_db(nombreBD, identificador) para crearla. Posteriormente, y una vez seleccionada como base de datos actual, debern ejecutarse las correspondientes sentencias de creacin de tablas.

NOTA

16.4. EJECUCIN DE SENTENCIAS SQL SOBRE LA BASE DE DATOS SELECCIONADA


La funcin mysql_query() permite ejecutar cualquier sentencia SQL sobre la base de datos activa. Esta funcin admite dos argumentos, el primero es una cadena de caracteres con el cdigo SQL de la consulta a realizar; el segundo argumento ser el identificador de la conexin. Este segundo argumento es opcional y, de nuevo, en caso de no indicarse se asume la ltima conexin establecida.
mysql_query(sentencia, identificador)

Esta funcin devuelve 0 si se produce algn error o un nmero entero positivo en caso de ejecucin correcta. En las sentencias de seleccin, este valor devuelto se utilizar posteriormente para acceder al resultado de la consulta. En el caso de sentencias de creacin, insercin, eliminacin o actualizacin, este valor devuelto nicamente sirve para comprobar si la sentencia se ejecut correctamente.

417

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Existe otra funcin similar que permite ejecutar sentencias sobre cualquier base de datos, en este caso debe indicarse adems de la sentencia y el identificador de conexin, el nombre de la base de datos a la que se dirige la consulta:
mysql_db_query(nombreBD, sentencia, identificador)

Ejemplo 16.2: Supngase que se desea aadir un nuevo atributo a la tabla clientes de la base de datos cinemas para guardar el NIF de cada cliente. Esta sencilla modificacin podra realizarse desde un programa PHP como el siguiente:
$c = mysql_connect("localhost","root","miclave"); if(!$c) { die("Conexin fallida"); } $ok = mysql_select_db("cinemas",$c); if(!$ok) { die("Error en la seleccin de la base de datos"); } $consulta = "ALTER TABLE clientes ADD NIF VARCHAR(9) NOT NULL"; $resultado = mysql_query($consulta,$c); if($resultado) { print("Tabla actualizada"); } else { print("No se ha podido actualizar la tabla"); } mysql_close($c);

En este ejemplo puede apreciarse la sencillez para la integracin de sentencias SQL dentro de un programa PHP: basta con definirlas como una cadena de caracteres que ser enviada al servidor de MySQL mediante la funcin mysql_query(). Las condiciones iniciales de comprobacin de la conexin y seleccin de la base de datos podran escribirse de una forma ms compacta utilizando el operador lgico or:
$c = mysql_connect("localhost","root","miclave") or die("Conexin fallida: " . mysql_error()); mysql_select_db("cinemas",$c) or die("Error en la seleccin: " . mysql_error()); $consulta =

418

CONECTIVIDAD A BASES DE DATOS MYSQL DESDE PHP

"ALTER TABLE clientes ADD NIF VARCHAR(9) NOT NULL"; if(mysql_query($consulta,$c)) { print("Tabla actualizada"); } else { print("Error: " . mysql_error()); } mysql_close($c);

En este caso, cuando se desea realizar la asignacin del identificador de conexin, si la conexin se realiza satisfactoriamente, el funcionamiento del operador or hace que no se evale su segundo argumento. Sin embargo, si la conexin no se puede establecer, ese segundo argumento del operador lgico ser evaluado, y por tanto, se abortar el programa. Adems, en esta segunda versin se utiliza la funcin mysql_error() que devuelve una cadena de caracteres explicando el ltimo error producido en la operacin de acceso a datos.

16.4.1. INSERCIN DE DATOS A TRAVS DE FORMULARIOS


El Ejemplo 16.2 ha mostrado la sencillez de la ejecucin de una sentencia SQL desde PHP; sin embargo, ha tenido un mero carcter pedaggico, ya que la modificacin de la estructura de la tabla se podra haber realizado de una manera ms rpida y sencilla directamente desde el monitor de MySQL o desde la herramienta de administracin phpmyadmin. La verdadera utilidad de las funciones de conectividad a bases de datos desde PHP radica en la posibilidad de construir sentencias SQL de manera dinmica en el propio programa. Por ejemplo, generar una consulta de insercin a partir de los datos que el usuario introduzca en un formulario. Esto es lo que se tratar de presentar paso a paso a continuacin, tomando como referencia el formulario de insercin de nuevos clientes registrados en Cinem@s que ya fue presentado en el Captulo 3. El aspecto de la pgina que incluye este formulario es el que se muestra en la Figura 16.1.

Implementacin del "rea de clientes"


El formulario de registro de clientes de la Figura 16.1 solicita al usuario que introduzca los datos necesarios para crear un nuevo registro en la base de datos, esos datos sern remitidos a un programa PHP para su procesamiento.

419

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

El cdigo completo que define este formulario es el siguiente:


Fichero clientes.html: <FORM ACTION="nuevocliente.php" METHOD=POST> <TABLE> <TR> <TD>Nombre (*):</TD> <TD><INPUT TYPE=text size="40" name="nombre"></TD> </TR> <TR> <TD>Direccin:</TD> <TD><INPUT TYPE=text size="50" name="direccion"></TD> </TR> <TR> <TD>NIF (*):</TD> <TD><INPUT TYPE=text size="9" name="nif"></TD> </TR> <TR> <TD>Fecha de Nacimiento:</TD> <TD>da <INPUT TYPE=text size="2" name="dianac"> mes <INPUT TYPE=text size="2" name="mesnac"> ao <INPUT TYPE=text size="4" name="annonac"> </TD> </TR> <TR> <TD>Telfono:</TD> <TD><INPUT TYPE=text size="20" name="telefono"></TD> </TR> <TR> <TD>Email:</TD> <TD><INPUT TYPE=text size="30" name="email"></TD> </TR> </TABLE> Contrasea (*): <INPUT TYPE=password size="6" name="pass1"> Repita su contrasea: <INPUT TYPE=password size="6" name="pass2"> <BR> <FONT SIZE=-1> (*) campos obligatorios</FONT> <BR> <INPUT TYPE=submit value=Enviar> <INPUT TYPE=reset value=Borrar> </FORM>

420

CONECTIVIDAD A BASES DE DATOS MYSQL DESDE PHP

Figura 16.1 Pgina de registro de nuevos clientes

Cuando el usuario pulse el botn Enviar, los datos introducidos por este llegarn al fichero nuevocliente.php a travs de variables del mismo nombre que el de los campos correspondientes. Se asume que esos valores han sido validados en el cliente antes de ser remitidos al servidor (por ejemplo, mediante un script en JavaScript). A partir de los valores recibidos el programa PHP debe generar la correspondiente sentencia INSERT que se dirigir a la base de datos cinemas. Las operaciones de manipulacin de datos requerirn conectarse al servidor MySQL mediante un usuario registrado. Para facilitar el desarrollo y el mantenimiento de todos los programas que realicen esas conexiones, los datos de

421

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

configuracin (servidor, nombre de usuario, contrasea y base de datos a utilizar) pueden ser guardados en un fichero auxiliar que ser llamado desde cualquier programa que necesite realizar la conexin. A lo largo de este captulo se utilizar un usuario cinemasadmin con privilegios completos sobre la base de datos cinemas. En el Captulo 15 se explic el proceso de creacin de este usuario. Los datos de este usuario sern guardados en un fichero de nombre configuracion.inc cuyo contenido se muestra a continuacin: Fichero configuracin.inc:
<? $host = "localhost"; $usuario = "cinemasadmin"; $password = "miclave"; $db = "cinemas"; ?>

En cualquier otra pgina del sitio en la que se requiera hacer uso de esas variables de configuracin, bastara incluir la sentencia:
require('configuracion.inc');

Cualquier modificacin futura de los datos de usuario requerir nicamente la actualizacin de este fichero de configuracin, sin necesidad de modificar el resto de ficheros que compongan la aplicacin web. El cdigo completo del fichero nuevocliente.php con el que se insertaran en la base de datos los nuevos clientes registrados sera: Fichero nuevocliente.php:
<HTML> <HEAD> <TITLE>Registro de nuevo cliente</TITLE> </HEAD> <BODY> <?php // comprobacin de la recepcin de las variables if (isset($nombre,$nif,$pass1)) { // carga de las variables de configuracin // y realizacin de la conexin require('configuracion.inc'); $c = mysql_connect($host,$usuario,$password) or die("Error: " . mysql_error());

422

CONECTIVIDAD A BASES DE DATOS MYSQL DESDE PHP

mysql_select_db($db,$c) or die("Error: " . mysql_error()); // generacin de la consulta SQL a partir de las // variables del formulario $fecha = "$annonac-$mesnac-$dianac"; $consulta = "INSERT INTO clientes(NOMBRE,NIF,DIRECCION, FECHANAC,TELEF, EMAIL,CLAVE) VALUES('$nombre','$nif','$direccion', '$fecha','$telefono','$email', '$pass1')"; // ejecucin de la consulta if(mysql_query($consulta,$c)) { $numcliente = mysql_insert_id(); print("<CENTER><H2>$nombre, muchas gracias por registrarte en Cinem@s.</H2>"); if ($email!="") { $mens = "Bienvenido a Cinem@s.\n Al ser " . "cliente registrado de nuestra " . "empresa te podrs beneficiar de " . "grandes ventajas.\n Para acceder " . "a tu pgina personal necesitars " . "tu nmero de cliente ($numcliente) " . "y tu clave ($pass1)."; mail($email,"Registro en Cinem@s",$mens); } print("Tu nmero de cliente es: <B> $numcliente </B><BR> Necesitars este nmero y tu contrasea para entrar a tu pgina personal.<BR>. Hemos enviado un email a tu direccin de correo electrnico informndote de tus datos de acceso </CENTER>"); } else { print("Fallo en el registro: " . mysql_error()); } // cierre de la conexin mysql_close($c); } ?> </BODY> </HTML>

La sintaxis SQL de la sentencia INSERT obliga a dar entrecomillados los diferentes valores para los campos; en este caso se utilizan las comillas simples

423

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

dentro de la cadena definida con comillas dobles. En la generacin de la consulta se puede apreciar la utilidad de la opcin de expandir variables dentro de las cadenas en PHP. En el programa anterior se utiliza la funcin mysql_insert_id() para obtener el valor del campo clave del ltimo registro insertado en el caso de que ese atributo haya sido definido como autonumrico (AUTO_INCREMENT). Igualmente se utiliza la funcin mail() para el envo de un mensaje de correo electrnico. Los argumentos mnimos de esta funcin son, por este orden, la direccin de correo electrnico del destinatario, el asunto del mensaje y el cuerpo del mensaje.

NOTA

El correcto funcionamiento de la funcin mail() exige que el servidor tenga instalada y correctamente configurada una aplicacin servidor de correo electrnico.

16.4.2. RECUPERACIN DE LOS RESULTADOS DE LAS CONSULTAS


Determinadas consultas de SQL, como las de insercin, borrado o actualizacin, realizan acciones sobre los datos de la base de datos pero no devuelven ninguna informacin, simplemente realizan esa accin. En cambio, las consultas de seleccin (SELECT) deben devolver un conjunto de registros como consecuencia de su realizacin. La ejecucin de la sentencia de seleccin se realiza, como con cualquier otra sentencia, mediante la funcin mysql_query(); una vez ejecutada, el resultado se almacena en una zona de la memoria mediante un tipo especial de estructura de datos conocida como recurso y que en PHP se utiliza para referenciar ciertos recursos externos. Para identificar esa zona de memoria y poder acceder a los datos se debe utilizar el valor entero que devuelve la funcin mysql_query(). Para acceder a los resultados de la consulta puede utilizarse la funcin:
mysql_fetch_row(resultado)

424

CONECTIVIDAD A BASES DE DATOS MYSQL DESDE PHP

Cada vez que se produce la llamada a esta funcin se genera un array con los valores de una de las filas de la tabla de resultados. Mediante un bucle de llamadas sucesivas se podrn recorrer todas las filas que constituyen el resultado. Cuando no hay ms filas por leer, la funcin devuelve un valor nulo que puede ser utilizado como indicador de finalizacin del bucle. Tambin es posible saber cuntas filas o registros incluye el resultado de la consulta. Para ello se puede utilizar la funcin:
mysql_num_rows(resultado)

Esta funcin devuelve una valor entero indicando el nmero de filas del resultado. El valor del argumento en ambas funciones es el entero devuelto por la funcin mysql_query() para identificar al recurso resultado. Relacionada con esta ltima funcin est la funcin
mysql_affected_rows()

que devuelve el nmero de registros que se han visto afectados por la ltima consulta realizada de insercin, actualizacin o borrado. Como primer ejemplo de ejecucin de sentencias de seleccin desde programas PHP se presenta a continuacin la implementacin del acceso a la pgina personal de los clientes de Cinem@s. Como punto de partida se toma el formulario que se incluye en la pgina de clientes compuesto de sendos campos de texto para solicitar el nmero de cliente y la contrasea de acceso. El cdigo HTML de este formulario es:
<FORM ACTION=accesocliente.php METHOD=POST> Nmero de cliente: <INPUT TYPE=text SIZE="5" NAME="numcliente"><BR> Contrasea: <INPUT TYPE=password SIZE="6" NAME="pass"><BR> <INPUT TYPE=submit VALUE=Entrar> </FORM>

El archivo accesocliente.php es el encargado de recibir los datos de autentificacin del cliente y con ellos realizar una bsqueda del registro correspondiente, comprobar la validez de la contrasea aportada y, en su caso, generar la pgina mostrando toda la informacin del cliente. El cdigo completo se incluye a continuacin:

425

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Fichero accesocliente.php:
<HTML> <HEAD><TITLE>Pgina personal</TITLE></HEAD> <BODY> <TABLE WIDTH="100%" BORDER BGCOLOR=#99CCFF> <TR> <TH WIDTH="16%"> <A HREF="principal.htm">Pgina principal</A></TH> <TH WIDTH="17%"> <A HREF="proyecciones.htm">Nuestra cartelera</A></TH> <TH WIDTH="17%"> <A HREF="salas.htm">Nuestras salas</A></TH> <TH WIDTH="17%"> <A HREF="entradas.htm">Compra de entradas</A></TH> <TH WIDTH="17%"> <A HREF="estrenos.htm">Prximos estrenos</A></TH> <TH WIDTH="16%"> <A HREF="foros/index.php">Foro Cinem@s</A></TH> </TR> </TABLE> <BR> <?php // comprobacin de la recepcin de las variables if (isset($numcliente,$pass)) { // carga de las variables de configuracin // y realizacin de la conexin require('configuracion.inc'); $c = mysql_connect($host,$usuario,$password) or die("Error: " . mysql_error()); mysql_select_db($db,$c) or die("Error: " . mysql_error()); // comprobacin de peticin de modificacin de datos if(isset($modificar)) { // generacin de la consulta de actualizacin $consulta = "UPDATE CLIENTES SET NOMBRE = '$nombre', NIF = '$nif', DIRECCION = '$direccion', FECHANAC = '$fecha', TELEF = '$telefono', EMAIL = '$email', CLAVE = '$pass' WHERE NUM_CLIENTE = $numcliente"; // ejecucin de la consulta $resultado = mysql_query($consulta,$c);

426

CONECTIVIDAD A BASES DE DATOS MYSQL DESDE PHP

if ($resultado) print "<CENTER><I> Datos actualizados</I></CENTER>"; } // generacin de la consulta de seleccin a partir // de las variables del formulario $consulta = "SELECT * FROM CLIENTES WHERE NUM_CLIENTE=$numcliente"; // ejecucin de la consulta $resultado = mysql_query($consulta,$c); // comprobacin existencia de algn registro resultado if(mysql_num_rows($resultado)) { // se recupera el registro resultado en un array $registro = mysql_fetch_row($resultado); // obtencin del password real del cliente en la BD //(octavo campo del registro: ndice 7) $passwordreal = $registro[7]; // comprobacin de la validez del password if ($pass == $passwordreal) { mostrarpagina($registro); } else { // denegar acceso print "<H2 ALIGN=center> Contrasea incorrecta</H2>"; } } else { // ningn registro coincide con el nmero de cliente print("<H2 ALIGN=center> Error en la identificacin</H2>"); } // cierre de la conexin mysql_close($c); } ?> <?php // funcin que genera la pgina personal function mostrarpagina($datos) { print "<H2 ALIGN=center> Pgina de $datos[1] </H2>"; print "<CENTER>"; print "<FORM ACTION=accesocliente.php METHOD=post>"; print "<TABLE WIDTH=80% BORDER BGCOLOR=#99CCFF> <TR>

427

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

<TH BGCOLOR=blue>Nmero de cliente</TH> <TD> $datos[0] </TD> </TR> <TR> <TH BGCOLOR=blue>Nombre</TH> <TD> <INPUT TYPE=text SIZE=40 NAME=nombre VALUE='$datos[1]'> </TD> </TR> <TR> <TH BGCOLOR=blue>Direccin</TH> <TD> <INPUT TYPE=text SIZE=50 NAME=direccion VALUE='$datos[2]'> </TD> </TR> <TR> <TH BGCOLOR=blue>Fecha de nacimiento</TH> <TD> <INPUT TYPE=text SIZE=10 NAME=fecha VALUE='$datos[3]'> </TD> </TR> <TR> <TH BGCOLOR=blue>Telfono</TH> <TD> <INPUT TYPE=text SIZE=9 NAME=telefono VALUE='$datos[4]'> </TD> </TR> <TR> <TH BGCOLOR=blue>email</TH> <TD> <INPUT TYPE=text SIZE=30 NAME=email VALUE='$datos[5]'> </TD> </TR> <TR> <TH BGCOLOR=blue>clave</TH> <TD> <INPUT TYPE=password SIZE=6 NAME=pass VALUE='$datos[7]'> </TD> </TR> <TR> <TH BGCOLOR=blue>NIF</TH>

428

CONECTIVIDAD A BASES DE DATOS MYSQL DESDE PHP

<TD> <INPUT TYPE=text SIZE=9 NAME=nif VALUE='$datos[8]'> </TD> </TR> </TABLE>"; print "<INPUT TYPE=hidden NAME=modificar VALUE=1> <INPUT TYPE=hidden NAME=numcliente VALUE=$datos[0]> <BR><INPUT TYPE=submit VALUE=Actualizar> </FORM>"; print "<H3 ALIGN=center> A fecha de hoy tienes un total de $datos[6] puntos acumulados </H3>"; print "</CENTER><BR>"; } ?> <HR> <A HREF="clientes.htm">Volver al rea de clientes</A> </BODY> </HTML>

Este archivo comienza con el cdigo HTML que genera una pequea barra de navegacin en la pgina para que el usuario pueda desplazarse a otras pginas del sitio web. Tras este cdigo HTML aparece el programa PHP encargado de la generacin del contenido de la pgina personal. Este programa comienza comprobando si se han recibido las variables correspondientes al nmero de cliente y clave de acceso desde el formulario previo. La pgina ha sido diseada para que permita tambin actualizar los datos del cliente, de manera que se utilizar una variable $modificar que tomar el valor 1 cuando se acceda a la pgina despus de una peticin de actualizacin de datos. En el caso de acceder directamente desde el formulario del rea de clientes, esta variable no estar definida. Cuando se acceda en modo actualizacin, a la pgina accesocliente.php se habr llegado despus de una carga previa de la propia pgina y usando un formulario que se encuentra en la pgina y que es construido ms adelante en el propio programa PHP. Ese formulario enviar los valores de los nuevos atributos del cliente, con esos valores se genera y ejecuta la correspondiente sentencia UPDATE. Posteriormente, se encuentra el cdigo que genera el contenido de la pgina que ser visible por el cliente. Se comprueba la correcta autentificacin del cliente mediante la comparacin de la clave aportada y la clave real almacenada, y en caso

429

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

de coincidencia se llama a una funcin mostrarpagina(). Esta funcin se encuentra definida en un script posterior de la pgina y genera una tabla en la que se muestran, utilizando campos de formulario, los valores de los atributos del cliente. Estos campos de formulario tendrn una doble funcionalidad: mostrar los valores actuales y permitir las actualizaciones. El aspecto final de la pgina personal del cliente que es generada con este programa es el que puede verse en la Figura 16.2.

Figura 16.2 Pgina personal de un cliente

En el programa anterior se ha utilizado la funcin mysql_fetch_row() para recuperar en un array el resultado de la consulta de seleccin. Posteriormente, para acceder a los diferentes campos del registro se necesit saber el orden en el que

430

CONECTIVIDAD A BASES DE DATOS MYSQL DESDE PHP

dichos campos se encuentran en la tabla de la base de datos, ya que el primer campo corresponde con el valor de ndice 0 en el array, el segundo con el ndice 1, y as sucesivamente. En algunas ocasiones esto puede resultar un tanto engorroso y puede provocar errores en la codificacin de los programas; por esa razn, PHP dispone de otra funcin que puede facilitar el tratamiento de los resultados de las consultas:
mysql_fetch_array(resultado) mysql_fetch_array(resultado, tipo_asociacin)

Esta funcin tiene un funcionamiento similar a mysql_fetch_row(), es decir, en cada llamada genera un array con los datos correspondientes a uno de los registros del resultado. Se pueden ir repitiendo las llamadas de forma sucesiva para recuperar todos los registros obtenidos en la consulta. La principal ventaja de la funcin mysql_fetch_array()es que permite recuperar los datos en arrays asociativos en los que en lugar de utilizar ndices numricos se pueden utilizar los propios nombres de los campos de la tabla como llaves ndices del array. El segundo argumento de mysql_fetch_array() es opcional y puede tomar uno de los valores siguientes: MYSQL_ASSOC el registro se carga en un array al que se accede nicamente mediante palabras clave (los campos de la tabla). el registro se carga en un array al que se accede nicamente usando ndices numricos, tal como ocurre con la funcin mysql_fetch_row(). (opcin por defecto) ambos mtodos de acceso a los elementos del array son posibles.

MYSQL_NUM

MYSQL_BOTH

Al igual que mysql_fetch_row()permite un acceso nicamente con ndices numricos, existe en PHP una nueva funcin, de sintaxis similar, que permite un acceso nicamente mediante palabras clave, dicha funcin es:
mysql_fetch_assoc(resultado)

En definitiva, de las tres funciones comentadas de recuperacin de datos, la ms general, y la que resulta ms recomendable, es mysql_fetch_array() ya que permite utilizar los dos tipos de mecanismos de acceso a los elementos del array.

431

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Adems, debe destacarse que no se aprecian diferencias significativas con las otras dos funciones en cuanto a tiempo de ejecucin.

Implementacin de la pgina de caractersticas de las salas


A modo de ejemplo de uso de la funcin mysql_fetch_array()para recuperar los registros en arrays asociativos se comenta a continuacin la implementacin de un sencillo programa que muestra en una pgina web todos los registros correspondientes a la tabla salas de la base de datos cinemas. Adems de la utilizacin de esta funcin se podr ver la forma de generar un bucle para recuperar todos los registros del resultado de la consulta. Como punto de partida se toma la pgina del sitio web de Cinem@s que muestra informacin general de las salas de proyeccin disponibles (Figura 16.3).

Figura 16.3 Pgina de informacin sobre las caractersticas de las salas

Esta pgina incorpora en su parte inferior un enlace que dar acceso al programa que realiza la conexin a la base de datos para recuperar todos los registros de la tabla salas. El enlace se encuentra definido de la siguiente manera:

432

CONECTIVIDAD A BASES DE DATOS MYSQL DESDE PHP

Si quieres ver las caractersticas de cada una de nuestras salas <A HREF="listadosalas.php">pulsa aqu</A>.

El destino del enlace es la pgina listadosalas.php cuyo cdigo completo se detalla a continuacin: Fichero listadosalas.php:
<HTML> <HEAD><TITLE>Salas disponibles</TITLE></HEAD> <BODY> <?php // carga de las variables de configuracin // y realizacin de la conexin require('configuracion.inc'); $c = mysql_connect($host,$usuario,$password) or die("Error: " . mysql_error()); mysql_select_db($db,$c) or die("Error: " . mysql_error()); // generacin de la consulta de seleccin $consulta = "SELECT * FROM SALAS"; // ejecucin de la consulta $resultado = mysql_query($consulta,$c); if ($resultado) { print "<H2 ALIGN=center> Listado de salas disponibles</H2>"; // se recorren todos los registros del resultado print "<TABLE WIDTH=100% BORDER> <TR> <TH>Numero de sala</TH> <TH>Aforo</TH> <TH>Nmero de filas</TH> <TH>Observaciones</TH> </TR>"; $cont = 0; while($sala = mysql_fetch_array($resultado)){ $cont++; $nsala = $sala['NUM_SALA']; $aforo = $sala['AFORO']; $nfilas = $sala['NUM_FILAS']; $observaciones = $sala['OBSERVACIONES']; if ($cont%2==0) echo("<TR ALIGN=center BGCOLOR='#99CCFF'>\n"); else echo("<TR ALIGN=center BGCOLOR='#3399FF'>\n"); print "<TD> $nsala </TD> <TD> $aforo </TD> <TD> $nfilas </TD>

433

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

<TD> $observaciones </TD>"; print "</TR>"; } print "</TABLE>"; } // cierre de la conexin mysql_close($c); ?> <HR> <A HREF="salas.htm">Volver</A> </BODY> </HTML>

Como puede apreciarse en este ejemplo, la recuperacin de los registros en arrays asociativos resulta ms intuitiva. Puede verse tambin cmo puede construirse un bucle while para recuperar los registros de todas las salas y a partir de ellos ir generando dinmicamente una tabla HTML. Para que la presentacin resulte un poco ms vistosa, se est cambiando el color de fondo de cada una de las filas de las tablas de manera alternativa, para ello ha sido preciso utilizar una variable $cont, que va contando el nmero de filas de la tabla. El resultado de la carga de la pgina anterior sera la visualizacin de todos los registros de la tabla salas en una pgina como la que se muestra en la Figura 16.4.

Figura 16.4 Pgina con la relacin de salas disponibles

434

CONECTIVIDAD A BASES DE DATOS MYSQL DESDE PHP

Implementacin del servicio de consulta de la cartelera


El sitio web Cinem@s implementa igualmente un sencillo sistema de consulta de la cartelera de proyecciones para un da concreto y de adquisicin de localidades. En ambos casos la conectividad a la base de datos resulta imprescindible. El punto de partida del sistema que se presentar es la pgina que se muestra en la Figura 16.5.

Figura 16.5 Pgina de consulta de la cartelera

Esta pgina dispone de un enlace directo a la cartelera del da actual y un calendario con enlaces a las carteleras de cualquier otro da. Todos estos enlaces dinmicos son creados por un programa PHP. El primero de ellos, el que genera el enlace a la cartelera del da, es bastante simple puesto que nicamente utiliza la funcin date() para obtener el da

435

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

actual e incluye esos parmetros en el enlace como parte del URL. El segundo script, el que genera el calendario, resulta ms complejo y en este caso se ha programado en un documento diferente e integrado con la funcin include(). El cdigo completo de la pgina es: Fichero proyecciones.php:
<HTML> <HEAD> <TITLE>Nuestra cartelera</TITLE> </HEAD> <BODY TEXT=blue> <TABLE WIDTH="100%" BORDER BGCOLOR=#99CCFF> <TR> <TH WIDTH="16%"> <A HREF="principal.htm">Pgina principal</A></TH> <TH WIDTH="17%"> <A HREF="salas.htm">Nuestras salas</A></TH> <TH WIDTH="17%"> <A HREF="clientes.htm">rea de clientes</A></TH> <TH WIDTH="17%"> <A HREF="entradas.htm">Compra de entradas</A></TH> <TH WIDTH="17%"> <A HREF="estrenos.htm">Prximos estrenos</A></TH> <TH WIDTH="16%"> <A HREF="foros/index.php">Foro Cinem@s</A></TH> </TR> </TABLE> <H1 ALIGN="center">Nuestra cartelera</H1> <CENTER> <TABLE BORDER> <TR ALIGN=center><TD WIDTH=50%> <FONT SIZE=+1> Aqu puedes consultar nuestra oferta para el da de hoy <BR><BR> <?php $dia_hoy=date("d"); $mes_hoy=date("m"); $anno_hoy=date("Y"); print "<A HREF = cartelera.php?dia=$dia_hoy&mes=$mes_hoy&anno=$anno_hoy> <IMG SRC='images/rollo.gif' BORDER=0><BR> Cartelera de hoy </A>"; ?>

436

CONECTIVIDAD A BASES DE DATOS MYSQL DESDE PHP

</FONT> </TD> <TD WIDTH=50%> <FONT SIZE=+1> Si prefieres puedes consultar la cartelera de otro da seleccionando la fecha deseada en nuestro calendario: </FONT> <BR><BR> <?php include("calendario.php"); ?> <BR> </TD> </TR> </TABLE> </CENTER> </BODY> </HTML>

El documento calendario.php es el que implementa el algoritmo de generacin del calendario de un mes con los enlaces a las carteleras de los das. El contenido de este documento sera: Fichero calendario.php:
<?php $nombremes=array(1=>"ENERO",2=>"FEBRERO",3=>"MARZO", 4=>"ABRIL",5=>"MAYO",6=>"JUNIO", 7=>"JULIO",8=>"AGOSTO",9=>"SEPTIEMBRE", 10=>"OCTUBRE",11=>"NOVIEMBRE", 12=>"DICIEMBRE"); // funcin que calcula el nmero de das de un mes function numerodiasmes($mes,$anno) { // comprobacin de ao bisiesto $bisiesto=date("L"); switch($mes) { case 2: if($bisiesto) $nd=29; else $nd=28; break; case 4: case 6: case 9: case 11: $nd=30; break;

437

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

default: $nd=31; } return($nd); } // funcion que genera el calendario de un mes concreto function calendariomes($mes,$anno) { global $nombremes; // comprobacin de mes actual $mes_hoy=date("m"); $anno_hoy=date("Y"); if (($mes_hoy <> $mes) || ($anno_hoy <> $anno)) $hoy=0; else $hoy=date("d"); // clculo del mes anterior y el mes siguiente $mes_anterior = $mes - 1; $anno_anterior = $anno; if ($mes_anterior==0){ $anno_anterior--; $mes_anterior=12; } $mes_siguiente = $mes + 1; $anno_siguiente = $anno; if ($mes_siguiente==13){ $anno_siguiente++; $mes_siguiente=1; } // clculo del da de inicio del mes (0=dom...6=sb) $diasemana=date("w",mktime(0,0,0,$mes,1,$anno)); // los domingos se tratarn como ltimo da de la semana if($diasemana==0) $diasemana=7; // clculo del nmero de das del mes actual $nd = numerodiasmes($mes,$anno); // generacin del calendario print "<TABLE CELLSPACING=3 CELLPADDING=2 BORDER=0> <TR BGCOLOR=blue><TH> <A HREF = proyecciones.php?mes=$mes_anterior&anno=$anno_anterior> <FONT COLOR=white>&lt;&lt; </A> </TH> <TH COLSPAN=5 ALIGN=center> <FONT COLOR=white> $nombremes[$mes] $anno

438

CONECTIVIDAD A BASES DE DATOS MYSQL DESDE PHP

</TH><TH> <A HREF = proyecciones.php?mes=$mes_siguiente&anno=$anno_siguiente> <FONT COLOR=white>&gt;&gt; </A> </TH></TR>"; print "<TR ALIG=center BGCOLOR=#3399FF> <TH WIDTH=14%>Lu</TH><TH WIDTH=14%>Ma</TH> <TH WIDTH=14%>Mi</TH><TH WIDTH=14%>Ju</TH> <TH WIDTH=14%>Vi</TH><TH WIDTH=14%>Sa</TH> <TH WIDTH=14%>Do</TH> </TR>"; print("<TR>"); $aux=1; //genera celdas en blanco hasta llegar al comienzo del mes while($aux<$diasemana) { print("<TD>&nbsp;</TD>"); $aux++; } for($i=1;$i<=$nd;$i++) { $enlace = "<A HREF = cartelera.php?dia=$i&mes=$mes&anno=$anno> <FONT SIZE=+1> $i </A>"; if ($i==$hoy) print("<TH BGCOLOR=red>$enlace</TH>"); elseif(($diasemana==6) or ($diasemana==7)) print("<TH BGCOLOR=#99CCFF>$enlace</TH>"); else print("<TH>$enlace</TH>"); $diasemana++; if($diasemana==8) { // comienza nueva semana print("</TR>"); print("<TR>"); $diasemana=1; } } print("</TR></TABLE>"); } // programa principal con llamada a la funcin if(!isset($mes,$anno)) { // datos del mes actual $mes=date("n"); $anno=date("Y"); } calendariomes($mes,$anno); ?>

439

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Como puede apreciarse en estos programas, los enlaces generados dinmicamente apuntan hacia la pgina cartelera.php, envindose a dicha pgina a travs del URL tres parmetros (da, mes y ao) que identifican la fecha cuya cartelera se quiere consultar. El documento recibe esos parmetros y generar con ellos la cartelera mediante un programa PHP que se conecta a la base de datos. El contenido completo de este documento cartelera.php sera: Fichero cartelera.php:
<HTML> <HEAD><TITLE>La cartelera</TITLE></HEAD> <BODY> <?php if(isset($dia,$mes,$anno)) { // carga de las variables de configuracin // y realizacin de la conexin require('configuracion.inc'); $c = mysql_connect($host,$usuario,$password) or die("Error: " . mysql_error()); mysql_select_db($db,$c) or die("Error: " . mysql_error()); // generacin de la consulta $fecha = "$anno-$mes-$dia"; $q = "SELECT PELICULAS.IDPELICULA,TITULO, IDPROY,NUM_SALA,HORA FROM PELICULAS,PROYECCIONES WHERE PROYECCIONES.IDPELICULA = PELICULAS.IDPELICULA AND FECHA = '$fecha' ORDER BY HORA"; // ejecucin de la consulta $r = mysql_query($q,$c); if ($r) { print "<H2 ALIGN=center> Cartelera del dia $dia-$mes-$anno</H2>"; // se recorren todos los registros del resultado y // se genera una tabla con ellos if(mysql_num_rows($r)==0) { print "<H2 ALIGN=center> <I>Lo sentimos, no tenemos disponible la cartelera de este da </I></H2>"; } else { print "<TABLE WIDTH=100% BORDER> <TR> <TH>Pelcula</TH>

440

CONECTIVIDAD A BASES DE DATOS MYSQL DESDE PHP

<TH WIDTH=50>Sala</TH> <TH WIDTH=80>Hora</TH> <TH WIDTH=100>Compra</TH> </TR>"; $cont = 0; while($proy = mysql_fetch_array($r)){ $cont++; $idpelicula = $proy['IDPELICULA']; $idproy = $proy['IDPROY']; $titulo = $proy['TITULO']; $num_sala = $proy['NUM_SALA']; $hora = $proy['HORA']; list($h,$m,$s)=explode(":",$hora); if ($cont%2==0) print "<TR ALIGN=center BGCOLOR='#99CCFF'>\n"); else print "<TR ALIGN=center BGCOLOR='#3399FF'>\n"); print "<TD><A HREF=pelicula.php?peli=$idpelicula TARGET='_blank'> <FONT SIZE=+2> $titulo </FONT> </A> </TD> <TD> <FONT SIZE=+2> $num_sala </FONT> </TD> <TD> <FONT SIZE=+2> $h:$m </FONT> </TD>"; print "<TD> <A HREF=comprar.php?idproy=$idproy> <IMG SRC='images/ticket.gif' BORDER=0> </A> </TD>"; print "</TR>"; } } print "</TABLE>"; } // cierre de la conexin mysql_close($c); } ?> <HR> <A HREF="proyecciones.php">Volver</A> </BODY>

441

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

El aspecto de la tabla que es generada dinmicamente por el programa anterior es el que muestra la Figura 16.6. En dicha tabla, cada ttulo de pelcula se encuentra enlazado con una nueva pgina en la que se presenta una breve ficha tcnica de la misma. De nuevo este ficha es generada a partir de los datos del correspondiente registro de la pelcula en la base de datos. El destino de todos los enlaces de la tabla con la cartelera es un mismo documento: pelcula.php. Para que este programa sea capaz de identificar la pelcula cuya ficha debe generar, se enva en el propio URL del enlace el identificador de la correspondiente pelcula. El programa podr utilizar ese dato para acceder a toda la informacin del registro correspondiente en la base de datos. El aspecto final de la ficha tcnica de cada pelcula es el que se muestra en la Figura 16.7.

Figura 16.6 Cartelera de un da

Se incluye a continuacin el cdigo de la pgina que la genera la ficha tcnica: 442

CONECTIVIDAD A BASES DE DATOS MYSQL DESDE PHP

Fichero pelicula.php:
<HTML> <HEAD><TITLE>Ficha tcnica de la pelcula</TITLE></HEAD> <BODY> <?php // comprobacin de la correcta recepcin del // identificador de la pelcula if (isset($peli)) { // conexin require('configuracion.inc'); $c = mysql_connect($host,$usuario,$password) or die("Error: " . mysql_error()); mysql_select_db($db,$c) or die("Error: " . mysql_error()); // generacin de la consulta $q = "SELECT * FROM PELICULAS WHERE IDPELICULA = $peli"; // ejecucin de la consulta $r = mysql_query($q,$c); if ($r) { print "<H2 ALIGN=center>Ficha de la pelicula</H2>"; $p = mysql_fetch_array($r); $titulo = $p['TITULO']; $actores = $p['ACTORES']; $produccion = $p['PRODUCCION']; $direccion = $p['DIRECCION']; $guion = $p['GUION']; $anno = $p['ANNO']; $duracion = $p['DURACION']; $nacionalidad = $p['NACIONALIDAD']; $genero = $p['GENERO']; $edad = $p['EDAD_RESTRICCION']; $sinopsis = $p['SINOPSIS']; $cartelera = $p['CARTELERA']; // generacin de un archivo temporal con la // imagen del cartel de la pelcula $foto=tempnam("/carteles",'car'); $ft=fopen($foto,"w"); fwrite($ft,$cartelera); fclose($ft); print "<TABLE WIDTH=100% BORDER BGCOLOR='#99CCFF'>"; print "<TR> <TD> <H2> $titulo </H2>"; print " <IMG SRC='$foto'> </TD>"; print "<TD> <B>Sinopsis:</B> $sinopsis <BR>

443

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

<B>Actores:</B> $actores <BR> <B>Produccin:</B> $produccion <BR> <B>Direccin:</B> $direccion <BR> <B>Guin:</B> $guion <BR> <B>Ao:</B> $anno <BR> <B>Nacionalidad:</B> $nacionalidad <BR> <B>Duracin:</B> $duracion <BR> <B>Gnero:</B> $genero <BR> <B>Autorizada para:</B> $edad <BR> </TD> </TR>"; print "</TABLE>"; } // cierre de la conexin mysql_close($c); } ?> <HR> <INPUT TYPE="button" VALUE="Cerrar" onClick="window.close()"> </BODY>

Figura 16.7 Ficha tcnica y artstica de una pelcula

444

CONECTIVIDAD A BASES DE DATOS MYSQL DESDE PHP

NOTA

En la generacin de la ficha se necesita incorporar a la pgina la imagen de la cartelera de la pelcula que se encuentra almacenada en un campo BLOB de la tabla de la base de datos. La insercin de esa imagen en la pgina se consigue generando un archivo temporal con la funcin tempnam() y escribiendo sobre l el contenido de la base de datos recuperado en la consulta. Posteriormente este archivo grfico temporal se incorpora a la pgina con el comando <IMG> de HTML.

Implementacin de un sistema de compra on-line de localidades


Finalmente, cada pelcula de la cartelera viene acompaada de un icono que permite realizar la reserva de localidades para la proyeccin correspondiente. El sistema realizar de nuevo una consulta a la base de datos para obtener la relacin de localidades ya vendidas y generar un formulario con campos de tipo checkbox representando las localidades disponibles para la proyeccin. El usuario marcar los asientos deseados e introducir su nmero de cliente y clave de acceso. El aspecto de la pgina de compra de localidades es el que muestra la Figura 16.8.

Figura 16.8 Consulta y reserva de localidades disponibles

445

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

El cdigo completo que genera esta pgina se incluye a continuacin. Fichero comprar.php:
<HTML> <HEAD><TITLE>Compra de entradas</TITLE></HEAD> <?php function generarplanosala($filas,$cols) { global $ocupada; global $idproy; // nmero de columnas de la tabla print "<FORM ACTION=confirmarcompra.php METHOD='post'>"; print "<TABLE BORDER>"; print "<TR><TH></TH> <TH COLSPAN=$cols BGCOLOR=#99CCFF> Asiento </TH>"; print "<TR BGCOLOR=#99CCFF><TH>Fila</TH>"; for($j=1;$j<=$cols;$j++) { print "<TH WIDTH=50>A$j</TH>"; } print "</TR>"; for($i=1;$i<=$filas;$i++) { print "<TR><TH BGCOLOR=#99CCFF>F$i</TH>"; for($j=1;$j<=$cols;$j++) { if ($ocupada[$i][$j]) { print "<INPUT TYPE='hidden' NAME='F$i" . "A$j' VALUE=0>"; print "<TD ALIGN=center BGCOLOR=red>O</TD>"; } else { print "<TD ALIGN=center> <INPUT TYPE='hidden' NAME='F$i" . "A$j' VALUE=0> <INPUT TYPE='checkbox' NAME='F$i" . "A$j' VALUE=1> </TD>"; } } print "</TR>"; } print "</TABLE>"; print "<INPUT TYPE='hidden' NAME='numfilas' VALUE=$filas>"; print "<INPUT TYPE='hidden' NAME='numcols' VALUE=$cols>"; print "<INPUT TYPE='hidden' NAME='idproy'

446

CONECTIVIDAD A BASES DE DATOS MYSQL DESDE PHP

VALUE=$idproy>"; print "<P ALIGN=right>Nmero de cliente: <INPUT TYPE='text' SIZE=6 NAME=numcliente><BR> Contrasea: <INPUT TYPE='password' SIZE=6 NAME=clave>"; print "<BR> <INPUT TYPE='submit' VALUE='Comprar'> </P></FORM>"; } ?> <BODY> <?php if (isset($idproy)) { // conexin a la base de datos require('configuracion.inc'); $c = mysql_connect($host,$usuario,$password) or die("Error: " . mysql_error()); mysql_select_db($db,$c) or die("Error: " . mysql_error()); // obtencin de las dimensiones de la sala $q = "SELECT AFORO,NUM_FILAS FROM SALAS,PROYECCIONES WHERE IDPROY = $idproy AND PROYECCIONES.NUM_SALA = SALAS.NUM_SALA"; // ejecucin de la consulta $r = mysql_query($q,$c); list($aforo,$num_filas) = mysql_fetch_array($r); print "<H2 ALIGN=center> Localidades disponibles </H2>"; // generacin de un array bidimensional para anotar // las localidades ya ocupadas $num_columnas =(integer)($aforo/$num_filas); for($i=1;$i<=$num_filas;$i++) { for($j=1;$j<=$num_columnas;$j++) { $ocupada[$i][$j]=FALSE; } } // recuperacin de todas las localidades ya ocupadas $q = "SELECT FILA,NUM_ASIENTO FROM ENTRADAS WHERE IDPROY = $idproy"; // ejecucin de la consulta $r = mysql_query($q,$c); if ($r) { while(list($f,$a) = mysql_fetch_array($r)){ $ocupada[$f][$a]=TRUE; }

447

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

} // generacin del plano de la sala generarplanosala($num_filas,$num_columnas); // cierre de la conexin mysql_close($c); } ?> <A HREF="proyecciones.php">Volver a la cartelera</A> </BODY> </HTML>

El formulario de la Figura 16.8 enva los datos relativos al cliente y las localidades adquiridas por este a una nueva pgina (confirmarcompra.php) que se encarga de comprobar la validez de la identificacin del cliente y, en su caso, aadir la compra a la correspondiente tabla de la base de datos, incrementar el saldo de puntos acumulados por el cliente y presentarle una pgina de notificacin. El cdigo completo de este ltimo archivo es el siguiente. Fichero confirmarcompra.php:
<HTML> <HEAD><TITLE>Confirmacin de la compra</TITLE></HEAD> <BODY> <?php if (isset($numcliente,$clave)) { // conexin a la base de datos require('configuracion.inc'); $c = mysql_connect($host,$usuario,$password) or die("Error: " . mysql_error()); mysql_select_db($db,$c) or die("Error: " . mysql_error()); // autentificacin del cliente $q = "SELECT CLAVE,PUNTOS_ACUM FROM CLIENTES WHERE NUM_CLIENTE=$numcliente"; $r = mysql_query($q,$c); if (mysql_num_rows($r)==0) die("CLIENTE NO REGISTRADO"); $p = mysql_fetch_array($r); $clave_real=$p['CLAVE']; $puntos_acum=$p['PUNTOS_ACUM']; if ($clave!=$clave_real) die("ERROR: identificacin incorrecta"); // registro de las entradas adquiridas $compra = FALSE; $ncompradas = 0; print "Localidades adquiridas:";

448

CONECTIVIDAD A BASES DE DATOS MYSQL DESDE PHP

print "<UL>"; for($i=1;$i<=$numfilas;$i++) for($j=1;$j<=$numcols;$j++) { $nomCheck="F$i"."A$j"; if ($$nomCheck) { // localidad adquirida por el cliente $compra = TRUE; $ncompradas++; // se inserta el registro en la tabla entradas $q = "INSERT INTO ENTRADAS(IDPROY,FILA, NUM_ASIENTO, NUM_CLIENTE,RECOGIDA) VALUES($idproy,$i,$j,$numcliente,0)"; $r = mysql_query($q,$c); print "<LI> Fila <B>$i</B>, asiento <B>$j</B>"; } } if ($compra) { // actualizacin de los puntos acumulados del cliente $puntos_acum = $puntos_acum + 5 * $ncompradas; $q = "UPDATE CLIENTES SET PUNTOS_ACUM=$puntos_acum WHERE NUM_CLIENTE=$numcliente"; $r = mysql_query($q,$c); if ($r) print "<CENTER><U>Tu saldo de puntos tras esta compra ser de $puntos_acum puntos</U></CENTER>"; print "<H3 ALIGN=center> <I>Recuerda que tu entrada estar reservada hasta 5 minutos antes del inicio de la sesin. Si transcurrido ese plazo no has procedido al pago de la misma, la reserva se anular automticamente </I><BR> Muchas gracias por tu compra y a difrutar con el mejor cine!!!</H3>"; } // cierre de la conexin mysql_close($c); } ?> <A HREF="proyecciones.php">Volver a la cartelera</A> </BODY> </HTML>

449

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

16.5. OTRAS FUNCIONES DE MANIPULACIN DE DATOS


Para finalizar este captulo destinado a la conectividad a bases de datos MySQL desde programas PHP, se presentan a continuacin algunas funciones adicionales que pueden resultar tiles. Como se ha visto, cuando se realiza una consulta de seleccin sobre la base de datos, se genera un tipo especial de variable con el resultado: una variable de tipo recurso. El espacio utilizado por ese recurso se libera automticamente cuando finaliza la ejecucin del script en el que se cre. Sin embargo, en ocasiones puede ser interesante liberar ese espacio de manera explcita; por ejemplo, cuando los resultados de las consultas son grandes y dejan de ser utilizados, ocupando un innecesario espacio de almacenamiento. La funcin a utilizar para liberar la memoria es:
mysql_ free_result(resultado)

En el caso de sentencias de insercin, actualizacin o borrado, puede ser interesante en ocasiones saber cuntos registros fueron afectados por dicha sentencia; por ejemplo, saber cuntos registros fueron borrados. Para ello PHP dispone de una nueva funcin que llamada justo a continuacin de la ejecucin de la sentencia devuelve ese resultado:
mysql_affected_rows()

En el caso de consultas de seleccin, si se desea saber el nmero de registros resultado de la consulta, se utiliza la funcin:
mysql_num_rows(resultado)

Cuando a partir de la variable recurso con el resultado de la consulta se desea obtener alguna informacin adicional como nombres, tamaos o tipos de los campos en la tabla, pueden utilizarse las siguientes funciones:
mysql_field_name(resultado,indice) mysql_field_len(resultado,indice) mysql_field_type(resultado,indice)

En definitiva, PHP dispone de una completsima librera de funciones especficas para la conectividad con MySQL. En este captulo se ha pretendido nicamente

450

CONECTIVIDAD A BASES DE DATOS MYSQL DESDE PHP

presentar las ms importantes, a travs de un sencillo ejemplo de consulta y reserva on-line de localidades para Cinem@s. Por supuesto, la aplicacin desarrollada es susceptible de mejoras.

451

IMPLEMENTACIN DE FOROS
17.1. INTRODUCCIN
Mediante el uso combinado de MySQL y el lenguaje PHP resulta muy sencillo implementar en un sitio web un sistema de foros a travs del cual todos los visitantes del sitio puedan enviar sus comentarios, responder a mensajes de otros usuarios, plantear dudas,... Los foros constituyen una de las aplicaciones ms utilizadas de PHP y MySQL; de hecho, es posible encontrar una amplia variedad de desarrollos open source para implementarlos. En el Captulo 18, en el que se presentan algunas de la soluciones open source ms conocidas, se pueden encontrar algunas referencias a este tipo de aplicaciones de gestin de foros. En este captulo se mostrar paso a paso el proceso de creacin de un sencillo sistema de foros para el sitio web de Cinem@s. Los mensajes enviados por los usuarios quedarn registrados en una tabla de la base de datos y mostrados en la pgina ordenados segn la fecha de creacin y enlazados a todas las posibles respuestas dadas a dicho mensaje. Por tanto, el primer paso ser disear una nueva tabla en la base de datos para almacenar todos los mensajes. Una vez creada la tabla se deben programar los procedimientos necesarios para insertar nuevos mensajes y consultar los mensajes enviados. 453

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Cuando un usuario acceda a la pgina de inicio de los foros se encontrar con la pgina que muestra la Figura 17.1. En las prximas secciones se detallar el proceso completo de creacin de esta aplicacin.

Figura 17.1 Pgina de entrada a los foros

17.2. ESTRUCTURA DE LA TABLA DE LA BASE DE DATOS


Todos los mensajes enviados por los usuarios deben quedar almacenados para poder ser visualizados por cualquier otro usuario en cualquier momento. Por tanto, lo primero que se necesitar es una nueva tabla en la base de datos de Cinem@s.

454

IMPLEMENTACIN DE FOROS

La nueva tabla a crear tendr la siguiente estructura:


CREATE TABLE foro ( id int(11) NOT NULL auto_increment, autor varchar(80) default NULL, titulo varchar(100) default NULL, mensaje text, fecha int(11) default NULL, respuestas int(11) default 0, identificador int(11) default 0, KEY id (id) ) TYPE=MyISAM;

A continuacin se comentan los diferentes campos de la tabla: id: autor: titulo: mensaje: fecha: nmero de identificacin del mensaje. Actuar de clave de la tabla. cadena de caracteres con el nombre del autor del mensaje. cadena que incluir el ttulo o asunto del mensaje. contenido del mensaje. fecha de creacin del mensaje. Se opta por utilizar un campo entero para almacenar este dato porque se utilizar el sistema de identificacin de instantes de tiempo con el que cuenta PHP. nmero entero que indicar el nmero de respuestas que ha recibido el mensaje.

respuestas:

identificador: en el caso de mensajes que sean respuestas a otros mensajes, este atributo contendr el identificador del mensaje al que responde. En caso contrario su valor ser 0.

17.3. GENERACIN DE LA PGINA PRINCIPAL DE LOS FOROS


Una vez creada la tabla de la base de datos en la que quedarn registrados todos los mensajes, el siguiente paso ser la construccin de la pgina principal de los foros (vase Figura 17.1). Esta pgina realizar una conexin a la base de datos para

455

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

recuperar todos los registros correspondientes a mensajes de inicio de cada cadena de mensajes (los mensajes que no son respuesta a ningn otro) y con ellos generar dinmicamente una tabla de enlaces en la pgina. El cdigo completo de esta pgina de inicio es el siguiente:
<HTML> <HEAD> <TITLE>El foro de Cinem@s</TITLE> </HEAD> <BODY> <TABLE WIDTH="100%" border bgColor=#99CCFF> <TR> <TH WIDTH="16%"><A HREF="../principal.htm"> Pgina principal</A></TH> <TH WIDTH="17%"><A HREF="../proyecciones.htm"> Nuestra cartelera</A></TH> <TH WIDTH="17%"><A HREF="../salas.htm"> Nuestras salas</A></TH> <TH WIDTH="17%"><A HREF="../clientes.htm"> rea de clientes</A></TH> <TH WIDTH="17%"><A HREF="../entradas.htm"> Compra de entradas</A></TH> <TH WIDTH="16%"><A HREF="../estrenos.htm"> Prximos estrenos</A></TH> </TR> </TABLE> <H1 ALIGN="center"> <FONT COLOR=blue>El foro de usuarios de Cinem@s</FONT> </H1> <TABLE WIDTH="100%" border> <TR> <TH WIDTH=100>FECHA</TH> <TH>TITULO</TH> <TH WIDTH=100>RESPUESTAS</TH> </TR> <? // conexin a la base de datos require('configuracion.inc'); $enlace = mysql_connect($host,$usuario,$password); mysql_select_db($db,$enlace); // consulta: seleccin de todos los mensajes // cuyo identificador de mensaje "padre" es 0 $consulta = "SELECT * FROM foro WHERE identificador = 0 ORDER BY fecha DESC"; $consulta = mysql_query($consulta,$enlace);

456

IMPLEMENTACIN DE FOROS

// recorrido de todos los mensajes $cont = 0; while($row = mysql_fetch_array($consulta)){ $id=$row["id"]; $titulo=$row["titulo"]; $fecha=$row["fecha"]; $respuestas=$row["respuestas"]; $cont++; if ($cont%2==0) print "<TR BGCOLOR='#99CCFF'>\n"; else print "<TR BGCOLOR='#3399FF'>\n"; print "<TH>" . date("d-m-Y",$fecha) . "</TH>\n"; print "<TD> <A HREF=foro.php?id=$id> $titulo </A> </TD>\n"; print "<TH>$respuestas</TH>\n"; print "</TR>\n"; } mysql_close($enlace); ?> </TABLE> <BR> <CENTER> <FONT FACE="arial" size=2> <A HREF="formulario.php?respuestas=0"> Aadir nuevo mensaje </A> </FONT> </CENTER> </BODY> </HTML>

Como puede apreciarse, la pgina comienza con el cdigo necesario para generar una tabla con enlaces a las restantes pginas del sito web de Cinem@s, tras esos enlaces se genera, mediante un script PHP, una nueva tabla con las fechas, ttulos y nmeros de respuestas de los mensajes cabecera de cada cadena de mensajes. Los ttulos de cada mensaje se encuentran enlazados con la pgina foro.php, pasando a esta pgina en dicho enlace el id concreto del mensaje; este id ser utilizado para acceder al correspondiente registro de la tabla. Finalmente, se encuentra un enlace a la pgina formulario.php que permitir crear un nuevo mensaje.

457

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

17.4. CONSULTA DE UN MENSAJE CON SUS RESPUESTAS


Como se ha visto en la pgina principal, el ttulo de cada mensaje se encuentra enlazado con la pgina foro.php. Esta pgina recibir a travs del URL el identificador del mensaje y realizar una nueva conexin a la base de datos para recuperar toda la informacin de dicho mensaje y todos los posibles mensajes que se hayan enviado como respuesta. Con toda esta informacin se generar una pgina como la que se muestra en la Figura 17.2.

Figura 17.2 Consulta de cadenas de mensajes de los foros

458

IMPLEMENTACIN DE FOROS

El cdigo que se encarga de generar esta pgina es el siguiente. Fichero foro.php:


<HTML> <HEAD> <TITLE>Foro Cinem@s</TITLE> </HEAD> <BODY> <? // comprobacin de la correcta recepcin del // id del mensaje a travs del URL if(isset($id)) { // conexin a la base de datos require('configuracion.inc'); $enlace = mysql_connect($host,$usuario,$password); mysql_select_db($db,$enlace); // consulta: seleccin de todos los mensajes cuyo // valor del atributo identificador es el que ha // sido pasado a travs del URL $consulta = "SELECT * FROM foro WHERE id = '$id' ORDER BY fecha DESC"; $consulta = mysql_query($consulta,$enlace); // muestra de los atributos del mensaje $row = mysql_fetch_array($consulta); $titulo=$row["titulo"]; $autor=$row["autor"]; $mensaje=$row["mensaje"]; $fecha=$row["fecha"]; $respuestas=$row["respuestas"]; print "<TABLE WIDTH=100% BORDER> <TR><TH WIDTH=100 BGCOLOR=blue> <FONT COLOR=white>Ttulo</TH>"; print "<TD WIDTH=*> $titulo </TD></TR>"; print "<TR><TH BGCOLOR=blue> <FONT COLOR=white>Fecha</TH>"; print "<TD>" . date("d-m-Y",$fecha) . "</TD></TR>"; print "<TR><TH BGCOLOR=blue> <FONT COLOR=white>Autor</TH>"; print "<TD> $autor </TD></TR>"; print "<TR><TH BGCOLOR=blue> <FONT COLOR=white>Mensaje</TH>"; print "<TD> $mensaje </TD></TR></TABLE>"; // generacin de enlaces para aadir respuesta // y para volver a la pgina principal del foro print "<CENTER><FONT FACE=arial SIZE=2>";

459

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

$url = "formulario.php?id=$id&" . "respuestas=$respuestas&" . "titulo=$titulo"; print "<A HREF=$url>"; print "<BR>Aadir respuesta </A>&nbsp;"; print "<A HREF=index.php>Volver al foro</A> </FONT></CENTER>"; // obtencin de todas las respuestas al mensaje $consulta2 = "SELECT * FROM foro WHERE identificador = '$id' ORDER BY fecha ASC"; $consulta2 = mysql_query($consulta2,$enlace); print "<H3 ALIGN=center> RESPUESTAS A ESTE MENSAJE: </H3><HR>"; // escritura de las respuestas while($row = mysql_fetch_array($consulta2)){ $autor=$row['autor']; $mensaje=$row['mensaje']; $fecha=$row['fecha']; print "<B>De:</B> $autor<BR>"; print "<B>Fecha:</B> " . date("d-m-Y",$fecha) . "<BR>"; print "<B>Mensaje:</B> $mensaje<BR>"; print "<HR>"; } mysql_close($enlace); } ?> </BODY> </HTML>

17.5. INSERCIN DE NUEVOS MENSAJES


Tanto el enlace situado en la pgina principal que permite aadir un nuevo mensaje, como el enlace para aadir una respuesta a un mensaje dado, sealan como destino una misma pgina: formulario.php. En el primer caso, creacin de un nuevo mensaje, se enva a travs del URL una variable de nombre respuestas y valor 0; en el segundo caso, respuesta a un mensaje previo, a travs del URL se envan adems de la variable anterior, cuyo valor en este caso ser el nmero de respuestas recibidas, dos nuevas variables, sealando el identificador y ttulo del mensaje al que se est respondiendo.

460

IMPLEMENTACIN DE FOROS

La pgina formulario.php recoger esas variables y generar un simple formulario (vase Figura 17.3) en el que el usuario podr escribir su mensaje, indicando su nombre, el ttulo y el texto del mensaje.

Figura 17.3 Formulario para el envo de un nuevo mensaje

El cdigo completo de esta pgina es el siguiente. Fichero formulario.php:


<H1>Nuevo mensaje para el foro</H1> <FORM ACTION="nuevomensaje.php"> <TABLE> <INPUT TYPE="hidden" NAME="respuestas" VALUE="<? echo $respuestas; ?>"> <INPUT TYPE="hidden" NAME="identificador" VALUE="<? echo $id; ?>"> <TR> <TD>Autor:</TD> <TD><INPUT TYPE="text" NAME="autor" SIZE=40></TD> </TR> <TR> <TD>Ttulo del mensaje:</TD> <TD><INPUT TYPE="text" NAME="titulo" SIZE=40 VALUE="<? if (isset($titulo)) echo 'Re: mensaje' . $id; ?>"> </TD>

461

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

</TR> <TD>Mensaje:</TD> <TD><TEXTAREA NAME="mensaje" ROWS=6 COLS=30> </TEXTAREA> </TD> </TR> <TR><TD> <INPUT TYPE=submit VALUE="Enviar"> </TD></TR> </TABLE> </FORM>

Como aspectos a destacar de este formulario es el hecho de disponer de dos campos ocultos cuyo valor es generado por sendos scripts PHP a partir de las variables recibidas a travs del URL. Una vez que el usuario ha completado todos los campos del formulario, estos sern enviados a la pgina nuevomensaje.php que se encargar de realizar la insercin en la base de datos y cuyo cdigo se presenta a continuacin. Fichero nuevomensaje.php:
<?php // conexin a la base de datos require('configuracion.inc'); $enlace = mysql_connect($host, $usuario, $password); mysql_select_db($db,$enlace); // obtencin de la fecha y hora actual $fecha = time(); // si el mensaje no es respuesta a ningn otro // se asigna el valor 0 al identificador del // mensaje "padre". if(empty($identificador)){ $identificador=0; } // generacin de la consulta de insercin $sql = "INSERT INTO foro(autor,titulo,mensaje, fecha,identificador) VALUES ('$autor','$titulo', '$mensaje','$fecha', '$identificador')"; mysql_query($sql); // en el caso de ser respuesta a un mensaje previo // es necesario actualizar el nmero de respuestas // del mensaje al que responde if($identificador!=0) { $respuesta = $respuestas+1; $sql2 ="UPDATE foro SET respuestas = '$respuesta'

462

IMPLEMENTACIN DE FOROS

WHERE id = '$identificador'"; mysql_query($sql2); } // se vuelve a la pgina principal del foro header("location: index.php"); ?>

Como ha podido verse en estas secciones, el proceso de implementacin de un sencillo sistema de foros usando PHP y MySQL resulta muy simple. Por supuesto, diferentes mejoras al sistema implementado podran hacerse, pero la estructura de la aplicacin sera similar a la planteada. En el prximo captulo pueden encontrarse algunas referencias a productos open source de implementacin de foros.

463

SOLUCIONES OPEN SOURCE BASADAS EN PHP Y MYSQL

18.1. INTRODUCCIN
La evolucin y cambios de Internet, tanto en contenidos como en formas y modos de desarrollarlos y presentarlos al usuario o navegante, ha sido algo continuo. Partiendo de los desarrollos iniciales en HTML, esttico, se ha ido buscando progresivamente un mayor dinamismo e interaccin con el usuario, completando HTML con Html dinmico, lenguajes embebidos Java Script, PHP, etc. A esta necesidad de dinamismo e interaccin de los sitios web se une otra no menos importante como es la necesidad de una cada vez mayor cantidad de informacin y de herramientas informticas apropiadas para su gestin. La utilizacin conjunta del lenguaje PHP y el sistema gestor de bases de datos MySQL permite desarrollar mltiples aplicaciones que optimizan los procesos de generacin, mantenimiento y gestin de sitios web. En este captulo se har una breve presentacin de algunas de las soluciones open source ms conocidas entre la

465

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

comunidad de desarrolladores web. Una de las caractersticas comunes a todas las herramientas que se mostrarn es el hecho de presentarse tanto como soluciones LAMP (Linux-Apache-MySQL-PHP) como WAMP (Windows-Apache-MySQLPHP). Para la presentacin de las herramientas se ha optado por agruparlas en diferentes categoras en funcin del uso para el que han sido diseadas. En primer lugar se describirn las conocidas como aplicaciones de gestin de contenidos, entre las que se encuentran algunas de las soluciones basadas en PHP y MySQL ms utilizadas en la actualidad. Siguiendo con el enfoque mantenido en este libro, la presentacin de las diferentes aplicaciones se centrar en aquellas que son open source. Por supuesto, en el mercado de software pueden encontrarse desarrollos que no son de cdigo abierto24, pudindose observar una gran oscilacin de precios, con aplicaciones de gestin de contenidos con costes que superan los 48.000 euros, ejemplo Vignette (www.vignette.com), o aplicaciones con costes inferiores a 900 euros, ejemplo doITlive (www.doitlive.com).

18.2. GESTORES DE CONTENIDO


La cada vez mayor cantidad de informacin que ofrecen los sitios web obliga a un importante esfuerzo en la gestin de contenidos con tareas como revisin, actualizacin continua de los mismos, publicacin de nuevos contenidos, eliminacin o archivo de los anteriores, etc. Ante esta tendencia de dinamismo e interaccin de los portales y sitios web junto con la necesidad de una mayor informacin y capacidad de comunicacin, con el consiguiente esfuerzo que conlleva una gestin adecuada de los contenidos, se han desarrollado una serie de aplicaciones denominadas gestores de contenido25 o CMS (Content Managment System) con la intencin de facilitar tanto el desarrollo de sitios web dinmicos como la gestin de elevados volmenes de informacin y contenidos en dichos sitios web.
24

En las aplicaciones que no son de cdigo abierto lo que se adquiere es el derecho a usar la aplicacin pero no la propiedad de la misma ni la capacidad de modificarla, copiarla o distribuirla, sin el permiso del propietario de la patente, lo que supone la dependencia de este. 25 Indicar que nos referimos exclusivamente a los gestores de contenido web, pues el termino gestin de contenido tiene un significado amplio existiendo otro tipo de aplicaciones de gestin de contenido, como por ejemplo las de gestin de contenido documental, etc.

466

SOLUCIONES OPEN SOURCE BASADAS EN PHP Y MYSQL

Atrs queda el periodo de Internet como mero escaparate o catlogo en el que primaba la redundancia de efectos tcnicos y la vistosidad del sitio o portal en detrimento de los contenidos. En la actualidad, la Red es un medio de comunicacin bidireccional donde, si bien la apariencia, presentacin y formato son importantes, estos estn estrechamente ligados y en dependencia del contenido de la pgina o portal, factor discriminatorio26 a la hora de que los internautas visiten un sitio web. Por tanto, el contenido debe ser de inters y calidad para la audiencia objetivo, actualizado tantas veces como sea necesario; debe permitir la bidireccionalidad y feedback de la informacin haciendo al usuario participar activamente en el contenido mediante foros, chat, recogida de opiniones, etc., y todo ello con una presentacin de los contenidos mediante un interfaz de navegacin agradable, intuitivo, fcil de usar y sobre todo til. Para lograr esto, o al menos intentarlo, la opcin tradicional en el caso de las empresas consista en disponer de un equipo formado por tcnicos capaces de desarrollar el aspecto tecnolgico plataforma, formato, diseo y actualizacin del sitio, y personal especializado exclusivamente en los contenidos a situar en la web. Lo cual supona un elevado desembolso econmico. Y, en el caso de los particulares, obligaba a estos a tener elevados conocimientos tcnicos y a estar continuamente pendientes de la vigencia de sus contenidos. Sin embargo, una solucin ms reciente que ha ido cobrando importancia creciente tanto entre empresas como entre particulares es la aportada por los gestores de contenido web, denominados generalmente con las siglas CMS, procedente de la terminologa anglosajona Content Management System. Si bien no hay una definicin oficial u homognea referida a los gestores de contenido web, analizando qu son y qu permiten hacer se podra proponer la siguiente definicin: Un gestor de contenidos web es un software que permite y facilita el desarrollo de un sitio o portal (formato, estructura, presentacin,...) sin tener elevados conocimientos tcnicos, y gestionar su contenido, entendiendo por gestin de contenido la administracin y control total del ciclo de vida de los contenidos web (creacin, clasificacin, publicacin, actualizacin, eliminacin o archivo de todos los contenidos). Todo ello de forma automtica, atendiendo a una configuracin predeterminada por el creador o administrador del sitio.

26

Forrester Research: Las condiciones de retorno de un visitante a un sitio disponible en: http://www.jipo-interactive.com/es/articles/webmastering/article_webmastering_1

467

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

18.2.1. FUNCIONAMIENTO
Pese a la gran diversidad de aplicaciones, generalmente los gestores de contenido tienen un funcionamiento similar. Son aplicaciones modulares que se apoyan en bases de datos o repositorios y estn formadas por dos elementos, la aplicacin gestora de contenidos (CMA) y la aplicacin de presentacin de contenidos (CDA) que se utilizan mediante una nica interfaz ms o menos intuitiva, dependiendo de la aplicacin, y por lo general de tipo web. El CMA, permite al autor del sitio, sin necesidad de que este posea conocimientos de HTML u otro lenguaje, realizar la creacin, actualizacin y eliminacin del contenido del sitio web. El CDA por su parte, permite al autor elegir, mediante la seleccin de plantillas, el formato en que se presentarn los contenidos. El funcionamiento de los CMS puede ser resumido de la siguiente forma: Un sitio web o portal est formado por un conjunto de pginas organizadas jerrquicamente. A cada pgina le corresponde un determinado diseo o plantilla, que define la estructura de la pgina y el formato. Dentro de cada pgina, las distintas secciones pueden tener sus propias plantillas distintas de las de la pgina a la que pertenecen, lo que permite mostrar en una misma pgina contenidos con distinta presentacin. Cada pgina o seccin se asocia a un campo de la base de datos donde se depositan los contenidos.

Por tanto, el administrador utilizando un CMS crear el sitio web y decidir la apariencia de las distintas pginas y sus secciones, los contenidos a mostrar y cmo se presentar cada contenido.

18.2.2. CARACTERSTICAS
La oferta existente de aplicaciones dedicadas a la gestin de contenidos web (CMS) es muy heterognea tanto en nmero de aplicaciones como en las caractersticas concretas que estas presentan. Respecto a las aplicaciones de gestin de contenidos web open source, existe un elevado nmero de alternativas fruto de un continuo desarrollo y mejora, caracterstico de las comunidades open source. Pero este elevado nmero de aplicaciones no implica que todas estn al mismo nivel de desarrollo. Algunas estn ampliamente testadas y consolidadas, con numerosos manuales y documentacin de apoyo, entre otras se pueden citar como

468

SOLUCIONES OPEN SOURCE BASADAS EN PHP Y MYSQL

ejemplos PHPnuke, PostNuke, Xoops, y otras son de creacin ms reciente, aunque no por ello peores, como Mambo. El elegir una u otra aplicacin debera venir precedido, tanto para empresas como particulares, por: 1. Definir cules son los objetivos, caractersticas y pblico objetivo del sitio web a crear. 2. Analizar las caractersticas de las distintas aplicaciones y de las comunidades que las han desarrollado para determinar cul se ajusta mejor a las necesidades detectadas. A pesar de la gran diversidad de aplicaciones CMS open source, todas tienen una misma finalidad y convergen en una serie de caractersticas. Estas caractersticas podran considerarse como las propiedades o requisitos mnimos a exigir a un CMS, de forma que sirvan de indicativo para cribar entre las numerosas aplicaciones y determinar cules pueden ser las ms adecuadas en funcin siempre de las necesidades particulares. A continuacin, examinado el funcionamiento de distintas aplicaciones CMS, se recoge una orientacin de los requisitos mnimos deseables para dichas aplicaciones, tanto relativos a la creacin de contenido como a la gestin, publicacin y presentacin de los contenidos. Creacin de contenido: o Interfaz intuitivo y fcil de utilizar, para la creacin y gestin tanto del sitio web como de los contenidos, por personal no tcnico o sin conocimientos informticos elevados. o Separacin de la presentacin, diferentes formatos y diseos definidos, de los contenidos a publicar. o Posibilidad de establecer mltiples autores de contenidos. o Reutilizacin y comparticin de los elementos que conforman el sitio web, estructuras, contenidos, diseos, etc., evitando duplicaciones y ahorrando recursos. Gestin de contenidos o Control completo del ciclo de vida de los contenidos, entendidos estos en sentido amplio como cualquier informacin, imgenes, texto, etc., desde su creacin hasta su eliminacin o archivo pasando por su control o validacin, publicacin, actualizacin y control de versiones. o Nivel de seguridad aceptable para poder proteger la integridad de los contenidos. o Permitir la designacin de roles o distintos perfiles de usuarios, cada uno con unos privilegios respecto a la gestin del contenido.

469

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Publicacin o Publicacin de contenidos en diferentes formatos HTML, PDF,... o Permitir la personalizacin, presentar diferente informacin para diferentes perfiles. o Definir los flujos de trabajo incluyendo actualizacin, validacin y publicacin en funcin de los distintos perfiles definidos. o Proporcionar estadsticas sobre hbitos de navegacin de los visitantes, contenidos ms visitados, etc. o Previsualizacin interna de contenidos anterior a su publicacin a los usuarios. o Composicin especificada en plantillas basadas en XML. o Posibilidad de ofrecer soporte multilinge. Presentacin final o Usabilidad, recoge conceptos de facilidad de uso y eficiencia para todos los usuarios adems de una navegacin coherente y comprensible. o Accesibilidad, el sitio que se desarrolle debe ser conforme a estndares como los de W3C y permitir ser soportado por distintos navegadores. o Velocidad de descarga, limitar el tamao del sitio para garantizar un tiempo de descarga aceptable para el usuario. o Metadatos, las pginas del sitio deben ofrecer suficientes metadatos para asegurar la indexacin en buscadores.

18.2.3. VENTAJAS E INCONVENIENTES


Tras la lectura de los distintos epgrafes el lector posiblemente ya ha sacado sus conclusiones sobre las ventajas e inconvenientes de los gestores de contenido open source. No obstante, en este apartado revisamos las principales ventajas y dificultades que pueden presentar dichas aplicaciones.
Ventajas
Facilitan la creacin de un sitio web y la completa gestin de sus contenidos sin tener excesivos conocimientos informticos. Permiten incorporar al sitio web diferentes servicios como foros, chats, encuestas,... Facilidad para la modificacin del sitio y de los contenidos de forma remota, desde cualquier punto con conexin a Internet. Personalizacin del sitio en funcin del usuario, creando distintos perfiles. Gratuidad y cdigo abierto.

Inconvenientes
Dominar una aplicacin CMS requiere tiempo y en el caso de grandes empresas, pueden suponer un alto coste en consultores que integren la aplicacin con el sistema existente en la organizacin. En algunos casos puede generar un exceso de homogeneidad con otros sitios desarrollados con el mismo CMS. El desarrollo y mejoras de la aplicacin estn vinculados al desarrollo de la comunidad creadora del software.

Tabla 18.1 Ventajas e inconvenientes de los gestores de contenido

470

SOLUCIONES OPEN SOURCE BASADAS EN PHP Y MYSQL

Para finalizar esta seccin, y antes de pasar a presentar aplicaciones concretas, se incluyen a continuacin un listado de direcciones de Internet donde se puede completar informacin relativa a los CMS open source: www.opensourcecms.com: completo portal en el que se recoge toda la informacin relativa a los CMS open source. www.cmsreview.com: sitio web dedicado exclusivamente a informar sobre los CMS, realizando comparativas entre distintas aplicaciones. www.cms-spain.com: portal informativo con informes y artculos, en castellano, sobre las novedades en los CMS.

18.3. GESTORES DE CONTENIDO BASADOS EN PHP Y MYSQL


En esta seccin se recoge una recopilacin de los gestores de contenido open source ms conocidos y utilizados, presentando brevemente sus caractersticas ms destacadas e indicando las direcciones de Internet donde se pueden obtener las correspondientes aplicaciones y toda la informacin necesaria sobre las mismas.

18.3.1. PHP-NUKE
Sitio oficial http://www.phpnuke.org www.phpnuke-espanol.org/

Es un sistema de gestin de contenidos y un sistema automatizado de noticias diseado para ser usado en intranets e Internet utilizando bases de datos. Posee un conjunto de herramientas que permiten construir pginas atractivas e interactivas. La licencia gratuita GPL permite al usuario modificar el cdigo fuente y adaptarlo a sus necesidades. PHPNuke se ha convertido en los ltimos aos en uno de los gestores de web ms utilizados y completos que existen, ya que permite crear los sitios web con enorme facilidad, gestionar su publicacin y desarrollar una comunidad de usuarios, todo en uno y con mltiples servicios aadidos. Algunas de las caractersticas que se podran destacar son: Creacin y administracin rpida de una comunidad on line. Administracin sencilla con interfaz intuitivo y grfico. Gestin y administracin de usuarios registrados.

471

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Figura 18.1 Sitio oficial de PHPNUKE

Estadsticas del sitio (pginas ms votadas, ms vistas,...) Zonas personalizables por el usuario. Servicio de encuestas y valoracin de artculos on line. Administrador de plantillas para usuarios registrados. Completo sistema de moderacin de contenidos. Gestor de zonas y secciones. Gestin de referencias para controlar los enlaces externos al sitio web. Sistema de gestin de banners integrado. Motor de bsqueda integrado. Sistema de generacin de noticias. Soporte para ms de 22 lenguajes. Disponibles cientos de plantillas y mdulos para aadir ms opciones. Gestor de ficheros incluido. Gestin de faqs (preguntas frecuentes). 472

SOLUCIONES OPEN SOURCE BASADAS EN PHP Y MYSQL

18.3.2. POSTNUKE
Sitio oficial www.postnuke.com www.postnuke-hispano.com

PostNuke puede verse como un sistema de gestin de contenidos, pero tambin como un sistema de gestin colaborativo que permite generar verdaderas comunidades de usuarios, en las que los miembros de la comunidad interactan con el contenido. PostNuke se autodefine como una herramienta C3MS (comunidad, contenido y sistema de colaboracin de contenido). Se caracteriza por su facilidad de instalacin, utilizacin y administracin, todo ello a travs de la web. La herramienta tiene un diseo modular, disponiendo de mdulos que permiten construir, por ejemplo, un chat integrado, un sistema de foros, galeras de imgenes, estadsticas,...

Figura 18.2 Sitio oficial de POSTNUKE

473

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

18.3.3. MAMBO SERVER


Sitio oficial www.mamboserver.com www.mambohispano.org

Mambo open source es una aplicacin escrita en PHP basada en los sistemas de administracin de contenidos, que permite la fcil creacin y mantenimiento de sitios web y portales. Como todos los CMS, su simplicidad se traduce en que no son necesarios grandes conocimientos para actualizar, mantener y personalizar los contenidos. Incorpora un editor WYSIWYG propio de contenido. Sus caractersticas son similares a las de los productos anteriores. Est disponible para diferentes plataformas, entre las que se encuentran Linux, FreeBSD, MacOSX Server, Solaris, AIX, SCO, WinNT y Win2K.

Figura 18.3 Sitio oficial de MAMBO

474

SOLUCIONES OPEN SOURCE BASADAS EN PHP Y MYSQL

18.3.4. PHPWEBSITE
Sitio oficial phpwebsite.appstate.edu

Gestor de contenido desarrollado en PHP por el grupo de tecnologas web de la Appalachian State University de Boone (USA). Aunque menos conocido que los anteriores, presenta caractersticas similares, destacando por la facilidad de administracin a travs de su interfaz grfica. En su desarrollo se respetan los estndares recomendados por la W3C. A fecha de hoy no existe sitio oficial en espaol y tiene pocos complementos para aadir. Puede ser una opcin interesante para desarrollar sitios de empresas sin los requerimientos de una comunidad.

Figura 18.4 Sitio oficial de PHPWEBSITE

475

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

18.3.5. PHP-WCMS
Sitio oficial www.phpwcms.de

Es un CMS optimizado para una rpida y fcil instalacin sobre cualquier servidor web que soporte PHP y MySQL. Ha sido probado satisfactoriamente sobre Windows 2000/XP, MacOSX y LINUX. Es ideal para usuarios profesionales, pblicos y privados, por su facilidad de aprendizaje y por brindar la posibilidad de separar diseo de contenido. Las poderosas pero simples caractersticas que tienen implementadas sirven de mucha ayuda tanto a diseadores como a desarrolladores Web.

Figura 18.5 Sitio oficial de PHP-WCMS

476

SOLUCIONES OPEN SOURCE BASADAS EN PHP Y MYSQL

18.3.6. XOOPS
Sitio oficial www.xoops.org www.esxoops.com

Recomendable CMS con buen soporte en espaol y muchos mdulos, XOOPS ha revolucionado la creacin dinmica de portales, escrito en PHP y bajo licencia open source. Se trata de una herramienta basada en programacin orientada a objetos (OOP, Object Oriented Programing) y que puede ser utilizada para crear y mantener fcilmente sitios web personales, portales corporativos, weblogs,...

Figura 18.6 Sitio oficial de XOOPS

477

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

18.3.7. DRUPAL
Sitio oficial www.drupal.org drupal.badopi.org

Drupal es un CMS desarrollado en PHP, puede ser usado con MySQL o con PostgreSQL y ejecutado sobre mltiples plataformas, incluyendo los servidores Apache o IIS de Microsoft. Permite a los usuarios publicar, gestionar y organizar contenidos. Drupal incorpora igualmente herramientas colaborativas para el desarrollo de comunidades. Otras prestaciones de la plataforma son su motor de bsqueda, muestreo del sitio, weblog, control de versiones, gestor de noticias, foros de discusin...

Figura 18.7 Sitio oficial de DRUPAL

478

SOLUCIONES OPEN SOURCE BASADAS EN PHP Y MYSQL

18.3.8. SITEFRAME
Sitio oficial siteframe.org

Se trata de un CMS diseado para crear rpidamente sitios web para comunidades. Dispone de un conjunto de plantillas con un diseo agradable y artstico. Est orientado a compartir documentos, haciendo uso de una interfaz clara y sencilla.

Figura 18.8 Sitio oficial de SITEFRAME

479

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

18.4. OTRAS SOLUCIONES OPEN SOURCE


18.4.1. WEBLOGS
Los weblogs, tambin conocidos como bitcoras, constituyen una de las formas ms sencillas de crear y actualizar una pgina web. De este fenmeno emergente han nacido varios sistemas de publicacin gratuitos basados en PHP y MySQL que permiten poner un weblog en marcha en menos de cinco minutos, sin ningn conocimiento previo. Antes de nada conviene tratar de clarificar lo que se entiende por weblog, aunque no es fcil encontrar una definicin precisa, y de hecho existe un debate abierto sobre el tema, se podra decir que un weblog es un sitio web donde se recopilan cronolgicamente mensajes de uno o varios autores, sobre una temtica o a modo de diario personal. Estos sitios web suelen incorporar enlaces a otros weblogs, archivos de entradas anteriores, enlaces para citar anotaciones, funciones para aadir comentarios,...

GeekLog
Sitio oficial www.geeklog.net

Geeklog es una herramienta para la creacin de weblogs basada en PHP y MySQL, permite generar en pocos minutos un sitio web dinmico completamente funcional. Algunas caractersticas de esta herramienta son: Permite que los usuarios se registren como miembros y enven sus historias o artculos. Dispone de un sistema para aadir comentarios a los artculos publicados por los miembros. Sistema basado en plugins para extender la aplicacin. Generacin automtica de estadsticas del sitio. Dispone de un calendario para aadir eventos o citas. Herramientas de comunicacin entre los miembros de la comunidad de usuarios.

480

SOLUCIONES OPEN SOURCE BASADAS EN PHP Y MYSQL

Figura 18.9 Sitio oficial de GEEKLOG

481

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Pmachine
Sitio oficial www.pmachine.com

Sistema de weblogs muy completo que permite una administracin por web mediante un interfaz grfico fcil de utilizar y muy intuitivo. Soporta mltiples weblogs, organizndolos en categoras, separndolos en pginas independientes o colocando mltiples weblogs en la misma pgina. Puede llegar a convertir un weblog en una comunidad on line.

Figura 18.10 Sitio oficial de pMachine

482

SOLUCIONES OPEN SOURCE BASADAS EN PHP Y MYSQL

B2, B2evolution y WordPress


Sitio oficial www.cafelog.com b2evolution.net wordpress.org

B2 es un sistema de generacin de weblogs basado en PHP y MySQL. Se trata de uno de los productos ms simples y sencillos de utilizar en su categora. Dispone de dos extensiones ms completas: b2evolution y WordPress.

Figura 18.11 Sitio oficial de B2

483

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

18.4.2. SISTEMAS DE FOROS


Los foros de discusin constituyen uno de los ms importantes mecanismos para el intercambio de informacin con los que cuenta Internet. En la actualidad pueden encontrarse foros temticos prcticamente sobre cualquier tema imaginable, foros en los que los usuarios plantean sus dudas, buscan informacin especializada, contactan con usuarios interesados en los mismos temas, solicitan ayuda o consejo,... En definitiva, los foros permiten disear pginas de contenido atractivo autogenerado por los visitantes del sitio web. Los foros favorecen los canales de comunicacin con clientes, proveedores, usuarios, etc., y resultan ideales para dar soporte tcnico a usuarios. La corriente open source no ha sido ajena al inters en desarrollar herramientas que faciliten la creacin y gestin de foros. En esta seccin se presentan dos de los proyectos ms conocidos en este campo y que han sido desarrollados utilizando las tecnologas PHP y MySQL. Algunas de las caractersticas habituales de estos sistemas son: Creacin y administracin rpida de una comunidad on line. Interfaz de usuario de fcil manejo. Formato de los mensajes con mltiples estilos y tamaos de fuentes y enlace automtico de URL. Integracin de sistemas de generacin de encuestas. Notificacin por e-mail de las respuestas. Posibilidad de envo de mensajes privados entre usuarios. Mecanismos de control de la IP desde la que se envan los mensajes. Encriptacin de informacin sensible (por ejemplo contraseas). Uso de cookies para simular conexiones continuas. Posibilidad de establecer usuarios moderadores para cada foro temtico. En ocasiones disponen de mecanismos que permiten filtrar los mensajes, censurando a determinados usuarios o palabras que puedan resultar ofensivas.

484

SOLUCIONES OPEN SOURCE BASADAS EN PHP Y MYSQL

Phpbb
Sitio oficial www.phpbb.com

PHPBB es una aplicacin open source muy potente y de fcil personalizacin para establecer comunidades virtuales con foros interactivos donde los usuarios pueden aadir temas, crear y responder mensajes... Su interfaz de usuario es muy fcil de usar por el visitante, con un panel de administracin simple y de ejecucin rpida y sencilla y una seccin de ayuda siempre a mano.

Figura 18.12 Sitio oficial de phpBB

485

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Minibb
Sitio oficial www.minibb.net

MiniBB es un sistema de foros altamente configurable escrito en el lenguaje PHP. Incluye las caractersticas ms populares de los sistemas de foros conocidos pero con un tamao ms reducido y mucho ms rpido. Est basado en MySQL pero tambin se puede utilizar con otros gestores de bases de datos como PostgreSQL o Microsoft SQL Server a travs de mdulos especiales.

Figura 18.13 Sitio oficial de miniBB

18.4.3. PLATAFORMAS DE E-LEARNING


Otro de los campos de aplicacin ms destacado de las tecnologas web es el desarrollo de entornos de enseanza on line, tambin conocidos como entornos de enseanza virtual o e-learning. En este caso, los desarrollos que tratan de dar apoyo a estos sistemas de enseanza recrean un verdadero entorno virtual de enseanza, en el que se reflejen los elementos habituales de todo actividad de

486

SOLUCIONES OPEN SOURCE BASADAS EN PHP Y MYSQL

aprendizaje. Estos sistemas, adems de servir como gestores de contenido estructurado en unidades didcticas, permiten gestionar los diferentes usuarios, realizar un seguimiento detallado de su actividad dentro del curso, poner a disposicin de los mismos diferentes herramientas de comunicacin, establecer procesos de evaluacin, etc. Existe una amplia variedad de plataformas de e-learning comerciales, pero tambin es posible encontrar algn producto dentro de la corriente open source, este es el caso de la plataforma Moodle.

Moodle
Sitio oficial moodle.org

Moodle (Modular Object-Oriented Dynamic Learning Environment) es un proyecto en desarrollo diseado para dar soporte a un marco de educacin social constructivista y que se distribuye gratuitamente como software libre. Est desarrollando en PHP y trabaja con diferentes tipos de bases de datos, aunque lo habitual es encontrarlo trabajando sobre MySQL. En el desarrollo de la plataforma se ha puesto un especial nfasis en la seguridad slida de toda la plataforma, los mecanismos de autentificacin y en la claridad del cdigo fuente PHP para facilitar su modificacin y adaptacin a necesidades particulares.

Figura 18.14 Sitio oficial de Moodle

487

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

18.4.4. ENTORNOS DE COMERCIO ELECTRNICO


En el mbito del comercio electrnico tambin es posible encontrar algunos productos interesantes basados en PHP y MySQL y que pueden ser utilizados gratuitamente. Por ejemplo es posible encontrar desarrollos para implementar una tienda virtual.

OSCommerce
Sitio oficial www.oscommerce.com

OsCommerce es una solucin de comercio electrnico sencilla de mantener y administrar, que con el mnimo esfuerzo permite disponer de una tienda virtual. Comenz su desarrollo en marzo 2000 y desde entonces ha madurado notablemente en sus soluciones, existiendo en la actualidad miles de tiendas en el mundo con este sistema. Entre sus caractersticas estn: un completo sistema de administracin web, estadsticas de productos ms vendidos, mdulos de pago y envo, soporte SSL, buscador, control de impuestos, gestin de pedidos,...

Figura 18.15 Sitio oficial de osCommerce

488

SOLUCIONES OPEN SOURCE BASADAS EN PHP Y MYSQL

Cubecart
Sitio oficial www.cubecart.com

CubeCart es otro producto basado en PHP y MySQL que puede utilizarse gratuitamente para implementar una tienda virtual, siempre y cuando el copyright del producto no sea modificado o eliminado. En caso de desear eliminar ese copyrigth en el sitio web desarrollado, se debe pagar una cantidad por la licencia. Debe destacarse que CubeCart no se distribuye como cdigo abierto, por lo que no puede ser redistribuido.

Figura 18.16 Sitio oficial de CubeCart

489

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

18.4.5. SISTEMAS DE ATENCIN AL CLIENTE OsTicket


Sitio oficial www.osticket.com

OsTicket es un sistema automatizado de soporte al cliente basado en lenguaje PHP en el que se pueden abrir consultas va e-mail o directamente desde la web. En ambos casos, los clientes, al abrir una consulta recibirn un e-mail de auto respuesta. El cliente puede consultar en todo momento el estado de su consulta.

Figura 18.17 Sitio oficial de osTicket

490

SOLUCIONES OPEN SOURCE BASADAS EN PHP Y MYSQL

PHP-Support-Tickets
Sitio oficial www.phpsupporttickets.com

PHP-Support-Tickets es otra solucin basada en PHP y MySQL para atender a los clientes y con un funcionamiento y caractersticas similar al producto anterior. A travs de la pgina oficial del producto se puede acceder a una demo on line del mismo.

Figura 18.18 Sitio oficial de PHP Support Tickets

491

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

SugarSales
Sitio oficial www.sugarcrm.com

SugarSales es una suite CRM (Customer Relationship Management) que incluye la gestion de procesos de ventas, comercializacin y servicio al cliente. Es una aplicacin fcil de utilizar y fcil de instalar construida en PHP y MySQL.

Figura 18.19 Sitio oficial de SugarSales

492

SOLUCIONES OPEN SOURCE BASADAS EN PHP Y MYSQL

18.4.6. HERRAMIENTAS DE GESTIN DE PROYECTOS PHPCollab


Sitio oficial www.php-collab.com

PHPCollab es un sistema de gestin de proyectos basado en lenguaje PHP con el que se crea un entorno de colaboracin en equipos de proyectos. PHPCollab permite compartir informacin con otros miembros en un mismo espacio e incorpora aspectos importantes de la gestin de proyectos: planificacin de tareas, documentos compartidos, seguimiento de tiempos y plazos, grficos de progreso, generacin de informes,...

Figura 18.20 Sitio oficial de phpCollab

493

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

DotProject
Sitio oficial www.dotproject.net

DotProject es otra herramienta open source de administracin de proyectos basada en PHP. Incluye mdulos para gestin de clientes y compaas, listado de proyectos, asignacin de tareas, calendarios, foros, contactos,...

Figura 18.21 Sitio oficial de dotProject

494

SOLUCIONES OPEN SOURCE BASADAS EN PHP Y MYSQL

18.4.7. OTRAS HERRAMIENTAS


Para finalizar, se incluyen en esta seccin referencias a diferentes herramientas, todas ellas basadas en PHP y MySQL y que permiten dar mayores funcionalidades a los sitios web.

PhpAdsNew
Sitio oficial phpadsnew.com

PhpAdsNew es una herramienta que permite gestionar de manera sencilla los banners y publicidad de un sitio web. Incorpora un sistema de seguimiento avanzado con estadsticas. PhpAdsNew permite publicar diferentes banners con parmetros que controlan la direccin IP, dominio, da de la semana, hora del da, lenguaje, navegador o sistema operativo. Los anunciantes pueden controlar su histrico desde el interfaz de usuario y ver estadsticas de los ratios de efectividad de sus banners.

4images
Sitio oficial www.4homepages.de

4images es un sistema de administracin de galeras de imgenes para la web. Permite incluir comentarios para cada imagen, administrar la galera va web, auto dimensionar las imgenes e incorpora plantillas HTML para diseo y un motor de bsqueda integrado.

OWL
Sitio oficial owl.sourceforge.net

OWL es un sistema muy completo que permite la administracin y publicacin de documentacin en distintos entornos. Permite compartir documentos dentro de la organizacin, estableciendo mecanismos de control de accesos, organizacin de documentos en carpetas, control de versiones,... En definitiva, se trata de un completo sistema de gestin documental.

495

PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

OpenClinic
Sitio oficial openclinic.sourceforge.net

OpenClinic es un sistema de gestin de expedientes mdicos, permite almacenar informacin sobre pacientes, crea informes, permite realizar bsquedas,...

PHPList
Sitio oficial tincan.co.uk/phplist

PHPlist es una aplicacin web que implementa un gestor de listas de correo personalizado y que puede verse tambin como un sencillo CRM.

PHP Auction
Sitio oficial www.phpauction.org

Se trata de una herramienta para la elaboracin y gestin de subastas on-line. Existen varias versiones del producto, siendo una de ellas distribuida gratuitamente bajo la licencia GPL.

Web Calendar
Sitio oficial www.k5n.us/webcalendar.php

Herramienta que implementa un calendario de eventos, puede ser configurado como un sistema monousuario o multiusuario.

496

ndice alfabtico

124 ! ! 130 != 128 !== 128 $ $_COOKIE 291 $_GET 142 $_POST 142 $_REQUEST 142 $_SERVER 110 $GLOBALS 208, 265 $HTTP_COOKIE_VARS 290 $HTTP_GET_VARS 143 $HTTP_POST_VARS 143 $this 275 % % 124

& & 127, 203 && 130 . . 131 @ @ 132 [ [] 216 ^ ^ 127 132 | | 127 || 130 ~ ~ 127 +

497

++ 124 < < 128 << 127 <= 128 = == 128 === 128 > > 128 -> 278 >= 128 >> 127

A A 82 ACTION 137 ALL 331 ALTER 318, 321 mbito de las variables 116 and 130 applet 10 Applet 19 argumentos longitud variable 201 opcionales 199 por referencia 203 por valor 203 valores por defecto 200 argumentos opcionales 199 array 215, 216 multidimensional 218 array_change_key_case 225 array_chunk 226 array_combine 232 array_count_values 227 array_diff 239 498

array_diff_assoc 239 array_fill 237 array_filter 228 array_intersect 239 array_intersect_assoc 239 array_key_exists 230 array_keys 229 array_map 240 array_pad 237 array_pop 237 array_push 237 array_rand 230 array_reverse 245 array_search 231 array_shift 237 array_splice 235 array_unique 237 array_unshift 238 array_values 232 array_walk 242 Arrays 113 arrays asociativos 217 arsort 244 ASC 334 asort 244 ASP 21 AVG 335 B B 69 BIGINT 357 BINARY 360 BIT 357 BLINK 69 BLOB 360 BLOCKQUOTE 70 BODY 62 BOOL 357

borrado en cascada 324 break 170, 188 C Cadenas 113 case 170 CASE_LOWER 225 CASE_UPPER 225 CGI 21 Ch CHAR 359 checkdate 260 chr 182 C class 273 clave ajena 323 Cliente 6 cliente/servidor 5 ColdFusion 22 comentarios 112 compact 232 comunidades 47 constructor 275 continue 188 cookie 285, 286 de sesin 291 permanente 291 visibilidad 294 copy 306 count 223, 227 COUNT 335 CREATE 317 CREATE DATABASE 317 499

CREATE INDEX 323 CREATE TABLE 318 ctype_alnum 250 ctype_alpha 250 ctype_digit 250 ctype_lower 250 ctype_print 250 ctype_punct 250 ctype_space 250 ctype_upper 250 D date 107, 167, 260 DEC 358 DECIMAL 358 default 170 define 119 DELETE 328 DESC 334 DESCRIBE 347 die 416 DISTINCT 331, 332 do...while 176 DOCTYPE 64 DOUBLE 358 DROP 318 E each 221 echo 103 eliminacin en cascada 374 else 162 elseif 165 empty 119 ENCTYPE 307 endfor 179 endif 167

endswitch 173 endwhile 175 ENUM 361 EXIT 344 explode 251 extends 283 EXTR_OVERWRITE 233 EXTR_PREFIX_ALL 233 EXTR_PREFIX_SAME 233 EXTR_SKIP 233 extract 233 F fclose 297 feof 298 fgetc 300 fgets 298 file 299 file_exists 307 filesize 299 FLOAT 358 FLUSH PRIVILEGES 351 FONT 69 fopen 296 for 179 foreach 187, 220 Foreign Key 313 FOREIGN KEY 323 FORM 90 fputs 303 FRAME 86 FRAMESET 85 fread 299 free software 27 FROM 331 fscanf 300 FSF 29 func_get_arg 202 500

func_get_args 202 func_num_args 202 funciones variables 211 function 193 function_exists 212 fwrite 303 G get_defined_functions 212 gettype 118 global 207 GNU 29 GPL 37 GROUP BY 331, 336 H HAVING 331, 336 HEAD 62 herencia 281 hipertexto 5 Hn 68 HTML 7, 57 http 7, 55 I I 69 if 158 IMG 79 implode 251 in_array 232 include 209 INDEX 366 ndices 322 InnoDB 365 INSERT 325 INT 357

INTEGER 357 integridad referencial 364 Internet 3 is_array 118 is_float 118 is_int 118 is_object 118 is_string 118 isset 118 J Java 19 JavaScript 18 JSP 21 K krsort 244 ksort 244 L LI 71 list 221 LOAD DATA INFILE 381 localhost 104 M mail 424 matriz 215 MAX 335 max_execution_time 181 MAX_FILE_SIZE 308 MEDIUMINT 357 META HTT-EQUIV 63 META NAME 65 metaetiquetas 62 501

metatags 62 mtodo GET 144 Mtodo GET 143 mtodo POST 145 Mtodo POST 143 mtodos 270 MIN 335 mktime 187, 260 MySQL 339 mysql_ free_result 450 mysql_affected_rows 425, 450 MYSQL_ASSOC 431 MYSQL_BOTH 431 mysql_close 415 mysql_connect 414 mysql_db_query 418 mysql_error 419 mysql_fetch_array 431 mysql_fetch_assoc 431 mysql_fetch_row 424 mysql_field_len 450 mysql_field_name 450 mysql_field_type 450 mysql_insert_id 424 MYSQL_NUM 431 mysql_num_rows 425, 450 mysql_pclose 416 mysql_pconnect 416 mysql_query 417 mysql_select_db 416 mysqld 341 mysqldump 385 mysqlimport 381 mysqlshow 341 N natcasesort 245 natsort 245

new 277 NO ACTION 324 NOT NULL 325 NULL 325 NUMERIC 358 Nmeros en coma flotante 113 Nmeros enteros 113 O objetos 269 Objetos 113 OL 71 ON DELETE 324, 374 ON UPDATE 379 open source 2, 27 operacin de negacin 130 operador asignacin 125 operador condicional 130, 164 operador de cast 116 operador de concatenacin 131 Operador de conversin de tipo 133 operador de direccin 203 operador de ejecucin 132 operador de identidad 128 operador de igualdad 128 operador de negacin 127 operador de negacin de identidad 128 operador de negacin de igualdad 128 operador de supresin de error 132 operador decremento 124 operador diferencia 124 operador divisin 124 operador incremento 124 operador O 130 operador O exclusivo 130 operador producto 124 operador resto 124 operador suma 124 502

operador Y 130 operadores aritmticos 124 operadores de bit 127 Operadores de comparacin 128 operadores de desplazamiento de bits 127 operadores lgicos 130 OPTION 92 or 130 ORDER BY 331, 333 P P 70 PASSWORD 351 PHP 23, 99 phpinfo 106 phpmyadmin 389 PRE 70 PRECISION 358 Primary Key 313 print 106 print_r 219 print_r() 198 prioridad de operadores 133 programacin orientada a objetos 269 Q QUIT 344 R rand 182 range 234 REAL 358 register_globals 141 rename 307 require 209

return 194 rewind 304 rsort 245 S S 69 SCRIPT 108 script, inserccin 108 secuencias de escape 120 SELECT 92, 330 SELECT INTO OUTFILE 386 Servidor 5 servlets 21 SET 361 SET NULL 324 SET PASSWORD 350 setcookie 286 settype 116 Shareware 27 SHOW COLUMNS 347 show databases 345 SHOW TABLES 347 shutdown 341 SMALLINT 357 sort 245 SOURCE 369 SQL 316 str_pad 253 STR_PAD_BOTH 253 STR_PAD_LEFT 253 STR_PAD_RIGHT 253 str_repeat 253 str_replace 254 str_word_count 252 strcasecmp 256 strchr 256 strcmp 256 stristr 257 503

strlen 259 strnatcasecmp 256 strnatcmp 256 strpos 257 strrchr 256 strrev 254 strrpos 257 strstr 110, 257 strtok 258 strtolower 254 strtoupper 254 SUB 69 subclases 281 substr 257 substr_count 257 substr_replace 254 SUM 335 SUP 69 switch 169 T TABLE 76 TD 77 tempnam 445 TEXT 360 TEXTAREA 91 TH 76 this 275 time 260 TIMESTAMP 363 TINYINT 357 TITLE 62 TR 76 U U 69 ucfirst 255

ucwords 255 UL 73 unlink 307 unset 118, 204 UNSIGNED 357 UPDATE 329 USE 346 user 346 V valores por defecto 200 var 273 VARCHAR 359 variable esttica 208 global 207 local 206 variable global 117 variable local 117

variables 114 mbito 206 VBScript 20 W W3C 59 web 1, 4 WHERE 331 while 175 wordwrap 258 X xor 130 Z ZEROFILL 357

504

Похожие интересы