Vous êtes sur la page 1sur 526

PHP y MySQL

Tecnologas para el desarrollo de


aplicaciones web

III
IV
www.full-ebook.com
NGEL COBO
PATRICIA GMEZ
DANIEL PREZ
ROCO ROCHA

PHP y MySQL
Tecnologas para el desarrollo de
aplicaciones web

V
www.full-ebook.com
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
www.full-ebook.com
A Valeria

VII
www.full-ebook.com
VIII
www.full-ebook.com
ndice

Agradecimientos ............................................................................................. VII

Prefacio ............................................................................................. XVII

1. INTERNET Y LA PROGRAMACIN DE ORDENADORES ............. 1


1.1. INTRODUCCIN ............................................................................ 1
1.2. INTERNET ....................................................................................... 3
1.2.1. El servicio web ..................................................................... 4
1.2.2. Relacin cliente/servidor ...................................................... 5
1.2.3. Proceso de creacin y publicacin de pginas web ............. 7
1.2.4. Dinamismo e interactividad en las pginas web .................. 8
1.3. PROGRAMACIN DE ORDENADORES ..................................... 9
1.3.1. Tipos de lenguajes de programacin .................................... 11
1.4. PROGRAMACIN EN INTERNET ............................................... 15
1.4.1. Programacin del lado del cliente vs programacin del
lado del servidor ................................................................... 16
1.4.2. Tecnologas de programacin del lado del cliente ................ 18
1.4.3. Tecnologas de programacin del lado del servidor ............. 20

2. OPEN SOURCE Y SOFTWARE LIBRE .................................................. 25


2.1. INTRODUCCIN ............................................................................ 25
2.1.1 Qu es open source? .......................................................... 27

IX
www.full-ebook.com
PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

2.2. BREVE RESEA CRONOLGICA ............................................... 28


2.2.1. Primera etapa, antecedentes ................................................. 28
2.2.2. Segunda etapa, desarrollo .................................................... 28
2.2.3. Tercera etapa, expansin ..................................................... 29
2.3. LA CORRIENTE OPEN SOURCE Y SOFTWARE LIBRE,
FILOSOFA Y CARACTERSTICAS ............................................. 31
2.4. LICENCIAS ...................................................................................... 35
2.4.1. Licencias propietarias .......................................................... 36
2.4.2. Licencias libres .................................................................... 37
2.4.3. Licencias semilibres ............................................................. 38
2.5. SITUACIN ACTUA DEL SOFTWARE OPEN SOURCE ............ 40
2.5.1. Software open source, aplicaciones para todo .................... 40
2.5.2. Comunidades open source ................................................... 47
2.5.3. Usuarios de software open source ....................................... 48
2.6. VENTAJAS, INCONVENIENTES Y PERSPECTIVAS DE
FUTURO ........................................................................................... 51
2.6.1. Ventajas ................................................................................ 51
2.6.2. Inconvenientes ...................................................................... 52
2.6.3 Perspectivas de futuro .......................................................... 52

3. CREACIN DE PGINAS WEB MEDIANTE EL


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

X
www.full-ebook.com
NDICE

3.6.5. Creacin de Tablas ............................................................... 76


3.6.6. Insercin de imgenes .......................................................... 79
3.6.7. Tratamiento del color ........................................................... 81
3.6.8. Enlaces o hipervnculos ....................................................... 82
3.7. MARCOS O FRAMES ...................................................................... 85
3.7.1. Construccin de pginas con marcos ................................... 85
3.7.2. Enlaces en pginas con marcos ............................................ 87
3.8. FORMULARIOS .............................................................................. 90

4. INTRODUCCIN A PHP .......................................................................... 99


4.1. EL LENGUAJE PHP ........................................................................ 99
4.2. ORGENES Y EVOLUCIN DEL LENGUAJE ............................. 100
4.3. PROGRAMACIN EN PHP: PRIMEROS EJEMPLOS ................ 102
4.4. FORMAS DE INCRUSTAR EL CDIGO PHP
EN LOS DOCUMENTOS HTML ................................................... 108
4.5. ESCRITURA DEL CDIGO FUENTE PHP .................................. 111
4.5.1. Aspectos sobre la sintaxis del lenguaje ................................ 111
4.5.2. Insercin de comentarios en el cdigo ................................. 112
4.6. ELEMENTOS BSICOS DEL LENGUAJE ................................... 113
4.6.1. Tipos de datos ...................................................................... 113
4.6.2. Variables .............................................................................. 114
4.6.3. Constantes ............................................................................ 119
4.6.4. Cadenas de caracteres y variables ....................................... 120
4.6.5. Operadores ........................................................................... 124

5. PHP Y LOS FORMULARIOS DE HTML ............................................... 137


5.1. FORMULARIOS DE HTML ........................................................... 137
5.2. ENVO DE DATOS A PROGRAMAS PHP .................................... 139
5.3. MTODOS DE ACCESO A LAS VARIABLES
DEL FORMULARIO........................................................................ 141
5.4. MTODOS DE TRANSFERENCIA DE DATOS
EN FORMULARIOS........................................................................ 143
5.4.1. Mtodo GET ........................................................................ 144
5.4.2. Mtodo POST ...................................................................... 145
5.4.3. Diferencias entre ambos mtodos ........................................ 146
5.5. TRANSFERENCIA DE DATOS AL SCRIPT DESDE
EL URL ............................................................................................. 147
5.6. TRATAMIENTO DE FORMULARIOS CON LISTAS
DE SELECCIN MLTIPLE .......................................................... 153

XI
www.full-ebook.com
PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

6. SENTENCIAS DE CONTROL ................................................................. 157


6.1. INTRODUCCIN ............................................................................ 157
6.2. ESTRUCTURAS CONDICIONALES ............................................ 158
6.2.1. Sentencia IF ......................................................................... 158
6.2.2. La clusula ELSE ................................................................ 162
6.2.3. Sentencia If ... ELSEIF ... ELSE ......................................... 165
6.2.4. Sintaxis alternativa de las sentencias IF .............................. 167
6.2.5. Estructuras condicionales SWITCH ... CASE .................... 169
6.3. ESTRUCTURAS ITERATIVAS ...................................................... 175
6.3.1. Sentencia WHILE ................................................................ 175
6.3.2. Sentencia DO ... WHILE ..................................................... 176
6.3.3. Sentencia FOR ..................................................................... 179
6.3.4. Sentencia FOREACH .......................................................... 187
6.3.5. Sentencias BREAK y CONTINUE ..................................... 188

7. DEFINICIN DE FUNCIONES ............................................................... 193


