Professional Documents
Culture Documents
III
IV
ÁNGEL COBO
PATRICIA GÓMEZ
DANIEL PÉREZ
ROCÍO ROCHA
PHP y MySQL
Tecnologías para el desarrollo de
aplicaciones web
V
© Ángel Cobo, Patricia Gómez, Daniel Pérez y Rocío Rocha, 2005
«No está permitida la reproducción total o parcial de este libro, ni su
tratamiento informático, ni la transmisión de ninguna forma o por
cualquier medio, ya sea electrónico, mecánico por fotocopia, por registro
u otros métodos, sin el permiso previo y por escrito de los titulares del
Copyright.»
ISBN: 84-7978-706-6
Depósito Legal: M. 27.919-2005
VI
A Valeria
VII
VIII
Índice
IX
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
X
ÍNDICE
XI
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
XII
ÍNDICE
XIII
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
XIV
ÍNDICE
XV
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
XVI
Prefacio
XVII
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
XVIII
PREFACIO
Ángel Cobo
Patricia Gómez
Daniel Pérez
Rocío Rocha
Santander, febrero de 2005
XIX
¡ALERTA!
XX
INTERNET Y LA
PROGRAMACIÓN DE
ORDENADORES
1.1. INTRODUCCIÓN
La aparición a principios de los noventa del servicio web supuso una verdadera
revolución en el campo de la informática y las telecomunicaciones. Con la irrupción de
este nuevo servicio, Internet inició una rápida transición hacia el ámbito empresarial y
supuso un enorme impulso al crecimiento de la red. Lo que había surgido en plena
guerra fría como un proyecto militar y que posteriormente fue dirigiéndose hacia el
ámbito científico y académico, se empezó a convertir en un perfecto “escaparate virtual”
en el que las empresas pudieran ofrecer sus productos y servicios rompiendo barreras
geográficas y de comunicaciones. En la actualidad las empresas no ven únicamente el
servicio web como un mero escaparate o medio publicitario de enorme difusión. Internet,
y en particular el servicio web, abre a las empresas enormes posibilidades. La utilización
de tecnologías web permite agilizar los procesos, mejorar la productividad y aumentar la
eficacia, además de abrir las puertas a nuevas formas de negocio en el mercado global
que facilita Internet (e-business).
1
PHP Y MYSQL. TECNOLOGÍAS 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 públicas tienen también 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 tecnologías que consigan hacer del servicio web un servicio dinámico e
interactivo. En sus orígenes el servicio World Wide Web fue concebido como un
sistema flexible de compartir información multimedia entre equipos heterogéneos a
través de redes informáticas. Para ello fue desarrollado un sistema de generación de
documentos a través de un lenguaje estándar: el lenguaje HTML. Los documentos
generados de esta forma podían incorporar texto y elementos gráficos, pero eran
documentos totalmente estáticos. Posteriormente fueron desarrollándose diferentes
tecnologías que, trabajando en conjunción con el lenguaje HTML, pudieran paliar
estas carencias. Así por ejemplo, Netscape incorporó en la versión 2.0 de su célebre
navegador un intérprete de un nuevo lenguaje que podía ser intercalado entre el
código HTML y que permitía realizar operaciones no disponibles en un lenguaje
puramente descriptivo como es HTML; dicho lenguaje, llamado en sus orígenes
LiveScript, adquirió posteriormente el nombre de JavaScript. Unos años más tarde
la empresa Sun Microsystems lanzó un revolucionario lenguaje de programación,
el lenguaje Java, que permitía incrustar en las páginas web programas con las
prestaciones propias de cualquier lenguaje de programación. Microsoft por su parte
también se unió a esta evolución primero con sus lenguajes de script: VBScript
basado en Visual Basic y JScript, versión Microsoft de JavaScript, y, más
recientemente, con las tecnologías .NET. Igualmente se han venido desarrollando
diferentes extensiones del propio lenguaje HTML con objeto de aumentar su
dinamismo; en este contexto se podría citar el HTML dinámico (DHTML) y el
lenguaje XML.
2
INTERNET Y LA PROGRAMACIÓN 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 difusión.
Las dos herramientas que se analizarán 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 páginas 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 pequeñas
organizaciones o empresas. La utilización conjunta de ambos: PHP y MySQL
permite llegar a desarrollar interesantes aplicaciones web que puedan cubrir las
necesidades de pequeñas empresas que quieran fortalecer su presencia en Internet o
usuarios individuales que quieran generar verdaderas páginas dinámicas. 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 tecnologías sin necesidad de tener grandes
conocimientos sobre su funcionamiento y sintaxis de los lenguajes. En el presente
libro se darán referencias de algunas de estas herramientas de gestión de contenidos
y otras herramientas para la creación de aplicaciones web que han sido
desarrolladas igualmente haciendo uso de las dos tecnologías que se analizarán en
este libro: el lenguaje PHP y el gestor de bases de datos MySQL. El Capítulo 18
presentará algunas de estas herramientas.
1.2. INTERNET
3
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
4
INTERNET Y LA PROGRAMACIÓN DE ORDENADORES
5
PHP Y MYSQL. TECNOLOGÍAS 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 conexión tienen presencia
física en la red. Normalmente los proveedores de acceso a Internet asignan a estos
equipos una dirección IP durante su conexión, pero esa dirección es variable, es
decir, cambia de unas conexiones a otras (IP dinámica).
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 conexión y el cliente
sería el equipo local utilizado para efectuar dicha conexión. Pero también se
utilizan esos conceptos en referencia al software:
— Definición de la página: toda página web tiene detrás un código fuente que la
define. Cuando se accede a una página web, aunque en el monitor se puedan
visualizar documentos con imágenes y texto de diferentes tamaños, colores y
formatos, debe tenerse presente que detrás de eso hay un documento de texto
sin ningún tipo de formato y que incorpora una serie de instrucciones o
comandos que son los que realmente generan la página 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 lógica del documento, dar formato al texto, añadir elementos no
textuales,... Se asume que los lectores interesados en este libro tienen un cierto
conocimiento de este lenguaje de definición de hipertextos, no obstante, se ha
considerado oportuno incluir un capítulo introductorio en el que se presenten
los comandos básicos de HTML (Capítulo 3). Para aquellos lectores sin
conocimientos de HTML, una comprensión rápida de los comandos expuestos
en dicho capítulo es más que suficiente para poder entender el resto del libro.
— Publicación del documento: una vez creado el documento HTML que define la
página web, el siguiente paso es evidentemente publicarla para que esté
disponible para el resto de usuarios de Internet. La publicación implica la
transferencia del documento a un equipo servidor que disponga de un programa
de servidor web. Puede optarse por utilizar algún servidor de alojamiento
gratuito de páginas o utilizar los espacios que los proveedores de acceso a
Internet suelen ofrecer a sus clientes. Otra posibilidad sería configurar un
equipo propio para que actúe de servidor, para ello sería preciso contratar con
algún proveedor una dirección IP fija y registrar el dominio que se quiera
utilizar.
7
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Pero, ¿qué es una página dinámica? Piénsese, por ejemplo, en un multicine que quiere
publicar en Internet la información actualizada sobre horarios y películas que se proyectan
en cada una de sus salas. Evidentemente, sería muy sencillo generar una simple página en
HTML con una tabla en la que se muestre esa información; incluso sin necesidad de tener
ningún tipo de conocimiento sobre HTML, por ejemplo, se podría escribir en Word y usar
la opción de “Guardar como página web...”. Hasta aquí sencillo, pero la información en sí
es un elemento dinámico, las películas que se proyectan en cada sala cambian y por tanto la
página web debería ser actualizada. ¿Tiene sentido tener que modificar el documento
HTML cada vez que se produzca un cambio en la cartelera?, ¿no sería muchísimo más
rentable disponer de un sistema que modifique de forma automática la información que
muestra la página web? Esto es dinamismo, y esto no se puede conseguir solo con HTML.
A lo largo de los diferentes capítulos de este libro el usuario aprenderá cómo resulta
muy sencillo generar una base de datos con MySQL con toda la información de las
películas a proyectar y una página web con un programa PHP que se encargue, cada
vez que un usuario solicita la página, de hacer una consulta a la base de datos para
obtener la cartelera actualizada y generar con ella de forma automática el código
HTML que se envía al usuario. Este mismo ejemplo se irá desarrollando paso a paso en
los próximos capítulos y servirá de hilo conductor del resto del libro.
8
INTERNET Y LA PROGRAMACIÓN DE ORDENADORES
9
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
10
INTERNET Y LA PROGRAMACIÓN DE ORDENADORES
— Programación guiada por eventos: los programas deben ser capaces de dar
respuesta a las diferentes acciones que el usuario efectúa sobre la interfaze del
programa. Por ejemplo, cuando un usuario elige una opción de menú o pulsa
un botón se genera un evento que debe ser detectado, identificado y tratado por
el programa.
11
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
La mayor parte de los programadores optan por utilizar lenguajes cuyo código
resulta más fácil de entender, por cuanto sus reglas sintácticas se asemejan más a la
forma de comunicarse las personas; son lenguajes que están “más cerca” del
programador pero más lejos de la máquina a la que van dirigidos. Estos lenguajes
son los denominados "lenguajes de alto nivel" y a ellos pertenecen los lenguajes de
programación más conocidos.
12
INTERNET Y LA PROGRAMACIÓN DE ORDENADORES
Por poner un símil que sirva para clarificar la diferencia entre ambos tipos de
programas, supóngase que una persona recibe una lista con una serie de tareas a
realizar. Podría optar por utilizar dos estrategias:
Traducción
if(x<0) 01101101110
return 1; 10111101000
else ... 111....
Figura 1.2 Necesidad de un proceso de traducción del código fuente para que el
ordenador pueda entenderlo. Dicha traducción puede realizarse mediante un
proceso de complicación o mediante el uso de un intérprete
13
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Desde un punto de vista práctico los lenguajes compilados resultan más poderosos
pero los interpretados resultan más flexibles. El proceso de compilación genera
códigos ejecutables fuertemente dependientes de la máquina 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 código fuente. Por ejemplo, si se ha
desarrollado un programa en lenguaje C siguiendo el estándar ANSI, ese código
puede ser compilado por un compilador de C en Windows para generar la versión
ejecutable en Windows del programa, y posteriormente repetir la compilación en
Unix con un compilador diferente para obtener la versión Unix. Por supuesto, la
portabilidad del código solo es posible si no se hace uso en el programa de aspectos
particulares de una plataforma concreta.
Otra de las ventajas de los lenguajes interpretados puede ser la mayor facilidad
para su aprendizaje y la simplificación en el proceso de desarrollo de las
aplicaciones. En el caso de los lenguajes interpretados para el desarrollo de
aplicaciones web, no se requiere además ningún tipo de herramienta de desarrollo
como puedan ser compiladores; los intérpretes van integrados en los navegadores
web en un caso y en los servidores web en otro. El código fuente además se
14
INTERNET Y LA PROGRAMACIÓN DE ORDENADORES
incrusta dentro del código HTML con lo que incluso no sería necesario ningún tipo
de editor específico.
— ¿Cuál será el formato del conjunto de ordenes? Se puede optar por generar
programas de forma independiente que se integren en la página después de un
proceso de compilación, tal como ocurre en el caso de Java, o por el contrario
se puede desarrollar la aplicación en base a scripts o guiones que, sin
necesidad de compilación, sean incrustados directamente entre el código
HTML, tal como se hace en PHP, JavaScript o VBScript.
15
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
— Programación del lado del cliente: los programas residen junto a la página web
en el servidor pero son transferidos al cliente para que este los ejecute. Java,
JavaScript, VBScript son lenguajes de programación del lado del cliente.
— Programación del lado del servidor: los programas son ejecutados por el
servidor y lo que se envía al cliente es la respuesta o resultado de dicha
ejecución. Lenguajes como PHP o Perl pertenecen a esta categoría.
Figura 1.3 Diferencia entre la programación del lado del servidor y la del lado del cliente
16
INTERNET Y LA PROGRAMACIÓN DE ORDENADORES
Programación del lado del cliente Programación 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
— Las respuestas a las acciones de los — Una vez enviada al usuario la respuesta
usuarios sobre el programa pueden ser del programa, cualquier petición
invocadas sin necesidad de realizar adicional del cliente requiere una nueva
transmisiones por la red conexión con el servidor y la ejecución
en él de un nuevo programa
Tabla 1.1 Diferencias entre la programación del lado del cliente y del lado del servidor
17
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
JavaScript
JavaScript es un lenguaje interpretado basado en guiones que son integrados
directamente en el código HTML. El código es transferido al cliente para que este
lo interprete al cargar la página. Con JavaScript no pueden crearse programas
independientes.
— Es un lenguaje interpretado.
— No necesita compilación.
— Multiplataforma.
— Lenguaje de alto nivel.
— Admite programación estructurada.
— Basado en objetos.
— Maneja la mayoría de los eventos que se pueden producir sobre la página
web.
— No se necesita ningún kit o entorno de desarrollo.
18
INTERNET Y LA PROGRAMACIÓN DE ORDENADORES
Java
Java es un lenguaje de programación clásico en cuanto a que requieren un proceso
de compilación. El código compilado puede ser integrado en la página web para
que sea ejecutado por el cliente.
El nacimiento formal del lenguaje se sitúa 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 través de Internet (http://www.javasoft.com) e incorpora los elementos básicos
necesarios para el desarrollo de aplicaciones Java.
19
PHP Y MYSQL. TECNOLOGÍAS 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 características son:
VBScript
VBScript es, al igual que JavaScript, un lenguaje basado en guiones que permite
integrar programas directamente en el código HTML. Admite un doble uso, por un
lado como lenguaje del lado del cliente, pero también como lenguaje del lado del
servidor para la generación de páginas ASP.
20
INTERNET Y LA PROGRAMACIÓN DE ORDENADORES
Programación CGI
CGI son las siglas de Common Gateway Interface (Interfaz de Pasarela Común) y
lo que define es un estándar para establecer la comunicación entre un servidor web
y un programa. Esta interfaz define una forma cómoda y simple de ejecutar
programas que se encuentran en la máquina en la que se aloja el servidor, a través
de la definición de una serie de reglas que deben cumplir tanto las aplicaciones
como los servidores para hacer posible la ejecución de los programas.
Al tratarse de una interfaz, no existe ningún tipo de dependencia con el lenguaje de
programación empleado. Para desarrollar programas CGI se puede utilizar
cualquier lenguaje. Los más habituales son: C, C++, Fortran, Perl, Tcl, Visual
Basic, AppleScript. Los lenguajes interpretados como Tcl y Perl, tienen mayor
facilidad de mantenimiento y depuración, presentan ventajas de seguridad, pero
resultan más lentos. Los lenguajes compilados (C, C++,...), por su parte, son
mucho más rápidos. En el caso de CGI la velocidad de ejecución es importante, ya
que habrá que sumar el tiempo de ejecución al tiempo de espera de red y a la
velocidad de transmisión.
Para utilizar la tecnología ASP sobre otros servidores, por ejemplo servidores
Unix, se necesita un software intérprete (Chilisoft, Instant ASP).
21
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Las JSP se diferencian de otras tecnologías 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 máquina virtual Java, lo cual permite que, en principio, se
puedan usar en cualquier tipo de ordenador, siempre que tenga instalado esa
máquina 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 petición, sino que persisten
de una petición a la siguiente, lo que permite realizar operaciones como la
conexión a bases de datos o manejo de sesiones de una manera más eficiente.
Un JSP es una página web con etiquetas especiales y código Java incrustado,
mientras que un servlet es un programa que recibe peticiones y genera a partir de
ellas una página 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 gestión propias de un servidor web. Estos programas suelen llamarse
contenedores de servlets o servlet engines, y, entre otros, podrían citarse como
ejemplos Resin, BEA Weblogic, JRun de Macromedia, Lutris Hendirá, o, quizás el
más popular y conocido: Toncat.
ColdFusion
ColdFusion es una tecnología desarrollada inicialmente por Allarie, que en la
actualidad pertenece a Macromedia. Es una herramienta sencilla de aprender y
bastante potente que funciona sobre la mayoría 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 sitúan
dentro del documento HTML y son ejecutadas por el servidor, de forma que el
cliente solo ve el resultado, no el código.
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. Además de
las etiquetas predefinidas, el programador puede crear nuevas etiquetas e incluso
puede integrar código en otros lenguajes como C, C++ o Java.
22
INTERNET Y LA PROGRAMACIÓN 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 código abierto (open source). Se caracteriza por su potencia,
versatilidad, robustez y modularidad. Al igual que ocurre con tecnologías similares,
los programas son integrados directamente dentro del código HTML. En este libro
se explicará en detalle la sintaxis y el funcionamiento de este lenguaje, de momento
se realiza a continuación una breve comparativa con las otras tecnologías del lado
del servidor descritas previamente.
23
OPEN SOURCE Y
SOFTWARE LIBRE
2.1. INTRODUCCIÓN
El actual entorno mundial está claramente caracterizado por el fenómeno de la
1
globalización , que puede entenderse como un efecto acción reacción que ocurre a gran
velocidad, casi de forma simultánea, por el cual los acontecimientos significativos que
ocurren en una parte del planeta repercuten o hacen reaccionar casi inmediatamente al
resto. Como rasgos característicos de este entorno globalizante podemos destacar, por un
lado, la tendencia a la estandarización económica, social, cultural y, como no, tecnológica,
siguiendo como modelo los patrones del bloque económico más fuerte, Estados Unidos. Y,
por otro, el uso intensivo de las tecnologías de la información y las comunicaciones (TIC).
En este sentido, el constante crecimiento del numero de actividades sociales y
empresariales, que necesitan de las computadoras, y la incorporación y presencia masiva de
dispositivos digitales en cualquier actividad humana han aumentado la cantidad y
1
Las definiciones de globalización son múltiples, aquí interesa más 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
Globalización: oportunidades y desafíos. (Maesso Corral, 2003) y Los limites a la
globalización (Noam Chomsky, 2002).
25
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
complejidad de los sistemas software, haciendo crecer por tanto la inversión y dependencia
de dichos sistemas y en definitiva de sus creadores.
Tabla 2.1 Facturación del mercado de las TIC (en millones de euros) en Europa por
segmentos. Elaboración propia a partir de los datos de noviembre obtenidos en el Centro
de Predicción Económica de la Universidad Autónoma de Madrid (CEPREDE) y el
Observatorio de Tecnologías de la Información Europeo (EITO)
2
Las últimas cifras registradas en agosto del 2004 por el Centro de Predicción Económica
de la Universidad Autónoma de Madrid (CEPERDE) revelan que en el mundo existen más
de 797millones de internautas, lo que supone un incremento del 121% respecto al año 2000,
de los que más de 14 millones de usuarios están en España, aproximadamente el 36 % de la
población del país.
26
OPEN SOURCE Y SOFTWARE LIBRE
A modo de aproximación inicial se puede decir que el término open source hace
referencia a la libre disponibilidad por parte del usuario de un software y de su código
fuente. El código fuente está formado por líneas de instrucciones escritas en un
determinado lenguaje de programación que permiten desarrollar una aplicación o
software y que este ejecute las tareas para las que ha sido creado. Para los que se acercan
al mundo de la informática por primera vez o no dominan aspectos más técnicos
podemos utilizar como símil del código fuente la formula de elaboración de un
medicamento. La importancia de conocer el código fuente no es trivial, pues quien
conozca el código, o fórmula siguiendo con el ejemplo, y disponga de los elementos
técnicos y conocimientos necesarios podrá generar por sí mismo el producto final
software o modificarlo según sus necesidades. Evidentemente, toda organización
empresarial con ánimo de lucro dedicada al desarrollo de aplicaciones guarda y protege
el código fuente de los programas que desarrollan como el mayor de sus tesoros.
Conceptos muy diferentes son los términos free software y Shareware. El primero,
designa un software sin precio de adquisición, gratuito, que el usuario en algunos
casos, y según lo que exprese la licencia del producto, podrá copiar y distribuir,
incluso acceder a su código 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, más bien responde a una estrategia promocional del tipo “periodo
de prueba gratuito” y, en ningún caso permite acceso al código fuente ni durante el
periodo promocional ni después del pago.
27
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
un punto de partida para poder comprender los siguientes epígrafes en los que se
analizará la evolución cronológica de este movimiento, su filosofía y características
y la expansión espectacular que está teniendo en la actualidad.
En este periodo la mayoría del software existente era compartido libremente entre
los usuarios, desarrolladores, con el fin de mejorarlo y avanzar en el desarrollo y
creación de nuevos programas.
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
OPEN SOURCE Y SOFTWARE LIBRE
Ante esta situación solo era cuestión de tiempo que el software libre desapareciera
y se implantara el software comercial o Closed Source (código fuente cerrado), que
supone para el usuario adquirir únicamente el derecho a la utilización 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 Tecnología de Massachusetts (MIT), a
renunciar a su puesto y dar inicio al proyecto GNU, acrónimo del inglés GNU is not Unix,
con el propósito de crear una comunidad para compartir software de forma libre. Libre en
cuanto a la posibilidad de ver su código fuente, modificarlo y poder distribuirlo con o sin
coste, pero siguiendo la distribución 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 Fundación para el Software
Libre, free software Fundation (FSF), organización sin ánimo de lucro creada para
el fomento del software libre que pasa a ocuparse de tareas organizativas y de
distribución de este tipo de software tanto procedente del proyecto GNU como
ajeno. Esta asociación establece la definición de free software, software libre,
indicando que un software para tener esta calificación debe cumplir con cuatro
condiciones, denominadas las cuatro libertades:
4
La intención de hacer el nuevo sistema compatible con Unix fue debida a que “...ese era
el sistema operativo más utilizado y por tanto el ser compatible con dicho sistema
facilitaría el trasvase de usuarios de uno a otro.....”. Stallman, 1999.
29
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Un hecho crucial para toda la corriente es la creación por parte de esta asociación
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 filosofía a seguir por el proyecto Debian y que
servirán de base a la futura definición de open source. Esta definición 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 específicas a dicha asociación, establece la definición de open
source que se rige por los siguientes puntos que a continuación se muestran de
forma resumida:
1. Libre redistribución.
2. Acceso al código fuente.
3. Trabajos derivados.
4. Integridad del código fuente del autor.
5. No discriminación contra personas y grupos.
6. No discriminación contra campos de trabajo.
7. Distribución de licencia.
8. La licencia no debe ser específica a un producto.
9. La licencia no debe restringir otro tipo de software.
10. La licencia debe ser tecnológicamente neutral.
30
OPEN SOURCE Y SOFTWARE LIBRE
Los términos 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
aplicación y de su código fuente, y open source que tiene por expresión homónima
“código fuente abierto”, son dos formas distintas utilizadas para designar no solo
un tipo particular de software y licencia sino un modo de pensar, una filosofía
distinta en lo referido a producción, distribución y venta de software.
31
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Si bien es cierto que estos términos no son exactamente idénticos 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 más 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.
Son numerosos los artículos que circulan por la Red hablando de enfrentamiento
entre las dos corrientes, pero en honor a la verdad y acudiendo a la información que
las propias organizaciones FSF y OSI ofrecen, dicho enfrentamiento no existe, más
bien todo lo contrario, colaboran y participan en distintos proyectos y eventos,
aunque siempre dejando claro que no son organizaciones idénticas.
No se entrará a juzgar cuál de los dos vocablos es el más idóneo 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 término open source puesto que, como se ha
6
Stallman, R; Raymond, E. S; Bruce. P; O'Reilly.T et al.: open sources: Voices from the
open source Revolution. Edited by Chris DiBona, Sam Ockman, Mark Stone. (1999).
32
OPEN SOURCE Y SOFTWARE LIBRE
visto, engloba tanto al software open source como al software libre de la FSF y su
uso es más extendido y reconocido en los foros internacionales. Como ejemplo de
la utilización y reconocimiento del termino open source se pueden citar los
siguientes acontecimientos recientes:
Open source no es solo una definición de un tipo de software sino que representa
todo un movimiento, con una filosofía y formas de trabajar distintas que implican
unas repercusiones tecnológicas, sociales y económicas que requieren de un
análisis detallado que se realizará a continuación.
Open source busca dar la libertad total a los usuarios en la utilización del software,
lo que implica la necesidad de poner a total disposición de estos el código fuente
que en la mayoría de las ocasiones además de ser accesible puede ser copiado,
modificado y redistribuido sin restricciones. Esta filosofía cargada de libertad y
apertura no puede crecer en los tradicionales entornos cerrados y requiere la
búsqueda y definición de nuevos espacios abiertos y colaborativos, que dan lugar a
las denominadas comunidades. Una comunidad es una agrupación de personas que
con independencia de su perfil económico, social, cultural y geográfico presentan
un interés común y de forma voluntaria se incorporan a un grupo, inicialmente
pequeño, que crece en torno a un mismo interés hasta crear una comunidad
organizada. Este fenómeno social de agrupación 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 aparición y uso intensivo de Internet, que actúa como
espacio físico 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 vinculación entre Internet y el open source, pues sin una red libre
del tipo de Internet sería imposible el desarrollo de esta tendencia, y sin esta no se
habrían desarrollado numerosos elementos que contribuyen al mantenimiento y
crecimiento de la Red.
7
Congreso que pese al título “open source” contó con la presencia de prestigiosos
representantes de ambas corrientes, free software y open source.
33
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Por último, open source ha supuesto una apertura del mercado, generando
competencia y reduciendo los efectos negativos de las situaciones próximas al
monopolio, obligando a las empresas a ser más competitivas, lo que se traduce en
ofertar mejores productos a menores precios.
34
OPEN SOURCE Y SOFTWARE LIBRE
2.4. LICENCIAS
La comunidad open source y software libre se basan en la búsqueda de la libertad
duradera y permanente del software, pero en una libertad siempre conforme al
derecho y la jurisprudencia y nunca sustentada en la violación de las normas
legales. Es precisamente la normativa jurídica la que permite y ampara que el
software se mantenga libre frente a intentos de apropiación 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 distribución de
su creación por terceras personas de la manera que él considera más oportuna,
siendo por tanto responsabilidad del autor incluir la licencia que especifique de qué
forma puede ser utilizado un programa.
La cuestión de las licencias es uno de los temas más complejos de cuantos rodean
al open source, y ello es debido tanto a la dificultad propia del ámbito jurídico que
supone redactar una licencia sin ambigüedades 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.
8
Esta recomendación se debe a la mencionada complejidad que entraña el desarrollar una
licencia conforme al derecho.
35
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Artistic license
BSD license
MIT license
36
OPEN SOURCE Y SOFTWARE LIBRE
9
Así queda regulado en el artículo 25.3 de la Ley de Propiedad Intelectual RDL 1/1996 de
12 de abril.
10
La figura legal más próxima en España sería la llamada obra colectiva. regulada en los
artículos 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 cláusula Copyleft la impone el autor del
programa original en uso de sus facultades de copyright.
37
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Las características genéricas de este tipo de licencias con respecto a las licencias de
software propietario son:
No obstante, hay que destacar que es en el ámbito de las licencias donde mejor
queda reflejada la distinción entre las dos corrientes, open source y software libre,
puesto que la OSI admite licencias, como la BSD (Berkeley Systmen Distribution),
que añaden determinadas restricciones a los términos de distribución de originales
y de redistribución de programas derivados, al eliminar la obligatoriedad de
mantener el software como libre suprimiendo la cláusula Copyleft. La licencia BSD
tiene como principal característica permitir que un programa libre pueda ser
modificado obteniéndose de él un programa derivado que se cierra, deja de ser libre
su código fuente, cambiando la licencia.
12
Siguiendo los principios de libre mercado la oferta y la demanda mantendrán un coste
bajo o nulo, puesto que si los vendedores obtienen un margen de beneficios elevado
entrarán nuevos vendedores en el mercado y la competencia hará que los precios
disminuyan
38
OPEN SOURCE Y SOFTWARE LIBRE
Para finalizar este apartado se identificarán las licencias a las que están sujetas las
aplicaciones open source que se van a utilizar y desarrollar en los capítulos
siguientes:
13
La publicación se ha realizado el 12 de marzo del 2004 y puede ser consultada
íntegramente en la siguiente dirección www.mysql.com/products/foss-exception.html
39
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
14
El software de infraestructura, también llamado de base o de sistema, es aquel conjunto
de programas que tienen como misión facilitar el uso del ordenador por parte de los
usuarios. Entre sus funciones están comunicar la computadora con sus periféricos,
asignándolos y administrándolos y actuar como intermediario entre el hardware y el
software de aplicación. Este tipo de software suele dividirse en sistema operativo y
programas de utilidades.
40
OPEN SOURCE Y SOFTWARE LIBRE
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 gestión de memoria y un alto rendimiento en los accesos a disco y
librerías compartidas que reducen el tamaño 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 núcleo 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 núcleo o kernel
Linux más las librerías 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 especialización. A continuación
se recogen las distribuciones más destacadas:
Comerciales
No comerciales
41
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
42
OPEN SOURCE Y SOFTWARE LIBRE
43
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Por último, en lo que se refiere a las aplicaciones multimedia, verdadera revolución del
software, que permiten entre otras cosas ver y escuchar audio y video, tratamiento de
imágenes, etc. también existen aplicaciones abiertas capaces de hacer sombra a los
productos de código cerrado. Como principales ejemplos, en la Tabla 2.4 se recoge
para cada software de código cerrado un posible homólogo open source.
Los últimos proyectos open source que mayor interés 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:
44
OPEN SOURCE Y SOFTWARE LIBRE
De tal forma que cualquier desarrollo web puede llevarse a cabo por completo
mediante la utilización 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 páginas web.
Algunos de los servidores web open source más 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.
Tabla 2.5 Servidores activos en Internet en más de 5.000 sitios (noviembre 2004).
Elaboración propia a partir de datos ofrecidos por la consultora de Información Netcraft
45
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
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
continúan dominando el desarrollo de bases de datos, pero las bases de datos open
source están ganando terreno. El uso de SQL Server y Access había crecido casi un
6%, mientras que el uso de MySQL se había incrementado más del 30% en los seis
meses anteriores a la realización de la encuesta.
Los lenguajes de programación son las herramientas básicas utilizadas por los
desarrolladores para crear aplicaciones web. Dentro del desarrollo web la
comunidad open source parece mostrar sus predilección por el lenguaje PHP.
Aunque no se va a profundizar en este apartado en este lenguaje, por ser objeto de
estudio de los próximos capítulos, sí se puede adelantar que se trata de un lenguaje
interpretado especialmente diseñado para embeber su código en el HTML de las
páginas web y especial facilidad para interactuar con bases de datos.
46
OPEN SOURCE Y SOFTWARE LIBRE
47
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
— Sourceforge (http://sourceforge.net/)
— Savannah (http://savannah.gnu.org/)
Tabla 2.6 Proyectos activos y usuarios registrados de dos de las comunidades open
source más importantes a fecha de noviembre de 2004. Fuente: Web de las propias
comunidades
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 tecnológicas del mundo, la República Popular China, ha establecido
disposiciones legales a favor del uso de software open source para los servidores
públicos, o Taiwán dónde las previsiones son ahorrar 300 millones de dólares en
pago de licencias a Microsoft, gracias a un programa de desarrollo y adopción de
software open source en toda la administración estatal. Hasta el gobierno de
Estados Unidos, que si bien no ha legislado a favor del software open source sí lo
48
OPEN SOURCE Y SOFTWARE LIBRE
utiliza, ejemplo claro es el sitio web de la Casa Blanca16 soportado con sistema
operativo Linux y servidor web Apache. Y latinoamérica, con países 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 administración pública.
En Europa las iniciativas no se han quedado atrás a la hora de apostar por el open
source, ejemplos claros son la administración alemana que en junio del 2002
anunció la migración de sus sistemas a Linux, o Noruega país que decidió no
renovar las licencias de Microsoft e invertir en favor del software libre.
16
Información tomada de Netcraft, empresa britanica de servicios de Internet reconocida
internacionalmente por sus estudios sobre la Red.
17
La única iniciativa con carácter estatal ha sido una Proposición de Ley para promocionar
el uso del software libre en la Administración del estado en general y en las
administraciones autonómicas en particular, presentada por el Grupo Mixto y debatida en el
Congreso de los Diputados el 24-09-2002, sesión plenaria número 181, donde fue
rechazada.
49
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
— Toyota Motor Sales Usa, eligió Linux como sistema operativo de su red de
1.200 servidores.
— Amazon, basa sus sistemas en la utilización de servidores Apache sobre
Linux.
Media y comunicación:
Financiero:
50
OPEN SOURCE Y SOFTWARE LIBRE
2.6.1. VENTAJAS
Se enumeran a continuación algunas de las ventajas que proporciona el software
open source, destacando que, si bien las económicas18 son las más visibles, hay
otras ventajas importantes:
18
Beneficios que no solo se deben cuantificar como diferencia entre, el pago actual por las
licencias de software y el que se pagaría, 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 más
rápido ha evolucionado en la historia de la ingeniería de software.
51
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
2.6.2. INCONVENIENTES
Por supuesto no todo son ventajas, la utilización de este tipo de software puede
tener sus inconvenientes:
52
OPEN SOURCE Y SOFTWARE LIBRE
Por último, las voces más optimistas predicen en artículos y comentarios la rápida
desaparición de las compañías de software cerrado. Desde aquí, manifestar que
aunque la situación actual parece indicar que se producirá un importante cambio en
el ámbito del software, estas compañías no tienen porqué desaparecer, aunque sí
posiblemente reorientar su núcleo de actividad de la producción de software hacia
la prestación de servicios de valor añadido. No obstante, en ningún caso se puede
pensar que este cambio ocurra de un día para otro sino que, como en todo periodo
de transformación, será fruto de un proceso continuo que comienza ahora a
caminar con paso firme.
53
CREACIÓN DE PÁGINAS
WEB MEDIANTE EL
LENGUAJE HTML
3.1. INTRODUCCIÓN
En el primer capítulo, en el que se ha sido analizado el funcionamiento del servicio
web, se explicó que Internet utiliza para la transferencia de información 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 información, y exige que la información a transferir
sea definida mediante un sistema estándar, comprensible para cualquier equipo. Con la
intención de satisfacer esta necesidad se desarrolló un lenguaje de definición de
hipertextos, el conocido actualmente como HTML. En este capítulo se analizará dicho
lenguaje y su sintaxis desde un punto de vista práctico, mediante pequeños ejemplos.
55
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
56
CREACIÓN DE PÁGINAS WEB MEDIANTE EL LENGUAJE HTML
Las definiciones existentes de HTML son múltiples y más o menos complejas. Una
definición sencilla y de marcado carácter práctico es la que se propone a
continuación:
Los comandos siempre van incluidos entre los signos < > e insertados en el propio
texto que compone el contenido de la página. Especifican su estructura (las
distintas partes de la página) y formato. Además, permiten la inserción de
contenidos especiales como imágenes, videos, sonidos, etc.
Ejemplo 3.1:
Un primer ejemplo sencillo de creación de una página web, puede ser realizado
utilizando un simple editor de texto, por ejemplo el bloc de notas de Windows.
Si se escribe el código:
57
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
página. Por ejemplo, los comandos <H1> y </H1> señalan el inicio y el fin,
respectivamente, del texto que se mostrará con formato de título: “Primer ejemplo
de página web”. De la misma manera, los comandos <B> y </B> encierran el
texto que se mostrará en negrita.
Toda página 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 página tenga la apariencia que se visualiza
en el navegador. Este documento de texto que aparece oculto al usuario final, es lo
que se denomina código fuente de la página. Las herramientas de navegación web
permiten la consulta de ese código fuente; por ejemplo, Internet Explorer dispone
de la opción Código fuente del menú Ver.
58
CREACIÓN DE PÁGINAS WEB MEDIANTE EL LENGUAJE HTML
59
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
3.3.1. NAVEGADORES
Son programas instalados en el equipo del usuario que se encargan de ejecutar las
órdenes contenidas en el código HTML. Cuando un usuario desea visitar una
página web, su equipo debe conectarse con un servidor remoto y efectuar una
petición al servidor web. Como respuesta a esta petición se inicia, a través de la red
y basándose en el protocolo HTTP, la transferencia del código fuente que define la
página. Una vez que ese código llega al equipo del usuario, el navegador que este
tenga instalado interpreta “línea a línea” el código recibido y genera la página tal y
como se verá finalmente. Por tanto, los navegadores web o browsers son las
aplicaciones encargadas de realizar las peticiones de páginas web y otros recursos
al servidor y de presentar luego los resultados de la petición al usuario. Si además
la página HTML contiene imágenes, vídeos, 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
aplicación necesaria para la visualización de los mismos.
3.3.2. EDITORES
La labor de creación de una página web está a mitad de camino entre la
programación y el diseño gráfico o maquetación. Aunque se utiliza un lenguaje
(HTML), este está lejos de ser un lenguaje de programación como C, C++, Java,
etc. Por otro lado, crear la página no se reduce únicamente a buscar una
combinación de colores y colocación de diferentes elementos multimedia con una
apariencia visual atractiva.
60
CREACIÓN DE PÁGINAS WEB MEDIANTE EL LENGUAJE HTML
— Editores WYSIWYG (What You See Is What You Get): con este tipo de editores el
usuario no trabaja directamente sobre el código, sino sobre un documento que
muestra la apariencia de la página tal como llegaría 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 página sin necesidad de
dominar el lenguaje, ya que estos editores se encargan de generar
automáticamente ese código de forma oculta para el usuario. Por supuesto, el
usuario tiene la posibilidad de consultar el código generado y, en algunos casos,
dependiendo del editor, también modificarlo.
Cualquier persona que quisiera crear su página web sin ningún tipo de
complicaciones, podría utilizar el procesador de texto Microsoft Word. Tras incluir
todo el contenido, con el formato deseado, se elegiría la opción de Guardar como
página web..., y el propio Word generaría una página web con el código fuente
correspondiente. Otro tipo de editores específicamente creados para generar páginas
web, como por ejemplo FrontPage, también permiten al usuario crear sus páginas de
esta forma tan simple. En ambos casos se estaría trabajando con un entorno de
edición perteneciente a la primera categoría de editores (WYSIWYG). A pesar de su
simplicidad de uso, estos editores también tienen sus inconvenientes; el principal es
la falta de control por parte del usuario del código generado, llegándose a generar en
ocasiones un código excesivamente complejo y no optimizado.
— HomeSite (www.allaire.com)
— 1stPage2000 (www.evrsoft.com)
61
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
— arachnophilia (www.arachnoid.com/arachnophilia)
— AceHTML (http://freeware.acehtml.com)
La mayoría de los editores que se utilizan a un nivel profesional incorporan las dos
funcionalidades o modos de edición. Normalmente, los desarrolladores prefieren
trabajar directamente sobre el código y utilizar el otro modo para comprobar
únicamente la apariencia final de la página.
62
CREACIÓN DE PÁGINAS WEB MEDIANTE EL LENGUAJE HTML
Etiquetas de compatibilidad
Dos son las principales etiquetas que contribuyen a dotar al sitio de un correcto
aspecto formal y que, aún no siendo obligatorias, es al menos necesario conocer
para poder interpretar su significado.
Por último, indicar que esta etiqueta debe situarse entre el <HEAD> y <TITLE>.
63
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
— Strict: el documento debe estar elaborado de una forma estricta conforme a las
reglas del estándar HTML aprobadas por la W3C para cada versión de HTML.
La etiqueta para establecer este tipo de documento es la siguiente:
<!DOCTYPE HTML
PUBLIC "-//W3C//DTD HTML 4.O1
Transitional//EN">
<!DOCTYPE HTML
PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">
20
El consorcio W3C pone a disposición 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
CREACIÓN DE PÁGINAS WEB MEDIANTE EL LENGUAJE HTML
Etiquetas de promoción
Aún a riesgo de simplificar en exceso, se puede decir que el objetivo último de una
página 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 búsqueda de información utilizan buscadores y
directorios, es habitual que consulten solo las páginas 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 posición que una página 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 páginas en las bases de datos de dichos buscadores. Surgen así una
serie de metatags entre las que destacan las siguientes:
21
El buscador Google, considerado en la actualidad el más completo de la red, tiene
indexadas un total de 3.300 millones de páginas web.
22
De forma resumida se puede considerar que, en función de la forma de operar, existen
tres tipos de buscadores o robots: los que venden el posicionamiento, los que utilizan robots
que leen las páginas webs, dando un peso fundamental a las metatags, e indexan las páginas
en función de las veces que aparece un término y Google, que utiliza el sistema
denominado “pagerank” en el que no importan tanto las metatags de una web y sí el
número de páginas de contenido similar que se dirigen o enlazan con ella.
65
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
— Los navegadores ignoran los cambios de línea dentro del código HTML, así
como la existencia de más de un espacio en blanco entre palabras.
— Todo comando que carezca de sentido es ignorado por el navegador sin generar
ningún 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
visualización de una misma página puede variar de un navegador a otro si no
se respetan los estándares 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 señalar que un texto se debe visualizar en
negrita se utiliza el comando <B> para señalar el inicio del texto y el comando
</B> para el final.
— Para escribir los comandos en HTML es indiferente el uso de mayúsculas o
minúsculas, pues producen el mismo efecto. Si bien, es bastante común utilizar
mayúsculas para hacer más identificables los comandos dentro del código
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 podría realizar el siguiente
anidamiento de comandos:
66
CREACIÓN DE PÁGINAS WEB MEDIANTE EL LENGUAJE HTML
67
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Los comandos o tags existentes en el lenguaje HTML son múltiples. Para facilitar
su compresión se van a presentar agrupados según su finalidad (para qué sirven o
qué permiten hacer).
Para indicar atributos del texto (negrita, subrayado, etc...) se dispone de varias
directivas que a continuación 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 página. Un ejemplo de esto es el
comando <BLINK>, específico del navegador Netscape y que no produce efecto en
68
CREACIÓN DE PÁGINAS WEB MEDIANTE EL LENGUAJE HTML
otros navegadores. Los comandos más habituales para cambiar el estilo del texto son
los que se muestran en la Tabla 3.3.
Para variar el tamaño, color y tipo de letra de un texto también es muy útil el
comando <FONT> </FONT>. Algunos de los parámetros de este comando son:
— SIZE = +n/-n permite asignar al texto un tamaño n veces superior (+)
o inferior (-) respecto al tamaño normal de la fuente.
— COLOR = "código del color". Más adelante se analizará la codificación 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 tamaño 2 veces
superior al normal, en color rojo y con fuente arial, el comando sería:
69
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
El comando <P> admite el parámetro ALIGN, cuyo valor puede ser LEFT, RIGHT
o CENTER y especifica la forma de alineamiento del párrafo.
Existe un caso en el que los cambios de línea y espacios en blanco extra dentro del
código fuente sí tienen efecto sobre la visualización de la página, 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:
Supóngase que se desea incluir en la página una estadística de las proyecciones y
espectadores de Cinem@s durante el último año. Se podría 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 código, se visualizará ese bloque de texto tal como
aparece en él, respetando el espaciado entre palabras y los cambios de línea. Puede
comprobarse cómo, de no usar los comandos <PRE> y </PRE>, los datos se
mostrarían separados entre sí por un único espacio en blanco y los cambios de línea se
producirían 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 sangrías (texto sangrado), la definición de uno de estos bloques se realiza con
los comandos:
<BLOCKQUOTE>................</BLOCKQUOTE>
70
CREACIÓN DE PÁGINAS WEB MEDIANTE EL LENGUAJE HTML
Ejemplo 3.4:
Supóngase que se desea mostrar en una página las 10 películas más taquilleras de
todos los tiempos en España. El código HTML que genera esta página podría ser el
siguiente:
<H2>
LAS PELÍCULAS MAS TAQUILLERAS DE TODOS LOS TIEMPOS EN
ESPAÑA
</H2>
<OL>
71
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
<LI>Titanic (1997)</LI>
<LI>El señor de los anillos, El retorno del
rey (2003)</LI>
<LI>El señor de los Anillos, La comunidad del
anillo (2001)</LI>
<LI>El señor 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 cámara secreta (2002)</LI>
<LI>La guerra de las galaxias, Episodio I,
La amenaza fantasma (1999)</LI>
</OL>
72
CREACIÓN DE PÁGINAS WEB MEDIANTE EL LENGUAJE HTML
El comando <UL> puede llevar el parámetro opcional TYPE, que indica el tipo de
símbolo utilizado para marcar los elementos de la lista. Los valores posibles son:
Ejemplo 3.5:
La Figura 3.4 corresponde a una página web del sitio de Cinem@s en la que se
muestra información sobre las salas de proyección disponibles. Esta página
contiene en su parte inferior una lista sin numerar cuyo código HTML es:
73
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
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 página 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 código fuente de esa página es:
<H2>
Nuestros menús especiales
</H2>
Para disfrutar del mejor cine le ofrecemos nuestros packs
especiales:
74
CREACIÓN DE PÁGINAS WEB MEDIANTE EL LENGUAJE HTML
<OL TYPE=A>
<LI> Menú <I>Junior</I> </LI>
<UL TYPE=square>
<LI>Palomitas pequeña</LI>
<LI>Bebida a elegir:</LI>
<UL TYPE="circle">
<LI>Agua mineral</LI>
<LI>Refresco pequeño</LI>
</UL>
</UL>
<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>
75
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Otra de las estructuras básicas 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 página web; es por ello
que, en función de los objetivos de este libro, resulta importante conocer en detalle
los diferentes comandos HTML que permiten generar estas estructuras.
76
CREACIÓN DE PÁGINAS WEB MEDIANTE EL LENGUAJE HTML
— ALIGN: indica el tipo de alineación del contenido de las celdas. Los valores
pueden ser LEFT, RIGHT y CENTER. Este parámetro también puede aplicarse
sobre el comando <TR> y tendrá efecto sobre todas las celdas de esa fila.
— VALIGN: indica el tipo de alineación 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. También puede ser aplicado
sobre toda una fila o la tabla completa.
— COLSPAN: indica el número de columnas que ocupa la celda. El valor por
defecto es 1.
— ROWSPAN: indica el número de filas que ocupa la celda. Por defecto es 1.
— NOWRAP: obliga al navegador a no partir las líneas 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 píxeles o un
porcentaje respecto al ancho total de la tabla.
77
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Ejemplo 3.7:
Cinem@s tiene establecido un sistema por el cuál 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.
<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
CREACIÓN DE PÁGINAS WEB MEDIANTE EL LENGUAJE HTML
<TR>
<TH> 30 </TH> <TD> Camiseta <I>Cinem@s</I> </TD>
</TR>
<TR>
<TH> 35 </TH> <TD> Película en DVD o VHS </TD>
</TR>
<TR>
<TH> 40 </TH> <TD> Reproductor de CDs portátil </TD>
</TR>
</TABLE>
Las imágenes son un elemento esencial para diseñar páginas elegantes. Sin
embargo, un excesivo número de imágenes en una página puede hacer que esta
pierda su estética, a la vez que supone hacer más lento el proceso de visualización
(las imágenes son las partes de las páginas que más espacio en bytes ocupan, por lo
que su transferencia requiere más tiempo que la del texto). Los visualizadores
pueden admitir distintos formatos de imágenes, los más extendidos son GIF y JPG.
Cada uno de ellos tiene sus ventajas; por ejemplo, las imágenes JPG ocupan menos
espacio, con la consiguiente reducción de tiempo en la transferencia, pero también
tienen peor calidad que el formato GIF.
79
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Una opción interesante es insertar una imagen como fondo de la página. La forma
de hacerlo es utilizando el parámetro 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 página.
Ejemplo 3.8:
La página de inicio de Cinem@s que se vio en la Figura 3.1 incorpora varias
imágenes. La página 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 imágenes que han sido insertadas dentro de una tabla para poder posicionarlas
en la página de una manera sencilla. El código siguiente muestra la construcción de
esa tabla y la inserción de las tres imágenes:
80
CREACIÓN DE PÁGINAS WEB MEDIANTE EL LENGUAJE HTML
Todo color en HTML viene definido por su formato RGB (Red-Green-Blue), identificado
mediante un código numérico de seis dígitos hexadecimales precedidos del signo "#".
Según este formato, todo color es una combinación de los tres colores básicos: rojo (R),
verde (G) y azul (B); cada uno de ellos puede expresarse desde la ausencia de color (valor
0) a saturación de color (255). La expresión de los valores debe hacerse en forma
hexadecimal, el valor mínimo (0) se expresa como 00, y el máximo (255) como FF. De
esta forma el código de un color estará formado por 6 dígitos hexadecimales:
— Los dos primeros dígitos indican la componente del color primario rojo.
— Los dos dígitos intermedios indican la componente del color primario verde.
— Los dos últimos dígitos indican la componente azul.
La Tabla 3.4 muestra los códigos hexadecimales de algunos de los colores habituales.
Para alguno de esos colores HTML acepta la utilización de identificadores
alfanuméricos, por ejemplo, el color azul puede ser identificado como blue o el color
rojo como red.
Los editores de HTML suelen disponer de una paleta de colores para facilitar la
utilización de los mismos sin tener que realizar conversiones a formato
hexadecimal.
81
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Ejemplo 3.9:
Si se desea que el fondo de la página sea de color azul oscuro, el texto amarillo
(combinación 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 definición del cuerpo del
documento debería hacerse de la siguiente manera:
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, imágenes,...). El
destino del enlace se define mediante el parámetro HREF del comando <A>.
Ejemplo 3.10:
La página de inicio de Cinem@s (Figura 3.1) tiene un conjunto de enlaces que dan
acceso a las restantes páginas del sitio. Estos enlaces se encuentran situados en una
tabla que consta de tres filas y tres columnas, estando la columna central reservada
82
CREACIÓN DE PÁGINAS WEB MEDIANTE EL LENGUAJE HTML
para una imagen. El código que define esa estructura tabular con los enlaces
correspondientes es el que se incluye a continuación:
83
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
</A>
</TD>
</TR>
</TABLE>
Como puede apreciarse, los diferentes enlaces apuntan hacia nuevas páginas
HTML o documentos PHP.
Una vez marcado el destino, se debe crear el enlace, para ello la sintaxis es:
<A HREF="URLdestino#nombre_marcador">
Elemento de enlace
</A>
84
CREACIÓN DE PÁGINAS WEB MEDIANTE EL LENGUAJE HTML
Uno de los usos más frecuentes de los marcos es el de reservar una zona de la
página para mostrar cierta información siempre visible o fija, por ejemplo un
logotipo de una empresa, un índice con enlaces a otras páginas, etc. De esta forma,
cuando se activa uno de esos enlaces se puede acceder a su contenido en otra parte
de la página manteniendo también visible la parte fija. Esto es precisamente lo que
se ha realizado en el diseño del sitio web de Cinem@s, cuya página de inicio
muestra la Figura 3.1 y que contiene dos marcos:
85
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Es conveniente señalar que los marcos se crean de izquierda a derecha para las
columnas y de arriba a bajo para las filas. Además, 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 cómo dividir una página en varias áreas con la
directiva <FRAMESET>. Una vez realizada esa división es necesario definir los
contenidos que se mostrarán 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 parámetros
que pueden acompañar a esta etiqueta permiten indicar el contenido y modificar la
apariencia del marco:
86
CREACIÓN DE PÁGINAS WEB MEDIANTE EL LENGUAJE HTML
Los marcos, si bien permiten enriquecer un sitio con mayor dinamismo y sensación
de interactividad, también pueden generar problemas derivados principalmente del
navegador que utilice el usuario, puesto que determinados navegadores o versiones
de estos no están preparados para permitir mostrar páginas construidas con marcos.
El diseñador 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 creación 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.
87
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Hay que hacer notar al lector que la decisión de asignar el lugar en el que se deben
mostrar los contenidos no es trivial, imagínese que en un sitio web tiene una página
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, implicaría
que el usuario al seleccionarlo sale del sitio web.
Ejemplo 3.11:
A continuación se muestra el código fuente de la página 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
CREACIÓN DE PÁGINAS WEB MEDIANTE EL LENGUAJE HTML
<FRAMESET ROWS="105,*">
indica que la página se va a dividir horizontalmente en dos filas, una superior con
una altura de 105 píxeles y la inferior, que ocupará el resto de espacio libre.
Posteriormente se definen los dos marcos con el comando <FRAME>:
89
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
3.8. FORMULARIOS
Los formularios son uno de los componentes esenciales en una página web, ya que
permiten la interacción con el usuario, consiguiendo así recoger información
particular sobre sus gustos, opiniones, datos personales,... Los visitantes rellenan
los campos del formulario y haciendo clic en un botón del propio formulario, se
envían los datos al servidor en el que reside el sitio web, para que sean procesados,
en su caso, por este. Especialmente útiles serán los formularios para actuar de
interfaz de usuario en los programas PHP.
90
CREACIÓN DE PÁGINAS 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>, acompañado de un parámetro
TYPE que será el que indique el tipo de campo. Los valores que puede tomar este
parámetro TYPE son los que muestra la Tabla 3.5.
Además de los campos de texto definidos con el comando <INPUT>, se pueden crear
también otro tipo de campos: las áreas de texto. Se trata de campos de texto que ocupan
más de una línea. La definición de un área de texto responde al siguiente esquema:
Otro recurso de los formularios son las listas desplegables, que definen campos con
valores predefinidos. Estas listas se crean igualmente con un comando especial: el
91
PHP Y MYSQL. TECNOLOGÍAS 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 código crea un menú desplegable con cuatro opciones, apareciendo la
primera seleccionada por defecto:
<SELECT NAME="nombre">
<OPTION SELECTED> Opción por defecto
<OPTION> Opción 2
<OPTION> Opción 3
<OPTION> Opción 4
</SELECT>
Ejemplo 3.13:
Cinem@s incluye en su sitio web una página en la que sus clientes pueden
registrarse y acceder a la consulta de sus datos. La página de este “Área de
clientes” es la que se muestra en la Figura 3.7. Dicha página incluye dos
formularios situados dentro de una tabla de dos columnas, el primero permite
introducir un número de usuario y contraseña, mientras que el segundo sirve para
enviar todos los datos necesarios para registrarse como cliente.
<HTML>
<HEAD><TITLE>Área de clientes</TITLE></HEAD>
<BODY TEXT=blue>
<!-- Barra de navegación del sitio -->
<TABLE WIDTH="100%" BORDER BGCOLOR=#99CCFF>
<TR>
<TH WIDTH="16%">
<A HREF="principal.htm">Página principal</A></TH>
<TH WIDTH="17%">
<A HREF="proyecciones.php">Nuestra cartelera</A></TH>
92
CREACIÓN DE PÁGINAS 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">Próximos estrenos</A></TH>
<TH WIDTH="16%">
<A HREF="foros/index.php">Foro Cinem@s</A></TH>
</TR>
</TABLE>
93
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
</TR>
<TR>
<TD>Fecha de Nacimiento:</TD>
<TD>día <INPUT TYPE=text SIZE="2" NAME="dianac">
mes <INPUT TYPE=text SIZE="2" NAME="mesnac">
año <INPUT TYPE=text SIZE="4" NAME="annonac">
</TD>
</TR>
<TR>
<TD>Teléfono:</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>
Contraseña (*):
<INPUT TYPE=password SIZE="6" NAME="pass1">
Repita su contraseña:
<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 opinión de sus clientes y que estos compartan sus impresiones,
Cinem@s implementará un foro (véase Capítulo 17). Los mensajes serán enviados
al foro a través de una página con un formulario como el que puede verse en la
Figura 3.8, y cuyo código completo se incluye a continuación:
94
CREACIÓN DE PÁGINAS WEB MEDIANTE EL LENGUAJE HTML
<TR>
<TD>Autor:</TD>
<TD><INPUT TYPE="text" NAME="autor" SIZE=40></TD>
</TR>
<TR>
<TD>Título 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 página destino nuevomensaje.php en el Capítulo 17.
95
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
96
CREACIÓN DE PÁGINAS WEB MEDIANTE EL LENGUAJE HTML
97
INTRODUCCIÓN A PHP
http://www.php.net/
99
PHP Y MYSQL. TECNOLOGÍAS 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 comparación con otro tipo de tecnologías similares, PHP resulta más rápido,
independiente de la plataforma y más sencillo de aprender y utilizar.
Todas estas características han hecho de este lenguaje uno de los que mayor
crecimiento ha experimentado en los últimos años, desde su aparición en 1994. Es
de destacar especialmente la facilidad para la conectividad con sistemas gestores de
bases de datos a través de un gran número de funciones especializadas. En este
libro en concreto se analizará la conectividad con el sistema gestor MySQL. Esa
facilidad de conexión ha hecho que PHP sea actualmente uno de los lenguajes más
utilizados para la generación de páginas dinámicas, no solo personales sino
también portales de empresas y organizaciones.
Inicialmente diseñado para realizar poco más que contadores y libros de visita de
páginas, en la actualidad PHP permite realizar una multitud de tareas útiles para el
desarrollo web. Por ejemplo, dispone, entre otras, de:
— Funciones de correo electrónico que pueden ser utilizadas para programar completos
sistemas de correo electrónico vía web.
— Funciones de administración y gestión de bases de datos específicas para la mayoría de
gestores comerciales y funciones para conexiones ODBC con bases de datos en
sistemas Microsoft.
— Funciones de gestión de directorios y ficheros, incluso para la transferencia mediante
FTP.
— Funciones de tratamiento de imágenes y librerías de funciones gráficas
— Funciones de generación y lectura de cookies.
— Funciones para la generación de documentos PDF.
100
INTRODUCCIÓN A PHP
En el año 2000 surge la siguiente versión del lenguaje: el PHP 4, con una mayor
independencia del servidor web y con un mayor número de funciones disponibles.
Con esta versión se redefine el núcleo del programa, generando un nuevo motor que
mejora la ejecución 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.
23
Estimación de la TIOBE Programming Community en noviembre de 2004. Fuente:
http://www.tiobe.com/tpci.htm
101
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Como prueba del crecimiento experimentado en estos años, la Figura 4.1 muestra
una gráfica con la evolución de dominios y direcciones IP que hacen uso de PHP.
Como puede apreciarse, a inicio de 2005 más de 18 millones de dominios y 1,3
millones de direcciones IP en Internet hacían uso de esta tecnología.
102
INTRODUCCIÓN A PHP
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 interés es meramente educativo.
Ejemplo 4.1:
En un nuevo documento escriba el siguiente código y grábelo en un fichero con la
extensión .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>
103
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Para hacer pública esta primera página, el documento primer.php deberá ser
guardado en el directorio que el servidor web tenga establecido para alojar las
páginas. Para probar que la página funciona correctamente, sin necesidad de tener
una salida real a Internet, se podría 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 dirección podría ser también sustituido por el nombre
que identifique al equipo.
104
INTRODUCCIÓN A PHP
<HTML>
<HEAD>
<TITLE> Primer ejemplo </TITLE>
</HEAD>
<BODY>
<U>
Este es mi primer
programa en PHP</U>
</BODY>
</HTML>
En este código recibido en el cliente no hay ningún elemento que no sea HTML
puro. Esto es debido a que el servidor web, antes de transferir la página al cliente,
se la envió al intérprete de PHP y este ejecutó el programa que estaba integrado en
el documento. Al ejecutar la llamada a la función echo del programa, se escribió
el correspondiente mensaje directamente sobre el código transferido al cliente. Con
este sencillo ejemplo puede verse claramente la forma de trabajo de una tecnología
del lado del servidor como es PHP.
105
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
PHP existe otra función que se puede utilizar para ese mismo cometido: la función
print(). En cualquiera de los dos casos, al producirse la escritura sobre el
código HTML que será pasado al cliente, es posible utilizar esas funciones para
generar código HTML dentro de un script PHP. Por ejemplo, el siguiente programa
genera una tabla HTML con el título y director de una película que se encuentran
almacenados en sendas variables ($t y $d).
Ejemplo 4.2:
<?PHP
$t = "Todo sobre mi madre";
$d = "Pedro Almodóvar";
print("<TABLE BORDER>");
print("<TR> <TH>Título</TH> <TH>Director</TH> </TR>");
print("<TR> <TD> ");
print($t);
print("</TD> <TD> ");
print($d);
print("</TD> </TR> </TABLE>");
?>
El programa anterior generaría el código HTML necesario para que el cliente que
accede a la página pueda ver una tabla como la siguiente:
Título Director
Todo sobre mi madre Pedro Almodóvar
106
INTRODUCCIÓN A PHP
Ejemplo 4.3:
A continuación se muestra un documento HTML que incorpora un script que hace
una llamada a la función phpinfo():
<HTML>
<HEAD><TITLE> Información PHP</TITLE></HEAD>
<BODY>
Opciones de configuración de PHP:
<?PHP
phpinfo();
?>
</BODY>
</HTML>
Ejemplo 4.4:
Finalmente, se incluye a continuación un nuevo sencillo ejemplo de programa en
PHP que es capaz de detectar la hora actual del servidor y mostrar esa información
con un formato preestablecido por el programador. En este caso se utiliza un nueva
función predefinida del lenguaje: la función date(), que permite generar una
cadena de caracteres con una fecha u hora dada y de acuerdo a una cadena de
formato. En el capítulo destinado a funciones predefinidas de PHP, se estudiarán
esta y otras funciones de tratamiento de fechas y horas.
<HTML>
<HEAD>
<TITLE> Cuarto ejemplo </TITLE>
</HEAD>
<BODY>
Bienvenido a esta página, la fecha y hora actual es:<BR>
<B>
<?PHP
print(date("d \de M \de Y, H:i:s"));
?>
</B>
</BODY>
</HTML>
107
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Existen cuatro formas diferentes de diferenciar el código PHP, dos de ellas están
siempre disponibles y las dos restantes dependen de la configuración particular del
servidor.
<?PHP
.........................
.........................
.........................
?>
<SCRIPT LANGUAGE="php">
.........................
.........................
.........................
</SCRIPT>
De estas dos formas, la primera es la sintaxis específica del lenguaje PHP, mientras
que la segunda es la sintaxis general que se utiliza para insertar scripts
programados en diferentes lenguajes.
<?
.........................
.........................
.........................
?>
o
108
INTRODUCCIÓN A PHP
<%
.........................
.........................
.........................
%>
Una de las características destacadas de PHP es que los scripts pueden ser
divididos en bloques, y añadir entre los bloques código HTML puro. Esto resulta
especialmente útil cuando dentro de un programa se necesita escribir un texto que
requeriría 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";
}
?>
<?php
if ($x<0) {
?>
<B> Valor negativo </B>
<BR> Vuelva a intentarlo
<?php
109
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
} else {
?>
<B> Valor positivo </B>
<BR> Correcto
<?php
}
?>
Ejemplo 4.6:
El ejemplo anterior no tiene mucho interés, pero siguiendo ese mismo esquema se
podría definir, por ejemplo, una página que mostrara diferentes contenidos
dependiendo del navegador que esté usando el cliente.
<?php
if (strstr($_SERVER["HTTP_USER_AGENT"], "MSIE")) {
?>
................................
................................
código HTML si el navegador del
cliente es Internet Explorer
................................
................................
<?php
} else {
?>
................................
................................
código 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 petición, y la función
strstr() para tratar de localizar la cadena de caracteres "MSIE" en la
identificación del navegador.
Como puede verse en estos ejemplos, la flexibilidad y fluidez lógica del script
permanece intacta a pesar de su ruptura en varios bloques.
110
INTRODUCCIÓN A PHP
— Las diferentes instrucciones deben terminar con ";". Sin embargo PHP admite
cierta flexibilidad a este respecto, ya que el terminador punto y coma no sería
necesario en la última sentencia del script antes de terminador ?>, ni en los
casos en los que al final de la instrucción se cierre un bloque de código con una
llave, por ejemplo en las estructuras condicionales o bucles.
111
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
/* Comentario estilo C.
Puede extenderse durante varias líneas.
*/
112
INTRODUCCIÓN A PHP
— Números 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 números en base 10: 45 -142 783
o Ejemplo de número en octal: 0123 (equivale a 83)
o Ejemplos de números en hexadecimal: 0x12 (equivale a 18)
0x21B (equivale a 539)
— Números en coma flotante: los números en coma flotante se pueden dar en dos
formatos: como parte entera y parte decimal, usando el punto como separador,
o en notación científica:
o Ejemplos: 14.67 -76.0023 1.4e3 -78.5e-4
113
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
4.6.2. VARIABLES
Una vez analizados los tipos de datos básicos 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:
Ejemplo 4.7:
A continuación se incluye un sencillo script que utiliza dos variables para generar
un mensaje:
<?php
$titulo = "Buscando a Nemo";
$sala = 2;
114
INTRODUCCIÓN A PHP
Además de las variables propias que el programador pueda utilizar, en PHP existen
un gran número 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 aún
cuando sean de distinto tipo:
<?php
$x = "Importe: ";
echo $x;
$x = 5;
echo $x . " (precio normal) ";
$x = $x * 0.85;
echo $x . " (precio reducido) ";
?>
115
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Ejemplo 4.9:
En la siguiente secuencia de instrucciones se producen tres conversiones de tipo
implícitas y una explícita.
$a = "10 euros";
$b = 2.25;
$c = $a - $b; // conversión implícita a tipo float
$d = (integer)$c; // conversión explícita a tipo integer
$e = $d / 2; // conversión implícita a tipo float
echo $e; // conversión implícita a tipo cadena
// finalmente, se escribe el valor 3.5
(tipo) expresión
116
INTRODUCCIÓN A PHP
Las variables por defecto tienen un ámbito global que abarcaría el documento
completo en el que son definidas, a no ser que sean definidas dentro de una
función, en cuyo caso solo pueden ser utilizadas dentro de la propia función
(ámbito local).
Esto significa que una variable definida en un script del documento fuera de
cualquier función, 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 función, pero para
hacer referencia a ella debe declararse dentro de la función con la palabra global
delante de su nombre.
Ejemplo 4.11:
$precio = 4.5;
function calcular_importe($num_entradas) {
global $precio;
$i = $precio * $num_entradas;
return $i;
}
117
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Ejemplo 4.12:
$nombrevariable = 'x';
......................
......................
$$nombrevariable = 150; // asignación equivalente a
$x=150
Dado que en PHP las variables no tienen un tipo declarado explícitamente y que
este puede cambiar a lo largo de la ejecución 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:
Por otro lado, la función unset() permite eliminar una variable, no solo borra el
contenido de la variable sino que también libera el espacio de memoria reservado
para ella. Cualquier intento posterior de acceso a esa variable generaría un error.
118
INTRODUCCIÓN A PHP
En ocasiones puede interesar también saber si una variable existe pero tiene un
valor nulo o vacío, la función que permite efectuar esta comprobación es
empty().
4.6.3. CONSTANTES
Una constante es un valor que permanece inalterable a lo largo de la ejecución del
script y a la que se le asigna un identificador. Solo pueden definirse constantes con
valores escalares (números o cadenas de caracteres). Por ejemplo, no podría
definirse una constante cuyo valor fuese un array.
Ejemplo 4.13:
A continuación se muestra un sencillo ejemplo de definición y uso de constantes:
define("NOMBRE_EMPRESA", "Cinem@s");
define("EDAD_JUBILACION", 65);
define("TIPO_IVA", 0.16);
echo NOMBRE_EMPRESA;
119
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
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 carácter
de la propia cadena las comillas.
En relación a este último error, debe señalarse que, al igual que ocurre en el
lenguaje C, la inclusión de determinados caracteres en las cadenas exige la
utilización de las denominadas secuencias de escape. Entre estos caracteres
especiales están las comillas, el signo dólar, la barra invertida y los caracteres de
tabulación y retorno de carro. La Tabla 4.1 muestra algunas de estas secuencias de
escape.
120
INTRODUCCIÓN A PHP
Ejemplo 4.14:
La instrucción PHP:
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 carácter de código 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:
Ejemplo 4.15:
Si se tienen definidas las siguientes variables:
la sentencia:
121
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Obsérvese cómo al utilizar las comillas dobles, los nombres de variables que
aparecen dentro de la cadena son sustituidos por sus valores. Esta característica de
PHP es especialmente útil y evita tener que recurrir a engorrosas operaciones de
concatenación de cadenas con variables, tal como ocurre en otros lenguajes.
En cambio, la sentencia:
Existe otra forma de expandir variables dentro de cadenas que PHP hereda del
lenguaje Perl y que fue incorporada en la versión PHP 4. Se trata de la sintaxis de
documento incrustado: se basa en señalar 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 líneas y en ella todas
las variables que aparezcan se expandirán.
Ejemplo 4.16:
El siguiente código
122
INTRODUCCIÓN A PHP
FICHA;
echo $c;
Las cadenas de caracteres son un caso especial de un tipo de datos que se verá más
adelante: los arrays. Por tanto, como en todo array, se puede acceder a cualquiera
de los caracteres que componen la cadena sin más que utilizar un índice numérico.
Los índices deben ser siempre dados entre corchetes y además debe tenerse en
cuenta que el primer carácter de la cadena es el correspondiente al índice 0.
123
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
4.6.5. OPERADORES
Una vez analizados los tipos de datos básicos del lenguaje y la definición de las
variables y constantes, el siguiente aspecto a revisar lo constituyen el conjunto de
operadores que se pueden utilizar para generar expresiones complejas.
— Operadores aritméticos.
— Operadores de asignación.
— Operadores de bit.
— Operadores de comparación.
— Operadores lógicos.
— Otros operadores (concatenación, supresión de error, ejecución,...).
Operadores aritméticos
Los operadores aritméticos básicos son los habituales de cualquier lenguaje de
programación:
$x + $y Suma de dos números
$x - $y Diferencia de dos números
$x * $y Producto de dos números
$x / $y División de dos números
$x % $y Resto de la división entera
Tabla 4.2 Operadores aritméticos
124
INTRODUCCIÓN A PHP
En su uso más sencillo, los operadores de incremento están pensados para actuar de
contadores; así por ejemplo, las sentencias siguientes serían totalmente
equivalentes:
$x++; ++$x; $x = $x + 1;
Ejemplo 4.17:
Para entender la diferencia entre la utilización de los operadores de incremento o
decremento antes o después de la variable, conviene analizar algunos sencillos
ejemplos:
Operadores de asignación
En diversos ejemplos previos ya se ha utilizado el operador de asignación 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
expresión que se encuentre a la derecha.
125
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
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;
$a = $b = $c = 1;
126
INTRODUCCIÓN A PHP
Operadores de bit
Los operadores de bit trabajan directamente sobre la representación binaria de los
números enteros, realizando operaciones sobre los diferentes bits de los operandos.
La Tabla 4.5 detalla cuáles son estos operadores y su funcionamiento.
Ejemplo 4.18:
Supóngase que se tienen dos variables $x e $y con valores de 214 y 178
respectivamente. Asumiendo una representación binaria con 8 bits, estos dos
valores estarían codificados con las siguientes cadenas de dígitos 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
serían:
127
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Operadores de comparación
En cualquier lenguaje de programación una de las estructuras más comunes son las
condicionales. En ellas se ejecutan una serie de sentencias en función del valor de
una expresión de tipo lógico (verdadero/falso) que con frecuencia proviene de la
realización de una comparación de valores. Los operadores de comparación son los
que realizan estas comparaciones, devolviendo un valor verdadero si la
comparación es positiva o falso en otro caso.
Ejemplo 4.19:
$x = 10;
$y = 35;
if ($x = $y)
echo "Los dos valores son iguales";
else
echo "Los dos valores son diferentes";
128
INTRODUCCIÓN A PHP
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 asignación en lugar del operador de
igualdad. La asignación $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
expresión que de como resultado un valor numérico diferente de cero o una cadena
de caracteres no vacía es considerada, a efectos de su participación en expresiones
lógicas, como valor "verdadero". Esta es la razón 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 debería
haber utilizado el operador de comparación en lugar del de asignación:
if ($x == $y)
echo "Los dos valores son iguales";
else
echo "Los dos valores son diferentes";
$a = 120;
$b = "120";
tienen tipos diferentes, una corresponde a una variable numérica y la otra a una
cadena de caracteres. Sin embargo, tras la correspondiente conversión, se puede
entender que las dos variables tienen el valor numérico 120. Teniendo en cuenta
esto, la comparación $a == $b produciría un valor "verdadero", mientras que la
comparación $a === $b produciría un valor "falso".
129
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Operadores lógicos
Los operadores lógicos de PHP son los clásicos de cualquier lenguaje de
programación, permiten generar expresiones lógicas complejas conjugando
diferentes subexpresiones.
Como puede observarse, para los operadores Y y O existen dos sintaxis válidas, 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:
130
INTRODUCCIÓN A PHP
Ejemplo 4.20:
Con la siguiente sentencia se asignaría un valor 1 a una variable $par si el valor
de otra variable $n es un número par, y se asignaría el valor 0 en otro caso. Para
determinar si un número es par se utiliza el operador módulo, que calcula el resto
de la división entera (un número es par si el resto de la división entera entre 2 es 0):
$par = ($n % 2 == 0) ? 1 : 0;
$par = !($n % 2) ? 1 : 0;
Operador de concatenación:
cadena1 . cadena2
Ejemplo 4.21:
Ejemplo de uso de este operador sería:
En este caso la variable $anuncio tendría finalmente como valor la cadena "El
último Samurai, con Tom Cruise".
131
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Ejemplo 4.22:
La sentencia
$x = 12/0;
produce un error de tipo aritmético (división por cero) que generaría en la página
un mensaje como
Estos mensajes en las páginas pueden ser eliminados bien mediante determinados
parámetros de configuración del servidor web o mediante el uso del operador de
supresión de error en la sentencia causante del mismo.
$x = @(12/0);
no genera ningún tipo de mensaje de error. Por supuesto, en este caso la variable
$x no tendría ningún valor (variable vacía).
Operador de ejecución
Ejemplo 4.23:
Si se quisiera generar una página web que muestre un listado con el contenido del
directorio del servidor en el que está alojada la propia página web, se podría
insertar en la página el script siguiente:
132
INTRODUCCIÓN A PHP
<?php
$x=`dir`;
echo "<pre> $x </pre>";
?>
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
La conversión explícita del tipo de dato se realiza a través del operador cast:
(tipo) expresión
$x = (int)12.67;
$p = (string)4.5;
133
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Ejemplo 4.24:
En la expresión:
$x = 5/2+3*4;
intervienen cuatro operadores diferentes: uno de asignación y tres aritméticos
(división, 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 programación maneja. En concreto, los
operadores de asignación son los que menor prioridad tienen, y por tanto este sería
el último en ser aplicado; en cuanto a los operadores aritméticos, los productos y
divisiones tienen mayor prioridad que las sumas y las restas. En definitiva, la
expresión anterior sería evaluada de la manera siguiente:
134
INTRODUCCIÓN A PHP
El operador lógico Y con la sintaxis and es el que menos prioridad tiene, menos
incluso que el operador de asignación, por eso en la primera sentencia la secuencia
de operaciones sería:
135
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Si se deseaba que las dos sentencias tuvieran el mismo efecto, se tendrían que
haber utilizado los paréntesis en la primera para alterar el orden de evaluación.
136
PHP Y LOS FORMULARIOS
DE HTML
137
PHP Y MYSQL. TECNOLOGÍAS 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
identificación de cada uno de esos campos. La identificación se logra asignando a
cada campo un nombre mediante el parámetro NAME de la etiqueta de definición de
campo.
Ejemplo 5.1:
Supóngase que Cinem@s tiene establecidas diferentes tarifas para las localidades
en función de la edad del cliente y de su condición o no de estudiante, y que desea
que los propios clientes puedan calcular exactamente el importe de sus entradas a
través de una sencilla página web. El primer paso resulta evidente: diseñar un
formulario que permita "interrogar" al usuario. El aspecto de ese formulario podría
ser el mostrado en la Figura 5.1.
<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>
138
PHP Y LOS FORMULARIOS DE HTML
— Los dos últimos controles del formulario son el botón 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 función
almacenar datos que luego se deban recuperar.
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 debería ser definido de la
siguiente manera:
139
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
$edad
$estudiante Procesar.php
<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 página mostrará un mensaje diciendo que el
importe es 3,5 á, en otro caso el importe será 5 á.
140
PHP Y LOS FORMULARIOS DE HTML
register_globals = On
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 parámetro.
141
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
$_REQUEST[]
$_POST[] ó $_GET[]
dependiendo del método utilizado para el envío de los datos del formulario.
Precisamente en la próxima sección se analizarán las diferencias entre ambos
métodos de envío (get y post).
Ejemplo 5.3:
En el caso del formulario de la Figura 5.1, desde el programa PHP se podría
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']
<?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 notación que garantiza el funcionamiento en todos los
142
PHP Y LOS FORMULARIOS DE HTML
Ejemplo 5.4:
A las variables del formulario del Ejemplo 5.1 se puede acceder también de la
siguiente manera:
$HTTP_POST_VARS['edad']
$HTTP_POST_VARS['estudiante']
En el caso de que los datos deban ser transferidos por correo electrónico, es
obligatorio el uso del método POST.
143
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
...URL...?variable=valor&variable=valor&variable=valor...
En concreto, con los datos anteriores, el URL que se formaría tendría el siguiente
aspecto:
http://miservidor/procesar.php?edad=35&estudiante=0
144
PHP Y LOS FORMULARIOS DE HTML
http://miservidor/procesar.php?edad=23&estudiante=1
Figura 5.3 Página generada a partir del envío con el método get
Ejemplo 5.6:
Si el formulario se define de la siguiente manera:
145
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Figura 5.4 Página generada a partir del envío con el método post
146
PHP Y LOS FORMULARIOS DE HTML
Utilizando la misma idea en la que se basa el método 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 método GET:
http://servidor/script.php?variable1=valor1&variable2=valor2.
..
Ejemplo 5.7:
Si el usuario en la barra de dirección de su navegador escribe el URL:
http://miservidor/favorita.php?titulo=Piratas+del+Caribe
147
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
<?php
echo "Su película favorita es \"$titulo\". ";
echo "Muchas gracias por su opinión";
?>
Ejemplo 5.8:
El siguiente script hace uso de la función isset() para comprobar si la variable
$titulo se encuentra definida, y en función de esa comprobación genera un
mensaje diferente en la página:
<?php
if (isset($titulo)) {
echo "Su película favorita es \"$titulo\".";
echo "Muchas gracias por su opinión";
} else {
echo "No nos ha indicado su película favorita";
}
?>
Otra de las utilidades de esta forma de transferir datos a los scripts es la generación
dinámica de enlaces; en este caso, los URL con las variables son incluidos en
etiquetas HTML de definición de enlaces.
Ejemplo 5.9:
Supóngase que se desea diseñar un formulario para introducir datos de películas y una
serie de enlaces que permitan verificar y confirmar los datos antes de ser enviados al
servidor.
148
PHP Y LOS FORMULARIOS DE HTML
<html>
<head><title>Datos de películas</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>
Guión: <input type="text" name="guion" size="30">
Producción: <input type="text" name="produccion"
size="30">
<hr>
Año: <input type="text" name="anno" size="4">
Nacionalidad:
<input type="text" name="nacionalidad" size="15">
Género:
<select name="genero">
<option selected> Comedia
<option> Drama
<option> Acción
<option> Terror
<option> Suspense
<option> Otras
</select>
Duración: <input type="text" name="duracion" size="3">
(minutos)
<br>
Restricciones de edad:
<input type="radio" name="edad" value="Apta">
149
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Cuando el usuario pulse el botón "Enviar", los datos serán transferidos al script que
se encuentra en el archivo procesarpelicula.php y cuyo contenido se incluye a
continuación:
<html>
<head><title>Confirmación de datos</title></head>
<body>
Datos recibidos correctamente,
si quiere confirmar los valores active el enlace
correspondiente
<br>
<?php
150
PHP Y LOS FORMULARIOS DE HTML
$url1="confirmar.php?datos=a&titulo=$titulo&" .
"actores=$actores&genero=$genero";
echo "<A HREF=\"$url1\"> Ficha artística </A> <BR>";
$url2="confirmar.php?datos=t&direccion=$direccion&" .
"produccion=$produccion&guion=$guion";
echo "<A HREF=\"$url2\"> Ficha técnica </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 dinámica tres simples enlaces, obteniéndose la
página que muestra la Figura 5.7.
Todos los enlaces tienen como destino un tercer archivo (confirmar.php), pero en
cada uno de ellos se añaden al URL diferentes variables que serán transferidas al
script. Además se utiliza una nueva variable (datos) para que el script destino
sepa cuáles son las variables que vienen dentro del URL que reciba.
151
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
<html>
<body>
<?php
if($datos=="a") {
print "<h1> $titulo </h1>";
print "Género: $genero <br>";
print "Protagonizada por $actores <br>";
}
elseif ($datos=="t") {
print "Dirigida por $direccion <br>";
print "Producida por $produccion <br>";
print "Guión de $guion <br>";
}
elseif ($datos=="o") {
print "Nacionalidad: $nacionalidad <br>";
print "Año: $anno <br>";
print "Duración: $duracion minutos <br>";
print "Autorizada para: $edad <br>";
}
?>
</body>
</html>
De esta manera, dependiendo de cuál sea el enlace que active el usuario, la página mostrará
una información u otra. En concreto, las páginas que se generarán por cada uno de los
enlaces anteriores son las que muestran la Figura 5.8, la Figura 5.9 y la Figura 5.10.
152
PHP Y LOS FORMULARIOS DE HTML
153
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Ejemplo 5.10:
Si se desea diseñar un formulario en el que el usuario seleccione uno o varios
temas de interés dentro de una lista, se podría optar por incluir en la definición del
formulario el siguiente código HTML:
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 "Informática"; es decir, la variable guardará el valor de la última
opción seleccionada por el usuario.
154
PHP Y LOS FORMULARIOS DE HTML
seleccionada sino todas ellas, a la hora de dar un nombre al campo del formulario
se deberían utilizar un par de corchetes vacíos para señalar que realmente se
guardará todo un vector o array de valores.
El script recibirá en este caso un array $tema[] que podrá ser procesado para
obtener todas sus componentes individuales. Como se verá en el próximo capítulo
existen incluso estructuras iterativas que permiten recorrer todos los elementos de
un array de una manera simple.
155
SENTENCIAS DE
CONTROL
6.1. INTRODUCCIÓN
Todo lenguaje de programación requiere de estructuras que permitan variar el flujo
normal de ejecución de los programas en función del valor de una expresión o de la
satisfacción de determinadas condiciones. Las denominadas sentencias de control son
las que permiten alterar el orden secuencial habitual en la ejecución de las sentencias.
Básicamente las sentencias de control se clasifican en dos grandes bloques:
— Estructuras condicionales.
— Estructuras iterativas.
Las primeras son las que permiten seleccionar porciones de código a ejecutar si se
cumplen determinadas condiciones; las segundas permiten establecer un bloque de
instrucciones que se ejecutarán un número determinado de veces o mientras se
satisfaga una condición.
157
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
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 condición.
Esta sentencia condicional, con su sintaxis propia, está presente en todos los
lenguajes de programación. En el caso del lenguaje PHP la sintaxis es totalmente
similar a la del lenguaje C:
if (expresión)
sentencia
o bien
if (expresión) {
bloque de sentencias
}
Recordar igualmente que en PHP toda expresión que produzca como resultado un
valor numérico distinto de cero, una cadena diferente de la cadena vacía o un array
no vacío, si aparece dentro de un contexto lógico es tratada como el valor booleano
verdadero (true).
Con objeto de que el código de los programas resulte más legible suele
ser recomendable utilizar diferentes niveles de sangrado para identificar
los bloques de sentencias que se ejecutan en caso de verificarse una
NOTA condición. Debe advertirse sin embargo que esto únicamente tiene un
efecto "estético" en el programa y no influye en la ejecución del mismo.
158
SENTENCIAS DE CONTROL
Ejemplo 6.1:
Considérese el siguiente fragmento de programa en el que se genera un mensaje en
la página solo cuando el valor de la variable $descuento es mayor que 0:
if ($descuento > 0)
print "Artículo con precio rebajado";
Debe tenerse especial cuidado cuando se desea ejecutar más de una sentencia si la
condición es cierta.
Ejemplo 6.2:
Por ejemplo, dada la estructura siguiente:
if ($x > 0)
$y = 2 * $x;
$z = 1 / $x;
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 conseguiría el mismo
efecto escribiendo el código de cualquiera de las siguientes maneras:
if ($x > 0)
{
$y = 2 * $x;
$z = 1 / $x;
}
159
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
if ($x > 0)
{$y = 2 * $x;
$z = 1 / $x;}
e incluso
Ejemplo 6.3:
La sentencia:
if $fila <= 5
$ocupada = true;
if ($ocupada)
print "Lo siento, asiento no disponible";
Ejemplo 6.4:
La siguiente estructura condicional escribiría 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. Obsérvese de nuevo la necesidad de introducir
toda la condición entre paréntesis y usar igualmente paréntesis para establecer el
orden de evaluación de la expresión.
160
SENTENCIAS DE CONTROL
Ejemplo 6.5:
La sentencia
if ($fila = 15)
print "Última fila de la sala";
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 próxima 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 además de eso el asiento
corresponde a los números 1 ó 20, se advierte de una mala visibilidad.
161
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Ejemplo 6.7:
La sentencia
if($precio)
print "El precio es $precio euros";
Ejemplo 6.8:
La sentencia
if(!$nombre)
print "Por favor, díganos su nombre";
if (condición)
{
sentencias a ejecutar si la condición es cierta
}
else
{
sentencias a ejecutar si la condición es falsa
}
162
SENTENCIAS DE CONTROL
De nuevo, en caso de que alguno de los bloques esté constituido por una única
sentencia, las llaves podrían 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 niños menores de 12 años o
jubilados y para el resto de personas, se podría escribir una sentencia condicional
con una cláusula else:
Ejemplo 6.10:
La sentencia
if($precio)
print "El precio es $precio euros";
else
print "Entrada gratuita";
Obsérvese cómo 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 supresión de esas llaves porque pueden provocar errores
que en ocasiones resultan difíciles de detectar.
Ejemplo 6.11:
Considérese la estructura condicional siguiente:
if ($num == 126)
$fila = 12;
$asiento = 8;
else
$fila = 10;
$asiento = 6;
163
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
En cambio, la sentencia
if ($num == 126) {
$fila = 12;
$asiento = 8;
}
else
$fila = 10;
$asiento = 6;
if ($num == 126) {
$fila = 12;
$asiento = 8;
}
else {
$fila = 10;
$asiento = 6;
}
164
SENTENCIAS DE CONTROL
if (condición1)
{
sentencias a ejecutar si la condición1 es cierta
}
elseif (condición2)
{
sentencias a ejecutar si la condición2 es cierta
}
elseif (condición3)
{
sentencias a ejecutar si la condición3 es cierta
}
...
else
{
sentencias a ejecutar si ninguna de las
condiciones anteriores es cierta
}
165
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Ejemplo 6.12:
La siguiente estructura condicional asigna diferente valor a la variable $precio
en función 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;
}
if ($edad < 3) {
$precio = 0;
}
else
if ($edad <= 16) {
$precio = 8;
}
else
166
SENTENCIAS DE CONTROL
Ejemplo 6.13:
Supóngase que se desea que una página web muestre un mensaje de bienvenida
diferente dependiendo de la hora del día; por ejemplo, considérese el siguiente
script:
$hora=date("H");
if ($hora<5)
print("Buenas noches, ");
elseif ($hora<12)
print("Buenos días, ");
elseif ($hora<20)
print("Buenas tardes, ");
else
print("Buenas noches, ");
print("bienvenido a nuestra página web");
167
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
if (condición) :
sentencias a ejecutar si la condición es cierta
endif;
Ejemplo 6.14:
Un sencillo ejemplo de construcción de una estructura condicional con esta sintaxis
sería:
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.
Ejemplo 6.15:
if ($y == 1):
$z = 3;
elseif ($y == 2):
$z = 5;
else:
$z = 7;
endif;
168
SENTENCIAS DE CONTROL
Ejemplo 6.16:
El siguiente fragmento de código incluye dos scripts entre los que se está
colocando código 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 página
mostrará una lista HTML con un conjunto de películas autorizadas para todos los
públicos.
switch (expresion) {
case valor1:
sentencias
case valor2:
169
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
sentencias
...
case valorN:
sentencias
default:
sentencias
}
Ejemplo 6.17:
A continuación 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 función 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
SENTENCIAS DE CONTROL
break;
case 'S':
$precio = 5;
break;
case 'D':
$precio = 4.5;
break;
}
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;
171
PHP Y MYSQL. TECNOLOGÍAS 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;
}
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
SENTENCIAS DE CONTROL
case 'V':
$precio = 5; break;
case 'S':
$precio = 5; break;
case 'D':
$precio = 4.5; break;
default:
$precio = 0;
}
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 ocurría con la sentencia if, la sentencia switch dispone de una
sintaxis alternativa en la que el inicio del bloque de casos se señala con un signo ':'
y el final de la estructura con la palabra endswitch. A continuación se puede ver
un sencillo ejemplo con esta nueva sintaxis.
173
PHP Y MYSQL. TECNOLOGÍAS 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, supóngase que se desea calcular el número de días que tiene
un mes concreto, considerando además si el año es bisiesto o no (un año es bisiesto
cuando es múltiplo de 4 pero no de 100, o bien cuando es múltiplo de 400).
Supóngase que las variables $mes y $anno identifican el mes concreto del que se
desea conocer el número de días, el siguiente programa asigna ese número a la
variable $nd:
switch($mes) {
case 2:
if((($anno%4==0) and ($anno%100!=0)) or
($anno%400==0))
$nd=29;
else
$nd=28;
break;
case 4: case 6: case 9: case 11:
$nd=30;
break;
default:
$nd=31;
}
174
SENTENCIAS DE CONTROL
while (expresión)
sentencia
En el caso de que el cuerpo del bucle esté formado por más de una sentencia, estas
deben ser dadas entre llaves:
while (expresión) {
sentencias
}
La expresión es evaluada cada vez que se inicie una iteración del bucle, pudiéndose
dar el caso incluso de que las sentencias del bucle no se ejecuten ni una sola vez si
la expresión es inicialmente falsa. Por supuesto, dentro del bloque de sentencias a
ejecutar en cada iteración debe haber alguna que modifique el valor de la
expresión, ya que en caso contrario se entraría en un bucle infinito.
Al igual que ocurre con las restantes sentencias de control, existe una sintaxis
alternativa de la sentencia while:
while (expresión) :
sentencias
endwhile;
175
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Ejemplo 6.21:
Mediante el siguiente programa se genera una lista HTML con los múltiplos de 5
menores o iguales que 100:
print "<OL>";
$n = 5;
while ($n <= 100) {
print "<LI> $n";
$n += 5;
}
print "</OL>";
do
{
sentencias
}
while (condición);
Ejemplo 6.22:
El bucle para generar una lista con los múltiplos de 5 menores o iguales que 100
también podría construirse utilizando esta sentencia:
print "<OL>";
$n = 5;
do {
print "<LI> $n";
$n += 5;
176
SENTENCIAS DE CONTROL
}
while ($n <= 100)
print "</OL>";
Ejemplo 6.23:
Considérese el siguiente bucle:
$n = 0;
while ($n > 0) {
print $n;
$n--;
}
$n = 0;
do {
print $n;
$n--;
}
while ($n > 0);
Ejemplo 6.24:
A continuación se muestra el uso de la sentencia do...while para comprobar la
conjetura de Collatz, que establece que cualquiera que sea el número entero
positivo n de partida, la sucesión de números enteros f(n), f(f(n)), f(f(f(n))),...
siempre llega a alcanzar el valor 1, siendo f(n) la siguiente función:
177
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
n / 2 si n es par
f ( n) = ®
¯(3n + 1) / 2 si n es impar
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> Iteración $niter: $n";
} while ($n!=1);
print "</SELECT>";
Por ejemplo, asumiendo que el valor inicial es 23, se generaría una lista como la
que se muestra en la Figura 6.1.
.
178
SENTENCIAS DE CONTROL
179
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Ejemplo 6.25:
A continuación se muestra la construcción de un sencillo bucle que calcula la suma
de los 100 primeros números 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 irán 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 iteración, 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 continuación la manera de escribir la estructura
iterativa anterior de una forma mucho más compacta:
En este caso, tanto la variable contador como la que acumula las sumas parciales,
toman sus valores iniciales en la parte de inicialización del bucle; obsérvese cómo
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 modificación
de variables del bucle junto con el incremento a la variable contador. Finalmente,
obsérvese 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
también cualquiera de las otras tres partes que la forman. En el caso de que no se
indique ninguna condición, PHP asume que esta es siempre cierta, con lo que se
estaría definiendo un bucle infinito. Evidentemente, un bucle infinito no tiene
ninguna utilidad práctica a no ser que dentro del cuerpo del bucle se utilice la
sentencia break para forzar la salida del mismo.
for( ; ; );
180
SENTENCIAS DE CONTROL
Ejemplo 6.26:
Otro ejemplo de bucle infinito sería:
for($n=1; ;$n++)
print $n;
En este caso se construye un bucle que escribe los números 1,2,3,4,.... y así
indefinidamente, ya que no hay condición de finalización.
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 máximo de
ejecución de un script, de manera que cuando se entra en un bucle infinito y se
supera ese límite, automáticamente se aborta la ejecución y se genera el mensaje de
error:
Ejemplo 6.27:
Uno de los ejemplos "clásicos" de estructuras iterativas es el cálculo del factorial
de un número (n!=1*2*3*...*(n-1)*n). La implementación de este bucle
sería:
$fact = 1;
for ($i = 2; $i <= $n; $i++ ) {
$fact *= $i;
}
181
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Al igual que en el caso del bucle que efectuaba la suma de los números menores o
iguales que 100, el bucle anterior puede escribirse de una forma más compacta:
Ejemplo 6.28:
Supóngase que se desea construir, de forma aleatoria, una contraseña formada por
8 letras. Se puede utilizar la función rand() para generar un número aleatorio
entre 97 y 122 (códigos ASCII correspondientes a las letras minúsculas) y la
función chr() para obtener el carácter asociado a un código ASCII dado.
$codigo="";
for($i=1;$i<=8;$i++) {
$letra = chr(rand(97,122));
$codigo = $codigo.$letra;
}
print("Contraseña asignada es:<B>$codigo</B>");
Ejemplo 6.29:
En los bucles es posible utilizar más de una variable que actúe como contador, por
ejemplo:
2--8--18--32--50--72--98--128--162--200--
Ejemplo 6.30:
Supóngase que se desea generar en la página web la tabla de multiplicar del 1 al
10; esto puede hacerse de una manera muy sencilla con dos bucles for anidados:
182
SENTENCIAS DE CONTROL
El bucle anterior podría ser modificado para que la salida generada correspondiera
realmente a un formato de tabla en HTML. En este caso, el propio bucle debería
encargarse de ir generando las diferentes etiquetas de construcción de tablas
HTML en los lugares adecuados:
print("<TABLE BORDER>\n");
// Generación 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");
// Generación de las restantes filas
for ($i = 1; $i <= 10; $i++) {
print("<TR ALIGN=CENTER> <TH>$i</TH> ");
for ($j = 1; $j <= 10; $j++) {
print("<TD>" . $i*$j . "</TD>");
}
print("\n</TR>\n");
}
print('</TABLE>');
183
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
* 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 dinámicamente
campos de formularios.
Ejemplo 6.31:
A continuación puede verse la definición de un formulario HTML dentro del cuál
se incluye un script PHP con sendos bucles que generan las opciones de dos
controles de tipo lista:
<FORM NAME=FORMHORA>
<?php
print("HORAS: <SELECT HORA>");
for($i=0; $i<=23; $i++)
print("<OPTION VALUE=$i> $i");
print("</SELECT>");
print("<BR>MINUTOS: <SELECT MINUTOS>");
for($i=0; $i<=55; $i+=5)
print("<OPTION VALUE=$i> $i");
print("</SELECT>");
?>
</FORM>
184
SENTENCIAS DE CONTROL
Ejemplo 6.32:
Como último ejemplo de construcción de bucles con la sentencia for se presenta a
continuación un programa más 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 año cuyo calendario se quiere generar. El código del programa sería:
$diasemana=date("w",mktime(0,0,0,$mes,1,$anno));
if($diasemana==0) $diasemana=7;
switch($mes) {
case 1:
$nd=31; $nombremes="Enero";
break;
case 2:
if((($anno%4==0) and ($anno%100!=0)) or
($anno%400==0))
$nd=29;
else
$nd=28;
$nombremes="Febrero";
break;
case 3:
$nd=31; $nombremes="Marzo";
break;
case 4:
$nd=30; $nombremes="Abril";
break;
case 5:
$nd=31; $nombremes="Mayo";
break;
case 6:
$nd=30; $nombremes="Junio";
break;
case 7:
$nd=31; $nombremes="Julio";
break;
case 8:
$nd=31; $nombremes="Agosto";
break;
case 9:
$nd=30; $nombremes="Septiembre";
break;
case 10:
$nd=31; $nombremes="Octubre";
break;
case 11:
$nd=30; $nombremes="Noviembre";
185
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
break;
case 12:
$nd=31; $nombremes="Diciembre";
break;
}
// generación 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 día
// de comienzo del mes
while($aux<$diasemana) {
print("<TD> </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>");
Julio 2004
Lu Ma Mi Ju Vi Sa Do
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
186
SENTENCIAS DE CONTROL
Como puede apreciarse, el primer dato que se necesita es saber en qué día de la
semana comienza el mes, para ello se utiliza la combinación de las funciones
date() y mktime(), ambas serán estudiadas con detalle en el Capítulo 9; de
momento, únicamente indicar que la función 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 día 1 del mes y año dados. Con ese instante de tiempo la
función date() es capaz de devolver un valor numérico de 0 a 6 indicando el día
de la semana (0 corresponde al domingo). Para que el programa quede más claro,
se asigna el valor 7 a los domingos.
Como puede apreciarse, debe indicarse el nombre del array en el que están
almacenados todos los datos y el nombre de una variable. En la iteración inicial
esta variable contendrá el valor del primer elemento del array y en las sucesivas
iteraciones del bucle esta variable hará referencia a los siguientes elementos.
187
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Ejemplo 6.33:
Las siguientes sentencias
Ejemplo 6.34:
Si se desea construir un bucle que escriba todos los números pares menores o
iguales que 100, se podría utilizar una sentencia for como la siguiente:
188
SENTENCIAS DE CONTROL
break;
print $i;
}
Ejemplo 6.35:
Considérense 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--;
}
}
1: 10 9 8 7 6 5 4 3 2 1
2: 10 9 8 7 6 5 4 3 2
3: 10 9 8 7 6 5 4 3
4: 10 9 8 7 6 5 4
5: 10 9 8 7 6 5
6: 10 9 8 7 6
7: 10 9 8 7
8: 10 9 8
9: 10 9
10: 10
189
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
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--;
}
}
sería:
1: 10 9 8 7 6 5 4 3 2 1
2: 10 9 8 7 6 5 4 3 2
Ejemplo 6.36:
En el siguiente programa puede verse otro ejemplo de salida de dos estructuras de
control anidadas, en este caso un bucle y una estructura condicional:
$n = 10;
while (--$n) {
switch ($n) {
case 1:case 3:case 5:case 7:case 9:
print "$n (impar) ";
break;
case 2:case 4:case 6:case 8:
print "$n (par) ";
break;
case 0:
break 2;
}
}
En este caso las sentencias break dentro de los primeros casos de la estructura
condicional tienen por objeto únicamente salir de esa estructura; mientras que el
190
SENTENCIAS DE CONTROL
break situado dentro del último caso fuerza la salida de las dos estructuras
anidadas (la estructura condicional y el bucle). La salida producida por las
sentencias anteriores sería:
La sentencia continue, por su parte, permite abandonar una iteración del bucle
pero sin omitir el resto de iteraciones. Cuando el intérprete de PHP se encuentra
una sentencia continue, ignora las posibles sentencias que queden por ejecutar
en la iteración actual del bucle y pasa directamente a las sentencias de la siguiente
iteración.
Ejemplo 6.37:
Una forma de calcular la suma de los números pares menores o iguales que 100
sería:
$suma = 0;
for($n=1;$n<=100;$n++) {
if($n%2 != 0) // el número es impar
continue;
$suma = $suma + $n;
}
En este caso, se construye un bucle que recorre todos los números menores o
iguales que 100, tanto los pares como los impares; en cada iteración se comprueba
si el número es impar, y de ser así se abandona esa iteración y se pasa a la
siguiente.
Por supuesto, este ejemplo tiene por único objeto mostrar el funcionamiento de la
sentencia continue, ya que el cálculo de la suma se podría realizar de una forma
más optimizada con un bucle que recorra solamente los números pares. De hecho,
la siguiente sentencia sería suficiente para conseguir el mismo efecto:
for($suma=0,$n=2;$n<=100;$n+=2);
191
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Ejemplo 6.38:
Los siguientes bucles anidados generan todos los pares de números formados por
combinaciones de los dígitos del 1 al 9, siendo además los dos componentes del par
diferentes. Obsérvese cómo cuando en la iteración interna se comprueba que las
dos componentes son iguales, se abandona dicha iteración
for($i=1;$i<10;$i++)
for($j=1;$j<10;$j++)
if($i == $j)
continue;
else
print "($i,$j) ";
(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)
for($i=1;$i<10;$i++)
for($j=1;$j<10;$j++)
if($i == $j)
continue 2;
else
print "($i,$j) ";
El resultado sería:
(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
DEFINICIÓN DE
FUNCIONES
La sintaxis que debe adoptarse a la hora de definir una función en PHP sigue el
siguiente esquema general:
193
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
function NombreFuncion()
La sentencia return permite que la función devuelva un valor de retorno. Una vez
ejecutada esa sentencia se abandona la función, 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 numérico, un valor booleano, un array,... Este valor será
recogido en una variable a la hora de efectuar la llamada a la función o utilizado
directamente en alguna otra sentencia. Debe destacarse que a la hora de definir una
función, no es indispensable que esta devuelva valores; en este sentido en PHP no hay
distinción sintáctica entre lo que en otros lenguajes son funciones y procedimientos.
Ejemplo 7.1:
En este primer caso, se define una función que calcula la suma de sus dos
argumentos numéricos. La sentencia return devuelve el resultado:
function Suma($x,$y) {
return ($x+$y);
}
Ejemplo 7.2:
La siguiente función no devuelve ningún valor, simplemente imprime en pantalla
una serie de cadenas de caracteres a modo de saludo:
function Saluda() {
print("Bienvenido ");
print("¿Cómo estás?");
}
194
DEFINICIÓN DE FUNCIONES
Ejemplo 7.3:
Avanzando un paso más se muestra cómo definir una función que calcula el
factorial de un número dado:
Ejemplo 7.4:
En este ejemplo se programa una función que genera un array a partir de dos
valores numéricos 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 serán estudiados en profundidad
en el capítulo siguiente.
function GeneraArray($min,$max) {
$x = array();
$d = $min;
while ($d<=$max){
$x[]=$d;
$d++;
}
return $x;
}
195
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
n! = n* (n-1)!
196
DEFINICIÓN DE FUNCIONES
Ejemplo 7.5:
Dada la función:
function Suma($x,$y) {
return ($x+$y);
}
$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 página muestra la generación de un array con ayuda de la función
GeneraArray() definida en el Ejemplo 7.4. Como puede observarse, el código
de la página incorpora dos scripts PHP diferentes, el primero, situado antes del
código HTML, define la función; mientras que en el segundo es donde se realiza la
llamada a la misma.
<?PHP
function GeneraArray($min,$max) {
197
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
$x = array();
$d = $min;
while ($d<=$max){
$x[]=$d;
$d++;
}
return $x;
}
?>
<HTML>
<HEAD>
<TITLE>Generación de un array</TITLE>
</HEAD>
<BODY>
<?PHP
print "<PRE>";
print_r(GeneraArray(3,10));
print "</PRE>";?>
</BODY>
</HTML>
Array
(
[0] => 3
[1] => 4
[2] => 5
[3] => 6
[4] => 7
[5] => 8
[6] => 9
[7] => 10
)
198
DEFINICIÓN DE FUNCIONES
Ejemplo 7.7:
Considérese una función que reciba tres argumentos correspondientes a una
cantidad de horas, minutos y segundos, y devuelva el número total de segundos
equivalentes a dicho periodo. A continuación puede verse la definición de esa
función y tres llamadas a la misma con diferente número de argumentos.
<?PHP
function Cuenta_segundos($horas,$minutos,$segundos) {
return (3600*$horas + 60*$minutos + $segundos);
}
?>
<HTML>
<HEAD>
<TITLE>Generación de un array</TITLE>
</HEAD>
<BODY>
<?PHP
$h=2; $m=15; $s=30;
$ss = Cuenta_segundos($h,$m,$s);
print "$h horas, $m minutos y $s segundos
son $ss segundos <BR>";
$h=3; $m=20;
$ss = Cuenta_segundos($h,$m);
print "$h horas y $m minutos son $ss segundos <BR>";
$h=5;
$ss = Cuenta_segundos($h);
print "$h horas son $ss segundos <BR>";
?>
</BODY>
</HTML>
199
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
200
DEFINICIÓN DE FUNCIONES
Ejemplo 7.8:
A continuación se define una función que crea enlaces en una página web, a partir
de dos argumentos: el texto del enlace y la dirección 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>";
}
Por supuesto, todos los argumentos de la función pueden tomar valores por
defecto:
CrearEnlace();
En este caso, los dos argumentos tomarían sus respectivos valores por defecto.
201
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
func_num_args()
Una vez que se sabe cuántos argumentos han sido pasados, es necesario también
disponer de algún mecanismo para recuperar los valores de los mismos. La
siguiente función permite recuperar el valor del argumento número n:
func_get_arg(n)
func_get_args()
Ejemplo 7.9:
A continuación se define una función que calcula la suma de los valores de todos
sus argumentos. Como puede observarse, en la cabecera de la definición no se
declara ningún argumento y estos son recuperados en el cuerpo de la propia
función.
function suma() {
$n = func_num_args();
$aux = 0;
for ($i=0;$i<$n;$i++)
$aux += func_get_arg($i);
return $aux;
}
202
DEFINICIÓN DE FUNCIONES
13
15
0
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
asignación de variables.
Asignar a una variable dada un valor por referencia no supone almacenar un valor
concreto, sino una dirección de memoria que remite a otra variable. Cualquier
modificación sobre esta segunda variable se verá reflejada en la variables asignada
por referencia.
$b = &$a;
El siguiente ejemplo muestra las diferencias en el resultado final entre las dos
formas de inicialización de variables, la directa, o por valor, y la asignación por
referencia.
203
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Ejemplo 7.10:
Dadas las sentencias de asignación siguientes:
$a = "¡Hola!";
$b = $a;
$a = "¡Adiós!";
echo "$b"; //Se imprime "¡Hola!", el valor inicial de $a
$a = "¡Hola!";
$b = &$a;
$a = "¡Adiós!";
echo "$b"; //Se imprime "¡Adiós!", el nuevo valor de $a
$a = "¡Hola!";
$b = &$a;
unset($a);
$a = "¡Adiós!";
echo "$b"; //Se imprime "¡Hola!", el valor inicial de $a
En este caso, tras realizar la asignación por referencia a la variable $b, la variable
$a es destruida con la función unset(), quedando $b con el valor que hasta ese
momento tenía la variable destruida. Posteriormente, al hacer la última asignación,
la variable $a vuelve a ser creada pero ocupando una posición de memoria
diferente a la que tenía 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 función por
referencia significa que lo que realmente se pasa es la dirección 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
DEFINICIÓN DE FUNCIONES
Ejemplo 7.11:
En la siguiente función se pasan dos argumentos por valor ($x y $y) y otros dos
por referencia ($suma y $prod) para que la función guarde en estos dos últimos
el valor de la suma y del producto, respectivamente, de los dos primeros:
$a=3; $b=2;
Opera($a,$b,$s,$p);
Ejemplo 7.12:
Para apreciar la diferencia entre ambas maneras de pasar los argumentos de una
función, se define a continuación una función que toma como argumento una
variable numérica y multiplica su valor por 20, pero implementando las dos
versiones: pasando el argumento por valor (función Fvalor()) y pasándolo por
referencia (función Frefer()).
function Fvalor($x){
$x *= 20;
}
function Frefer(&$x){
$x *= 20;
}
205
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
$z = 3;
Fvalor($z);
echo "$z";
$z = 3;
Frefer($z);
echo "$z";
Toda variable definida dentro de una función tiene un ámbito local a la misma; es
decir, únicamente podrá ser utilizada dentro de la propia función.
Ejemplo 7.13:
Dada la función f(), en la que se define una variable local $titulo, cualquier
referencia a esa variable fuera de la función devolvería un valor nulo (variable no
definida). Así, con las siguientes sentencias no se imprimiría ningún mensaje:
function f() {
$titulo = "Mar adentro";
print $titulo;
}
print $titulo;
206
DEFINICIÓN DE FUNCIONES
Ejemplo 7.14:
El siguiente programa tampoco escribiría ningún mensaje, ya que al hacer la
referencia a la variable $director dentro de la función, PHP buscará esa variable
localmente.
function g()
{
print $director; // referencia a una variable local
}
En PHP las variables globales deben ser declaradas como tal dentro de la función que
quiera utilizarlas, esta declaración se hace utilizando la palabra reservada global.
No existe ningún límite al número de variables globales que pueden aceptar las
funciones.
Ejemplo 7.15:
Si se desea utilizar la variable $director dentro de la función g(), la
declaración debería hacerse de la siguiente manera:
function g()
{
global $director; // declaración de variable global
print $director; // referencia a la variable global
}
207
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Una segunda forma de acceder a las variables globales dentro de una función es
utilizar el array $GLOBALS, que siempre almacena todas las variables globales
definidas. Así, en la función anterior, también se podría acceder a la variable
$director utilizando la siguiente sintaxis:
function g()
{
print $GLOBALS["director"];
}
Ejemplo 7.16:
La siguiente función declara una variable estática, con valor inicial 0, y en cada
iteración la incrementa en una unidad y escribe su nuevo valor.
function h()
{
static $n = 0;
$n++;
print "$n ";
}
for($i=1;$i<=10;$i++)
h();
208
DEFINICIÓN DE FUNCIONES
1 2 3 4 5 6 7 8 9 10
include("fichero.php");
require("fichero.php");
El nombre del fichero a incluir puede estar incluso almacenado en una variable y
cambiar de valor durante la ejecución del programa. Además, 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 debería ir acompañado de la ruta relativa
para localizarlo.
209
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Ejemplo 7.17:
A continuación se muestra el uso de la cláusula require para incluir en un
programa las asignaciones realizadas en el fichero de nombre definiciones.php. El
contenido de este podría ser:
<?php
$titulo = "Los increibles";
$director = "Brad Bird";
$genero = "aventuras";
?>
<HTML>
<BODY>
<?php
require("definiciones.php");
echo "Nuestro próximo estreno: $titulo, ";
echo "película del genero $genero, ";
echo "dirigida por $director";
?>
</BODY>
</HTML>
Por supuesto, la inclusión puede tener lugar en cualquier punto, incluso dentro de
una función, tal como ocurre en el código siguiente:
function estreno(){
include("definiciones.php");
echo "Nuestro próximo estreno: $titulo, ";
echo "película del genero $genero, ";
echo "dirigida por $director";
}
En este último caso, al incluirse las definiciones dentro del cuerpo de la función,
las variables definidas pasarán a tener un ámbito local, y por tanto solo podrán ser
210
DEFINICIÓN DE FUNCIONES
function estreno(){
global $titulo;
global $director;
global $genero;
include("definiciones.php");
echo "Nuestro próximo estreno: $titulo, ";
echo "película del genero $genero, ";
echo "dirigida por $director";
}
Ejemplo 7.18:
Supóngase que se dispone de dos funciones diferentes que pueden realizar el
cálculo del precio total a pagar por un número $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.
211
PHP Y MYSQL. TECNOLOGÍAS 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.";
Por supuesto, el valor de la variable que hace referencia a la función podría ser
asignado a partir de determinadas condiciones en el programa, por ejemplo, si el día
actual es un miércoles se podría aplicar la tarifa reducida y en cualquier otro día la
tarifa normal:
if(date("w") == 3)
$tarifa = "precio_reducido";
else
$tarifa = "precio_normal";
$importe = $tarifa($num_entradas);
get_defined_functions()
212
DEFINICIÓN DE FUNCIONES
$f = get_defined_functions();
print_r($f);
mostraría en la página una lista con las más de 700 funciones predefinidas en PHP.
213
ARRAYS
215
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Ejemplo 8.1:
Una primera forma de definir un array consiste en asignar directamente sus valores,
por ejemplo, a continuación se define un array de nombre $x, con cuatro elementos
indexados numéricamente comenzando en la posición 0:
$x[0] = 1;
$x[1] = "¡¡hola!!";
$x[2] = 3;
$x[] = "Último";
Como alternativa se podría haber creado e inicializado el anterior array con ayuda
de la función array(), de la siguiente forma:
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,
pudiéndose utilizar esos valores en una expresión como cualquier otra variable. Por
ejemplo:
$z = $x[0] + 5*$x[2];
216
ARRAYS
Ejemplo 8.2:
Supóngase que se desea almacenar los años de un conjunto de películas. Se puede
construir un array de elementos numéricos (los años) indexados mediante una
cadena de caracteres (el título de la película correspondiente).
En este caso, al construir el array debe indicarse tanto la palabra clave que actúa de
índice como el valor asociado a ese elemento del array. Aunque el array se haya
construido con la función array(), en cualquier momento se podría añadir un
nuevo elemento:
Para acceder a los elementos del array se utiliza de nuevo la palabra clave:
217
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Ejemplo 8.3:
A continuación 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;
$M=array(array(5,3),array(-2,7));
Para acceder a los elementos individuales del array se deberían utilizar los dos
índices:
$d = $M[0][0]*$M[1][1] - $M[0][1]*$M[1][0];
Ejemplo 8.4:
$pelicula["George Cukor"][1949] = "La costilla de Adán";
$pelicula["Jean Renoir"][1937] = "La gran ilusión";
$pelicula["Roberto Rossellini"][1944] = "Roma, ciudad
abierta";
$pelicula["Billy Wilder"][1954] = "Sabrina";
$pelicula["Frank Capra"][1938] = "Vive como quieras";
218
ARRAYS
Ejemplo 8.5:
También es posible indexar los elementos de un array multidimensional:
$peliculas = array(
"La costilla de Adán" =>
array("Director"=>"G. Cukor","Año"=>1949),
"La gran ilusión" =>
array("Director"=>"J. Renoir","Año"=>1937),
"Roma, ciudad abierta" =>
array("Director"=>"R. Rossellini","Año"=>1944),
"Sabrina" =>
array("Director"=>"B. Wilder, "Año"=>1954),
"Vive como quieras" =>
array("Director"=>"F. Capra","Año"=>1938)
);
([indice1]=>elemento1
[indice2]=>elemento2
....................
[indiceN]=>elementoN)
219
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
foreach(array as valor)
Ejemplo 8.6:
La siguiente sentencia recorre todos los elementos de un array y los muestra en la
página:
Cada elemento del array se asigna en cada iteración 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 añadido un
comando <HTML> de cambio de línea de forma que cada nueva iteración comience
a escribir en un nuevo renglón. El resultado sería:
Marlon Brando
Gary Cooper
Cary Grant
James Stewart
Si además de recuperar los elementos del array, se desea también conocer el índice,
tanto en el caso de índices numéricos como en arrays asociativos, se puede utilizar
una sintaxis alternativa del bucle foreach:
Ejemplo 8.7:
Dado el array y el bucle siguientes:
220
ARRAYS
También 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 cuántos elementos existen en el array y cuáles 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 numéricos
consecutivos. Estos problemas pueden salvarse mediante la función
each(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 iteración 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 función
each()toma el valor falso y el ciclo while finaliza.
221
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Por supuesto, también es posible utilizar estas estructuras iterativas anidadas para
recorrer arrays multidimensionales.
Ejemplo 8.9:
$peliculas=array(
"La costilla de Adán" =>
array("Director"=>"G. Cukor","Año"=>1949),
"La gran ilusión" =>
array("Director"=>"J. Renoir","Año"=>1937),
"Roma, ciudad abierta" =>
array("Director"=>"R. Rossellini","Año"=>1944),
"Sabrina" =>
array("Director"=>"B. Wilder","Año"=>1954),
"Vive como quieras" =>
array("Director"=>"F. Capra","Año"=>1938)
);
foreach($peliculas as $indice => $titulo){
echo "Datos de $indice:<BR>\n";
foreach($titulo as $indice => $valor){
echo "   $indice: $valor <BR>\n";
}
}
222
ARRAYS
Ejemplo 8.10:
A continuación se define una función de creación de tablas. Toma como argumento
un array bidimensional, que se asume indexado numéricamente con valores
0,1,2,..., y muestra todos sus elementos en una tabla HTML. La función también
recibe como argumentos un array con los rótulos 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> </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>";
}
223
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
<?php
include("funciones.php");
echo "<H2>Cálculo 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));
// Generación de los arrays de cabeceras
$cabecera = array();
for($i=0;$i<count($datos[0]);$i++){
$aux = $i+1;
$cabecera[$i] = "Ciudad $aux";
}
// Construcción de la tabla
crearTabla($datos,$cabecera,$cabecera);
// Determinación de la ruta
$ruta = array(1,3,5,1);
$suma = 0;
// Generación de una lista con los datos de cada etapa
echo "<UL>";
for($i=0;$i<count($ruta)-1;$i++){
$aux1 = $ruta[$i];
$aux2 = $ruta[$i+1];
$distancia = $datos[$aux1-1][$aux2-1];
224
ARRAYS
$suma += $distancia;
echo "<LI>De la ciudad $aux1 a la
ciudad $aux2: $distancia kilómetros";
}
echo "<B>Distancia total: $suma kilómetros</B>";
echo "</UL>";
?>
Ejemplo 8.11:
El siguiente fragmento de código:
225
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
8.3.2. SUBDIVISIÓN
Ejemplo 8.12:
El siguiente código:
$oeste = array(
"Solo ante el peligro","Fred Zinnemann","Gary Cooper",
"Raíces 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 "    $indice-> $valor <BR>";
}
}
da lugar a la salida:
0->
0-> Solo ante el peligro
1-> Fred Zinnemann
2-> Gary Cooper
1->
0-> Raíces profundas
1-> George Stevens
2-> Alan Ladd
2->
226
ARRAYS
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);
0->
0-> Solo ante el peligro
1-> Fred Zinnemann
2-> Gary Cooper
1->
3-> Raíces profundas
4-> George Stevens
5-> Alan Ladd
2->
6-> Horizontes de grandeza
7-> William Wyler
Ejemplo 8.13:
227
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
$c = array_count_values($a1);
foreach($c as $indice=>$valor)
echo "$indice: $valor <BR>\n";
Ejemplo 8.14:
A continuación se muestra un ejemplo de selección de determinadas películas de
una lista en función de su año de producción. En concreto, se trata de conseguir de
las películas almacenadas, las realizadas desde el año 1960 en adelante:
function año($a){
return($a >= 1960);
}
$selección = array_filter($peliculas,"año");
228
ARRAYS
foreach($seleccion as $indice=>$valor)
echo "$indice: $valor <BR>\n";
Como puede apreciarse, lo primero que se necesita es una función booleana que,
dado un elemento del array, indique si debe ser seleccionado o no. El nombre de
esa función es pasado a array_filter() como segundo argumento. El
resultado final del programa anterior sería:
El apartamento: 1960
Charada: 1963
Doctor Zhivago: 1965
Lawrence de Arabia: 1962
West Side Story: 1961
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 niña",
"Arsénico por compasión","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";
Gary Cooper
Cary Grant
Marlon Brando
229
PHP Y MYSQL. TECNOLOGÍAS 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 películas almacenadas correspondientes al año 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";
El gran dictador
Historias de Filadelfia
Rebeca
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 películas:
$actor="Gary Cooper";
if(array_key_exists($actor,$actores)) {
echo "<B>Películas de $actor:</B><BR>";
foreach($actores[$actor] as $indice=>$valor)
echo "$valor <BR>\n";
}
230
ARRAYS
Ejemplo 8.18:
En el siguiente ejemplo, se diseña una página de manera que cada vez que un
usuario accede a ella obtiene entradas gratis para dos películas de un ciclo de cine:
— 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 más de una vez
dentro del array, solo se obtiene el índice correspondiente a la primera
aparición. El tercer argumento es opcional y corresponde a un valor lógico que
231
PHP Y MYSQL. TECNOLOGÍAS 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.
Ejemplo 8.19:
A partir de tres variables que almacenan los datos de una determinada película,
(título, director y año),
se desea generar un array formado por esos tres elementos e indexados con el
nombre de sus respectivas variables. Esto se podría hacer de dos maneras:
232
ARRAYS
$listaAux=array("pelicula","director","año");
$lista=compact($listaAux);
o bien:
$lista=compact("pelicula","director","año");
Ejemplo 8.20:
A continuación se crean tres variables a partir de los índices de un array dado y se
inicializan automáticamente con los valores correspondientes. Obsérvese que
previamente a la construcción del array y a la llamada a la función extract(),
ya se ha inicializado una variable de nombre idéntico a uno de los índices del array.
233
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
extract($pelicula,EXTR_SKIP);
el resultado sería:
234
ARRAYS
La Tabla 8.2 muestra algunos sencillos ejemplos del uso de esta función.
Ejemplo 8.21:
Las siguientes sentencias permiten apreciar el funcionamiento de esta función:
$a = array(1,2,3,4,5,6);
print_r($a);
print "<br>";
/* inserción de tres nuevos elementos, en sustitución 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>";
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 página de actualización del listado de directores
de los que se tienen películas disponibles.
235
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
236
ARRAYS
— array_pad(array,tamaño_final,elemento_nuevo): prolonga el
array dado con un nuevo elemento, hasta completar el tamaño especificado. La
prolongación se realiza por la derecha o por la izquierda, dependiendo de si el
valor del argumento tamaño_final es positivo o negativo,
respectivamente. El correcto funcionamiento de la operación exige que el
tamaño especificado en el argumento sea mayor que la dimensión del array.
Ejemplo 8.23:
La función array_unique() considera elementos iguales aquellos cuya
representación en forma de cadena es idéntica. Este ejemplo ilustra su
funcionamiento:
$a = array(1,2,"1",3,4,5,"4",6,7,"6",8,6);
$b = array_unique($a);
foreach($b as $indice=>$valor)
echo "$indice: $valor <BR>\n";
237
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
0: 1
1: 2
3: 3
4: 4
5: 5
7: 6
8: 7
10: 8
Ejemplo 8.24:
A continuación se muestra la unión de dos arrays asociativos en los que una de las
claves se repite en ambos.
$peliculas1 = array(
"B. Wilder"=>"Primera plana",
"J. Ford"=>"Río 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);
238
ARRAYS
— array_intersect_assoc(array1,array2,array3,...): devuelve un
array con los elementos comunes a todos los argumentos de la función. En la
comparación se tienen en cuenta los índices.
— array_intersect(array1,array2,array3,...): a diferencia de la
función anterior, en este caso, se realiza la intersección pero los índices de los
elementos no se tienen en cuenta en la comparación.
Ejemplo 8.25:
Dados los siguientes arrays:
Si se realiza la operación:
$c = array_diff_assoc($oeste,$comedia,$drama);
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 función array_dic_assoc() se ejecuta la siguiente
sentencia:
$c = array_diff ($oeste,$comedia,$drama);
239
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
el array $c sería:
("d"=>"G. Stevens")
ya que ahora los tres primeros elementos del array $oeste deberían ser
eliminados al estar repetidos en los otros, aunque los índices o palabras clave
puedan ser iguales.
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 manipulación de cadenas de caracteres que serán estudiadas con más detalle en
el próximo capítulo.
240
ARRAYS
$directoresAbrev = array_map("abreviar",$directores);
// Impresión del resultado
foreach($directoresAbrev as $indice=>$valor){
echo "$indice -> $valor<BR>";
}
D1 -> C. Chaplin
D2 -> S. Donen
D3 -> J. Ford
D4 -> D. Lean
D5 -> V. Minnelli
Ejemplo 8.27:
En el caso de considerar más de un array, la función a aplicar debe tener más de un
argumento. El siguiente programa muestra un ejemplo de esta situación:
function union($a1,$a2){
return("El Óscar del año $a1 es $a2.");
}
$años = array(1940,1945,1951,1955,1960);
$peliculas = array("Rebeca","Días sin huella",
"Un americano en París","Marty",
"El apartamento");
$oscar = array_map("union",$años,$peliculas);
Ejemplo 8.28:
Con la ayuda de la función array_map() es posible construir un array
multidimensional a partir de una serie de arrays unidimensionales. En el siguiente
ejemplo se muestra el proceso:
241
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Ejemplo 8.29:
Dado un array de años, correspondientes a películas dadas como índices, a continuación
se utiliza la función array_walk() para escribir en la página un listado con el título
de cada película junto con su año entre paréntesis. Para ello se define previamente una
función que realiza genera el mensaje correspondiente a cada película, y se pasa como
segundo argumento a array_walk() el nombre de esa función:
function unir($a,$b){
echo "$b, ($a).<BR>";
}
$peliculas = array(
"El apartamento"=>1960,
"Charada"=>1963,
"Doctor Zhivago"=>1965,
"Gigí"=>1958,
"El gran dictador"=>1940,
"Historias de Filadelfia"=>1940,
"El hombre tranquilo"=>1952,
"Lawrence de Arabia"=>1962,
"Rebeca"=>1940
);
242
ARRAYS
array_walk($peliculas,'unir');
El 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).
function unir2($a,$b,$cadena){
echo "$b, $cadena $a.<BR>";
}
la sentencia
243
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Ejemplo 8.30:
Dado el array del Ejemplo 8.29, si se desea que la lista mostrada incluya las
películas en orden cronológico, desde la más actual a la más antigua, podría
realizarse una simple llamada a la función arsort() antes de la llamada a
array_walk(). La ordenación se produce sobre el valor de los elementos del
array, permaneciendo la clave de cada uno inalterada.
arsort($peliculas);
array_walk($peliculas,'unir',"película realizada en ");
Ejemplo 8.31:
Si en el ejemplo anterior se opta por el orden inverso de los índices:
244
ARRAYS
krsort($peliculas);
el resultado sería:
$películas = array(
"Ariane"=>
array("Director"=>"B. Wilder","Año"=>1957),
"La costilla de Adán"=>
array("Director"=>"G. Cukor","Año"=>1949),
"La gran ilusión"=>
array("Director"=>"J. Renoir","Año"=>1937),
245
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
246
ARRAYS
echo "<TR>";
echo "<TD> </TD>";
for($i=0;$i<count($columnasOrdenado);$i++){
echo "<TH>$columnasOrdenado[$i]</TH>";
}
echo "</TR>";
// lista con los títulos que hay que colocar en la tabla
$datos = array_keys($peliculas);
array("Director"=>$columnasOrdenado[$j],
"Año"=>$filas[$i]));
// si hay alguna película se crea la celda con
// los títulos 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 vacía
else
echo "<TD ALIGN=CENTER>"."----------"."</TD>";
}
echo "</TR>";
}
echo "</TABLE>";
247
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
248
FUNCIONES
PREDEFINIDAS
9.1. INTRODUCCIÓN
PHP cuenta con un gran número de funciones predefinidas, más de 700, que
pueden ser usadas en cualquier programa sin necesidad de invocar a ninguna
librería. En el capítulo previo ya han sido presentadas muchas de ellas, en
concreto, las relacionadas con el tratamiento y manipulación de arrays. En este
capítulo se presentarán algunas funciones predefinidas adicionales,
clasificándolas en diversos grupos atendiendo al cometido al que están
destinadas. Se empezará por presentar funciones de manipulación de cadenas de
caracteres, para finalizar con el repaso a las funciones de fechas y horas, y una
lista de funciones matemáticas. En capítulos posteriores del libro se presentarán
nuevas funciones, como son las relacionadas con ficheros y directorios,
funciones de conectividad a base de datos,...
249
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
250
FUNCIONES PREDEFINIDAS
— 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 actúan de igual forma.
Ejemplo 9.1:
La sentencia
Ejemplo 9.2:
En el siguiente programa, dado un array de arrays, se aplica la función implode() a
cada uno de sus elementos para obtener una serie de cadenas de caracteres.
$peliculasMusicales=array(
array("Un americano en París","V. Minnelli",1951),
array("Hello,Dolly!","G. Kelly",1968),
array("¡Qué noche la de aquel día!","R. Lester",1964));
foreach($peliculasMusicales as $pelicula){
$p = implode("--->",$pelicula);
print "$p<BR>";
}
251
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Ejemplo 9.3:
Dada la siguiente cadena:
la sentencia
str_word_count($cadena);
str_word_count($cadena,1);
([0] => Bienvenido, [1] => a, [2] => nuestro, [3] => cine)
str_word_count($cadena,2);
([0] => Bienvenido, [11] => a, [13] => nuestro, [21] => cine)
252
FUNCIONES PREDEFINIDAS
Ejemplo 9.4:
Considérese 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 código
necesario sería el siguiente:
Si como longitud se indica 30, 3 más que la inicial, aunque la nueva cadena aporte
8 caracteres, se truncará en 3, repartidos a izquierda y derecha. Así, el código:
genera la cadena:
253
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Ejemplo 9.5:
La sentencia:
echo str_repeat("oOoxXx",5);
oOoxXxoOoxXxoOoxXxoOoxXxoOoxXx
Ejemplo 9.6:
Dadas las variables
la sentencia
— substr_replace(cadena,reemplazar,posición,longitud): dada
una cadena inicial se obtiene una nueva cadena como resultado de reemplazar
la porción delimitada por los argumentos posición y longitud, por el
254
FUNCIONES PREDEFINIDAS
Ejemplo 9.7:
Dadas las cadenas
substr_replace($cadena,$nombreCliente,25,1);
substr_replace($cadena,$nombreCliente,25,-41);
substr_replace($cadena,$nombreCliente,-42,1);
substr_replace($cadena,$nombreCliente,-42,-41);
255
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
— strnatcasecmp(cad1,cad2) y strnatcmp(cad1,cad2):
comparan cadenas alfanuméricas teniendo en cuenta el orden alfabético
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 mayúsculas y minúsculas.
Ejemplo 9.8:
La comparación de cadenas alfabéticas como las siguientes da el mismo resultado
independientemente de la función de comparación empleada:
256
FUNCIONES PREDEFINIDAS
— stristr(cadena,fragmento) y strstr(cadena,fragmento):
devuelven la cadena dada desde la primera aparición de un carácter o
fragmento determinado. Si el fragmento no se encuentra, se obtiene el valor
booleano FALSE. La diferencia entre ambos métodos es que el primero no
distingue entre mayúsculas y minúsculas.
— strpos(cadena,fragmento,inicio_búsqueda): se obtiene la
posición correspondiente a la primera aparición de un fragmento determinado
dentro de una cadena dada. Como tercer argumento opcionalmente se puede
indicar la posición a partir de la cual iniciar la búsqueda.
Ejemplo 9.9:
Dada la cadena:
257
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Ejemplo 9.10:
El siguiente código fragmenta una cadena dada considerando como delimitador la coma:
258
FUNCIONES PREDEFINIDAS
echo strtok($p,',');
echo "<BR>";
// $i cuenta el número de comas leídas
$i = 1;
// número 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++;
}
En PHP cualquier instante de tiempo viene determinado por un número entero que
representa el número de segundos transcurridos desde las 00:00 del día 1 de enero
de 1970; así por ejemplo, la función que calcula el instante de tiempo actual,
función time(), devuelve en realidad un número entero. Por supuesto, es posible
trabajar con fechas y horas en formatos más sencillos para el usuario, para ello
PHP dispone de la función mktime() que permite generar instantes de tiempo y
la función date() para convertir el instante de tiempo en una cadena de
caracteres siguiendo un formato preestablecido.
259
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
260
FUNCIONES PREDEFINIDAS
Ejemplo 9.11:
El siguiente programa genera una página de bienvenida en la que se muestra la
fecha local del servidor con el formato escogido en el correspondiente argumento
de la función date():
Ejemplo 9.12:
Si se quiere mostrar el mes en curso, basta la siguiente línea de código:
print(date("M"));
261
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Sin embargo, si se quiere mostrar un mes del año, distinto al actual, se debe añadir
como segundo argumento de la función date() una llamada a la función
mktime() con los argumentos adecuados: en este caso, basta indicar el número
de mes y un día del mes, (el 1, por ejemplo):
print(date("M",mktime(0,0,0,1,1,0)));
Ejemplo 9.13:
Si se desea averiguar el día de la semana correspondiente al 2 de marzo de 1972 se
podría escribir la siguiente línea de código:
print(date("w",mktime(0,0,0,3,2,1972)));
Ejemplo 9.14:
Mediante el siguiente programa se generará el calendario del mes en curso en el
momento de acceder a una página dada, incluyendo además 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.
262
FUNCIONES PREDEFINIDAS
— Datos.php: fichero de datos generales, que almacena dos arrays con los
nombres de los meses y de los días y variables relacionadas con la fecha en
curso. También implementa la función crearCalendario(), que permite
construir el calendario de un mes y año dados. Toda esta información será
añadida en los restantes ficheros con la sentencia include.
— Calendario.php: construye el calendario del mes en curso en el momento de
acceder a la página 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.
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");
$añoActual = date("Y");
$mesActual = date("n");
$mesActualTr = $meses[$mesActual-1];
$diaActual = date("j");
function crearCalendario($mes,$año,$fechaActual){
$nummes = array_search($mes,$GLOBALS["meses"])+1
$diasemana=date("w",mktime(0,0,0,$nummes,1,$año));
if($diasemana==0)
$diasemana=7;
$diasMes= date("t",mktime(0,0,0,$nummes,1,$año));
// cabeceras de la tabla
for($i=0;$i<=6;$i++){
263
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
echo "<TH>".$GLOBALS["semana"][$i]."</TH>";
}
echo "</TR>";
Como puede apreciarse, este fichero comienza con las definición de dos arrays,
que almacenan los nombres de los meses y de los días de la semana, y cuatro
264
FUNCIONES PREDEFINIDAS
Fichero Calendario.php
<?php
include("Datos.php");
crearCalendario($mesActualTr,$añoActual,true);
$mesAnt = "MesAnterior.php";
$mesSig = "MesSiguiente.php";
echo "<BR><A HREF=$mesAnt>Mes anterior</A> <BR>
<A HREF=$mesSig>Mes próximo</A>";
?>
265
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Fichero MesAnterior.php
<?php
include("Datos.php");
if($mesActual==1){
$aux = 11;
$año = $añoActual-1;
}
else{
$aux = $mesActual-2;
$año = $añoActual;
}
crearCalendario($meses[$aux], $año, false);
?>
Fichero MesSiguiente.php
<?php
include("Datos.php");
if($mesActual==12){
$aux = 0;
$año = $añoActual+1;
}
else{
$aux = $mesActual;
$año = $añoActual;
}
crearCalendario($meses[$aux], $año, false);
?>
Estos dos últimos ficheros cargan de nuevo todos los datos y lo único que realizan
es una modificación de las variables que identifican al mes en curso. Una vez
modificadas esas variables se procede a efectuar la llamada a la función de
creación del calendario.
266
FUNCIONES PREDEFINIDAS
Función Descripción
abs(n) Obtiene el valor absoluto de un entero o en coma flotante.
round(n) Redondea a entero un número dado.
ceil(n) Obtiene el valor entero superior más próximo a n.
floor(n) Obtiene el valor entero inferior más próximo 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 número determinado de
min(array) argumentos numéricos o de los elementos de un array.
Si alguno de estos números es decimal, el resultado
también tendrá este formato.
max(n1,n2,…) Obtiene el mayor valor de un número determinado de
max(array) argumentos numéricos o de los elementos de un array.
Si alguno de estos números es decimal, el resultado
también tendrá este formato.
pow(a,b) Se calcula el valor de la potencia ab.
rand(mín,máx) Si no toman argumentos, estas funciones devuelven
mt_rand(mín,máx) un valor aleatorio entre 0 y RAND_MAX. En caso
contrario, se obtiene un número aleatorio entre mín y
máx. El valor RAND_MAX es una cota superior entera
definida por el sistema, que se puede obtener con una
llamada a la función mt_getrandmax().
sqrt(a) Raíz cuadrada de a.
267
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
268
PROGRAMACIÓN
ORIENTADA A
OBJETOS
10.1. INTRODUCCIÓN
Los dos elementos básicos de todo lenguaje de programación 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 programación
estructurada tradicional ambos elementos básicos se encuentran perfectamente
diferenciados, definiendo las variables por un lado y las funciones por otro.
269
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Los objetos definidos son elementos dinámicos, en todo momento tienen un estado
(determinado por los valores de sus variables) y un comportamiento (determinado
por sus métodos).
Ejemplo 10.1:
Piénsese en la gestión de un cine; en un cine se maneja información sobre
películas, proyecciones, clientes,... En definitiva, se podría pensar en diferentes
objetos con diferentes características (variables) y diferentes acciones (métodos)
que pueden realizar cada uno:
— Cada objeto película tendrá asociadas cuatro variables que indicarán el título,
el director, la lista de actores y el año de producción. Además tendrá un
método que permitirá generar la ficha artística de la película (véase Figura
10.1).
— Cada objeto proyección tendrá asociadas tres variables que indicarán el día y la
hora de la proyección, y la película a proyectar. Un método del objeto permitirá
asignar una película a la proyección (véase Figura 10.2).
— Cada objeto cliente tendrá asociadas tres variables que indicarán el nombre y la
edad del cliente y la lista de proyecciones para las que ha adquirido una
entrada. Además de sus variables, un cliente también dispondrá de un método
que le permitirá adquirir una entrada para una proyección (véase Figura 10.3).
270
PROGRAMACIÓN ORIENTADA A OBJETOS
PELÍCULA
VARIABLES: MÉTODO:
• Título • Generar ficha
• Director
• Actores
• Año
PROYECCIÓN
VARIABLES: MÉTODO:
• Día • Asignar película
• Hora
• Película
CLIENTE
VARIABLES: MÉTODO:
• Nombre • Adquirir entrada
• Edad
• Lista proyecciones
271
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
CINE
VARIABLES: MÉTODOS:
• Día del espectador • Buscar cliente
• Tarifa normal • Calcular importe
• Tarifa reducida • Crear proyección
• Proyecciones • Crear cliente
• Clientes
Por último, los objetos podrían disponer de métodos específicos para acceder a sus
variables, tanto para consultar como para cambiar sus valores. Además, los objetos
suelen disponer de métodos, denominados constructores, que son llamados cuando
se crea el objeto.
272
PROGRAMACIÓN ORIENTADA A OBJETOS
class NombreClase {
var
variables de la clase
métodos
}
Ejemplo 10.2:
A continuación se presenta el esquema de las clases de objetos que fueron
presentados en el Ejemplo 10.1. En esta primera aproximación se incluye
únicamente la definición de las variables de cada clase y la declaración de los
métodos; posteriormente se añadirá la implementación completa de estos últimos.
class Pelicula {
var $titulo,
$director,
$actores,
$año;
// implementación de métodos
function generar_ficha() {
}
}
class Proyeccion {
var $dia_hora;
var $pelicula;
// implementación de métodos
function asignar_pelicula($p) {
}
}
class Cliente {
var $nombre;
var $edad;
var $lista_proyecciones;
273
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
// implementación de métodos
function adquirir_entrada($proy) {
}
}
class Cine {
var $dia_espectador,
$tarifa_normal,
$tarifa_reducida,
$lista_proyecciones,
$lista_clientes;
// implementación de métodos
function calcular_importe($c,$proy) {
function crear_proyeccion($t,$p) {
function crear_cliente($n,$e) {
function buscar_cliente($c) {
}
}
274
PROGRAMACIÓN ORIENTADA A OBJETOS
10.2.1. CONSTRUCTORES
Las clases definen el prototipo de los objetos, definiendo sus métodos y declarando
sus variables; pero, ¿cómo se inicializan estas variables? Entran aquí en juego dos
nuevos elementos: la variable $this y el constructor de la clase.
Ejemplo 10.3:
La creación de un objeto de la clase Pelicula exige el aportar la información
necesaria para ese objeto, en este caso concreto, esa información 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->año = $a;
}
Obsérvese cómo la sintaxis, para acceder a las variables del objeto, exige indicar el
nombre de la variable a continuación de -> pero sin el signo $.
Esta misma sintaxis puede ser utilizada dentro de cualquier otro método para
acceder a las variables del objeto. Por ejemplo, a continuación se incluye la
definición completa de la clase Pelicula, incluyendo el método que genera su
ficha artística:
class Pelicula {
var $titulo,
$director,
$actores,
$año;
275
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
// constructor
function Pelicula($t,$d,$as,$a){
$this->titulo = $t;
$this->director = $d;
$this->actores = $as;
$this->año = $a;
}
// implementación de métodos
function generar_ficha() {
print "<H3> $this->titulo ($this->año)</H3>";
print "Dirigida por $this->director y
protagonizada por:<BR>";
foreach($this->actores as $ac)
print "$ac <BR>";
}
}
class Cliente {
var $nombre;
var $edad;
var $lista_proyecciones;
// constructor
function Cliente($n,$e){
$this->nombre = $n;
$this->edad = $e;
$this->lista_proyecciones = array();
}
// implementación de métodos
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 métodos para realizar esa asignación
posteriormente, tal como ocurre en la clase Proyeccion:
276
PROGRAMACIÓN ORIENTADA A OBJETOS
class Proyeccion {
var $dia_hora;
var $pelicula;
// constructor
function Proyeccion($t){
$this->dia_hora = $t;
}
// implementación de métodos
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 podría 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();
}
277
PHP Y MYSQL. TECNOLOGÍAS 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 podría crear un nuevo objeto de la clase Pelicula con la sentencia:
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 película.
Ejemplo 10.5:
Dado el objeto $p creado en el Ejemplo 10.4, se podría efectuar una llamada
$p->generar_ficha();
278
PROGRAMACIÓN ORIENTADA A OBJETOS
Ejemplo 10.6:
Para completar la definición de las clases del Ejemplo 10.1, se incluye a
continuación la definición de la clase Cine, con la implementación de todos sus
métodos.
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();
}
// implementación de métodos
function calcular_importe($c,$proy) {
// obtención del dia de la semana de la proyección
$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) {
// búsqueda del nombre en el array de clientes
279
PHP Y MYSQL. TECNOLOGÍAS 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
continuación se incluye un sencillo programa que crea diferentes objetos de las
clases anteriores y realiza con ellos las acciones que permiten sus métodos.
include "clases.php";
280
PROGRAMACIÓN ORIENTADA A OBJETOS
10.4. HERENCIA
La programación orientada a objetos tiene por objetivo la estructuración de los
programas en clases; cada clase describe las características generales que un objeto
debe poseer. A partir de las clases definidas es posible también diseñar 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 métodos) de la superclase. Sin embargo, la verdadera utilidad de las
subclases es el permitir a estas la definición de nuevas variables, la modificación de
los métodos heredados o la implementación de nuevos métodos.
Ejemplo 10.8:
Sobre el esquema de clases presentado en el Ejemplo 10.1 se podrían realizar
algunas modificaciones. En primer lugar se podrían definir varias subclases que
permitan clasificar las películas que el cine gestiona en función de su género
(Figura 10.5). Así por ejemplo, las comedias constituyen una subclase de películas;
lo que significa que toda comedia tiene las características generales de una
película, pero puede tener características propias de este género.
281
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
PELÍCULA
CLIENTE
VARIABLES: MÉTODO:
• Nombre • Adquirir entrada
• Edad
• Lista proyecciones
SOCIO
282
PROGRAMACIÓN ORIENTADA A OBJETOS
métodos de la subclase
}
Ejemplo 10.9:
La definición de las subclases plateadas en el Ejemplo 10.8 serían:
// constructor
function Socio($n,$e,$num){
$this->nombre = $n;
$this->edad = $e;
283
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
$this->lista_proyecciones = array();
$this->num_socio = $num;
$this->puntos = 0;
}
// implementación de métodos
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 características
de la clase general Cliente (nombre, edad y lista_proyecciones), pero
además poseen dos nuevos atributos: num_socio y puntos. Cuentan también
con el mismo método adquirir_entrada(), pero definido de nuevo,
adaptándose así a las características 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 también un nuevo método, canjear_regalo(),
que será propio de los objetos de esta nueva clase.
284
COOKIES
Las cookies no fueron diseñadas para espiar o invadir la privacidad de los usuarios
de Internet, su principal objetivo es identificar al usuario y poder de esta manera
preparar páginas personalizadas. Son muy prácticas también para almacenar
información como el número de visitas, preferencias, estado de conexión y, en
general, información que sirva para realzar la navegación del cliente y permita
simular una conexión continua. Por ejemplo, gracias a las cookies el usuario podría
continuar la navegación por un sitio web en el último punto en el que lo dejó en su
última conexión.
285
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
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 función anterior debe
ser colocado delante de cualquier comando HTML.
setcookie(nombre)
286
COOKIES
Ejemplo 11.1:
Supóngase 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 páginas del servidor.
<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>
<?php
if (isset($nombre))
setcookie("nomusuario", $nombre);
?>
<HTML>
<HEAD><TITLE>Confirmación</TITLE></HEAD>
<BODY> Muchas gracias por registrarte.
</BODY>
</HTML>
287
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Obsérvese que el script PHP que tiene la definición de la cookie está colocado antes de
cualquier comando HTML, incluso antes del comando <HTML>. Además se utiliza la
función 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.
También es posible definir varias cookies bajo un nombre común, es decir, definir
arrays de cookies. Para ello se utiliza la notación habitual de definición de arrays
en PHP.
Ejemplo 11.2:
Imagínese que se desea guardar en un array de cookies las últimas películas vistas
por cada cliente de Cinem@s, las cookies podrían ser generadas de la siguiente
manera:
En este caso, cuando se recupere el valor de estas tres cookies, se obtendrá una
variable de tipo array y de nombre $peliculas.
Ejemplo 11.3:
Supóngase 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 página del servidor;
288
COOKIES
esta nueva página 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, regístrese";
?>
<TABLE>
.............
.............
.............
</TABLE>
</BODY>
</HTML>
Ejemplo 11.4:
En este nuevo ejemplo los procesos de generación y de recuperación de la cookie
tienen lugar en la misma página. Imagínese, que interesa en todo momento conocer
la fecha y hora del último acceso de cada cliente a la página; esto podría realizarse
fácilmente con ayuda de una cookie que se almacene en cada cliente. El código
completo de la página sería:
<?php
$v = date("d/m/Y \a \l\a\s H:i");
setcookie("visita", $v, time()+30*24*3600);
?>
<HTML>
<HEAD><TITLE>Página de inicio</TITLE></HEAD>
<BODY>
<H1>Bienvenido a nuestra página</H1>
<?php
if (isset($visita))
echo "La última vez que nos visitaste fue el $visita";
289
PHP Y MYSQL. TECNOLOGÍAS 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 código. En el segundo
script se utiliza esa cookie para escribir en la página el momento de ese último
acceso.
Cuando un cliente accede a una página, el servidor solicita los valores de todas las
cookies antes de realizar cualquier otra operación, una vez recibidos esos valores
comienza a procesar la página. Este hecho hace que la cookie generada en el
primer script no será visible hasta la siguiente carga de la página, 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:
$micookie
$HTTP_COOKIE_VARS["micookie"]
290
COOKIES
foreach($HTTP_COOKIE_VARS as $c) {
echo "$c <BR>";
}
while (list($n,$v)=each($HTTP_COOKIE_VARS)) {
echo "$n = $v <BR>";
}
A partir de la versión PHP 4.1.0 también se dispone del array de cookies definidas
en otra variable global de nombre $_COOKIE.
Si se desea que la cookie permanezca en el equipo del usuario cuando este cierre la
sesión, deberá indicarse en su construcción un parámetro adicional con un periodo
de expiración. 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
automáticamente desaparecerá.
setcookie(nombre,valor,expiracion)
291
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Para borrar una cookie que tiene establecido un valor con periodo de expiración
antes de que dicho periodo finalice, debe utilizarse la sintáxis:
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 página. El programa
comprobará si han transcurrido más de 7 días 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 más de una semana que no nos
visitabas"
?>
<HTML>
<HEAD><TITLE>Página de inicio</TITLE></HEAD>
<BODY>
<H1>Bienvenido a nuestra página</H1>
....................................
....................................
....................................
</BODY>
</HTML>
292
COOKIES
Ejemplo 11.7:
En este nuevo programa se utilizará una cookie para generar un contador de
accesos individuales de cada usuario. El número 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>Página de inicio</TITLE></HEAD>
<BODY>
<H1>Bienvenido a nuestra página</H1>
<?php
echo "Esta es tu visita nº $nvis";
?>
....................................
....................................
</BODY>
</HTML>
293
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
294
MANEJO DE
FICHEROS
295
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
fopen(Nombrefichero, ModoApertura)
El nombre del fichero se indicará con la ruta relativa de acceso desde la página que
incorpora el script.
296
MANEJO DE FICHEROS
Ejemplo 12.1:
Si el fichero es abierto con la siguiente sentencia:
$f = fopen("Datos.txt", "r");
$f = fopen("Pruebas/comentarios.txt", "a");
Una vez abierto un fichero se realizarán 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 función que recibe como argumento el identificador de
fichero que se genera en la operación de apertura. Esta función es:
fclose(idfichero)
De esta manera, la estructura básica de todo programa que trabaje con ficheros
sería:
297
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
$f = fopen("mifichero.txt", "a");
..........................
..........................
fclose($f);
fgets(idfichero)
Para saber si el apuntador interno del fichero ha alcanzado el final se puede utilizar
la función booleana feof().
Ejemplo 12.2:
El siguiente programa realiza una lectura línea a línea del contenido de un fichero
de texto y lo escribe en la propia página web:
<?php
$f = fopen ("datos.txt","r");
while(!feof($f)){
$linea=fgets($f);
print $linea."<BR>";
}
fclose($f);
?>
298
MANEJO DE FICHEROS
fgets(idfichero, n+1)
Con esta sintaxis la función leería, a partir del apuntador interno del fichero, n
caracteres o hasta alcanzar un fin de línea, lo que antes ocurra.
fread(idfichero, n)
Esta función lee n caracteres del fichero o hasta alcanzar el fin del fichero (lo que
antes ocurra).
filesize(nombrefichero)
Ejemplo 12.3:
Si se desea transferir el contenido completo del fichero a una variable en un
programa PHP se podrían 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 operación PHP
dispone también de la función file(). Una ventaja de esta función es que no
necesita realizar la apertura previa del fichero con fopen() ni el cierre con
fclose(). La función devuelve directamente una array de cadenas de caracteres
con cada una de las líneas del fichero.
299
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Ejemplo 12.4:
El siguiente programa utiliza la función file() para hacer una lectura completa
de un fichero en una sola operación, y posteriormente recorre el array resultante
para mostrar su contenido en la página:
<?php
$contenido = file('datos.txt');
foreach($contenido as $linea) {
print $linea;
print "<BR>";
}
?>
fgetc(idfichero)
Ejemplo 12.5:
El siguiente programa realiza una lectura completa del fichero y copia en la página
ú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);
?>
300
MANEJO DE FICHEROS
fscanf(idfichero,formato)
fscanf(idfichero,formato,variables)
Las cadenas de formato de lectura incluyen una serie de codificaciones que señalan
el tipo de dato a leer. En concreto, los códigos de formato son los que se muestran
en la siguiente tabla:
Ejemplo 12.6:
Supóngase que Cinem@s dispone de un fichero de texto en el que guarda
información 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 podría ser:
Como puede apreciarse este fichero está constituido por diferentes líneas en las que
se muestra para cada cliente su nombre, su edad y el gasto total separados por
301
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
tabulaciones. La lectura de los datos necesita conocer esta estructura para poder
leer en cada operación 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 años 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 continuación 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
función fscanf() para que lea, en este orden, una cadena de caracteres, un
tabulador, un número entero, otro tabulador y un número en coma flotante (cadena de
formato "%s\t%d\t%f"). Los tres valores leídos serán almacenados en el array de
nombre $datos. Cuando se alcance el final del fichero, y por tanto no existan más
datos a leer, la función fscanf() devolverá un valor booleano falso y por tanto el
bucle de lectura finalizará.
Dentro del cuerpo del bucle se utiliza la función 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 sería una lista como la siguiente:
302
MANEJO DE FICHEROS
Ejemplo 12.7:
Utilizando esta sintaxis alternativa, el programa del Ejemplo 12.6 podría 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 años ha realizado " .
" un gasto total de $gasto euros. <BR>";
}
print "</UL>";
fclose($f);
?>
fwrite(idfichero, cadena)
fwrite(idfichero, cadena, numCaracteres)
303
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Ejemplo 12.8:
Programa que genera un fichero de texto con los 100 primeros números 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 podría
crear en una página un sencillo contador de accesos. Bastaría con generar un
fichero de texto cuyo contenido inicial sea el valor 0 e incluir el siguiente programa
en la página correspondiente:
<?php
$f = fopen("contador.txt","r+");
$c = fgets($f);
$c++;
rewind($f);
fwrite($f,$c);
fclose($f);
print "Número de visitas de esta página: $c";
?>
Para comenzar se debería diseñar un formulario HTML a través del cual el usuario
hará sus comentarios. El formulario puede estar formado por una simple área de
texto y un botón de envío.
304
MANEJO DE FICHEROS
El aspecto final del formulario podría ser el que se muestra en la Figura 12.1 y su
código:
<html>
<head><title>Comentarios</title></head>
<body>
Por favor, ayúdenos 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>
<?php
$f=fopen("Comentarios.txt","a");
fputs($f,"-------------------\n");
$fecha = date("d/m/Y");
fputs($f,"Fecha: $fecha \n");
305
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
-------------------
Fecha: 12/10/2004
Comentario:
Deberían hacer un esfuerzo por mejorar la limpieza de los
aseos
-------------------
Fecha: 14/10/2004
Comentario:
La verdad es que todo ha estado perfecto. Enhorabuena!!!
copy(nombreOrigen, nombreDestino)
Los argumentos que recibe esta función 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) deberán indicarse los nombres
de los ficheros con sus respectivas rutas relativas. Cuando el fichero destino ya
existe, la operación de copiado borrará el fichero existente.
Ejemplo 12.10:
Para realizar una copia de seguridad de un fichero cuyo nombre se encuentre en la
variable $nfichero, se podría utilizar la sentencia:
if (copy($nfichero, $nfichero.'.bak')) {
print ("Copia de seguridad realizada correctamente");
} else {
306
MANEJO DE FICHEROS
rename(nombreAntiguo, nombreNuevo)
unlink(nombreFichero)
file_exists(nombreFichero)
Ejemplo 12.11:
El siguiente formulario incluye uno de estos campos al que se le ha dado el nombre
fichero:
<FORM ENCTYPE="multipart/form-data"
307
PHP Y MYSQL. TECNOLOGÍAS 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, además del campo de tipo file, el formulario incluye un
campo oculto que permite indicar el tamaño máximo de los ficheros que se
permitirá al usuario enviar (MAX_FILE_SIZE).
<?php
print "Fichero recibido";
rename($fichero,$fichero_name);
?>
308
BASES DE DATOS
RELACIONALES Y EL
LENGUAJE SQL
13.1. INTRODUCCIÓN
Las bases de datos constituyen hoy en día los elementos clave sobre los que se
apoyan los sistemas de información de empresas e instituciones. Una base de datos
podría definirse como una colección de datos interrelacionados que son
almacenados en un soporte informático. Algunas razones que justifican su uso son
su capacidad para almacenar grandes volúmenes de información, la optimización
de su gestión, la facilidad para realizar consultas y la exactitud, rapidez y fiabilidad
en su administración.
309
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Ejemplo 13.1:
Un banco podría almacenar la información sobre sus clientes y los saldos en sus
cuentas bancarias mediante dos simples tablas:
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 común entre las dos tablas (Nº cuenta) es el que permite
relacionar los clientes con sus cuentas. Además, lo normal es que cada tabla tenga
un atributo o conjunto de atributos cuyo valor identifique de forma única a los
registros, este atributo es el que se denomina clave. En el caso de la tabla de
310
BASES DE DATOS RELACIONALES Y EL LENGUAJE SQL
clientes, el atributo DNI es una clave, ya que es imposible que dos clientes distintos
tengan el mismo DNI.
En la definición 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 situación bastante simplificada que, por supuesto,
tiene algunos inconvenientes que podrían ser superados con una mejor elección de
tablas. Por ejemplo, con el diseño anterior, cuando un cliente tiene más de una
cuenta, tal como ocurre en este caso, se duplican sus datos. La utilización de una
tabla intermedia que sirva de enlace entre los DNI y los números de cuenta evitaría
este problema. En definitiva, el correcto diseño de una base de datos no es algo
trivial y requiere una cuidadosa planificación. A este respecto existe una teoría
bastante desarrollada sobre el diseño de bases de datos para evitar las redundancias
e inconsistencias: la teoría de la normalización. No es el objetivo de este libro
profundizar en aspectos de diseño de bases de datos, aquel lector que esté
interesado en estos temas puede acudir a la amplia bibliografía específica.
311
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
1. Las películas.
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 película
tiene un título, un director, una lista de actores, un género, un año de realización,...
A cada atributo se le asignará un tipo de datos concreto, así por ejemplo, el título
de una película puede ser tratado como una cadena de un máximo de 50 caracteres,
o el año como un número 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 relación se concretará
en la inclusión 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.
312
BASES DE DATOS RELACIONALES Y EL LENGUAJE SQL
Los atributos que en cada tabla aparecen señalados con las siglas PK (Primary
Key) corresponden a las claves de cada una de ellas. En cambio, los señalados con
FK (Foreign Key) corresponden a atributos que son claves en otras tablas (claves
foráneas) 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 Películas), Tabla 13.2 (entidad Proyecciones), Tabla 13.3
(entidad Salas), Tabla 13.4 (entidad Entradas) y Tabla 13.5 (entidad Clientes).
313
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
ENTIDAD PELÍCULAS
Nombre de atributo Tipo de datos Descripción
IDPELICULA Valor numérico que actuará de
Número entero
identificador de cada película
TITULO Cadena de caracteres Título de la película
ACTORES Listado de actores de la película que se
Cadena de caracteres
presentarán separados por comas
PRODUCCION Productor, o productores, en su caso, de
Cadena de caracteres
la película
DIRECCION Cadena de caracteres Director o directores de la película
GUION Cadena de caracteres Guionista o guionistas de la película
ANNO Número entero Año de realización de la película
DURACION Número entero Duración de la película en minutos
NACIONALIDAD Cadena de caracteres Nacionalidad de la película
Género de la película elegido entre una
GENERO Cadena de caracteres serie de opciones predeterminadas:
drama, comedia, acción....
Opción 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 película
CARTELERA Imagen del cartel promocional de la
Imagen
película
Tabla 13.1 Atributos de la entidad Películas
ENTIDAD PROYECCIONES
Nombre de atributo Tipo de datos Descripción
IDPROY Valor numérico que actuará de
Número entero
identificador de cada proyección
IDPELICULA Valor numérico que identifica la
Número entero
película que se proyectará
NUM_SALA Número de la sala en donde se
Número entero
proyectará la película
HORA Hora Hora de inicio de la proyección
FECHA Fecha Fecha de la proyección
Indica si la proyección tiene o no una
TARIFA_REDUCIDA Lógico(verdadero/falso) tarifa reducida, por ejemplo, sesiones
matinales, proyecciones especiales,...
ESTRENO Indica si la proyección es emitida como
Lógico(verdadero/falso)
estreno o no
Tabla 13.2 Atributos de la entidad Proyecciones
314
BASES DE DATOS RELACIONALES Y EL LENGUAJE SQL
ENTIDAD SALAS
Nombre de atributo Tipo de datos Descripción
NUM_SALA Valor numérico identificativo de cada
Número entero
sala
AFORO Número entero Número total de asientos de la sala.
NUM_FILAS Número entero Número total de filas de la sala
Cadena de caracteres que permitirá
OBSERVACIONES Cadena de caracteres almacenar cualquier tipo de observación
sobre la sala
Tabla 13.3 Atributos de la entidad Salas
ENTIDAD ENTRADAS
Nombre de atributo Tipo de datos Descripción
NUM_ENTRADA Valor numérico que actuará de
Número entero
identificador de cada entrada
IDPROY Valor numérico que identifica la
Número entero
proyección correspondiente
FILA Número entero Número de fila de la entrada
NUM_ASIENTO Número entero Número de asiento de la entrada
NUM_CLIENTE Valor numérico que identifica al cliente
Número entero
que compra la entrada
315
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
13.4.1. INTRODUCCIÓN
SQL es un lenguaje de definición y manipulación de datos para bases de datos
relacionales. Es un lenguaje de definición porque permite definir la estructura de
las tablas que componen la base de datos, y de manipulación porque permite
efectuar consultas y realizar operaciones como inserción, borrado y actualización
de los datos que contiene.
316
BASES DE DATOS RELACIONALES Y EL LENGUAJE SQL
El primer objeto a crear es la propia base de datos, para ello se utilizará el siguiente
comando:
Ejemplo 13.2:
Para crear la base de datos de la empresa Cinem@s que se utilizará a lo largo de los
próximos capítulos, la sentencia es la siguiente:
317
PHP Y MYSQL. TECNOLOGÍAS 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 sería:
Creación de tablas
Una vez creada la base de datos, el paso siguiente es la creación de la estructura de
cada una de sus tablas.
donde:
318
BASES DE DATOS RELACIONALES Y EL LENGUAJE SQL
Ejemplo 13.3:
El código SQL que crea la tabla de la base de datos Cinem@s correspondiente a la
entidad Clientes sería:
En el código anterior puede observarse cómo cada atributo tiene asociado un tipo
de dato; por ejemplo, el atributo NOMBRE será una cadena de un máximo de 40
caracteres (VARCHAR(40)), el atributo NUM_CLIENTE tendrá un valor numérico
de tipo entero en un rango pequeño (SMALLINT), o la fecha de nacimiento tendrá
un valor de tipo fecha (DATE). En el capítulo destinado al estudio del sistema
gestor MySQL se presentarán con detalle todos los tipos de datos admitidos.
319
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
atributo este tomará el valor por defecto. Tal como se aprecia en la definición 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.
Ejemplo 13.4:
A continuación se incluye el código SQL completo de generación de todas las
tablas de la base de datos CINEMAS:
320
BASES DE DATOS RELACIONALES Y EL LENGUAJE SQL
Modificación de tablas
Una vez creada una tabla, es posible su modificación utilizando la sentencia
ALTER.
Ejemplo 13.5:
A continuación se incluyen algunos ejemplos de usos de la sentencia ALTER para
modificar la tabla CLIENTES:
321
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Creación 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 búsqueda. Los índices se deben
crear sobre aquellos atributos que suelen ser utilizados con frecuencia en las
búsquedas. Normalmente los sistemas gestores crean automáticamente un índice
sobre los atributos declarados como claves, y el programador puede optar por
añadir nuevos índices, pero siempre con precaución de no abusar de su uso, ya que
si se tienen demasiados índices la gestión de los datos se hace más costosa.
Los índices son creados, como cualquier elemento, con la sentencia CREATE,
aunque con una sintaxis diferente.
Ejemplo 13.6:
A continuación se incluyen dos ejemplos de creación de índices, uno sobre el
atributo FECHA de la tabla PROYECCIONES y otro sobre el atributo TITULO de
la tabla PELICULAS:
322
BASES DE DATOS RELACIONALES Y EL LENGUAJE SQL
También es posible utilizar la sentencia ALTER para añadir un índice a una tabla
creada previamente; por ejemplo:
Ejemplo 13.7:
En la tabla de PROYECCIONES se incluyó un atributo (IDPELICULA) que hacía
referencia a otro atributo, en este caso del mismo nombre, de la tabla PELICULAS.
En principio, si no se definen claves ajenas podría darse la situación de existir una
proyección con un código de película inexistente en la tabla de películas, 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 películas. Como la tabla ya ha sido creada,
esta modificación se puede realizar mediante la sentencia ALTER:
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 definición de la tabla.
Ejemplo 13.8:
La tabla de ENTRADAS podría haber sido definida incluyendo dos claves ajenas,
una referenciando a las proyecciones y otra a los clientes:
323
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Ejemplo 13.9:
Si una película es dada de baja en la tabla PELICULAS, entonces se deberían
eliminar de la tabla de PROYECCIONES todos aquellos registros que hacían
referencia a esa película. La forma en la que se indica esta necesidad de borrado en
cascada es:
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 debería cambiarse la
palabra CASCADE por SET NULL, en el primer caso, o NO ACTION, en el
segundo.
324
BASES DE DATOS RELACIONALES Y EL LENGUAJE SQL
La sentencia INSERT permite añadir una o varias filas (registros) a una tabla. En
la práctica, 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
inserción desde una página web, para ello será preciso utilizar las sentencias SQL
en programas PHP que a su vez estarán integrados en documentos HTML.
Con esta sintaxis, deben ser introducidos tantos valores como atributos de la tabla;
además, 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á vacío en el registro insertado. Únicamente pueden utilizarse estos
valores nulos sobre atributos que no tengan en su declaración la cláusula NOT
NULL.
Debe aclararse también que las filas de una tabla no están 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 continuación se muestran dos ejemplos de inserción de registros en la tabla
SALAS y en la tabla CLIENTES:
Esta sentencia insertaría una nueva sala, cuyo número correspondería al 1, con
capacidad para 300 personas, distribuidas en 15 filas y se incluiría en el campo de
observaciones el hecho de tener una zona reservada para minusválidos.
325
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Ejemplo 13.11:
Se podría insertar un nuevo cliente en la tabla con la sentencia:
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á automáticamente como valor el número
siguiente al valor más alto que se encuentre almacenado en la columna
NUM_CLIENTE de la tabla hasta ese momento. El atributo PUNTOS_ACUM, al no
habérsele dado ningún valor y tener definido uno por defecto, tomará
automáticamente este último (0 en este caso). Al resto de atributos a los que no se
326
BASES DE DATOS RELACIONALES Y EL LENGUAJE SQL
Ejemplo 13.12:
Se incluye a continuación una sentencia que permitiría dar de alta una nueva sala:
Ejemplo 13.13:
Si se dispone de una tabla adicional PELICULAS_TERROR para guardar en ella
todas las películas del género de terror con una estructura totalmente similar a la de
la tabla PELICULAS, estas podrían insertarse con una sentencia como la que
sigue:
En este caso, el uso del signo "*" es una forma de indicar todos los atributos de la
tabla.
327
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Esta sentencia elimina de la tabla indicada todas las filas que cumplan la condición
señalada. Si se suprime la cláusula WHERE, se borrarán todas las filas de la tabla,
pero no la tabla; recuérdese que la instrucción que destruye completamente la tabla
(datos y estructura) es DROP TABLE.
Ejemplo 13.14:
Las sentencias de eliminación de registros serían:
⎯ Eliminación de las entradas de las primeras 5 filas para la proyección número 231:
Las sentencias DELETE con condiciones simples permiten seleccionar las filas a
suprimir basándose únicamente en los propios contenidos de las filas. Sin embargo,
también es posible efectuar la selección 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 película Refugio en el paraíso, se
podría utilizar la sentencia:
328
BASES DE DATOS RELACIONALES Y EL LENGUAJE SQL
En una misma sentencia se pueden actualizar los valores de varios atributos, indicando las
asignaciones separadas por comas.
Ejemplo 13.16:
Sentencias de actualización de registros serían:
⎯ Otorgar 100 puntos extra a todos los clientes que tengan un saldo de puntos
acumulados menor que 500:
Ejemplo 13.17:
Se desea establecer tarifa reducida para todas las proyecciones de películas rodadas
antes de 1990, la sintaxis de la sentencia sería:
329
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Toda consulta en SQL se realiza con la sentencia SELECT. Esta es sin duda la
sentencia más poderosa y completa con la que cuenta el lenguaje SQL. Su sintaxis
completa es:
Todos los fragmentos que en esta sintaxis aparecen encerrados entre corchetes son
opcionales.
330
BASES DE DATOS RELACIONALES Y EL LENGUAJE SQL
— Cláusula FROM: en ella se indican, separadas por comas, las tablas que
contienen los datos que se desean recuperar en la consulta.
— Cláusula GROUP BY: permite obtener consultas resumen en las que todas
las filas similares son agrupadas y se genera una fila resumen para cada
grupo.
Ejemplo 13.18:
Si se quisiera recuperar todos los registros de la tabla PELICULAS, se debería
utilizar la sentencia:
331
PHP Y MYSQL. TECNOLOGÍAS 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 sería:
Eliminación de duplicados
Si una consulta incluye la clave primaria de una tabla en su lista de selección,
entonces cada fila de resultados será única; en cambio, si no se incluye la clave en
la lista de selección 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 selección.
Ejemplo 13.20:
Al seleccionar todos los directores de las películas de la tabla PELICULAS pueden
aparecer algunos de ellos duplicados (los que han dirigido varias películas), por
tanto habría dos opciones para esta consulta:
332
BASES DE DATOS RELACIONALES Y EL LENGUAJE SQL
Ejemplo 13.21:
Algunas consultas con condiciones de selección serían:
⎯ Obtener los títulos de todas las películas de una duración inferior a 120
minutos:
⎯ Generar un listado con los títulos y directores de todas las películas en las que
participe Antonio 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.
333
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Ejemplo 13.22:
Se desea generar un listado de clientes en orden decreciente según el atributo de
puntos acumulados y en orden creciente según el nombre, la sentencia sería:
Consultas multitabla
SQL permite también recuperar datos procedentes de diferentes tablas mediante
una única sentencia SELECT, esto es lo que se conoce como "composición".
Ejemplo 13.23:
A continuación se presentan algunos sencillos ejemplos de consultas multitabla:
⎯ Se desea saber todas las fechas en las que se proyecta la película El Señor de
los Anillos:
⎯ Se desea un listado con los nombres de todos los clientes que hayan adquirido
alguna entrada para ver la película El Señor de los Anillos:
334
BASES DE DATOS RELACIONALES Y EL LENGUAJE SQL
Consultas resumen
SQL permite resumir los datos mediante un conjunto de funciones denominadas
funciones de columna. Algunas de ellas son:
Ejemplo 13.24:
A continuación se muestran ejemplos de consultas resumen:
⎯ Cálculo de la suma de los puntos acumulados por los clientes número 321, 543,
287 y 721:
335
PHP Y MYSQL. TECNOLOGÍAS 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 resúmenes parciales
o agrupados por categorías. Esto se consigue con la cláusula GROUP BY.
Ejemplo 13.25:
Dos ejemplos de consultas agrupadas serían las siguientes:
Ejemplo 13.26:
Se desea obtener el nombre de todos los clientes que hayan adquirido 20 o más
entradas; la forma de conseguirlo sería utilizando la sentencia:
336
BASES DE DATOS RELACIONALES Y EL LENGUAJE SQL
337
EL SISTEMA GESTOR
DE BASES DE DATOS
MYSQL
MySQL ofrece varias ventajas respecto a otros sistemas gestores de bases de datos:
— Tiene licencia pública, permitiendo no solo la utilización del programa sino
también la consulta y modificación de su código fuente. Resulta por tanto fácil
de personalizar y adaptar a las necesidades concretas.
— El programa está desarrollado en C y C++, lo que facilita su integración en
otras aplicaciones desarrolladas igualmente en esos lenguajes.
— Puede ser descargado gratuitamente de Internet (http://www.mysql.com)
haciendo uso de su licencia GPL.
339
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
— Para aquellos que deseen que sus desarrollos basados en MySQL no sean
"código abierto" existe también una licencia comercial.
— MySQL utiliza el lenguaje SQL (Structured Query Languaje – Lenguaje de
Consulta Estructurado) que es el lenguaje de consulta más usado y
estandarizado para acceder a bases de datos relacionales. Soporta la sintaxis
estándar del lenguaje SQL para la realización de consultas de manipulación,
creación y de selección de datos.
— Es un sistema cliente/servidor, permitiendo trabajar como servidor
multiusuario y de subprocesamiento múltiple, es decir, cada vez que se
establece una conexión con el servidor, el programa servidor crea un
subproceso para manejar la solicitud del cliente, controlando el acceso
simultáneo de un gran número de usuarios a los datos y asegurando el acceso
solo a usuarios autorizados.
— MySQL dispone de un sistema sencillo de ayuda en línea, y de un monitor que
permite realizar todas las operaciones desde la línea de comandos del sistema,
sin necesitar ningún tipo de interfaze de usuario gráfica. Esto facilita la
administración remota del sistema utilizando telnet.
— Es portable, es decir, puede ser llevado a cualquier plataforma informática.
MySQL está disponible en más de veinte plataformas diferentes incluyendo las
distribuciones más 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 administración de las bases de datos a través de un servidor web.
Todas estas características han hecho de MySQL uno de los sistemas gestores de
bases de datos más utilizado en la actualidad, no solo por pequeñas empresas sino
también 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 existían más de 5 millones de
instalaciones activas del programa.
340
EL SISTEMA GESTOR DE BASES DE DATOS MYSQL
C:\mysql\bin> mysqld
C:\mysql\bin> mysqlshow
+-------------+
| Databases |
+-------------+
| mysql |
| test |
+-------------+
Por supuesto, una vez detenido el servidor no se podrá realizar ninguna operación
sobre las bases de datos.
341
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Por supuesto, para garantizar la seguridad y privacidad de las bases de datos una de
las primeras operaciones que debería hacerse es el establecimiento de contraseñas
para los usuarios, sobre todo para el usuario root, ya que al tener contraseña vacía
cualquier persona podría acceder con todos los privilegios. Igualmente, en el caso
de trabajar sobre Windows, se recomienda eliminar la cuenta de usuario invitado
con privilegios de superusuario.
342
EL SISTEMA GESTOR DE BASES DE DATOS MYSQL
C:\mysql\bin> mysql –p
si se desea acceder con la cuenta de usuario root. En cualquiera de los dos casos,
el sistema solicitaría la introducción del password, que cómo se ha comentado,
inicialmente es vacío.
Enter password:
Mysql>
343
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Figura 14.1 Arranque del servidor de MySQL desde la línea de comandos del sistema
mysql>
Cuando se desee salir del monitor de MySQL y regresar a la línea de comandos del
sistema, se tendría que ejecutar la sentencia:
mysql> EXIT
o
mysql> QUIT
Dentro del monitor todas las sentencias SQL que se ejecuten deberán
finalizar con un signo de punto y coma, las sentencias pueden ocupar
varias líneas y el uso de letras mayúsculas o minúsculas es indiferente.
NOTA
Una vez dentro del monitor de MySQL, se pueden ejecutar directamente sentencias
SQL de manera interactiva.
344
EL SISTEMA GESTOR DE BASES DE DATOS MYSQL
Ejemplo 14.1:
Como primera orden se podría solicitar un listado de las bases de datos disponibles:
Ejemplo 14.2:
También se podría ejecutar una sencilla consulta de selección para solicitar al
servidor que muestre la fecha actual y la versión de MySQL que se encuentra
instalada:
Ejemplo 14.3:
Es posible realizar sencillas operaciones matemáticas:
Ejemplo 14.4:
También se puede solicitar que se muestre el usuario y la base de datos actual:
345
PHP Y MYSQL. TECNOLOGÍAS 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 identificación 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 identificación se limita al nombre localhost.
Ejemplo 14.5:
Si se desea usar la base de datos mysql (una de las dos bases de datos creadas por
defecto), la sentencia sería:
Una vez seleccionada la base de datos con la que se desea trabajar, todas las
operaciones posteriores irán dirigidas a ella, a no ser que explícitamente se seleccione
una nueva base de datos. Si se realiza de nuevo la selección de la base de datos actual
se podría apreciar cómo ahora sí que aparece el nombre de la correspondiente base de
datos
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 información sobre los nombres, contraseñas y servidores de los usuarios,
346
EL SISTEMA GESTOR DE BASES DE DATOS MYSQL
sino también un gran número de campos para establecer los diferentes privilegios
de cada usuario; por ejemplo, si los usuarios pueden crear nuevas bases de datos,
realizar operaciones de actualización, inserción, borrado,...
Ejemplo 14.6:
Si se desea consultar las tablas de la base de datos mysql se podría utilizar la
siguiente instrucción:
Cuando se desea ver una descripción completa de la estructura de una tabla puede
usarse la instrucción DESCRIBE o SHOW COLUMNS.
Ejemplo 14.7:
Para mostrar la estructura de la tabla user, se podría utilizar cualquiera de las dos
sentencias siguientes:
De todos los atributos de la tabla user, los tres primeros (host, user y
password) identifican a cada usuario y los restantes establecen sus privilegios.
Por ejemplo, el atributo Insert_priv puede tomar el valor 'N' (no) o el valor
'Y' (yes), siendo el primero el valor por defecto, y determina si el usuario tiene o
347
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
348
EL SISTEMA GESTOR DE BASES DE DATOS MYSQL
Ejemplo 14.8:
Si se desea obtener un listado con los nombres de usuario, contraseñas y servidores de
todos los usuarios registrados, se podría realizar una simple consulta de selección:
En este momento pueden observarse los cuatro usuarios definidos por defecto, los
dos superusuarios root y los dos usuarios invitados.
Ejemplo 14.9:
La eliminación de los usuarios de nombre vacío se haría de la siguiente manera:
349
PHP Y MYSQL. TECNOLOGÍAS 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 permitiría aún el
acceso. La razón es que para que los cambios de usuario tengan efecto, el servidor
MySQL debe reiniciarse. La forma de reiniciar el servidor es mediante la ejecución
del programa mysqladmin con la opción reload desde fuera del monitor
MySQL. A continuación 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
Como puede observarse, una vez eliminados los usuarios invitados y reiniciado el
servidor, la única posibilidad sería entrar con el usuario root.
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 sería:
350
EL SISTEMA GESTOR DE BASES DE DATOS MYSQL
En este ultimo caso se está asignando la contraseña 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 tendrían efecto hasta que se reinicie el
servidor MySQL. Esto se realiza con la sentencia:
351
PHP Y MYSQL. TECNOLOGÍAS 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:
Una vez establecida la contraseña del usuario root, se debería entrar de nuevo en
el monitor con la sentencia:
En este caso la contraseña se indica a continuación del parámetro –p, sin dejar
ningún espacio entre ambos. Además si la contraseña contiene espacios en blanco o
caracteres especiales, esta debería darse entre comillas dobles.
352
EL SISTEMA GESTOR DE BASES DE DATOS MYSQL
Ejemplo 14.11:
Con la sentencia:
se crea un nuevo usuario que se podrá conectar desde el propio servidor local, con
nombre de usuario operador y contraseña snoopy. Este usuario tendrá los
privilegios establecidos por defecto, estos privilegios solo le permiten el uso de la
tabla test.
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
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 inserción debería ser:
353
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Con estos privilegios el usuario mantenimiento podría ver los datos almacenados
en cualquier tabla de cualquier base de datos y podría insertar nuevos registros e
incluso crear nuevas tablas para insertar registros en ellos. Lo que no podría hacer
son operaciones de modificación de datos, eliminación de registros, creación de
nuevas bases de datos,...
Ejemplo 14.13:
Para ilustrar el proceso completo de creación de la base de datos se tomará como
referencia la base de datos de los multicines Cinem@s que ya fue diseñada en el
capítulo 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
Una vez dentro, se debe crear la base de datos, utilizando para ello la sentencia
CREATE:
354
EL SISTEMA GESTOR DE BASES DE DATOS MYSQL
Una vez creada, debe usarse la sentencia USE para seleccionarla como base de
datos activa.
Una vez creada la base de datos, lo siguiente es la creación de las tablas que la
compondrán. La creación de esas tablas se realiza con la correspondiente
instrucción SQL. Por ejemplo, una de las tablas de la base de datos de Cinem@s es
la que permitirá guardar la información de todos los clientes; en concreto, la
creación de esta tabla se haría de la siguiente manera:
355
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Los diferentes tipos de datos pueden ser clasificados en varios grupos o categorías:
numéricos, cadena de caracteres, fecha y hora, conjuntos y enumeraciones,...
Los tipos numéricos 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
números en diferentes rangos.
356
EL SISTEMA GESTOR DE BASES DE DATOS MYSQL
Tipos Enteros
Nombre Rango Almacenamiento Descripción
TINYINT -128 a 127 1 byte Entero pequeño
BIT 0o1 1 bit Entero 0 o 1
BOOL 0o1 1 bit Entero 0 o 1
SMALLINT -32768 a 32767 2 bytes Entero pequeño
MEDIUMINT -8388608 a 8388607 3 bytes Entero mediano
INT -2147483648 a 2147483647 4 bytes Entero normal
INTEGER -2147483648 a 2147483647 4 bytes Sinónimo de INT
BIGINT -9223372036854775808 a
8 bytes Entero grande
9223372036854775807
Tabla 14.2 Tipos de datos numéricos enteros
Como puede apreciarse en la Tabla 14.2, existen varias posibilidades para trabajar
con tipos enteros, la elección 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 parecería muy lógico utilizar el tipo INTEGER por
el enorme desperdicio de espacio en memoria que implicaría.
Salvo en los tipos BIT y BOOL, en el resto de tipos de enteros se puede especificar
entre paréntesis el número máximo de dígitos con el que se mostrará el
correspondiente número. El valor máximo de este parámetro es 255.
357
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Ejemplo 14.14:
Si se define un atributo:
los números de las salas serán mostrados todos ellos con cuatro dígitos,
completando a la izquierda con ceros si fuese necesario.
PRECISION
REAL Sinónimos de double
358
EL SISTEMA GESTOR DE BASES DE DATOS MYSQL
Ejemplo 14.15:
Si se define el atributo PRECIO de la siguiente manera:
En ambos casos, a la hora de definir un atributo con tipo CHAR o VARCHAR, debe
indicarse entre paréntesis la longitud máxima que admitirá. La longitud máxima
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 máximo sería:
NOMBRE VARCHAR(20)
359
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Ejemplo 14.17:
La declaración:
Existen diferentes variaciones de los tipos TEXT y BLOB que afectan únicamente a
las longitudes máximas de las cadenas que admiten. En la Tabla 14.4 se incluyen
estas versiones junto con los otros tipos de cadenas analizados.
360
EL SISTEMA GESTOR DE BASES DE DATOS MYSQL
Longitud máxima
Nombre Almacenamiento Descripción
de caracteres
CHAR 1 1 bytes Un carácter.
361
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Ejemplo 14.18:
A continuación 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 numéricos. Cada valor predeterminado tiene
asociado el valor numérico correspondiente a su posición en la lista que
define el atributo. El hecho de que estos tipos de datos sean tratados
NOTA como números hace que su tratamiento sea mucho más rápido y eficaz
que el de las cadenas de caracteres.
Ejemplo 14.19:
Para MySQL cualquiera de las cadenas siguientes correspondería 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 dígitos correspondientes a las horas, minutos y segundos seguidos,
sin ningún separador. Por ejemplo, las 17 horas 5 minutos y 20 segundos se puede
expresar como:
'17:5:20'
170520
362
EL SISTEMA GESTOR DE BASES DE DATOS MYSQL
Tamaño de
Nombre Rango Descripción
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
El formato en el que son almacenados los instantes de tiempo depende del valor del
parámetro que se haya colocado entre paréntesis en la definición del
correspondiente atributo. La Tabla 14.6 muestra los diferentes formatos asociados a
los diferentes parámetros.
363
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
TIMESTAMP(14) AAAAMMDDHHMMSS
TIMESTAMP(12) AAMMDDHHMMSS
TIMESTAMP(8) AAAAMMDD
TIMESTAMP(6) AAMMDD
TIMESTAMP(4) AAMM
TIMESTAMP(2) AA
364
EL SISTEMA GESTOR DE BASES DE DATOS MYSQL
Para trabajar con claves foráneas es necesario que las dos tablas relacionadas sean
ambas definidas del tipo InnoDB, para ello se colocará al final de la tabla la
cláusula:
TYPE = INNODB
365
PHP Y MYSQL. TECNOLOGÍAS 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.
Ejemplo 14.20:
A continuación se muestra el código completo de creación de la base de datos
Cinem@s haciendo uso de la integridad referencial:
366
EL SISTEMA GESTOR DE BASES DE DATOS MYSQL
EMAIL CHAR(30) ,
PUNTOS_ACUM SMALLINT NOT NULL DEFAULT 0 ,
CLAVE CHAR(6) NOT NULL ,
PRIMARY KEY (NUM_CLIENTE)) TYPE = INNODB;
Como puede observarse, todas las tablas han sido definidas del tipo InnoDB, y en
las tablas PROYECCIONES y ENTRADAS se definen dos claves foráneas en cada
una con sus respectivos índices.
Otra posibilidad para crear la base de datos con las restricciones de integridad
referencial es añadir las claves foráneas y los índices después de crear todas las
tablas haciendo uso en este caso de la sentencia ALTER TABLE. El código
completo correspondiente a esta alternativa se muestra a continuación:
367
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
USE CINEMAS;
368
EL SISTEMA GESTOR DE BASES DE DATOS MYSQL
Ejemplo 14.21:
Suponiendo que el fichero con las instrucciones de creación de las tablas se llama
cinemas.sql y que se encuentra en el directorio raíz, la creación de la base de
datos se podría hacer de la manera siguiente:
369
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Por ejemplo, estos mensajes aparecerían si se tratan de crear las claves foráneas sin
crear los correspondientes índices.
Si no se produce ningún error, se puede comprobar que las cinco tablas de la base
de datos habrán sido generadas correctamente:
Cuando se crea una tabla con una clave foránea MySQL asigna internamente un ID
que hará referencia a la restricción que establece sobre la tabla. Para conocer estos
ID se puede utilizar la instrucción SHOW CREATE TABLE.
370
EL SISTEMA GESTOR DE BASES DE DATOS MYSQL
+--------------+--------------------------------------------------------+
+--------------+--------------------------------------------------------+
| | CONSTRAINT `proyecciones_ibfk_2` |
| | CONSTRAINT `proyecciones_ibfk_1` |
| | ) TYPE=InnoDB |
+--------------+--------------------------------------------------------+
371
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
por ejemplo para eliminar la correspondiente clave foránea con la sentencia ALTER
TABLE. Por ejemplo, si se quisiese suprimir la clave foránea NUM_SALA se podría
ejecutar la sentencia:
Ejemplo 14.22:
En primer lugar se insertará una película y dos salas en las respectivas tablas:
Una vez incluida la película, cuyo identificador es 1, y las salas, con identificadores
1 y 2 respectivamente, es posible, por ejemplo, dar de alta una nueva proyección de
la película 1 en la sala 2 para las 16:30 del día 16 de mayo de 2004; esta
proyección tendrá como identificador el número 1:
En cambio, si se trata de insertar una nueva proyección que referencie a una sala
inexistente (sala 3) o una película inexistente (película 50), se produce una
violación de las restricciones de integridad referencial, MySQL detecta esa
violación, no incluye el registro y muestra un mensaje de error.
372
EL SISTEMA GESTOR DE BASES DE DATOS MYSQL
Ejemplo 14.23:
MySQL no permitiría borrar la película 1 ni la sala 2 porque existen
proyecciones relacionadas que quedarían huérfanas en caso de producirse el
borrado. En cambio sí es posible borrar la sala 1 ya que no tiene ninguna
proyección relacionada.
373
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Ejemplo 14.24:
Si se quisiera que los procesos de borrado se produjeran en cascada en la tabla de
proyecciones, lo primero que se debería hacer es modificar la definición de sus dos
374
EL SISTEMA GESTOR DE BASES DE DATOS MYSQL
De esta forma, a partir de ahora cada vez que se suprima una película o una sala,
automáticamente se eliminarán todas las proyecciones de esa película o que tengan
lugar en esa sala.
375
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Con tres sencillas consultas de selección se podría consultar el contenido de las tres
tablas en este momento.
376
EL SISTEMA GESTOR DE BASES DE DATOS MYSQL
Por ejemplo, se desea eliminar la película Piratas del Caribe (cuyo identificador es
10); la sentencia sería:
377
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
378
EL SISTEMA GESTOR DE BASES DE DATOS MYSQL
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
379
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Ejemplo 14.26:
A continuación se muestra el funcionamiento de la actualización 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:
380
EL SISTEMA GESTOR DE BASES DE DATOS MYSQL
381
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Ejemplo 14.27:
Supóngase que se dispone de un fichero de texto que contiene la siguiente
información:
1 Luis López Floranes 54, Santander 1970-3-31 942221133 llopez@coldmail.com 0 llp70
2 María Anta San Juan 22, Oviedo 1981-11-22 686776612 manta@tumail.com 0 as23b
3 Ana Palacios San Andrés 39, Madrid 1968-5-1 null apm55@tumail.com 0 aaa45b
4 Valeria Vázquez Moro 120, Almería 1990-2-13 645162377 vv90@coldmail.com 0 basw25
Como puede apreciarse, cada una de las líneas del fichero contiene los datos
correspondientes a un registro de la tabla CLIENTES, coincidiendo en número y
tipo los respectivos datos con los atributos de esa tabla, y estando separados los
datos por tabuladores.
Una vez disponible el fichero anterior, desde la línea de comandos del sistema (no
desde dentro del monitor de MySQL) se haría una llamada a la utilidad
mysqlimport indicando, por este orden, el nombre de usuario para conectarse al
servidor, el parámetro para solicitar la contraseña, el nombre de la base de datos de
destino y el nombre y ruta del archivo de texto:
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
382
EL SISTEMA GESTOR DE BASES DE DATOS MYSQL
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.
383
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Ejemplo 14.28:
Supóngase 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:
El parámetro 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 parámetro opcional (FIELDS TERMINATED BY) para indicar el
separador de campos.
Con una consulta SELECT se puede comprobar que los datos han sido
correctamente importados:
384
EL SISTEMA GESTOR DE BASES DE DATOS MYSQL
385
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
La generación de este fichero debe hacerse desde la línea de comandos del sistema,
utilizando la sintaxis siguiente:
Si después del nombre de la base de datos se indica el nombre de una de sus tablas,
el fichero generado únicamente contendrá la definición de esa tabla y las sentencias
de inserción de sus registros.
Ejemplo 14.29:
Se puede generar un fichero de respaldo de la tabla clientes de la siguiente manera:
Ejemplo 14.30:
mysql> USE CINEMAS;
Database changed
Con esta instrucción se generaría un fichero de texto con los nombres y puntos
acumulados de todos los clientes, siendo el contenido del fichero el siguiente:
386
EL SISTEMA GESTOR DE BASES DE DATOS MYSQL
Ejemplo 14.31:
También es posible indicar una condición de selección de registros, en este caso se
obtienen los nombres de todos los clientes de Santander:
387
PHPMYADMIN:
ADMINISTRACIÓN DE
BASES DE DATOS
MYSQL DESDE LA
WEB
15.1. INTRODUCCIÓN
La administración y gestión 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 gráfica de usuario.
389
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Por supuesto, para poder hacer uso de esta aplicación de administración de MySQL
es necesario disponer de un servidor web con un intérprete de PHP, ya que todas las
páginas están escritas en ese lenguaje. Además es preciso establecer los valores de
diferentes parámetros de configuración que se encuentran dentro del fichero
config.inc.php alojado en el directorio que contiene todas las páginas que
componen la aplicación. Dos de estos parámetros serían PmaAbsoluteUri, que
permite indicar el URL que identifica la localización exacta de la aplicación, y
auth_type, que permite indicar el tipo de autentificación que se utilizará (existen
tres opciones: autentificación basada en cookies, basada en http o inclusión en el
fichero de configuración de los datos de usuario).
En el caso de tener instalado el servidor web sobre el propio equipo (localhost) que
se utilizará para la administración, se deberá escribir en la barra de direcciones del
navegador:
http://localhost/phpmyadmin/
Para ello es necesario también que el servidor web tenga configuradas las páginas
index.php como páginas de inicio de directorio.
390
PHPMYADMIN: ADMINISTRACIÓN DE BASES DE DATOS MYSQL DESDE LA WEB
391
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
392
PHPMYADMIN: ADMINISTRACIÓN 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.
Mediante los enlaces gráficos que aparecen delante de cada registro se podrán
editar sus campos o borrar el registro completamente. Además, pulsando sobre los
nombres de los campos que aparecen en las cabeceras de las columnas se puede
variar el orden en el que se muestran los registros (orden ascendente o descendente
sobre ese campo).
393
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
394
PHPMYADMIN: ADMINISTRACIÓN DE BASES DE DATOS MYSQL DESDE LA WEB
395
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
En la parte inferior del formulario existen dos botones de opción que permiten
especificar si se desea añadir un nuevo registro o simplemente volver a la
estructura de la base de datos.
396
PHPMYADMIN: ADMINISTRACIÓN DE BASES DE DATOS MYSQL DESDE LA WEB
Además, para el caso de campos de tipo blob, preparados para recibir cualquier
tipo de archivo, el formulario permite directamente examinar el contenido del
equipo y seleccionar el archivo a almacenar en la tabla. Este es el caso del campo
CARTELERA de la tabla de PELICULAS (Figura 15.12).
397
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
La siguiente acción que se puede realizar sobre las tablas es la de ver sus
propiedades. En este caso se mostrará la estructura de la tabla, con los nombres y
tipos de sus argumentos, así como cualquier otra propiedad de la misma establecida
en tiempo de diseño (claves primarias, atributos no nulos, valores predeterminados,
índices,...). A través de esta opción no solo es posible consultar las propiedades de
la tabla sino también modificarlas. La próxima sección mostrará detalladamente las
distintas opciones accesibles desde la página de propiedades.
Finalmente, las dos últimas acciones a realizar sobre las tablas son las de eliminar
y vaciar. La eliminación borra la tabla completa (sentencia DROP TABLE),
mientras que el vaciado únicamente borra los registros que contiene la tabla pero la
mantiene vacía en la base de datos (sentencia TRUNCATE).
Cuando se trabaja en MySQL con tablas que soporten la integridad referencial, las
operaciones de eliminación de tabla o de vaciado de registros solo son permitidas
cuando no se estén utilizando en otras tablas vinculadas.
398
PHPMYADMIN: ADMINISTRACIÓN DE BASES DE DATOS MYSQL DESDE LA WEB
Para analizar la estructura de una de las tablas se puede pulsar sobre el enlace
correspondiente que aparece en el marco izquierdo de la página principal (Figura
15.14).
Al hacerlo, se accede a una página similar a la que aparece cuando se consultan las
propiedades de una tabla. En la parte superior de esa misma página aparecen una
serie de enlaces adicionales que permiten realizar todo tipo de acciones sobre la
tabla: examinar sus registros, ejecutar sentencias SQL, generar consultas de
selección, insertar nuevos registros, exportar datos, cambiar el nombre de la tabla,
cambiar su ubicación,... Algunas de estas acciones pueden realizarse también a
través de la página que muestra la estructura completa de la base de datos.
Al seleccionar una tabla, la página muestra por defecto sus propiedades, tal como
se ve en la Figura 15.15, para el caso de la tabla CLIENTES.
399
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
400
PHPMYADMIN: ADMINISTRACIÓN DE BASES DE DATOS MYSQL DESDE LA WEB
401
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
El siguiente paso, será definir los 7 campos de la tabla; para ello phpmyadmin
muestra un nuevo formulario en el que este proceso se realiza de forma intuitiva
(Figura 15.20). El formulario permite indicar los nombres de los campos, sus tipos,
402
PHPMYADMIN: ADMINISTRACIÓN DE BASES DE DATOS MYSQL DESDE LA WEB
403
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Para importar todos esos datos a la tabla de empleados se tendría que pulsar sobre
el enlace Insertar archivo de texto en la tabla que aparece al final de la página que
muestra la estructura de la correspondiente tabla. Al hacerlo se accede al
formulario que muestra la Figura 15.22, en él se debe especificar el fichero fuente
de los datos y los diferentes caracteres que actuarán de separadores de campos y de
registros.
404
PHPMYADMIN: ADMINISTRACIÓN DE BASES DE DATOS MYSQL DESDE LA WEB
Para exportar una base de datos debe activarse el enlace Exportar que aparece en la
página de inicio de phpmyadmin. Al hacerlo se accede a una nueva página en la
que en primer lugar habría que seleccionar la o las bases de datos que se desean
exportar y el formato de exportación (Figura 15.24).
405
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
— CSV para Excel: se generaría un fichero de texto con los contenidos de las
tablas de la base de datos en formato CSV (valores separados por comas). Este
formato puede ser leído directamente por Excel para mostrar los contenidos de
las tablas en una hoja de cálculo.
— Datos CSV: exporta los datos de las tablas a formato CSV, pero en este caso se
permite que el usuario elija los caracteres delimitadores de campo y de registro,
los caracteres de fin de línea y los valores a utilizar para reemplazar los valores
nulos.
406
PHPMYADMIN: ADMINISTRACIÓN DE BASES DE DATOS MYSQL DESDE LA WEB
407
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
concreta, una tabla, o incluso una sola columna de una tabla, estos privilegios
quedan reflejados en sendos registros de las tablas: db, tables_priv y columns_priv.
408
PHPMYADMIN: ADMINISTRACIÓN DE BASES DE DATOS MYSQL DESDE LA WEB
409
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Lo primera será indicar sobre qué base de datos el usuario tendrá privilegios
específicos, para ello en la página aparece una lista con todas las bases de datos
disponibles. Al elegir la base de datos cinemas o escribir su nombre en el campo
que acompaña a la lista y pulsar Continúe, se accederá a una nueva página (Figura
15.29). En esta nueva página se pueden señalar los privilegios específicos sobre la
base de datos cinemas; como puede apreciarse se han señalado todos los
privilegios. Una vez señalados, bastaría pulsar el botón Continúe para que esos
privilegios queden registrados.
410
PHPMYADMIN: ADMINISTRACIÓN DE BASES DE DATOS MYSQL DESDE LA WEB
Lo primero será crear el nuevo usuario sin asignarle ningún privilegio global. El
proceso es idéntico al realizado con el usuario anterior. A continuación, de nuevo,
se señalará que se desea definir privilegios específicos para la base de datos
cinemas, en el formulario correspondiente, no se señalará ningún privilegio
específico para la base de datos y se indicará la tabla sobre la que sí se desean
definir privilegios, tal como puede verse en la Figura 15.30.
Tras señalar la tabla PELICULAS, se accede a una nueva página (Figura 15.31) en
la que es posible indicar las acciones que el usuario podrá realizar sobre las
diferentes tablas e incluso sobre los diferentes campos de cada tabla. En el caso
anterior se está indicando que el usuario podrá efectuar operaciones de selección,
inserción, actualización y borrado sobre todos los campos de la tabla de películas.
Pulsando el botón Continúe estos privilegios quedarán registrados en la base de
datos mysql.
411
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Para que todos los cambios realizados sobre los usuarios tengan efecto
sobre MySQL, suele ser conveniente reiniciar el servidor de MySQL. Para
NOTA realizar esta acción, en la página de inicio de phpmyadmin hay un enlace:
Reinicio de MySQL.
Tras todos los procesos realizados, en la tabla user de la base de datos mysql habrá
dos nuevos registros correspondientes a los dos nuevos usuarios; en la tabla db
aparecerá un nuevo registro en el que se indica que el usuario cinemasadmin tiene
todos los privilegios sobre la base de datos cinemas; y finalmente, en la tables_priv
habrá un nuevo registro en el que se indican los privilegios del usuario
películas_op sobre la tabla películas de la base de datos cinemas.
412
CONECTIVIDAD A
BASES DE DATOS
MYSQL DESDE PHP
16.1. INTRODUCCIÓN
El elemento esencial en todo proceso de generación de páginas web dinámicas es la
conectividad con aplicaciones de gestión de bases de datos. Muchas de las páginas
que se pueden encontrar en Internet se generan como resultado de una consulta a
una base de datos. En estos casos es preciso utilizar el lenguaje de consulta de las
bases de datos relacionales (SQL) embebido dentro de un lenguaje de
programación que permita generar esas páginas. En este capítulo se mostrará cómo
es posible realizar este proceso usando el lenguaje PHP y cómo la conectividad a
bases de datos en MySQL se caracteriza por su sencillez y efectividad.
Al igual que en los capítulos precedentes, el objetivo no será una mera descripción
de las diferentes funciones de conexión y de sus sintaxis; más bien se tratará de
mostrar su funcionamiento a través de sencillos ejemplos tomando como referencia
el sitio web Cinem@s que se viene desarrollando a lo largo del libro. Usando PHP
413
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
resultará muy sencillo, por ejemplo, generar la cartelera de películas del día
interrogando a la base de datos y generando una página dinámica.
Aunque este capítulo se centra en la conectividad a bases de datos MySQL, desde
PHP es posible comunicarse con la mayoría de aplicaciones gestoras de bases de
datos (Oracle, Informix, SQL Server, dBase, Ingres,...) de una forma similar a la
que se utilizará con MySQL.
En PHP las funciones de conectividad son específicas del gestor de bases de datos al
que se realiza la conexión. Así por ejemplo, para abrir una conexión con una base de
datos MySQL se utiliza la función mysql_connect() mientras que si se desea
abrir la conexión con una base de datos Oracle debe utilizarse la función
Ora_Open(). Los nombres de todas las funciones PHP relativas a conectividad a
bases de datos comienzan por un prefijo identificativo del gestor al que se dirigen.
Por ejemplo, los nombres de las funciones de conexión a algunos de los gestores de
bases de datos más conocidos siguen los siguientes patrones:
— Funciones de conectividad con MySQL: mysql_nombrefuncion
— Funciones de conectividad con Oracle: Ora_nombrefuncion
— Funciones de conectividad con Informix: ifx_nombrefuncion
— Funciones de conectividad con dBase: dbase_nombrefuncion
— Funciones de conectividad con Ingres: ingres_nombrefuncion
mysql_connect(servidor,usuario,contraseña)
Los tres parámetros anteriores permiten identificar el servidor sobre el que está
instalado MySQL, y el nombre de usuario y contraseña necesarios para conectarse.
Por supuesto, estos dos últimos datos deben coincidir con los de un usuario
registrado en MySQL.
414
CONECTIVIDAD A BASES DE DATOS MYSQL DESDE PHP
mysql_close(identificador)
Como puede apreciarse, en primer lugar se realiza la conexión con el servidor local
y utilizando como nombre de usuario root y contraseña miclave. Se asigna el
identificador de la conexión a la variable $c, y se comprueba si su valor es distinto
415
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
mysql_pconnect(servidor,usuario,contraseña)
El cierre de las conexiones persistentes debe realizarse con una función especial:
mysql_pclose(identificador)
mysql_select_db(nombreBD, identificador)
416
CONECTIVIDAD A BASES DE DATOS MYSQL DESDE PHP
Ejemplo 16.1:
La siguiente estructura aborta el programa si no se puede seleccionar la base de
datos cinemas:
$c = mysql_connect("localhost","root","miclave");
$bd = mysql_select_db("cinemas",$c);
if(!$c) {
die("Base de datos no existente");
}
Una vez seleccionada la base de datos, esta pasa a ser la base de datos activa, y
cualquier operación posterior se dirigirá a ella. En cualquier momento, mientras la
conexión permanezca abierta, puede cambiarse la selección de la base de datos
activa con una nueva llamada a la función mysql_select_db().
mysql_query(sentencia, identificador)
417
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Existe otra función similar que permite ejecutar sentencias sobre cualquier base de
datos, en este caso debe indicarse además de la sentencia y el identificador de
conexión, el nombre de la base de datos a la que se dirige la consulta:
Ejemplo 16.2:
Supóngase que se desea añadir un nuevo atributo a la tabla clientes de la base de
datos cinemas para guardar el NIF de cada cliente. Esta sencilla modificación
podría realizarse desde un programa PHP como el siguiente:
$c = mysql_connect("localhost","root","miclave");
if(!$c) {
die("Conexión fallida");
}
$ok = mysql_select_db("cinemas",$c);
if(!$ok) {
die("Error en la selección de la base de datos");
}
$consulta =
"ALTER TABLE clientes ADD NIF VARCHAR(9) NOT NULL";
$resultado = mysql_query($consulta,$c);
if($resultado) {
print("Tabla actualizada");
} else {
print("No se ha podido actualizar la tabla");
}
mysql_close($c);
$c = mysql_connect("localhost","root","miclave")
or die("Conexión fallida: " . mysql_error());
mysql_select_db("cinemas",$c)
or die("Error en la selección: " . mysql_error());
$consulta =
418
CONECTIVIDAD A BASES DE DATOS MYSQL DESDE PHP
419
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Fichero clientes.html:
420
CONECTIVIDAD A BASES DE DATOS MYSQL DESDE PHP
Cuando el usuario pulse el botón Enviar, los datos introducidos por este llegarán al
fichero nuevocliente.php a través de variables del mismo nombre que el de los
campos correspondientes. Se asume que esos valores han sido validados en el cliente
antes de ser remitidos al servidor (por ejemplo, mediante un script en JavaScript). A
partir de los valores recibidos el programa PHP debe generar la correspondiente
sentencia INSERT que se dirigirá a la base de datos cinemas.
421
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Fichero configuración.inc:
<?
$host = "localhost";
$usuario = "cinemasadmin";
$password = "miclave";
$db = "cinemas";
?>
En cualquier otra página del sitio en la que se requiera hacer uso de esas variables
de configuración, bastaría incluir la sentencia:
require('configuracion.inc');
Fichero nuevocliente.php:
<HTML>
<HEAD>
<TITLE>Registro de nuevo cliente</TITLE>
</HEAD>
<BODY>
<?php
// comprobación de la recepción de las variables
if (isset($nombre,$nif,$pass1)) {
// carga de las variables de configuración
// y realización de la conexión
require('configuracion.inc');
$c = mysql_connect($host,$usuario,$password)
or die("Error: " . mysql_error());
422
CONECTIVIDAD A BASES DE DATOS MYSQL DESDE PHP
mysql_select_db($db,$c)
or die("Error: " . mysql_error());
423
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
mysql_fetch_row(resultado)
424
CONECTIVIDAD A BASES DE DATOS MYSQL DESDE PHP
Cada vez que se produce la llamada a esta función se genera un array con los
valores de una de las filas de la tabla de resultados. Mediante un bucle de llamadas
sucesivas se podrán recorrer todas las filas que constituyen el resultado. Cuando no
hay más filas por leer, la función devuelve un valor nulo que puede ser utilizado
como indicador de finalización del bucle.
mysql_num_rows(resultado)
Esta función devuelve una valor entero indicando el número de filas del resultado.
mysql_affected_rows()
que devuelve el número de registros que se han visto afectados por la última
consulta realizada de inserción, actualización o borrado.
425
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Fichero accesocliente.php:
<HTML>
<HEAD><TITLE>Página personal</TITLE></HEAD>
<BODY>
<TABLE WIDTH="100%" BORDER BGCOLOR=#99CCFF>
<TR>
<TH WIDTH="16%">
<A HREF="principal.htm">Página principal</A></TH>
<TH WIDTH="17%">
<A HREF="proyecciones.htm">Nuestra cartelera</A></TH>
<TH WIDTH="17%">
<A HREF="salas.htm">Nuestras salas</A></TH>
<TH WIDTH="17%">
<A HREF="entradas.htm">Compra de entradas</A></TH>
<TH WIDTH="17%">
<A HREF="estrenos.htm">Próximos estrenos</A></TH>
<TH WIDTH="16%">
<A HREF="foros/index.php">Foro Cinem@s</A></TH>
</TR>
</TABLE>
<BR>
<?php
// comprobación de la recepción de las variables
if (isset($numcliente,$pass)) {
// carga de las variables de configuración
// y realización de la conexión
require('configuracion.inc');
$c = mysql_connect($host,$usuario,$password)
or die("Error: " . mysql_error());
mysql_select_db($db,$c)
or die("Error: " . mysql_error());
// comprobación de petición de modificación de datos
if(isset($modificar)) {
// generación de la consulta de actualización
$consulta = "UPDATE CLIENTES SET
NOMBRE = '$nombre',
NIF = '$nif',
DIRECCION = '$direccion',
FECHANAC = '$fecha',
TELEF = '$telefono',
EMAIL = '$email',
CLAVE = '$pass'
WHERE NUM_CLIENTE = $numcliente";
// ejecución de la consulta
$resultado = mysql_query($consulta,$c);
426
CONECTIVIDAD A BASES DE DATOS MYSQL DESDE PHP
if ($resultado)
print "<CENTER><I>
Datos actualizados</I></CENTER>";
}
// generación de la consulta de selección a partir
// de las variables del formulario
$consulta = "SELECT * FROM CLIENTES WHERE
NUM_CLIENTE=$numcliente";
// ejecución de la consulta
$resultado = mysql_query($consulta,$c);
// comprobación existencia de algún registro
resultado
if(mysql_num_rows($resultado)) {
// se recupera el registro resultado en un array
$registro = mysql_fetch_row($resultado);
// obtención del password real del cliente en la
BD
//(octavo campo del registro: índice 7)
$passwordreal = $registro[7];
// comprobación de la validez del password
if ($pass == $passwordreal) {
mostrarpagina($registro);
}
else {
// denegar acceso
print "<H2 ALIGN=center>
Contraseña incorrecta</H2>";
}
} else {
// ningún registro coincide con el número de
cliente
print("<H2 ALIGN=center>
Error en la identificación</H2>");
}
// cierre de la conexión
mysql_close($c);
}
?>
<?php
// función que genera la página personal
function mostrarpagina($datos) {
print "<H2 ALIGN=center> Página de $datos[1] </H2>";
print "<CENTER>";
print "<FORM ACTION=accesocliente.php METHOD=post>";
print "<TABLE WIDTH=80% BORDER BGCOLOR=#99CCFF>
<TR>
427
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
428
CONECTIVIDAD A BASES DE DATOS MYSQL DESDE PHP
<TD>
<INPUT TYPE=text SIZE=9 NAME=nif
VALUE='$datos[8]'>
</TD>
</TR>
</TABLE>";
print "<INPUT TYPE=hidden NAME=modificar VALUE=1>
<INPUT TYPE=hidden NAME=numcliente
VALUE=$datos[0]>
<BR><INPUT TYPE=submit VALUE=Actualizar>
</FORM>";
print "<H3 ALIGN=center> A fecha de hoy tienes un total
de $datos[6] puntos acumulados </H3>";
print "</CENTER><BR>";
}
?>
<HR>
<A HREF="clientes.htm">Volver al área de clientes</A>
</BODY>
</HTML>
Este archivo comienza con el código HTML que genera una pequeña barra de
navegación en la página para que el usuario pueda desplazarse a otras páginas del
sitio web. Tras este código HTML aparece el programa PHP encargado de la
generación del contenido de la página personal. Este programa comienza
comprobando si se han recibido las variables correspondientes al número de cliente
y clave de acceso desde el formulario previo.
La página ha sido diseñada para que permita también actualizar los datos del
cliente, de manera que se utilizará una variable $modificar que tomará el valor
1 cuando se acceda a la página después de una petición de actualización de datos.
En el caso de acceder directamente desde el formulario del área de clientes, esta
variable no estará definida.
429
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
El aspecto final de la página personal del cliente que es generada con este
programa es el que puede verse en la Figura 16.2.
430
CONECTIVIDAD A BASES DE DATOS MYSQL DESDE PHP
mysql_fetch_array(resultado)
mysql_fetch_array(resultado, tipo_asociación)
mysql_fetch_assoc(resultado)
431
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Además, debe destacarse que no se aprecian diferencias significativas con las otras
dos funciones en cuanto a tiempo de ejecución.
Esta página incorpora en su parte inferior un enlace que dará acceso al programa
que realiza la conexión a la base de datos para recuperar todos los registros de la
tabla salas. El enlace se encuentra definido de la siguiente manera:
432
CONECTIVIDAD A BASES DE DATOS MYSQL DESDE PHP
Fichero listadosalas.php:
<HTML>
<HEAD><TITLE>Salas disponibles</TITLE></HEAD>
<BODY>
<?php
// carga de las variables de configuración
// y realización de la conexión
require('configuracion.inc');
$c = mysql_connect($host,$usuario,$password)
or die("Error: " . mysql_error());
mysql_select_db($db,$c)
or die("Error: " . mysql_error());
// generación de la consulta de selección
$consulta = "SELECT * FROM SALAS";
// ejecución de la consulta
$resultado = mysql_query($consulta,$c);
if ($resultado) {
print "<H2 ALIGN=center>
Listado de salas disponibles</H2>";
// se recorren todos los registros del resultado
print "<TABLE WIDTH=100% BORDER>
<TR> <TH>Numero de sala</TH>
<TH>Aforo</TH>
<TH>Número de filas</TH>
<TH>Observaciones</TH> </TR>";
$cont = 0;
while($sala = mysql_fetch_array($resultado)){
$cont++;
$nsala = $sala['NUM_SALA'];
$aforo = $sala['AFORO'];
$nfilas = $sala['NUM_FILAS'];
$observaciones = $sala['OBSERVACIONES'];
if ($cont%2==0)
echo("<TR ALIGN=center BGCOLOR='#99CCFF'>\n");
else
echo("<TR ALIGN=center BGCOLOR='#3399FF'>\n");
print "<TD> $nsala </TD>
<TD> $aforo </TD>
<TD> $nfilas </TD>
433
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
434
CONECTIVIDAD A BASES DE DATOS MYSQL DESDE PHP
Esta página dispone de un enlace directo a la cartelera del día actual y un calendario con
enlaces a las carteleras de cualquier otro día. Todos estos enlaces dinámicos son creados
por un programa PHP. El primero de ellos, el que genera el enlace a la cartelera del día,
es bastante simple puesto que únicamente utiliza la función date() para obtener el día
435
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
actual e incluye esos parámetros en el enlace como parte del URL. El segundo script, el
que genera el calendario, resulta más complejo y en este caso se ha programado en un
documento diferente e integrado con la función include().
Fichero proyecciones.php:
<HTML>
<HEAD>
<TITLE>Nuestra cartelera</TITLE>
</HEAD>
<BODY TEXT=blue>
<TABLE WIDTH="100%" BORDER BGCOLOR=#99CCFF>
<TR>
<TH WIDTH="16%">
<A HREF="principal.htm">Página principal</A></TH>
<TH WIDTH="17%">
<A HREF="salas.htm">Nuestras salas</A></TH>
<TH WIDTH="17%">
<A HREF="clientes.htm">Área de clientes</A></TH>
<TH WIDTH="17%">
<A HREF="entradas.htm">Compra de entradas</A></TH>
<TH WIDTH="17%">
<A HREF="estrenos.htm">Próximos estrenos</A></TH>
<TH WIDTH="16%">
<A HREF="foros/index.php">Foro Cinem@s</A></TH>
</TR>
</TABLE>
<H1 ALIGN="center">Nuestra cartelera</H1>
<CENTER>
<TABLE BORDER>
<TR ALIGN=center><TD WIDTH=50%>
<FONT SIZE=+1>
Aquí puedes consultar nuestra oferta para el día de hoy
<BR><BR>
<?php
$dia_hoy=date("d");
$mes_hoy=date("m");
$anno_hoy=date("Y");
print "<A HREF =
cartelera.php?dia=$dia_hoy&mes=$mes_hoy&anno=$anno_hoy>
<IMG SRC='images/rollo.gif' BORDER=0><BR>
Cartelera de hoy
</A>";
?>
436
CONECTIVIDAD A BASES DE DATOS MYSQL DESDE PHP
</FONT>
</TD>
<TD WIDTH=50%>
<FONT SIZE=+1>
Si prefieres puedes consultar la cartelera de otro día
seleccionando la fecha deseada en nuestro calendario:
</FONT>
<BR><BR>
<?php
include("calendario.php");
?>
<BR>
</TD>
</TR>
</TABLE>
</CENTER>
</BODY>
</HTML>
Fichero calendario.php:
<?php
$nombremes=array(1=>"ENERO",2=>"FEBRERO",3=>"MARZO",
4=>"ABRIL",5=>"MAYO",6=>"JUNIO",
7=>"JULIO",8=>"AGOSTO",9=>"SEPTIEMBRE",
10=>"OCTUBRE",11=>"NOVIEMBRE",
12=>"DICIEMBRE");
437
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
default:
$nd=31;
}
return($nd);
}
438
CONECTIVIDAD A BASES DE DATOS MYSQL DESDE PHP
</TH><TH>
<A HREF =
proyecciones.php?mes=$mes_siguiente&anno=$anno_siguiente>
<FONT COLOR=white>>>
</A>
</TH></TR>";
print "<TR ALIG=center BGCOLOR=#3399FF>
<TH WIDTH=14%>Lu</TH><TH WIDTH=14%>Ma</TH>
<TH WIDTH=14%>Mi</TH><TH WIDTH=14%>Ju</TH>
<TH WIDTH=14%>Vi</TH><TH WIDTH=14%>Sa</TH>
<TH WIDTH=14%>Do</TH> </TR>";
print("<TR>");
$aux=1;
//genera celdas en blanco hasta llegar al comienzo del mes
while($aux<$diasemana) {
print("<TD> </TD>");
$aux++;
}
for($i=1;$i<=$nd;$i++) {
$enlace = "<A HREF =
cartelera.php?dia=$i&mes=$mes&anno=$anno>
<FONT SIZE=+1> $i </A>";
if ($i==$hoy)
print("<TH BGCOLOR=red>$enlace</TH>");
elseif(($diasemana==6) or ($diasemana==7))
print("<TH BGCOLOR=#99CCFF>$enlace</TH>");
else
print("<TH>$enlace</TH>");
$diasemana++;
if($diasemana==8) {
// comienza nueva semana
print("</TR>");
print("<TR>");
$diasemana=1;
}
}
print("</TR></TABLE>");
}
439
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Como puede apreciarse en estos programas, los enlaces generados dinámicamente apuntan
hacia la página cartelera.php, enviándose a dicha página a través del URL tres parámetros
(día, mes y año) que identifican la fecha cuya cartelera se quiere consultar. El documento
recibe esos parámetros y generará con ellos la cartelera mediante un programa PHP que se
conecta a la base de datos. El contenido completo de este documento cartelera.php sería:
Fichero cartelera.php:
<HTML>
<HEAD><TITLE>La cartelera</TITLE></HEAD>
<BODY>
<?php
if(isset($dia,$mes,$anno)) {
// carga de las variables de configuración
// y realización de la conexión
require('configuracion.inc');
$c = mysql_connect($host,$usuario,$password)
or die("Error: " . mysql_error());
mysql_select_db($db,$c)
or die("Error: " . mysql_error());
// generación de la consulta
$fecha = "$anno-$mes-$dia";
$q = "SELECT PELICULAS.IDPELICULA,TITULO,
IDPROY,NUM_SALA,HORA
FROM PELICULAS,PROYECCIONES
WHERE
PROYECCIONES.IDPELICULA =
PELICULAS.IDPELICULA
AND
FECHA = '$fecha'
ORDER BY HORA";
// ejecución de la consulta
$r = mysql_query($q,$c);
if ($r) {
print "<H2 ALIGN=center>
Cartelera del dia $dia-$mes-$anno</H2>";
// se recorren todos los registros del resultado y
// se genera una tabla con ellos
if(mysql_num_rows($r)==0) {
print "<H2 ALIGN=center>
<I>Lo sentimos, no tenemos disponible
la cartelera de este día </I></H2>";
}
else {
print "<TABLE WIDTH=100% BORDER>
<TR> <TH>Película</TH>
440
CONECTIVIDAD A BASES DE DATOS MYSQL DESDE PHP
<TH WIDTH=50>Sala</TH>
<TH WIDTH=80>Hora</TH>
<TH WIDTH=100>Compra</TH>
</TR>";
$cont = 0;
while($proy = mysql_fetch_array($r)){
$cont++;
$idpelicula = $proy['IDPELICULA'];
$idproy = $proy['IDPROY'];
$titulo = $proy['TITULO'];
$num_sala = $proy['NUM_SALA'];
$hora = $proy['HORA'];
list($h,$m,$s)=explode(":",$hora);
if ($cont%2==0)
print "<TR ALIGN=center
BGCOLOR='#99CCFF'>\n");
else
print "<TR ALIGN=center
BGCOLOR='#3399FF'>\n");
print "<TD><A
HREF=pelicula.php?peli=$idpelicula
TARGET='_blank'>
<FONT SIZE=+2> $titulo </FONT>
</A>
</TD>
<TD>
<FONT SIZE=+2> $num_sala </FONT>
</TD>
<TD>
<FONT SIZE=+2> $h:$m </FONT> </TD>";
print "<TD> <A
HREF=comprar.php?idproy=$idproy>
<IMG SRC='images/ticket.gif'
BORDER=0>
</A> </TD>";
print "</TR>";
}
}
print "</TABLE>";
}
// cierre de la conexión
mysql_close($c);
}
?>
<HR>
<A HREF="proyecciones.php">Volver</A>
</BODY>
441
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
442
CONECTIVIDAD A BASES DE DATOS MYSQL DESDE PHP
Fichero pelicula.php:
<HTML>
<HEAD><TITLE>Ficha técnica de la película</TITLE></HEAD>
<BODY>
<?php
// comprobación de la correcta recepción del
// identificador de la película
if (isset($peli)) {
// conexión
require('configuracion.inc');
$c = mysql_connect($host,$usuario,$password)
or die("Error: " . mysql_error());
mysql_select_db($db,$c)
or die("Error: " . mysql_error());
// generación de la consulta
$q = "SELECT * FROM PELICULAS
WHERE IDPELICULA = $peli";
// ejecución de la consulta
$r = mysql_query($q,$c);
if ($r) {
print "<H2 ALIGN=center>Ficha de la pelicula</H2>";
$p = mysql_fetch_array($r);
$titulo = $p['TITULO'];
$actores = $p['ACTORES'];
$produccion = $p['PRODUCCION'];
$direccion = $p['DIRECCION'];
$guion = $p['GUION'];
$anno = $p['ANNO'];
$duracion = $p['DURACION'];
$nacionalidad = $p['NACIONALIDAD'];
$genero = $p['GENERO'];
$edad = $p['EDAD_RESTRICCION'];
$sinopsis = $p['SINOPSIS'];
$cartelera = $p['CARTELERA'];
// generación de un archivo temporal con la
// imagen del cartel de la película
$foto=tempnam("/carteles",'car');
$ft=fopen($foto,"w");
fwrite($ft,$cartelera);
fclose($ft);
print "<TABLE WIDTH=100% BORDER BGCOLOR='#99CCFF'>";
print "<TR> <TD>
<H2> $titulo </H2>";
print " <IMG SRC='$foto'>
</TD>";
print "<TD> <B>Sinopsis:</B> $sinopsis <BR>
443
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
444
CONECTIVIDAD A BASES DE DATOS MYSQL DESDE PHP
445
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Fichero comprar.php:
<HTML>
<HEAD><TITLE>Compra de entradas</TITLE></HEAD>
<?php
function generarplanosala($filas,$cols) {
global $ocupada;
global $idproy;
// número de columnas de la tabla
print "<FORM ACTION=confirmarcompra.php
METHOD='post'>";
print "<TABLE BORDER>";
print "<TR><TH></TH>
<TH COLSPAN=$cols BGCOLOR=#99CCFF>
Asiento </TH>";
print "<TR BGCOLOR=#99CCFF><TH>Fila</TH>";
for($j=1;$j<=$cols;$j++) {
print "<TH WIDTH=50>A$j</TH>";
}
print "</TR>";
for($i=1;$i<=$filas;$i++) {
print "<TR><TH BGCOLOR=#99CCFF>F$i</TH>";
for($j=1;$j<=$cols;$j++) {
if ($ocupada[$i][$j]) {
print "<INPUT TYPE='hidden'
NAME='F$i" . "A$j' VALUE=0>";
print "<TD ALIGN=center BGCOLOR=red>O</TD>";
}
else {
print "<TD ALIGN=center>
<INPUT TYPE='hidden'
NAME='F$i" . "A$j' VALUE=0>
<INPUT TYPE='checkbox'
NAME='F$i" . "A$j' VALUE=1>
</TD>";
}
}
print "</TR>";
}
print "</TABLE>";
print "<INPUT TYPE='hidden' NAME='numfilas'
VALUE=$filas>";
print "<INPUT TYPE='hidden' NAME='numcols'
VALUE=$cols>";
print "<INPUT TYPE='hidden' NAME='idproy'
446
CONECTIVIDAD A BASES DE DATOS MYSQL DESDE PHP
VALUE=$idproy>";
print "<P ALIGN=right>Número de cliente:
<INPUT TYPE='text' SIZE=6 NAME=numcliente><BR>
Contraseña:
<INPUT TYPE='password' SIZE=6 NAME=clave>";
print "<BR> <INPUT TYPE='submit' VALUE='Comprar'>
</P></FORM>";
}
?>
<BODY>
<?php
if (isset($idproy)) {
// conexión a la base de datos
require('configuracion.inc');
$c = mysql_connect($host,$usuario,$password)
or die("Error: " . mysql_error());
mysql_select_db($db,$c)
or die("Error: " . mysql_error());
// obtención de las dimensiones de la sala
$q = "SELECT AFORO,NUM_FILAS FROM SALAS,PROYECCIONES
WHERE
IDPROY = $idproy
AND
PROYECCIONES.NUM_SALA = SALAS.NUM_SALA";
// ejecución de la consulta
$r = mysql_query($q,$c);
list($aforo,$num_filas) = mysql_fetch_array($r);
print "<H2 ALIGN=center> Localidades disponibles
</H2>";
// generación de un array bidimensional para anotar
// las localidades ya ocupadas
$num_columnas =(integer)($aforo/$num_filas);
for($i=1;$i<=$num_filas;$i++) {
for($j=1;$j<=$num_columnas;$j++) {
$ocupada[$i][$j]=FALSE;
}
}
// recuperación de todas las localidades ya ocupadas
$q = "SELECT FILA,NUM_ASIENTO FROM ENTRADAS
WHERE IDPROY = $idproy";
// ejecución de la consulta
$r = mysql_query($q,$c);
if ($r) {
while(list($f,$a) = mysql_fetch_array($r)){
$ocupada[$f][$a]=TRUE;
}
447
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
}
// generación del plano de la sala
generarplanosala($num_filas,$num_columnas);
// cierre de la conexión
mysql_close($c);
}
?>
<A HREF="proyecciones.php">Volver a la cartelera</A>
</BODY>
</HTML>
El formulario de la Figura 16.8 envía los datos relativos al cliente y las localidades
adquiridas por este a una nueva página (confirmarcompra.php) que se encarga de
comprobar la validez de la identificación del cliente y, en su caso, añadir la compra
a la correspondiente tabla de la base de datos, incrementar el saldo de puntos
acumulados por el cliente y presentarle una página de notificación. El código
completo de este último archivo es el siguiente.
Fichero confirmarcompra.php:
<HTML>
<HEAD><TITLE>Confirmación de la compra</TITLE></HEAD>
<BODY>
<?php
if (isset($numcliente,$clave)) {
// conexión a la base de datos
require('configuracion.inc');
$c = mysql_connect($host,$usuario,$password)
or die("Error: " . mysql_error());
mysql_select_db($db,$c)
or die("Error: " . mysql_error());
// autentificación del cliente
$q = "SELECT CLAVE,PUNTOS_ACUM FROM CLIENTES
WHERE NUM_CLIENTE=$numcliente";
$r = mysql_query($q,$c);
if (mysql_num_rows($r)==0)
die("CLIENTE NO REGISTRADO");
$p = mysql_fetch_array($r);
$clave_real=$p['CLAVE'];
$puntos_acum=$p['PUNTOS_ACUM'];
if ($clave!=$clave_real)
die("ERROR: identificación incorrecta");
// registro de las entradas adquiridas
$compra = FALSE;
$ncompradas = 0;
print "Localidades adquiridas:";
448
CONECTIVIDAD A BASES DE DATOS MYSQL DESDE PHP
print "<UL>";
for($i=1;$i<=$numfilas;$i++)
for($j=1;$j<=$numcols;$j++) {
$nomCheck="F$i"."A$j";
if ($$nomCheck) {
// localidad adquirida por el cliente
$compra = TRUE;
$ncompradas++;
// se inserta el registro en la tabla entradas
$q = "INSERT INTO ENTRADAS(IDPROY,FILA,
NUM_ASIENTO,
NUM_CLIENTE,RECOGIDA)
VALUES($idproy,$i,$j,$numcliente,0)";
$r = mysql_query($q,$c);
print "<LI> Fila <B>$i</B>, asiento
<B>$j</B>";
}
}
if ($compra) {
// actualización de los puntos acumulados del
cliente
$puntos_acum = $puntos_acum + 5 * $ncompradas;
$q = "UPDATE CLIENTES SET PUNTOS_ACUM=$puntos_acum
WHERE NUM_CLIENTE=$numcliente";
$r = mysql_query($q,$c);
if ($r)
print "<CENTER><U>Tu saldo de puntos tras
esta compra será de $puntos_acum
puntos</U></CENTER>";
print "<H3 ALIGN=center> <I>Recuerda que tu entrada
estará reservada hasta 5 minutos antes del
inicio de la sesión. Si transcurrido ese
plazo
no has procedido al pago de la misma, la
reserva se anulará automáticamente </I><BR>
Muchas gracias por tu compra y a difrutar con
el mejor cine!!!</H3>";
}
// cierre de la conexión
mysql_close($c);
}
?>
<A HREF="proyecciones.php">Volver a la cartelera</A>
</BODY>
</HTML>
449
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
mysql_ free_result(resultado)
mysql_affected_rows()
mysql_num_rows(resultado)
mysql_field_name(resultado,indice)
mysql_field_len(resultado,indice)
mysql_field_type(resultado,indice)
450
CONECTIVIDAD A BASES DE DATOS MYSQL DESDE PHP
451
IMPLEMENTACIÓN
DE FOROS
17.1. INTRODUCCIÓN
Mediante el uso combinado de MySQL y el lenguaje PHP resulta muy sencillo
implementar en un sitio web un sistema de foros a través del cual todos los
visitantes del sitio puedan enviar sus comentarios, responder a mensajes de otros
usuarios, plantear dudas,... Los foros constituyen una de las aplicaciones más
utilizadas de PHP y MySQL; de hecho, es posible encontrar una amplia variedad
de desarrollos open source para implementarlos. En el Capítulo 18, en el que se
presentan algunas de la soluciones open source más conocidas, se pueden encontrar
algunas referencias a este tipo de aplicaciones de gestión de foros.
453
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Todos los mensajes enviados por los usuarios deben quedar almacenados para
poder ser visualizados por cualquier otro usuario en cualquier momento. Por tanto,
lo primero que se necesitará es una nueva tabla en la base de datos de Cinem@s.
454
IMPLEMENTACIÓN DE FOROS
455
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
<HTML>
<HEAD>
<TITLE>El foro de Cinem@s</TITLE>
</HEAD>
<BODY>
<TABLE WIDTH="100%" border bgColor=#99CCFF>
<TR>
<TH WIDTH="16%"><A HREF="../principal.htm">
Página principal</A></TH>
<TH WIDTH="17%"><A HREF="../proyecciones.htm">
Nuestra cartelera</A></TH>
<TH WIDTH="17%"><A HREF="../salas.htm">
Nuestras salas</A></TH>
<TH WIDTH="17%"><A HREF="../clientes.htm">
Área de clientes</A></TH>
<TH WIDTH="17%"><A HREF="../entradas.htm">
Compra de entradas</A></TH>
<TH WIDTH="16%"><A HREF="../estrenos.htm">
Próximos estrenos</A></TH>
</TR>
</TABLE>
<H1 ALIGN="center">
<FONT COLOR=blue>El foro de usuarios de Cinem@s</FONT>
</H1>
<TABLE WIDTH="100%" border>
<TR>
<TH WIDTH=100>FECHA</TH>
<TH>TITULO</TH>
<TH WIDTH=100>RESPUESTAS</TH>
</TR>
<?
// conexión a la base de datos
require('configuracion.inc');
$enlace = mysql_connect($host,$usuario,$password);
mysql_select_db($db,$enlace);
// consulta: selección de todos los mensajes
// cuyo identificador de mensaje "padre" es 0
$consulta = "SELECT * FROM foro WHERE identificador = 0
ORDER BY fecha DESC";
$consulta = mysql_query($consulta,$enlace);
456
IMPLEMENTACIÓN DE FOROS
Como puede apreciarse, la página comienza con el código necesario para generar
una tabla con enlaces a las restantes páginas del sito web de Cinem@s, tras esos
enlaces se genera, mediante un script PHP, una nueva tabla con las fechas, títulos y
números de respuestas de los mensajes cabecera de cada cadena de mensajes. Los
títulos de cada mensaje se encuentran enlazados con la página foro.php, pasando a
esta página en dicho enlace el id concreto del mensaje; este id será utilizado para
acceder al correspondiente registro de la tabla. Finalmente, se encuentra un enlace
a la página formulario.php que permitirá crear un nuevo mensaje.
457
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
458
IMPLEMENTACIÓN DE FOROS
Fichero foro.php:
<HTML>
<HEAD>
<TITLE>Foro Cinem@s</TITLE>
</HEAD>
<BODY>
<?
// comprobación de la correcta recepción del
// id del mensaje a través del URL
if(isset($id)) {
// conexión a la base de datos
require('configuracion.inc');
$enlace = mysql_connect($host,$usuario,$password);
mysql_select_db($db,$enlace);
// consulta: selección de todos los mensajes cuyo
// valor del atributo identificador es el que ha
// sido pasado a través del URL
$consulta = "SELECT * FROM foro
WHERE id = '$id'
ORDER BY fecha DESC";
$consulta = mysql_query($consulta,$enlace);
// muestra de los atributos del mensaje
$row = mysql_fetch_array($consulta);
$titulo=$row["titulo"];
$autor=$row["autor"];
$mensaje=$row["mensaje"];
$fecha=$row["fecha"];
$respuestas=$row["respuestas"];
print "<TABLE WIDTH=100% BORDER>
<TR><TH WIDTH=100 BGCOLOR=blue>
<FONT COLOR=white>Título</TH>";
print "<TD WIDTH=*> $titulo </TD></TR>";
print "<TR><TH BGCOLOR=blue>
<FONT COLOR=white>Fecha</TH>";
print "<TD>" . date("d-m-Y",$fecha) . "</TD></TR>";
print "<TR><TH BGCOLOR=blue>
<FONT COLOR=white>Autor</TH>";
print "<TD> $autor </TD></TR>";
print "<TR><TH BGCOLOR=blue>
<FONT COLOR=white>Mensaje</TH>";
print "<TD> $mensaje </TD></TR></TABLE>";
// generación de enlaces para añadir respuesta
// y para volver a la página principal del foro
print "<CENTER><FONT FACE=arial SIZE=2>";
459
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
$url = "formulario.php?id=$id&" .
"respuestas=$respuestas&" .
"titulo=$titulo";
print "<A HREF=$url>";
print "<BR>Añadir respuesta </A> ";
print "<A HREF=index.php>Volver al foro</A>
</FONT></CENTER>";
460
IMPLEMENTACIÓN DE FOROS
Fichero formulario.php:
461
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
</TR>
<TD>Mensaje:</TD>
<TD><TEXTAREA NAME="mensaje" ROWS=6 COLS=30>
</TEXTAREA>
</TD>
</TR>
<TR><TD> <INPUT TYPE=submit VALUE="Enviar"> </TD></TR>
</TABLE>
</FORM>
Una vez que el usuario ha completado todos los campos del formulario, estos serán
enviados a la página nuevomensaje.php que se encargará de realizar la inserción en
la base de datos y cuyo código se presenta a continuación.
Fichero nuevomensaje.php:
<?php
// conexión a la base de datos
require('configuracion.inc');
$enlace = mysql_connect($host, $usuario, $password);
mysql_select_db($db,$enlace);
// obtención de la fecha y hora actual
$fecha = time();
// si el mensaje no es respuesta a ningún otro
// se asigna el valor 0 al identificador del
// mensaje "padre".
if(empty($identificador)){
$identificador=0;
}
// generación de la consulta de inserción
$sql = "INSERT INTO foro(autor,titulo,mensaje,
fecha,identificador)
VALUES ('$autor','$titulo',
'$mensaje','$fecha',
'$identificador')";
mysql_query($sql);
// en el caso de ser respuesta a un mensaje previo
// es necesario actualizar el número de respuestas
// del mensaje al que responde
if($identificador!=0) {
$respuesta = $respuestas+1;
$sql2 ="UPDATE foro SET respuestas = '$respuesta'
462
IMPLEMENTACIÓN DE FOROS
WHERE id = '$identificador'";
mysql_query($sql2);
}
// se vuelve a la página principal del foro
header("location: index.php");
?>
463
SOLUCIONES OPEN
SOURCE BASADAS EN
PHP Y MYSQL
18.1. INTRODUCCIÓN
La evolución y cambios de Internet, tanto en contenidos como en formas y modos
de desarrollarlos y presentarlos al usuario o navegante, ha sido algo continuo.
Partiendo de los desarrollos iniciales en HTML, estático, se ha ido buscando
progresivamente un mayor dinamismo e interacción con el usuario, completando
HTML con Html dinámico, lenguajes embebidos Java Script, PHP, etc. A esta
necesidad de dinamismo e interacción de los sitios web se une otra no menos
importante como es la necesidad de una cada vez mayor cantidad de información y
de herramientas informáticas apropiadas para su gestión.
465
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
24
En las aplicaciones que no son de código abierto lo que se adquiere es el derecho a usar
la aplicación pero no la propiedad de la misma ni la capacidad de modificarla, copiarla o
distribuirla, sin el permiso del propietario de la patente, lo que supone la dependencia de
este.
25
Indicar que nos referimos exclusivamente a los gestores de contenido web, pues el
termino gestión de contenido tiene un significado amplio existiendo otro tipo de
aplicaciones de gestión de contenido, como por ejemplo las de gestión de contenido
documental, etc.
466
SOLUCIONES OPEN SOURCE BASADAS EN PHP Y MYSQL
Sin embargo, una solución más reciente que ha ido cobrando importancia
creciente tanto entre empresas como entre particulares es la aportada por los
gestores de contenido web, denominados generalmente con las siglas CMS,
procedente de la terminología anglosajona Content Management System. Si bien
no hay una definición oficial u homogénea referida a los gestores de contenido
web, analizando qué son y qué permiten hacer se podría proponer la siguiente
definición:
26
Forrester Research: Las condiciones de retorno de un visitante a un sitio disponible en:
http://www.jipo-interactive.com/es/articles/webmastering/article_webmastering_1
467
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
18.2.1. FUNCIONAMIENTO
Pese a la gran diversidad de aplicaciones, generalmente los gestores de contenido
tienen un funcionamiento similar. Son aplicaciones modulares que se apoyan en
bases de datos o repositorios y están formadas por dos elementos, la aplicación
gestora de contenidos (CMA) y la aplicación de presentación de contenidos (CDA)
que se utilizan mediante una única interfaz más o menos intuitiva, dependiendo de
la aplicación, y por lo general de tipo web. El CMA, permite al autor del sitio, sin
necesidad de que este posea conocimientos de HTML u otro lenguaje, realizar la
creación, actualización y eliminación del contenido del sitio web. El CDA por su
parte, permite al autor elegir, mediante la selección de plantillas, el formato en que
se presentarán los contenidos.
18.2.2. CARACTERÍSTICAS
La oferta existente de aplicaciones dedicadas a la gestión de contenidos web
(CMS) es muy heterogénea tanto en número de aplicaciones como en las
características concretas que estas presentan. Respecto a las aplicaciones de gestión
de contenidos web open source, existe un elevado número de alternativas fruto de
un continuo desarrollo y mejora, característico de las comunidades open source.
Pero este elevado número de aplicaciones no implica que todas estén al mismo
nivel de desarrollo. Algunas están ampliamente testadas y consolidadas, con
numerosos manuales y documentación de apoyo, entre otras se pueden citar como
468
SOLUCIONES OPEN SOURCE BASADAS EN PHP Y MYSQL
ejemplos PHPnuke, PostNuke, Xoops, y otras son de creación más reciente, aunque
no por ello peores, como Mambo.
El elegir una u otra aplicación debería venir precedido, tanto para empresas como
particulares, por:
1. Definir cuáles son los objetivos, características y público objetivo del sitio
web a crear.
2. Analizar las características de las distintas aplicaciones y de las
comunidades que las han desarrollado para determinar cuál se ajusta mejor
a las necesidades detectadas.
A pesar de la gran diversidad de aplicaciones CMS open source, todas tienen una
misma finalidad y convergen en una serie de características. Estas características
podrían considerarse como las propiedades o requisitos mínimos a exigir a un
CMS, de forma que sirvan de indicativo para cribar entre las numerosas
aplicaciones y determinar cuáles pueden ser las más adecuadas en función siempre
de las necesidades particulares. A continuación, examinado el funcionamiento de
distintas aplicaciones CMS, se recoge una orientación de los requisitos mínimos
deseables para dichas aplicaciones, tanto relativos a la creación de contenido como
a la gestión, publicación y presentación de los contenidos.
— Creación de contenido:
o Interfaz intuitivo y fácil de utilizar, para la creación y gestión tanto del
sitio web como de los contenidos, por personal no técnico o sin
conocimientos informáticos elevados.
o Separación de la presentación, diferentes formatos y diseños definidos,
de los contenidos a publicar.
o Posibilidad de establecer múltiples autores de contenidos.
o Reutilización y compartición de los elementos que conforman el sitio
web, estructuras, contenidos, diseños, etc., evitando duplicaciones y
ahorrando recursos.
— Gestión de contenidos
o Control completo del ciclo de vida de los contenidos, entendidos estos
en sentido amplio como cualquier información, imágenes, texto, etc.,
desde su creación hasta su eliminación o archivo pasando por su
control o validación, publicación, actualización y control de versiones.
o Nivel de seguridad aceptable para poder proteger la integridad de los
contenidos.
o Permitir la designación de roles o distintos perfiles de usuarios, cada
uno con unos privilegios respecto a la gestión del contenido.
469
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
— Publicación
o Publicación de contenidos en diferentes formatos HTML, PDF,...
o Permitir la personalización, presentar diferente información para
diferentes perfiles.
o Definir los flujos de trabajo incluyendo actualización, validación y
publicación en función de los distintos perfiles definidos.
o Proporcionar estadísticas sobre hábitos de navegación de los visitantes,
contenidos más visitados, etc.
o Previsualización interna de contenidos anterior a su publicación a los usuarios.
o Composición especificada en plantillas basadas en XML.
o Posibilidad de ofrecer soporte multilingüe.
— Presentación final
o Usabilidad, recoge conceptos de facilidad de uso y eficiencia para todos los
usuarios además de una navegación coherente y comprensible.
o Accesibilidad, el sitio que se desarrolle debe ser conforme a estándares
como los de W3C y permitir ser soportado por distintos navegadores.
o Velocidad de descarga, limitar el tamaño del sitio para garantizar un
tiempo de descarga aceptable para el usuario.
o Metadatos, las páginas del sitio deben ofrecer suficientes metadatos
para asegurar la indexación en buscadores.
Ventajas Inconvenientes
— Facilitan la creación de un sitio web y la — Dominar una aplicación CMS requiere
completa gestión de sus contenidos sin tener tiempo y en el caso de grandes empresas,
excesivos conocimientos informáticos. pueden suponer un alto coste en consultores
— Permiten incorporar al sitio web diferentes que integren la aplicación con el sistema
servicios como foros, chats, encuestas,... existente en la organización.
— Facilidad para la modificación del sitio y de los — En algunos casos puede generar un exceso
contenidos de forma remota, desde cualquier de homogeneidad con otros sitios
punto con conexión a Internet. desarrollados con el mismo CMS.
— Personalización del sitio en función del — El desarrollo y mejoras de la aplicación
usuario, creando distintos perfiles. están vinculados al desarrollo de la
— Gratuidad y código abierto. comunidad creadora del software.
Tabla 18.1 Ventajas e inconvenientes de los gestores de contenido
470
SOLUCIONES OPEN SOURCE BASADAS EN PHP Y MYSQL
18.3.1. PHP-NUKE
Sitio oficial http://www.phpnuke.org
www.phpnuke-espanol.org/
PHPNuke se ha convertido en los últimos años en uno de los gestores de web más
utilizados y completos que existen, ya que permite crear los sitios web con enorme
facilidad, gestionar su publicación y desarrollar una comunidad de usuarios, todo
en uno y con múltiples servicios añadidos. Algunas de las características que se
podrían destacar son:
471
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
472
SOLUCIONES OPEN SOURCE BASADAS EN PHP Y MYSQL
18.3.2. POSTNUKE
Sitio oficial www.postnuke.com
www.postnuke-hispano.com
473
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Mambo open source es una aplicación escrita en PHP basada en los sistemas de
administración de contenidos, que permite la fácil creación y mantenimiento de
sitios web y portales. Como todos los CMS, su simplicidad se traduce en que no
son necesarios grandes conocimientos para actualizar, mantener y personalizar los
contenidos. Incorpora un editor WYSIWYG propio de contenido. Sus
características son similares a las de los productos anteriores.
Está disponible para diferentes plataformas, entre las que se encuentran Linux,
FreeBSD, MacOSX Server, Solaris, AIX, SCO, WinNT y Win2K.
474
SOLUCIONES OPEN SOURCE BASADAS EN PHP Y MYSQL
18.3.4. PHPWEBSITE
Sitio oficial phpwebsite.appstate.edu
A fecha de hoy no existe sitio oficial en español y tiene pocos complementos para
añadir. Puede ser una opción interesante para desarrollar sitios de empresas sin los
requerimientos de una comunidad.
475
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
18.3.5. PHP-WCMS
Sitio oficial www.phpwcms.de
Es un CMS optimizado para una rápida y fácil instalación sobre cualquier servidor
web que soporte PHP y MySQL. Ha sido probado satisfactoriamente sobre
Windows 2000/XP, MacOSX y LINUX.
476
SOLUCIONES OPEN SOURCE BASADAS EN PHP Y MYSQL
18.3.6. XOOPS
Sitio oficial www.xoops.org
www.esxoops.com
477
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
18.3.7. DRUPAL
Sitio oficial www.drupal.org
drupal.badopi.org
Drupal es un CMS desarrollado en PHP, puede ser usado con MySQL o con
PostgreSQL y ejecutado sobre múltiples plataformas, incluyendo los servidores
Apache o IIS de Microsoft.
478
SOLUCIONES OPEN SOURCE BASADAS EN PHP Y MYSQL
18.3.8. SITEFRAME
Sitio oficial siteframe.org
Se trata de un CMS diseñado para crear rápidamente sitios web para comunidades.
Dispone de un conjunto de plantillas con un diseño agradable y artístico.
479
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
18.4.1. WEBLOGS
Los weblogs, también conocidos como bitácoras, constituyen una de las formas
más sencillas de crear y actualizar una página web. De este fenómeno emergente
han nacido varios sistemas de publicación gratuitos basados en PHP y MySQL que
permiten poner un weblog en marcha en menos de cinco minutos, sin ningún
conocimiento previo.
Antes de nada conviene tratar de clarificar lo que se entiende por weblog, aunque
no es fácil encontrar una definición precisa, y de hecho existe un debate abierto
sobre el tema, se podría decir que un weblog es un sitio web donde se recopilan
cronológicamente mensajes de uno o varios autores, sobre una temática o a modo
de diario personal. Estos sitios web suelen incorporar enlaces a otros weblogs,
archivos de entradas anteriores, enlaces para citar anotaciones, funciones para
añadir comentarios,...
GeekLog
Sitio oficial www.geeklog.net
— Permite que los usuarios se registren como miembros y envíen sus historias o
artículos.
— Dispone de un sistema para añadir comentarios a los artículos publicados por
los miembros.
— Sistema basado en plugins para extender la aplicación.
— Generación automática de estadísticas del sitio.
— Dispone de un calendario para añadir eventos o citas.
— Herramientas de comunicación entre los miembros de la comunidad de
usuarios.
480
SOLUCIONES OPEN SOURCE BASADAS EN PHP Y MYSQL
481
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Pmachine
Sitio oficial www.pmachine.com
Sistema de weblogs muy completo que permite una administración por web
mediante un interfaz gráfico fácil de utilizar y muy intuitivo. Soporta múltiples
weblogs, organizándolos en categorías, separándolos en páginas independientes o
colocando múltiples weblogs en la misma página. Puede llegar a convertir un
weblog en una comunidad on line.
482
SOLUCIONES OPEN SOURCE BASADAS EN PHP Y MYSQL
483
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Los foros de discusión constituyen uno de los más importantes mecanismos para el
intercambio de información con los que cuenta Internet. En la actualidad pueden
encontrarse foros temáticos prácticamente sobre cualquier tema imaginable, foros
en los que los usuarios plantean sus dudas, buscan información especializada,
contactan con usuarios interesados en los mismos temas, solicitan ayuda o
consejo,... En definitiva, los foros permiten diseñar páginas de contenido atractivo
autogenerado por los visitantes del sitio web.
484
SOLUCIONES OPEN SOURCE BASADAS EN PHP Y MYSQL
Phpbb
Sitio oficial www.phpbb.com
PHPBB es una aplicación open source muy potente y de fácil personalización para
establecer comunidades virtuales con foros interactivos donde los usuarios pueden
añadir temas, crear y responder mensajes... Su interfaz de usuario es muy fácil de
usar por el visitante, con un panel de administración simple y de ejecución rápida y
sencilla y una sección de ayuda siempre a mano.
485
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
Minibb
Sitio oficial www.minibb.net
486
SOLUCIONES OPEN SOURCE BASADAS EN PHP Y MYSQL
Moodle
Sitio oficial moodle.org
487
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
OSCommerce
Sitio oficial www.oscommerce.com
488
SOLUCIONES OPEN SOURCE BASADAS EN PHP Y MYSQL
Cubecart
Sitio oficial www.cubecart.com
Debe destacarse que CubeCart no se distribuye como código abierto, por lo que no
puede ser redistribuido.
489
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
OsTicket
Sitio oficial www.osticket.com
490
SOLUCIONES OPEN SOURCE BASADAS EN PHP Y MYSQL
PHP-Support-Tickets
Sitio oficial www.phpsupporttickets.com
491
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
SugarSales
Sitio oficial www.sugarcrm.com
492
SOLUCIONES OPEN SOURCE BASADAS EN PHP Y MYSQL
PHPCollab
Sitio oficial www.php-collab.com
493
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
DotProject
Sitio oficial www.dotproject.net
494
SOLUCIONES OPEN SOURCE BASADAS EN PHP Y MYSQL
PhpAdsNew
Sitio oficial phpadsnew.com
4images
Sitio oficial www.4homepages.de
OWL
Sitio oficial owl.sourceforge.net
495
PHP Y MYSQL. TECNOLOGÍAS PARA EL DESARROLLO DE APLICACIONES WEB
OpenClinic
Sitio oficial openclinic.sourceforge.net
PHPList
Sitio oficial tincan.co.uk/phplist
PHP Auction
Sitio oficial www.phpauction.org
Web Calendar
Sitio oficial www.k5n.us/webcalendar.php
496
Índice alfabético
— · 124 &
! & · 127, 203
! · 130 && · 130
!= · 128
!== · 128 .
. · 131
$
$_COOKIE · 291 @
$_GET · 142
@ · 132
$_POST · 142
$_REQUEST · 142
[
$_SERVER · 110
[] · 216
$GLOBALS · 208, 265
^
$HTTP_COOKIE_VARS · 290
^ · 127
$HTTP_GET_VARS · 143
‘
$HTTP_POST_VARS · 143
‘ · 132
$this · 275
|
| · 127
%
|| · 130
% · 124
~
~ · 127
+
497
++ · 124 array_diff_assoc · 239
< array_fill · 237
< · 128 array_filter · 228
<< · 127 array_intersect · 239
<= · 128 array_intersect_assoc · 239
= array_key_exists · 230
== · 128 array_keys · 229
=== · 128 array_map · 240
> array_pad · 237
> · 128 array_pop · 237
-> · 278 array_push · 237
>= · 128 array_rand · 230
>> · 127 array_reverse · 245
array_search · 231
array_shift · 237
A array_splice · 235
array_unique · 237
A · 82 array_unshift · 238
ACTION · 137 array_values · 232
ALL · 331 array_walk · 242
ALTER · 318, 321 Arrays · 113
ámbito de las variables · 116 arrays asociativos · 217
and · 130 arsort · 244
applet · 10 ASC · 334
Applet · 19 asort · 244
argumentos ASP · 21
longitud variable · 201 AVG · 335
opcionales · 199
por referencia · 203 B
por valor · 203
valores por defecto · 200 B · 69
argumentos opcionales · 199 BIGINT · 357
array · 215, 216 BINARY · 360
multidimensional · 218 BIT · 357
array_change_key_case · 225 BLINK · 69
array_chunk · 226 BLOB · 360
array_combine · 232 BLOCKQUOTE · 70
array_count_values · 227 BODY · 62
array_diff · 239 BOOL · 357
498
borrado en cascada · 324 CREATE INDEX · 323
break · 170, 188 CREATE TABLE · 318
ctype_alnum · 250
C ctype_alpha · 250
ctype_digit · 250
Cadenas · 113 ctype_lower · 250
case · 170 ctype_print · 250
CASE_LOWER · 225 ctype_punct · 250
CASE_UPPER · 225 ctype_space · 250
CGI · 21 ctype_upper · 250
Ch D
499
endswitch · 173 func_get_args · 202
endwhile · 175 func_num_args · 202
ENUM · 361 funciones variables · 211
EXIT · 344 function · 193
explode · 251 function_exists · 212
extends · 283 fwrite · 303
EXTR_OVERWRITE · 233
EXTR_PREFIX_ALL · 233 G
EXTR_PREFIX_SAME · 233
EXTR_SKIP · 233 get_defined_functions · 212
extract · 233 gettype · 118
global · 207
F GNU · 29
GPL · 37
fclose · 297 GROUP BY · 331, 336
feof · 298
fgetc · 300 H
fgets · 298
file · 299 HAVING · 331, 336
file_exists · 307 HEAD · 62
filesize · 299 herencia · 281
FLOAT · 358 hipertexto · 5
FLUSH PRIVILEGES · 351 Hn · 68
FONT · 69 HTML · 7, 57
fopen · 296 http · 7, 55
for · 179
foreach · 187, 220 I
Foreign Key · 313
FOREIGN KEY · 323 I · 69
FORM · 90 if · 158
fputs · 303 IMG · 79
FRAME · 86 implode · 251
FRAMESET · 85 in_array · 232
fread · 299 include · 209
free software · 27 INDEX · 366
FROM · 331 índices · 322
fscanf · 300 InnoDB · 365
FSF · 29 INSERT · 325
func_get_arg · 202 INT · 357
500
INTEGER · 357 metatags · 62
integridad referencial · 364 método GET · 144
Internet · 3 Método GET · 143
is_array · 118 método POST · 145
is_float · 118 Método POST · 143
is_int · 118 métodos · 270
is_object · 118 MIN · 335
is_string · 118 mktime · 187, 260
isset · 118 MySQL · 339
mysql_ free_result · 450
J mysql_affected_rows · 425, 450
MYSQL_ASSOC · 431
Java · 19 MYSQL_BOTH · 431
JavaScript · 18 mysql_close · 415
JSP · 21 mysql_connect · 414
mysql_db_query · 418
K mysql_error · 419
mysql_fetch_array · 431
krsort · 244 mysql_fetch_assoc · 431
ksort · 244 mysql_fetch_row · 424
mysql_field_len · 450
L mysql_field_name · 450
mysql_field_type · 450
LI · 71 mysql_insert_id · 424
list · 221 MYSQL_NUM · 431
LOAD DATA INFILE · 381 mysql_num_rows · 425, 450
localhost · 104 mysql_pclose · 416
mysql_pconnect · 416
M mysql_query · 417
mysql_select_db · 416
mail · 424 mysqld · 341
matriz · 215 mysqldump · 385
MAX · 335 mysqlimport · 381
max_execution_time · 181 mysqlshow · 341
MAX_FILE_SIZE · 308
MEDIUMINT · 357 N
META HTT-EQUIV · 63
META NAME · 65 natcasesort · 245
metaetiquetas · 62 natsort · 245
501
new · 277 operador Y · 130
NO ACTION · 324 operadores aritméticos · 124
NOT NULL · 325 operadores de bit · 127
NULL · 325 Operadores de comparación · 128
NUMERIC · 358 operadores de desplazamiento de bits ·
Números en coma flotante · 113 127
Números enteros · 113 operadores lógicos · 130
OPTION · 92
O or · 130
ORDER BY · 331, 333
objetos · 269
Objetos · 113 P
OL · 71
ON DELETE · 324, 374 P · 70
ON UPDATE · 379 PASSWORD · 351
open source · 2, 27 PHP · 23, 99
operación de negación · 130 phpinfo · 106
operador asignación · 125 phpmyadmin · 389
operador condicional · 130, 164 PRE · 70
operador de cast · 116 PRECISION · 358
operador de concatenación · 131 Primary Key · 313
Operador de conversión de tipo · 133 print · 106
operador de dirección · 203 print_r · 219
operador de ejecución · 132 print_r() · 198
operador de identidad · 128 prioridad de operadores · 133
operador de igualdad · 128 programación orientada a objetos · 269
operador de negación · 127
operador de negación de identidad · 128 Q
operador de negación de igualdad · 128
operador de supresión de error · 132 QUIT · 344
operador decremento · 124
operador diferencia · 124 R
operador división · 124
operador incremento · 124 rand · 182
operador O · 130 range · 234
operador O exclusivo · 130 REAL · 358
operador producto · 124 register_globals · 141
operador resto · 124 rename · 307
operador suma · 124 require · 209
502
return · 194 strlen · 259
rewind · 304 strnatcasecmp · 256
rsort · 245 strnatcmp · 256
strpos · 257
S strrchr · 256
strrev · 254
S · 69 strrpos · 257
SCRIPT · 108 strstr · 110, 257
script, insercción · 108 strtok · 258
secuencias de escape · 120 strtolower · 254
SELECT · 92, 330 strtoupper · 254
SELECT INTO OUTFILE · 386 SUB · 69
Servidor · 5 subclases · 281
servlets · 21 substr · 257
SET · 361 substr_count · 257
SET NULL · 324 substr_replace · 254
SET PASSWORD · 350 SUM · 335
setcookie · 286 SUP · 69
settype · 116 switch · 169
Shareware · 27
SHOW COLUMNS · 347 T
show databases · 345
SHOW TABLES · 347 TABLE · 76
shutdown · 341 TD · 77
SMALLINT · 357 tempnam · 445
sort · 245 TEXT · 360
SOURCE · 369 TEXTAREA · 91
SQL · 316 TH · 76
str_pad · 253 this · 275
STR_PAD_BOTH · 253 time · 260
STR_PAD_LEFT · 253 TIMESTAMP · 363
STR_PAD_RIGHT · 253 TINYINT · 357
str_repeat · 253 TITLE · 62
str_replace · 254 TR · 76
str_word_count · 252
strcasecmp · 256 U
strchr · 256
strcmp · 256 U · 69
stristr · 257 ucfirst · 255
503
ucwords · 255 variables · 114
UL · 73 ámbito · 206
unlink · 307 VBScript · 20
unset · 118, 204
UNSIGNED · 357 W
UPDATE · 329
USE · 346 W3C · 59
user · 346 web · 1, 4
WHERE · 331
V while · 175
wordwrap · 258
valores por defecto · 200
var · 273 X
VARCHAR · 359
variable xor · 130
estática · 208
global · 207 Z
local · 206
variable global · 117 ZEROFILL · 357
variable local · 117
504