7.1. CMO SE DEFINEN FUNCIONES EN PHP? ............................. 193
7.2. LLAMADA A LAS FUNCIONES ................................................... 196
7.3. ARGUMENTOS DE UNA FUNCIN ............................................ 199
7.3.1. Argumentos opcionales ........................................................ 199
7.3.2. Argumentos con valores por defecto .................................... 200
7.3.3. Listas de argumentos de longitud variable ........................... 201
7.3.4. Paso de argumentos por valor o por referencia ................... 203
7.4. MBITO DE LAS VARIABLES ..................................................... 206
7.4.1. Variables locales .................................................................. 206
7.4.2. Variables globales ................................................................ 207
7.4.3. Variables estticas ................................................................ 208
7.5. CLUSULAS INCLUDE Y REQUIRE ........................................... 209
7.6. FUNCIONES VARIABLES ............................................................. 211

8. ARRAYS ............................................................................................. 215


8.1. CONCEPTOS FUNDAMENTALES ............................................... 215
8.1.1. Construccin de arrays ........................................................ 216
8.1.2. Arrays multidimensionales ................................................... 218
8.2. RECORRIDO DE TODOS LOS ELEMENTOS DE UN
ARRAY ............................................................................................. 219
8.3. FUNCIONES DE MANIPULACIN DE ARRAYS ....................... 225
8.3.1. Transformacin de los ndices ............................................. 225
8.3.2. Subdivisin .......................................................................... 226

XII
www.full-ebook.com
NDICE

8.3.3. Contabilizacin de elementos ............................................... 227


8.3.4. Bsqueda de datos ............................................................... 228
8.3.5. Generacin de arrays ........................................................... 232
8.3.6. Prolongacin o truncamiento de un array ............................ 237
8.3.7. Combinacin de arrays ........................................................ 238
8.3.8. Aplicacin de funciones ....................................................... 240
8.3.9. Ordenacin de los elementos de un array ............................. 244

9. FUNCIONES PREDEFINIDAS ................................................................ 249


9.1. INTRODUCCIN ............................................................................ 249
9.2. FUNCIONES DE MANIPULACIN DE CADENAS
DE CARACTERES .......................................................................... 250
9.2.1. Reconocimiento de caracteres .............................................. 250
9.2.2. Conversiones entre cadenas y arrays ................................... 250
9.2.3. Prolongacin de una cadena................................................. 253
9.2.4. Modificacin de una cadena ................................................ 254
9.2.5. Comparacin de cadenas ..................................................... 256
9.2.6. Bsqueda de datos ............................................................... 256
9.2.7. Subdivisin de cadenas ........................................................ 258
9.2.8. Longitud de una cadena ....................................................... 259
9.3. FUNCIONES DE FECHA Y HORA ................................................ 259
9.4. FUNCIONES MATEMTICAS ...................................................... 267

10. PROGRAMACIN ORIENTADA A OBJETOS ................................... 269


10.1. INTRODUCCIN ............................................................................ 269
10.2. DEFINICIN DE UNA CLASE ...................................................... 272
10.2.1. Constructores ....................................................................... 275
10.3. CONSTRUCCIN DE OBJETOS ................................................... 277
10.3.1. Acceso a las variables y mtodos del objeto ........................ 278
10.4. HERENCIA ...................................................................................... 281
10.4.1. Definicin de subclases ........................................................ 283

11. COOKIES ............................................................................................. 285


11.1. QU SON LAS COOKIES? ........................................................... 285
11.2. GENERACIN DE COOKIES ........................................................ 286
11.3. RECUPERACIN DE LOS VALORES DE LAS COOKIES ........ 288
11.4. COOKIES DE SESIN Y COOKIES PERMANENTES ............... 291
11.5. VISIBILIDAD DE LAS COOKIES EN EL SITIO WEB ................ 294

XIII
www.full-ebook.com
PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

12. MANEJO DE FICHEROS ........................................................................ 295


12.1. MECANISMOS DE ALMACENAMIENTO DE DATOS .............. 295
12.2. OPERACIONES DE MANIPULACIN DE FICHEROS .............. 296
12.2.1. Apertura y cierre de ficheros ............................................... 296
12.2.2. Operaciones de lectura de datos ........................................... 298
12.2.3. Lectura con formato ............................................................. 300
12.2.4. Operaciones de escritura de datos ........................................ 303
12.2.5. Otras funciones de manipulacin de ficheros ...................... 306
12.3. ENVO DE FICHEROS A TRAVS DE FORMULARIOS HTML ... 307

13. BASES DE DATOS RELACIONALES Y EL LENGUAJE SQL ............ 309


13.1. INTRODUCCIN ............................................................................ 309
13.2. DISEO DE BASES DE DATOS .................................................... 310
13.2.1. Modelo relacional ................................................................ 310
13.2.2. Diagramas entidad/relacin ................................................ 311
13.3. UN EJEMPLO ILUSTRATIVO: CINEM@S .................................. 311
13.4. EL LENGUAJE SQL ........................................................................ 316
13.4.1. Introduccin ......................................................................... 316
13.4.2. Sentencias de definicin de datos ......................................... 317
13.4.3. La sentencia INSERT .......................................................... 324
13.4.4. La sentencia DELETE ......................................................... 328
13.4.5. La sentencia UPDATE ......................................................... 329
13.4.6. La sentencia SELECT ......................................................... 330

14. EL SISTEMA GESTOR DE BASES DE DATOS MYSQL .................. 339


14.1. QU ES MYSQL? .......................................................................... 339
14.2. UTILIZACIN DE MYSQL ............................................................ 340
14.2.1. Arranque del servidor MySQL ............................................ 340
14.2.2. Inicio del monitor de MySQL .............................................. 342
14.3. EJECUCIN DE SENTENCIAS SQL ............................................ 344
14.4. GESTIN DE USUARIOS .............................................................. 346
14.4.1. La tabla USER ..................................................................... 346
14.4.2. Eliminacin de usuarios ....................................................... 349
14.4.3. Establecimiento de contraseas para los usuarios ............... 350
14.4.4. Creacin de nuevos usuarios................................................ 352
14.5. BASES DE DATOS Y TABLAS EN MYSQL ................................. 354
14.6. TIPOS DE DATOS ........................................................................... 356
14.6.1. Tipos Numricos .................................................................. 356

XIV
www.full-ebook.com
NDICE

14.6.2. Tipos cadena de caracteres .................................................. 359


14.6.3. Tipos enum y set .................................................................. 361
14.6.4. Tipos fecha/hora .................................................................. 362
14.7. INTEGRIDAD REFERENCIAL EN MYSQL ................................ 364
14.7.1. Definicin de claves forneas .............................................. 365
14.7.2. Insercin de registros en tablas relacionadas ....................... 372
14.7.3. Eliminacin de registros en tablas relacionadas .................. 373
14.7.4. Actualizacin de registros en tablas relacionadas................ 379
14.8. IMPORTACIN Y EXPORTACIN de datos ................................. 381
14.8.1. Importacin de datos ............................................................ 381
14.8.2. Exportacin de datos............................................................ 385

15. PHPMYADMIN: ADMINISTRACIN DE BASES DE


DATOS MYSQL DESDE LA WEB ......................................................... 389
15.1. INTRODUCCIN ............................................................................ 389
15.2. ENTRADA A PHPMYADMIN ........................................................ 390
15.3. GESTIN DE BASES DE DATOS ................................................. 392
15.3.1. Consulta de las bases de datos ............................................. 392
15.3.2. Manipulacin de las tablas .................................................. 393
15.3.3. Estructura de las tablas ........................................................ 398
15.4. CREACIN DE NUEVAS BASES DE DATOS ............................. 400
15.4.1. Creacin de tablas ................................................................ 401
15.5. OPERACIONES DE IMPORTACIN Y EXPORTACIN
DE DATOS ....................................................................................... 403
15.5.1. Importacin de datos externos en las tablas ........................ 403
15.5.2. Exportacin de datos............................................................ 405
15.6. GESTIN DE USUARIOS .............................................................. 407
15.6.1. Usuarios y privilegios .......................................................... 407
15.6.2. Creacin de usuarios ............................................................ 408

16. CONECTIVIDAD A BASES DE DATOS MYSQL DESDE PHP ........ 413


16.1. INTRODUCCIN ............................................................................ 413
16.2. CONEXIN CON MYSQL DESDE PHP ....................................... 414
16.2.1. Apertura de la conexin ....................................................... 414
16.2.2. Cierre de la conexin ........................................................... 415
16.3. SELECCIN DE LA BASE DE DATOS ........................................ 416
16.4. EJECUCIN DE SENTENCIAS SQL SOBRE LA BASE
DE DATOS SELECCIONADA ........................................................ 417

XV
www.full-ebook.com
PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

16.4.1. Insercin de datos a travs de formularios........................... 419


16.4.2. Recuperacin de los resultados de las consultas .................. 424
16.5. OTRAS FUNCIONES DE MANIPULACIN DE DATOS ........... 450

17. IMPLEMENTACIN DE FOROS .......................................................... 453


17.1. INTRODUCCIN ............................................................................ 453
17.2. ESTRUCTURA DE LA TABLA DE LA BASE DE DATOS .......... 454
17.3. GENERACIN DE LA PGINA PRINCIPAL DE LOS FOROS .... 455
17.4. CONSULTA DE UN MENSAJE CON SUS RESPUESTAS .......... 458
17.5. INSERCIN DE NUEVOS MENSAJES ........................................ 460

18. SOLUCIONES OPEN SOURCE BASADAS EN PHP Y MYSQL ....... 465


18.1. INTRODUCCIN ............................................................................ 465
18.2. GESTORES DE CONTENIDO ....................................................... 466
18.2.1. Funcionamiento .................................................................... 468
18.2.2. Caractersticas ..................................................................... 468
18.2.3. Ventajas e inconvenientes ..................................................... 470
18.3. GESTORES DE CONTENIDO BASADOS EN PHP
Y MYSQL ......................................................................................... 471
18.3.1. PHP-NUKE ......................................................................... 471
18.3.2. POSTNUKE ........................................................................ 473
18.3.3. MAMBO SERVER.............................................................. 474
18.3.4. PHPWEBSITE .................................................................... 475
18.3.5. PHP-WCMS ........................................................................ 476
18.3.6. XOOPS ................................................................................ 477
18.3.7. DRUPAL .............................................................................. 478
18.3.8. SITEFRAME ....................................................................... 479
18.4. OTRAS SOLUCIONES OPEN SOURCE ....................................... 480
18.4.1. Weblogs ................................................................................ 480
18.4.2. Sistemas de foros ................................................................. 484
18.4.3. Plataformas de e-learning ................................................... 486
18.4.4. Entornos de comercio electrnico ........................................ 488
18.4.5. Sistemas de atencin al cliente ............................................. 490
18.4.6. Herramientas de gestin de proyectos .................................. 493
18.4.7. Otras herramientas ............................................................... 495

ndice alfabtico ............................................................................................. 497

XVI
www.full-ebook.com
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
www.full-ebook.com
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
www.full-ebook.com
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
www.full-ebook.com
ALERTA!

XX
www.full-ebook.com
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).

www.full-ebook.com
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

www.full-ebook.com
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

3
www.full-ebook.com
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

www.full-ebook.com
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.

5
www.full-ebook.com
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
6

www.full-ebook.com
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

7
www.full-ebook.com
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.

www.full-ebook.com
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

9
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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) 01101101110
return 1; 10111101000
else ... 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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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 Programacin del lado del servidor
Los programas residen en el servidor Los programas residen y son ejecutados
pero se ejecutan en el cliente por el servidor

Se descarga de trabajo a los servidores El trabajo recae sobre los servidores


pudiendo llegar a sobrecargarse

La ejecucin del programa requiere una Al cliente solo se les transfiere el


transmisin por la red del cdigo resultado de la ejecucin del programa
necesario para ello

Las respuestas a las acciones de los Una vez enviada al usuario la respuesta
usuarios sobre el programa pueden ser del programa, cualquier peticin
invocadas sin necesidad de realizar adicional del cliente requiere una nueva
transmisiones por la red conexin con el servidor y la ejecucin
en l de un nuevo programa

Para la correcta ejecucin del En los equipos de los clientes no se


programa se requiere que el cliente necesita ningn software especial, todo
tenga instalados programas o plug-ins lo necesario debe estar instalado en el
adecuados servidor

Si en un cliente no est instalado alguno Todos los clientes podrn visualizar


de los programas intrpretes o plug-ins, correctamente la pgina
la pgina no se ejecutar correctamente

Al transferirse el cdigo, el cliente tiene El cdigo fuente permanece en el


acceso a dicho cdigo y puede obtener servidor, se conserva su privacidad y
a partir de l informacin que pueda los clientes no tienen acceso a l
resultar comprometida

Se pueden integrar los programas en La mayora de los servicios de


las pginas alojadas en cualquier alojamiento gratuito de pginas no
servidor web admiten este tipo de programacin

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

17
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
www.full-ebook.com
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

1
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

www.full-ebook.com
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 2003 2004 % Cto Previsin


Diciembre Noviembre 03/04 2005
Hardware 140.129 142.032 1.35 147.351
Software 61.017 63.758 4.5 67.854
Servicios TI 114.938 117.301 2.05 122.272
Telecomunicaciones 292.287 303.507 3.83 316.941
Total 608.371 626.598 2.99 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

2
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.

26

www.full-ebook.com
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
www.full-ebook.com
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.

3
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.

28

www.full-ebook.com
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.

4
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
www.full-ebook.com
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.
5
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.

30

www.full-ebook.com
OPEN SOURCE Y SOFTWARE LIBRE

1984 Richard Stallman crea el proyecto GNU.


1985 Los componentes del proyecto GNU crean la FSF (free software
Foundation).
1991 Linux Trovalds desarrolla el Kernel Linux.
1991 Primer sistema operativo libre Linux, combinacin de
GNU/LINUX.
1993 Ian Murdock crea el proyecto Debian.
1997 Debian establece el Contrato social Debian con la comunidad
del Software libre.
1998 Un grupo de la comunidad Software Libre crea la OSI (open
source Initiative).
1998 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
www.full-ebook.com
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

www.full-ebook.com
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.

7
Congreso que pese al ttulo open source cont con la presencia de prestigiosos
representantes de ambas corrientes, free software y open source.

33
www.full-ebook.com
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

www.full-ebook.com
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 usuarios-
desarrolladores, 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:
Licencias propietarias.
Licencias libres.
Licencias semilibres.

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

35
www.full-ebook.com
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

www.full-ebook.com
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.

9
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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 Abierto Direccin


MSN Messenger AMSN http://amsn.sourceforge.net/
MSN Netmeeting GnomeMeeting www.gnomemeeting.org
WinAmp XmmS www.xmms.org
Winzip Gzip, zip www.gnu.org/software/gzip/gzip.html
Windows Media Player Mplayer, Xine www.mplayerhg.hu
Photoshop Gimp www.gimp.org
Acrobat Reader Gpdf www.purl.org/net/gpdf
ACDSEE GThumb 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

www.full-ebook.com
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 Nmero Porcentaje


Apache 38.028.642 69,73%
Microsoft-IIS 11.923.178 21,86%
Netscape-Enterprise 1.743.421 3,20%
Zeus 739.006 1,36%
Rapidsite 369.532 0,68%
Tigershark 246.962 0,45%
Thttpd 221.446 0,41%
OTROS 1.266.961 2,32%
TOTAL 54.539.148 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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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 Proyectos Usuarios


registrados
SourceForge 90.625 952.696
Savannah 2.176 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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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.

18
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.

51
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
www.full-ebook.com
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

www.full-ebook.com
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

www.full-ebook.com
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.

Toda pgina web debe ser guardada en un documento de texto con la


NOTA 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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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 (www.allaire.com)
1stPage2000 (www.evrsoft.com)

61
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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 Carcter Cd. HTML


< &lt; > &gt;
& &amp; " &quot;
&iquest; i &iexcl;
&Aacute; &aacute;
&Eacute; &eacute;
&Iacute; &iacute;
&Oacute; &oacute;
&Uacute; &uacute;
&Auml; &auml;
&Ntilde; &ntilde;

Tabla 3.1 Caracteres especiales en HTML

67
www.full-ebook.com
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 Qes 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


<H1>Cabecera tipo 1</H1> con un tamao de letra de 24 puntos
<H2>Cabecera tipo 2</H2> con un tamao de letra de 18 puntos
<H3>Cabecera tipo 3</H3> con un tamao de letra de 14 puntos
<H4>Cabecera tipo 4</H4> con un tamao de letra de 12 puntos
<H5>Cabecera tipo 5</H5> con un tamao de letra de 10 puntos
<H6>Cabecera tipo 6</H6> con un tamao de letra de 8 puntos
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

www.full-ebook.com
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 Visualizacin


<B>..................</B> Texto en negrita
<I>........... ......</I> Texto en itlica
<U>..................</U> Texto subrayado
<SUP> .............</SUP> Texto como superndice
<SUB>..............</SUB> Texto como subndice
<S>..................</S> Texto tachado
<BLINK> ..........</BLINK> 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
www.full-ebook.com
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

www.full-ebook.com
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 nmeros (valor por defecto).


i nmeros romanos en minscula.
I nmeros romanos en mayscula.
a letras en minscula.
A 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
www.full-ebook.com
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

www.full-ebook.com
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:

circle Crculos huecos


disc Crculos rellenos
square Cuadrados rellenos

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>

73
www.full-ebook.com
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

www.full-ebook.com
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>

Aunque no es estrictamente necesario, y no tiene ningn efecto sobre la


visualizacin de la pgina, s que es recomendable tratar de escribir el
NOTA
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
www.full-ebook.com
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

www.full-ebook.com
CREACIN DE PGINAS WEB MEDIANTE EL LENGUAJE HTML

o 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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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 Cdigo Color Cdigo


Blanco #FFFFFF Negro #000000
Azul #0000FF Verde #00FF00
Ciano #00FFFF Verde mar #238E6B
Azul cielo #3299CC Verde oscuro #2F4F2F
Violeta #4F2F4F Verde lima #32CC32
Gris #C0C0C0 Salmn #6F4242
Turquesa #7093DB Marrn #A52A2A
Rosa #BC8F8F Naranja #CC3232
Oro #CC7F32 Rojo #FF0000
Magenta #FF00FF Amarillo #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
www.full-ebook.com
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 : permite dar un color al fondo de la pgina.


TEXT : permite indicar el color del texto.
LINK : permite designar el color de los enlaces an no visitados.
VLINK : 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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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 Un nmero que represente la anchura en pxeles de la
columna.
o Un porcentaje que la columna ocupar sobre el total del
espacio libre.
o 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

www.full-ebook.com
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 YES: mostrar siempre barra de desplazamiento.
o No: sin barra de desplazamiento.
o 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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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 Tipo de campo


text Campo de texto.
password Campo especial para introducir contraseas.
radio Botn de radio.
checkbox Cajas de seleccin.
submit Botn de envo de la informacin.
reset Botn de borrado de la informacin.
button Botn de accin.
hidden 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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Figura 3.7 rea de clientes de Cinem@s

96

www.full-ebook.com
CREACIN DE PGINAS WEB MEDIANTE EL LENGUAJE HTML

Figura 3.8 Formulario para el envo de mensajes al foro

97
www.full-ebook.com
www.full-ebook.com
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

www.full-ebook.com
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

www.full-ebook.com
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 de


2004. Hoy en da se estima que PHP es usado por cientos de miles de
programadores y que est presente en ms del 20% de los servidores web en
Internet. Es el sexto lenguaje de programacin ms utilizado en el desarrollo de
software23, nicamente por detrs de C, Java, C++, Visual Basic y Perl.

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

101
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
NOTA programas en PHP 3, .php4 para los programas en PHP 4, o incluso
la extensin .phtml, actualmente en desuso.

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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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
.........................
.........................
.........................
?>

<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:

<?
.........................
.........................
.........................
?>
o

108

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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 = "10 euros";
$b = 2.25;
$c = $a - $b; // conversin implcita a tipo float
$d = (integer)$c; // conversin explcita a tipo integer
$e = $d / 2; // conversin implcita a tipo float
echo $e; // conversin implcita a tipo cadena
// finalmente, se escribe 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

www.full-ebook.com
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;
...........
?> En este caso el documento incluye dos
scripts, en el primero se definen dos
...........
variables que, al ser globales, pueden ser
<?PHP utilizadas posteriormente en un segundo
........... script.
$asiento =
"F$fila.$num";
...........
?>

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
www.full-ebook.com
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; // asignacin equivalente a
$x=150

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(): devuelve el tipo de la variable.


is_array(): determina si la variable contiene un array.
is_float(): determina si la variable contiene un nmero en coma flotante.
is_int(): determina si la variable contiene un nmero entero.
is_object(): determina si la variable hace referencia a un objeto.
is_string(): 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

www.full-ebook.com
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
www.full-ebook.com
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 Significado


\n Nueva lnea
\r Retorno de carro
\t Tabulador
\\ Barra invertida
\' Comillas simples
\" Comillas dobles
\xNum Carcter cuyo cdigo ASCII en hexadecimal es Num
\Num Carcter cuyo cdigo ASCII en octal es Num
Tabla 4.1 Secuencias de escape

120

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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 = 12 + "23"; // $x tendr el valor 35


$x = 1 + "0.5"; // $x tendr el valor 1.5
$x = 4000 + "-1.5e+3"; // $x tendr el valor 2500
$x = 4 + "5 dias"; // $x tendr el valor 9
$x = "2 horas" + "10 min"; // $x tendr el valor 12
$x = 2.5 "1.2Kg"; // $x tendr el valor 1.3
$x = 4 + "Tarde"; // $x tendr el valor 4
$x = 2 * "5 Eur"; // $x tendr el valor 10
$x = 2 * "Eur 5"; // $x tendr el valor 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
www.full-ebook.com
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 + $y Suma de dos nmeros
$x - $y Diferencia de dos nmeros
$x * $y Producto de dos nmeros
$x / $y Divisin de dos nmeros
$x % $y 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 Incrementa una unidad el valor de $x


$x++ Incrementa una unidad el valor de $x,
pero despus de evaluar el resto de la
expresin
--$x Decrementa una unidad el valor de $x
$x-- Decrementa una unidad el valor de $x,
pero despus de evaluar el resto de la
expresin
Tabla 4.3 Operadores de incremento y decremento

124

www.full-ebook.com
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:

En este caso la variable $n tomar el valor 5 mientras


$n = 5; que $m tendr el valor 6, ya que el operador de
$m = ++$n; 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 = 4; $z, $v y $w, respectivamente. En este caso, en la
$v = 2*$z--; segunda sentencia se utiliza el operador de decremento
$w = $z; despus de la variable, por lo que el decremento se
produce despus de realizar la asignacin.

$a = 10; Tras ejecutar estas tres sentencias la variable $a


$b = 2*--$a; tendra el valor 10, la variable $b valdra 17 y $c
$c = ++$a-$b--; valdra 8.

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
www.full-ebook.com
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 Asignacin equivalente


$x += 5; $x = $x + 5;
$y *= 2; $y = $y * 2;
$z %= 3; $z = $z % 3;
$c .= "fin"; $c = $c . "fin";
Tabla 4.4 Ejemplos de asignaciones combinadas

126

www.full-ebook.com
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 Se ponen en 1 los bits que en $x y en $y estn


en 1 (Y)
$x | $y Se ponen en 1 los bits que en $x o en $y estn
en 1 (O)
$x ^ $y Se ponen en 1 los bits que en $x o en $y estn
en 1 pero no en ambos (O exclusivo)
~$x En la representacin binaria de $x cambia los
1 por 0 y viceversa (negacin)
$x << $n Los bits de $x se desplazan $n posiciones a la
izquierda
$x >> $n 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 1 1 0 1 0 1 1 0
$y = 178 1 0 1 1 0 0 1 0

Con estos datos, los resultados de algunas de las operaciones de bit anteriores
seran:

$x & $y 1 0 0 1 0 0 1 0 Resultado: 146


$x | $y 1 1 1 1 0 1 1 0 Resultado: 246
$x ^ $y 0 1 1 0 0 1 0 0 Resultado: 100
$x >> 2 0 0 1 1 0 1 0 1 Resultado: 53

127
www.full-ebook.com
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 Compara si $x e $y tienen el mismo valor


(operador de igualdad)
$x === $y Compara si $x e $y son iguales y adems son
del mimo tipo (operador de identidad)
$x != $y Comprueba si $x e $y tienen distinto valor
(negacin de igualdad)
$x !== $y Comprueba si $x e $y tienen distinto valor y/o
tipo (negacin de identidad)
$x < $y Comprueba si el valor de $x es menor que el
valor de $y
$x > $y Comprueba si el valor de $x es mayor que el
valor de $y
$x <= $y Comprueba si el valor de $x es menor o igual
que el valor de $y
$x >= $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

www.full-ebook.com
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
www.full-ebook.com
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 Devuelve un valor cierto cuando tanto $x


$x && $y como $y tienen el valor cierto (operacin Y)
$x or $y Devuelve un valor cierto cuando $x o $y
$x || $y tienen el valor cierto (operacin O)
$x xor $y Devuelve un valor cierto cuando $x o $y
tienen un valor cierto pero no ambos a la vez
(operacin O exclusivo)
!$x Devuelve un valor cierto cuando $x tiene un
valor falso (operacin de negacin)
Tabla 4.7 Operadores lgicos

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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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 18:23 .
11/03/2004 18:23 ..
21/11/2003 19:53 64 Comentarios.txt
21/11/2003 18:07 361 cookie.php
14/11/2003 10:23 315 index.php
21/02/2004 23:24 478 ordenar.php
21/11/2003 19:53 267 prueba.htm
11/03/2004 18:23 205 prueba.php
11/03/2004 18:23 0 ~out.htm
11/03/2004 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
www.full-ebook.com
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. Se realiza la divisin 5/2, obtenindose 2.5


2. Se realiza el producto 3*4, obtenindose 12
3. Se realiza la suma de los dos resultados anteriores, obtenindose 14.5
4. 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 tendra el valor 4


$x = 5/(2+3*4); // $x tendra el valor 0.35714
$x = 5/((2+3)*4); // $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

www.full-ebook.com
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
www.full-ebook.com
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;

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.
NOTA 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

www.full-ebook.com
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

www.full-ebook.com
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 un nombre


(miformulario) al igual que cada uno de sus controles:

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

www.full-ebook.com
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
www.full-ebook.com
PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

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
NOTA 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

www.full-ebook.com
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
www.full-ebook.com
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'] $_GET['edad']
$_REQUEST['estudiante'] $_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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
www.full-ebook.com
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

www.full-ebook.com
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
NOTA condicin. Debe advertirse sin embargo que esto nicamente tiene un
efecto "esttico" en el programa y no influye en la ejecucin del mismo.

158

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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
NOTA realizar sencillas asignaciones en las que el valor asignado dependa del
resultado de una condicin.

164

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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 noches, ");
elseif ($hora<12)
print("Buenos das, ");
elseif ($hora<20)
print("Buenas tardes, ");
else
print("Buenas noches, ");
print("bienvenido 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
NOTA con la funcin date() seran las del servidor, que no necesariamente
coinciden con la fecha y hora del cliente que acceda a la pgina.

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
www.full-ebook.com
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;

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
NOTA 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

www.full-ebook.com
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
www.full-ebook.com
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 = 4;
break;
case 'M':
$precio = 3;
break;
case 'X':
$precio = 4.5;
break;
case 'J':
$precio = 4.5;
break;
case 'V':
$precio = 5;

170

www.full-ebook.com
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
NOTA 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.

171
www.full-ebook.com
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 = 4;
case 'M':
$precio = 3;
case 'X':
$precio = 4.5;
case 'J':
$precio = 4.5;
case 'V':
$precio = 5;
case 'S':
$precio = 5;
case 'D':
$precio = 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 = 4; break;
case 'M':
$precio = 3; break;
case 'X':
$precio = 4.5; break;
case 'J':
$precio = 4.5; break;

172

www.full-ebook.com
SENTENCIAS DE CONTROL

case 'V':
$precio = 5; break;
case 'S':
$precio = 5; break;
case 'D':
$precio = 4.5; break;
default:
$precio = 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 = 4;
break;
case 'M':
$precio = 3;
break;
case 'X':
case 'J':
case 'D':
$precio = 4.5;
break;
case 'V':
case 'S':
$precio = 5;
break;
default:
$precio = 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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

n / 2 si n es par
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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

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
NOTA 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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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,6) (2,7) (2,8)
(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,5) (4,6) (4,7)
(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,3) (6,4) (6,5)
(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,2) (8,3) (8,4)
(8,5) (8,6) (8,7) (8,9) (9,1) (9,2) (9,3) (9,4) (9,5) (9,6) (9,7) (9,8)

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

www.full-ebook.com
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

www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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] => 3
[1] => 4
[2] => 5
[3] => 6
[4] => 7
[5] => 8
[6] => 9
[7] => 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

www.full-ebook.com
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
www.full-ebook.com
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
NOTA 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).

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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Ejemplo 7.10:
Dadas las sentencias de asignacin siguientes:

$a = "Hola!";
$b = $a;
$a = "Adis!";
echo "$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 = "Hola!";
$b = &$a;
$a = "Adis!";
echo "$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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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"; // variable de mbito global

function g()
{
print $director; // referencia a una variable local
}

g(); // 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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
www.full-ebook.com
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

www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

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
NOTA
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] = 5;
$M[0][1] = 3;
$M[1][0] = -2;
$M[1][1] = 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

www.full-ebook.com
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. 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)
);

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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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 Array generado


range(3,15) (3,4,5,6,7,8,9,10,11,12,13,14,15)
range(15,3) (15,14,13,12,11,10,9,8,7,6,5,4,3)
range(3,10,2) (3,5,7,9)
range('b','k') ('b','c','d','e','f','g','h','i','j','k')
range('k','b') ('k','j','i','h','g','f','e','d','c','b')
range('casa','gato') ('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

www.full-ebook.com
ARRAYS

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

Sentencia Array generado


$a = array(1,2,3,4,5,6)
array_slice($a,3) (4,5,6)
array_slice($a,-2) (5,6)
array_slice($a,3,2) (4,5)
array_slice($a,-2,1) (5)
array_slice($a,1,-2) (2,3,4)
array_slice($a,-4,-2) (3,4)
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Figura 8.4 Pgina con la tabla de pelculas disponibles

248

www.full-ebook.com
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

www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
FUNCIONES PREDEFINIDAS

argumento reemplazar. Se deben tener en cuenta las siguientes


consideraciones:

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
www.full-ebook.com
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

www.full-ebook.com
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 el nmero de


apariciones de un fragmento dado dentro de una cadena.

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
www.full-ebook.com
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 Valor devuelto


strchr($cadena,'e'); envenido a nuestros cines!
strrchr($cadena,'e'); es!
stristr($cadena,"nuestros"); nuestros cines!
stristr($cadena,'e'); envenido a nuestros cines!
strpos($cadena,"e"); 3
strpos($cadena,"e",14); 16
strpos($cadena,"nuestros"); 14
Tabla 9.1 Ejemplos de usos de funciones de bsqueda en cadenas

Llamada a la funcin Valor devuelto


substr($cadena,27); Ha efectuado usted la decisin correcta.
substr($cadena,-27); usted la decisin correcta.
substr($cadena,27,5); Ha ef
substr($cadena,27,-5); Ha efectuado usted la decisin corr
substr($cadena,-45,10); ine. Ha ef
substr($cadena,-45,-5); 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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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 Descripcin
abs(n) Obtiene el valor absoluto de un entero o en coma flotante.
round(n) Redondea a entero un nmero dado.
ceil(n) Obtiene el valor entero superior ms prximo a n.
floor(n) Obtiene el valor entero inferior ms prximo a n.
cos(n) Calcula el coseno de un ngulo.
sin(n) Calcula el seno de un ngulo
tan(n) Calcula la tangente de un ngulo.
exp(a) Calcula el valor ea.
log(n) Calcula el logaritmo neperiano de n.
min(n1,n2,...) Obtiene el menor valor de un nmero determinado de
min(array) argumentos numricos o de los elementos de un array.
Si alguno de estos nmeros es decimal, el resultado
tambin tendr este formato.
max(n1,n2,) Obtiene el mayor valor de un nmero determinado de
max(array) argumentos numricos o de los elementos de un array.
Si alguno de estos nmeros es decimal, el resultado
tambin tendr este formato.
pow(a,b) Se calcula el valor de la potencia ab.
rand(mn,mx) Si no toman argumentos, estas funciones devuelven
mt_rand(mn,mx) 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().
sqrt(a) Raz cuadrada de a.

Tabla 9.3 Funciones matemticas

267
www.full-ebook.com
PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Constantes numricas Descripcin


M_PI nmero Pi (3.14159).
M_E nmero e (2.718281).
M_PI_2 pi/2.
M_SQRT2 raz cuadrada de 2.
M_SQRT3 raz cuadrada de 3.
Tabla 9.4 Constantes predefinidas

268

www.full-ebook.com
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

www.full-ebook.com
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

www.full-ebook.com
PROGRAMACIN ORIENTADA A OBJETOS

PELCULA

VARIABLES: MTODO:
Ttulo Generar ficha
Director
Actores
Ao

Figura 10.1 Estructura de un objeto Pelcula

PROYECCIN

VARIABLES: MTODO:
Da Asignar pelcula
Hora
Pelcula

Figura 10.2 Estructura de un objeto Proyeccin

CLIENTE

VARIABLES: MTODO:
Nombre Adquirir entrada
Edad
Lista proyecciones

Figura 10.3 Estructura de un objeto Cliente

271
www.full-ebook.com
PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

CINE

VARIABLES: MTODOS:
Da del espectador Buscar cliente
Tarifa normal Calcular importe
Tarifa reducida Crear proyeccin
Proyecciones Crear cliente
Clientes

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

www.full-ebook.com
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
www.full-ebook.com
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.
NOTA
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,...

274

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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";

// 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
$c = 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

www.full-ebook.com
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
www.full-ebook.com
PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

PELCULA

POLICIACA COMEDIA MUSICAL

Figura 10.5 Subclases de la clase pelcula

CLIENTE

VARIABLES: MTODO:
Nombre Adquirir entrada
Edad
Lista proyecciones

SOCIO

VARIABLES PROPIAS: MTODOS PROPIOS:


Nmero de socio Adquirir entrada (*)
Puntos acumulados 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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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

www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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

www.full-ebook.com
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

www.full-ebook.com
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' Solo lectura. Puntero al inicio.


'r+' Lectura/escritura. Puntero al inicio.
'w' Solo escritura. Crea el fichero si no existe. Borra el contenido previo
del fichero.
'w+' Lectura/escritura. Crea el fichero si no existe Borra el contenido
previo.
'a' Solo escritura. Aade nuevos datos al final del fichero. Lo crea si no
existe.
'a+' 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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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 Nmero entero en binario


%c Carcter
%d Nmero entero en base 10
%u Nmero entero sin signo
%f Nmero decimal
%o Nmero entero en octal (base 8)
%s Cadena de caracteres
%x o %X 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 18 76.4


Ana Antn Boo 21 50.2
Pedro Marcos Dez 24 82.5
Maria Martn Grau 33 12.7
Mnica Abad Garca 43 45.8
Jess Bernal Cos 22 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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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 temporal generado en el servidor


$fichero_name nombre original del fichero
$fichero_size tamao del fichero
$fichero_type 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

www.full-ebook.com
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

www.full-ebook.com
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 DNI N cuenta Cuentas N cuenta Saldo


Luis Lpez 73456123 1001 1001 12.523
Ana Snchez 56712765 1002 1002 5.650
Antonio Briz 22871274 1002 1003 24.758
Antonio Briz 22871274 1003 1004 2.651
Sara Salas 12567234 1004

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

www.full-ebook.com
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
www.full-ebook.com
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
NOTA 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.

312

www.full-ebook.com
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
www.full-ebook.com
PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

ENTIDAD PELCULAS
Nombre de atributo Tipo de datos Descripcin
IDPELICULA Valor numrico que actuar de
Nmero entero
identificador de cada pelcula
TITULO Cadena de caracteres Ttulo de la pelcula
ACTORES Listado de actores de la pelcula que se
Cadena de caracteres
presentarn separados por comas
PRODUCCION Productor, o productores, en su caso, de
Cadena de caracteres
la pelcula
DIRECCION Cadena de caracteres Director o directores de la pelcula
GUION Cadena de caracteres Guionista o guionistas de la pelcula
ANNO Nmero entero Ao de realizacin de la pelcula
DURACION Nmero entero Duracin de la pelcula en minutos
NACIONALIDAD Cadena de caracteres Nacionalidad de la pelcula
Gnero de la pelcula elegido entre una
GENERO Cadena de caracteres serie de opciones predeterminadas:
drama, comedia, accin....
Opcin que establece restricciones de
EDAD_RESTRICCION Cadena de caracteres edad para los espectadores: apta, mayores
de 7, mayores de 13, mayores de 18
SINOPSIS Cadena de caracteres Breve resumen de la pelcula
CARTELERA Imagen del cartel promocional de la
Imagen
pelcula
Tabla 13.1 Atributos de la entidad Pelculas

ENTIDAD PROYECCIONES
Nombre de atributo Tipo de datos Descripcin
IDPROY Valor numrico que actuar de
Nmero entero
identificador de cada proyeccin
IDPELICULA Valor numrico que identifica la
Nmero entero
pelcula que se proyectar
NUM_SALA Nmero de la sala en donde se
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,...
ESTRENO Indica si la proyeccin es emitida como
Lgico(verdadero/falso)
estreno o no
Tabla 13.2 Atributos de la entidad Proyecciones

314

www.full-ebook.com
BASES DE DATOS RELACIONALES Y EL LENGUAJE SQL

ENTIDAD SALAS
Nombre de atributo Tipo de datos Descripcin
NUM_SALA Valor numrico identificativo de cada
Nmero entero
sala
AFORO Nmero entero Nmero total de asientos de la sala.
NUM_FILAS Nmero entero Nmero total de filas de la sala
Cadena de caracteres que permitir
OBSERVACIONES Cadena de caracteres almacenar cualquier tipo de observacin
sobre la sala
Tabla 13.3 Atributos de la entidad Salas
ENTIDAD ENTRADAS
Nombre de atributo Tipo de datos Descripcin
NUM_ENTRADA Valor numrico que actuar de
Nmero entero
identificador de cada entrada
IDPROY Valor numrico que identifica la
Nmero entero
proyeccin correspondiente
FILA Nmero entero Nmero de fila de la entrada
NUM_ASIENTO Nmero entero Nmero de asiento de la entrada
NUM_CLIENTE Valor numrico que identifica al cliente
Nmero entero
que compra la entrada

RECOGIDA Indica si la entrada ha sido recogida o


Lgico(verdadero/falso)
no por el cliente

Tabla 13.4 Atributos de la entidad Entradas


ENTIDAD CLIENTES
Nombre de atributo Tipo de datos Descripcin

NUM_CLIENTE Valor de tipo numrico que actuar de


Nmero entero
identificacin del cliente.
NOMBRE Cadena de caracteres Nombre del cliente
DIRECCION Cadena de caracteres Direccin postal del cliente
FECHANAC Fecha Indica la fecha de nacimiento del cliente
TELEF Cadena de caracteres Telfono del cliente.
EMAIL Cadena de caracteres Direccin de e-mail del cliente
Valor numrico que almacenar el
PUNTOS_ACUM nmero total de puntos que va
Nmero entero
acumulando el espectador por la compra
de entradas
Indica una clave secreta que el cliente
CLAVE Cadena de caracteres tendr que utilizar para realizar cualquier
operacin de compra de entradas
Tabla 13.5 Atributos de la entidad Clientes

315
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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;

El lenguaje SQL no distingue el uso de maysculas y minsculas. En este


NOTA
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 es el identificador utilizado para referirse a la tabla.


atribX es el nombre de un atributo de la tabla.
dominioX 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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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 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));

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));

Para mejorar la legibilidad, las sentencias SQL pueden partirse en


NOTA
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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.

La forma en la que se trabaja con claves ajenas en MySQL es un tanto


NOTA
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

www.full-ebook.com
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
www.full-ebook.com
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'.

En SQL las cadenas de caracteres deben darse entre comillas simples.


Las fechas y horas tambin son dadas entre comillas y en principio se
NOTA 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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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
NOTA 1). El valor 1 puede identificarse con el valor lgico "verdadero" y el
valor 0 con "falso".

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

www.full-ebook.com
BASES DE DATOS RELACIONALES Y EL LENGUAJE SQL

o ALL (opcin por defecto): indica que en el resultado de la consulta


deben mostrarse todas las filas, incluyendo las repetidas.
o 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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

ASC Indica orden ascendente.


DESC 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

www.full-ebook.com
BASES DE DATOS RELACIONALES Y EL LENGUAJE SQL

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
NOTA 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() Calcula la suma total de los valores de una columna.


AVG() Calcula el valor promedio de una columna.
MIN() Encuentra el valor ms pequeo de una columna.
MAX() Encuentra el valor ms grande de una columna.
COUNT() 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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
www.full-ebook.com
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

www.full-ebook.com
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

www.full-ebook.com
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
NOTA
Administrativas, en concreto, el apartado de servicios.

341
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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 Tipo Atributos Nulo Def.


Host varchar(60) BINARY No
User varchar(16) BINARY No
password varchar(16) No
Select_priv enum('N', 'Y') No N
Insert_priv enum('N', 'Y') No N
Update_priv enum('N', 'Y') No N
Delete_priv enum('N', 'Y') No N
Create_priv enum('N', 'Y') No N
Drop_priv enum('N', 'Y') No N
Reload_priv enum('N', 'Y') No N
Shutdown_priv enum('N', 'Y') No N
Process_priv enum('N', 'Y') No N
File_priv enum('N', 'Y') No N
Grant_priv enum('N', 'Y') No N
References_priv enum('N', 'Y') No N
Index_priv enum('N', 'Y') No N
Alter_priv enum('N', 'Y') No N
Show_db_priv enum('N', 'Y') No N
Super_priv enum('N', 'Y') No N
Create_tmp_table_priv enum('N', 'Y') No N
Lock_tables_priv enum('N', 'Y') No N
Execute_priv enum('N', 'Y') No N
Repl_slave_priv enum('N', 'Y') No N
Repl_client_priv enum('N', 'Y') No N
ssl_type enum('','ANY','X509', No
'SPECIFIED')
ssl_cipher blob BINARY No
x509_issuer blob BINARY No
x509_subject blob BINARY No
max_questions int(11) No 0
max_updates int(11) UNSIGNED No 0
max_connections int(11) UNSIGNED No 0

Tabla 14.1 Campos de la tabla user

348

www.full-ebook.com
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
www.full-ebook.com
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.18-
nt

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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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.18-
nt

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
www.full-ebook.com
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.18-
nt

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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
EL SISTEMA GESTOR DE BASES DE DATOS MYSQL

Tipos Enteros
Nombre Rango Almacenamiento Descripcin
TINYINT -128 a 127 1 byte Entero pequeo
BIT 0o1 1 bit Entero 0 o 1
BOOL 0o1 1 bit Entero 0 o 1
SMALLINT -32768 a 32767 2 bytes Entero pequeo
MEDIUMINT -8388608 a 8388607 3 bytes Entero mediano
INT -2147483648 a 2147483647 4 bytes Entero normal
INTEGER -2147483648 a 2147483647 4 bytes Sinnimo de INT

BIGINT -9223372036854775808 a
8 bytes Entero grande
9223372036854775807
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
www.full-ebook.com
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 Rango Almacenamiento Descripcin

FLOAT 1.175494351E-38 a Coma flotante de precisin


4 bytes
3.402823466E+38 nica.

DOUBLE 1.797693134862315E+308 Coma flotante de precisin


8 bytes
a 2.2507385850720E-308 nica.

PRECISION
REAL Sinnimos de double

DECIMAL Nmero de coma flotante


NUMERIC Un byte para cada
almacenado como cadena de
DEC dgito del nmero
caracteres

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

www.full-ebook.com
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
www.full-ebook.com
PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

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,
NOTA 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

www.full-ebook.com
EL SISTEMA GESTOR DE BASES DE DATOS MYSQL

Longitud mxima
Nombre Almacenamiento Descripcin
de caracteres
CHAR 1 1 bytes Un carcter.

CHAR(N) Cadena de longitud fija de N


255 N bytes
caracteres.

VARCHAR(N) Cadena de longitud variable de


255 N+1 bytes
N caracteres.

TINYTEXT Cadenas u objetos binarios de


TINYBLOB 255 L+1 bytes
tamao pequeo

TEXT Cadenas u objetos binarios de


BLOB 65.535 L+2 bytes
tamao normal

MEDIUMTEXT 16.777.215 Cadenas u objetos binarios de


MEDIUMBLOB L+3 bytes
(1,6 MB) tamao mediano

LONGTEXT 4.294.967.295 Cadenas u objetos binarios de


LONGBLOB L+4 bytes
(4,2 GB) tamao grande

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
www.full-ebook.com
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
NOTA como nmeros hace que su tratamiento sea mucho ms rpido y eficaz
que el de las cadenas de caracteres.

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

www.full-ebook.com
EL SISTEMA GESTOR DE BASES DE DATOS MYSQL

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
NOTA
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.

Tamao de
Nombre Rango Descripcin
almacenamiento
1000-01-01 Almacena una fecha con el
DATE 3 bytes
9999-12-31 formato YYYY-MM-DD
3 bytes
-838:59:59 Almacena una hora con el
TIME
838:59:59 formato HH:MM:SS
8 bytes
1000-01-01 00:00:00 Almacena una fecha y una hora
DATETIME con el formato
9999-12-31 23:59:59
YYYY-MM-DD HH:MM:SS

TIMESTAMP Instante de tiempo, combinacin


1970-01-01 00:00:00
TIMESTAMP(M) 4 bytes de fecha y hora segn diferentes
2037-01-01 00:00:00
formatos
Almacena un ao con dos dgitos
YEAR(2) 70-69 (de 1970 a 2069) 1 byte (p.e. 97 corresponde a 1997)

YEAR Almacena un ao con cuatro


YEAR(4) 1901 - 2155 1 byte
dgitos

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
www.full-ebook.com
PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

Tipo especificado Formato


TIMESTAMP AAAAMMDDHHMMSS

TIMESTAMP(14) AAAAMMDDHHMMSS

TIMESTAMP(12) AAMMDDHHMMSS

TIMESTAMP(8) AAAAMMDD

TIMESTAMP(6) AAMMDD

TIMESTAMP(4) AAMM

TIMESTAMP(2) 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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
EL SISTEMA GESTOR DE BASES DE DATOS MYSQL

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)) 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
www.full-ebook.com
PHP Y MYSQL. TECNOLOGAS PARA EL DESARROLLO DE APLICACIONES WEB

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
NOTA 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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

Cuando en una misma definicin de clave fornea se incluyen las dos


opciones: borrado (ON DELETE) y actualizacin (ON UPDATE),
NOTA 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

www.full-ebook.com
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
www.full-ebook.com
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 Luis Lpez Floranes 54, Santander 1970-3-31 942221133 llopez@coldmail.com 0 llp70
2 Mara Anta San Juan 22, Oviedo 1981-11-22 686776612 manta@tumail.com 0 as23b
3 Ana Palacios San Andrs 39, Madrid 1968-5-1 null apm55@tumail.com 0 aaa45b
4 Valeria Vzquez Moro 120, Almera 1990-2-13 645162377 vv90@coldmail.com 0 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.18-
nt

Type 'help;' or '\h' for help. Type '\c' to clear the


buffer.

mysql> USE cinemas;


Database changed

382

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
www.full-ebook.com
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

www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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
www.full-ebook.com
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

www.full-ebook.com
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<