Vous êtes sur la page 1sur 413

PHP Ministerio

de Educación, Cultura
y Deporte

COLECCIÓN AULA MENTOR SERIE INFORMÁTICA

CamSi SGALV
PHP

Informática e Internet
Catálogo de publicaciones del Ministerio: www.educacion.gob.es
Catálogo general de publicaciones oficiales: www.publicacionesoficiales.boe.es

Autor
Clodoaldo Robledo Sacristán
David Robledo Fernández

Edición y maquetación de contenidos


Clodoaldo Robledo Sacristán
David Robledo Fernández

Diseño gráfico e imagen


Clodoaldo Robledo Sacristán
David Robledo Fernández

NIPO: Pendiente
ISBN: Pendiente
Introducción

1. Qué es PHP

2. Instalación del entorno de desarrollo del curso


Curso Iniciación a PHP  
‐ Introducción ‐

Qué es PHP

PHP es un lenguaje de programación que se ejecuta en servidores web de


diferentes tecnologías y permite crear páginas HTML de forma dinámica. Las
siglas PHP provienen de Personal Home Page, que podemos traducir como
Procesador personal de páginas web o de Hipertexto.

Su historia

El lenguaje PHP fue creado a finales de 1994 por Rasmus Lerdorf, que
inicialmente utilizó las páginas web elaboradas con este lenguaje para
comprobar quién consultaba su currículum. Por entonces no puso a disposición
de los usuarios esta sencilla herramienta.

A principios de 1995 publicó la primera versión disponible para el público, que


fue conocida como "Herramientas para páginas web personales" (Personal
Home Page Tools). Esta primera versión estaba integrada por un analizador
sintáctico, muy sencillo, que sólo comprobaba algunas macros, así como por
una serie de utilidades comunes de las páginas web de aquella época, un libro
de visitas, un contador y otras rutinas elementales.

A mediados de 1995 el analizador sintáctico de la primera versión fue


reelaborado dando origen a la versión 2, que se denominó PHP/FI debido a
que en ella se combinaron el analizador sintáctico inicial (PHP) con otro
programa, escrito también por el mismo autor, que procesaba datos de
formularios (FI). A esta combinación de herramientas para páginas web
personales e intérprete de formularios le añadió soporte para mSQL. A partir de
entonces PHP/FI creció rápidamente y bastantes usuarios empezaron a
contribuir en la elaboración del código.

Según datos estadísticos aproximados, se calcula que a finales de 1996 el


lenguaje PHP era utilizado al menos en 15.000 páginas web de todo el mundo
y a mediados de 1997 este número había aumentado a unas 50.000. El año
2014 hay ya más de 244 millones de sitios utilizando esta tecnología.

A mediados de 1997 el lenguaje PHP, a partir de las aportaciones hechas por


muchos usuarios, sufrió un cambio importante al dejar de ser un proyecto
personal de Rasmus y convertirse en el proyecto de un grupo mucho más
organizado. El analizador sintáctico se reelaboró por completo por Zeev
Suraski y Andi Gutmans. Se pusieron así las bases de la versión 3 de PHP
aprovechando la mayoría del código de PHP/FI e incorporando nuevo código,
que convirtió la versión 3 en un paquete sólido y potente como herramienta
para crear páginas web dinámicamente.

A finales de 1999 se distribuyeron tanto PHP/FI como PHP3 en muchos


productos comerciales, como el servidor web "C2's StrongHold" y Redhat
Linux, hasta el punto de que puede estimarse que ya entonces el lenguaje PHP
era usado por más de 1.000.000 de servidores en todo mundo.

1
Curso Iniciación a PHP  
‐ Introducción ‐

En mayo de 2000 se puso a disposición del público la versión 4 de PHP. Esta


versión utiliza el potente motor de scripts Zend, que aporta al intérprete PHP
mayor rapidez y le proporciona altas prestaciones. Además, soporta otros
servidores web, no sólo Apache, que permiten funcionar a PHP como módulo
nativo.

En julio de 2004 se puso a disposición del público la versión 5 de PHP, que es


la que vamos a utilizar en este curso. Esta versión ha mejorado
significativamente el rendimiento y las capacidades de PHP utilizando el nuevo
motor de scripts Zend 2.0, que aporta cambios en la Programación orientada a
objetos.

La siguiente versión prevista, que se debería haber publicado era PHP 6, cuyo
objetivo era dar a PHP soporte completo de Unicode el juego de caracteres
universal). Sin embargo, su desarrollo se estancó y en 2010 prácticamente se
tiró la toalla y sigue sin estar claro si se alcanzará el objetivo.

Mientras tanto, se han ido publicando versiones 5.X que han ido introduciendo
bastantes novedades en el lenguaje (5.3 publicada en junio de 2009, 5.4
publicada en marzo de 2012 y 5.5 publicada en junio de 2013).

A continuación y a lo largo de todo el curso veremos teórica y prácticamente las


ventajas y características de esta última versión de PHP, que es la que vamos
a utilizar en el presente curso.

Sus principales cualidades

1. PHP es un lenguaje sencillo. Es decir, si ya se sabe programar en lenguaje


C, Perl, Java o en el Shell de Unix, su sintaxis resulta cómoda y bastante
intuitiva, como se verá en los programas que elaboremos. Ya hemos indicado
en la presentación del curso que para hacer este curso es necesario saber
programar en algún lenguaje, ya que en el desarrollo del mismo se suponen
conocimientos suficientes de programación, pues no se van a explicar más que
los contenidos específicos de PHP. En este contexto hay que entender el
término “sencillo”, que hemos usado al referirnos al lenguaje PHP. Su código
se lee muy bien, no hay cabeceras ni secciones previas y, por tanto, los
programas elaborados con este lenguaje se mantienen fácilmente. Cualquier
alumno que sepa algún lenguaje de programación puede aprender lo
fundamental de PHP en poco tiempo. Si, además, quiere llegar a realizar
operaciones más complejas, como consultar bases de datos, comunicar
procesos mediante sockets, utilizar FTP o correo electrónico, habrá de tener los
conocimientos necesarios sobre estos temas para poder hacerlo con PHP.

Por otra parte, en el uso de aplicaciones elaboradas con PHP el usuario utiliza
un interfaz ya familiar como el navegador web, el mismo que viene empleando
para acceder a cualquier otra página, sin que necesite aprender ninguna
combinación especial de teclas, ni instalar otro software adicional diferente de
su navegador habitual, ni disponer de un sistema operativo concreto, Unix o
Windows.

2
Curso Iniciación a PHP  
‐ Introducción ‐

2. PHP es un lenguaje rápido, es decir, a pesar de ser interpretado, la


consulta de un usuario a través de Internet al servidor donde está el programa
PHP se ejecuta con bastante velocidad, de forma que el resultado de una
solicitud aparece de forma casi instantánea en la pantalla de su ordenador,
convertido en HTML, a no ser que las condiciones del tráfico o de configuración
de la red lo impidan.

3. PHP es un lenguaje multiplataforma, es decir, su código fuente es


interpretado por un servidor, esté instalado éste en un ordenador que tenga el
sistema operativo Unix, Mac o que tenga Windows. El mismo código es
compatible tanto para uno como para otro sistema. Esta característica le da a
PHP unas posibilidades muy amplias y le permite ofrecer prestaciones muy
variadas.

No obstante, debemos advertir que PHP nació y se ha desarrollado casi


siempre para Linux, por lo cual su utilización en servidores reales en Internet
tiene más sentido y alcanza su eficiencia óptima en este sistema operativo.

4. PHP es un lenguaje libre de licencia, gratuito. No hay que pagar para


poder utilizarlo, nos deja libres para distribuir sin cargo alguno las aplicaciones
que hagamos con él e incluso podemos mejorar y ampliar sin limitación alguna
su código y el de las herramientas que utiliza. Gracias a la colaboración y a la
generosa donación de muchos usuarios programadores, PHP mejora y se
amplía cada día. Además, gracias a esta colaboración desinteresada está
ampliamente probado como herramienta.

5. PHP es un lenguaje que dispone de numerosas librerías que facilitan en


gran medida la ardua tarea de confeccionar aplicaciones. Debido a esto, es un
lenguaje muy apto para ser utilizado tanto por programadores noveles como
por desarrolladores profesionales, pues hay librerías adecuadas a
desarrolladores de todos los niveles. Además, existen en la red múltiples
recursos que hacen más fácil el desarrollo de cualquier aplicación.

6. PHP es un lenguaje que permite programar utilizando objetos. Ésta es


una importante potencialidad de PHP, dado que la Programación Orientada a
Objetos es una tendencia presente prácticamente en todos los lenguajes, por lo
cual PHP puede usar directamente estos objetos e incorporarlos dentro de su
código. Cualquier programador acostumbrado a utilizar o crear objetos en sus
programas podrá servirse de estos componentes en PHP con la misma
facilidad que si lo hiciera con otro lenguaje.

7. PHP es un lenguaje que puede acceder a muchas bases de datos de


casi todos los formatos: Adabas D, dbm, dBase, filePro, Hyperware, Informix,
InterBase, LDAP, Microsoft SQL Server, SQLite, mSQL, MySQL, Oracle,
PostgreSQL, Solid, Sybase, etcétera. Esta potencialidad hace de PHP un
poderoso lenguaje de Internet, ideal para el acceso, tratamiento y consulta de
datos archivados en estos gestores de información.

8. PHP es un lenguaje que ofrece soporte para poder realizar otras


múltiples operaciones, como acceder a servidores IMAP, envío de correo con

3
Curso Iniciación a PHP  
‐ Introducción ‐

SMTP, acceso a servidores de FTP, acceso a SNMP para gestión de redes y


equipos, generación dinámica de gráficos y documentos PDF, análisis de
documentos XML, corrector ortográfico, generación de datos en WDDX,
etcétera.

9. PHP es un lenguaje que lleva incorporado en su propio diseño el acceso


en red desde cualquier puesto de trabajo. Su código permite controlar
perfectamente el acceso, tanto positiva como negativamente, de los usuarios al
servidor forzando, si es preciso, su identificación a las opciones que lo
requieran.

10. PHP es un lenguaje que permite proteger de forma eficaz el código


fuente de las aplicaciones informáticas creadas con él, siempre que se tomen
las medidas de seguridad adecuadas en el servidor donde se hayan instalado.
Como veremos, el código de los programas está sólo en el servidor, que recibe
la solicitud de usuario, interpreta el código y devuelve la respuesta en forma de
página HTML en el ordenador del cliente.

Resumiendo, podemos decir que PHP es un lenguaje potente, rápido,


gratuito, multiplataforma y abierto a mejoras y ampliaciones
permanentemente. Debido a esto, PHP se está imponiendo a otros
lenguajes de programación como alternativa para el desarrollo de
aplicaciones informáticas en Internet.

Este curso está basado en la última versión de PHP disponible


que es la 5.5 y todos los ejemplos y aplicaciones son compatibles
con ésta. De todas formas, no debe haber ningún problema en
utilizar este código fuente en versiones futuras de PHP.

4
Curso Iniciación a PHP  
‐ Introducción ‐

Instalación entorno desarrollo del curso

Servidor XAMPP

A continuación, se explica cómo instalar en diferentes sistemas operativos


(Windows, Linux y MAC) el software gratuito necesario para desarrollar
proyectos PHP.

Para realizar el curso, vamos a utilizar el siguiente software de servidor de


página web de tipo Open source y multi sistema operativo:

 Servidor Web Apache: servidor de páginas web más utilizado en


Internet.
 MySQL: sistema de bases de datos.
 PHP: lenguaje de programación referencia del presente curso.

La imagen siguiente muestra la evolución de las últimas versiones del software


Apache, MySQL y PHP (se incluyen únicamente las versiones principales):

La comunidad de Internet ha combinado los servidores Linux con Apache,


MySQL y PHP en un paquete denominado LAMP (Linux Apache MySQL PHP).
En el sistema operativo se denomina WAMP (Windows Apache MySQL PHP).

XAMPP

En este curso vamos a emplear el paquete multiplataforma llamado XAMPP


que disponible tanto para Windows como para GNU/Linux.

Para descarga este software debemos abrir el navegador y acceder a la página


de descarga AQUÍ:

5
Curso Iniciación a PHP  
‐ Introducción ‐

Si hacemos clic en el enlace “Files” podemos acceder a las diferentes


versiones en función del sistema operativo sobre el que vayamos a trabajar:

A fecha de redacción del documento, la última versión disponible es la 1.8.3.


Por lo tanto, debemos descargar esta versión.

Si usas Windows, en la parte de arriba de la página, aparece el enlace directo


“Download xampp-win32-1.8.3-3-VC11-installer.exe (131.8 MB)” que descarga
directamente la última versión de XAMPP.

6
Curso Iniciación a PHP  
‐ Introducción ‐

Nota: Como PHP 5.5 no está disponible para Windows XP, no existe XAMPP
1.8.3 para Windows XP. Si se quiere instalar XAMPP en Windows XP (sistema
operativo ya obsoleto en 2014), se puede instalar XAMPP 1.8.0.

Comprobación previa

Antes de instalar el servidor Apache de XAMPP es conveniente comprobar si


ya hay uno instalado en el ordenador donde vayamos a trabajar. Para ello, es
suficiente con abrir el navegador y escribir la dirección http://localhost. Si se
obtiene un mensaje de error de este tipo:

Indica que no hay ningún servidor de páginas web, en caso contrario, debemos
desactivarlo para continuar la instalación.

Instalación de XAMPP en Windows 7-8.1

Para instalar en Windows XAMPP debemos ejecutar el instalador descargado


de Internet anteriormente. Al hacerlo, aparecerán dos mensajes de aviso:

 El primer mensaje aparece si en el ordenador hay instalado un antivirus:

 El segundo aparece si está activado el Control de Cuentas de Usuario e


indica que algunos directorios que tienen permisos restringidos:

7
Curso Iniciación a PHP  
‐ Introducción ‐

A continuación, se inicia el asistente de instalación y continuamoshaciendo clic


en el botón "Next":

XAMPP instala los componentes mínimos: servidor Apache y el lenguaje PHP.


En la pantalla de selección de componentes hay que seleccionar también
MySQL y phpMyAdmin:

8
Curso Iniciación a PHP  
‐ Introducción ‐

Si no disponemos de mucho espacio en el disco duro, debemos marcar, al


menos el servidor MySQL.

En la siguiente pantalla se puede elegir la carpeta de instalación de XAMPP. La


carpeta de instalación predeterminada es C:\xampp. Se puede cambiar
haciendo clic en el icono con forma de carpeta y seleccionando la nueva
carpeta destino. Para continuar la configuración de la instalación, hacemos clic
en el botón "Next":

9
Curso Iniciación a PHP  
‐ Introducción ‐

La pantalla siguiente ofrece información sobre los instaladores de aplicaciones


para XAMPP creados por Bitnami. Para que no se abra la página web de
Bitnami, hay que desmarcar la casilla correspondiente:

10
Curso Iniciación a PHP  
‐ Introducción ‐

Comenzamos la instalación de XAMPP haciendo clic en el botón "Next" en la


siguiente pantalla. A continuación, se inicia el proceso de instalación, que
puede durar unos minutos:

Una vez terminada la instalación aparece la pantalla que confirma que XAMPP
ha sido instalado correctamente:

11
Curso Iniciación a PHP  
‐ Introducción ‐

Hacemos clic en el botón "Finish" y se abrirá el panel de Control de XAMPP:

El panel de control de XAMPP en Windows se divide en tres zonas:

12
Curso Iniciación a PHP  
‐ Introducción ‐

 Zona de módulos: para cada uno de los módulos (servidores) de XAMPP


muestra si está instalado como servicio, su nombre, el identificador del
proceso y el puerto utilizado. Además incluye unos botones para iniciar y
detener los servicios, administrarlos, editar sus archivos de configuración
y abrir los archivos de log.
 Zona de notificación: en esta parte XAMPP informa sobre las acciones
realizadas.
 Zona de utilidades: son los botones de la parte izquierda superior y
sirven para acceder a las operaciones más comunes. 

Para iniciar el srvidor Apache, hay que hacer clic en el botón “Start”
correspondiente a Apache:

Como el servidor Apache abre puertos en el ordenador (por primera vez), el


cortafuegos de Windows solicita al usuario confirmación para hacerlo.
Debemos autorizar el acceso en redes privadas:

13
Curso Iniciación a PHP  
‐ Introducción ‐

Si Apache se inicia correctamente, el panel de control de XAMPP mostrará el


nombre del módulo con fondo verde, su identificador de proceso, los puertos
abiertos (http y https), el botón "Start" se convertirá en el botón "Stop" y en la
zona de notificación se verá el resultado de la operación realizada.

Para cerrar el panel de control de XAMPP hay que hacer clic en el botón Quit:

14
Curso Iniciación a PHP  
‐ Introducción ‐

El botón Cerrar en forma de aspa no cierra realmente el panel de control, lo


minimiza. Si se ha minimizado el panel de control de XAMPP, se puede volver
a mostrar haciendo doble clic en el icono de XAMPP del área de notificación:

Haciendo clic con el botón derecho de ratón sobre el icono de XAMPP en el


área de notificación aparece un menú que permite mostrar u ocultar el panel de
control, arrancar o detener servidores y cerrar el panel de control:

Los dos archivos principales de configuración del servidor web son los archivos
httpd.conf (Apache) y php.ini (PHP). Se puede utilizar el panel de control de
XAMPP para editarlos en el bloc de notas haciendo clic en el botón "Config"
correspondiente a Apache y, a continuación, en el archivo que se desea editar:

15
Curso Iniciación a PHP  
‐ Introducción ‐

Atención: los archivos de configuración de Apache y PHP se cargan al iniciar


Apache. Por lo tanto, si se modifica un archivo de configuración de Apache
(httpd.conf, php.ini u otro) mientras Apache está arrancado, es necesario
detener y reiniciar el servidor Apache. Más adelante en el curso modificaremos
estos archivos.

Nota: si modificamos un archivo de configuración y hemos introducido errores,


el servidor no podrá iniciarse. Si no sabemos encontrar del problema, es
recomendable restaurar los archivos de configuración originales de los que
debemos hacer una copia de seguridad antes de realizar ningún cambio a los
ficheros de configuración.

Si queremos que un servidor arranque automáticamente como servicio, es


decir, que se inicie cada vez que arrancamos el ordenador, hay que marcar la
casilla “Service” correspondiente:

16
Curso Iniciación a PHP  
‐ Introducción ‐

Atención: es necesario ejecutar el panel de control de XAMPP “Como


Administrador” para poder realizar esta operación.

Sin embargo, recomendamos al alumno o alumna que, en lugar de configurar


como servicio los módulos XAMPP, configure el Panel de Control de XAMPP
para que se ejecuten los módulos que desee (típicamente el servidor Apache y
MySQL) haciendo clic en el botón “Config” y seleccionando en la ventana que
aparece los módulos correspondientes:

17
Curso Iniciación a PHP  
‐ Introducción ‐

Así es más sencillo controlar la ejecución de los servidores.

IMPORTANTE: debemos crear el sudirectorio c:\xampp\htdocs\curso para


trabajar en este curso ya que es ahí donde iremos guardando los proyectos
PHP.

Puedes encontrar el vídeo “Cómo instalar XAMPP”, que muestra


de manera visual los pasos seguidos en las explicaciones
anteriores.

Instalación de XAMPP en Linux

Para instalar en Linux XAMPP debemos descargar el instalador correcto en


función de la arquitectura de nuestro sistema operativo. Para obtener esta
información, abrimos un terminal de comandos y ejecutamos la orden:

uname -m

Si el resultado incluye el texto:

18
Curso Iniciación a PHP  
‐ Introducción ‐

- x86_64: la arquitectura es de 64 bits.

- i686 o i386: la arquitectura es de 32 bits.

Una vez descargado el archivo debemos abrir de nuevo una ventana de


comandos y cambiar el directorio donde hayamos guardado el archivo.
Después, ejecutamos los siguientes comandos:

sudo chmod 755 xampp-linux-x64-1.8.3-1-installer.run


sudo ./xampp-linux-x64-1.8.3-1-installer.run

A continuación, aparecerá un instalador con las ventanas muy parecidas a las


de Windows que instala el servidor en el directorio /opt. Durante la instalación
debemos elegir las opciones "Core files (archivos del núcleo)" y "Developer
Files (archivos de desarrollo)".

Al finalizar la instalación, en la última ventana aparece la opción de lanzar


XAMPP, si lo marcamos, se abre directamente la página de bienvenida en el
navegador que describiremos más adelante al ser común a todos los sistemas
operativos.

Para controlar la ejecución de los diferentes servidores de XAMPP podemos


ejecutar el siguiente comando:

sudo /opt/lampp/lampp [parámetro]

donde la opción [parámetro] se usa para indicar:

[parámetro] Descripción
start Inicia XAMPP.
stop Para XAMPP.
restart Para y reinicia XAMPP.
startapache Inicia solo Apache.
Inicia el soporte SSL para Apache (servidor acceso seguro). Este
startssl comando activa el soporte SSL permanentemente, es decir, si
reinicias XAMPP en el futuro SSL ya estará activado por defecto.
startmysql Inicia únicamente la base de datos MySQL.
Arranca el servidor ProFTPD. Mediante un servidor FTP puedes
descargar y subir archivos a tu servidor (usuario: "nobody",
startftp contraseña "lampp"). De nuevo, este comando activa ProFTPD
permanentemente, es decir, si reinicias XAMPP, el servidor FTP ya
estará activado por defecto.
stopapache Parar servidor Apache.
Para el soporte SSL de Apache. Este comando desactiva SSL
stopssl permanentemente, es decir, si reinicias XAMPP estará
desactivado.

19
Curso Iniciación a PHP  
‐ Introducción ‐

stopmysql Para la base de datos MySQL.


Para el servidor ProFTPD. Este comando desactiva el servidor
stopftp FTP permanentemente, es decir, si reinicias XAMPP estará
desactivado.
security Inicia el programa de seguridad.

Para ejecutar el panel de Control de XAMPP en una aplicación visual, es


necesario antes instalar el paquete siguiente:

sudo apt-get install python-glade2

Para ejecutar esta interfaz gráfica que nos permite de forma sencilla Iniciar /
Detener los servicios más importantes (Apache, MySQL y ProFTPD) debemos
ejecutar el siguiente comando:

sudo /opt/lampp/share/xampp-control-panel/xampp-control-panel

A continuación aparecerá la siguiente ventana:

Para que esta aplicación aparezca en el Dash o tablero (botón Inicio de la barra
lateral en Ubuntu) debemos crear un archivo del tipo "nombre.desktop" en el
directorio /usr/share/applications/ ejecutando en un terminal de comandos:

sudo gedit /usr/share/applications/xampp-control-panel.desktop

Y pegar el siguiente código en el nuevo fichero:

[Desktop Entry]
Comment=Start/Stop XAMPP
Name=XAMPP Control Panel
Exec=gksudo python /opt/lampp/share/xampp-control-panel/xampp-
control-panel.py
Icon[en_CA]=/opt/lampp/xampp.png
Encoding=UTF-8
Terminal=false
Name[en_CA]=XAMPP Control Panel
Comment[en_CA]=Start/Stop XAMPP

20
Curso Iniciación a PHP  
‐ Introducción ‐

Type=Application
Icon=/opt/lampp/xampp.png

Guardamos y cerramos el archivo.


Nota: en las opciones "icons" hemos indicado una imagen que hemos
descargado desde la página web de XAMPP y guardado en el directorio
/opt/lampp y llamada "xampp.png".

El contenido (páginas HTML, directorios, imágenes, etcétera) del servidor


Apache se guardar en el directorio /opt/lampp/htdocs. Por defecto, este
directorio no tiene los permisos correctos para poder modificar sus contenidos.
Por lo tanto, para cambiar los permisos, debemos ejecutar el comando
siguiente:

sudo chmod a+w /opt/lampp/htdocs

IMPORTANTE: debemos crear el sudirectorio /opt/lampp/htdocs/curso para


trabajar en este curso ya que es ahí donde iremos guardando los proyectos
PHP.

Instalación de XAMPP en Mac OS X

Para instalar XAMPP en Mac OS X debemos descargar de Internet la última


versión del instalador y ejecutarlo. A continuación, el sistema pedirá la
contraseña de administrador y aparecerá esta ventana:

Si hacemos clic en el botón “Next”, aparecerá un instalador muy parecido al


visto para Windows que instala el servidor en el directorio
/Applications/XAMPP. Durante la instalación debemos elegir las opciones
"Core files (archivos del núcleo)" y "Developer Files (archivos de desarrollo)":

21
Curso Iniciación a PHP  
‐ Introducción ‐

Al finalizar la instalación, en la última ventana aparece la opción de lanzar


XAMPP, si lo marcamos, se abre directamente la página de bienvenida en el
navegador que describiremos más adelante al ser común a todos los sistemas
operativos.

Si abrimos la carpeta /Applications/XAMPP podemos ver el software instalado


en nuestro ordenador:

El contenido (páginas HTML, directorios, imágenes, etcétera) del servidor


Apache se guardar en el directorio /Applications/XAMPP/htdocs. Por defecto,

22
Curso Iniciación a PHP  
‐ Introducción ‐

este directorio no tiene los permisos correctos para poder modificar sus
contenidos. Por lo tanto, para cambiar los permisos, debemos abrir “Finder” y
elegir la opción “Fichero->”Obtener información:

En esta ventana debemos movernos a la parte de abajo y modificar el usuario


“admin” para que tenga permisos de lectura y escritura.

IMPORTANTE: debemos crear el sudirectorio


/Applications/XAMPP/htdocs/curso para trabajar en este curso ya que es ahí
donde iremos guardando los proyectos PHP.

Para usar el Panel de Control debemos ejecutar la aplicación “manager-osx”


que aparece en el directorio de instalación de XAMPP:

23
Curso Iniciación a PHP  
‐ Introducción ‐

Comprobaciones XAMPP

Para verificar que hemos instalado correctamente XAMPP, hay que abrir un
navegador y escribir la dirección http://localhost. Al abrir la página por primera
vez, XAMPP pedirá seleccionar el idioma:

Una vez elegido el idioma, aparecerá la página de inicio de XAMPP que


indicará que lo hemos instalado correctamente:

24
Curso Iniciación a PHP  
‐ Introducción ‐

25
Curso Iniciación a PHP  
‐ Introducción ‐

Configuración de PHP para el curso

El archivo de configuración de PHP es el archivo php.ini, un archivo de texto sin


formato. Para que se pueda trabajar en modo desarrollador en este curso y
PHP muestre los errores correspondientes, debemos modificar este fichero de
configuración.

En XAMPP 1.8.3 el archivo php.ini se encuentra:

 En Windows: directorio C:\xampp\php\php.ini.


 En GNU/Linux: directorio /opt/lampp/etc/php.ini.
 En Mac OS X: directorio /Applications/XAMPP/xamppfiles/etc/php.ini.

Nota: la ruta del archivo de configuración php.ini se indica en el campo


"Loaded Configuration File" de la primera tabla que muestra la función
phpinfo(). En el menú de la página de administración de XAMPP 1.8.3 hay una
opción phpinfo() que muestra la configuración de PHP:

26
Curso Iniciación a PHP  
‐ Introducción ‐

A continuación, abrimos con un editor de texto el fichero php.ini y modificamos


las directivas “error_reporting” que especifica el tipo de errores notificados por
PHP y “display_errors” que indica que se muestren los errores:

error_reporting = E_ALL
...
display_errors = On

Más adelante en el curso explicaremos el sentido de estas variables.

27
Curso Iniciación a PHP  
‐ Introducción ‐

Instalación entorno desarrollo del curso

¿Qué es Eclipse?

Eclipse es un entorno de software multi-lenguaje de programación que incluye


un entorno de desarrollo integrado (IDE). Inicialmente, se diseñó pensando
principalmente en el lenguaje de programación Java y se puede utilizar para
desarrollar aplicaciones en este lenguaje.

En la web oficial de Eclipse (www.eclipse.org), se define como “An IDE for


everything and nothing in particular” (un IDE para todo y para nada en
particular). Eclipse es, en realidad, un armazón (workbench) sobre el que se
pueden instalar herramientas de desarrollo para cualquier lenguaje, mediante la
implementación de los plugins adecuados. El término plugin procede del inglés
to plug, que significa enchufar. Es un software que permite cambiar, mejorar o
agregar funcionalidades.

La arquitectura de plugins de Eclipse permite, además de integrar diversos


lenguajes sobre un mismo IDE, introducir otras aplicaciones accesorias que
pueden resultar útiles durante el proceso de desarrollo, tales como
herramientas UML (modelado de objetos), editores visuales de interfaces,
ayuda en línea para librerías, etcétera.

Usando distintas librerías es posible servirse de este entorno de desarrollo para


otros lenguajes de programación, como Ada, C, C + +, COBOL, Perl, Delphi,
PHP, Python, R. Ruby, Scala, Clojure y Scheme.

A menudo el IDE Eclipse añade un apellido a su nombre cuando se usa para


programar otro lenguaje. Por ejemplo, se llama Eclipse ADT (Ada Development
Toolkit) para Ada, Eclipse CDT para C / C + +, Eclipse JDT para Java y Eclipse
PDT para PHP.

Esta lista de lenguajes aumenta con los años, ya que este IDE se está
convirtiendo en el entorno de desarrollo de muchos programadores por su
simplicidad y facilidad de uso.

El Consorcio Eclipse

En su origen, el Proyecto Eclipse era un proyecto de desarrollo OpenSource,


desarrollado y mantenido en su totalidad por IBM. Bajo la dirección de IBM, se
fundó el Consorcio Eclipse, al cual se unieron algunas empresas importantes
como Rational, HP o Borland.

28
Curso Iniciación a PHP  
‐ Introducción ‐

Desde el año 2004, el Consorcio Eclipse es independiente de IBM y entre otras


empresas, está integrado por HP, QNX, IBM, Intel, SAP, Fujitsu, Hitachi,
Novell, Oracle, Palm, Ericsson y RedHat, además de por algunas universidades
e institutos tecnológicos.

Eclipse PDT

Eclipse PDT (Eclipse PHP Development Tools) es un entorno de desarrollo que


integra PHP y está desarrollado principalmente por la empresa Zend
Technologies y está basado en la plataforma de desarrollo libre Eclipse. Eclipse
PDT es un programa Java, por lo que se necesita instalar previamente Java
(Java 1.5 o superior). Tu ordenador debe disponer de Java previamente
antes de instalar Eclipse –PDT.

Para programar PHP en Eclipse es necesario instalar Eclipse y una serie de


plug-ins. Como instalar todos los plug-ins necesarios no es fácil, Eclipse PDT
proporciona también un único paquete que incluye todos los componentes
necesarios.

La última versión disponible actualmente (septiembre de 2013) es la versión


Eclipse PDT 3.2.0 (127 MB, del 22 de julio de 2013), basada en Eclipse 3.8
SR2 (de enero de 2013), que es la que utilizaremos en este curso.

Si accedes al enlace anterior, puedes descargarte este programa:

Si pulsas el botón anterior, el navegador abre la siguiente página. Aquí


debemos seleccionar la última versión de Eclipse – PDT 3.2 disponible en Zend
(enlace “Download All-In-One package including Eclipse 3.7.2 and PDT 3.0.2
from Zend)”:

29
Curso Iniciación a PHP  
‐ Introducción ‐

Zend Eclipse PDT es un paquete preparado por la empresa Zend Technologies


basado en Eclipse PDT y que incluye también varias herramientas de Zend. La
última versión disponible actualmente (septiembre de 2013) es la versión Zend
Eclipse PDT 3.2.0 se basa en Eclipse 3.8 SR2, que es la que vamos a utilizar
en este curso.

Después, se abre la página de descarga de Zend y debemos elegir la versión


adecuada al sistema operativo donde vayamos a trabajar:

A continuación, la página de Zend solicita un usuario registrado. A día de


redacción de este documento, es necesario hacerlo. Aunque el software sea
gratuito, debemos registrarnos para poder descargarlo.

30
Curso Iniciación a PHP  
‐ Introducción ‐

Zend Eclipse PDT no se distribuye con un instalador, se trata de un archivo


comprimido (zip o gz) que contiene la carpeta eclipse-php donde están todos
los componentes necesarios (excepto Java Runtime) para su ejecución:

31
Curso Iniciación a PHP  
‐ Introducción ‐

Windows

En Windows vamos a descomprimir el archivo zend-eclipse-php-3.2.0-


Win32.zip en cualquier directorio en el que el usuario tenga permisos y,
después, crearemos un acceso directo al programa zend-eclipse-php.exe.

Se aconseja instalar Zend Eclipse PDT en la carpeta C:\Mentor\zend-eclipse-


php y crear un acceso directo al programa eclipse.exe (C:\Mentor\zend-
eclipse-php\zend-eclipse-php.exe).

Linux

 Abrir una ventana de terminal de comandos.


 Cambiamos al directorio dónde se haya descargado el fichero
descargado zend-eclipse-php-3.2.0-x86.tar.gz.
 Descomprime el fichero anterior en el directorio /opt, con la orden:

sudo tar xvfz zend-eclipse-php-3.2.0-x86.tar.gz -C /opt

Al usar el comando sudo, el sistema operativo solicitará la contraseña de


administrador para continuar.

 Para ejecutar Eclipse PDT, hay que escribir la orden:

/opt/zend-eclipse-php/zend-eclipse-php

 Siguiendo el procedimiento habitual en el sistema operativo Linux, se


puede añadir un lanzador a Eclipse PDT en el menú Aplicaciones o el
Escritorio.

32
Curso Iniciación a PHP  
‐ Introducción ‐

Mac OS

 Hacemos doble clic sobre zend-eclipse-php-3.2.0-Mac.tar.gz. Mac OS


incluye una utilidad para descomprimir el archivo.
 Copiamos el directorio zend-eclipse-php del archivo anterior en la
carpeta /Applications. El sistema operativo puede solicitar la
contraseña de administrador para continuar.

 Para ejecutar Eclipse PDT, hay que escribir la orden:

/Applications/zend-eclipse-php/zend-eclipse-php

 Siguiendo el procedimiento habitual en el sistema operativo Mac OS, se


puede añadir un acceso directo a Eclipse PDT en el menú Aplicaciones
o el Escritorio.

Configuración Eclipse - PDT

Una vez hemos instalado Eclipse – PDT vamos a realizar su configuración


básica para poder utilizarlo en el curso. Por lo tanto, ejecutamos Eclipse – PDT.
Al hacerlo veremos la siguiente ventana que se cierra automáticamente:

La primera vez que se inicia Zend Eclipse PDT, el cortafuegos de Windows


pide al usuario confirmación para su ejecución. Debemos, al menos, autorizar
el acceso en redes privadas:

33
Curso Iniciación a PHP  
‐ Introducción ‐

Después, debemos elegir el directorio de trabajo (workspace). Recomendamos


utilizar el subdirectorio “curso” que hemos creado dentro de la carpeta “htdocs”
de XAMPP:

Pulsamos el botón “OK” y aparecerá una ventana muy similar a la que se


muestra a continuación:

34
Curso Iniciación a PHP  
‐ Introducción ‐

Puedes cerrar la pestaña “Welcome” para continuar.

Ahora vamos a descargar la ayuda de PHP en la página oficial para integrarla


en Eclipse - PDT. En esta página recomendamos descargar la ayuda con los
comentarios de usuarios (CHM):

35
Curso Iniciación a PHP  
‐ Introducción ‐

Podemos copiar este fichero de ayuda directamente en el directorio donde


hayamos descomprimido Eclipse – PDT. El tipo de archivo CHM es un formato
de Windows y para que podamos abrirlo en Linux o Mac OS, es necesaria la
instalación de una aplicación adicional. En la página de descarga de PHP
aparecen enlaces a estas aplicaciones.

Una vez lo hemos hecho, hacemos clic en la opción del menú Windows ->
Preferences” y seleccionamos la opción “PHP -> PHP Manual”. En la ventana
que aparece, pulsamos en el botón “New” para seleccionar el archivo de ayuda
que te acabas de descargar:

36
Curso Iniciación a PHP  
‐ Introducción ‐

Una vez hemos pulsado el botón “OK”, debemos marcar el nuevo manual local
y hacer clic en el botón “Default” para establecer por defecto este documento
de ayuda:

37
Curso Iniciación a PHP  
‐ Introducción ‐

A partir de ahora. Cuando estés trabajando con Eclipse – PDT, podrás con el
botón derecho del ratón y pulsando en la opción “Open PHP Manual” (atajo del
teclado [MAY + F2]) abrir la ayuda oficial de PHP:

Ya estás preparado para empezar a trabajar en el curso. ¡Adelante con él!

38
MÓDULO 1

UNIDADES DIDÁCTICAS:

1. Introducción al lenguaje PHP

2. El lenguaje de programación PHP 5


 
MÓDULO 1

Introducción al lenguaje PHP

Unidad 1

Índice de la unidad:

1. Introducción

2. Un vistazo general al IDE de Eclipse-PDT

3. ¿Cómo crear un proyecto PHP?

4. Estructura de una página PHP: fragmentos PHP y

HTML

5. Instrucciones o sentencias de PHP

6. Mostrar información en la página web

7. Tipos de datos y expresiones

8. Resumen
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

Introducción
En esta Unidad vamos a realizar una Introducción al lenguaje PHP. Además,
describiremos el entorno de desarrollo Eclipse PDT y crearemos nuestro
primer proyecto PHP.

Finalmente, aprenderemos a escribir con PHP programas sencillos en los


que el alumno distinga e interrelacione los elementos que integran el código
PHP y los que pertenecen al lenguaje HTML.

Un poco de historia
La World Wide Web (WWW), conocida comúnmente como “la web”, es un
sistema de distribución de documentos de hipertexto o hipermedios
interconectados y accesibles mediante Internet. Con un navegador web, un
usuario visualiza sitios web compuestos de páginas web que pueden contener
texto, imágenes, vídeos u otros contenidos multimedia, y navega a través de
esas páginas usando hiperenlaces.

Inicialmente, la web fue desarrollada por Tim Berners Lee en 1989 para el
CERN de Ginebra en 1991 y se extendió rápidamente por las Universidades
del mundo (en aquel entonces, Internet era una red a la que sólo tenían acceso
entidades gubernamentales, sobre todo, entidades educativas). En 1992,
algunos proveedores de Internet comerciales empezaron a dar acceso a
particulares y empresas, lo que popularizó más la web.

En esos años, las páginas web eran documentos de texto guardados en algún
directorio de un servidor y a los que accedía mediante los primeros
navegadores web. Cada página web que se visualizaba en el navegador
correspondía a un fichero en el servidor.

De forma simplificada, la imagen siguiente, ilustra su funcionamiento:

 El usuario escribe la dirección de la página web que se desea visitar en


su navegador.
 El navegador solicita la página al servidor web correspondiente.
 El servidor lee el fichero que corresponde a esa página web.
 El servidor envía el fichero al navegador.

- 41 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

 El navegador muestra la página web al usuario.

Este esquema de funcionamiento es suficiente para sitios web pequeños


creados por una sola persona y cuya información varía poco en el tiempo. Sin
embargo, generalmente, es necesario que las páginas no sean ficheros
estáticos guardados en el disco duro, sino que se generen cuando el usuario
las solicite.

Como hemos visto en la Introducción del curso, para la generación dinámica de


páginas web se puede recurrir a lenguajes de programación específicos como
PHP.

Funcionamiento de un programa codificado con PHP


Es importante tener una concepción general de cómo funciona PHP antes de
iniciar el curso. Veamos esquemáticamente los pasos que se dan desde que se
inicia un programa en PHP hasta que se ven los resultados de su ejecución en
la pantalla del cliente.

El funcionamiento es bastante sencillo:

 Se escribe el código fuente de la página web en lenguaje PHP.

 Se guarda este código en el servidor web.

 El navegador de un usuario solicita al servidor la página codificada


y guardada en los dos pasos anteriores.

 El servidor interpreta el código PHP.

 El servidor envía el resultado del código PHP al navegador del


usuario, que ve en su pantalla la página en formato HTML.

Observa en el esquema siguiente el proceso explicado en las líneas


anteriores

- 42 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

Como puede verse en este sencillo esquema, el usuario desde su ordenador y


usando su navegador habitual solicita una página web del servidor al que está
accediendo. El servidor web, que contiene el código fuente de la aplicación que
crea esa página, lo ejecuta haciendo que el intérprete PHP genere la página.
Seguidamente, envía al usuario cliente la página solicitada en formato HTML.

En ningún momento se envía código PHP al navegador del usuario cliente, por
lo que todas las operaciones realizadas son transparentes para éste, al que le
parecerá que está visitando unas páginas HTML que cualquier navegador
puede interpretar. PHP se diferencia de JavaScript precisamente en que el
programa PHP se ejecuta en el servidor, no en la máquina del cliente, como
ocurre en JavaScript.

A la vista del esquema anterior, conviene recordar que el curso está diseñado
de forma que el servidor Apache está instalado en el mismo ordenador local
donde trabaja el alumno. Por ello, al hacer el curso, el alumno no necesita
conectarse a Internet para hacer peticiones de páginas web a un servidor
remoto. No obstante, el efecto real es el mismo que si estuviera accediendo a
un servidor ubicado en el otro extremo del mundo.

Es importante señalar que al usuario le resulta indiferente que la página


estuviera guardada ya en el disco duro del servidor o que se haya generado en
ese momento.

A veces, el uso de lenguajes de programación no es suficiente para mostrar


toda la información solicitada por el usuario. Si se trata de mucha información o
ésta está diseminada en multitud de archivos, es conveniente utilizar algún
sistema gestor de bases de datos. Existen muchos sistemas gestores de bases
de datos y cualquier lenguaje de programación puede conectarse a ellos y
realizar consultas.

La imagen siguiente muestra, de forma simplificada, el esquema de


funcionamiento en este caso:

- 43 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

 El usuario escribe la dirección de la página web en su navegador.


 El navegador solicita esta página al servidor web.
 El servidor recurre al intérprete del lenguaje PHP para generar la página
dinámicamente.
 El intérprete del lenguaje PHP ejecuta el programa que, a su vez, realiza
consultas al gestor de bases de datos y envía el resultado al servidor
web.
 El servidor envía el fichero al navegador del usuario.
 El navegador muestra la página web al usuario.

Como hemos dicho anteriormente, al usuario le resulta indiferente que se haya


accedido o no a un sistema gestor de bases de datos. El navegador recibe la
información en formato HTML y lo muestra al usuario.

Qué necesitamos para desarrollar aplicaciones en PHP

En las explicaciones anteriores ya se han mencionado prácticamente todos los


elementos que son necesarios para utilizar PHP como lenguaje generador de
páginas web. En este apartado resumimos los más importantes y describimos
cómo los hemos integrado en el curso.

1. Un servidor web. A partir de la versión 5 de PHP puede utilizarse


cualquiera de los más comunes citados. En el curso vamos a utilizar un
servidor Apache 2 incluido en la distribución XAMPP, por ser gratuito, fácil de
instalar y ofrecer todas las prestaciones que necesitamos para realizar el curso.

2. Una plataforma que soporte PHP. Bibliotecas de PHP compatibles con el


servidor web Apache.

3. Un sistema gestor de bases de datos. La facilidad con que pueden


consultarse bases de datos de múltiples formatos otorga a PHP una potencia
extraordinaria en la generación de páginas dinámicas web. PHP puede realizar

- 44 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

consultas y procesar datos con eficacia y rapidez. En el curso utilizaremos el


gestor de bases de datos MySQL, que es uno de los más empleados en el
desarrollo de aplicaciones con PHP, gratuito, muy eficiente y en continuo
desarrollo.

4. Eclipse PDT (PHP Development Tools). Entorno de desarrollo basado en


Eclipse diseñado para PHP. Eclipse es un entorno de desarrollo inicialmente
diseñado para Java pero que se ha extendido a multitud de lenguajes de
programación por su facilidad de uso y por ser multiplataforma.

- 45 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

Un vistazo general al IDE de Eclipse-PDT


Antes de crear el primer proyecto de PHP, vamos a echar un primer vistazo al
entorno de desarrollo de Eclipse PDT para conocer sus características básicas,
la forma en que organiza el proyecto y las herramientas adicionales que ofrece.

La primera vez que se ejecuta Eclipse PDT se puede ver una pantalla muy
similar a la que se muestra a continuación.

Puedes cerrar la pestaña “Welcome” para continuar.

Editores

La ventana principal (la más grande) se llama “Editor”. El Editor es el espacio


donde se escribe el código fuente de los programas que estamos
desarrollando.

Es posible tener varios ficheros de código fuente abiertos a la vez, apilados uno
encima de otro. En la parte superior de la ventana del Editor se muestran las
pestañas que permiten acceder a cada uno de los ficheros abiertos (o bien
cerrarlos directamente).

- 46 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

Editor

Vistas

Además del Editor, existe un segundo tipo de ventanas “secundarias”, que se


llaman Vistas.

Las Vistas son ventanas auxiliares para mostrar información, introducir datos,
etcétera. Las Vistas se usan con múltiples propósitos, desde navegar por un
árbol de directorios, hasta mostrar el contenido de una consulta SQL.

Vistas

- 47 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

En función de las librerías de desarrollo (PHP, Android, GWT, Java, Delphi...)


se definen Editores propios y todas las Vistas necesarias.

En la ventana anterior están abiertas dos Vistas:

 La Vista vertical de la izquierda muestra el árbol de directorios de los


proyectos con los ficheros del mismo.
 La Vista horizontal inferior muestra una pequeña “agenda” de tareas
pendientes que pueden ser introducidas por el usuario, de forma directa,
o por Eclipse, en función de determinados eventos (compilación del
proyecto, depuración de código, etcétera).

Si deseamos cambiar las Vistas, se puede usar la opción “Show View” en el


menú de la pestaña “Window”.

Barras de Herramientas principal y secundarias

La barra de herramientas principal contiene los accesos directos a las


operaciones más comunes, como abrir y guardar archivos. Además, también es

- 48 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

posible ejecutar herramientas externas y tareas relacionadas con el Editor


activo, como ejecutar un programa, depurar el código fuente, etcétera.

Además de la barra de herramientas principal (imagen anterior), cada Vista


puede tener su propia barra de herramientas secundaria.

Perspectivas

Una Perspectiva es un conjunto de ventanas (Editores y Vistas) agrupadas que


simplifican el desarrollo de un proyecto.

Al seleccionar una Perspectiva se carga una configuración guardada de las


Vistas y Editores de nuestro entorno de desarrollo Eclipse.

Por ejemplo, existe una Perspectiva "PHP Perspective" que facilita el desarrollo
de aplicaciones PHP y que incluye, además del Editor, Vistas para navegar por
los scripts PHP, las bibliotecas, etcétera.

Se puede cambiar la perspectiva activa utilizando la opción “Open Perspective”


del menú de Windows. Desde este mismo menú también es posible definir
Perspectivas personalizadas.

También existe un botón en la barra de herramientas principal para cambiar de


Perspectiva:

- 49 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

Si el alumno tiene dudas sobre el uso avanzado de Eclipse, en Internet existen


muchos tutoriales que indican cómo utilizarlo.

Además, es posible usar el menú "Help" o la tecla [F1] para solicitar ayuda.
Desgraciadamente, a día de hoy, esta ayuda sólo se encuentra en inglés.

IMPORTANTE: para importar en Eclipse el código fuente de los ejemplos del


curso hay que usar la opción del menú principal: File -> Import.

Después, hay que marcar Existing Proyects into Workspace en la ventana


emergente y pulsar en el botón “Next”:

- 50 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

Finalmente, seleccionamos el directorio de trabajo donde debemos haber


copiado previamente los ficheros con el código fuente de los ejemplos:
“C:\XAMPP\htdocs\curso” y hacemos clic en “Finish”.

- 51 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

Puedes encontrar el vídeo “Cómo importar y ejecutar proyectos


PHP en Eclipse PDT”, que muestra cómo usar Eclipse PDT para
compilar y ejecutar los proyectos que son los ejemplos del curso.

Importante: en el apartado “Problemas al cargar proyectos de PHP”


de Preguntas y Respuestas (FAQ) de la Unidad 1 puedes encontrar
soluciones a los problemas que ocurren al importar el código fuente de
los ejemplos del curso.

- 52 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

¿Cómo crear un proyecto PHP?


A continuación, vamos a describir cómo crear un proyecto PHP usando Eclipse
ADT.

Se trata del primer proyecto que el alumno va a crear, por lo que es muy
importante prestar atención a los pasos seguidos, ya que los proyectos
siguientes se generan de manera similar.

Así pues, arrancamos Eclipse.

Creación de un nuevo Proyecto

En el menú de Eclipse hacemos clic en File -> New -> Project -> Local PHP
Project:

A continuación, aparece una nueva ventana en la que escribimos el nombre de


proyecto "unidad1.eje1.navegador".

El resto de opciones las dejamos como aparecen en la siguiente captura de


pantalla:

- 53 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

Nota: aunque la versión del curso de PHP es la 5.5 utilizada durante el curso,
Eclipse PDT sólo permite elegir la 5.4 como versión máxima del proyecto.
Notamos al alumno que esto no supone ninguna limitación técnica en el
desarrollo de sus trabajos y puede continuar tal y como aparece en la captura
de pantalla anterior.

Después, pulsamos el botón “Next”:

- 54 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

En esta pantalla debemos modificar el campo “Base Path” de tal forma que se
incluya el subdirectorio “curso” dentro del raíz del curso que vamos a utilizar.
Tecleamos, por lo tanto, la palabra “curso”. Así, Eclipse ADT sabrá ejecutar
correctamente el proyecto en el navegador.

Después, pulsamos de nuevo el botón “Next”:

- 55 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

Sin modificar nada, pulsamos el botón “Finish” para crear los ficheros del
proyecto.

A continuación, describimos los apartados que genera un proyecto PHP:

- 56 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

Importante: haciendo doble clic sobre estos ficheros podemos abrirlos en


el Editor de Eclipse PDT. Es importante que el alumno se familiarice con
este entorno de desarrollo y pruebe las distintas opciones del mismo.

Al abrir el fichero index.php (página índice del proyecto) veremos la siguiente


ventana:

- 57 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

Podemos escribir la sentencia siguiente para imprimir la palabra “hola”:

Procedimiento para ejecutar un programa PHP


Una vez que hemos creado ya un proyecto en lenguaje PHP, ¿cómo podemos
comprobar que funciona y ver la página web que genera?

Para poder usar el servidor Apache de XAMPP, en primer lugar es necesario


tenerlo funcionando. El servidor no se ejecuta de forma automática al arrancar
el ordenador. Debemos arrancarlo cada vez que iniciemos una sesión de
trabajo y cerrarlo al acabar, para que no ocupe memoria restando recursos al
ordenador innecesariamente. Para ello, usamos las instrucciones que hemos
comentado en el apartado anterior sobre la instalación de XAMPP.

En el panel de control de XAMPP debe aparece que “Apache” resaltado en


color verde:

- 58 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

Al acabar nuestra sesión de trabajo en el Aula o lugar donde estemos debemos


parar el servidor, para liberar la memoria del ordenador.

Para ejecutar un programa PHP, hacemos clic en el botón "Ejecutar" de la


barra de herramientas principal:

o en la opción "Run" de menú “Run”. También disponemos del atajo del teclado
[Ctrl+F11]

- 59 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

Si no aparece ningún problema de compilación, entonces aparecerá un


navegador web en la siguiente ventana dentro de Eclipse:

Si el código está bien escrito, aparecerá la página web que hemos diseñado. Si
no lo está, se mostrará el error encontrado y sólo aparecerá parte de la página
o nada. Para arreglar el problema, nos pasamos al editor, arreglamos el código
donde proceda y guardamos otra vez el fichero. Cuando lo hayamos hecho,

- 60 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

ejecutamos de nuevo el proyecto. Así, veremos el resultado con las


modificaciones hechas en el código fuente.

Y de esta forma podemos ir escribiendo, probando, mejorando y arreglando el


código fuente a medida que hacemos los ejercicios y actividades que se
indiquen en la Agenda de actividades.

Además, podemos copiar de la barra de direcciones del navegador de Eclipse


su URL:

Abrir nuestro navegador habitual y pegar la URL en su barra de direcciones


para ver el resultado de la ejecución del proyecto PHP:

MUY IMPORTANTE:

Cada vez que modifiquemos el código fuente y deseemos probar de nuevo


nuestro proyecto no es necesario parar el servidor web Apache y arrancarlo de
nuevo; simplemente hacemos clic de nuevo en el botón “Run” de Eclipse para
ver el resultado del programa modificado.

- 61 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

Puedes encontrar el vídeo “Cómo importar y ejecutar proyectos


PHP en Eclipse PDT”, que muestra cómo usar Eclipse PDT para
compilar y ejecutar los proyectos que son los ejemplos del curso.

- 62 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

Estructura de una página PHP: fragmentos PHP y


HTML
A continuación, abordamos algunos aspectos generales relativos a la forma del
código escrito en PHP y a su inserción en el código HTML, poniendo algunos
ejemplos que nos ayuden a comprender mejor su estructura y funcionamiento.
Se trata sólo de aspectos genéricos que el alumno ha de tener en cuenta
siempre al analizar el código de los ejercicios resueltos y al escribir los propios.

Una página PHP es un archivo de texto que contiene uno o varios fragmentos
de código PHP y que también puede contener fragmentos de código HTML.

Ya hemos visto que al ejecutar una aplicación elaborada con PHP no hay que
pensar en un programa compilado binario de tipo exe que funciona en el
ordenador del cliente, sino en un programa cuyo código está sólo en el servidor
web y es interpretado en el mismo a requerimiento del usuario cliente, que en
respuesta a su solicitud recibe en la pantalla el resultado de esa interpretación
en forma de página web, en formato HTML, generada por PHP.

También hemos indicado que para participar en este curso es imprescindible


tener algunos conocimientos del formato HTML (HyperText Markup Language,
Lenguaje de marcas de Hipertexto). Si el alumno advierte que necesita adquirir
más conocimientos sobre este lenguaje, en el proyecto Mentor hay un curso a
distancia que puede ayudarle mucho. También puede consultar el Anexo del
curso donde se incluye un sencillo Manual con una breve explicación de las
principales órdenes del lenguaje HTML. En el apartado Más información se
cita algunas direcciones de Internet sobre este lenguaje.

En todo caso, damos por supuesto que quien hace el curso conoce lo más
rudimentario de HTML y, por lo tanto, centramos las explicaciones más
detalladas en la parte del código que corresponde a PHP.

Suele decirse que PHP es un lenguaje “embebido” en el código HTML. Y es


cierto, ya que generalmente el código PHP va envuelto externamente por
código HTML. Aunque también puede ocurrir lo contrario, es decir, que el
código PHP esté enmarcando al código HTML. En todo caso, ambos códigos
están íntimamente relacionados y de hecho sus instrucciones se mezclan hasta
cierto punto. Por eso, es imprescindible, en primer lugar, conocer los
separadores de uno y de otro.

Veamos en un ejemplo esta separación usando el mismo ejemplo que ya


hemos utilizado anteriormente:

<HTML> 
  <HEAD> 
    <TITLE>  
      Curso PHP 5 ‐ Unidad 1 ‐ Ejemplo 1 
    </TITLE> 
  </HEAD> 

- 63 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

  <BODY> 
   
  <!‐‐  Las líneas anteriores contienen sólo código HTML.  
  Si lo necesitas, mira el Apéndice 2. ‐‐> 
 
  <?PHP    
    // Aquí se inicia el código PHP. 
    // Obtenemos el valor de la variable global HTTP_USER_AGENT 
    // de PHP que indica los datos del navegador del usuario.  
       $navegador = $_SERVER['HTTP_USER_AGENT']; 
  ?>   <!‐‐ Aquí se cierra el código PHP. ‐‐> 
 
  <P>Estás usando el navegador<B> 
   
  <?PHP    // Aquí se inicia de nuevo el código PHP. 
       echo($navegador); 
  ?>    <!‐‐ Aquí se cierra el código PHP. ‐‐> 
 
  <!‐‐ A partir de esta línea sigue el código HTML. ‐‐> 
  </B>.</P> 
   
  </BODY> 

</HTML>

Como el objetivo de PHP es generar páginas HTML, hay una estrecha relación
entre el código de PHP y de HTML. Ambos conviven dentro del mismo script.
En este caso, el código PHP está envuelto por el código HTML, es decir, en la
parte externa inicial y final del código se usa lenguaje HTML y en su interior se
insertan dos fragmentos del lenguaje PHP.

Desde Eclipse PDT puedes abrir el proyecto Ejemplo 1 (Navegador) de la


Unidad 1. Estudia el código fuente y ejecútalo para mostrar en el navegador
su resultado.

El resultado de la página PHP es el siguiente:

El servidor Apache, que alberga este código, distingue entre las líneas que
pertenecen a cada lenguaje para enviar al intérprete PHP las que pertenecen a
PHP e interpreta él mismo el código HTML puro, generando la página web que
remite al cliente en formato HTML.

- 64 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

Habitualmente no vamos a comentar ni explicar el código HTML, ya que


suponemos que el alumno lo conoce. No obstante, si lo necesita para recordar
o aclarar alguna etiqueta, puede consultar el Anexo del curso, donde se
incluye un resumen de las principales de este lenguaje.

Podemos ver el código HTML resultante de la ejecución del proyecto haciendo


clic con el botón derecho del ratón sobre la opción “Ver código fuente”:

Así, podemos ver el código HTML que recibe el navegador del servidor web y
que el usuario visualizará:

IMPORTANTE: a veces, al ejecutar un proyecto, no aparece ningún error de


ejecución en el navegador al quedar oculto en alguna etiqueta HTML y es muy
útil ver el código fuente HTML.

- 65 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

Delimitadores de código PHP

¿Cómo saber dónde comienza y dónde acaba el código PHP? Ya conocemos


que los controles HTML de apertura y cierre son, respectivamente, <etiqueta> y
</etiqueta>. De forma similar, el código fuente de PHP siempre debe aparecer
entre cualquiera de estos controles, de apertura y cierre, respectivamente:

 <?php código PHP ?>

 <? código PHP ?>

Esto se puede hacer a través de la función short_tags(), activando la opción


de configuración short_open_tag en el archivo de configuración de PHP, o bien
compilando PHP con la opción --enable-short-tags en configure. El delimitador
<? se llama etiqueta de apertura abreviada (short open tag). Desde hace años
se desaconseja completamente su uso porque provoca conflictos con las
instrucción de procesamiento xml (<?xml) de los documentos XML.

 <?script language=”php”>código PHP </script>

 <% código PHP %>

Esta cuarta manera sólo está disponible si se han habilitado las etiquetas tipo
ASP usando la opción de configuración asp_tags. El soporte para las etiquetas
tipo ASP se añadió en la versión 3.0.4.

Como regla general, en los programas del curso usaremos el primero de los
cuatro delimitadores, ya que nos parece más sencillo, estándar y
suficientemente claro.

El servidor Apache, cuando ejecuta un programa PHP, pasa al intérprete PHP


todos los fragmentos comprendidos entre <?php y ?> y devuelve al cliente los
no comprendidos entre estos símbolos.

Conviene observar que los fragmentos del código PHP se pueden incluir dentro
del código HTML en cualquier posición. Pero no se pueden anidar, es decir,
dentro de un trozo de PHP no se puede incluir otro fragmento PHP. En el
ejemplo anterior se ve que hemos incluido dos trozos PHP independientes en
dos posiciones diferentes del código envolvente HTML.

Hay otra filosofía en la organización y distribución de los fragmentos de código


HTML y PHP. Consiste en insertar el código HTML dentro del código PHP. En
este caso los separadores de PHP incluyen en su interior código HTML. Pero el
resultado es el mismo.

Así estaría organizado el código del ejemplo anterior siguiendo esta filosofía:

<?PHP // Aquí se inicia el código PHP. 

- 66 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

 
  echo "<HTML> 
      <HEAD> 
        <TITLE>  
          Curso PHP 5 ‐ Unidad 1 ‐ Ejemplo 2 
        </TITLE> 
      </HEAD> 
      <BODY> 
 
      <P>Estás usando el navegador 
      <B>"; 
 
      $navegador = $_SERVER['HTTP_USER_AGENT']; 
         echo($navegador); 
          
      echo "</B>.</P> 
      </BODY> 
    </HTML>"; 

?><!‐‐ Aquí se cierra el código PHP. ‐‐>

Desde Eclipse PDT puedes abrir el proyecto Ejemplo 2 (Navegador 2) de


la Unidad 1. Estudia el código fuente y ejecútalo para mostrar en el
navegador el resultado de su interpretación exactamente igual que el
Ejemplo 1.

Sobre código PHP y el servidor

Cuando un navegador solicita una página PHP a un servidor, este servidor lee
el archivo o script PHP secuencialmente y va generando el resultado de la
siguiente manera:

 Si el archivo PHP contiene fragmentos HTML, el código HTML se incluye


en el resultado sin modificaciones.
 Si el archivo PHP contiene fragmentos PHP, se ejecutan sus sentencias
que, si generan texto, se incluye en el resultado.

En general, cuando el servidor termina de leer el archivo PHP, se envía al


navegador el resultado. De todas formas, PHP permite enviar información
parcial antes de acabar la ejecución del fichero completo.

Es importante tener en cuenta que:

 El navegador recibe siempre una página web, es decir, código HTML,


nunca recibe código PHP.
 Los fragmentos PHP generan etiquetas HTML que forman la página web
y es la que interpreta el navegador.
 El navegador no distingue en la página recibida, qué parte se generó
dinámicamente en un fragmento PHP y qué parte en un fragmento
HTML.

- 67 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

 Como el script PHP se lee secuencialmente, el código HTML generado


por los fragmentos PHP y el incluido en los fragmentos HTML se
encuentran en el mismo orden en que se están los fragmentos en el
script PHP.

- 68 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

Instrucciones o sentencias de PHP


Su formato

A lo largo del curso iremos estudiando la sintaxis de cada instrucción en


concreto. En esta primera unidad sólo vamos a abordar dos aspectos
generales sobre las sentencias que conviene conocer desde el primer
momento:

1. Una sentencia puede estar integrada por una asignación, una llamada a una
función o una estructura de control de flujo, como una condición o un bucle.
Todas las sentencias acaban necesariamente en punto y coma (;). Por
ejemplo, es una sentencia o instrucción de asignación la siguiente:

$navegador = $_SERVER['HTTP_USER_AGENT'];

En ella se asigna a una variable ($navegador) el contenido de otra variable de


entorno de PHP que contiene información sobre la cabecera de la transacción
de información entre el usuario y el servidor.

La sentencia echo($navegador); muestra en el navegador del usuario el valor


asignado a la variable $navegador.

La etiqueta de cierre (?>) también implica el fin de una sentencia, por lo que
equivale al punto y coma (;). Igualmente sería correcto escribir así las
sentencias anteriores:

<?php
$navegador = $_SERVER['HTTP_USER_AGENT'];
echo($navegador);
?>

2. Según la forma de organizar las sentencias podemos distinguir entre


sentencias simples y sentencias compuestas. Las primeras contienen una
sola instrucción que acaba en punto y coma (;). Son sentencias simples las dos
que aparecen en el apartado anterior.

Las sentencias compuestas están integradas por varias instrucciones incluidas


dentro del par de signos {}. Las sentencias compuestas se utilizan
principalmente en las estructuras de control condicionales y de bucle, y también
en el cuerpo de las funciones. Por ejemplo, es una sentencia compuesta la
siguiente:

$x=0;
while ($x<15)
{
$z=0;
while ($z<10)
{
$d=$x*$z;
echo "$x x &z = $d";

- 69 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

$z++;
}
$x++;
}

Observando este ejemplo podemos comprender que en realidad las sentencias


compuestas son sentencias simples que deben ejecutarse como bloque
conjunto. Con los ejercicios prácticos a lo largo del curso se irán utilizando sin
problema unas y otras cuando convenga.

Nombre de los identificadores

Una variable de un lenguaje de programación es un elemento que permite


almacenar y modificar información. Esta variable se identifica por su nombre.

En el lenguaje PHP todas las variables deben iniciarse con el signo dólar ($).
Además, el intérprete distingue entre letras mayúsculas y minúsculas, por lo
cual $CAsa y $casa son dos nombres de variable diferentes.

La persona que escribe el código pone los nombres de los elementos que se
utilizan en los programas, como variables, tipos de datos, constantes,
funciones, clases, etcétera. Este nombre se denomina identificador.

El nombre del identificador debe estar integrado por una sola palabra (no una
frase con espacios en su interior) y, como hemos dicho, si es una variable,
debe iniciarse por el signo $. Ningún identificador puede comenzar con un
número, incluso aunque pongamos delante el signo $. En el nombre de los
identificadores pueden utilizarse el signo de subrayado, otras letras y números
(excepto en la primera posición). No se pueden usar determinados signos,
como los dos puntos (:), ni el punto y coma (;), ni las barras inclinadas / y \, ni
los operadores aritméticos (+, -, *, /, %), etcétera. Con la práctica se irá
sabiendo qué nombres no acepta PHP por ser incorrectos, pues se indica con
un error al interpretar el código. Por ejemplo, son nombres de identificador
válidos $casa, $suma_todo y $forma_1_2_adaptador. En cambio, no lo son
function 10Casos, $unidad/B, $ma:ana, $jam\s y $suma-todo, $uno*dos,
$mio+tuyo.

Su longitud máxima significativa es de 63 caracteres. Aconsejamos emplear los


que sean necesarios para saber qué contiene cada identificador o la operación
que se realiza, pero no es cómodo usar nombres demasiado largos.

Recomendamos que los nombres de estos identificadores tengan algún


significado que nos informe de su contenido o de las operaciones que se llevan
a cabo dentro de los mismos. Por ejemplo $suma_todo puede ser acertado
como identificador de una variable que contenga el valor resultante de sumar
otras variables o como nombre de una función cuya finalidad consista en llevar
a cabo una suma de diversos valores.

PHP utiliza un conjunto de identificadores predefinidos que debemos


respetar también. Por ejemplo, son identificadores predefinidos los distintos

- 70 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

tipos de datos, como Int, double, string, array, o las palabras reservadas, como
while, function, for, etcétera.

En PHP no hay que declarar previamente el tipo de variable, sino que el hecho
de asignar un tipo de dato a una variable ya es suficiente para que esa variable
sea del tipo de datos que contienen. Además, si a una misma variable primero
se le asigna un tipo de datos, como una cadena de caracteres, será de ese
tipo, pero si después se le asigna otro tipo de datos diferente, como un número
entero, desde ese momento será de este tipo. Esto facilita mucho las cosas,
pero exige tener un mayor control sobre los valores que va teniendo una
variable a lo largo de su vida dentro de un script.

Indentar las instrucciones

Aconsejamos que, desde el comienzo del curso, el alumno se acostumbre a


indentar las instrucciones que formen parte de una estructura dentro de la cual
se insertan. Por ejemplo, dentro de la estructura de control condicional
if...else..., así como dentro de las estructuras de bucle for o while conviene
adentrar unos espacios las instrucciones. De esta forma, será más fácil e
intuitivo localizar un bloque de líneas al depurar o estudiar un script.

Aunque hay varias formas de indentar, en los ejercicios del curso hemos
seleccionado la forma más común. El alumno puede observar en los mismos
cómo lo hemos hecho y aprender a indentar él también sus scripts.

Comentarios al código fuente

El lenguaje PHP permite incorporar comentarios dentro del propio código


fuente. Los comentarios facilitan la comprensión posterior de un programa y
aclaran las instrucciones que lo exijan.

Si el texto del comentario no excede de una línea, haya o no una instrucción a


su izquierda, lo mejor es usar el signo // (doble barra inclinada a la derecha).
Por ejemplo, podemos comentar así una instrucción:

<?php
$navegador = $_SERVER['HTTP_USER_AGENT'];
echo($navegador);//Muestra contenido de $navegador.
?>

Si el comentario es más largo y ocupa varias líneas, hay que incluir su texto
entre la combinación de signos /*...*/.

<?php
$navegador = $_SERVER['HTTP_USER_AGENT'];
echo($navegador);

/* En estas dos instrucciones se asigna a la variable $navegador


la cabecera de la comunicación y se muestra en la pantalla. */
?>

- 71 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

El alumno debe poner comentarios en los scripts que elabore, tanto para
acostumbrarse a hacerlo, como para aclarar las instrucciones que lo precisen.

En un fragmento PHP no pueden escribirse etiquetas HTML sueltas, el código


HTML debe generarse siempre con instrucciones de PHP. El script siguiente:

<?php
<p>Hola</p>
?>

No puede ejecutarse y se produce un error de sintaxis:


Parse error: syntax error, unexpected '<' in index.php on line 2

Código HTML de páginas estándar

La mayoría de los navegadores interpretan correctamente páginas HTML que


no siguen el estándar. Si deseamos crear páginas completas HTML según el
estándar HTML (denominado, XHTTP 1 Strict), es decir, incluyen todas las
etiquetas HTML necesarias.

Si lo que te contamos a continuación no te suena, puedes abrir el Anexo del


curso sobre HTML básico para ampliar conocimientos.

El ejemplo siguiente muestra el código HTML de una página web válida con las
líneas numeradas.

<?xml version="1.0" encoding="iso-8859-1"?>


1
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
2
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3
<html xmlns="http://www.w3.org/1999/xhtml">
4
<head>
5
<meta http-equiv="content-type" content="text/html; charset=iso-
6
8859-1" />
7
<title>Página válida HTML</title>
8
</head>
9
10
<body>
11
<p>El código HTML de esta página es válido</p>
12
</body>
13
</html>

 La etiqueta <?xml ... ?> (línea 1) es una etiqueta opcional, pero


recomendada. No es una etiqueta XHTML, sino una declaración XML
que indica el juego de caracteres que se va a utilizar en el resto del
documento.
 La etiqueta <!DOCTYPE ... > (líneas 2 y 3) sí que es obligatoria. Esta
etiqueta indica el tipo de documento (DOCTYPE) de la página. Puesto que
existen varias versiones de HTML y XHTML (y cada versión permite
unas etiquetas diferentes), el navegador necesita saber a qué versión
corresponde la página. La etiqueta contiene la dirección web de la dtd

- 72 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

(definición de tipo de documento) que especifica la versión del lenguaje


de etiquetas utilizado en el documento (estructura, etiquetas disponibles
y atributos).
 La etiqueta <html> ... </html> (líneas 4 a 13) engloba todo el
documento html. El atributo xmlns especifica el espacio de nombres del
documento que resuelve el problema que aparece cuando en un mismo
documento HTML se utilizan etiquetas de distintos lenguajes de
etiquetas, en los que pueden coincidir algunos nombres. El espacio de
nombres es como el "apellido" de la etiqueta.
El documento HTML se divide a su vez en dos partes, la cabecera
(<head> ... </head>, líneas 5 a 8) y el cuerpo (<body> ... </body> ,
líneas 10 a 12).
o La cabecera <head> ... </head> (líneas 5 a 8) contiene
información de identificación y control que en general no se
muestra en la ventana del navegador, aunque puede afectar a la
presentación (por ejemplo, los enlaces a hojas de estilo).
 Las etiquetas <meta /> están pensadas para proporcionar
información sobre el documento a los programas que
analicen la página.
La línea 6 del ejemplo informa del juego de caracteres
empleado en la página. Existen otros tipo de <meta /> . Por
ejemplo, la etiqueta <meta name="keywords
contents="palabras, más palabras, etc." /> está
pensada para que los buscadores sepan de qué va la
página (por desgracia, se ha abusado mucho de esta
etiqueta así que los buscadores no la toman prácticamente
en cuenta).
 La etiqueta de título <title> ... </title> (línea 7)
contiene el texto que se muestra en la barra de título de la
ventana del navegador.
La etiqueta <title> es obligatoria y debe incluirse en todas
las páginas web.
o El cuerpo (<body> .... </body>, líneas 10 a 12) contiene lo que
se verá en la ventana del navegador. En el ejemplo, contiene un
único párrafo
 La etiqueta de párrafo <p> ... </p> contiene el texto que
se muestra en la ventana del navegador

Estrictamente hablando, toda página PHP debe incluir o generar todo el código
HTML estándar necesario.

De igual forma que ocurre con una página HTML, una página PHP puede
enlazar a una hoja de estilo CSS mediante la etiqueta <link>.

Nota: por simplificación en la explicación de los ejemplos del curso, no se va a


utilizar en todos los casos estrictamente el estándar XHTML. Así, el código en
PHP será mucho más legible y sencillo de entender.

- 73 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

Mostrar información en la página web


En los ejemplos anteriores ya hemos usado alguna orden que permite mostrar
información. Como ésta es una operación bastante frecuente y sencilla, vamos
a comentar ahora las diferentes formas que tenemos para hacer que en la
página del usuario se muestre información con un determinado formato.

En esta operación hay que distinguir dos aspectos:

1. El contenido de la información que debe mostrarse. Hay que escribirla entre


comillas detrás de la orden o asignarla a una variable y, luego, poner esta
variable como argumento de la orden correspondiente.

2. El formateo de esa información en la página HTML del cliente. Para que el


cliente que hace una solicitud al servidor vea el contenido de la información
ordenado y maquetado, es preciso incorporar en el código fuente los controles
necesarios.

Se puede mostrar información con las órdenes siguientes:

1. echo

Ya hemos visto varios ejemplos de este comando. Tiene esta sintaxis:

echo argumento, donde la información que se muestra (argumento) puede ser


una cadena de caracteres entre comillas o una variable. También puede usarse
la sintaxis

echo (argumento1, argumento2,...)

Si el argumento es una cadena entre comillas dobles, debemos tener en cuenta


que las variables incluidas en ese texto se expanden, es decir, muestran su
contenido, no su nombre. Sin embargo, las funciones no se expanden. ¿Cómo
podemos conseguir que las variables no se expandan y las funciones sí lo
hagan? Veamos el ejemplo siguiente donde mostramos en letras mayúsculas el
contenido de una variable:

$x = "el amor es libre";


echo "La variable $x contiene el texto strtoupper($x) en
letras mayúsculas.";

Ejecutando estas dos instrucciones aparece en la pantalla:

La variable el amor es libre contiene el texto strtoupper($x) en letras


mayúsculas.

Observamos que, aunque esté dentro de una cadena, la variable $x se ha


expandido, es decir, ha mostrado su texto; en cambio, la función strtoupper

- 74 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

(string to upper, convertir el texto de la cadena en letras mayúsculas) no se ha


expandido.

Pero nosotros queremos que en la página web aparezca:

La variable $x contiene el texto EL AMOR ES LIBRE en letras mayúsculas.

Para conseguirlo, hay que utilizar esta otra sintaxis:

$x = ”el amor es libre”;

echo “La variable \$x contiene el texto”.strtoupper($x). “en letras


mayúsculas.”;

Si nos fijamos en esta última sintaxis, podemos observar que hemos utilizado la
barra hacia la izquierda (\) delante de la variable, para que no expanda su
contenido. Además, hemos sacado la función de las comillas y la hemos
concatenado con el texto anterior y posterior usando el operador de
concatenación (.).

2. print

Esta orden es prácticamente igual que echo, hasta el punto de que se pueden
intercambiar sin problemas.

Veamos un ejemplo en que se usa la orden print en lugar de echo.

<HTML> 
<HEAD><TITLE>Curso PHP 5 ‐ Unidad 1 ‐ Ejemplo 3</TITLE></HEAD> 
<BODY> 
 
<?php // Aquí se inicia el código PHP. 
 
  print "<H1><CENTER>Uso de la orden print. Funciona como echo.</H1> 
             </CENTER><H2>"; 
  /* Mostramos el texto anterior con un tamaño de letra grande  
     y centrado.*/ 
  $pares=0; 
   
  /* Abrimos un bucle para repetir la operación 20 veces. 
  En la Unidad 2 se estudia esta estructura de control.*/ 
  for (;$pares<40;)  
  { 
  print " ‐‐ $pares "; // Observa que la variable se expande. 
  if ($pares==40)      // Si la variable $pares vale 40... 
    break;          // Salimos del bucle. 
    $pares+=2;      // Sumamos 2 al valor actual de la variable. 
     } 
 
   print "</H2><P><H3>&nbsp;&nbsp;&nbsp;&nbsp; Relación de los 20  
         primeros números pares.</H3>"; 
     /* Mostramos el texto anterior con un tamaño de letra pequeño. 
     Como HTML sólo respeta un espacio en blanco, con el comando 
     &nbsp; hacemos que la frase deje 5 espacios a la izquierda. */ 

- 75 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

 
   /* Aquí acaba el código PHP. No podemos poner este comentario a 
   continuación del signo ?>, pues estaría fuera del código PHP.*/ 
?> 
 
</BODY> 
</HTML>

Desde Eclipse PDT puedes abrir el proyecto Ejemplo 2 (Números) de la


Unidad 1. Estudia el código fuente y ejecútalo para mostrar en el navegador
su resultado, en el que hemos utilizado la orden print.

3. printf

Es una función que permite mostrar información formateada según los valores
que aparezcan en una cadena de formato integrada por caracteres fijos y por
una directiva %.

Su sintaxis es:

printf ("cadena de formato", argumento1, argumento2,...)

En los argumentos se incluye la información que se quiere mostrar, como con


echo o con print. En la cadena de formato, entre comillas, puede ponerse un
texto, que aparece tal cual lo escribamos, con expansión de las variables si no
usamos el signo \, y el valor de una variable según se establezca en la directiva
%.

Veamos en un ejemplo sencillo cómo se comporta esta función. Con Eclipse


PDT escribimos el código fuente siguiente en PHP:

<HTML> 
<HEAD></HEAD> 
<BODY> 
<?php 
    $i=15; 
    printf ("Valor de la variable \$i= %d \n", $i); 
    echo "<P>Nueva línea "; 
?> 
</BODY> 
</HTML> 

Si ejecutamos este código, en la pantalla aparece la página web siguiente:

- 76 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

Si vemos el código HTML que ha recibido el usuario (con el botón derecho del
ratón sobre el navegador, opción “Ver código fuente”), vemos cómo es:

En este sencillo ejemplo podemos apreciar varias cosas que debemos conocer.
Son las siguientes:

A. El segundo argumento de la función printf(), que es $i, aparece con la


información que tiene esta variable.

B. El primer argumento determina el formato de salida de esa información y


está integrado por un texto literal (Valor de la variable \$i=), que se muestra tal
como lo hemos escrito, por una directiva (%d), que establece que el valor de $i
ha de aparecer como número decimal (en base 10) entero. Y así lo hace.

En este ejemplo hay que observar también varias cosas que debemos tener en
cuenta:

- 77 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

1. Conviene recordar que en el texto literal hemos tenido que utilizar el signo \
delante de $i para que la variable no se expandiera. No confundirlo con el
comando \n que sirve para que se produzca un salto de línea.

2. La directiva %d lleva detrás el comando del código PHP \n. Puede llevar
también otro literal. El comando \n sirve para que, una vez mostrado el
resultado de la variable $i, se produzca un salto de línea dentro del código
HTML, como ya hemos dicho.

3. En el código fuente PHP hemos dejado hasta cinco espacios en blanco


después del primer literal y antes de la directiva, pero en la página web sólo
aparece uno. Hay que tener en cuenta que HTML sólo muestra un espacio, no
todos los que haya repetidos en el código. Para que HTML muestre más de un
espacio en blanco, debemos incluir en el código el comando tantas veces
como espacios en blanco deban mostrarse. Por ejemplo, la instrucción:

printf("Valor de la variable \$i= %d\n", $i);

sí muestra los espacios en blanco así: Valor de la variable $i= 15.

Dentro de la cadena de formato nos interesa ver cómo se configura una


directiva y qué significa cada uno de los caracteres que la integran.

Toda directiva debe iniciarse por un signo %. Si se quiere anular el efecto de %


de forma que la directiva se vea como un literal, hay que poner delante otro
signo %. Por ejemplo, la orden:

printf("Valor de la variable \$i= %%d \n", $i);

muestra el texto Valor de la variable $i= %d sin el valor de $i ya que no hemos


precisado su formato.

Así pues, si queremos que en la página web aparezca la frase

La variable $i con la directiva %d aparece como 15

debemos escribir la función de esta forma:

printf("La variable \$i con la directiva %%d aparece como %d \n", $i);

La directiva % puede estar integrada hasta por cinco elementos:

 Un carácter de relleno, para que ocupe las posiciones vacías cuando lo


que ha de mostrarse no completa todas. Si no se pone, se supone que
las posiciones vacías han de ser espacios en blanco. En el caso de
números, puede indicarse que se rellenen con ceros o con otro carácter
(escribir entre comillas simples) como primer integrante de la directiva.
Es decir, indica el número total de caracteres de la cadena impresa.
 El carácter opcional ‘-‘, para alinear un número por la izquierda.

- 78 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

 El número mínimo de posiciones que ha de ocupar la salida. Si su


contenido no ocupa tantas posiciones, los espacios vacíos se completan
con el carácter que se haya indicado en el componente primero. Por
ejemplo, la instrucción:

printf("La variable \$i con la directiva %%05d aparece como %05d \n",
$i);

muestra en la página el texto

La variable $i con la directiva %05d aparece como 00015

donde el 0 primero indica el carácter de relleno, el 5 es el número de


posiciones que debe ocupar la salida y la d, como veremos, indica que ha de
mostrarse en formato decimal (base 10). Notamos que hemos escrito "\n" para
enviar un salto de línea en el código que se envía al navegador.

Cuando la salida es un número, este guarismo sólo se refiere a la parte entera,


no a la decimal, cuya longitud de salida se fija con el elemento siguiente,
separando ambos elementos por un punto.

 El número de decimales que deben mostrarse cuando los haya, es decir,


cuando trabajemos con números de coma flotante. Este número debe ir
separado del número entero anterior por un punto ( .).

Por ejemplo, si la variable $i vale 11.3456, la instrucción:

printf("La variable \$i con la directiva %%011.5f aparece como %011.5f


\n", $i);

muestra en la página el texto

La variable $i con la directiva %011.5f aparece como 00011.34560

Fíjate que hemos escrito %011.5f para que el número total de caracteres sea
11 incluyendo el punto decimal y 5 caracteres en la parte decimal.

 Especificación del tipo de salida. Este último es el más importante, hasta


el punto de que la mayoría de las veces es el único que sigue al signo
de directiva %.

Puede ser una sola de las letras que aparecen en la tabla siguiente:

Letra Formato de salida. La variable $i contiene 15.


La salida numérica aparece en formato binario
(base 2).
b
Orden: printf("\$i con %%b aparece como %b", $i);

Muestra: $i con %b aparece como 1111

- 79 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

La salida completa aparece como un carácter que se


indica detrás de la C.

C Orden: printf("\$i con %%CZ aparece como %CZ",


$i);

Muestra: $i con %CZ aparece como Z


La salida numérica aparece en formato decimal
(base 10).
d
Orden: printf("\$i con %%d aparece como %d", $i);

Muestra: $i con %b aparece como 15


La salida numérica aparece en formato de coma
flotante.
f
Orden: printf("\$i con %%f aparece como %f", $i);

Muestra: $i con %b aparece como 15.000000


La salida numérica aparece en formato octal (base
8).
o
Orden: printf("\$i con %%o aparece como %o", $i);

Muestra: $i con %b aparece como 17


La salida, aunque sea numérica, aparece como una
cadena.

Orden: printf("\$i con %%s aparece como %s cadena


S
con números", $i);

Muestra: $i con %s aparece como 15 cadena con


números
La salida numérica aparece en formato hexadecimal
(base 16) con las letras en minúscula.

X Orden: printf("\$i con %%04x aparece como %04x",


$i);

Muestra: $i con %04x aparece como 000f


La salida numérica aparece en formato hexadecimal
(base 16) con las letras en mayúscula.

X Orden: printf("\$i con %%04X aparece como %04X",


$i);

Muestra: $i con %04x aparece como 000F

En el ejemplo siguiente se muestra cómo usar la orden printf().

<HTML>  
<HEAD><TITLE>Curso PHP 5 ‐ Unidad 1 ‐ Ejemplo 4</TITLE></HEAD>  
<BODY>  
 
<DIV style="text‐align: center;">   

- 80 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

<H3>TABLA DE LOS 20 PRIMEROS NÚMEROS EN DIFERENTES 
        BASES</H3>  
<TABLE BORDER="2">  
  <TR> 
    <TH> &nbsp;&nbsp;Decimal&nbsp;&nbsp;</TH>  
    <TH> &nbsp;&nbsp;Binario&nbsp;&nbsp;&nbsp;</TH>  
    <TH> &nbsp;&nbsp;Octal&nbsp;&nbsp;&nbsp;</TH>  
    <TH> &nbsp;&nbsp;Hexadecimal&nbsp;&nbsp;</TH> 
    </TR>  
      
<?php   // Aquí se inicia el código PHP.  
 
  echo "<BR>"; // Salto de línea para dejar un espacio entre  
              // el título y la tabla.  
 
  /* Abrimos un bucle para repetir la operación 20 veces.  
   En la Unidad 2 se estudia esta estructura de control.*/      
  for ($a=0;$a<21;$a++)  
  {  
      echo "<TR>";   // Nueva fila de tabla.  
      printf("<TD>&nbsp;%02d</TD><TD>&nbsp;%06b</TD>  
                <TD>&nbsp;%02o</TD><TD>&nbsp;%02X</TD>"  
                ,$a,$a,$a,$a);  
          /* Observa que en la cadena de formato, entre paréntesis,  
          hemos incluido los códigos HTML (<TD>&nbsp;...</TD>)  
          y la directiva (%02d, %06b, %02o y %02X) de cada una  
          de las formas de presentar el valor de la varible $a. */  
           
      print "</TR>";  
  }  
 
   /* Aquí acaba el código PHP. No podemos poner este comentario a  
   continuación del signo ?>, pues estaría fuera del código PHP.*/  
?>  
 
</TABLE>  
</DIV>  
</BODY>  
</HTML>  

Desde Eclipse PDT puedes abrir el proyecto Ejemplo 4 (Números en


distintas bases) de la Unidad 1. Estudia el código fuente y ejecútalo para
mostrar en el navegador su resultado, en el que hemos utilizado la orden
printf.

Si lo ejecutas, verás que se muestra esta pantalla:

- 81 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

Eclipse PDT puedes abrir el proyecto Ejemplo 5 (Fuentes de texto) de la


Unidad 1. Estudia el código fuente y ejecútalo para mostrar en el navegador
su resultado, en el que hemos utilizado de nuevo la orden printf con otros
parámetros.

Si lo ejecutas, verás que se muestra esta pantalla:

4. sprintf

- 82 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

Esta función nos permite dar formato a una cadena de texto exactamente igual
que con printf, y guardar, además el resultado en una variable, para utilizarlo
posteriormente.

Su sintaxis es la siguiente:

%cadena=sprintf(“cadena de formato”, argumento 1, argumento 2,...)

Siguiendo el último ejemplo de la tabla anterior, podíamos escribir:

<HTML> 
<HEAD></HEAD> 
<BODY> 
<?php 
    $i=15; 
    $cadena=sprintf("\$i con %%04X aparece como %04X", $i); 
    echo $cadena; 
    echo "<P>Nueva línea"; 
?> 
</BODY> 
</HTML> 

El resultado es la página web siguiente:

Aunque la cadena de formato parezca inicialmente algo complicada, con la


práctica el alumno se acostumbrará a usarla sin dificultad.

5. print_r

Muestra el contenido y la información de una variable de manera más sencilla


simplificando su lectura en el navegador. En el caso de una variable de tipo
string, integer o float, la información imprimida por pantalla será el valor
contenido en la variable. En el caso de una matriz, los valores serán
presentados en un formato que muestra las claves y los elementos de la
misma.

Su sintaxis es la siguiente:

- 83 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

print_r(variable, [, bool devolver])

El parámetro devolver es optativo y si escribimos el valor true, print_r()


devolverá su salida en lugar de imprimirla en el navegador (cosa que hace por
defecto).

Para ver cómo funciona podemos escribir:

<HTML> 
<HEAD></HEAD> 
<BODY> 
<?php 
    $matriz = array ('a' => 'casa',  
                     'b' => 'calle mayor',  
                     'c' => array ('primero', 'segundo','tercero')); 
    echo "<PRE>"; 
    print_r ($matriz); 
    echo "</PRE>"; 
?> 
</BODY> 
</HTML> 

El resultado es la página web siguiente:

Observa que hemos usado las etiquetas <PRE> y </PRE> para que se muestren
los espacios e intros en HTML. En el apartado siguiente trataremos las
matrices y se entenderá mejor esta función que sirve de mucha utilidad cuando
se necesita conocer lo que contiene una matriz.

Expansión de variables en PHP

Una característica muy utilizada de PHP es que se pueden expandir variables


dentro de las cadenas de texto si éstas están rodeadas por comillas dobles
(").

- 84 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

Por ejemplo, veamos este código:

$nombre = 'Pedro';
// Esto imprime: ¿Hola Pedro como estás?
echo "¿Hola $nombre como estás?";

Esta característica importante de PHP puede generar confusión en los


programadores ya que las comillas simples (‘) no expanden las variables.

Lo importante es decidir qué comillas se van a utilizar; si necesitas muchas


comillas dobles, crea tu cadena con comillas simples, por ejemplo, para
imprimir un atributo HTML:

$div = '<a href="http://www.mentor.com/" title="Web de Mentor"


id="link_portada" style="link_verde">Cursos Mentoe</a>';

Además, en PHP podemos usar el operador de concatenación (.). Con este


operador podemos unir dos o más cadenas de texto, o incluso cadenas con
variable, de manera que formen parte de la misma serie de datos.

$cadena1 = "Hola mundo";


$cadena2 = ", este es ";

// Imprime: Hola mundo, este es mi primer script


echo $cadena1 . "$cadena2 mi primer script";

Como se aprecia en el último ejemplo, al usar comillas dobles hace que las
variables en el texto sean reemplazadas por sus valores correspondientes, no
así con las comillas simples.

¡Cuidado! La expansión de variables no funciona con matrices ni objetos, por lo


tanto para imprimir el contenido de un tipo de estas variables hay que usar el
operador de concatenación. Fíjate en el siguiente ejemplo.

$matriz[0] = 'Esto es el texto de la matriz';


// Esto imprime: Texto: esto es el texto de la matriz
echo "Texto: " . $matriz[0];
// Si expandimos la matriz, no funcionará la siguiente sentencia
echo "Texto: $matriz[0]";

- 85 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

Tipos de datos y expresiones


Tipos de datos

El lenguaje PHP, igual que la mayoría, puede tratar los siguientes tipos de
datos:

- Numérico entero. Sólo contiene elementos aritméticos sin decimales. Con


este tipo de dato se pueden llevar a cabo operaciones aritméticas, como suma,
resta, multiplicación, división, función exponencial, etc. Al escribirlos, no hay
que incluirlos entre delimitadores, como las comillas simples o dobles.

Según la base que se utilice para representarlos, pueden tener diferentes


representaciones:

$y = 1234; número decimal (base 10)

$y = -123; número negativo decimal (base 10)

$y = 0011; número binario (base 2: equivale al 3 decimal)

$y = 0123; número octal (base 8: equivale al 83 decimal)

$y = 00e1; número hexadecimal (base 16: equivale al 225 decimal)

$y = 0x12; número hexadecimal (base 16: equivale al 18


decimal. 0x significa que 12 está en formato
hexadecimal.)

- Numérico de punto flotante. También se denominan números reales y son


datos numéricos con parte entera y parte decimal. Un punto separa ambas
partes. PHP utiliza números reales double, es decir, que nos permiten escribir,
incluido el punto decimal, hasta 16 dígitos.

En base decimal pueden tener dos sintaxis diferentes:

$y = 1.23456; número de punto flotante decimal (base 10)

$y = 1.2e3; número de punto flotante en forma exponencial


(base 10) equivalente a 1200. Es como si
multiplicamos 1,2 por 10 elevado a 3.

- Arrays. En el tratamiento de este tipo de datos PHP permite una gran


flexibilidad. Por ejemplo, admite en sus elementos datos de diferentes tipo, el
índice que identifica a cada uno de sus elementos puede ser numérico, a partir
de 0, o un texto, los arrays se crean con sólo asignarles un valor y se admiten
arrays multidimensionales.

Por ejemplo, podemos crear una matriz (array), sin necesidad de haberla
declarado antes, de la forma siguiente:

- 86 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

$persona["nombre"]="Josefa";
$persona["apellido1"]="Pérez";
$persona["apellido2"]="Rubio";
$persona["edad"]=60;

Podíamos haberla creado así:

$persona=array("nombre"=> "Josefa",
"apellido1"=> "Pérez",
"apellido2"=> "Rubio",
"edad"=>60);

Supongamos que queremos crear una matriz bidimensional con las


calificaciones obtenidas por una alumna en las tres evaluaciones de
Matemáticas, Lengua y Dibujo. Como podemos usar índices alfanuméricos,
podemos hacerlo así:

$notas["Mat"]["Pri"] = "Suficiente";
$notas["Mat"]["Seg"] = "Bien";
$notas["Mat"]["Ter"] = "Notable";
$notas["Len"]["Pri"] = "Sobresaliente";
$notas["Len"]["Seg"] = "Sobresaliente";
$notas["Len"]["Ter"] = "Notable";
$notas["Dib"]["Pri"] = "Notable";
$notas["Dib"]["Seg"] = "Bien";
$notas["Dib"]["Ter"] = "Suficiente";

Con la misma filosofía de índices, podíamos haberlo hecho así:

$notas = array("Mat"=>array("Pri"=>"Suficiente",
"Seg"=>"Bien",
"Ter"=>"Notable"),
"Len"=>array("Pri"=>"Sobresaliente",
"Seg"=>" Sobresaliente",
"Ter"=>"Notable"),
"Dib"=>array("Pri"=>"Notable",
"Seg"=>"Bien",
"Ter"=>"Suficiente"));

Igualmente, podíamos haber puesto las calificaciones en número y usado


índices numéricos para las evaluaciones y las asignaturas, de 0 a 2 para
ambas. En este caso la matriz $notas habría quedado así:

$notas[0][0] = 5;
$notas[0][1] = 6;
$notas[0][2] = 7;
$notas[1][0] = 9;
$notas[1][1] = 9;
$notas[1][2] = 7;
$notas[2][0] = 7;
$notas[2][1] = 6;
$notas[2][2] = 5;

Es más breve, si bien hay que saber a qué asignatura y evaluación pertenece
cada índice. En la otra sintaxis quedaría así:

- 87 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

$notas = array(0=>array(0=>5,1=>6,2=>7),
1=>array(0=>9,1=>9,2=>7),
2=>array(0=>7,1=>6,2=>5));

Aunque aquí la información dada es breve, en la Unidad 3 (Tratamiento de


arrays) se explican las matrices de manera más clara y con varios ejemplos.
Tómese, por lo tanto, este texto sobre matrices como una introducción simple.

Desde Eclipse PDT puedes abrir el proyecto Ejemplo 6 (Bucle) de la


Unidad 1. Estudia el código fuente y ejecútalo para mostrar en el navegador
su resultado, en el que hemos utilizado una matriz.

La estructura de bucle se estudia en la Unidad 2. Si tienes dudas sobre su


sintaxis te invitamos a que estudies esta estructura en la teoría de la siguiente
Unidad.

- Cadena de caracteres. Contiene información alfanumérica y se denomina


string o cadena. Las cadenas de caracteres deben escribirse entre comillas
dobles o simples.

- Objetos. PHP permite tratar también objetos propios de la Programación


Orientada a Objetos (POO) a través de un tipo de datos denominado clase
(class). Los objetos son componentes dotados de propiedades y eventos que
pueden manipularse independiente unos de otros y en diferentes entornos. Las
clases de declaran de la forma siguiente:

class identificador_de_la_clase
{
public $nombre_de_las variables;
function nombre_de_la_funcion_de_la_clase($argumentos)
{Declaración de la función }
}

La orden new permite crear un nuevo elemento de la clase declarada y el


operador -> permite acceder a cada componente de ese elemento.

Por ejemplo, supongamos que necesitamos crear una clase que contenga los
siguientes datos de nuestros contactos, a modo de agenda: nombre, apellidos,
profesión, edad e importe de sus servicios por mes. Podemos declarar así la
clase:

class Contactos
{
public $nombre;
public $apellido;
public $profesion;
public $edad;
public $importe;

function completa($nom,$ape,$pro,$eda,$impor)
{
$this->nombre=$nom;

- 88 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

$this->apellido=$ape;
$this->profesion=$pro;
$this->edad=$eda;
$this->importe=$impor;
}
}

Ahora ya podemos crear la clase con la instrucción

$contacto = new Contactos;

Finalmente, podemos asignar valores a cada nuevo contacto con la orden

$contacto->completa("María","Pérez Mas","médico",35,"350.000");

Para poder verlo en la pantalla damos la orden siguiente:

echo "$contacto->nombre<P>";
echo "$contacto->apellido<P>";
echo "$contacto->profesion<P>";
echo "$contacto->edad<P>";
echo "$contacto->importe<P>";

Desde Eclipse PDT puedes abrir el proyecto Ejemplo 7 (Contacto) de la


Unidad 1. Estudia el código fuente y ejecútalo para mostrar en el navegador
su resultado, en el que hemos usado una clase sencilla.

Si lo ejecutas, verás que se muestra esta pantalla:

En Internet se pueden buscar librerías de clases para hacer casi todo.

Aunque aquí la información dada es breve, en la Unidad 3 (La Programación


Orientada a Objetos (PPO)) se expone la POO de manera más clara y con
varios ejemplos. Tómese, por lo tanto, este texto sobre POO como una
introducción simple.

Caracteres especiales de PHP

- 89 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

Algunos caracteres tienen en PHP un significado especial ($ se utiliza para


definir variables, las comillas dobles o simples se utilizan como delimitadores
de cadenas, etcétera), por lo que pueden aparecer errores al ejecutar un
programa PHP.

Debemos tener en cuenta una cosa importante: si usamos comillas simples


para enmarcar una cadena, PHP no analiza el contenido de la cadena. Por lo
tanto, no se expande el contenido de las variables ni es necesario proteger el
signo $ que las precede con el signo \. Por ejemplo,

si la variable $i contiene el valor 7 y escribimos la instrucción

  <?PHP    
    $i = 7; 
    echo 'La variable \$i vale $i'; 

  ?>    <!‐‐ Aquí se cierra el código PHP. ‐‐> 

en la página web se muestra el texto:

En cambio, si escribimos la cadena con comillas dobles:

  <?PHP    
    $i = 7; 
    echo "La variable \$i vale $i"; 

  ?>    <!‐‐ Aquí se cierra el código PHP. ‐‐>

aparece:

Dentro de una cadena acotada por comillas dobles, si se necesita que


aparezcan otras comillas, hay que usar igualmente el signo \ para que PHP
entienda estas comillas como literales en lugar de como delimitadores de la
cadena. Por ejemplo, la sentencia:

- 90 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

  <?PHP    
    $i = 7; 
    echo "La variable \$i vale "$i"; 

  ?>    <!‐‐ Aquí se cierra el código PHP. ‐‐> 

muestra el siguiente error, pues PHP encuentra tres delimitadores de cadena:

En cambio, si escribimos la instrucción

<?PHP    
    $i = 7; 
    echo "La variable \$i vale \"$i"; 

  ?>    <!‐‐ Aquí se cierra el código PHP. ‐‐> 

aparece el texto con las comillas protegidas por la barra \, de esta forma:

En este caso, cuando dentro de una cadena no hay variables que deban
expandirse, lo mejor es poner comillas simples enmarcando la cadena y dentro
las comillas dobles que necesitemos.

Algunos caracteres (saltos de línea, tabuladores, etc.) no se pueden escribir


con el teclado ya que no se enviarán al navegador.

En PHP, para referirse a alguno de estos caracteres en una cadena, existen los
caracteres especiales que empiezan por el carácter barra (\). Los caracteres
especiales más utilizados son los siguientes:

Carácter Significado

- 91 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

\\ Carácter barra
\$ Carácter dólar
\" Carácter comilla doble (en una cadena delimitada por comillas
dobles)
\' Carácter comilla simple (en una cadena delimitada por comillas
simples)
\n Salto de línea
\t Tabulador horizontal
\XXX Carácter de código XXX en octal
\xXX Carácter de código XX en hexadecimal
\r Retorno de carro
\v Tabulador vertical
\e Escape
\f Salto de página (en impresoras antiguas)

Expansión de variables en PHP

Aunque ya lo hemos nombrado, una característica muy utilizada de PHP es


que se pueden expandir variables dentro de las cadenas de texto si éstas están
rodeadas por comillas dobles (").

Por ejemplo, veamos este código:

$nombre = 'Pedro';
// Esto imprime: ¿Hola Pedro como estás?
echo "¿Hola $nombre cómo estás?";

Esta característica importante de PHP puede generar confusión en los


programadores ya que las comillas simples (‘) no expanden las variables.

Lo importante es decidir qué comillas se van a utilizar; si necesitas muchas


comillas dobles, crea tu cadena con comillas simples, por ejemplo, para
imprimir un atributo HTML:

$div = '<a href="http://www.mentor.com/" title="Web de Mentor"


id="link_portada" style="link_verde">Cursos Mentor</a>';

Además, en PHP podemos usar el operador de concatenación (.). Con este


operador podemos unir dos o más cadenas de texto, o incluso cadenas con
variable, de manera que formen parte de la misma serie de datos.

$cadena1 = "Hola mundo";


$cadena2 = ", este es ";

// Imprime: Hola mundo, este es mi primer script


echo $cadena1 . "$cadena2 mi primer script";

- 92 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

Como se aprecia en el último ejemplo, al usar comillas dobles hace que las
variables en el texto sean reemplazadas por sus valores correspondientes, no
así con las comillas simples.

¡Cuidado! La expansión de variables no funciona con matrices ni objetos, por lo


tanto para imprimir el contenido de un tipo de estas variables hay que usar el
operador de concatenación. Fíjate en el siguiente ejemplo.

$matriz[0] = 'Esto es el texto de la matriz';


// Esto imprime: Texto: esto es el texto de la matriz
echo "Texto: " . $matriz[0];
// Si expandimos la matriz, no funcionará la siguiente sentencia
echo "Texto: $matriz[0]";

- 93 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

Los operadores y su jerarquía


Operadores más comunes

Como ya desde el comienzo vamos a utilizar constantemente los operadores al


escribir el código fuente, a continuación aparecen los más comunes, para que
pueda consultarlos el alumno cuando lo necesite. Sólo explicamos con detalle
los operadores o aspectos que suponen alguna novedad en PHP respecto a
otros lenguajes. Suponemos, pues, que los alumnos y alumnas han utilizado ya
los operadores y, por tanto, saben manejarlos con suficiente fluidez.

Aritméticos

Operador Operación
Suma los dos números entre los que está.
+
Adición
Ejemplo: $num = 4+3; a $num se le asigna el valor 7.
Resta del número anterior el valor del posterior.
-
Substracción
Ejemplo: $num = 4-3; a $num se le asigna el valor 1.
Multiplica los dos números entre los que está.
*
Multiplicación
Ejemplo: $num = 4*3; a $num se le asigna el valor 12.
Halla el cociente del primer número entre el segundo.
/
División
Ejemplo: $num = 12/3; a $num se le asigna el valor 4.
Halla el resto de la división del primer número entre
% el segundo.
Módulo
Ejemplo: $num = 5%3; a $num se le asigna el valor 2.

Asignación

Operador Operación
Asigna a la variable de su izquierda el valor que haya o
resulte de la operación que aparece a la derecha.
=
Ejemplo: $texto = “casa”; a $texto se le asigna la cadena
Asignación
“casa”.
simple
¡Ojo! No confundirlo con el operador de comparación ==
(igual que).
Igual que el anterior ejecutando el operador que haya a
la izquierda del signo = sobre el valor o cadena que haya
a su derecha y asignándolo a la variable de la izquierda.
Op=
Asignación
Ejemplos: $num += 4; al valor de $num se suman 4.
combinada
$texto .= “ además”; a la cadena de $texto se concatena
la cadena “ además”.

- 94 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

Es conveniente saber que PHP 5 soporta dos tipos de asignaciones:

1. Por valor. Esta asignación realiza una nueva copia de la variable original,
es decir, el valor de una variable se pasa a otra haciendo una copia del valor de
la primera. Por ejemplo, si a la variable $a le asignamos el valor 5 ($a=5;) y a la
variable $b le pasamos el valor de $a ($b=$a;), en esta última tendremos una
copia de la primera, sin que el valor de $b se vea después afectado por los
cambios de $a. Es el tipo de asignación usado más frecuentemente en los
programas.

2. Por referencia. En este tipo de asignación, menos utilizado, ambas


variables acabarán apuntando al mismo dato sin que el valor de una se copie a
otra. A modo de ejemplo, asignamos a la variable $a el valor 4 y a la variable $b
el contenido de la variable $a. Es decir, el valor de la variable $a lo pasamos a
la variable $b de forma directa así: $b=$a;, haciendo una copia de $a en $b.
Pero podemos hacerlo por referencia de esta forma: $b=&$a;. Aquí apuntamos
la variable $b a la dirección de memoria de la variable $a; es decir, las dos
variables almacenan su contenido en el mismo espacio físico en la memoria y
por lo tanto, el valor de $a y $b es siempre idéntico (cualquier cambio en el
valor de $a implica el mismo cambio en $b y viceversa).

A continuación, mostramos un ejemplo,

<?

// La variable $a toma el valor 4


$a = 4;

/* La variable $b toma el contenido de la cadena $a ($b contiene el


valor 4)*/
$b = $a;

/* La cadena $b apunta al mismo contenido que $a (la misma dirección


de memoria para ambas variables)*/
$b = &$a;

// Ambas variables $a y $b contienen el valor 10.


$a=10;

?>

Es importante observar la sintaxis, en la que interviene el signo &. Además, hay


que tener en cuenta que sólo las variables con nombre pueden ser asignadas
por referencia, no las expresiones anteponiéndoles el signo &.

En la Unidad 3, en el apartado Funciones creadas por el usuario veremos


también la utilización de la asignación por referencia en los parámetros de las
funciones.

Comparación

- 95 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

Operador Operación
Devuelve True si los dos valores que separa son iguales y
False si no lo son.
==
Ejemplo: (4==3); devuelve False.
Devuelve True si el valor que está a la izquierda es menor
que el de la derecha y False si no lo es.
<
Ejemplo: (4<5); devuelve True.
Devuelve True si el valor que está a la izquierda es menor
o igual que el de la derecha y False si no lo es.
<=
Ejemplo: (5<=5); devuelve True.
Devuelve True si el valor que está a la izquierda es mayor
que el de la derecha y False si no lo es.
>
Ejemplo: (4>5); devuelve False.
Devuelve True si el valor que está a la izquierda es mayor
o igual que el de la derecha y False si no lo es.
>=
Ejemplo: (5>=4); devuelve True.
Devuelve True si los dos valores que separa son diferentes
y False si no lo son.
!=
Ejemplo: (5!=4); devuelve True.
Devuelve True si los dos valores que separa son idénticos
en contenido y tipo y False si no lo son.
===
Ejemplo: (5===5); devuelve True.

Al utilizar los operadores de comparación, hay que tener en cuenta lo siguiente:

1. Pueden compararse entre sí casi todos los datos, aunque sean de diferente
tipo, pero si queremos estar seguros del resultado, lo mejor es comparar datos
del mismo tipo.

2. De la expresión construida con estos operadores siempre se deduce un


resultado lógico: True (Verdadero) o False (Falso).

3. Cuando los datos comparados son del mismo tipo, la comparación se lleva
a cabo de la forma siguiente:

 Si los datos son de tipo numérico, se compara su magnitud. Por ejemplo, en


la expresión 5 == 7, se comparan los valores 5 y 7, y se obtiene el resultado
False.

 Si los datos son de tipo cadena, la comparación se basa en el valor decimal


que tenga cada carácter de la cadena según el código ASCII. Si utilizamos el
operador ==, la comparación se lleva a cabo de izquierda a derecha y de
carácter en carácter hasta que se encuentra alguna diferencia o hasta que se
acaban las posiciones de las cadenas.

- 96 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

Por ejemplo, en la expresión "Delfos" == "Delos" se inicia la comparación por


la letra "D" de ambas cadenas. Al advertir que los dos caracteres tienen el
mismo valor Decimal ASCII (69), se compara el siguiente carácter, que también
es igual, etcétera. Si antes de comparar todos los caracteres de las cadenas,
se encuentra alguna diferencia, como en este caso en la cuarta letra (f frente a
o), se concluye que son desiguales y, por tanto, se obtiene el resultado False.

El operador === (exactamente igual) debe usarse cuando se quiere saber si un


valor es igual a otro, tanto en su contenido completo como en su tipo. Por
ejemplo, la expresión (“+010” == “10.0”) devuelve True. En cambio, la
expresión (“+010” === “10.0”) devuelve False.

Si los datos son de tipo fecha, la comparación se basa en el valor cronológico.


Por ejemplo, la fecha “12/12/97” es anterior cronológicamente a la fecha
“12/01/98”.

 Si los datos son de tipo lógico, el valor Falso (False) es igual al valor Falso
(False) y el Verdadero (True) es igual a Verdadero (True). Por ejemplo, True
== True obtiene Verdadero; en cambio, de la expresión compleja (5 > 10) == (6
< 12) se deduce un valor Falso, pues la primera expresión (cinco es mayor que
diez) es Falsa (False); sin embargo, la segunda expresión (seis es menor que
doce) es Verdadera (True). Por tanto, la expresión False == True devuelve un
valor Falso.

Condicional

Operador Operación
Si la expresión que está a la izquierda del operador
devuelve True, asigna a la variable el valor de la primera
expresión que queda a su derecha; de lo contrario, le
asigna el valor de la segunda expresión.
?:
Ternario Ejemplos:$a = (8>7) ? (6*8) : (4+7);a $a se

le asigna el valor 48.

$a = (8<7) ? (6*8) : (4+7);a $a se le asigna el valor 11.

Ejecución

Operador Operación
PHP soporta un operador de ejecución: el apóstrofe
invertido (``). No son apóstrofes normales. PHP intentará
ejecutar la instrucción contenida dentro de los apóstrofes
invertidos como si fuera un comando del Shell; su salida
`orden` es devuelta como el valor de esta expresión. También puede
Ejecución asignarse a una variable.

Ejemplos:$salida = `ls -al`;

a la variable $salida se le asigna el resultado de la

- 97 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

orden ls –al.

Cadena

Operador Operación
Devuelve el resultado de unir el contenido de las dos
cadenas que hay a su izquierda y a su derecha.

Ejemplos:$a=“casa”; $b=“ grande”;


.
$c=$a.$b; a $c se le asigna “casa grande”.
Concatenación
Puede combinarse con el operador de asignación =así:

$a .= “ baja”; a la variable $a se le asigna la cadena


“casa baja”.

Incremento / decremento

Operador Operación
Incrementa $var en uno y después devuelve el su valor.
++$var
Preincremento Ejemplo:<? $a=4; echo ++$a; ?>. En la página web
aparecerá 5.
Decrementa $var en uno y después devuelve su valor.
--$var
Predecremento Ejemplo:<? $a=4; echo --$a; ?>. En la página web
aparecerá 3.
Devuelve el valor de $var y después lo incrementa en
uno.
$var++
Posincremento
Ejemplo:<? $a=4; echo $a++; echo $a; ?>. En la página
web aparecerá primero 4 y luego 5.
Devuelve el valor de $var y después lo decrementa en
uno.
$var--
Posdecremento
Ejemplo:<? $a=4; echo $a--; echo $a; ?>. En la página
web aparecerá primero 4 y luego 3.

Lógicos

Los operadores lógicos reciben este nombre porque nos permiten obtener
resultados lógicos o booleanos. Los valores lógicos son aquellos que sólo
pueden contener uno de estos dos valores: Verdadero (True en inglés) o Falso
(False en inglés). Este tipo de datos se usa principalmente para establecer
condiciones que nos permitan ejecutar unas operaciones u otras dentro de las
sentencias de bifurcación condicional y para controlar los bucles. Por este
motivo los operadores lógicos son muy importantes en la programación y se
emplean constantemente.

Son los siguientes:

- 98 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

Operador Operación
Niega el valor lógico de una expresión.
!
Ejemplos:
No
Si $casado == True; luego !$casado será igual a False.
Devuelve True si las dos expresiones que une son verdaderas
(True) y False si al menos una es falsa.
And o &&
Y
Ejemplos: La expresión (3<5 && 10<15) devuelve True. En
cambio, la expresión (3<1 && 10<15) devuelve False.
Devuelve True si al menos una de las dos expresiones que
une es verdaderas (True) y False si las dos son falsas.
OR o ||
Ejemplos: La expresión (3<5 or 10<8) devuelve True. En
O
cambio, la expresión

(3<1 || 10<8) devuelve False.


Devuelve True si sólo una de las dos expresiones que une es
verdadera (True) y False si las dos son falsas(False) o las
dos son verdaderas (True).
XOR
Y no Ejemplos: La expresión (3<5 xor 10<8) devuelve True. En
cambio, la expresión

3(3<1 xor 10<8) devuelve False.

Bit a bit

Permiten activar o desactivar los bits individualmente de un número entero.


Estos operadores sólo se usan para operaciones muy específicas. No vamos a
utilizarlos en este curso, por lo cual no los explicamos.

Reglas de precedencia entre los operadores

Cuando en una instrucción aparecen expresiones complejas en las que


interviene varios operadores de diferentes tipos, es preciso conocer bien el
orden en que el ordenador ejecuta esos operadores. Este orden o jerarquía se
denomina precedencia. Por ejemplo, la expresión $a = (10+6/2) asigna a la
variable $a el valor 13 en lugar de 8, pues el operador / se ejecuta antes que el
operador +. Así pues, en este orden (6+10)/2 se obtiene el resultado citado.

¿Cómo podemos alterar esta jerarquía en las operaciones? Para hacer que los
operadores se ejecuten en un orden distinto del establecido, debemos utilizar
los paréntesis. Por ejemplo, si necesitamos sumar 6 y 2, y dividir el resultado
entre 2, no podemos escribir la expresión 6 + 2 / 2, pues resultaría 7 según las
reglas de precedencia establecidas; en cambio, si escribimos (6 + 2) / 2,
primero se ejecuta la operación que está entre paréntesis y después, la
operación de dividir obteniéndose 4 como resultado.

- 99 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

A continuación, se refleja el orden en que el ordenador ejecuta las operaciones.


En la tabla siguiente se indican de arriba (inferior) abajo (superior) y de
izquierda (superior) a derecha (inferior) esta jerarquía.

Orden de ejecución de los operadores


or
xor
and
= += -= *= /= %=
?:
||
&&
== != ===
< <= > >=
+ - .
* / %
(a la derecha) ! ++ -- Operadores de modelado
(int)(boolean)(double)(string)(array)(object)

- 100 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

Resumen

Hay que saber al final de esta unidad

 PHP es un lenguaje de programación pensado para


elaborar páginas web dinámicas que ofrece altas
prestaciones.

 El lenguaje PHP es sencillo, rápido,


multiplataforma y gratuito. Permite utilizar
múltiples recursos y librerías, programar con
objetos y acceder a muchas bases de datos de
diferentes formatos.

 Su funcionamiento es sencillo: el usuario o


cliente solicita al servidor web una página;
éste envía el código PHP al intérprete, que lo
ejecuta y devuelve al usuario la página en
formato HTML.

 Para poder usar PHP se necesita un servidor web,


una plataforma, como Windows o Linux, y un
gestor de base de datos. En concreto, este curso
utiliza el servidor Apache, instalado en el
ordenador local del usuario, el sistema
operativo Windows y el gestor MySQL de bases de
datos.

 El lenguaje PHP se entremezcla y combina con el


lenguaje HTML, de forma que uno puede enmarcar o
envolver al otro y viceversa.

 El signo <?php indica que comienza el código PHP


y el signo ?> señala el final de este código.
Dentro de estos dos signos no se puede anidar
otro código PHP enmarcado entre <?php y ?>.

 Para escribir el código fuente necesitamos de un


entorno de desarrollo para PHP. Puede utilizarse
cualquiera, si bien para el curso utilizaremos
Eclipse-PDT, que dispone de las principales
opciones propias de este tipo de entornos.

 Desde la opción Ayuda de este entorno se puede


acceder al Manual de PHP.

- 101 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

 Los ficheros que contengan el código fuente PHP


deben llevar la extensión php, para que el
intérprete los reconozca.

 Los ficheros que contengan el código fuente de


las actividades del alumno han de guardarse en
la carpeta personal que debe aparecer dentro de
la carpeta alumnos de c:\XAMPP\htdocs\curso.

 Para comprobar que un programa funciona, hay que


arrancar primeramente el servidor Apache y a
continuación Eclipse-PDT para ejecutarlo.

 Todas las sentencia de PHP deben acabar con ;.

 Las sentencias o instrucciones compuestas


contienen varias sentencias simples y deben
estar incluidas entre los signos { y }.
Generalmente, una sentencia compuesta está
integrada por sentencias simples de un bucle o
de la declaración de una función que deben
ejecutarse como un bloque.

 Los nombres de las variables y arrays deben


iniciarse siempre con el signo $. Deben ser
correctos y conviene que sean fáciles de manejar
y que tengan algún significado que informe de su
contenido.

 Para poder seguir mejor el flujo de un programa


y ver más intuitivamente su código, conviene
indentar (adentrar unos espacios) las sentencias
que están incluidas dentro de una estructura.

 Los comentarios ayudan mucho a comprender un


programa. Los que sólo ocupan una línea deben ir
precedidos de los signos //. Si el texto ocupa
más de una línea, hay que incluirlo entre los
signos /* y */. Éstos no deben iniciarse detrás
de una instrucción, sino en línea aparte.

 Hay operadores de varios tipos: aritméticos, de


asignación, de comparación, condicional, de
ejecución, de cadena, de incremento/decremento,
lógicos y de bit a bit.

 Dentro de una expresión los operadores no se

- 102 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

ejecutan de izquierda a derecha en el orden en


que están escritos, sino que siguen una
prelación u orden jerárquico que debemos tener
en cuenta. Los paréntesis sirven para determinar
el orden de ejecución de los operadores sin
tener en cuenta la precedencia de los mismos.

 Las órdenes echo y print sirven para mostrar


información en la página web tal como la
escribamos literalmente o según esté contenida
en una variable.

 Las funciones printf() y sprintf() permiten


mostrar información con un formato determinado,
según se especifique en una cadena de formato
integrada por textos literales y por directivas.
Las directivas deben iniciarse con el signo %.

 En el lenguaje PHP hay datos de los siguientes


tipos: numérico entero, numérico de coma
flotante, arrays (matrices), cadenas de
caracteres y objetos.

 Hay conversores de tipos que permiten definir


una variable como de un determinado tipo. Son
int, double, string, array y object.

 Es muy importante saber construir expresiones


correctas con variable, literales, operadores y
funciones, así como saber interpretarlas.

 En PHP como en cualquier lenguaje las


expresiones constituyen uno de los asuntos más
importantes de la programación, pues intervienen
en todas las sentencias y están integradas por
todos los elementos de un lenguaje informático.

- 103 -
Curso de Iniciación a PHP: Unidad 1
- Introducción al lenguaje PHP -

- 104 -
MÓDULO 1

El lenguaje de programación PHP 5

Unidad 2

Índice de la unidad:

1. Algo más sobre variables

2. Trabajando con formularios

3. Estructuras de bifurcación condicional

4. Proyecto PHP con múltiples archivos

5. Control de excepciones

6. Resumen
Curso de Iniciación a PHP: Unidad 2
- El lenguaje de programación PHP 5 -

Introducción
En esta Unidad vamos a conocer y saber usar las variables en toda su
extensión como elementos fundamentales del lenguaje PHP. Además,
aprenderemos a utiliza formularios.

Conoceremos cómo se pasa información entre scripts PHP y se accede


desde unos a otros.

También, aprenderemos a utilizar correctamente las estructuras de control


condicionales y las estructuras de bucle aplicándolas con eficiencia a las
diferentes situaciones que lo requieran.

Finalmente, sabremos cómo acceder a ficheros externos desde la página web


actual.

Algo más sobre las variables


Ya se habrá podido advertir que las variables son un elemento fundamental en
la programación. En la Unidad 1 sólo hemos comentado algunos aspectos
básicos de las mismas. En esta Unidad vamos a completar algo más esa
información.

Ámbito de las variables

Como ya hemos dicho, el lenguaje PHP es interpretado, es decir, no


permanece en la memoria, sino que, una vez ejecutado el script de la página
php, se pierde el contenido de las variables utilizadas en el código. Así pues,
cada variable sólo tiene validez en el contexto en que está definida, bien
aparezca dentro de un servidor, de un script php o de una función. Así pues,
por defecto las variables que forman parte de una página o función tienen un
ámbito exclusivamente local.

¿Cómo podemos hacer que una variable tenga un valor global, es decir, que se
conserve tanto en una función como en una página o entre páginas diferentes?

Para alterar el ámbito de una variable, disponemos de dos modificadores:

1. global: este modificador permite acceder a una variable en la página php


cuando se invoca una función. Veamos en el ejemplo siguiente cómo se
comporta una variable local y la misma si es global.

En este ejemplo usamos la variable $texto como local tanto en la página como
en la función.

<HTML> 

- 107 -
Curso de Iniciación a PHP: Unidad 2
- El lenguaje de programación PHP 5 -

<HEAD><TITLE>Curso PHP 5 ‐ Unidad 2 ‐ Ejemplo 1</TITLE></HEAD> 
<BODY> 
<?php 
  // Esta variable solo existe en el ámbito principal del script 
  $texto="Volverán las oscuras golondrinas..."; 
  function ver_texto() 
  { 
     echo "<BR>"; 
     echo "No se ve el contenido de la variable \$texto, 
         pues sólo tiene un ámbito local. Por eso se  
         muestra el mensaje de error siguiente:"; 
     echo "<BR>"; 
   // Aparece un error en la ejecución de la siguiente sentencia ya que 
   // esta variable está definida en el ámbito global, no en el ámbito de
   // esta función. 
     echo $texto; 
  } 
  // Invocamos la función local anterior 
  ver_texto(); 
?> 
</BODY> 

</HTML>

En la Unidad 3 puedes ver cómo definir funciones de usuario, en caso de


dudas, puedes echarle un vistazo rápido a esta parte de la teoría.

Si ejecutamos la página anterior desde Eclipse PDT, vemos que no se muestra


el contenido de la variable $texto, pues el valor asignado a la misma en el
script php no pasa a la función, que es donde debe mostrarse. En cambio, se
muestra el error siguiente:

Desde Eclipse PDT puedes abrir el proyecto Ejemplo 1 (Ambito


variables) de la Unidad 2. Estudia el código fuente y ejecútalo para mostrar
en el navegador su resultado.

En cambio, si utilizamos el modificador global dentro de la función, sí se


muestra el valor de la variable, como puede observarse en el mismo ejemplo
anterior modificado:

<HTML> 
<HEAD><TITLE>Curso PHP 5 ‐ Unidad 2 ‐ Ejemplo 2</TITLE></HEAD> 
<BODY> 

- 108 -
Curso de Iniciación a PHP: Unidad 2
- El lenguaje de programación PHP 5 -

<?php 
  // Esta variable solo existe en el ámbito principal del script 
  $texto="Volverán las oscuras golondrinas..."; 
  function ver_texto() 
  { 
     global $texto; 
     echo "<BR>"; 
     // Fíjate cómo mostramos escapamos el carácter "$" 
     echo "Ahora se ve el contenido de la variable 
            \$texto, pues tiene un ámbito global."; 
     echo "<BR>"; 
   // Aparece un error en la ejecución de la siguiente sentencia ya que 
   // esta variable está definida en el ámbito global, no en el ámbito de
   // esta función. 
     echo $texto; 
  } 
  // Invocamos la función local anterior 
  ver_texto(); 
?> 
</BODY> 

</HTML>

Desde el Eclipse PDT puede abrirse el Ejemplo 2 de la Unidad 2 y con el


botón Ejecutar mostrar en nuestra pantalla el resultado de su interpretación:

Desde Eclipse PDT puedes abrir el proyecto Ejemplo 2 (Ambito variables


correcto) de la Unidad 2. Estudia el código fuente y ejecútalo para mostrar
en el navegador su resultado.

2. static: este modificador es prácticamente igual que el anterior, pero algo


más extenso, pues hace que la variable conserve el mismo valor en sucesivas
ocasiones en que se invoque la función a lo largo de un programa. Una variable
estática existe sólo en el ámbito local de la función, pero no pierde su valor
cuando la ejecución del script PHP abandona este ámbito. Por eso, es
necesario crearla como estática dentro de la función y asignarle valor en este
ámbito.

En el ejemplo siguiente puede verse cómo se usa el modificador static.

- 109 -
Curso de Iniciación a PHP: Unidad 2
- El lenguaje de programación PHP 5 -

<HTML> 
<HEAD><TITLE>Curso PHP 5 ‐ Unidad 2 ‐ Ejemplo 3</TITLE></HEAD> 
<BODY> 
<?php 
  function ver_valor_estatico() 
  { 
     echo "<BR>"; 
     // Definimos una variable estática, es decir, no pierde su valor cuando 
     // acaba la ejecución de la función 
     static $valor=0; 
     echo $valor; 
     $valor++; 
  } 
  echo "La variable \$valor dentro de la función ver_valor_estatico() aumenta cada 
vez que invocamos la función."; 
  ver_valor_estatico(); 
  ver_valor_estatico(); 
  ver_valor_estatico(); 
   
  function ver_valor() 
  { 
    echo "<BR>"; 
    // Definimos una variable sin modificador, es decir, pierde su valor cuando 
    // acaba la ejecución de la función 
    $valor=0; 
    echo $valor; 
    $valor++; 
  } 
  echo "<BR><BR>La variable \$valor dentro de la función ver_valor() no aumenta 
cada vez que invocamos la función."; 
  ver_valor(); 
  ver_valor(); 
  ver_valor(); 
?> 
</BODY> 
</HTML>  

Desde Eclipse PDT puede abrirse el Ejemplo 3 de la Unidad 2 y con el botón


Ejecutar mostrar en nuestra pantalla el resultado de su interpretación:

- 110 -
Curso de Iniciación a PHP: Unidad 2
- El lenguaje de programación PHP 5 -

Usando Eclipse PDT puedes abrir el proyecto Ejemplo 3 (Variable


estática) de la Unidad 2. Estudia el código fuente y ejecútalo para mostrar
en el navegador su resultado, en el que hemos usado una variable estática
y otra normal.

3. Matriz $GLOBALS(). PHP desde la versión 3 dispone de otra forma de


acceder a las variables de una forma global. El array $GLOBALS asocia en
cada uno de sus elementos el nombre de la variable con su contenido de tal
forma que accediendo al primero podemos saber su contenido dentro de un
ámbito global.

En el ejemplo siguiente se ve claramente cómo funciona este método.

<HTML> 
<HEAD><TITLE>Curso PHP 5 ‐ Unidad 2 ‐ Ejemplo 4</TITLE></HEAD> 
<BODY> 
<?php 
 
// Asignamos a las variables $v y $x los valores 3 y 6 respectivamente. 
// Observa que no las declaramos como globales, luego son locales. 
$x = 3;  
$y = 6;  
 
   Function Sumar() 
   { 
       /* Observa que las variables $v, $x y $z no son declaradas 
        como globales pero accedemos a ellas globalmente mediante 
       la matriz $GLOBALS.*/ 
       $GLOBALS["z"] = $GLOBALS["x"] * $GLOBALS["y"]; 
   } 
 
Sumar(); 
 
echo "La variable \$x=3 multiplicada por la variable \$y=6 
      produce el resultado 18, que asignamos a la variable \$z."; 
echo "<BR>"; 
echo "<BR>"; 
echo "Luego \$z vale $z."; 
 
?> 
</BODY> 
</HTML>  

Desde Eclipse PDT puedes abrir el proyecto Ejemplo 4 (Variable


$GLOBALS) de la Unidad 2. Estudia el código fuente y ejecútalo para
mostrar en el navegador su resultado, en el que hemos usado varias
variables $GLOBALS.

El resultado de su interpretación es el siguiente:

- 111 -
Curso de Iniciación a PHP: Unidad 2
- El lenguaje de programación PHP 5 -

Variables de variables

PHP ofrece la posibilidad de utilizar variables que hagan referencia al contenido


de otra variable, en una especie de suplantación o sustitución de una variable
por otra. Es útil para leer un fichero de configuración. Para que una variable
sustituya a otra es preciso utilizar el operador { }. En el siguiente ejemplo puede
verse cómo se comporta una variable y su sintaxis.

<HTML> 
<HEAD><TITLE>Curso PHP 5 ‐ Unidad 2 ‐ Ejemplo 5</TITLE></HEAD> 
<BODY> 
<?php 
    // Definimos 2 variables de tipo cadena 
    $nombre = "María"; 
    $n = "nombre"; 
  // Mostramos información al usuario 
    echo "La variable \$nombre contiene \"María\"."; 
    echo "<BR>"; 
    echo "La variable \$n contiene \"nombre\"."; 
    echo "<BR>"; 
    // Observa la sintaxis para citar una variable variable: ${$n}. 
    // Es como si hubiéramos escrito: ${'nombre'} 
    echo "La variable variable $\{\$n} contiene también ". ${$n} . ".";     
?> 
</BODY> 
</HTML>  

Utilizando Eclipse PDT puedes abrir el proyecto Ejemplo 5 (Variable de


variables) de la Unidad 2. Estudia el código fuente y ejecútalo para mostrar
en el navegador su resultado.

El resultado de su interpretación es el siguiente:

- 112 -
Curso de Iniciación a PHP: Unidad 2
- El lenguaje de programación PHP 5 -

Cómo obtener información sobre la existencia y el contenido de


una variable

Hemos visto que en PHP el tratamiento de las variables es muy flexible, a la


vez que impreciso. Su tiempo de vida también es breve. En ocasiones, antes
de volver a usarla, es necesario conocer si una variable está definida y, si lo
está, qué valor tiene. Puede ser que en el transcurso de un programa que llame
a varias páginas web la variable haya sido eliminada de la memoria o que haya
adquirido el valor nulo. Para conocer estos dos datos, PHP dispone de las dos
funciones siguientes:

1. empty(), que devuelve el valor verdadero si la variable no está definida o lo


está, pero tiene un valor nulo. Por ejemplo, si a la variable $num le asignamos
el valor 10, las instrucciones

if (!empty($num))
echo "La variable \$num contiene $num.";
else
echo "La variable \$num no está definida.";

genera la página

La variable $num contiene 10.

En cambio, si no hubiéramos definido la variable, devolvería la página

La variable $num no está definida.

2. isset(), que devuelve el valor verdadero si la variable ha sido inicializada


con un valor y falso si no lo ha sido. Por ejemplo, si inicializamos la variable
$num con valor 10, las instrucciones

if (isset($num))
echo "La variable \$num ha sido inicializada y contiene $num.";
else
echo "La variable \$num no ha sido inicializada o definida.";

generan la página

La variable $num ha sido inicializada y contiene 10.

En cambio, si no hubiéramos definido la variable, devolvería la página

La variable $num no ha sido inicializada o definida.

Cómo obtener información sobre el tipo de una variable

A veces, también necesitamos saber de qué tipo son las variables. PHP
dispone con este fin de un conjunto de funciones que empiezan por is_ y que

- 113 -
Curso de Iniciación a PHP: Unidad 2
- El lenguaje de programación PHP 5 -

devuelven verdadero si el tipo de variable es el que se indique y falso si no lo


es. Son las siguientes:

1. is_array(). Devuelve verdadero si el tipo de la variable es una matriz y falso


si no lo es.

2. is_bool(). Devuelve verdadero si el tipo de la variable es booleano y falso si


no lo es.

3. is_double(). Devuelve verdadero si el tipo de la variable es un número de


tipo doble y falso si no lo es.

4. is_float(). Devuelve verdadero si el tipo de la variable es un número de


coma flotante y falso si no lo es.

5. is_int() o is_integer(). Devuelve verdadero si el tipo de la variable es un


número entero y falso si no lo es.

6. is_long(). Devuelve verdadero si el tipo de la variable es un número entero


largo y falso si no lo es.

7. is_object(). Devuelve verdadero si el tipo de la variable es un objeto y falso


si no lo es.

8. is_real(). Devuelve verdadero si el tipo de la variable es un número real y


falso si no lo es.

9. is_string(). Devuelve verdadero si el tipo de la variable es una cadena de


caracteres y falso si no lo es.

10. is_numeric(). Devuelve verdadero si el tipo de la variable es un número y


falso si es una cadena.

11. gettype(). Esta última función, más directa que las anteriores, devuelve
directamente el tipo de la variable que se le pasa como argumento. Los tipos
posibles son boolean, integer, double, string, array, object y unknown
(desconocido).

Si sólo se necesita saber de qué tipo es una variable, esta última función es
la más directa y recomendable. En cambio, si se necesita que una variable
sea de un determinado tipo para operar con ella, es más directo y
recomendable utilizar la correspondiente anterior.

Cómo modificar una variable

PHP dispone también de funciones para realizar estas operaciones:

1. Eliminar una variable de la memoria. Recordamos que todas las variables


se eliminan por sí mismas al acabar la interpretación de un programa, por lo

- 114 -
Curso de Iniciación a PHP: Unidad 2
- El lenguaje de programación PHP 5 -

cual no es necesario eliminarlas explícitamente. Esta operación sólo es


recomendable cuando se comprueba que dentro de un mismo script php se
consumen innecesariamente muchos recursos, como cuando hay muchas
variables definidas que ya no se usan.

En este caso, podemos utilizar la función unset(), que elimina una variable
definida previamente. El nombre de la variable que debe eliminarse se pasa a
la función como parámetro. Por ejemplo, si queremos que $casa ya no esté
definida, podemos escribir unset($casa). Si la operación se ha llevado a cabo
con éxito, la función devuelve el valor verdadero; de lo contrario, devuelve
falso.

2. Asignar un tipo concreto a una variable. En la Unidad 1 ya vimos cómo


podía hacerse esto con los conversores de tipos boolean, int, double, string,
array y object. La función settype() permite, igualmente, forzar que una
variable sea del tipo especificado.

Por ejemplo, si queremos que la variable $cosa sea de tipo cadena, debemos
escribir: settype($cosa, "string");. Como puede observarse, el primer
argumento es el nombre de la variable y el segundo (entre comillas dobles) es
el tipo de dato que debe tener: boolean, integer, double, string, array y object.

Separar el contenido de una variable

El contenido de una variable de cadena puede contener letras y números. PHP


dispone de diferentes funciones que permiten separar los números del texto y
asignarlos a las variables correspondientes de su tipo.

Por ejemplo, si tenemos la cadena “89.53Pepe es madrileño”, es posible


separar el contenido numérico de este texto: 89.53. Veamos cómo se hace
estudiando cada una de las funciones siguientes:

1. doubleval(). Devuelve el número de coma flotante que haya en la frase.


Conviene advertir que esto sólo ocurre si el número de coma flotante aparece
al principio de la frase. De no ser así, se devuelve 0.

2. intval(). Devuelve el número entero que haya en la cadena o 0 si no lo hay.

3. strval(). Devuelve una cadena de caracteres utilizando el contenido de la


variable.  

Utilizando Eclipse PDT puedes abrir el proyecto Ejemplo 6 (Separar


variables) de la Unidad 2. Estudia el código fuente y ejecútalo para mostrar
en el navegador el resultado de su interpretación.

- 115 -
Curso de Iniciación a PHP: Unidad 2
- El lenguaje de programación PHP 5 -

Constantes

Aunque en este apartado tratamos de las variables, queremos añadir que en


PHP también pueden definirse constantes, es decir, asignar a identificadores
valores que no van a cambiar nunca a lo largo de un programa. Por ejemplo,
hay valores constantes que no tienen por qué ser escritos cada vez que los
necesitemos, sino que podemos asignarlos a una constante y operar con ella
como si fuera una variable. Por ejemplo, el euro vale 166,386 pesetas. En lugar
de escribir siempre este valor, podemos definir la constante “tasa” y luego
usarla en las operaciones.

La función define() nos permite crear constantes y asignarles un contenido.


Por ejemplo, si queremos crear la variable “tasa” y asignarle su valor en
relación con la peseta, debemos escribir la sentencia
define("tasa",166.386);. Una ver definida la constante, si tenemos la variable
$euros, podríamos operar así: $pesetas=($euros * tasa);. Debemos observar
que los identificadores de las constantes no llevan el signo $ delante.

Las constantes no tienen un concreto ámbito de utilización, por lo que son


accesibles desde cualquier lugar de nuestra página PHP. Además, las
constantes no pueden ser redefinidas una vez que han sido inicializadas.

La función defined() devuelve verdadero si se define con éxito una constante y


falso si no es así.

Variables predefinidas

PHP genera automáticamente una serie de variables con diversa información


sobre el cliente y el servidor. Veamos cuáles son:

 $_POST: matriz asociativa que contiene los datos enviados por los
formularios mediante el método HTTP POST.
 $_GET: matriz asociativa que contiene los datos enviados por los
formularios mediante el método HTTP GET.
 $_COOKIE: matriz asociativa que contiene las cookies del usuario
visitante. En la Unidad 5 veremos cómo se utiliza.
 $_REQUEST: matriz asociativa que contiene los datos enviados por los
formularios y las cookies guardadas en el ordenador del cliente, es decir,
incluye la información de las matrices $_POST, $_GET y $_COOKIE. Los
estudiaremos un poco más adelante en esta Unidad.
 $_SERVER: matriz asociativa que contiene información sobre cabeceras,
rutas y ubicaciones de scripts suministrada por el servidor (hay que tener
en cuenta que no todos los servidores suministran todos los datos).
En el Ejemplo 1 de la Unidad 1, hemos visto que usábamos la variable
$_SERVER['HTTP_USER_AGENT'] para obtener la información del
navegador del usuario visitante.

- 116 -
Curso de Iniciación a PHP: Unidad 2
- El lenguaje de programación PHP 5 -

Otro elemento muy interesante es $_SERVER[PHP_SELF] ya que contiene


la dirección de la página (relativo al directorio raíz del servidor, es decir,
sin el nombre del servidor).

Como veremos más adelante al estudiar los formularios, esta variable se


puede utilizar en las páginas que se enlazan consigo mismas.

 $_SESSION: matriz asociativa que contiene variables de la sesión


disponibles para el script. En la Unidad 5 veremos cómo se utiliza.
 $_FILES: matriz asociativa de ficheros cargados al servidor a través del
método POST. En la Unidad 4 veremos cómo se utiliza.

- 117 -
Curso de Iniciación a PHP: Unidad 2
- El lenguaje de programación PHP 5 -

Trabajando con formularios

En la Unidad anterior hemos visto cómo presentar información en la página


web. En ésta vamos a dar un paso más estudiando cómo podemos preguntar
datos desde una página y hacer que esa información pase a la misma página o
a otra.

Los formularios, mediante controles, nos proporcionan la posibilidad de


preguntar al usuario cliente una serie de datos que pueden ser devueltos al
servidor. Éste los procesará luego según los objetivos del programa:
almacenándolos en una base de datos, controlando si son correctos,
tratándolos para ofrecer posteriormente al cliente otra página, etcétera.

Para que un control de un formulario envíe información al servidor web es


necesario:

 Lógicamente, que el control esté incluido en un formulario con la etiqueta


HTML <form>.
 El formulario debe indicar su atributo action con la dirección absoluta o
relativa del fichero PHP que procesará la información.
 El control debe indicar su atributo name. Este atributo name puede
contener cualquier carácter (números, tildes, guiones, etc.) pero, si
contiene espacios, PHP los sustituye por guiones bajos (_) al procesar
los datos enviados.
 El formulario contenga un botón de tipo submit o alguna función
Javascript que realice esta operación.

Veamos un ejemplo sencillo de formulario HTML:

<FORM ACTION=/curso/unidad2.eje07.formulario/index.php METHOD=GET> 
  <input type='hidden' name='oculto' value='Dato oculto' />    
  <TABLE border=0 cellpadding=10><TR><TD> 
     <input type='image' name='imagen' alt='imagen' src='colegio.png' />  
       </TD><TD> 
    <TABLE border=0><TR><TD align=right>Nombre: </TD> 
      <TD><INPUT NAME=nom VALUE=''></TD> 
    </TR><TR><TD align=right>Apellidos: </TD> 
      <TD><INPUT NAME=apel VALUE=''></TD> 
    </TR><TR><TD align=right>Repetidor: </TD> 
      <TD><input type='checkbox' name='repe'/></TD> 
    </TR><TR><TD align=right>Sexo: </TD> 
      <TD> 
    Hombre <input type='radio' name='Hombre' value='H'/>   
    Mujer <input type='radio' name='Mujer' value='M'/></TD> 
    </TR><TR><TD align=right>Curso: </TD> 
      <TD>     
    <select name='curso'> 
      <option>1D</option> 
      <option selected='selected'>2A</option> 
      <option>3B</option> 
    </select></TD> 
    </TR><TR><TD align=right>Notas: </TD> 
      <TD><TEXTAREA NAME=des COLS=20 ROWS=5></TEXTAREA> 

- 118 -
Curso de Iniciación a PHP: Unidad 2
- El lenguaje de programación PHP 5 -

      </TD>
    </TR> 
  </TABLE></TD></TR></TABLE><P> 
          <INPUT TYPE=submit name='boton' VALUE='Aceptar'><P><P>      
</FORM> 
</CENTER> 
</BODY> 

</HTML>

Para generar este formulario, en el Ejemplo 7 de la Unidad 2 hemos escrito el


siguiente código PHP:

<HTML> 
<HEAD><TITLE>Curso PHP 5 ‐ Unidad 2 ‐ Ejemplo 7a</TITLE></HEAD> 
<BODY> 
<CENTER> 
<H1>Introduzca sus datos</H1> 
 
<?php   
  echo "<FORM ACTION=$_SERVER[PHP_SELF] METHOD=GET> 
    <input type='hidden' name='oculto' value='Dato oculto' />    
    <TABLE border=0 cellpadding=10><TR><TD> 
    <input type='image' name='imagen' alt='imagen' src='colegio.png' 
/> </TD><TD> 
      <TABLE border=0>"; 
 
  echo "<TR><TD align=right>Nombre: </TD> 
        <TD><INPUT NAME=nom VALUE=''></TD> 
      </TR>"; 
  echo "<TR><TD align=right>Apellidos: </TD> 
        <TD><INPUT NAME=apel VALUE=''></TD> 
      </TR>"; 
  echo "<TR><TD align=right>Repetidor: </TD> 
        <TD><input type='checkbox' name='repe'/></TD> 
      </TR>"; 
  echo "<TR><TD align=right>Sexo: </TD> 
        <TD> 
      Hombre <input type='radio' name='Hombre' value='H'/>   
      Mujer <input type='radio' name='Mujer' value='M'/></TD> 
      </TR>"; 
   
  echo "<TR><TD align=right>Curso: </TD> 
        <TD>     
      <select name='curso'> 
        <option>1D</option> 
        <option selected='selected'>2A</option> 
        <option>3B</option> 
      </select></TD> 
      </TR>"; 
     
  echo "<TR><TD align=right>Notas: </TD> 
        <TD><TEXTAREA NAME=notas COLS=20 ROWS=5></TEXTAREA> 
        </TD> 
      </TR> 
    </TABLE></TD></TR></TABLE>"; 
  echo "<P><INPUT TYPE=submit name='boton' VALUE='Aceptar'><P><P>";  

- 119 -
Curso de Iniciación a PHP: Unidad 2
- El lenguaje de programación PHP 5 -

   
  if (isset($_REQUEST['boton'])) { 
    echo "<BR>Contenido de la variable \$_REQUEST: <PRE>"; 
  print_r($_REQUEST); 
  echo  "</PRE><BR><BR><INPUT type='button' value='Volver a la página 
anterior'onClick='history.back()'>"; 
  }   
   
 
?> 
      
</FORM> 
</CENTER> 
</BODY> 

</HTML>

El código PHP anterior crea el formulario siguiente:

Al pulsar sobre el botón Aceptar se vuelve a ejecutar el mismo código. Si


hemos completado en el formulario los datos solicitados, se muestran en la
parte inferior de la página, debajo del formulario. Así pues, conviene saber que
en PHP es frecuente que una página se llama a sí misma. Este procedimiento
se denomina recursividad.

Cuando se ejecuta el código por primera vez, sólo se preguntan los datos del
formulario y no aparecen los mismos en la parte inferior. Es lógico, pues las
variables aún no tienen contenido. Cuando las tres variables tengan algún
contenido, introducido en la página mediante el formulario, se muestra esta
información en la página llamada de nuevo al pulsarse el botón Aceptar y
ejecutarse la orden <FORM ACTION=index.php METHOD=POST>.

- 120 -
Curso de Iniciación a PHP: Unidad 2
- El lenguaje de programación PHP 5 -

El programa que recibe los datos los guarda automáticamente en la matriz


$_REQUEST. Mediante la orden print_r($_REQUEST) se puede mostrar el
contenido de la matriz $_REQUEST tal y como vemos en la siguiente imagen:

Como puedes ver, el servidor que recibe los datos del navegador, los guarda
automáticamente en la matriz $_REQUEST. Por lo tanto, podemos acceder al
contenido de un campo escribiendo, por ejemplo, $_REQUEST[‘nom’].

Con la sentencia siguiente comprobamos si la variable ‘boton’ existe y, si es


así, mostramos el contenido de la variable $_REQUEST:

if (isset($_REQUEST['boton']))

Esta forma de proceder es muy útil para verificar si los datos introducidos son
correctos. Si ponemos las condiciones de corrección dentro del código PHP, la
comprobación se realiza en el servidor, lo cual impide que cualquier usuario
pueda cambiar dichas condiciones, como ocurre en JavaScript.

Ya que podemos cambiar el nombre del fichero PHP que se llama a sí mismo,
en lugar de citar dentro del código expresamente su nombre, podemos usar la
variable de entorno $_SERVER[PHP_SELF] que contiene la dirección de la página

- 121 -
Curso de Iniciación a PHP: Unidad 2
- El lenguaje de programación PHP 5 -

(relativo a la raíz, es decir, sin el nombre del servidor), como hemos hecho, que
guarda el nombre del fichero al ejecutarse.

Esta variable se puede utilizar en las páginas que enlazan consigo mismas. Por
ejemplo, una página puede contener un formulario que envíe los datos a esa
misma página. Para ello, el atributo action del formulario debe contener el
nombre de la página. En vez de poner el nombre de la página, se puede utilizar
$_SERVER[PHP_SELF]. La ventaja es que aunque se cambie el nombre del
fichero, el enlace seguirá funcionando.

El atributo method de la etiqueta <FORM> permite elegir si la información de los


controles se incluye en la barra de dirección del navegador (method=get) o se
proporciona posteriormente (method=post).

Si usamos el método get se puede ver en la barra de dirección del navegador


los nombres de los controles y los valores introducidos por el usuario. Fíjate en
la siguiente imagen:

Nótese que para acceder al contenido de la variables definidas en el formulario


usamos la variable global $_REQUEST tanto para METHOD=POST como para
METHOD=GET, por lo que no es necesario conocer el método utilizado en la

- 122 -
Curso de Iniciación a PHP: Unidad 2
- El lenguaje de programación PHP 5 -

etiqueta <FORM>. PHP también define las variables $_POST y de $_GET que
son matrices que contienen únicamente incluyen la información de un método
en concreto.

Recomendamos al alumno utilizar siempre el mismo método HTTP para enviar


al servidor la información introducida por el usuario. En caso de duda, es mejor
usar la variable $_POST y, así, olvidarnos del método utilizado en el formulario.

Utilizando Eclipse PDT puedes abrir el proyecto Ejemplo 7 (Colegio) de la


Unidad 2. Estudia el código fuente y ejecútalo para mostrar en el navegador
el resultado de su interpretación.

Pasar información entre diferentes scripts

Hasta ahora hemos pasado valores dentro del mismo script llamándolo dos o
más veces (recursividad). También hemos visto que es infrecuente que una
aplicación hecha en PHP esté integrada por un solo fichero que genere una
única página. Generalmente, las aplicaciones tienen múltiples páginas web que
corresponden a múltiples scripts. Por lo tanto, necesitamos saber pasar
información de unos a otros. ¿Cómo se consigue esto?

1. Utilizando un formulario. Los datos introducidos en un formulario pueden


pasar a otra página diferente. Veamos cómo se hace mostrando en una
segunda página la información que se escriba en el formulario del ejemplo
anterior.

En el script del Ejemplo anterior creamos el formulario. Al interpretarse este


código, en la página resultante se preguntan los datos. En este archivo
debemos modificar el formulario (etiqueta ACTION) indicando la página destino
de los datos que introduzca el usuario:

<FORM ACTION=resultado.php METHOD=POST>

En este segundo código, que está guardado en el fichero resultado.php,


mostramos la información en otra página:

<HTML> 
<HEAD><TITLE>Curso PHP 5 ‐ Unidad 2 ‐ Ejemplo 7b</TITLE></HEAD> 
<BODY> 
<CENTER> 
 
<?php 
  // Leemos todas las variable $_REQUEST  
  if (!isset($_REQUEST["nom"])) $nom="";  
  else $nom=$_REQUEST["nom"]; 
  if (!isset($_REQUEST["apel"])) $apel=""; 

- 123 -
Curso de Iniciación a PHP: Unidad 2
- El lenguaje de programación PHP 5 -

  else $apel=$_REQUEST["apel"];   
  if (!isset($_REQUEST["repe"])) $repe='No'; 
  else $repe='S&iacute;'; 
  if (!isset($_REQUEST["hombre"])) $sexo='Hombre'; 
  else if (!isset($_REQUEST["mujer"])) $sexo='Mujer'; 
  else $sexo='No indicado'; 
  if (!isset($_REQUEST["curso"])) $curso=''; 
  else $curso=$_REQUEST["curso"]; 
  if (!isset($_REQUEST["notas"])) $notas=""; 
  else $notas=$_REQUEST["notas"]; 
 
  echo "<H2>Los datos introducidos son:</H2><P>"; 
  echo "Nombre: '$nom' <P>"; 
  echo "Apellidos: '$apel' <P>";  
  echo "Repetidor: '$repe' <P>"; 
  echo "Sexo: '$sexo' <P>"; 
  echo "Curso: '$curso' <P>"; 
  echo "Notas: '$notas' <P>"; 
   
  echo  "<BR><BR><INPUT type='button' value='Volver a la página 
anterior'onClick='history.back()'>"; 
?> 
 
</CENTER> 
</BODY> 

</HTML>

Si ejecutas de nuevo el Ejemplo 7 de la Unidad 2 verás que la información


introducida por el usuario aparece en otra página PHP:

2. Utilizando enlaces. Cuando pasamos un valor a un enlace, en la página


destino se crea de forma automática la variable con el valor que le hayamos
asignado. Veamos cómo se hace transformando el ejemplo anterior de forma
que en lugar de un formulario en el primer script se use un enlace. En el
archivo index.php del Ejemplo 7 de la Unidad 2 añadimos la instrucción, en
código HTML, siguiente:

- 124 -
Curso de Iniciación a PHP: Unidad 2
- El lenguaje de programación PHP 5 -

<A HREF="resultado.php?nom=Pedro&apel=García&des=Alto">
Pulse aquí para enlazar con la otra página </A>

Conviene advertir que detrás de la orden HREF= hay que poner el nombre del
fichero donde está el código de la página a la que hay que pasar los valores,
seguido del signo ?. Detrás de éste, se pone el nombre de la variable cuyo
contenido se debe pasar sin usar el signo $. Si hay más de una variable, se
ponen todas separadas por el signo &, como en el ejemplo anterior.

Cuando pulsamos sobre el enlace, se llama al script de la página siguiente y


muestra los datos introducidos. Debemos observar que el contenido de las
variables se transfiere mediante el enlace. Además, recalcamos el hecho de
que hemos usado el método $_GET para acceder al contenido de la variables
que hemos definido en la URL.

Es posible enlazar también el resultado a la misma página de forma recursiva


escribiendo su nombre de la siguiente forma:

<A HREF="index.php?nom=Pedro&apel=García&nota=Alto">
Pulse aquí para enlazar con la otra página </A>

Queremos acabar este punto con una advertencia:

HTML no entiende de espacios y, por tanto, si el contenido de las tres variables


anteriores hubiera tenido más de una palabra con espacios en medio, la página
no se habría mostrado, sino que se produciría un error. Para que HTML respete
los posibles espacios entre palabras, es preciso utilizar la función urlencode().

En el archivo index.php del Ejemplo 7 de la Unidad 2 añadimos la instrucción,


en código HTML, siguiente:

<?php 
  echo "A la variable \$nom le asignamos el valor \"Pedro José.\"<P>"; 
  echo "A la variable \$apel le asignamos el valor \"García de Dios.\"<P>"; 
  echo "A la variable \$nota le asignamos el valor \"Alto y moreno.\"<P>"; 
 
  $variables_pasadas="nom=".urlencode("Pedro José."). 
                   "&apel=".urlencode("García de Dios."). 
                    "&nota=".urlencode("Alto y moreno."); 
?> 
 
<A HREF=resultado.php?<?php echo $variables_pasadas; ?> >Pulse aquí para 
enlazar con la otra página </A> 

Si ejecutas en Eclipse PDT el nuevo código, verás que los datos se pasan al
página destino respetando los espacios introducidos.

Varios botones dentro de un formulario

- 125 -
Curso de Iniciación a PHP: Unidad 2
- El lenguaje de programación PHP 5 -

Dentro un mismo formulario (FORM), existen diversas maneras de usar varios


botones con diferentes acciones asociadas a cada uno de ellos.

El truco consiste en utilizar las propiedades "name" y "value" de los botones: la


propiedad NAME se convierte en una variable que adquiere el valor de la
propiedad VALUE si se pulsa ese botón en cuestión. Teniendo en cuenta esto,
hay varias formas de usarlo:

1. La primera forma consiste en llamar a los botones igual (mismo name), y cuya
etiqueta value fuera diferente. Leyendo en el script el contenido de
$_REQUEST['name'], sabrías qué botón se ha pulsado. Fíjate en este ejemplo:

<FORM name="formulario" method="post" action="index.php">


<INPUT TYPE="submit" name="boton" value="Listado">
<INPUT TYPE="submit" name="boton" value="Buscar">
</FORM>

Cuando el usuario pulse el botón “Listado” o “Buscar” en la página PHP


destino aparecerán estas variables:

if ($_REQUEST['boton']=="Listado")
{Código;}
elseif ($_REQUEST['boton']=="Buscar")
{Código2;}
else {Código3;}

2. Los botones se llaman de diferente manera (atributo name). Así, es posible


usar el mismo texto en los botones (atributo value). Por ejemplo, una página en
la que hubiera dos botones cuyo texto fuera 'Calcular'. En este caso buscamos
si las variables boton1 o boton2 tienen algún valor. Fíjate en el siguiente
ejemplo:

<FORM name="formulario" method="post" action="index.php">


<INPUT TYPE="submit" name="boton1" value="Calcular">
<INPUT TYPE="submit" name="boton2" value="Calcular">
</FORM>

Cuando el usuario pulse unos de los botones “Calcular” en la página PHP


destino aparecerán estas variables:

if (isset($_REQUEST['boton1']))
{Código;}
elseif (isset($_REQUEST['boton2']))
{Código2;}
else
{Código3;}

3. Definir un formulario para cada botón indicando en el atributo ACTION un


parámetro con una variable (método GET del protocolo HTTP):
action="index.php?operacion=Alta".

- 126 -
Curso de Iniciación a PHP: Unidad 2
- El lenguaje de programación PHP 5 -

En este caso los valores de NAME y VALUE no importan porque se controla la


acción con el parámetro. Fíjate en este ejemplo:

<FORM name="form1" method="post" action="index.php?operacion=Alta">


<INPUT type="text" name="editorial" size="10" maxlength="30">
<INPUT TYPE="SUBMIT" NAME="operacion" VALUE="Alta">
</FORM>

<FORM name="form2" method="post" action="index.php?operacion=borrar">


<IMPUT type="text" name="auto" size="10" maxlength="30">
<INPUT TYPE="SUBMIT" NAME="operacion" VALUE="borrar">
</FORM>

Y en el index.php buscamos el valor de $_REQUEST['operación']:

if ($_REQUEST['operación']) {Código;} ...

4. Por último, también se podrían usar otras opciones HTML como un enlace
(puedes poner una imagen de un botón y enlazarlo con el programa pasándole
parámetros) o también puedes usar Javascript. Fíjate en este ejemplo:

<A HREF="visitar.php?operacion=alta">
<img src="image_boton.gif">
</A>

- 127 -
Curso de Iniciación a PHP: Unidad 2
- El lenguaje de programación PHP 5 -

Estructuras de bifurcación condicional

Uno de los elementos más necesarios y frecuentes en la programación


informática son las estructuras de bifurcación condicional. La ejecución de las
instrucciones de un programa no tiene que seguir necesariamente una línea
secuencial, es decir, en el caso de PHP no han de interpretarse todas las
sentencias que aparezcan en el código. Por el contrario, a veces es
imprescindible que algunas dejen de interpretarse y, en cambio, sí han de ser
procesadas otras. Esto se consigue mediante las estructuras de bifurcación
condicional, que vamos a estudiar a continuación.

Llamamos a estas estructuras de bifurcación condicional, control


condicional o decisión condicional por la decisión que ha de tomarse entre
varias alternativas o diferentes posibilidades. Mediante ellas conseguimos que
se realice una operación u otra en función de unos valores o contenidos dados.

En este curso suponemos que el alumno ya sabe usar esta estructura y nos
vamos a limitar a explicar la sintaxis de las órdenes con las que se aplica en el
código PHP. Por otra parte, en los ejemplos y ejercicios anteriores ya hemos
utilizado estructuras de este tipo esperando que el alumno o alumna las haya
entendido y aplicado correctamente.

Estructura simple

La estructura más elemental está integrada por la palabra reservada if seguida


de una expresión, como se ve en la sintaxis siguiente:

if (expresión)
{sentencia simple o compuesta;}

Por ejemplo, si la variable $numero contiene 5 y queremos multiplicar ese valor


por 2 si $numero vale menos de 10, debemos escribir así la sentencia:

if ($numero<10)
{$numero*=2;}

En este caso, como 5 es menor que 10, se ejecuta la instrucción, de forma que
$numero pasa a valer 10.

Si hay que ejecutar un bloque con múltiples sentencias, es imprescindible


incluirlo entre las llaves {...}. Por ejemplo, si la variable $a contiene 3 y la
variable $b contiene 5, y queremos multiplicar $a por 4 y $b por 2 en el caso de
que $a multiplicada por $b resulte 25, escribiremos:

if ($a*$b=25)
{
$a*=4;
$b*=2;
}

- 128 -
Curso de Iniciación a PHP: Unidad 2
- El lenguaje de programación PHP 5 -

En este caso, como 3 ($a) por 5 ($b) resulta 15, que es distinto de 25, no se
ejecuta la instrucción compleja y, por tanto, ninguna de las dos variables
cambiará de valor.

Estructura completa

En el caso de la estructura anterior una sentencia se ejecuta si se cumple la


condición puesta en la expresión y no se ejecuta si no se cumple. Pero también
es posible ejecutar una instrucción si se cumple la condición o ejecutar otra si
no se cumple la condición. Aquí se aplica con toda precisión el término
bifurcación, que significa división de un camino en dos. PHP dispone también
de esta estructura más completa, cuya sintaxis es la siguiente:

if (expresión)
{sentencia simple o compuesta;}
else
{sentencia simple o compuesta;}

Por ejemplo, si la variable $numero contiene 5 y queremos multiplicar ese valor


por 2 si $numero vale menos de 10 o por 4 si vale 10 o más, debemos escribir
así la sentencia:

if ($numero<10)
{$numero*=2;}
else
{$numero*=4;}

En este caso, como 5 es menor que 10, se ejecuta la primera instrucción, de


forma que $numero pasa a valer 10. Si $numero hubiera contenido 10, se habría
ejecutado la segunda instrucción, de forma que $numero hubiera pasado a valer
20.

Complementaria de esta estructura es otra más completa que admite más de


dos posibilidades o condiciones y, por tanto, se puede ejecutar una instrucción
entre muchas posibles. Tiene esta estructura:

if (expresión1)
{sentencia simple o compuesta;}
elseif (expresión2)
{sentencia simple o compuesta;}
elseif (expresión3)
{sentencia simple o compuesta;}
......
else
{sentencia simple o compuesta;}

Por ejemplo, supongamos que a la variable $etapa le queremos asignar los


literales "Infancia" si la edad de una persona es menor de 4 año, "Niñez" si está
comprendida entre 4 y 10, "Pubertad" si la persona tiene entre 10 y 14 años,
"Adolescencia" si la persona tiene entre 14 y 21 años, "Adultez" entre 21 y 55
años, "Vejez" entre 55 y 70 años y "Ancianidad" desde 70 en adelante.

- 129 -
Curso de Iniciación a PHP: Unidad 2
- El lenguaje de programación PHP 5 -

Debemos escribir así la estructura condicional para que a cada persona se le


asigne la etapa correspondiente a su edad:

if ($edad<4)
{$etapa="Infancia";}
elseif ($edad<10)
{$etapa="Niñez";}
elseif ($edad<14)
{$etapa="Pubertad";}
elseif ($edad<21)
{$etapa="Adolescencia";}
elseif ($edad<55)
{$etapa="Adultez";}
elseif ($edad<70)
{$etapa="Vejez";}
else
{$etapa="Ancianidad";}

Si la variable $edad contiene 34, se ejecutaría la quinta instrucción, que es


$etapa="Adultez"; dado que la primera expresión que devuelve Verdadero
(True) es ($edad<71). Las condiciones se comprueban de arriba abajo y,
cuando se encuentra una expresión que devuelve True, se ejecutan las
instrucciones que contenga en esa cláusula, abandonando después la
estructura condicional.

Para que la variable $etapa no quede indeterminada, es conveniente poner


como última la cláusula else, a fin de que, si no se han cumplido ninguna de
las condiciones anteriores, el flujo del programa pase por esta última y asigne
el valor que nos convenga a la variable $etapa.

Conviene recordar que, si dentro de cada cláusula aparecen varias


instrucciones (sentencia compleja), es necesario ponerlas entre las llaves {...},
si bien es buena costumbre poner siempre las dos llaves como hacemos
nosotros casi siempre.

Hay otra instrucción que permite también codificar estructuras condicionales de


forma muy similar a la que acabamos de ver. Es la orden switch, que tiene la
estructura siguiente:

switch (variable)
{
case valor:
sentencia simple o compuesta;
break;
case valor:
sentencia simple o compuesta;
break;
case valor:
sentencia simple o compuesta;
break;
......
default
sentencia simple o compuesta;
}

- 130 -
Curso de Iniciación a PHP: Unidad 2
- El lenguaje de programación PHP 5 -

Veamos su sintaxis en un ejemplo. Supongamos que en la variable $ciudad


tenemos el nombre de una provincia y que a la variable $comunidad queremos
asignarle la Comunidad Autónoma a la que pertenece. Podríamos escribir así
la estructura condicional:

switch ($ciudad)
{
case "Lugo":
$comunidad="Galicia";
break;
case "Huesca":
$comunidad="Aragón";
break;
case "Soria":
$comunidad="Castilla León";
break;
case "Almería":
$comunidad="Andalucía";
break;
default:
$comunidad="Otra";
}

Si la variable $ciudad contiene "Soria", a $comunidad se le asigna "Castilla


León". Si contuviera "Cáceres", se le asignaría "Otra". En esta estructura hay
que tener en cuenta que el flujo del programa comprueba todas las cláusulas
case, incluso aunque encuentre una condición verdadera.

Conviene incluir siempre la orden break para abandonar la comprobación


cuando se encuentre la primera expresión que devuelva Verdadero.

El lenguaje PHP ofrece una sintaxis alternativa para alguna de sus estructuras
de control condicionales: permite cambiar la llave de apertura { por dos puntos
(:) y la de cierre } por endif; o endswitch;. Incluso es posible mezclar código
HTML dentro de una estructura condicional del lenguaje PHP. Observa el
ejemplo siguiente:

<? if ($ciudad=="Segovia" ?>


Esta ciudad pertenece a Castilla León
<? endif; ?>

En este ejemplo el bloque HTML Esta ciudad pertenece a Castilla León se


incluye dentro de una sentencia if escrita en la sintaxis alternativa. El bloque
HTML se mostrará sólo si $ciudad es igual a "Segovia".

La sintaxis alternativa puede aplicarse incluso dentro de las cláusulas else y


elseif, como puede verse en el ejemplo siguiente:

if ($ciudad == "Soria"):
print "Castilla León";
print "...";
elseif ($ciudad =="Badajoz"):
print "Extremadura";

- 131 -
Curso de Iniciación a PHP: Unidad 2
- El lenguaje de programación PHP 5 -

print "!!!";
else:
print "Sin determinar;
endif;

También en la orden switch puede aplicarse esta sintaxis alternativa así:

$var=3;
switch ($var):
case 0:
print "var vale 0";
break;
case 1:
print "var vale 1";
break;
case 2:
print "var vale 2";
break;
default:
print "var es distinta de 0, 1 o 2";
endswitch;

Anidamiento de estructuras condicionales

Las sentencias if se pueden anidar indefinidamente dentro de otras sentencias


if. Esto proporciona a PHP una gran riqueza y flexibilidad para ejecutar
estructuras condicionales en las diferentes partes de un programa.

Se denomina anidamiento a la operación que consiste en incluir unas


estructuras condicionales dentro de otras. Anidar, pues, consiste en meter
estructuras condicionales dentro de una, de varias o de todas las cláusulas de
otra estructura condicional.

En la operación de anidar estructuras condicionales debe tenerse en cuenta la


siguiente:

 Las estructuras condicionales anidadas pueden ser muy variadas y


complejas. Lo más importante es saber identificar los diversos niveles de
anidamiento y las cláusulas de cada estructura.

 Siempre deben adentrarse los márgenes (indentar) de las estructuras


anidadas para poder ver mejor dónde se abre y se cierra cada estructura
condicional, así como las cláusulas que la integran. Las instrucciones de
cada cláusula también deben indentarse.

 Cuando aparece una estructura condicional anidada dentro de una


cláusula de otra estructura condicional, la estructura condicional anidada
debe incluirse completamente dentro de esa cláusula. Además, pueden
aparecer o no instrucciones antes y después de la estructura condicional
anidada. Es decir, la estructura anidada no tiene por qué ser el único
elemento de una cláusula condicional.

- 132 -
Curso de Iniciación a PHP: Unidad 2
- El lenguaje de programación PHP 5 -

 Las estructuras condicionales sólo deben anidarse cuando no hay otra


solución más sencilla y que exija menos instrucciones, como usar la
orden switch en lugar de anidar hasta varios niveles.

En el próximo ejemplo puedes ver cómo hemos resuelto el supuesto siguiente


usando estructuras condicionales y un formulario donde el visitante puede
introducir su edad y la página le indica la etapa vital de la vida en la que se
encuentra.

Desde Eclipse PDT puedes abrir el proyecto Ejemplo 8 (Etapas de la


vida) de la Unidad 2. Estudia el código fuente y ejecútalo para mostrar en el
navegador su resultado.

Si ejecutas el fichero index_if.php, verás que aparece la siguiente página:

Además, en el mismo proyecto hemos incluido la página index_switch.php que


muestra el mismo ejemplo utilizando la sentencia switch como estructura
condicional. Si ejecutas este Ejemplo, verás que aparece la siguiente página:

- 133 -
Curso de Iniciación a PHP: Unidad 2
- El lenguaje de programación PHP 5 -

En este caso, hemos cambiado el control donde el usuario indica la edad por
un selector de opciones. En este caso, hemos incluido en la etiqueta option de
cada opción el atributo value que establece el valor que tomará la variable
$_REQUEST['edad'] cuando el usuario pulse el botón “Ver mi etapa”. Así,
evitamos que se pase como valor el literal que aparece como opción en el
selector. Fíjate en esta parte del código fuente:

echo "Selecciona tu edad: <select name='edad'> 
  <option value=1>Menor de 4 años</option> 
  <option value=2>Entre 4 y 10 años</option> 
  <option value=3>Entre 10 y 14 años</option> 
      <option value=4>Entre 14 y 21 años</option> 
      <option value=5>Entre 21 y 55 años</option> 
      <option value=6>Entre 55 y 70 años</option> 
      <option value=7>Mayor de 70 años</option> 
  </select>"; 
 
Una vez se recibe en la página la variable con la opción seleccionada, usamos
este valor para, con la orden switch, encontrar el texto que corresponda: 
 
switch ($edad) { 
      case 1: 
        echo "<P>Infancia"; 
        break; 
      case 2: 
        echo "<P>Niñez"; 
        break; 
      case 3: 
        echo "<P>Pubertad"; 
        break; 
      case 4: 
        echo "<P>Adolescencia"; 
        break; 
      case 5: 
        echo "<P>Adultez"; 
        break; 
      case 6: 
        echo "<P>Vejez"; 
        break; 
      case 7: 
        echo "<P>Ancianidad"; 
        break;    
      default:  
        echo "Error al introducir la edad."; 
    } 

Fíjate que siempre se escribe la sentencia break para abandonar la


comprobación cuando se encuentra la primera expresión que devuelva
Verdadero. Además, hemos incluido la opción default como opción final por
defecto si las comprobaciones anteriores no devuelven Verdadero.

- 134 -
Curso de Iniciación a PHP: Unidad 2
- El lenguaje de programación PHP 5 -

Estructuras de bucle

Los bucles, juntamente con las estructuras condicionales, constituyen otro de


los elementos más necesarios y frecuentes en la programación informática.
Una característica importante de todo buen programa, además de la velocidad
de ejecución, es que resuelva el problema planteado utilizando el menor
número posible de líneas de instrucciones. La estructura de bucle permite
ahorrar muchas líneas de programación y aumenta sensiblemente la velocidad
de ejecución de los programas informáticos. De ahí su trascendencia y la
importancia que debe darse a la compresión y correcto uso de este elemento.

Como ya debe saber la persona que haga este curso, en informática el término
bucle es sinónimo de iteración o repetición, es decir, se refiere al hecho de
repetir o iterar una operación cuantas veces necesitemos o queramos. Así
pues, podemos definir un bucle como la estructura de control que permite que
una instrucción o varias se ejecuten más de una vez mientras se cumpla una
condición dada.

Imaginemos que necesitamos hallar los múltiplos de 5 que hay entre 5 y 1000.
Para hacerlo, utilizamos la variable $multiplos_5, que inicialmente tiene el
valor 1 y se va incrementando de uno en uno. Cuando el número resultante es
múltiplo de 5, se muestra en la página. Es un problema muy sencillo de suma y
división, pero si no se emplease un bucle, exigiría muchas líneas de
instrucciones, como puede verse a continuación.

if ($multiplos_5 mod 5 = 0)
{ echo $multiplos_5;}
$multiplos_5+=1;

Las instrucciones anteriores servirían para realizar las operaciones


mencionadas en el caso de que 1 fuera múltiplo de 5. Sin utilizar un bucle,
necesitaríamos repetir esta secuencia 1.000 veces. En cambio, si usamos una
estructura de bucle, con escribir este código una vez es suficiente.

En resumen, un bucle es una estructura de control del flujo de un programa que


permite repetir una o varias operaciones cuantas veces sea necesario
dependiendo de una condición. Siempre que la condición se cumpla, se
repetirá la operación. Cuando deje de cumplirse, se sale de la estructura de
bucle y el programa continúa su flujo ejecutando las instrucciones que
aparecen detrás del bucle.

La estructura de bucle while

Esta orden permite repetir una o varias instrucciones un determinado número


de veces mientras se cumpla una condición dada. Se abandona el bucle
cuando la condición establecida devuelva falso (False) o bien insertando la
orden break según nos convenga. En el primer caso es preciso cambiar el
valor de algún elemento de la expresión dentro del propio bucle para que la
condición devuelva falso (False). En el segundo no es preciso que la condición
devuelva falso para salir del bucle.

- 135 -
Curso de Iniciación a PHP: Unidad 2
- El lenguaje de programación PHP 5 -

Ésta es su sintaxis:

while (expresión)
{sentencia simple o compleja;}

Veamos cómo se usa esta estructura en un ejemplo. La siguiente página


muestra los números entre 0 y 1.000 que son múltiplos de 4, los cuenta y los
suma.

<HTML> 
<HEAD><TITLE>Curso PHP 5 ‐ Unidad 2 ‐ Ejemplo 9</TITLE></HEAD> 
<BODY> 
<H1> <CENTER>Números de 1 a 1.000 múltiplos de 4 </CENTER></H1><P> 
<?php 
 
$i=1; 
$z=0; 
$suma=0; 
 
while ($i<1001) 
   // Se abre un bucle que repite las operaciones 1000 veces. 
 

 
  /* Con esta estructura se salta al principio del bucle  
     sin ejecutar las intrucciones siguientes cuando  
     el valor de $i contenga de 500 a 699.*/ 
  /*   if ($i > 499 and $i < 700) 
       {              
          $i++;       
          continue;   
       } 
  */ 
       
     // Si el resto de dividir el número entre 4 es cero...     
     if ($i % 4 == 0)   
     {   
         printf("%04d ‐",$i); 
        $z++; 
        $suma+=$i; 
     } // Aquí acaba la estructura condicional. 
 
  /* Si la suma de los múltiplos de 4 es mayor de 100.000 
     Se sale del bucle. Este código está comentado.*/ 
  /*   if ($suma>100000)  
           {break;}        
  */ 
     $i++; 
 
}   /* Aquí se cierra el bucle. Se abandona cuando  
    la variable $i valga 1.001.*/ 
 
?> 
 
<CENTER> 
<H2>Suma de estos números :  
    <?php printf("%06d",$suma); ?>  

- 136 -
Curso de Iniciación a PHP: Unidad 2
- El lenguaje de programación PHP 5 -

<P> 
 
En total hay  
    <?php echo $z; ?>  
números </CENTER></H2> 
</BODY> 

</HTML>

Utilizando Eclipse PDT puedes abrir el proyecto Ejemplo 9 (Bucle while) de la


Unidad 2. Estudia el código fuente y ejecútalo para mostrar en el navegador su
resultado.

Si lo ejecutas, verás que aparece en el navegador la siguiente ventana:

En el programa anterior no se usa la orden break para salir de bucle antes de


que se deje de cumplir la condición. Si quisiéramos abandonar el bucle cuando
la suma de los múltiplos de 4 fuera mayor que 100.000, podríamos hacerlo con
la estructura condicional siguiente:

if ($suma>100000)
{break;}

Si se quiere ver cómo funciona, basta descomentar estas dos líneas del código
anterior y actualizar la página web.

Como ocurre con las estructuras condicionales, con las estructuras de bucle
también puede utilizarse una sintaxis alternativa, que consiste en sustituir la
primera de las llaves { por dos puntos (:) y la última por la palabra endwhile;.
En este caso la sintaxis es la siguiente:

while (expresión): sentencia ... endwhile;

- 137 -
Curso de Iniciación a PHP: Unidad 2
- El lenguaje de programación PHP 5 -

Dentro de las estructuras de bucle se puede usar la orden continue para que el
flujo del programa salte al principio del bucle sin ejecutar las sentencias que
hubiera entre la orden continue y el cierre del bucle. Por ejemplo, si en el caso
anterior queremos saltar desde el número 500 hasta el 700, debemos insertar
al principio del bucle la estructura condicional siguiente:

if ($i > 499 and $i < 700)


{
$i++;
continue;
}

Si se quiere ver cómo funciona, basta descomentar estas líneas del código del
ejemplo anterior y actualizar la página web.

La estructura de bucle do ... while

Esta orden funciona prácticamente igual que la anterior, con una sola
diferencia: en la estructura while, si la expresión devuelve False la primera vez
que se evalúa, no se entra en el bucle y, por tanto, las sentencias que haya en
su interior no se ejecutan ni una vez. En cambio, en la estructura do...while la
sentencia se ejecuta al menos una vez y, luego, se sigue ejecutando mientras
sea verdadera la expresión.

En el caso de while decimos: “Si la expresión es verdadera y mientras lo siga


siendo, ejecutar las sentencias”. En cambio, en el caso de do...while indicamos:
“Haz esto y, mientras la expresión sea verdadera, sigue haciéndolo”.

Ésta es su sintaxis:

do {sentencia simple o compleja;} while (expresión)

Por lo demás, esta estructura se comporta igual que while.

La estructura de bucle for

Esta orden de bucle permite, al igual que las anteriores, repetir una o varias
instrucciones un determinado número de veces según el resultado de una
expresión.

Su sintaxis es algo más compleja que en las estructuras anteriores:

for (expresión1; expresión2; expresión3)


{sentencia simple o compleja;}

donde:

 expresión1 indica el valor inicial desde el que debe comenzar el


contador del bucle. Esta expresión sólo se evalúa la primera vez que se
ejecuta el bucle.

- 138 -
Curso de Iniciación a PHP: Unidad 2
- El lenguaje de programación PHP 5 -

 expresión2 especifica la expresión que se evalúa cada vez que se repite


el bucle. Si devuelve True, se ejecutan las instrucciones de su interior. Si
devuelve False, se abandona el bucle.
 expresión3 indica el incremento que se produce en la variable que se
utiliza como contador del bucle. Se evalúa al final de cada iteración.

El segundo parámetro (expresión2) es imprescindible, mientras que el primero


(expresión1) y el tercero (expresión3) pueden aparecer dentro del paréntesis o
no. En este último caso el primer parámetro habrá de inicializarse antes del
bucle y el tercero deberá incrementarse dentro del mismo.

Si en el ejemplo anterior hubiéramos usado la orden for, deberíamos haber


escrito:

for ($i=1;$i<1001;$i++)

En este caso, serían ya innecesarias las instrucciones $i=1; y $i++;.También


podemos mantener estas dos instrucciones donde están y escribir así el for:

for (;$i<1001;)

Por lo demás, la estructura for admite también la sintaxis alternativa

for (expr1; expr2; expr3): sentencia; ...; endfor;

así como las instrucciones break y continue en su interior.

Mira en el ejemplo siguiente una forma bastante elegante de mostrar en la


página los 20 primeros números pares.

<HTML> 
<HEAD><TITLE>Curso PHP 5 ‐ Unidad 2 ‐ Ejemplo 10</TITLE></HEAD> 
<BODY> 
 
<CENTER> 
<H2>Relación de los números pares de 0 a 20</H2> 
<P> 
<H3> 
 
<?php 
 
    for ($i = 0; $i <= 20; print " ‐ $i", $i+=2); 
 
?> 
 
</H3></CENTER> 
</BODY> 
</HTML> 

- 139 -
Curso de Iniciación a PHP: Unidad 2
- El lenguaje de programación PHP 5 -

Usando Eclipse PDT puedes abrir el proyecto Ejemplo 10 (Bucle for) de la


Unidad 2. Estudia el código fuente y ejecútalo para mostrar en el navegador su
resultado.

Si lo ejecutas, verás que aparece en el navegador la siguiente ventana:

La estructura de bucle foreach

La orden foreach, que facilita el acceso y tratamiento de los elementos de las


matrices (arrays).

Veamos su doble sintaxis y cómo se utiliza cada una a través de ejemplos.

1. foreach (expresion_array as $value) sentencia

En esta primera sintaxis se recorren todos los elementos de un array desde el


primero hasta el último y se asigna a $value el contenido de cada elemento
avanzando el puntero un elemento en cada iteración del bucle. El puntero se
coloca de forma automática en el primer elemento al comienzo del bucle.

En el ejemplo siguiente se recorren y muestran los elementos del array


$impares usando esta sintaxis.

$impares=array(1,3,5,7,9);
foreach($impares as $numimp)
print "Valor del elemento de \$impares: $numimp<P>";

Al interpretarse este código se muestra la página siguiente:

Valor del elemento de $impares: 1


Valor del elemento de $impares: 3
Valor del elemento de $impares: 5
Valor del elemento de $impares: 7
Valor del elemento de $impares: 9

2. foreach (expresion_array as $key => $value) sentencia

Esta sintaxis hace lo mismo que la anterior, pero aquí disponemos de un dato
más, que es el índice del elemento por el que se va pasando en cada vuelta del
bucle. Veamos cómo funciona en el mismo ejemplo anterior:

- 140 -
Curso de Iniciación a PHP: Unidad 2
- El lenguaje de programación PHP 5 -

$impares=array("uno"=>1,"dos"=>3,"tres"=>5,
"cuatro"=>7,"cinco"=>9);
foreach($impares as $indice=>$numimp)
print "Valor del elemento $indice de \$impares: $numimp<P>";

Al interpretarse este código se muestra la página siguiente, similar a la anterior,


en la que se muestra el nombre del índice de cada elemento:

Valor del elemento uno de $impares: 1


Valor del elemento dos de $impares: 3
Valor del elemento tres de $impares: 5
Valor del elemento cuatro de $impares: 7
Valor del elemento cinco de $impares: 9

En la Unidad 3 se estudiarán con más detalle las matrices (arrays). Si el


alumno lo necesita, puede recurrir a las explicaciones dadas en la misma.

- 141 -
Curso de Iniciación a PHP: Unidad 2
- El lenguaje de programación PHP 5 -

Proyecto PHP con múltiples archivos

Ya se habrá observado en los ejercicios que hemos realizado que el código


correspondiente a cada página web suele ser breve. Esto se consigue
llamando a funciones, usando bucles, etc. Además, PHP permite también
incorporar, cuando sea necesario, código de otros ficheros, gracias a lo cual
este código no tiene que estar en la página actual, sino que sólo es necesario
citarlo o invocarlo dentro del script correspondiente.

Es muy conveniente utilizar este procedimiento para declarar funciones, para


crear cabeceras de página, para almacenar los datos de una configuración,
etcétera, que se usan en múltiples páginas, de forma que no sea preciso
escribir este código, declarar e inicializar las variables o funciones ni definir las
constantes cada vez que se usen en una página. Basta con incluirlas o
requerirlas como veremos a continuación. Así se consigue desarrollar
proyectos completos estructurando la funcionalidad en diferentes archivos de
código fuente.

Orden include(). Permite leer el contenido de un fichero y colocar su código en


la posición donde se cita. Podemos incluir un fichero escribiendo entre comillas
directamente su nombre como parámetro de la orden. Por ejemplo, si
escribimos include("cabecera.php");, se lee el contenido de este fichero y se
trae a la posición del código donde se cita, haciendo que se ejecute como si lo
hubiéramos escrito ahí mismo.

Si tenemos que incluir varios ficheros, podemos hacerlo usando un array y un


bucle de esta forma:

$ficheros=array("cabecera.php","configura.php","colores.php");
for ($a=0;$a<count($ficheros);$a++)
{
include($ficheros[$a]);
}

Así pues, la función include() permite interpretar el código que contenga el


fichero citado como parámetro cada vez que se utiliza.

Orden require(). Es muy parecida a la anterior y sirve, igualmente, para


acceder desde un script a un fichero externo. En este caso la función es
reemplazada por el contenido del fichero al que hace referencia. Se usa
principalmente para acceder a ficheros que contienen funciones y constantes
que no van a ser modificadas, sino sólo utilizadas en la página donde de cita el
fichero.

Aunque ambas funciones importan o insertan código contenido en archivos


PHP dentro de otro archivo PHP, la diferencia entre uno y otro puede deducirse
de su nombre:

require() establece que el código del archivo invocado es “requerido”, es decir,


es obligatorio que esté disponible para el funcionamiento del programa global.

- 142 -
Curso de Iniciación a PHP: Unidad 2
- El lenguaje de programación PHP 5 -

Por esto, si el archivo especificado en esta función no existe aparecerá un error


“PHP Fatal error” y el programa PHP se detendrá.

Sin embargo, con la orden include(), si no existe el fichero, mostrará un error


del tipo “Warning” y el programa seguirá ejecutándose aunque no se incluya el
código y puede que no funcione correctamente.

Por lo tanto, es mejor utilizar require() para asegurarnos que el fichero existe y
la ejecución del programa no continua. No obstante, se puede utilizar include()
cuando el código no incluido no afecta a otras partes de la aplicación y que no
dañará al resto del programa.

Por ejemplo, si un script PHP muestra el resultado de un SQL es mejor utilizar


require(), mientras que podemos usar include() para invocar el archivo que
contiene código html, como puede ser el pie de la página web u otra parte de la
plantilla.

Existen las funciones require_once() e include_once() que funcionan de la


misma forma que sus versiones con nombre corto, salvo que, al utilizar la
versión _once, se impide la carga de un mismo archivo más de una vez.

Si incluimos varias veces sentencias del tipo require(), corremos el riesgo de


redeclaraciones de variables, funciones o clases. Parece lógico pensar que es
mejor siempre utilizar la versión _once, sin embargo, has de saber que estas
órdenes son más “pesadas” y consumen recursos del servidor, por lo que hay
que usarlas sólo cuándo sea necesario.

Veamos cómo se usa en ejemplo siguiente:

Contenido del fichero que vamos a requerir, que denominamos notas.php:

<?

define ("nota1","Insuficiente");
define ("nota2","Suficiente");
define ("nota3","Notable");
define ("nota4","Sobresaliente");

?>

Contenido del fichero donde se requiere el anterior:

<?

require ("notas.php");
print nota1."<P>";
print nota2."<P>";
print nota3."<P>";
print nota4;

?>

- 143 -
Curso de Iniciación a PHP: Unidad 2
- El lenguaje de programación PHP 5 -

Al interpretarse este código se muestra la página siguiente:

Insuficiente

Suficiente

Notable

Sobresaliente

Cuando realizamos la llamada desde una página diferente, el contenido de las


constantes que hemos creado e inicializado en notas.php pasa a formar parte
del script donde está el código de la página actual y, por tanto, toda la
información del fichero notas.php está disponible para utilizarla en ésta.

Debemos tener en cuenta que la orden require() no puede se incluirse dentro


de un bucle para acceder a múltiples ficheros, como hemos hecho con la orden
include().

Los ficheros que pueden citarse como parámetros de las funciones include() y
require() pueden ser otra página web u otros ficheros no interpretados cuyo
formato pueda ser leído por PHP, como los de tipo HTML, CSS, TXT, etcétera.

Además, al citar un fichero, es necesario tener en cuenta la lógica de la página


web (configuración de directorios y subdirectorios) donde se citan, tanto por lo
que se refiere a la carpeta donde estén archivados como al camino para
encontrarlos.

Desde Eclipse PDT puedes abrir el proyecto Ejemplo 11 (Boletín de notas)


de la Unidad 2. Estudia el código fuente y ejecútalo para mostrar en el
navegador su resultado.

Si lo ejecutas, verás que aparece en el navegador la siguiente ventana:

- 144 -
Curso de Iniciación a PHP: Unidad 2
- El lenguaje de programación PHP 5 -

Cuando estudies el código, mira cómo se han incorporado las funciones


include() y require() dentro del código de estos scripts.

- 145 -
Curso de Iniciación a PHP: Unidad 2
- El lenguaje de programación PHP 5 -

Control de excepciones en PHP

Una excepción es un evento que ocurre durante la ejecución de un programa


PHP que requiere de la ejecución controlada de un bloque de código fuera del
flujo normal del código fuente.

El control de excepciones es una herramienta muy potente a la hora de realizar


una gestión de un problema en la ejecución de un código PHP. Una excepción
puede aparecer debido a un error de ejecución o una situación no esperada
que el bloque de código no es capaz de gestionar.

Por lo tanto, un correcto manejo de excepciones puede hacer que tu


código PHP sea mucho más fiable y robusto.

A partir de la versión 5, PHP incluye un mecanismo para controlar las


excepciones con una sintaxis muy parecida al mecanismo de JAVA o C#. La
principal diferencia con estos lenguajes es que las funciones nativas de la API
de PHP no lanzan excepciones, al menos de momento.

PHP cuenta con varios tipos de excepciones predefinidas: Exception,


ErrorException y un conjunto de excepciones definidas de las diferentes
bibliotecas de PHP.

Podemos lanzar excepciones manualmente desde nuestro código PHP


mediante la orden throw:

throw new Exception('Mensaje de excepción');

El constructor de la clase Exception dispone de una serie de parámetros


opcionales como un mensaje y un código de error.

Para controlar excepciones utilizamos la estructura de control try/catch. Todo


el código PHP que pueda lanzar una excepción debe incluirse dentro del
bloque try ya que este bloque es el encargado de parar la ejecución del script
y pasar el control de ejecución al bloque catch cuando se produzca esta
excepción. Sintácticamente se puede escribe sí:

try
{
// Código que puede lanzar excepciones
}
catch (Exception $excepcion)
{
// Código para controlar la excepción
}

Hacemos notar que puede existir más de un bloque catch asociado al mismo
bloque try siempre y cuando que cada bloque catch espere capturar un tipo

- 146 -
Curso de Iniciación a PHP: Unidad 2
- El lenguaje de programación PHP 5 -

de excepción distinta. El objeto que se pasa al bloque catch es el objeto que se


ha lanzado con la orden throw.

Vamos a ver un ejemplo sencillo para entender mejor el mecanismo de control


de excepciones de PHP:

if (!isset($variable))
throw new Exception('no existe la variable $variable');
else
echo " <P><P>Si intentamos imprimir la \$variable: $variable";
} catch (Exception $e) {
echo "<BR><FONT color=red>ERROR - se ha producido el error: " .
$e->getMessage() . "</FONT>";
}

echo '<P><P>El bloque try/catch no finaliza la ejecución total del


script.';

En este ejemplo se verifica si existe una variable y si no existe, lanzamos una


excepción de la clase Exception informando un texto de error. Una vez lanzada
la excepción, el bloque catch la captura y la procesa mostrando al usuario el
mensaje que hemos utilizado en el constructor del objeto Exception. Para esto
utilizamos su método getMessage().

Desde Eclipse PDT puedes abrir el proyecto Ejemplo 12 (Excepciones) de la


Unidad 2. Estudia el código fuente y ejecútalo para mostrar en el navegador su
resultado.

Si lo ejecutas, verás que aparece en el navegador la siguiente ventana:

- 147 -
Curso de Iniciación a PHP: Unidad 2
- El lenguaje de programación PHP 5 -

La clase Exception dispone de un conjunto de métodos que almacenan


información sobre la excepción ocurrida:

 getCode(): devuelve el código de excepción que se haya pasado al


constructor. Si no pasamos ninguno, el código por defecto es 0.
 getMessage(): indica el mensaje que se haya usado en el constructor, tal
y como hemos utilizado en el ejemplo anterior.
 getFile(): retorna la ruta completa al archivo PHP que haya lanzado la
excepción.
 getLine(): devuelve el número de la línea del archivo PHP en el que se
ha producido la excepción.
 getTrace(): devuelve una matriz con la traza completa que indica dónde
se ha producido la excepción.
 getTraceAsString(): da la misma información que el anterior método
pero en formato de cadena.

Es importante tener en cuenta que realmente no deberíamos mostrar esta


información al usuario en un entorno real en Internet debido que muestra
información sensible de la aplicación como el control de errores y los hackers
pueden encontrar debilidades en la implementación de nuestro código y
explotarlas. Una solución efectiva es mostrar siempre una página de error muy
básica que informe algo del error ocurrido y darle la opción de volver al inicio o
a la página anterior.

- 148 -
Curso de Iniciación a PHP: Unidad 2
- El lenguaje de programación PHP 5 -

Resumen

Hay que saber al final de esta unidad

 Identificar qué ámbito tienen las variables y


hacer que tengan ámbito local, global o estático
según nos convenga para el desarrollo de la
página web utilizando correctamente las órdenes
global, static y la matriz $_GLOBALS().

 Utilizar variables de variables.

 Reconocer si una variable ha sido definida e


inicializada y acceder a su contenido mediante
las funciones empty() e isset().

 Obtener información sobre el tipo de una variable


con las funciones is_xxx() correspondientes y con
la función gettype().

 Eliminar una variable de la memoria con la


función unset() y asignarle un tipo determinado
con la función settype().

 Separar el contenido numérico del contenido


alfanumérico de una variable con las funciones
doubleval(), intval() y strval().

 Declarar e inicializar constantes con la función


define() e identificar si están definidas con la
función defined().

 Preguntar datos al usuario de una página web


mediante formularios.

 Pasar datos entre diferentes scripts usando un


formulario o un enlace.

 Conservar los espacios de un texto insertado en


el código PHP cuando se devuelve en código HTML
con la función urlencode().

- 149 -
Curso de Iniciación a PHP: Unidad 2
- El lenguaje de programación PHP 5 -

 Aplicar correctamente dentro del código PHP las


estructuras de bifurcación condicional if...
elseif...else y switch...case...default.

 Anidar estructuras condicionales dentro de otras.

 Aplicar correctamente dentro del código PHP las


estructuras de bucle while, do...while, for y
foreach.

 Acceder a ficheros externos desde la página web


actual sirviéndose de las funciones include() y
require().

 Usar y controlar Excepciones en el código PHP


usando la estructura try/catch.

- 150 -
MÓDULO 2

UNIDADES DIDÁCTICAS:

3. Más funciones del lenguaje PHP

4. Operaciones con ficheros y directorios

5. Control de usuarios y gestión de sesiones


 
MÓDULO 2

Más funciones del lenguaje PHP

Unidad 3

Índice de la unidad:

1. Tratamiento de cadenas de caracteres

2. Tratamiento de fechas

3. Tratamiento de matriculas

4. Funciones creadas por el usuario

5. La programación orientada a objetos (POO)

6. Resumen
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

Introducción
En esta Unidad vamos a conocer y saber aplicar correctamente las
principales funciones para tratar cadenas de caracteres.

Practicaremos con las principales funciones para tratar y formatear fechas.

También, aprenderemos a crear e inicializar matriz aplicándolas con


eficiencia a las diferentes situaciones que lo requieran.

Además, estudiaremos en profundidad cómo definir y utilizar Objetos.

Finalmente, veremos cómo definir funciones de usuario.

Tratamiento de cadenas de caracteres


En las dos Unidades anteriores hemos usado frecuentemente cadenas de
caracteres. Hasta el momento sólo hemos escrito los textos entre comillas sin
darle mayor importancia y los hemos mostrado en las páginas web tal como los
habíamos escrito en el código.

En este apartado de la Unidad 3 vamos a abordar con mayor detalle las


diferentes operaciones que se pueden llevar a cabo con este tipo de datos
estudiando las principales funciones que permiten hacerlo.

En la Unidad 1 ya estudiamos las funciones echo, print y printf, por lo cual en


ésta no vamos a repetir las explicaciones dadas.

En el Manual de PHP aparecen más de 80 funciones de cadena de caracteres.


En este apartado nos vamos a limitar a explicar brevemente las más frecuentes
y necesarias. Nuestro objetivo es que el alumno aprenda a utilizar algunas para
familiarizarse con ellas y poder, luego, utilizar correctamente las que necesite
obteniendo información en el Manual.

Adaptar las cadenas al contexto

Al mezclarse el código HTML y PHP es preciso ocasionalmente que el


intérprete sepa distinguir los signos propios de cada lenguaje que puedan
aparecer en el interior de una cadena. Las funciones que permiten adaptar el
contenido de una cadena al contexto de cada código son las siguientes:

La función addSlashes() devuelve una cadena con barras invertidas delante de


los caracteres que necesitan marcarse en consultas de bases de datos y en
otras operaciones en las que intervienen esos caracteres. Nos estamos
refiriendo a la comilla simple ('), a la comilla doble ("), a la barra invertida (\) y
a NUL (byte nulo).

- 155 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

La forma de proteger estos caracteres, para que no sean interpretados por el


Shell o por PHP como caracteres significativos, es poner una barra invertida
(Slash) delante de los mismos.

Por ejemplo, si a la variable $consulta le asignamos el valor "WHERE nom =


‘Ana’", las comillas simples interiores serán interpretadas como caracteres
significativos, pero necesitamos que sean interpretados como comillas. Así
pues, con la función addSlashes() lo conseguimos de esta forma:

// Así la variable $consulta contendrá WHERE nom = ‘Ana’


$consulta="WHERE nom = 'Ana'";

// Así la variable $consulta contendrá WHERE nom = \‘Ana\’


$consulta=addSlashes($consulta);

La función stripSlashes() devuelve una cadena sin barras invertidas delante


de la comilla simple ('), la comilla doble ("), la barra invertida (\) y el valor
NULL. Esta función, pues, realiza la función inversa de la función anterior.

Siguiendo con el ejemplo anterior podemos usarla de esta forma:

// Así la variable $consulta contendrá WHERE nom = 'Ana'


$consulta="WHERE nom = 'Ana'";

// Así la variable $consulta contendrá WHERE nom = \'Ana\'


$consulta=addSlashes($consulta);

// Así la variable $consulta contendrá WHERE nom = 'Ana'


$consulta=stripSlashes($consulta);

En la Unidad 2, dentro del apartado Lectura de datos desde una página web,
ya nos hemos referido a la función urlencode(), que preserva los espacios de
un texto para que HTML los respete como tales. Veamos ahora con mayor
detalle esta función y su contraria.

La función urlencode()devuelve una cadena en la que todos los caracteres no


alfanuméricos, excepto -, _, y., son reemplazados por un signo de porcentaje
(%) seguido por dos dígitos hexadecimales. Los espacios son sustituidos por
signos positivos (+). Es conveniente usar esta función para escribir una cadena
de texto que va a ser usada dentro del código HTML que forma parte de una
URL (dirección web). También es una forma adecuada de pasar variables a la
página siguiente. Lo más frecuente es que la usemos para que HTML respete
los espacios en blanco que haya dentro del texto.

Veamos en un ejemplo cómo se producen las conversiones:

$b='<A HREF = _ - "Poñw?.jura 1 ) # & //';


echo $b."<P>";
/* Aquí se muestra la misma cadena que hemos
escrito entre comillas simples. */
echo urlencode($b);

- 156 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

/* Aquí se muestra la cadena %3CA+HREF+%3D+_+-


++%22Po%F1w%3F.jura+1+%29+%23+%26+%2F%2F */

Conviene observar que los espacios se representan con el signo +, las letras,
excepto la ñ, y los números se dejan igual, y los demás signos, como <, =, ),
etcétera, son sustituidos por el signo % seguido de dos dígitos en base
hexadecimal.

La función urldecode()realiza la operación inversa de la anterior. Por ejemplo,


si escribimos las instrucciones

$c='SELECT+ALL+FROM+tabla+WHERE+nombre%3D%22JUANA%22';

$d=urldecode($c);

echo $d."<P>";

la página muestra la cadena original

SELECT ALL FROM tabla WHERE nombre="JUANA"

Las funciones rawurlencode() y rawurldecode() (código puro para URL) se


comportan prácticamente igual que las dos anteriores, con la diferencia de que
éstas no convierten en código HTML las letras, los números y el carácter de
subrayado (_), pero sí codifican en el mismo los signos -, y. Usando las
primeras se consiguen efectos más amplios, por lo que recomendamos su uso
preferente.

La función nl2br() se utiliza también para dar formato a las salidas en HTML.
Esta función transforma los códigos de salto de línea de los ficheros de texto en
códigos de salto de línea propios de HTML conservando los anteriores. Se
utiliza principalmente para organizar el texto introducido en TEXTAREA de un
formulario. Cambia, pues, la orden \n (salto de línea en un fichero de texto) en
<br> (salto de línea en código HTML) produciendo un salto de línea real, tanto
en el código HTML devuelto al interpretarse el código PHP como en la página
web que se muestra.

Por ejemplo, si escribimos las siguientes instrucciones

$frase="Primero \n Segundo \n Tercero";


echo "<br> \n";
echo "Sin aplicar saldo de línea HTML: \"$frase\"";
echo "<br> \n";
$frase=nl2br($frase);
echo "Aplicando salto de línea HTML: \"$frase\"";

se devuelve al siguiente código HTML

<HTML>
<HEAD></HEAD>
<BODY>
<br>

- 157 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

Sin aplicar salto de línea HTML: "Primero

Segundo

Tercero"<br>

Aplicando salto de línea HTML: "Primero <br>

Segundo <br>

Tercero"

</BODY>
</HTML>

y se genera la siguiente página:

Sin aplicar saldo de línea HTML: "Primero Segundo Tercero"


Aplicando salto de línea HTML: "Primero
Segundo
Tercero"

Se puede observar que los saltos de línea del fichero de texto \n mediante la
función nl2br() han sido sustituidos en el código HTML por saltos de línea
<br>.

Limpiar cadenas de caracteres

La función chop() elimina los espacios en blanco que haya al final de una
cadena de caracteres, incluyendo los códigos de fin de línea si los hubiere.

Por ejemplo, las instrucciones

$f="La ciencia es un conjunto de verdades \n ";


$g=chop($f);
echo "La variable \$f contiene ".strlen($f)."
caracteres de los que ".(strlen($f)-strlen($g)).
"son espacios en blanco o saltos de línea.<P>";
echo "En cambio, si usamos la función chop()
la variable \$f contiene sólo ".strlen($g).
"caracteres.<P>";

generan la página siguiente:

La variable $f contiene 44 caracteres de los que 7 son espacios en


blanco o saltos de línea.

En cambio, si usamos la función chop() la variable $f contiene sólo 37


caracteres.

Algo más abajo se verá que la función strlen() devuelve el número de


caracteres que tiene una cadena.

- 158 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

La función ltrim() elimina los espacios en blanco que haya al principio de una
cadena de caracteres.

Por ejemplo, las instrucciones

$h=" La ciencia es un conjunto de verdades";

$i=ltrim($i);

echo "La variable \$h contiene ".strlen($h)." caracteres


de los que ".(strlen($h)-strlen($i))."son espacios
en blanco.<P>";

echo "En cambio, si usamos la función ltrim() la variable


\$i contiene sólo ".strlen($i)." caracteres.<P>
Ha perdido los espacios en blanco iniciales.<P>";

generan la página siguiente:

La variable $h contiene 42 caracteres de los que 5 son espacios en


blanco.

En cambio, si usamos la función ltrim() la variable $h contiene sólo


37 caracteres.

Ha perdido los espacios en blanco iniciales.

La función trim() es una combinación de las dos anteriores: elimina los


espacios en blanco que haya al principio y al final de una cadena.

Por ejemplo, si $limpia contiene " casa ", la instrucción echo trim($limpia)
devuelve "casa".

La función strip_tags() elimina los controles HTML de una cadena. Por


ejemplo, las instrucciones siguientes:

$quita_html="<H1>Texto grande</H1> <B>Negrita</B><P>";


echo $quita_html."<P>";
echo strip_tags($quita_html);

generan esta página

Texto grande
Negrita  

Texto grande Negrita

Puede observarse que en el primer echo se ejecutan los códigos HTML. En


cambio, en el segundo, al eliminarse estos controles con strip_tags(), se
muestra el texto sin ellos.

- 159 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

Letras mayúsculas y letras minúsculas

Algunas funciones permiten convertir todos o sólo algunos caracteres de una


cadena en mayúsculas o minúsculas según nos convenga. Son muy fáciles de
usar. Resumimos las más importantes.

Función strtoupper(): devuelve la misma cadena convirtiendo todos sus


caracteres en mayúsculas.

Ejemplo: si $a contiene "Pepe", echo strtoupper($a); devuelve "PEPE".

Función strtolower(): devuelve la misma cadena convirtiendo todos sus


caracteres en minúsculas.

Ejemplo: si $M contiene "PEPe", echo strtolower($M); devuelve "pepe".

Función ucfirst(): devuelve la misma cadena convirtiendo su primer carácter


en mayúscula si es una letra.

Ejemplo: si $M1 contiene "diosa", echo ucfirst($M1); devuelve "Diosa".

Para que esta función tenga en cuenta el alfabeto completo español en


mayúsculas, sobre todo si las letras tienen tilde, como "Águila", hay que
establecer su configuración previamente con la función setlocale
(LC_ALL,"spanish");. Estos valores son los formatos de hora, moneda,
alfabeto, separador de decimales, etcétera.

Función ucwords(): devuelve la misma cadena convirtiendo el primer carácter


de todas las palabras en mayúscula.

Ejemplo: si $M_pal contiene "diosa de la antigüedad egipcia", la instrucción echo


ucwords($M_pal); devuelve "Diosa De La Antigüedad Egipcia".

Conocer la longitud de una cadena

Función strlen(): devuelve la longitud de una cadena expresada en valor


numérico entero. Cuenta todas las posiciones, aunque sean espacios en
blanco. Ya hemos visto cómo se usa en las funciones chop(), ltrim() y
trim().

Ejemplo: si $largo contiene "diosa de la antigüedad egipcia", la instrucción echo


strlen($largo); devuelve el valor numérico 30.

Repetir una cadena

Función str_repeat(): devuelve la misma cadena que toma como primer


argumento repetida tantas veces como se indique en el segundo argumento.

- 160 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

Ejemplo: si $repe contiene "diosa<P>", echo str_repeat($repe,3); devuelve la


cadena "diosa" repetida tres veces en distintas líneas.

Modificar algunos caracteres de una cadena

Función strtr(): devuelve la misma cadena sustituyendo los caracteres de la


misma que se indiquen en el segundo argumento por los que se indiquen en el
tercer argumento haciéndolos equivaler uno a uno.

Ejemplo: si $cambia contiene "Los días perdidos en verano" y necesitamos


sustituir las as por us y las os por as, podemos escribir la sentencia siguiente:
echo strtr($cambia,"ao","ua"); La función devolverá la cadena "Las díus
perdidas en veruna".

También existe la función str_replace() que reemplaza todas las apariciones


del string buscado con el string de reemplazo.

Ejemplo: si $frase contiene " Deberías comer pizza, refrescos, y helado todos
los días." y necesitamos sustituir la comida no saludable por saludable,
podemos escribir las sentencias siguientes:

$frase = "Deberías comer pizza, refrescos, y helado todos los días.";


$saludable = array("fruta", "vegetales", "fibra");
$no_saludable = array("pizza", "refrescos", "helado");

$nueva_frase = str_replace($no_saludable, $saludable, $frase);

La función devolverá la cadena " Deberías comer fruta, vegetales, y fibra todos
los días.".

Esta función tiene los siguientes parámetros str_replace (mixed $search,


mixed $replace, mixed $subject [, int &$count ] ), donde:

 search: cadena buscada, también conocida como la aguja (por el dicho


del pajar). Se trata de una matriz donde podemos incluir varias cadenas.
 replace: cadena de reemplazo que sustituye los valores encontrados de
search. Igualmente, podemos definir una matriz para reemplazar con
cadenas diferentes.
 subject: cadena o matriz sobre la que se busca y se sustituye, también
conocido como el pajar. Si subject es una matriz, entonces la búsqueda
y reemplazo se realiza con cada elemento de esta matriz subject y el
valor devuelto también es otra matriz.
 count: parámetro opcional que establece el número de reemplazos que
se realizarán.

Esta función es utiliza mucho en la programación de PHP, por lo que


recomendamos al alumno o alumna que analice en detalle el ejemplo
anterior.

- 161 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

Buscar dentro de las cadenas

Hay funciones que permiten buscar dentro de una cadena. No se usan con
frecuencia, por lo cual quien lo necesite puede obtener información en el
Manual sobre las mismas. Nos limitamos a enumerar las principales y a indicar
para qué sirven:

 strcspn(): devuelve el número del primer carácter de la primera cadena


(primer argumento) que encuentre en la segunda cadena (segundo
argumento). Se cuenta desde 0 en adelante.
 strspn(): devuelve el número de caracteres iniciales de la cadena
pasada como primer argumento que aparecen en la cadena pasada
como segundo argumento comparando de ésta sólo los caracteres que
coincidan consecutivamente.
 strpos(): devuelve el número de la posición del primer carácter de la
primera cadena (primer argumento) que coincida con la segunda cadena
completa (segundo argumento). Se cuenta desde 0 en adelante. Admite
un tercer argumento, que es el número a partir del cual debe buscarse el
texto de la segunda cadena en la primera.
 strrpos(): devuelve el número de la posición del último carácter de la
primera cadena (primer argumento) que coincida con la segunda cadena
completa (segundo argumento). Se cuenta desde 0 en adelante. A partir
de PHP 5 admite un tercer argumento, que es el número (siempre
negativo) a partir del cual debe buscarse el texto de la segunda cadena
en la primera.
 strrchr(): devuelve la subcadena que comprende el fragmento de la
primera cadena (primer argumento) que va desde la última aparición del
carácter pasado como segundo argumento hasta el final de la primera
cadena.
 strstr(): devuelve una subcadena de la cadena pasada como primer
argumento que comprende desde la primera aparición de la cadena
pasada como segundo argumento hasta el final de la primera cadena.

Operaciones con subcadenas

La función substr() devuelve una subcadena de la cadena que se pasa como


primer argumento. Esta subcadena contiene los caracteres de la cadena desde
la posición que se indica en el segundo argumento, que debe ser un número
entero, hasta el número que se indique en el tercer argumento.

Por ejemplo, echo substr("Memorias de África",3,4) devuelve la subcadena


"oria". Conviene observar que la cuenta empieza desde 0.

La sintaxis de esta función puede ser variada:

 Sin tercer argumento: se devuelve desde la posición inicial hasta el final.

- 162 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

 Con un segundo argumento negativo: se devuelve desde el final de la


cadena tantos caracteres como se indique en ese número negativo.
 Con un segundo argumento negativo y un tercero positivo: se devuelven
tantos caracteres como se indique en el tercer argumento desde la
posición del final de la cadena que se indique en el segundo argumento.

La función substr_replace() sustituye una subcadena de la cadena que se


pasa como primer argumento con la subcadena que se pasa como segundo
argumento desde la posición de inicio que se pasa como tercer argumento
tantos caracteres como se indique en el cuarto argumento. Propia de PHP 5.

Por ejemplo,

echo substr_replace("Memorias de África","en",8,2) devuelve la cadena


como "Memorias en África".

En la sintaxis de esta función también pueden darse varias circunstancias:

 Con un tercer argumento negativo: se cambian los caracteres contando


desde el final de la cadena.
 Con cuarto argumento negativo: la nueva cadena estará formada por el
texto del segundo argumento desde la posición del tercer argumento
más los caracteres especificados en el cuarto argumento contado desde
el final de la cadena.
 Sin cuarto argumento: la nueva cadena estará formada por el texto del
segundo argumento desde la posición del tercer argumento más los
caracteres previos a la posición del tercer argumento.

La función strtok() separa una cadena de texto (primer argumento) en


bloques según el separador indicado en el segundo argumento.

La función parse_str() trata una cadena de caracteres como si su información


se pasase a otra página mediante la URL. Conviene observar que esa cadena
debe tener el formato adecuado. Por ejemplo, las sentencias:

$variables="nom=Nacho&ape1=Roa&ape2=Bastos",

parse_str($variables);

define las variables $nom, $ape1 y $ape2, y les asigna los valores "Nacho", "Roa"
y "Bastos", respectivamente. Así puede pasarlas a otra página.

Invertir el texto de una cadena

La función strrev() recibe una cadena de caracteres y la devuelve al revés.

Por ejemplo, la sentencia echo strrev("paseo"); devuelve "oesap".

Comparar cadenas

- 163 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

La función strcasecmp() compara dos cadenas pasadas como argumentos sin


distinguir entre letras mayúsculas y minúsculas y devuelve un número entero,
que es un cero si son iguales, un número mayor que cero si la primera es
mayor que la segunda y un número menor que cero si la primera es menor que
la segunda.

Por ejemplo, la instrucción strcasecmp("ABC","abc") devuelve 0, la instrucción


strcasecmp("CAB","abc") devuelve 2 y la instrucción strcasecmp("ABC","cab")
devuelve -2.

Al estudiar los operadores de comparación en la Unidad 1 se explicó cómo se


comparan los datos de tipo cadena.

La función strcmp() compara dos cadenas pasadas como argumentos


distinguiendo entre letras mayúsculas y minúsculas y devuelve los mismos
valores que la función anterior con la salvedad indicada. En el mismo ejemplo
anterior, las tres instrucciones siempre devolverían 2.

Otras funciones de cadena útiles

La función chr()recibe un número entero y devuelve el carácter


correspondiente del código ASCII.

Por ejemplo, echo chr(65); devuelve la letra A mayúscula.

La función ord()recibe un carácter del código ASCII y devuelve el número


entero correspondiente.

Por ejemplo, echo ord("A"); devuelve el número 65.

La función number_format() permite formatear un número como nos convenga.


Recibe un número de coma flotante como primer argumento y devuelve una
cadena con un determinado número de decimales fijado en el segundo
argumento, separado de la parte entera por un signo especificado en el
argumento tercero y un separador de los miles que se fija en el argumento
cuarto.

Por ejemplo, si la variable $numero contiene el valor 1234.5678 (el punto es el


separador decimal), la instrucción echo number_format($numero,3,",",".");
devuelve la cadena 1.234,567.

Es importante saber cómo están definidos los valores de configuración local de


PHP para los puntos decimales. En la función siguiente se explica este asunto.

La función setlocale() establece los valores de distintas categorías que


pueden ser diferentes para distintas configuraciones locales, como la
conversión y clasificación de caracteres en los diversos idiomas, los
separadores de decimales, el formato de fecha y hora, así como la
comparación de cadenas y de monedas.

- 164 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

Por ejemplo, la instrucción setlocale(LC_ALL,"spanish") fija todas las


categorías disponibles (LC_ALL: conversión y clasificación de caracteres en los
diferentes idiomas, separadores de decimales y formato de fecha y hora) para
el entorno español, que en la mayoría de las categorías es igual al europeo.

La función str_split()convierte una cadena en una matriz. Como segundo


argumento en esta función podemos indicar el número de caracteres que
queremos usar.

Por ejemplo, $matriz= str_split("esto es así", 3); devuelve la matriz:


$matriz= Array ( 0 => "est", 1 => "o e", 2 => "s a", 3 => "sí" ).

La función strpbrk() busca en una cadena cualquier carácter de otra y


devuelve la subcadena desde la posición.

Por ejemplo, echo strpbrk("Esto es una prueba", 'po'); devuelve el


resultado:
"o es una prueba" porque primero encuentra el carácter "o" antes que "p".

Utilizando Eclipse PDT puedes abrir el proyecto Ejemplo 1 (Tratamiento


de cadenas) de la Unidad 3. Estudia el código fuente y ejecútalo para
mostrar en el navegador su resultado.

En este programa se incluye la mayoría de los ejemplos cuyo código hemos ido
escribiendo junto a las funciones explicadas y otros nuevos que no aparecen
en el texto anterior. Es importante que lo estudies en detalle.

- 165 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

Tratamiento de fechas

El uso de fechas es muy frecuente e imprescindible en Internet. PHP dispone


también de funciones para tratar y obtener fechas. En este segundo apartado
vamos a estudiar las más importantes y necesarias, así como su aplicación en
las páginas web.

Comprobar la validez de una fecha

La función checkdate() nos permite comprobar si una fecha, que se pone


como argumento, es válida. Si lo es, la función devuelve el valor True
(verdadero). En el caso contrario, devuelve False (falso).

Se considera como válida una fecha cuando su año está comprendido entre los
años 0 y el 32767, su mes entre 1 y 12, y su día entre 1 y 28 para febrero no
bisiesto, 29 para febrero bisiesto, 30 para abril, junio, septiembre y noviembre,
y 31 para el resto de los meses. Así pues, esta función controla los años
bisiestos al comprobar la validez de una fecha.

La sintaxis de esta función es checkdate(mes,día,año); donde los tres


parámetros son números enteros. Conviene observar el orden en que deben
introducirse los parámetros, ya que no coinciden con la posición habitual de
nuestras fechas (día,mes,año)

Por ejemplo, la instrucción checkdate(0,25,2000); devuelve False. En cambio


la instrucción checkdate(7,25,2000); devuelve True.

Dar formato a una fecha y una hora

La función date() devuelve una cadena de texto que refleja una fecha y una
hora formateadas como se indique en el primer parámetro. En el segundo
argumento puede indicarse la fecha que se quiere mostrar utilizando un valor
de tipo timestamp (instante calculado como número de segundos transcurridos
desde el 1/1/1970, época UNIX). Si no se especifica este segundo parámetro,
se muestra la hora actual.

La sintaxis de esta función es:

date(cadena de formato, número entero del instante o nada);

Tabla de caracteres y su significado en la cadena de formato

Signo Descripción de su resultado en la página web


a "am" o "pm"
A "AM" o "PM"
día del mes, dos dígitos con cero a la izquierda; es decir, de "01" a
d
"31"

- 166 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

D día de la semana, en texto, con tres letras; por ejemplo, "Fri"


F mes, en texto, completo; por ejemplo, "January"
h hora, de "01" a "12"
H hora, de "00" a "23"
g hour, sin ceros, de "1" a "12"
G hour, sin ceros; de "0" a "23"
i minutos; de "00" a "59"
j día del mes sin cero inicial; de "1" a "31"
l día de la semana, en texto, completo; por ejemplo, "Friday"
L "1" or "0", según si el año es bisiesto o no
m mes; de "01" a "12"
n mes sin cero inicial; de "1" a "12"
M mes, en texto, 3 letras; por ejemplo, "Jan"
s segundos; de "00" a "59"
sufijo ordinal en inglés, en texto, 2 caracteres; por ejemplo, "th",
S
"nd"
t número de días del mes dado; de "28" a "31"
U segundos desde el valor de 'epoch'
w día de la semana, en número, de "0" (domingo) a "6" (sábado)
Y año, cuatro cifras; por ejemplo, "1999"
y año, dos cifras; por ejemplo, "99"
z día del año; de "0" a "365"
Z diferencia horaria en segundos (de "-43200" a "43200")

Conviene observar que esta cadena no utiliza categorías locales, por lo cual los
nombres de los días y los meses aparecen en inglés. Para formatear una fecha
y mostrar su resultado, es mejor utilizar la función strftime(), que se explica
después.

Extraer información de una fecha

La función getdate() se usa para extraer información de una fecha dada.


Tampoco admite categorías locales y, por tanto, la información literal está en
inglés.

La sintaxis de esta función es:

getdate(número entero del instante);

El instante es un número referido a los segundos transcurridos desde el día


1/1/1970 hasta la fecha. La información obtenida se almacena en un array
cuyos índices son los siguientes:

1. “seconds”: número de segundos

2. “minutes”: número de minutos

- 167 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

3. “hours”: número de horas

4. “mday”: día del mes

5. “mon”: número de mes

6. “year”: año

7. “yday”: día del año

8. “weekday”: nombre del día de la semana

9. “month”: nombre del mes.

Por ejemplo, la instrucción $fecha=getdate(); asigna al array $fecha los nueve


contenidos indicados antes.

La función mktime() se usa para extraer el valor timestamp de una fecha.


Después, podemos utilizar este valor como argumento de otros funciones. El
término timestamp se refiere al momento exacto de una fecha concreta
expresado en segundos desde el día 1 de enero de 1970 (época UNIX). Esta
función nos permite hallar el número de segundos que han transcurrido desde
entonces hasta la fecha que especifiquemos.

La sintaxis de esta función es

mktime(horas,minutos,segundos,mes,día,año);

Por ejemplo, si queremos saber el momento timestamp del día 16 de diciembre


de 1999, a las 10 horas, 15 minutos y 20 segundos, debemos escribir la
instrucción $momento=mktime(10,15,20,12,16,1999);. El resultado es
945339320.

Ahora podemos dar este número como argumento de la función getdate() y


obtenemos la misma fecha que le dimos a mktime(). Esta función es, además,
muy útil para comprobar fechas y compararlas.

Dar formato a una fecha traduciendo los nombres

La función strftime() se usa para formatear una fecha teniendo en cuenta las
especificaciones y categorías locales. Así soslayamos los problemas de este
tipo que plantean las funciones date() y getdate().

La sintaxis de esta función es

strftime(cadena de formato,instante);

Si no se proporciona el segundo parámetro, que es el número de segundos, se


toma la hora del sistema. Veamos ahora los signos de la cadena de formato y
sus resultados en la presentación de una fecha.

- 168 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

Tabla de caracteres y su significado en la cadena de formato

Signo Descripción de su resultado en la página web


%a nombre del día de la semana abreviado
%A nombre del día de la semana completo
%b nombre del mes abreviado
%B nombre del mes completo
%c representación de fecha y hora preferidas en el idioma actual
%d día del mes en número (de 00 a 31)
%H hora como un número de 00 a 23
%I hora como un número de 01 a 12
%j día del año como un número de 001 a 366
%m mes como un número de 01 a 12
%M minuto en número
‘am’ o ‘pm’, según la hora dada, o las cadenas correspondientes en
%p
el idioma actual
%S segundos en número
número de la semana en el año, empezando con el primer domingo
%U
como el primer día de la primera semana
número de la semana en el año, empezando con el primer lunes
%W
como el primer día de la primera semana
%w día de la semana en número (el domingo es el 0)
%x representación preferida de la fecha sin la hora
%X representación preferida de la hora sin la fecha
%y año en número de 00 a 99
%Y año en número de cuatro cifras
%Z nombre o abreviatura de la zona horaria
%% carácter '%'

Si queremos que los nombres aparezcan en castellano, aquí sí podemos incluir


en el script la instrucción setlocale(LC_ALL,"spanish"); para traducirlos.

Más funciones de fecha

La función idate() se usa para obtener el número entero de una fecha según el
formato escrito en el primer parámetro.

Por ejemplo, si queremos saber el momento el número del año actual,


debemos escribir la instrucción echo idate('y');. El resultado es 5.

La función date_sunset() y date_sunrise() se usa para obtener la hora de la


puesta de sol y amanecer respectivamente para un día y ubicación
determinados.

- 169 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

Leer una fecha desde una página web

Ésta es una de las operaciones más frecuentes en Internet. La mejor forma de


leer una fecha desde una página web es utilizar un formulario. A partir de esa
información con la función time() obtenemos una fecha, comprobamos si es
correcta y le damos el formato que sea necesario con la función strftime(). Si
los nombre de los días o de los meses aparecen en inglés, ya sabemos que
con la instrucción que hemos citado antes
setlocale(LC_ALL,identificador_local); podemos hacer que se muestre en
el idioma que queramos.

Mediante Eclipse PDT puedes abrir el proyecto Ejemplo 2 (Tratamiento


de fechas) de la Unidad 3. Estudia el código fuente y ejecútalo para mostrar
en el navegador su resultado.

En este programa se incluye la mayoría de los ejemplos cuyo código hemos ido
escribiendo junto a las funciones explicadas y otros nuevos que no aparecen
en el texto anterior. Te invitamos a que lo estudies en profundidad.

- 170 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

Tratamiento de matrices

Una matriz es una tabla cuadrada o rectangular de datos (llamados elementos


o entradas de la matriz) ordenados en filas y columnas, donde una fila es cada
una de las líneas horizontales de la matriz y una columna es cada una de las
líneas verticales de la matriz.

Hemos visto que una variable tiene un nombre que debe iniciarse por el signo
dólar ($) y un valor de uno de los tipos que soporta PHP. Pero en una variable
sólo podemos introducir un valor. ¿Hay alguna forma de asignar más de un
valor a un identificador? Sí, pero hay que usar matrices (arrays), que son
conjuntos de datos de diferentes tipos que se asignan a un solo nombre.

Un array o matriz se caracteriza por tres cosas:

• Está integrado por múltiples elementos (elements).

• Tiene un índice (key o index) para referirse a cada uno de sus elementos.
Este índice, también llamado subíndice, puede ser de tipo numérico entero o de
tipo cadena. En PHP el índice del primer elemento tiene el valor 0, si es de tipo
numérico entero.

• Cada elemento tiene un contenido (value), que puede ser de diferente tipo
que el resto de los elementos.

Suponemos que el alumno o alumna que hace este curso ya está familiarizado
con las matrices, por lo cual damos por explicados los principales conceptos
sobre los arrays. Aquí nos vamos a limitar a resumir brevemente las principales
funciones con las que PHP trata este tipo de datos.

Crear e inicializar una matriz

En PHP, como en la mayoría de los lenguajes informáticos, hay varias formas


de crear un matriz y de asignar valores a cada uno de sus elementos. En la
Unidad 1, al explicar este tipo de datos, ya pusimos varios ejemplos:

$persona["nombre"] = "Josefa";
$persona["apellido1"] = "Pérez";
$persona["apellido2"] = "Rubio";
$persona["edad"] = 60;

En las cuatro instrucciones anteriores hemos creado la matriz $persona, que


tiene cuatro elementos que se referencian por cuatro índices de tipo cadena.
Pero también podíamos haber creado e inicializado esta matriz así:

$persona[] = "Josefa";
$persona[] = "Pérez";
$persona[] = "Rubio";
$persona[] = 60;

- 171 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

En este segundo caso, PHP asigna los índice 0, 1, 2 y 3 a cada elemento


secuencialmente. Lo mismo hubiéramos conseguido con la sintaxis

$persona[0] = "Josefa";
$persona[1] = "Pérez";
$persona[2] = "Rubio";
$persona[3] = 60;

aunque habría resultado más largo e innecesario. No es preciso asignar índices


que sean valores numéricos enteros consecutivos, si bien es preciso conocer el
número o el nombre de los índices para poder, después, referirse a los
elementos correspondientes.

Otra forma de crear la misma matriz con índices de cadena es la siguiente:

$persona = array("nombre"=> "Josefa","apellido1"=> "Pérez",


"apellido2"=> "Rubio","edad"=>60);

Como puede verse, esta sintaxis utiliza la palabra reservada array, pone entre
comillas los índices de cadena y usa el signo => para asignar el valor a los
elementos.

Para crear una matriz bidimensional con las calificaciones obtenidas por una
alumna en las tres evaluaciones de Matemáticas, Lengua y Dibujo usando
índices alfanuméricos, podemos escribir lo siguiente:

$notas["Mat"]["Pri"] = "Suficiente";
$notas["Mat"]["Seg"] = "Bien";
$notas["Mat"]["Ter"] = "Notable";
$notas["Len"]["Pri"] = "Sobresaliente";
$notas["Len"]["Seg"] = "Sobresaliente2;
$notas["Len"]["Ter"] = "Notable";
$notas["Dib"]["Pri"] = "Notable";
$notas["Dib"]["Seg"] = "Bien";
$notas["Dib"]["Ter"] = "Suficiente";

Con la misma filosofía de índices, podíamos haberlo hecho de la forma


siguiente:

$notas = array("Mat"=>array("Pri"=>"Suficiente",
"Seg"=>"Bien",
"Ter"=>"Notable"),
"Len"=>array("Pri"=>"Sobresaliente",
"Seg"=>"Sobresaliente",
"Ter"=>"Notable"),
"Dib"=>array("Pri"=>"Notable",
"Seg"=>"Bien",
"Ter"=>"Suficiente"));

Igualmente, podíamos haber puesto las calificaciones en número y usado


índices numéricos para las evaluaciones y las asignaturas, de 0 a 2 para
ambas. En este caso la matriz $notas habría quedado así:

- 172 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

$notas[0][0] = 1;
$notas[0][1] = 2;
$notas[0][2] = 3;
$notas[1][0] = 4;
$notas[1][1] = 5;
$notas[1][2] = 6;
$notas[2][0] = 7;
$notas[2][1] = 8;
$notas[2][2] = 9;

Es más breve, si bien hay que saber a qué asignatura y evaluación pertenece
cada índice. En la sintaxis precedente quedaría así:

$notas = array(0=>array(0=>1,1=>2,2=>3),
1=>array(0=>4,1=>5,2=>6),
2=>array(0=>7,1=>8,2=>9));

Como hemos visto, pues, la función array() permite crear e inicializar matrices,
si bien no es la única forma de hacerlo.

Su sintaxis es

array(lista de elementos separados por comas);

En la lista de elementos se pueden poner valores de los diferentes tipos de


datos que admite PHP. Además, es posible especificar expresamente un índice
numérico o de cadena para referirse a cada uno de sus elementos.

La función range() devuelve una matriz que sólo contiene los elementos
indicados entre dos números, ambos incluidos.

Su sintaxis es

range(número entero del límite inferior, número entero del límite


superior);

Por ejemplo, si creamos la matriz $numeros=range(2,6) la matriz resultante


tiene cinco elementos: el primero contiene el valor 2 y el último, el valor 6.

Recorrer los elementos de una matriz unidimensional

Las matrices tienen un puntero que apunta a uno de sus elementos. Cuando se
accede o usa por primera vez una matriz, el puntero está posicionado sobre el
primer elemento. Pero no siempre está sobre este elemento, ya que el puntero
puede haberse movido para leer o modificar el contenido de la matriz.

La operación de recorrer los elementos de una matriz se lleva a cabo de forma


diferente según se trate de matrices secuenciales, es decir, que tienen
ordenados sus elementos por un índice ordinal como 0, 1, 2, 3, etcétera, o de
matrices no secuenciales, es decir, que no tienen ordenados sus elementos por
un índice ordinal.

- 173 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

Si creamos una matriz sin utilizar expresamente un índice, PHP le asigna un


índice ordinal numérico secuencial, que se inicia con el valor 0. Así pues, los
elementos quedarán ordenados por su índice desde 0 hasta su elemento n-1.

Pero podemos crear una matriz asignándole un índice numérico que no esté
ordenado o incluso un índice de tipo cadena desordenado. Por ejemplo,
podíamos haber creado e inicializado así la matriz $persona:

$persona[10] = "Josefa";
$persona[2] = "Pérez";
$persona[5] = "Rubio";
$persona[1] = 60;

En este caso el primer elemento contendría también "Josefa", pero si queremos


acceder al mismo por su índice deberíamos citar el 10. Así pues, esta matriz
está desordenada por su índice. Veremos más adelante cómo ordenar matrices
por su índice o por el contenido de sus elementos.

La función reset() coloca el puntero de una matriz sobre su primer elemento


y devuelve su contenido. Por ejemplo, la instrucción echo reset($persona);
devuelve "Josefa".

Cuando conocemos que el índice utilizado en una matriz es de tipo numérico


entero secuencial (0, 1, 2,...), la forma más fácil de acceder a cada elemento es
usar la función count() para saber cuántos elementos tiene. Después,
podemos utilizar un bucle for para recorrer todos sus elementos.

La función end() coloca el puntero de una matriz sobre su último elemento y


devuelve su contenido. Por ejemplo, la instrucción echo end($persona);
devuelve 60.

La función count() (podemos invocar también esta función con sizeof(), ya


que se trata de un alias, algo así como un sinónimo) cuenta los elementos que
integran una matriz y devuelve un número entero. Por ejemplo, la instrucción
echo count($persona); devuelve 4. La instrucción echo sizeof($persona);
también devuelve 4.

A partir de esta información, podemos recorrer los elementos y mostrar su


contenido con un bucle, de esta forma:

$numero_elementos=count($persona);
for ($i=0; $i < $numero_elementos; $i++)
echo $persona[$i]."<P>";

Podemos pensar que nos hubiéramos evitado una instrucción si ponemos la


función count() como parte de la condición dentro de for. No es conveniente
hacerlo por dos motivos:

1. Evitar que se ejecute la función cada vez que se pase por el bucle con la
consiguiente pérdida de tiempo al contar siempre lo mismo.

- 174 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

2. Evitar un mal funcionamiento del bucle si dentro de las instrucciones del


bucle se altera el número de elementos de la matriz con la función unset().

En cambio, si queremos recorrer una matriz bidimensional, no podemos usar la


función count(), sino que debemos utilizar dos bucles, uno anidado en el otro
de esta forma:

for ($i=0; $i < 3; $i++)


{
for ($j=0; $j < 3; $j++)
echo "<B>".$notas[$i][$j]." - </B>";
}

La función next() devuelve el contenido del siguiente elemento según la


posición donde esté el puntero y desplaza éste a esa posición nueva. Si se ha
alcanzado el último elemento, esta función devuelve False.

Por ejemplo, la instrucción echo next($persona); devuelve "Pérez" si el


puntero estaba sobre el elemento primero antes de ejecutarse la función.

La función prev() devuelve el contenido del elemento anterior según la


posición donde esté el puntero y desplaza éste a esa posición nueva. Si se ha
alcanzado el primer elemento, esta función devuelve False.

Por ejemplo, la instrucción echo prev($persona); devuelve "Pérez" si el


puntero estaba sobre el elemento primero antes de ejecutarse la función.

La función current() devuelve el contenido de elemento sobre el que está el


puntero sin variar su posición. Por ejemplo, echo current($persona); devuelve
"Rubio" si el puntero está sobre el elemento 3. Si se ha sobrepasado el último
elemento de la matriz, current() devuelve False.

A partir de esta información también podemos recorrer los elementos y mostrar


su contenido con el bucle anterior

for ($i=0; $i < count($persona); $i++)


{
echo current($persona)."<P>";
next($persona);
}

La función key() devuelve el índice de la posición actual del puntero, se trate


de un número entero o de una cadena. Por ejemplo, la instrucción echo
key($persona); devuelve "apellido1" si el puntero está sobre el segundo
elemento.

Podemos recorrer los elementos y mostrar su índice y su contenido con las


instrucciones siguientes:

$datos=array("nombre"=>"Josefa","apellido1"=>"Pérez",
"apellido2"=>"Rubio","edad"=>60);

- 175 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

$numero_elementos=count($persona);
for ($i=0; $i < $numero_elementos; $i++)
{
$indice=key($datos);
echo "Indice:<B> $indice. </B>Contenido: <B>$persona[$i]</B><P>";
next($datos);
}

Este código muestra la página siguiente:

Indice: nombre. Contenido: Josefa

Indice: apellido1. Contenido: Pérez

Indice: apellido2. Contenido: Rubio

Indice: edad. Contenido: 60

Convertir cadenas de caracteres en matrices y viceversa

La función explode() permite convertir una cadena de caracteres en una matriz


mediante un separador dado.

Su sintaxis es

explode(carácter separador, cadena);

La función implode() lleva a cabo la operación inversa: lleva los elementos de


una matriz a una cadena separándolos como se indique.

Su sintaxis es

implode(carácter separador, matriz);

Ordenar matrices

Ya hemos comentado que los elementos de las matrices pueden estar


desordenados, bien por su índice bien por su contenido. Veamos cómo
podemos ordenar los elementos de una matriz de diferentes formas.

La función arsort() ordena los elementos de una matriz teniendo en cuenta su


contenido de mayor (en el código ASCII) a menor manteniendo la asociación
del contenido de cada elemento con su índice.

Su sintaxis es

arsort(matriz);

Por ejemplo, si tenemos la matriz

- 176 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

$palabras=array("1"=>"amazona","2"=>"león","3"=>"zozobra",
"4"=>"sabueso", "5"=>"bondad","6"=>"obús");

la instrucción arsort($palabras); devuelve la matriz

$palabras=array("3"=>"zozobra","4"=>"sabueso","6"=>"obús",
"2"=> "león", "5"=>"bondad","1"=>"amazona");

La función asort() hace exactamente lo mismo que la función


arsort()manteniendo la asociación del contenido de cada elemento con su
índice.

Su sintaxis es

asort(matriz);

Por ejemplo, si tenemos la matriz

$palabras=array("1"=>"amazona","2"=>"león","3"=>"zozobra",
"4"=>"sabueso", "5"=>"bondad","6"=>"obús");

la instrucción asort($palabras); devuelve la matriz

$palabras=array("1"=>"amazona","5"=>"bondad", "2"=> "león",


"6"=>"obús", "4"=>"sabueso","3"=>"zozobra");

La función rsort() ordena los elementos de una matriz teniendo en cuenta su


contenido de menor (en el código ASCII) a mayor pero sin mantener la
asociación del contenido de cada elemento con su índice.

La función sort() hace exactamente lo mismo que la función rsort().

La función krsort() ordena los elementos de una matriz teniendo en cuenta su


índice de mayor (en el código ASCII) a menor manteniendo la asociación de
cada índice con el contenido de cada elemento.

Su sintaxis es

krsort(matriz);

Por ejemplo, si tenemos la matriz

$palabras=array("1"=>"amazona","2"=>"león","3"=>"zozobra",
"4"=>"sabueso","5"=>"bondad","6"=>"obús");

la instrucción krsort($palabras); devuelve la matriz

$palabras=array("6"=>"obús","5"=>"bondad","4"=>"sabueso",
"3"=>"zozobra","2"=>"león","1"=>"amazona");

- 177 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

La función ksort() ordena los elementos de una matriz teniendo en cuenta su


índice de menor (en el código ASCII) a mayor manteniendo la asociación de
cada índice con el contenido de cada elemento.

Su sintaxis es

ksort(matriz);

Por ejemplo, si tenemos la matriz

$palabras=array("1"=>"amazona","2"=>"león","3"=>"zozobra",
"4"=>"sabueso","5"=>"bondad","6"=>"obús");

la instrucción ksort($palabras); devuelve la misma matriz, pues ya está


ordenada según su índice, ya que, al crearla, hemos colocado los índices
ordenados.

La función shuffle() devuelve una matriz en la que los elementos se han


ordenado de forma aleatoria.

Su sintaxis es

shuffle(matriz);

La función uasort() ordena los elementos de una matriz teniendo en cuenta su


contenido y según una función de comparación definida por el usuario
manteniendo la asociación del contenido de cada elemento con su índice.

Su sintaxis es

uasort(matriz,función de usuario);

Por ejemplo, si definimos la función de usuario compara() y la usamos como


segundo argumento de la función uasort(), obtenemos estos resultados:

function compara($a,$b)
{
return (substr($a,3,1)>substr($b,3,1))
}

$colores=array("a"=>"blanco","b"=>"azul","c"=>"rojo",
"d"=>"amarillo","e"=>"verde");
uasort($colores,"compara");
for (reset($colores);$indice=key($colores);next($colores))
echo "Indice: <B>$indice</B> Contenido:<B>$colores[$indice]
</B><P>";

En este caso la función uasort() ordena los elementos según el cuarto


carácter de su contenido de menor a mayor (se cuenta desde 0; por eso hemos
puesto 3 en la función de usuario), que es lo que ejecuta la función de usuario
compara(). Así pues, la matriz queda así:

- 178 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

$colores=array("e"=>"verde","b"=>"azul","a"=>"blanco",
"c"=>"rojo","d"=>"amarillo");

La función usort() hace exactamente lo mismo que la anterior, suponiendo


lógicamente que aplicáramos la misma función de usuario que es la que
determina el orden de los elementos según su contenido, pero sin mantener la
asociación del índice de cada elemento con su contenido.

La función uksort() ordena los elementos de una matriz teniendo en cuenta su


índice y según una función de comparación definida por el usuario
manteniendo la asociación del índice de cada elemento con su contenido.

Su sintaxis es

uksort(matriz,función de usuario);

Por ejemplo, si definimos la función de usuario compara() y la usamos como


segundo argumento de la función uksort(), obtenemos estos resultados:

function compara($a,$b)
{
return (substr($a,3,1)>substr($b,3,1));
}

$colores=array("primero"=>"blanco","segundo"=>"azul",
"tercero"=>"rojo","cuarto"=>"amarillo",
"quinto"=>"verde");
uasort($colores,"compara");
for (reset($colores);$indice=key($colores);next($colores))
echo "Indice: <B>$indice</B> Contenido:<B>$colores[$indice]
</B><P>";

En este caso la función uksort() ordena los elementos según el cuarto


carácter de su índice de mayor a menor (se cuenta desde 0; por eso hemos
puesto 3 en la función de usuario), que es lo que ejecuta la función de usuario
compara().

Así pues la matriz queda así:

$colores=array("segundo"=>"azul","cuarto"=>"amarillo",
"quinto"=>"verde","primero"=>"blanco",
"tercero"=>"rojo");

Modificar matrices

Las matrices ya creadas e inicializadas pueden modificarse de diferentes


formas:

1. Uniendo los elementos de dos o más matrices.

La función array_merge(), recibe como argumentos dos o más matrices y


devuelve otra en la que se han unido todas las que se pongan como

- 179 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

argumentos anexionando los elementos de unas a continuación de las otras,


según el orden en que se pongan los argumentos.

Su sintaxis es

array_merge(matriz1,matriz2...);

Si en la mezcla algún índice se repite, el último en añadirse elimina el elemento


de las matrices anteriores en que se repita.

2. Completando los elementos de una matriz.

La función array_pad() rellena una matriz añadiendo los elementos que se


indique con el contenido que se especifique.

Su sintaxis es

array_pad(matriz,número de elementos de la matriz resultante,relleno


de los elementos añadidos);

donde matriz es la matriz original a la que se añaden elementos; número de


elementos es un entero que indica cuántos elementos tendrá la matriz después
de ejecutarse la función; relleno es la cadena o valor con el que se completará
el contenido de los nuevos elementos.

Si número de elementos es igual o inferior al número de elementos de la matriz


original, no se produce ningún cambio en la misma. Si es negativo, los
elementos se añaden por el principio de la matriz original. Si es positivo, se
añaden por el final.

Por ejemplo, si tenemos la matriz de cinco elementos

$sabores=array("dulce","amargo","salado","soso","menta");

la instrucción

$completa=array_pad($sabores,8,"indeterminado");

genera la matriz

$completa=array("dulce","amargo","salado","soso","menta",
"indeterminado","indeterminado", "indeterminado");

3. Invirtiendo el orden de la matriz original.

La función array_reverse() devuelve otra matriz que contiene los mismos


elementos ordenados al revés, es decir, invierte el orden de los elementos de

- 180 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

forma que el primero pasa a ser el último y el último pasa a ser el primero.
Hace, pues, lo mismo que la función rsort().

Su sintaxis es

array_reverse(matriz);

4. Sustituyendo un fragmento de elementos por otro.

La función array_splice() devuelve la misma matriz sustituyendo varios


elementos consecutivos por otros nuevos.

Su sintaxis es

array_splice(matriz original,posición inicial del desplazamiento,


longitud del desplazamiento,cadena-valor-matriz que
sustituye el fragmento de la original);

donde:

 el argumento posición inicial del desplazamiento es un número entero


que indica la posición, contando desde 0, del primer elemento que debe
ser sustituido. Si es menor que 0, se cuenta desde el último elemento de
la matriz original siendo el último elemento el que ocupa la posición –1.
 el argumento longitud del desplazamiento es un número entero que
indica el número de elementos que serán sustituidos a partir de la
posición especificada en el argumento anterior. Si se omite, se eliminan
todos desde la posición indicada. Si es menor que 0, se eliminan tantos
como se indique, pero contando desde el final de la matriz original hasta
la posición especificada.
 el argumento cadena, valor o matriz contiene el contenido que ha de
asignarse a los elementos eliminados. Puede no existir. En este caso, la
matriz original pierde los elementos eliminados sin ser sustituidos por
otros.

Veamos algunos ejemplos:

$matriz1=array("muy alto","alto","medio",
"bajo","muy bajo");
$matriz2=array("óptimo","bueno","malo");
array_splice($matriz1,2,2);

genera la matriz

$matriz1=array("muy alto","alto","muy bajo");

Se han eliminado los elementos tercero y cuarto.

array_splice($matriz1,2);

genera la matriz

- 181 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

$matriz1=array("muy alto","alto");

Se han eliminado todos los elementos desde el tercero.

array_splice($matriz1,-2);

genera la matriz

$matriz1=array(("muy alto","alto","medio");

Se han eliminado los dos últimos elementos.

array_splice($matriz1,2,1);

genera la matriz

$matriz1=array(("muy alto","alto","bajo","muy bajo");

Se ha eliminado el elemento tercero.

array_splice($matriz1,3,3,$matriz2);

genera la matriz

$matriz1=array("muy alto","alto","medio", "óptimo","bueno","malo");

Se han sustituido, desde el elemento tercero, tres elementos con el contenido


de la matriz $matriz2.

array_splice($matriz1,count($matriz1),3,$matriz2);

genera la matriz

$matriz1=array("muy alto","alto","medio","bajo",

"muy bajo","óptimo","bueno","malo");

Se han añadidos los elementos de la segunda matriz a los de la primera.

No conviene confundirse con esta función: si generamos una segunda matriz


con esta misma orden, ésta contendrá los elementos eliminados.

Por ejemplo, la orden

$nueva=array_splice($matriz1,3,3,$matriz2);

genera la matriz

$nueva=("bajo","muy bajo");

que son los dos elementos eliminados de la matriz original.

- 182 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

5. Ejecutando una función de usuario sobre cada elemento de la matriz

La función array_walk() aplica una función de usuario a cada elemento de la


matriz.

Su sintaxis es

array_walk(matriz original,función de usuario,prefijo);

6. Juntando variables en una sola matriz

La función compact() devuelve otra matriz en la que se han incorporado como


elementos las diferentes variables y matrices que se especifiquen como
argumento. Como índice se pone el nombre de la variable y como contenido el
valor de cada variable.

Su sintaxis es

compact(lista de variables o arrays...);

Extraer información de las matrices

La función array_count_values() recibe como argumento una matriz y


devuelve otra cuyos índices son los contenidos de la original y cuyo contenido
es la frecuencia con que se repite el mismo contenido en la matriz original.

Su sintaxis es

array_count_values(matriz);

La función array_keys()recibe como argumento una matriz y devuelve otra que


contiene sólo los índices de la matriz original como contenidos de los nuevos
elementos. Como índices de la nueva matriz se asignan valores numéricos
enteros desde 0 en adelante.

Su sintaxis es

array_keys(matriz,valor);

El segundo argumento es opcional y, si se usa, sirve para decir que pase a la


matriz resultante sólo los índices de los elementos que contengan ese valor.

La función array_slice() devuelve otra matriz que contiene una porción de


elementos de la matriz original.

Su sintaxis es

array_slice(matriz original, posición inicial del desplazamiento,


longitud del desplazamiento);

- 183 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

donde

 el argumento posición inicial del desplazamiento es un número entero


que indica la posición, contando desde 0, del primer elemento que debe
ser extraído. Si es menor que 0, se cuenta desde el último elemento de
la matriz original siendo el último elemento el que ocupa la posición –1.
 el argumento longitud del desplazamiento es un número entero que
indica el número de elementos que serán extraídos a partir de la
posición especificada en el argumento anterior. Si se omite, se extraen
todos los elementos desde la posición indicada. Si es menor que 0, se
extraen tantos como se indique, pero contando desde el final de la
matriz original hasta la posición especificada.

Como se ve, esta función tiene un comportamiento similar a la función


array_splice(), pero aquí se extraen los elementos y en aquélla se eliminan o
sustituyen.

$altura=array("muy alto","alto","medio","bajo","muy bajo");


$nueva=array_splice($altura,2,2);

genera la matriz

$nueva=array("medio","bajo");

Se han extraído los elementos tercero y cuarto.

La función array_values()recibe como argumento una matriz y devuelve otra


en la que se han eliminado los índices dejando sólo los contenidos.

Su sintaxis es

array_values(matriz original);

Lógicamente, como no puede haber una matriz sin índices, a cada elemento se
le asignan índices numéricos desde 0 en adelante y se eliminan los que tuviera
antes, sean cadenas u otros valores numéricos.

La función each()lee el elemento actual de una matriz y avanza el puntero al


elemento siguiente. Con el elemento leído fabrica otra matriz de cuatro
elementos: dos para el índice (0 y key) y dos para el contenido (1 y value).
Generalmente, esta función se utiliza combinada con la función list() para
recorrer los elementos de una matriz con un bucle.

Su sintaxis es

each(matriz original);

Por ejemplo, si tenemos la matriz

- 184 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

$con_indices=array("uno"=>"muy alto","dos"=>"alto",
"tres"=>"medio","cuatro"=>"bajo",
"cinco"=>"muy bajo");

y suponemos que el puntero está sobre el elemento "tres"=>"medio", la


instrucción $nueva=each($con_indices); devuelve la matriz de cuatro
elementos siguiente

$nueva=array(0=>"tres","key"=>"tres", 1=>"medio","value"=>"medio")

Los dos primeros elementos de la matriz resultante hacen referencia al índice


del elemento actual de la matriz original. De esta forma podemos referirnos a
su contenido también de dos formas: $nueva[0] o $nueva("key").

Como puede verse, los dos últimos elementos de la matriz resultante hacen
referencia al contenido del elemento actual de la matriz original. De esta forma
podemos referirnos a su contenido de dos formas: como $nueva[1] o como
$nueva("value").

La función extract()pasa los contenidos de los elementos de una matriz como


contenidos de las variables que llevan como nombre el índice de cada
elemento de la misma matriz. Como consecuencia, a la tabla de símbolos de
variables se incorporan estas nuevas variables.

Su sintaxis es

extract(matriz, si hay conflictos tipo de extracción,si hay conflictos


cadena de sustitución);

Los dos últimos argumentos son opcionales y sólo se aplican, si existen,


cuando al ejecutar la extracción se han producido colisiones, es decir, si la
variable que se pretendía crear ya existía e incluso si era de diferente tipo.

En caso de colisión entre variables, el segundo argumento tiene los valores


siguientes:

 EXTR_OVERWRITE: se descarta el valor anterior de la variable y se


pone el nuevo. Este valor es el que se usa por defecto en caso de
colisión, aunque no se indique como argumento.
 EXTR_SKIP: se descarta el valor nuevo de la variable y se pone el
anterior.
 EXTR_PREFIX_SAME: al nombre de la variable nueva conflictiva se le
pone como prefijo la cadena del tercer argumento seguida de un guión
de subrayado (_).
 EXTR_ PREFIX_ALL: al nombre de todas las variables nuevas
conflictivas se le pone como prefijo la cadena del tercer argumento
seguida de un guión de subrayado (_).

Esta función comprueba también si el nombre de las nuevas variables es válido


y sólo las crea si lo es.

- 185 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

La función in_array()devuelve True si un valor está contenido en alguno de


los elementos de una matriz y False si no lo está,

Su sintaxis es

in_array(valor buscado, matriz donde se busca);

La construcción list()asigna en una única operación el valor de los elementos


de una matriz a una lista de variables que se usan como argumento. Ya
comentamos que la función each() se usa, por lo general, combinada con la
función list() para recorrer los elementos de una matriz dentro de un bucle.

Su sintaxis es

list(lista de variables);

Por ejemplo, si tenemos la matriz

$comunidad=array("CA1"=>"Aragón","CA2"=>"Andalucía",
"CA3"=>"Galicia","CA4"=>"Murcia",
"CA5"=>"Valencia","CA6"=>"Canarias");

el bucle siguiente recorre y muestra el contenido de todos sus elementos:

while (list($indice,$valor)=each($comunidad))
{
print ("El elemento <B>$indice</B> contiene el valor <B>$valor
</B><P>");
}

En la condición con la que se establece el bucle combinando list() y each()


se consigue que list() tome en sus dos variables el índice y el contenido de
cada elemento, que luego se muestran. Además, una vez proporcionada por
each() la información de cada elemento a list(), hace avanzar el puntero un
elemento más, por lo que el bucle se acaba cuando ya no hay elementos que
ofrezcan la información necesaria.

Tratar un array como si fuera una pila

PHP permite tratar las matrices como si fueran pilas de tipo LIFO (Last In First
Out, Último en Entrar Primero en Salir) mediante cuatro funciones. El concepto
de pila ya es clásico en Informática y se refiere a la forma de almacenar
información en forma de montón o pila, Si tenemos muchos platos, podemos
almacenarlos apilándolos unos encima de otros. En este caso lo más usual
será que el último plato colocado en la pila sea el primero que se retira. Las
matrices también pueden considerarse como pilas de datos, que son sus
elementos.

Veamos las funciones que nos permiten realizar operaciones de tipo pila con
las matrices.

- 186 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

La función array_pop() extrae el último elemento de la matriz eliminándolo.

Su sintaxis es

array_pop(matriz);

La función array_push() añade elementos al final de la matriz.

Su sintaxis es

array_push(matriz,lista de elementos que se añaden);

La función array_shift() extrae el primer elemento de la matriz eliminándolo y


desplazando todos una posición a la izquierda.

Su sintaxis es

array_shift(matriz);

La función array_unshift() inserta elementos por el principio de la matriz


desplazando los demás a la derecha.

Su sintaxis es

array_unshift(matriz,lista de elementos que se añaden);

Es conveniente observar que, cuando añadimos elementos, PHP crea los


índices para cada uno, que son de tipo numérico ordinal.

Más funciones de matrices

La función array_combine() crea una matriz usando una matriz para las claves
y otra para sus valores.

La función array_walk_recursive() aplica una función de usuario


recursivamente a cada miembro de una matriz.

La función array_uintersect() lleva a cabo la intersección entre 2 o más


matrices y utiliza para comparar los elementos de cada matriz la función
indicada en el último parámetro.

Desde Eclipse PDT puedes abrir el proyecto Ejemplo 3 (Tratamiento de


matrices) de la Unidad 3. Estudia el código fuente y ejecútalo para mostrar
en el navegador su resultado.

En este programa se incluye la mayoría de los ejemplos cuyo código hemos ido
escribiendo junto a las funciones explicadas y otros nuevos que no aparecen
en el texto anterior. Te invitamos a que lo estudies en profundidad.

- 187 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

Funciones creadas por el usuario

En los tres apartados anteriores hemos estudiado las principales funciones


estándar de que dispone PHP para realizar operaciones con cadenas, fechas y
matrices.

El usuario también puede crear sus propias funciones, como ya se ha hecho en


las dos primeras unidades y en esta misma. Por ejemplo, en el apartado
anterior, en el que se abordan las funciones estándar de las matrices, hemos
creado y usado las funciones de usuario cambia(), ver() y compara().

En este apartado vamos a explicar brevemente cómo se crean y usan


funciones de usuario con la finalidad de ahorrar muchas líneas de instrucciones
ejecutando siempre el mismo código, sin necesidad de repetirlo en cada
ocasión en que deba llevarse a cabo una tarea específica dentro del mismo
script.

El uso de funciones de usuario para tareas repetitivas facilita mucho y ahorra


tiempo en el proceso de modificación y actualización del código fuente.

Creación de funciones de usuario

Las funciones de usuario son bloques de código que pueden ser utilizados en
cualquier momento dentro del código PHP.

En primer lugar y antes de hacer uso de ellas, es preciso declararlas y crear su


código. Se hace con la sentencia function seguida del nombre de la función y
de las líneas de instrucciones. Estas últimas deben ir entre las llaves {...}. Si la
función tiene que devolver un valor a la línea de código donde se invocó, como
última instrucción hay que poner la orden return seguida del valor que se
devuelve. Si no se devuelve un valor, sino que sólo se ejecutan instrucciones
dentro del código de la propia función, puede prescindirse de la sentencia
return.

Las funciones, en la mayoría de los casos, tienen parámetros o argumentos


entre paréntesis, a través de los cuales se pasan los datos con los que hay que
realizar operaciones.

Tratemos de reflejar todo lo dicho en un ejemplo. Supongamos que dentro del


código PHP es preciso hallar y mostrar varias veces el cuadrado y el doble de
un número. Si disponemos de una función que lleve a cabo estas dos
operaciones, no será preciso más que invocar esta función cuantas veces sea
necesario pasándole cada vez el número del que es preciso obtener el
cuadrado y el doble. La escribiremos así:

function ver_cuadrado_y_doble($num=2)
{
$cuadrado=($num*$num);
$doble=($num*2);

- 188 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

echo "El cuadrado de <B>$num</B> es <B>$cuadrado</B>


y el doble es <B>$doble</B>.<P>";
}

$num1=4;
ver_cuadrado_y_doble($num1);
$num2=5;
ver_cuadrado_y_doble($num2);
$num3=6;
ver_cuadrado_y_doble($num3);
$num4=7;
ver_cuadrado_y_doble($num4);
ver_cuadrado_y_doble();

En este ejemplo aparecen casi todos los componentes de una función de


usuario, que son:

1. Sentencia function seguida del nombre de la función creada por nosotros


(ver_cuadrado_y_doble) y, entre paréntesis, del argumento ($num) que se
recibe desde el código del script. Fíjate que hemos escrito ($num=2) en el
argumento de la función. Esto significa que si no se indica el argumento,
entonces el valor por defecto es "2".

2. Sentencias que contienen el código que ha de ejecutarse dentro de la


función. Hay que ponerlas entre llaves {...}, como hemos hecho. Además, antes
de invocar una función de usuario, es preciso crearla, como hemos hecho. En
este ejemplo, no aparece la sentencia return, ya que no es necesario devolver
ningún valor por realizarse la operación completa dentro del código de la
función.

3. Invocación de la función de usuario dentro del script del código PHP. En


este ejemplo hemos invocado la función hasta cuatro veces. Desde esta línea
pasamos el valor que recibe la función en su argumento. Los nombres de
ambos argumentos (el de la invocación ($num1) y el de la función ($num) no es
necesario que coincidan). En cambio, sí es imprescindible que el número de
parámetros pasados y recibidos sea el mismo. En este caso se pasa uno y se
recibe uno.

Si no hubiera argumentos, se pone sólo el paréntesis. En nuestro caso sería lo


siguiente: ver_cuadrado_y_doble(); y el argumento $num tomaría el valor por
defecto, que es "2".

Veamos otro ejemplo en el que hay varios argumentos y necesitamos la


sentencia return. Se trata de una función que recibe tres palabras y fabrica con
ellas una matriz. Con la sentencia return devuelve la matriz. Se muestran,
luego, sus elementos fuera de la función con otra función de usuario que
hemos denominado ver(). Éste es el código:

function ver($contenido, $indice)


{
echo "Indice: <B>$indice</B> Contenido:<B> $contenido</B><br>\n";
}

- 189 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

function hacer_matriz($pal1,$pal2,$pal3)
{
$todas="$pal1,$pal2,$pal3";
$matriz=explode(",",$todas);
reset($matriz);
return $matriz;
}

$texto1="perro";
$texto2="rinoceronte";
$texto3="jirafa";

array_walk(hacer_matriz($texto1,$texto2,$texto3),'ver');

Hay varias cosas que debemos tener en cuenta al crear y utilizar funciones de
usuario. Son éstas:

 Aquí hemos utilizado la sentencia return $matriz como última


instrucción de la función hacer_matriz(). En la invocación de esta
función

array_walk(hacer_matriz($texto1,$texto2,$texto3),'ver');.

hemos mandado tres datos ($texto1,$texto2,$texto3), que se han recibido


como parámetros de la función ($pal1,$pal2,$pal3). Con ellos se ha operado
dentro del código de la función, pero sólo se ha devuelto uno ($matriz), que es
la matriz creada en la función cuyos elementos se muestran ahora con la
función de usuario ver(). Con la sentencia return no se pueden devolver
varios argumentos, sólo un valor.

 Podemos observar, además, que se pueden anidar varias funciones


unas dentro de otras, como hemos hecho aquí: como primer argumento
de una función estándar hemos puesto una función de usuario y como
segundo argumento, otra función. Sólo hay que procurar que los
argumentos sean válidos tanto por su número como por el tipo de dato
que requieren.
 En este ejemplo, hemos pasado los datos con el procedimiento
denominado por valor, es decir, que en la función se crea una copia de
los datos que se reciben, de forma que, aunque se modifique su
contenido dentro de la función, en el código PHP siguen manteniéndolo.
Por ejemplo, la variable $texto1 al enviarla contiene el contenido “perro”.
Aunque dentro de la función se modifique $pal1, variable donde se
recibe, y se le asigne el contenido “león”, la primera seguirá
conservando su valor inicial.

En el siguiente ejemplo vamos a usar el mismo código, casi, para pasar datos
por referencia.

function cambiar(&$pal1,&$pal2,&$pal3)
{
$pal1=strtr($pal1,'aeiou','.....');
$pal2=strtr($pal2,'aeiou','.....');

- 190 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

$pal3=strtr($pal3,'aeiou','.....');
$pal1=strrev($pal1);
$pal2=strrev($pal2);
$pal3=strrev($pal3);
}

$texto1="perro";
$texto2="rinoceronte";
$texto3="jirafa";
echo "<H3><CENTER>Inicialmente las variables \$texto1,
\$texto2 y \$texto3 contienen:</H3></CENTER>";
echo "<B>$texto1</B><P>";
echo "<B>$texto2</B><P>";
echo "<B>$texto3</B><P>";
echo "<H3><CENTER>Después de la transformación las variables
\$texto1,\$texto2 y \$texto3 contienen:</H3></CENTER>";
cambiar($texto1,$texto2,$texto3);
echo "<B>$texto1</B><P>";
echo "<B>$texto2</B><P>";
echo "<B>$texto3</B><P>";

En este código hemos pasado los datos por referencia, es decir, las variables
que se escriben como parámetros en la función también pueden ser
modificadas en el código PHP de la citada función. Para conseguir esto, hay
que utilizar el signo andpersand (&) delante de los parámetros de la función.
Cuando, después de haber ejecutado la función cambiar(), mostramos los
mismos datos en la página, podemos observar que sí han cambiado como
necesitamos.

En cuanto al ámbito o alcance de las variables, así como sobre la vida de


éstas, aplicado ahora a las funciones, vale lo que ya hemos explicado en el
apartado Ámbito de las variables de la Unidad 2.

Mediante Eclipse PDT puedes abrir el proyecto Ejemplo 4 (Funciones de


usuario) de la Unidad 3. Estudia el código fuente y ejecútalo para mostrar
en el navegador su resultado.

En este Ejemplo se incluye el código que hemos ido escribiendo en las


funciones de usuario creadas en este apartado.

Además, hemos incluido un Ejemplo que muestra la utilización de funciones de


matrices aplicadas a un sencillo juego de cartas. Es importante que estudies su
código fuente ya que enseña cómo utilizar matrices conjuntamente con
funciones de usuario.

Usando Eclipse PDT puedes abrir el proyecto Ejemplo 6 (Baraja) de la


Unidad 3. Estudia el código fuente y ejecútalo para mostrar en el navegador
su resultado.

Si ejecutas en Eclipse PDT el proyecto verás que aparece la siguiente página


en el navegador:

- 191 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

- 192 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

La Programación Orientada a Objetos (POO)

El lenguaje PHP ha ido incorporando también las técnicas y procedimientos


propios de la programación orientada a objetos, incluyendo la mayoría de las
características de este tipo de programación. En este último apartado de la
Unidad 3 vamos a explicar cómo se crean y usan objetos en PHP.

Qué son las clases

Sobre este asunto conviene recordar que hay una gran similitud entre lo que
llamamos en informática objetos y los objetos de la vida real. Las clases son un
conjunto o colección de variables que describen algo y de funciones que
acceden a esas variables para actuar sobre ellas. Aplicando este concepto a la
vida real, podemos decir que una clase informática es como un diseño, modelo
o proyecto de algo, que describe ese algo y determina las operaciones o
funcionalidades que pueden llevarse a cabo con eso.

Supongamos que a un ingeniero aeronáutico se le encarga el diseño de un


prototipo de avión. Ese profesional describe en los planos y memorias ese
prototipo indicando qué características va a tener: envergadura, tamaño,
capacidad, potencia, etcétera. Estos son las propiedades o variables del objeto.
Además, debe definir qué operaciones y funcionalidades va a tener: aterrizar,
despegar, navegar, etcétera. Estos son las funciones del objeto. Pues bien, en
un programa informático a ese conjunto o colección de datos y funciones,
relacionadas con los datos y reflejadas en el proyecto o modelo, lo llamamos
clase. Lo mismo ocurre si un arquitecto diseña un edificio, un ingeniero de
caminos una carretera o un entrenador deportivo una técnica de ataque o de
defensa. Conviene tener en cuenta que se trata sólo de un diseño, de un
modelo, de una plantilla, no convertida todavía en realidad, en objeto concreto.

Una vez creado un objeto informático, la persona que desarrolla un programa


puede incorporarlo con facilidad, al margen incluso de otros programadores
que estén desarrollando otra sección de la misma aplicación. La POO permite,
pues, una programación más estructurada a través de los objetos. El
desarrollador no tiene que conocer necesariamente cómo funciona ni cómo es
por dentro un objeto. Le basta conocer para qué sirve, cómo es y cómo puede
modificar esas características (variables), de qué forma (funciones) y qué
parámetros (argumentos) debe poner para que lo haga. Un objeto es como una
caja negra de la que hay que saber únicamente sacar información, en nuestro
caso hay que saber utilizarlo.

Para qué sirven las clases

Las clases son el máximo exponente de la POO y PHP implementa en su


lenguaje toda la funcionalidad necesaria para definirlas. Usándolas podemos
hacer el código más legible y, además, reutilizable. Escribir el código de una
clase es más largo que escribir el código directamente, pero a largo plazo
resulta más rentable, ya que podemos hacer uso de una misma clase en otras

- 193 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

aplicaciones. Además, el mantenimiento de la clase es único, por lo que nos


ahorra tener que buscar y modificar los fragmentos que usen las mismas líneas
de código en diferentes scripts.

Por lo demás, aunque en versiones anteriores PHP no era un lenguaje


orientado a objetos, en la última versión de PHP 5 sí dispone de todas las
características de un lenguaje orientado a objetos, como los interfaces y
métodos de polimorfismo. Si bien, PHP 5 no dispone todavía de un sistema de
herencia múltiple.

Creación de objetos en PHP

En la POO los conceptos de clase y objeto están íntimamente relacionados.


Una clase es un modelo, patrón o plantilla sobre el cual se plantea un objeto.
Un objeto es ya una instancia de una clase, es decir, un caso real que se crea
basándose en el modelo clase. En el ejemplo anterior la clase avión define el
modelo genérico de lo que debe ser un avión. Cuando se concreta ya en la
clase avión las características y funcionalidades que hemos atribuido a nuestro
avión, se convierte en un objeto.

Para declarar una clase hay que usar la palabra reservada class seguida del
nombre de la clase que se quiere crear. Todas las instrucciones que integran la
nueva clase deben ir entre los signos {…}. Además, para definir las
propiedades de la clase, las variables tienen que ir precedidas de las palabras
reservadas public, protected o private. Observa el ejemplo siguiente:

class carro_compra
{
public $productos = array();
function __construct($clase="zumo",$numero=5)
{
$this->incluir_productos($clase,$numero);
}
function __destruct()
{
unset($this->productos);
}
function incluir_productos($clase,$numero)
{
$this->productos[$clase]+=$numero;
}
function retirar_productos($clase,$numero)
{
if($this->productos[$clase] > $numero)
{
$this->productos[$clase]-=$numero;
return true;
} else
{
return false;
}
}
}

- 194 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

En este ejemplo definimos una clase llamada carro_compra. Está integrada por
una matriz ($productos), en cuyos elementos se guardan los productos, y dos
funciones para meter (incluir_productos) estos productos en el carro y
sacarlos (retirar_productos) del mismo. Observa que usamos también el
prefijo $this->, que es un puntero especial que nos permite citar cada
elemento de la matriz. Es una forma breve de sustituir el nombre de la clase.
En lugar de codificar la instrucción escribiendo carro_compra->productos
podemos escribir, de forma más breve, $this->productos.

Opcionalmente, las clases pueden incluir una función especial


denominada constructor. Esta función se ejecuta automáticamente cada vez
que se crea un objeto. Aunque podamos invocar la función constructor
cuando queramos como lo hacemos con cualquier otra función, generalmente,
se usa para llevar a cabo operaciones básicas, como determinar el tipo de
datos que va a contener la clase, asignar valores a sus variables, inicializar las
propiedades o los métodos del objeto, etcétera. Para que una función de las
creadas dentro de una clase se convierta en constructor, es preciso que llame
__construct. El constructor también puede tener parámetros a través de los
cuales recibe datos. En el ejemplo anterior el constructor es la función

function __construct($clase="zumo",$numero=5)
{
$this->incluir_productos($clase,$numero);
}

donde hacemos que, cada vez que se instancie la clase en un nuevo objeto,
nuestra compra del carro incluya 5 unidades del producto "zumo".

En versiones anteriores de PHP el constructor se llamaba igual que la clase.


Notamos que PHP 5 es también compatible con esta definición.

Sin embargo, a partir de PHP 5.3.3, los métodos con el mismo nombre que el
último elemento de una clase en un nombre de espacios no serán más tratados
como un constructor y serán una función más.

En este ejemplo anterior sería así:

function carro_compra($clase,$numero)
{
$this->incluir_productos($clase,$numero);
}

Además, también opcionalmente, las clases pueden incluir una función especial
denominada destructor. Esta función se ejecuta automáticamente cada vez
que se destruye un objeto. Generalmente, se usa para llevar a cabo las
operaciones para liberar los recursos y las variables del objeto. Para que una
función de las creadas dentro de una clase se convierta en destructor, es
preciso que llame __destruct. En el ejemplo anterior el destructor es la función

- 195 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

function __destruct()
{
unset($this->productos);
}

donde hacemos que, cada vez que se destruya un objeto, se borran


previamente todos los productos del carro de la compra.

Nota: El destructor será invocado incluso si el usuario detiene la ejecución del


script parando la carga de la página en su navegador.

Cómo se crean y se usan los objetos

Hemos dicho que las clases son como plantillas o diseños o proyectos,
colecciones de variables, propiedades y funciones que forman un conjunto.
Pero aún no existen como objetos reales. Para ello, hay que instanciar la clase,
es decir, concretarla en un objeto. Los objetos son, pues, instancias a una
clase, es decir, tipos de datos que asumen las variables, propiedades, atributos
y métodos de la clase a la que pertenecen. Cada objeto es único e
independiente de otro que pueda crearse como instancia de la misma clase.

En PHP se crea un objeto usando la palabra reservada new. Con esta sentencia
se asigna a una variable o clave las características de la clase que se instancia.
Por ejemplo, para crear un objeto de la carro_clase debemos escribir

$mi_compra = new carro_compra;

A partir de ahora ya podemos referirnos a este objeto, que contendrá el tipo de


datos declarado en la clase. Además, podemos actuar sobre sus propiedades
(variables) y métodos (funciones), llevando a cabo en el objeto las operaciones
que se hayan establecido en la clase.

También podemos incluir parámetros que pasarán al constructor directamente.


Cuando se pasan valores en los parámetros la función se ejecuta sin tener en
cuenta los valores asignados por defecto dentro de la función constructor.
Cuando se pasa solamente parte de los valores la función toma los valores
recibidos y conserva los demás asignados por defecto. Esto mismo pasa con
las demás funciones, aunque no sean el constructor.

Por ejemplo, podemos escribir $mi_compra = new carro_compra("zumo",5);

para hacer que el objeto se inicialice con esta información.

En la instrucción anterior no sólo se crea el objeto $mi_compra, sino que


además se llama al constructor de esta clase para pasar información al objeto
creado mediante la función incluir_productos($clase, $numero).

Cómo se usan las propiedades y método de un objeto

- 196 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

En PHP todas las propiedades y métodos de la clase pueden ser vistos desde
fuera de la misma, siempre y cuando sean son públicos (ver apartado más
abajo sobre Ámbito de variables y funciones). Esto significa que podemos
acceder a ellos desde fuera de la clase citando directamente la propiedad o el
método precedidos del nombre del objeto y del signo apuntador ->. Por
ejemplo, podemos escribir lo siguiente:

// Creamos el objeto.
$mi_compra = new carro_compra;

// Mostramos el número de productos de un objeto


// accediendo a su propiedad $productos.
// Observa que $productos es una matriz y que usamos
// como índice de la misma el nombre del producto.
echo $mi_compra->productos["café"];

// Incluimos un producto en el objeto citando la función


// que hemos creado como constructor.
$mi_compra->incluir_productos("café",4);

Observa que los métodos de un objeto son llamados de la misma forma que las
funciones normales pasándoles, cuando los haya, los parámetros que
necesiten. Los métodos son funciones que pertenecen al objeto, por lo que es
preciso indicar el nombre del objeto al que pertenecen. Así pues, la forma de
llamar a un método es igual que la de llamar a una propiedad de un objeto.

Si los métodos devuelven algún valor, podemos asignarlo a una variable. Por
ejemplo, en lugar de mostrar el número de productos del objeto $mi_compra,
podíamos haberlo asignado a la variable $producto_cafe de esta forma:

$producto_cafe = $mi_compra->productos["café"];

Las variables definidas e incluso inicializadas con algún valor dentro de la clase
pueden usarse directamente dentro de la propia clase por las funciones
internas de la misma, sin necesidad de usar el signo ->. En este caso, tendrán
un ámbito exclusivamente local, no serán públicas.

Ejemplos

Veamos un sencillo ejemplo de lo expuesto anteriormente. Estudia su código y


haz que PHP lo interprete dentro de un script, para que puedas comprobar
mejor sus resultados.

Ejemplo 1

<?

class suma
{
public $numero1=15;
public $numero2=23;

- 197 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

function opera()
{
echo $this->numero1+$this->numero2;
}

$resultado = new suma;


$resultado->opera();

?>

En este script se ha llevado a cabo una sencilla operación de sumar dos


números y mostrar su resultado en el navegador del usuario. Se ha hecho
usando una clase y un objeto, más por motivos didácticos que por conveniencia
de recursos de programación.

En la primera parte del código se crea la clase suma haciendo preceder su


nombre por la palabra reservada class. Los signos {…} delimitan el código de la
clase. Las variables $numero1 y $numero2 son propiedades o atributos de esta
clase. Observa que deben ir precedidas de la palabra reservada public. A la
vez que se declaran, se les ha asignado un valor numérico entero. La función
opera() constituye un método de esta clase. Esta función suma los valores de
las dos variables anteriores y muestra el resultado de dicha suma. Observa que
el puntero especial $this-> sustituye al nombre de la clase. El nombre de las
dos variables que lo siguen ahora no va precedido del símbolo $.

En la segunda parte del código, ya fuera de la creación de la clase, se instancia


en un objeto la clase creada. El objeto creado se llama $resultado. La palabra
reservada new, seguida del nombre de la clase, permite crear este objeto, que
tendrá las mismas propiedades y métodos que la clase. Finalmente, se llama al
método opera() desde el propio objeto. También ahora es preciso apuntar con
el signo -> al nombre de la función.

Ejemplo 2

Veamos otro ejemplo parecido, pero algo más complejo, en el que se crean dos
objetos a partir de la misma clase y se amplía el número de métodos.

<?

class resta
{
public $diferencia;

function calcula($x,$y)
{
$this->diferencia=$x-$y;
}

function muestra()
{

- 198 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

echo $this->diferencia,"<br>";
}

$dife = new resta;


$dife->calcula(10,5);

$dife1 = new resta;


$dife1->calcula(23,11);

$dife->muestra();
$dife1->muestra();

?>

En la primera parte de este código se crea una clase denominada resta.


Dentro de ella se define la variable (propiedad) $diferencia y dos funciones
(métodos): la función calcula() para hallar la diferencia entre dos números
($dife y $dife1) que se reciben como parámetros cuando se invoca desde los
objetos. Esta función devuelve el resultado de restar el segundo número del
primero. La función muestra() envía al navegador del usuario el valor de la
propiedad $diferencia.

En la segunda parte del código, fuera ya del código donde se crea la clase, se
crean dos objetos de la clase anterior: $dife y $dife1. Además, se usan los
métodos de la misma, enviando en el primero de éstos los operandos con los
que deben realizarse las operaciones de la resta.

Ejemplo 3

En este tercer ejemplo, muy parecido al anterior, vamos a ver cómo la


información de las propiedades de una clase, instanciada en un objeto, pueden
guardarse en una matriz.

<?

class producto
{
public $resul=array();
public $i=0;

function opera($v,$s)
{
$this->resul[$this->i]=$v*$s;
$this->i++;
}

function muestra()
{
foreach($this->resul as $numero)
{
echo $numero,"<br>";
}

- 199 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

}
}

$produc = new producto;


$produc->opera(5,4);
$produc->opera(10,6);
$produc->opera(-5,16);
$produc->muestra();

?>

En este script creamos la clase producto y el objeto produc. Lo nuevo aquí es


que la variable $resul es un dato de tipo array en cuyos elementos se va
guardando el resultado de multiplicar los dos números que se envían como
parámetros cada una de las tres veces que se interpreta el método opera(),
llamado desde el objeto produc. En la función muestra() se usa un bucle con la
sentencia foreach para mostrar el valor de cada uno de los tres elementos
introducidos.

Ten en cuenta que, si llamamos varias veces a una función del mismo objeto,
los resultados de la última llamada se sobrescriben sobre los de la llamada
anterior. Si queremos, pues, conservar la información anterior, será preciso
crear varios objetos o bien usar una matriz, como hemos hecho en el ejemplo
último.

Ejemplo 4

En este cuarto ejemplo usamos un constructor para completar de forma


automática los datos del primer elemento de la matriz que se muestra en la
tabla. Ten en cuenta que siempre que se crea un objeto la función constructor
se ejecuta automáticamente. En el código siguiente se calculan las operaciones
de suma, resta, multiplicación y división con los valores:

<?

class varios
{
public $valor_inicial=20;
public $numero_1=array();
public $numero_2=array();
public $suma=array();
public $resta=array();
public $producto=array();
public $division=array();
public $control=0;

function varios ($valor_1=60,$valor_2=15)


{
$this->control+=1;
$a=$this->control;
$this->numero_1[$this->control]=$valor_1;
$this->numero_2[$a]=$valor_2;
$this->suma[$a]=$valor_1+$valor_2;
$this->resta[$a]=$valor_1-$valor_2;

- 200 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

$this->producto[$a]=$valor_1*$valor_2;
$this->division[$a]=$this->valor_inicial*$valor_1/$valor_2;

function muestra()
{
echo "<table align=center border=1>";
echo "<td>Número 1</td><td>Número 2</td><td>Suma</td>";
echo "<td>Resta</td><td>Multiplicación</td>
<td>División</td><tr>";

foreach($this->numero_1 as $indice=>$valor)
{
$n2=$this->numero_2[$indice];
$s=$this->suma[$indice];
$r=$this->resta[$indice];
$p=$this->producto[$indice];
$d=$this->division[$indice];
echo "<td align=center>$valor</td>";
echo "<td align=center>$n2</td>";
echo "<td align=center>$s</td>";
echo "<td align=center>$r</td>";
echo "<td align=center>$p</td>";
echo "<td align=center>$d</td><tr>";
}
echo "</table>";
}
}

$calculos= new varios;


for ($i=1;$i<11;$i++)
{
for ($j=1;$j<11;$j++)
{
$calculos->varios($i,$j);
}
}

$calculos->muestra($i,$j);

?>

Observa que en este ejemplo se pasan unos valores directamente al


constructor desde dentro de la propia clase, es decir, datos definidos e
inicializados en la misma clase. Hay otra forma de pasar valores, que consiste
en pasar valores como parámetros creados e inicializados fuera de la clase,
como hemos visto antes en algún ejemplo.

Otros ejemplos

Un ejemplo clásico es el que se aplica a un vehículo, como un coche, al que se


asignan ciertas propiedades (variables) y atribuyen determinados métodos
(funciones).

<?

- 201 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

class vehiculo
{

// Propiedades.
public $velocidad, $color, $gama;
// Constructor: asignación de velocidad inicial,
// color y gama.

function __construct()
{
$this->velocidad = 0;
$this->color = "blanco";
$this->gama = "alta";
}

// Método acelerar. El coche va más rápido.


function acelerar($velo)
{
$this->velocidad=$velo;
}

// Método frenar. El coche va más lento


// hasta frenar.
function frenar($velo)
{
if ($this->velocidad > 0)
{
$this->velocidad=$velo;
}
}

$mi_coche = new vehiculo;


echo "Mi coche es de color ".$mi_coche->color."<br><br>";
echo "Su gama es ".$mi_coche->gama.".<br><br>";
echo "Ahora está parado: ".$mi_coche->velocidad."kilómetros.<br><br>";
$mi_coche->acelerar(100);
echo "Mi choche ha acelerado. Ahora avanza a ".$mi_coche->velocidad
." kilómetros por hora.<br><br>";
$mi_coche->frenar(10);
echo "Mi choche ha frenado. Ahora avanza a ".$mi_coche->velocidad
." kilómetros por hora.<br><br>";

?>

La herencia

PHP puede crear clases extendidas, es decir, clases que pueden heredar las
propiedades (variables) y métodos (funciones) de la clase original, a la vez que
pueden tener otras propiedades y métodos propios. Esta posibilidad recibe en
la POO el nombre de herencia. Así pues, se pueden crear nuevas clases
basadas en otra anterior, cuyas propiedades y métodos son recogidos en la
nueva sin necesidad de repetir todo el código.

- 202 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

La clase original se denomina parent o superclase y la clase nueva, child o


subclase.

La instrucción extends permite crear una clase a partir de su clase padre. Su


sintaxis es como sigue:

Class camion extends vehiculo


{
declaraciones (propiedades, métodos,funciones) de la clase;
}

A partir de ahora la clase camion tendrá las mismas propiedades y métodos que
vehiculo, además de los propios.

Ejemplo

<?

class vehiculo
{

// Propiedades.
public $velocidad, $color, $gama;
// Constructor: asignación de velocidad inicial,
// color y gama.

function __construct()
{
$this->velocidad = 0;
$this->color = "blanco";
$this->gama = "alta";
}

// Método acelerar. El vehículo va más rápido.


function acelerar($velo)
{
$this->velocidad=$velo;
}

// Método frenar. El vehículo va más lento


// hasta frenar.
function frenar($velo)
{
if ($this->velocidad > 0)
{
$this->velocidad=$velo;
}
}

class camion extends vehiculo


{

- 203 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

// Propiedades: añadimos una nueva propiedad.


public $peso_max;

function __construct()
{
// Es necesario invocar el constructor de la clase padre ya
// que PHP no lo hace automáticamente
parent::__construct()
$this->peso_max=1000;
}

function ver_datos()
{
echo "Los datos del camión son: <BR>".
"velocidad: <b>". $this->velocidad . "</b><BR>"
"color: <b>". $this->color . "</b><BR>"
"gama: <b>". $this->gama . "</b><BR>"
"peso máx: <b>". $this->peso_max . "</b><BR>";
}

$el_camion = new camion();


$el_camion->ver_datos();

?>

Como puedes ver, la clase camion recibe de la clase original vehiculo las
propiedades que tiene ($velocidad, $color y $gama). Por su parte incorpora al
diseño de la clase original otra propiedad (variable $peso_max) y una nueva
función, que es su constructor, llamado en esta caso ver_datos().

Hay que tener en cuenta que para las clases heredadas el


constructor/destructor de la clase padre no se ejecuta automáticamente cuando
se llama al constructor/destructor de la clase hija. Por tanto, en una clase hija
sólo se ejecuta de forma automática su propio constructor/destructor si lo hay.
El constructor/destructor de la clase original (padre) sólo se ejecuta en la clase
hija si es invocado expresamente desde ésta, tal y como hemos hecho en el
ejemplo anterior.

¿Soporta PHP la herencia múltiple?

Algunos lenguajes POO permiten la herencia múltiple, esto significa que una
subclase puede heredar de varias clases padres. PHP no permite esto y una
subclase solo puede heredar de una clase padre, sin embargo en PHP no hay
ningún tipo de restricción en cuanto al número de subclases que pueden
heredar de una misma clase padre o superclase.

- 204 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

Polimorfismo en PHP 5

Cualquier lenguaje de programación orientado a objetos debe soportar el


polimorfismo, esto significa que diferentes clases tendrán un comportamiento
distinto para la misma operación. Esto se ve más claro con el siguiente
ejemplo.

Supongamos que tenemos dos clases distintas coche y ciclomotor. Ambas


tienen sus propios métodos de movimiento, éstos tienen diferentes
comportamientos, pero su nombre es el mismo

class coche {
function avanza() {
}
function para() {
}
function girar_derecha() {
}
}

class ciclomotor {
function avanza() {
}
function para() {
}
function girar_derecha() {
}
}

Como podemos observar, ambas clases tienen los mismos métodos,


supongamos ahora que tenemos otra clase que controla el movimiento de
todos los vehículos, es aquí donde entra en juego el polimorfismo, que
dependiendo del objeto que tratemos actuará de una forma u otra el método al
que llamamos.

class movimiento {
function mover_adelante($obj) {
$obj->avanza();
}
}

Supongamos que queremos mover cualquier vehículo hacia adelante entonces


escribimos:

$obj_coche = new coche();


$obj_ciclomotor = new ciclomotor();

$obj_movimiento = new movimiento();

// con esta sentencia el coche avanzaria hacia adelante.


$obj_movimiento->mover_adelante($obj_coche);

- 205 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

// con esta sentencia el ciclomotor avanzaría hacia adelante.


$obj_movimiento->mover_adelante($obj_ciclomotor);

Como podemos ver el mismo método del objeto movimiento actúa de dos
formas diferentes dependiendo del objeto que le pasamos como parámetro.

Ámbito de variables y funciones

En la teoría de la Unidad 2 se explicó el ámbito de variables. El ámbito de una


variable o función de una clase es algo muy parecido.

Las directivas de visibilidad permiten restringir el acceso a las propiedades y


métodos de un objeto. Se puede definir anteponiendo, en la declaración de una
propiedad o un método de la clase, una de las palabras claves siguientes:

 public: significa que el acceso es público y se puede acceder a la


propiedad o método desde cualquier ámbito (parte) del código PHP.
 private: indica visibilidad privada y limitan el ámbito de acceso a la
propiedad o método desde la misma clase que la define. Es decir, no se
podrá usar desde la página principal del programa.
 protected: marca una propiedad o método como protegido y permite el
acceso desde la misma clase, desde las clases que hereden de ella
(hijas) y desde las clases parent (padres).

Cuando definimos una propiedad o un método sin indicar ninguna directiva de


visibilidad explícita, entonces PHP los marcará automáticamente con visibilidad
public.

En el caso de las variables siempre es obligatorio definirlas con public,


protected o private. En el caso de funciones puede omitirse esta palabra, en
cuyo caso PHP supondrá que está definida como public. Nota: el constructor
__construct siempre se considera una función pública.

Ejemplo de ámbito visibilidad de las propiedades:

<?

// Definimos la clase automovil


class automovil
{
public $variable_publica = 'Pública';
protected $variable_protegida = 'Protegida';
private $variable_privada = 'Privada';

function imprimir_variables()
{
echo $this->variable_publica;
echo $this->variable_protegida;
echo $this->variable_privada;
}
}

- 206 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

$objeto = new automovil();


// Se muestra la variable pública
echo $objeto->variable_publica;
// PHP muestra un error porque no se puede mostrar una variable
protegida
echo $objeto->variable_protegida;
// PHP muestra un error porque no se puede mostrar una variable
privada
echo $objeto->variable_privada;
// PHP muestra las 3 variables
$objeto->imprimir_variables();

// Definimos la clase automovil_descapotable


// que es heredada de la clase automovil
class automovil_descapotable extends automovil
{
// Podemos redeclarar la variable protegida pero no la privada
protected $variable_protegida = 'Protegida 2';

function imprimir_variables()
{
echo $this->variable_publica;
echo $this->variable_protegida;
echo $this->variable_privada;
}
}

$objeto2 = new automovil_descapotable();


// Se muestra la variable pública
echo $objeto->variable_publica;
// PHP muestra un error porque no se puede mostrar una variable
protegida
echo $objeto->variable_protegida;
// PHP muestra un error porque la variable privada no se hereda
echo $objeto->variable_privada;
// PHP muestra sólo 2 variables, la privada no se hereda
$objeto->imprimir_variables();

?>

Ejemplo de ámbito visibilidad de las funciones:

<?

// Definimos la clase automovil


class automovil
{
// El constructor siempre es público
public function __construct() { }

// Declaramos una función público


public function funcion_publica() { echo "función pública"; }

// Declaramos una función protegida


protected function funcion_protegida() { echo "función protegida";
}

- 207 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

// Declaramos una función privada


private function funcion_privada() {echo "función privada"; }

// Esta función es pública porque no se ha escrito nada


function funcion_que_ejecuta_todas()
{
$this->funcion_publica();
$this->funcion_protegida();
$this->funcion_privada();
}
}

$objeto = new automovil;


// Muestra el resultado de la fucnión pública
$myclass->funcion_publica();
// PHP muestra un error porque no se puede ejecutar una función
protegida
$myclass->funcion_protegida();
// PHP muestra un error porque no se puede ejecutar una función
privada
$myclass->funcion_privada();
// PHP ejecuta las 3 funciones
$myclass->funcion_que_ejecuta_todas();

// Definimos la clase automovil_descapotable


class automovil_descapotable extends automovil
{
// Esta función es pública
function funcion_que_ejecuta_todas2()
{
$this->funcion_publica();
$this->funcion_protegida();
// PHP muestra un error porque las funciones privadas no se
heredan
$this->funcion_privada();
}
}

$objeto2 = new automovil_descapotable;


// Muestra el resultado de la fucnión pública
$myclass->funcion_publica();
// PHP sólo ejecuta las 2 funciones porque la privada no se hereda
$myclass->funcion_que_ejecuta_todas2();

?>

Funciones para obtener información de las clases y objetos

PHP tiene ya diseñadas algunas funciones útiles para trabajar con clases y
objetos. Son las siguientes:

 method_exists(objeto, función), que comprueba si objeto tiene definida


una función. Devuelve True (verdadero) si lo está y False (falso) si no lo
está.
 get_class_vars(clase), que devuelve una matriz asociativa que lleva
como índice de sus elementos el nombre de cada variable definida e

- 208 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

inicializada dentro de la clase y como contenido el valor asignado a esa


variable.
 get_class_methods(clase), que devuelve una matriz con los valores
actuales de todas las funciones incluidas en la clase.
 get_object_var(objeto), que devuelve el nombre y el contenido de todas
la variables contenidas en un objeto.

Cómo llamar a una función de una clase sin crear un objeto

En PHP también es posible llamar a una función definida dentro de una clase
sin que sea necesario crear previamente un objeto. Para ello, hay que usar el
símbolo :: de la forma siguiente:

clase :: funcion

Esta instrucción funciona exactamente igual que si creáramos un objeto y


desde él invocáramos la función correspondiente de esta forma:

$objeto = new clase


$objeto->funcion ()

Veamos un ejemplo de cómo podemos utilizar ::

<?

class X
{
public static function mensaje()
{
echo "Esta función muestra un texto<br>";
}
}

// Aquí llamamos a la función sin crear un objeto previo.


X::mensaje();

// Pero también podemos crear un objeto


// e invocar la función a través de él.
$mensa = new X;
$mensa->mensaje();

?>

Fíjate que hemos usado la palabra reservada static antes de function dentro
de la clase. Declarar variables o funciones de clases como estáticos, los hace
accesibles desde afuera del contexto del objeto sin necesidad de crear el
objeto previamente. Debido a que los métodos estáticos son accesibles sin que
se haya creado una instancia del objeto, la pseudo variable $this no está
disponible dentro de los métodos declarados como estáticos.

Veamos ahora un sencillo ejemplo de clase. Se trata de una calculadora


elemental, que realiza las operaciones suma, resta, producto y división.

- 209 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

En el Ejemplo 5 de esta Unidad hemos creado dos clases y dos objetos


parecidos (clases: $calculadora1 y $calculadora2, objetos: $calculos1 y
$calculos2) para que se vea cómo pueden pasarse los valores que son los
parámetros tanto desde la instrucción donde se crea el objeto como desde la
utilización de sus propiedades y métodos. El programador o programadora sólo
debe saber que, para poder usar cada clase, ha de pasarle dos valores
numéricos al crear el objeto (primera) o al utilizar sus métodos (segunda).

En el Ejemplo 5 de esta Unidad hemos creado otra clase $calculadora3 que


hereda de $calculadora1 todos las propiedades y métodos, e incorpora un
nuevo método, propio, para hallar el cuadrado del número que recibe como
primer argumento.

Utilizando Eclipse PDT puedes abrir el proyecto Ejemplo 5 (Calculadora)


de la Unidad 3. Estudia el código fuente y ejecútalo para mostrar en el
navegador su resultado.

Finalmente, recordamos que las posibilidades de PHP 5 respecto a la POO son


muy amplias. En este apartado hemos visto una introducción básica sobre las
clases necesaria para este curso de iniciación. PHP 5 presenta además las
siguientes características:

 Auto carga de las Objetos.


 Constantes en Objetos.
 Abstracción de Objetos.
 Interfaces de Objetos.
 Sobrecarga de variables y funciones.
 Interacción de Objetos.
 Patrones.
 Métodos mágicos.
 La palabra reservada 'Final'.
 Clonado de Objetos.
 Comparación de Objetos.
 Reflexión.
 Type Hinting.

Si el alumno o alumna desea ampliar sus conocimientos sobre POO puede


utilizar el Manual de PHP o bien apuntarse a un curso avanzado de PHP.

En el Ejemplo 7 de esta Unidad hemos creado una clase que gestiona la


información de una Biblioteca mediante sus propiedades y métodos. Es
importante que estudies el contenido del código fuente ya que muestra de
forma práctica lo que hemos visto en este apartado.

Desde Eclipse PDT puedes abrir el proyecto Ejemplo 7 (Biblioteca) de la


Unidad 3. Estudia el código fuente y ejecútalo para mostrar en el navegador
su resultado.

- 210 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

Resumen

Hay que saber al final de esta unidad

 Adaptar al contexto cadenas con las funciones


addSlashes(), tripSlashes(), urldecode(),
urldecode() y nl2br().

 Limpiar cadenas con chop(), ltrim(), trim() y


strip_tags().

 Poner en letras mayúsculas o minúsculas cadenas


completas o parcialmente con strtoupper(),
strtolower(), ucfirst() y ucwords().

 Hallar la longitud de una cadena con strlen().

 Repetir cadenas con str_repeat().

 Modificar cadenas con strtr().

 Buscar en el interior de las cadenas con


strcspn(), strspn(), strpos(), strrpos(),
strrchr() y strstr().

 Tratar subcadenas con substr(), substr_replace(),


strtok() y parse_str().

 Invertir el texto de una cadena con strrev().

 Comparar cadenas con strcasecmp() y strcmp().

 Utilizar correctamente las funciones chr(), ord()


y number_format().

 Establecer categorias locales con setlocale().

 Comprobar la validez de una fecha con checkdate().

 Dar formato a una fecha con date() y strftime().

- 211 -
Curso de Iniciación a PHP: Unidad 3
- Más funciones del lenguaje PHP -

 Extraer correctamente información de una fecha con


getdate() y mktime().

 Leer una fecha desde una página web.

 Crear e inicializar matrices con array() y


range().

 Recorrer los elementos de las matrices con


reset(), end(), count(), next(), prev(),
current(), key(), eahc() y list().

 Convertir cadenas en matrices y viceversa con


explode() e implode().

 Ordenar matrices con arsort(), rsort(), asort(),


krsort(), ksort(), shuffle(), uasort(), usort() y
uksort().

 Modificar matrices con array_merge(), array_pad(),


array_reverse(), array_splice(), array_walk() y
array_compact().

 Extraer información de las matrices con


array_count_values(), array_keys(), array_slice(),
array_values(), extract() e in_array().

 Tratar una matriz como una pila con array_pop(),


array_push(), array_shift() y array_unshift().

 Crear y utilizar correctamente funciones de


usuario.

 Crear y utilizar correctamente clases y objetos.

- 212 -
MÓDULO 2

Operaciones con ficheros y


directorios

Unidad 4

Índice de la unidad:

1. Abrir y cerrar ficheros

2. Recorrer ficheros y leer su contenido

3. Modificar el contenido de los ficheros

4. Copiar, borrar y renombrar ficheros

5. Operaciones con directorios

6. Otras operaciones con ficheros y directorios

7. Resumen
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -

Introducción
En esta Unidad vamos a aprender a abrir y a cerrar ficheros, así como
saber mostrar su contenido.

Aplicaremos las funciones que permiten recorrer ficheros y leer su


contenido.

También, modificaremos el contenido de los ficheros, así como copiar,


borrar, renombrar y conocer sus atributos.

Finalmente, sabremos aplicar las funciones que permiten subir ficheros al


servidor y bajarlos, así como validarlos.

Abrir y cerrar ficheros


En esta Unidad 4 vamos a abordar el tratamiento de los ficheros en PHP.
Hasta el momento la información que escribíamos se perdía al cerrar el
navegador o bien debíamos guardarla en el código fuente PHP. Pero esto
último, en realidad, no es recomendable hacerlo cuando se trata de una
aplicación PHP real cuyo código está en el servidor y el cliente no tiene acceso
al mismo sino como mero usuario que se beneficia de su interpretación. Sólo
puede hacerlo el dueño de la aplicación de acuerdo con el administrador del
servidor.

Sin embargo, PHP permite guardar y recuperar información a través de los


ficheros, para lo cual dispone de funciones y procedimientos para acceder a los
mismos y a su información, así como para crearlos, destruirlos, modificar su
contenido, etcétera. PHP también puede tratar las carpetas o directorios.

En esta la Unidad, pues, vamos a estudiar de forma teórico-práctica las


diferentes operaciones que se pueden llevar a cabo con los directorios y con
los ficheros. Concretamente, en este primer apartado abordamos cómo abrir y
cómo cerrar ficheros.

En el Manual de PHP aparecen multitud de funciones de ficheros. En este


apartado nos vamos a limitar a explicar brevemente las más frecuentes y
necesarias. Nuestro objetivo es que el alumno aprenda a utilizar algunas para
familiarizarse con ellas y poder, luego, utilizar correctamente las que necesite
obteniendo información en el Manual.

Obtener el directorio por defecto

Mediante la función getcwd() se obtiene el directorio actual en donde se está


trabajando. Es decir, se trata del directorio donde se encuentra el script que
estemos ejecutando.

- 215 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -

Establecer el directorio por defecto

Aunque la función chdir() pertenece al apartado donde se trata el trabajo con


los directorios, se explica aquí por necesidad. Todas las operaciones con
ficheros que realice el alumno o alumna han de llevarse a cabo sobre los
ficheros presentes en su directorio de trabajo. Por eso, conviene que en todos
sus scripts inserte como primera línea de código esta función para fijar el
directorio donde están o deben crearse los ficheros con los que se va a
trabajar.

La función chdir() establece el directorio actual por defecto donde están


archivados o donde se van a archivar los ficheros que se utilicen para realizar
diferentes operaciones. Al ejecutarse, comprueba si el directorio pasado como
argumento existe o no. En el primer caso esta función devuelve True; en el
segundo, False. Una vez que se ha establecido el directorio por defecto, si el
camino especificado existe, ya no es necesario indicar delante del nombre de
fichero el directorio donde debe buscarse o crearse los ficheros que se usen en
el mismo script.

Su sintaxis es la siguiente:

chdir(“nombre completo de directorio”);

La mejor forma de usar esta función es incluyéndola dentro de una estructura


condicional de la forma siguiente:

if (chdir($directorio_trabajo))
echo "El directorio \"$directorio_trabajo\" existe y ha quedado
fijado como actual.</TD></TR>";
else
die ("El directorio \"$directorio_trabajo\" no existe y no se
ha podido fijar como actual. NO SE CONTINUA LA
EJECUCUION.</TD></TR>");

Puede verse cómo funciona este código en el Ejemplo 1 de esta Unidad.

Abrir un fichero

Siempre que trabajemos con ficheros para escribir, modificar o leer su


contenido, es imprescindible realizar un proceso que está integrado, al menos,
por tres operaciones:

1. Abrir el fichero.

2. Realizar las operaciones de lectura o escritura previstas.

3. Cerrar el fichero.

La función fopen() permite abrir un fichero para trabajar con el mismo. Al


ejecutarse, comprueba si el fichero pasado como primer argumento existe o no.

- 216 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -

En el primer caso esta función devuelve True; en el segundo, False. Por ello,
conviene incluir también esta función dentro de una estructura condicional que
nos informe de la apertura o no del fichero especificado.

Ésta es su sintaxis:

fopen("nombre del fichero","modo de apertura",


entero para mirar también en el camino fijado
en la instrucción include);

donde

El primer parámetro es el nombre exacto del fichero que se desea abrir. Si


dentro de este argumento se indica el directorio por no haber usado
previamente la función chdir(), es imprescindible poner las dos barras \\, para
que la barra de directorio sea interpretada correctamente, es decir, como signo
textual de directorio y no como un símbolo del lenguaje HTML.

El segundo parámetro es el modo de apertura, que debe ponerse también entre


comillas. Un fichero puede abrirse de varios modos, cada uno de los cuales se
indica con el signo correspondiente:

 'r' - Abre el fichero para sólo lectura; sitúa el puntero del fichero al
comienzo del mismo.
 'r+' - Abre el fichero para lectura y escritura; sitúa el puntero del fichero
al comienzo del fichero.
 'w' - Abre el fichero para sólo escritura; sitúa el puntero del fichero al
comienzo del fichero y trunca el fichero con longitud cero. Si el fichero no
existe, trata de crearlo.
 'w+' - Abre el fichero para lectura y escritura; sitúa el puntero del fichero
al comienzo del mismo y trunca el fichero con longitud cero. Si el fichero
no existe, trata de crearlo.
 'a' - Abre el fichero sólo para escribir (añadir); sitúa el puntero del fichero
al final del mismo. Si el fichero no existe, trata de crearlo.
 'a+' - Abre el fichero para lectura y escritura (añadiendo); sitúa el puntero
del fichero al final del mismo. Si el fichero no existe, trata de crearlo.

Además de uno de los anteriores, este argumento, denominado mode, puede


contener la letra 'b'. Esto es útil para sistemas que diferencian entre ficheros
binarios y de texto, como Windows. Es inútil en Unix. Si no se necesita, es
ignorado.

El tercer parámetro, opcional, permite indicar que la búsqueda del fichero se


haga también en el camino donde se hallan los ficheros especificados en la
orden include. En este caso, hay que poner el valor 1.

Veamos un ejemplo:

if (fopen("Ficheros_1.php","r"))
echo "<B>El fichero \"Ficheros_1.php\" existe

- 217 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -

y ha quedado abierto.</B>";
else
echo "<B>El fichero \"Ficheros_1.php\" no existe.</B>";

En las instrucciones anteriores se intenta abrir el fichero Ficheros_1.php en


modo de sólo lectura especificando que, si se puede abrir, el puntero quede al
principio del mismo.

Conviene observar que, al igual que ocurre con las matrices, en los ficheros
también hay un puntero o apuntador que señala una de las posiciones del
fichero.

Si no se hubiera usado antes la función chdir(), sería preciso haber escrito:

if (fopen(($directorio_trabajo ."/fichero1.php", "r"))

En lugar de poner una estructura de control condicional, también es posible


utilizar una sintaxis más elegante usando la función die(), que permite
devolver un mensaje al navegador del cliente y da por finalizado el script que
se está interpretando. Así quedaría el código en este caso:

@fopen("Fichero_1.php","r") or
die("<B>El fichero \"Fichero_1.php\" no se ha podido abrir.</B><P>");

De esta forma, más elegante y eficaz, se consigue evitar el mensaje de error


que se envía al cliente (por eso hemos usado el operador @) y se dejan de
ejecutar las siguientes líneas del código (gracias a la función die()). Si el
fichero existe y puede abrirse, no se muestra el mensaje y se prosigue con la
interpretación de las siguientes líneas de código.

Puede verse cómo funciona este código en el Ejemplo 1 de esta Unidad.


Como el fichero citado (Fichero_5.php) no existe, hemos comentado estas
líneas de código para que puedan seguir ejecutándose las siguientes
instrucciones. Si se quiere ver de hecho cómo funciona, el alumno puede quitar
los signos del comentario desde Eclipse PDT. Si no los vuelve a poner, no se
interpretará nunca el resto de las líneas que aparecen en el ejemplo completo.

La forma más frecuente de citar el nombre de un fichero y su identificador es


usando dos variables, una para que contenga el nombre del fichero y otra para
que contenga el identificador del mismo. Mira el siguiente código:

$fichero1="Ficheros_1.php";
$id_fichero1=@fopen($fichero1,"r")
or die("<B>El fichero \"Fichero_1.php\" no se
ha podido abrir.</B><P>");
echo "<B>El fichero \"Ficheros_1.php\" existe y ha quedado
abierto en modo lectura.</B><P>";

En la variable $fichero1 hemos guardado el nombre del fichero; la variable


$id_fichero1 contiene el identificador de fichero. Para realizar cualquier
operación con este fichero abierto, debemos utilizar el identificador creado.

- 218 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -

Si se pretende abrir un fichero en modo escritura y no existe, se intenta crear el


fichero especificado. Si existe, es preciso tener mucho cuidado con el
parámetro mode que se utilice, ya que “w” y “w+” truncan el fichero dejando
su tamaño a cero y colocando el puntero al principio del fichero. Esto quiere
decir que se perderá su contenido anterior. En cambio, “a” y “a+” no truncan
el fichero y colocan el puntero al final del fichero. Por lo tanto, el contenido
nuevo se añadirá a lo que ya había.

En el Ejemplo 1 pueden verse varias operaciones de este tipo y sus


resultados. Conviene abrir con Eclipse PDT los ficheros Ficheros_2.txt (una
vez creado) y Ficheros_3.txt después de realizar cada una de estas
operaciones, para ver su contenido y comprender bien cómo funciona cada
parámetro mode.

$fichero2="Ficheros_2.txt";

$id_fichero2=@fopen($fichero2,"w");

Con estas dos instrucciones, si el fichero Ficheros_2.txt no existía, se crea


con tamaño 0; si ya existía y tenía contenido, se deja vacío.

$fichero3="Ficheros_3.txt";

$id_fichero3=@fopen($fichero3,"a");

Con estas dos instrucciones, si el fichero Ficheros_3.txt existía, se abre y se


deja el puntero al final del mismo, disponible para añadir más contenidos; si no
existía, se crea con tamaño 0 también disponible para añadir contenidos.

Cerrar un fichero

Todo fichero que ha sido abierto debe ser cerrado una vez que se ha acabado
de realizar con él las operaciones previstas.

La función fclose() permite cerrar los ficheros abiertos. Su sintaxis es


sencilla:

fclose(nombre de identificador);

Se cierra sólo el fichero del identificador que se especifique. Al ejecutarse esta


función, se comprueba si el fichero pasado como argumento está abierto y lo
ha podido cerrar o no. En el primer caso esta función devuelve True; en el
segundo (si el fichero no existe o no está abierto), False.

Utilizando Eclipse PDT puedes abrir el proyecto Ejemplo 1 (Abrir


ficheros) de la Unidad 4. Estudia el código fuente y ejecútalo para mostrar
en el navegador su resultado.

- 219 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -

En este programa se incluyen los ejemplos cuyo código hemos ido escribiendo
junto a las funciones explicadas.

- 220 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -

Recorrer ficheros y leer su contenido

En este apartado de la Unidad 4 vamos a explicar cómo se recorre un fichero


en PHP. Muchas veces es necesario mover el puntero de ficheros a una
posición determinada desde otra previa para leer su contenido o para
modificarlo o insertar algún texto. PHP tiene también funciones que permiten
mover el puntero por el contenido de los ficheros.

Recorrer un fichero

La función rewind() sirve para colocar el puntero de acceso a los ficheros en la


primera posición. Ya hemos visto que, cuando se abre un fichero, algunos
parámetros de su argumento mode colocan el puntero en la primera posición,
pero, a lo largo de diversas operaciones con el mismo, puede suceder que no
sepamos dónde está el puntero. Para colocarlo en la primera posición,
debemos usar rewind(). Para poder realizar esta operación, lógicamente, el
fichero debe estar abierto.

Su sintaxis es la siguiente:

rewind("nombre completo del fichero" o identificador);

Por ejemplo, la instrucción rewind("Ficheros_1.php"); coloca el puntero de


ese fichero en la primera posición.

La función fseek() se utiliza para mover el puntero tantas posiciones hacia


delante (si el segundo argumento es un número positivo) o hacia atrás (si es un
número negativo) como se indique en su segundo argumento. Tiene una
sintaxis también sencilla:

fseek("nombre completo del fichero" o identificador,


número de posiciones que hay que saltar);

Por ejemplo, la instrucción fseek("Ficheros_1.php",75); coloca el puntero del


fichero en el carácter (byte) que ocupa la posición 75.

La función ftell() se utiliza para conocer en qué posición del fichero está el
puntero. Tiene esta sintaxis:

ftell("nombre completo del fichero" o identificador);

Devuelve un número entero y se usa cuando se desconoce la posición del


puntero. Suele combinarse con la función fseek() para desplazar el puntero de
forma relativa.

Por ejemplo, la instrucción ftell("Ficheros_1.php"); escrita después de


fseek("Ficheros_1.php",75); devuelve el valor 75.

- 221 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -

Si queremos mover el puntero de forma relativa diez posiciones adelante,


escribiremos la instrucción

fseek("Ficheros_1.php",ftell("Ficheros_1.php")+10);

La función feof() se utiliza para detectar si se ha sobrepasado la última


posición del fichero, es decir, si se ha alcanzado la marca de final de fichero.
Tiene esta sintaxis:

feof("nombre completo del fichero" o identificador);

Devuelve el valor lógico True si se ha alcanzado la marca de final de fichero o


False si no se ha hecho.

Por ejemplo, la instrucción feof("Ficheros_1.php"); escrita después de


fseek("Ficheros_1.php",5000); devuelve el valor True, ya que el fichero tiene
menos de 5.000 caracteres (bytes) y, por tanto, se encuentra la marca de final
de fichero.

Esta función es muy útil para leer uno a uno o línea a línea todos los
caracteres de un fichero usando un bucle while (!feof()), como estudiaremos
más adelante.

Puede verse cómo se usan las funciones explicadas en el Ejemplo 2 de esta


Unidad.

Leer los contenidos de un fichero

Hasta ahora sólo hemos accedido a un fichero y nos hemos movido por sus
caracteres, posiciones o bytes, pero en ningún momento hemos visto o
modificado su contenido. Veamos ahora cómo podemos leer un fichero.

La función fread() se utiliza para leer una cadena de un fichero abierto. Tiene
esta sintaxis:

fread("nombre completo del fichero" o identificador,


número de caracteres que se deben leer);

Si se alcanza la marca de final de fichero (feof()) antes de leer todos los


caracteres indicados, se lee hasta el final del mismo, si bien no se produce
ningún error al llegar al final de fichero.

Por ejemplo, la instrucción fread("Ficheros_3.txt",25) devuelve los 25


primeros caracteres de este fichero, pues el puntero después de abrir el fichero
con el parámetro “r” estaba al comienzo del mismo. Además, el puntero se
desplaza a la posición 26, por cual una segunda lectura parte desde esta
posición.

Puede verse el uso de esta función en el Ejemplo 2 de esta Unidad.

- 222 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -

La función fgets() hace exactamente lo mismo que la función fread() y lleva


los mismo parámetros como argumentos. Sólo se diferencian en que la función
fgets() sólo lee una cadena que, como máximo, abarca hasta que encuentre
la marca de final de línea (retorno de carro). Por ello, si el número del segundo
parámetro es superior a los caracteres de una línea, la cadena que se lee
comprenderá sólo el texto de la línea.

Con esta función incluida dentro de un bucle podemos leer línea a línea un
fichero de esta forma:

rewind("Ficheros_3.txt");
while (!feof("Ficheros_3.txt"))
{
$linea=fgets("Ficheros_3.txt",256);
echo "<B>$linea </B><P>";
}

Conviene advertir que, cuando se ejecutan las funciones anteriores, la cadena


contiene una posición menos que la indicada en el argumento, es decir, si
ponemos 10 como longitud de la cadena, se muestran 9 caracteres. Esto se
debe a los códigos de salto de línea, que se leen también, aunque no se
muestran.

La función fgetss() hace exactamente lo mismo que la función fgets(), pero


en la lectura prescinde de las etiquetas propias del lenguaje HTML. Su sintaxis
es la siguiente:

fgetss("nombre completo del fichero" o identificador,


número de caracteres que se deben leer,
"etiquetas que pueden leerse");

El uso de esta función también puede verse en el Ejemplo 2 de esta Unidad.

La función fgetc() se utiliza para leer un carácter de un fichero abierto a partir


de la posición del puntero. Tiene esta sintaxis:

fgetc("nombre completo del fichero" o identificador);

Por ejemplo, la instrucción fgetc("Ficheros_3.txt") devuelve el carácter de


este fichero sobre el que esté el puntero. Éste también se desplaza una
posición.

Usando esta función dentro de un bucle que recorra desde la primera posición
hasta la marca de final de fichero puede mostrarse el contenido completo de
éste.

Puede verse el uso de esta función en el Ejemplo 2 de esta Unidad.

La función file() también se usa para leer un fichero y asignar el texto de


cada línea a una matriz. La primera línea se coloca como elemento 0 y así
sucesivamente. En este caso el identificador que se pasa como argumento es

- 223 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -

el propio nombre del fichero y la función count() permite saber cuántos


elementos tiene la matriz para poder recorrerla posteriormente. Veamos un
ejemplo:

$matriz=file("Ficheros_3.txt");
for ($i=0;$i<count($matriz);$i++)
{
print ("<B> Elemento $i:</B> $matriz[$i]<P>");
}

La función readfile() permite también leer un fichero y enviar su contenido a


la página del cliente. Tiene la siguiente sintaxis:

readfile("nombre completo del fichero", camino de la orden include);

El segundo argumento es opcional e indica, si se pone, que el fichero se


busque también en los directorios citados en la cláusula include.

Prácticamente hace lo mismo la función fpassthru(). Esta función devuelve


True si se ha podido realizar la operación y False si no se ha hecho.

Utilizando Eclipse PDT puedes abrir el proyecto Ejemplo 2 (Leer ficheros)


de la Unidad 4. Estudia el código fuente y ejecútalo para mostrar en el
navegador su resultado.

En este programa se incluyen los ejemplos cuyo código hemos ido escribiendo
junto a las funciones explicadas.

- 224 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -

Modificar el contenido de los ficheros


En este apartado de la Unidad 4 vamos a explicar cómo se modifica el
contenido de los ficheros en PHP. Este lenguaje dispone también de funciones
que permiten modificar el contenido de los ficheros.

Modificar el contenido de un fichero

La función fputs() sirve para escribir en el fichero especificado una cadena de


caracteres del tamaño que se indique. Para poder realizar esta operación,
lógicamente, el fichero debe estar abierto. Esta función devuelve el valor lógico
True si se ha podido realizar la operación sin problema o False si no se ha
podido.

Su sintaxis es la siguiente:

fputs("nombre completo del fichero" o identificador,


cadena que se escribe,tamaño de la cadena);

El tercer argumento es opcional. Si no se pone, se escribe la cadena completa.


Si se indica, sólo se escribe el número de caracteres señalado.

Para que esta operación funcione correctamente es preciso utilizar bien el


modo de apertura del fichero. Si ha de añadirse el texto por el principio del
fichero, debemos usar el parámetro de apertura “r+”; si necesitamos añadir el
texto por el final, usaremos los parámetros de apertura “a” o “a+”; si queremos
sustituir el contenido completo del fichero, hay que poner los parámetros de
apertura “w” o “w+”.

Por ejemplo, la instrucción fputs("Ficheros_2.php","Nuevo texto");


suponiendo que el fichero se ha abierto con el parámetro “r+”, añade el texto
al principio del fichero indicado sustituyendo los caracteres originales que éste
ocupe.

La función fwrite() es idéntica a fputs() y su sintaxis lleva los mismos


argumentos, que se comportan igual que en la función explicada. Así pues,
puede usarse también en lugar de la anterior.

Utilizando Eclipse PDT puedes abrir el proyecto Ejemplo 3 (Escribir en


fichero) de la Unidad 4. Estudia el código fuente y ejecútalo para mostrar
en el navegador su resultado.

En este programa se incluyen los ejemplos cuyo código hemos ido escribiendo
junto a las funciones explicadas y otros nuevos.

- 225 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -

Copiar, borrar y renombrar ficheros. Conocer sus


atributos
En este apartado de la Unidad 4 vamos a explicar otras operaciones que
también pueden llevarse a cabo en PHP con los ficheros: copiarlos,
renombrarlos, borrarlos y conocer sus atributos.

Copiar un fichero

La función copy() sirve para hacer una copia física de un fichero en otro. Para
poder realizar esta operación, el fichero original no debe estar abierto. Esta
función devuelve el valor lógico True si se ha podido realizar la operación sin
problemas o False si no se ha podido.

Su sintaxis es la siguiente:

copy("nombre del fichero original", "nombre del fichero destino");

Por ejemplo, copy("Ficheros_2.txt","Ficheros2_2.txt"); hace una copia


exacta del primero en el segundo.

En el Ejemplo 4 de esta Unidad pueden verse varias operaciones con esta


función y las siguientes de este apartado.

Si el fichero destino existe, es sustituido automáticamente. Por eso, conviene


combinar la función copy() con la función file_exists(), que detecta si un
fichero existe, para no sustituir involuntariamente el contenido de un fichero con
el de otro. Así se hace en el Ejemplo 4.

La función unlink() sirve para borrar físicamente un fichero. Para poder


realizar esta operación, el fichero original no debe estar abierto. Esta función
devuelve el valor lógico True si se ha podido realizar la operación sin problema
o False si no se ha podido.

Su sintaxis es la siguiente:

unlink("nombre del fichero que debe borrarse");

Por ejemplo, la instrucción unlink("Ficheros_2.txt"); elimina el fichero


especificado. Si no se ha fijado con chdir() el directorio actual, hay que indicar
delante del nombre del fichero el camino completo donde se halla.

Para evitar errores, conviene combinar la función unlink() con la función


file_exists(), como hemos hecho con la función copy().

La función rename() sirve para cambiar el nombre de un fichero. Para poder


realizar esta operación el fichero original no debe estar abierto. Esta función

- 226 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -

devuelve el valor lógico True si se ha podido realizar la operación sin


problemas o False si no se ha podido.

Su sintaxis es la siguiente:

rename("nombre del fichero original","nuevo nombre del fichero");

Por ejemplo, rename("Nuevo.txt","Ficheros_2.txt"); cambia el nombre del


fichero original por el nuevo nombre.

Si ya hay un fichero con el mismo nombre, la operación no se lleva a cabo. Por


eso, conviene combinar la función rename() con la función file_exists(), tanto
para comprobar que existe el fichero original como para comprobar que no
existe otro con el nombre que se le quiere poner. Así se hace en el Ejemplo 4.

Conocer los atributos, el tipo y el tamaño de un fichero

Las tres operaciones que hemos explicado antes sólo pueden ejecutarse si el
fichero, caso de que exista, tiene el atributo de sólo lectura en estado de False.
Además, es preciso saber otras cosas para poder tratar un fichero, como si
existe o no, si el nombre indicado es un de un fichero o de un directorio y el tipo
de fichero que es. Todo esto lo vamos a ver en este apartado.

La función filesize() devuelve el tamaño de un fichero expresado en número


de bytes.

La función filetype() devuelve el tipo del fichero pasado como argumento.


Según el nombre pasado como argumento, los tipos que puede devolver esta
función son:

 file: es un fichero normal.


 dir: es un nombre de directorio.
 link: es un enlace simbólico (sólo en sistema UNIX).
 fifo: es una pila de tipo FIFO.
 char: es en dispositivo de tipo carácter, por ejemplo “C:\”.
 block: es un dispositivo de bloque.
 unknown: tipo desconocido.

La función is_dir() devuelve True si es un directorio y False si no lo es o no


existe.

La función is_executable() devuelve True si es un fichero ejecutable por el


cliente que accede al mismo y False si no lo es o no existe.

La función is_file() devuelve True si es un fichero normal y False si no lo es


o no existe.

La función is_link() devuelve True si es un enlace simbólico y False si no lo


es o no existe.

- 227 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -

La función is_writable() devuelve True si es un fichero en el que se puede


escribir y False si no lo es o no existe.

La función is_readable() devuelve True si es un fichero que se puede leer y


False si no lo es o no existe.

La función stat() devuelve una matriz con 13 elementos que contienen


información sobre el fichero, si existe. Concretamente, se informa de los
siguientes aspectos: dispositivo, i-nodo, permisos, número de enlace,
propietario, grupo, tipo de dispositivo, tamaño, instante del último acceso,
instante de la última modificación, instante del último cambio, tamaño del
bloque y número de bloques asignados. Como se ve, es una información más
bien adecuada para el administrador de un servidor. Además, algunas
informaciones sólo son propias del sistema Linux, por lo que Windows devuelve
el valor –1.

Utilizando Eclipse PDT puedes abrir el proyecto Ejemplo 4 (Gestionar


fichero) de la Unidad 4. Estudia el código fuente y ejecútalo para mostrar
en el navegador su resultado.

En este programa se incluyen los ejemplos cuyo código hemos ido escribiendo
junto a las funciones explicadas y otros nuevos.

- 228 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -

Operaciones con directorios


Obtener el directorio por defecto

Mediante la función getcwd() se obtiene el directorio actual en donde se está


trabajando. Es decir, se trata del directorio donde se encuentra el script que
estemos ejecutando.

Fijar un directorio del servidor por defecto

Ya hemos estudiado y practicado suficiente con la función chdir(), que permite


establecer un directorio como actual o por defecto. Nos remitimos a las
explicaciones dadas en el apartado Abrir y cerrar ficheros. Una vez fijado
este directorio, cualquier referencia a un fichero se buscará aquí, si no se
especifica otro camino donde deba hacerse.

Abrir un directorio

La función opendir() permite entrar en un directorio del servidor y tener acceso


a sus ficheros y subdirectorios. Es imprescindible abrir un directorio para,
después, poder cerrarlo con closedir(), leer sus ficheros con readdir() o
mover el puntero de lectura de un directorio con rewinddir().

Su sintaxis es la siguiente:

opendir("camino completo de directorio");

Esta función devuelve un identificador de directorio que nos servirá después


para hacer referencia a ese directorio, como ocurre con los ficheros.

Por ejemplo, opendir("cursoPHP5"); abre este directorio. Para que nos


devuelva un identificador que necesitaremos después, lo mejor es escribir:

$id_dircurso=opendir("cursoPHP5");

Además, como hemos hecho en los ficheros, recomendamos la siguiente


estructura, ya usada y explicada en los ficheros:

$id_dircurso= @opendir($_SERVER['DOCUMENT_ROOT']."/curso/")
or die("<B>El directorio \"/curso/\" no se ha podido
abrir.</B><P>");

En el comando anterior hemos utilizado la variable global


$_SERVER['DOCUMENT_ROOT'] que indica el directorio raíz del servidor web. Por
ejemplo, en C:\xampp\htdocs.

Es importante tener en cuenta que, al escribir el camino, la barra \ debe


escribirse doble, si bien recomendamos usar mejor la barra única / compatible
en todos los sistemas operativos.

- 229 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -

PHP dispone también de una clase que nos permite acceder y tratar los
directorios. Es la clase dir(). Para abrir un directorio funciona igual que
opendir(). Además, tiene dos propiedades, que son handle (puntero) y path
(camino), y tres métodos, que son read() (leer el nombre de un fichero o
subdirectorio), rewind() (llevar el puntero al principio de directorio) y close()
(cerrar el directorio). Dentro de esta clase pueden usarse, además, las
funciones estándar de manejo de directorios. En la Unidad anterior se explican
las clases, donde el alumno puede repasar estos contenidos, si lo necesita.

Ver cómo se usa esta clase en el Ejemplo 5.

Cerrar un directorio

La función closedir() permite cerrar un directorio del servidor. El directorio


debe haber sido abierto previamente.

Su sintaxis es la siguiente:

closedir("nombre del identificador de directorio");

Leer un directorio

La función readdir() permite leer los ficheros o directorios del directorio


abierto.

Su sintaxis es la siguiente:

readdir("nombre del identificador de directorio");

Esta función lee el nombre del fichero o directorio sobre el que esté el puntero
y avanza éste al siguiente. Lo normal es usar esta función dentro de un bucle
que vaya leyendo uno a uno los elementos (ficheros o subdirectorios) del
directorio.

Por ejemplo, podemos recorrer un directorio completo de la forma siguiente:

$id_dircurso= @opendir($_SERVER['DOCUMENT_ROOT']."/curso/")
or die("<B>El directorio \"/curso/\" no se ha podido
abrir.</B><P>");

echo "<B>Hemos abierto el directorio del servidor: ".


$_SERVER['DOCUMENT_ROOT']."/curso/</B><P>";

$directorio = dir($directorio_trabajo);
// Aquí creamos un objeto de la clase dir().
echo "Puntero: <B>".$directorio->handle."</B><P>";echo "Camino:
<B>".$directorio->path."</B><P>";
while($fichero=$directorio->read())
{
echo "$fichero<P>";
}
$directorio->close();

- 230 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -

La clase dir() también permite leer un directorio, como hemos explicado


antes.

Mover el puntero de lectura de un directorio

La función rewinddir() lleva el puntero de lectura de un directorio al principio


de éste, para poder leerlo completo si el puntero se había desplazado
anteriormente.

Su sintaxis también es sencilla:

rewinddir("nombre del identificador de directorio");

En el Ejemplo 5 de esta Unidad pueden verse varias operaciones con estas


funciones y las siguientes de este apartado.

Crear un directorio

La función mkdir() permite crear un directorio dentro del directorio actual. La


sintaxis es sencilla:

mkdir("nombre del nuevo directorio",entero octal de modo);

En UNIX hay que poner un segundo parámetro (número entero en base octal),
que indica el modo o permisos de creación. No es el caso de este curso. En
Windows debemos poner 0 en este parámetro.

Esta función devuelve el valor lógico True si se ha podido realizar la operación


sin problema o False si no se ha podido. Si no hay un directorio establecido
como actual, es preciso poner el camino completo del directorio que se quiere
crear.

Por ejemplo, las instrucciones

$nuevo_dir="Pruebas";

mkdir($nuevo_dir,0);

crean el directorio “Pruebas” dentro del directorio del proyecto PHP. Desde
Eclipse PDT, con la tecla F5 para actualizar el proyecto, puede comprobarse
que realmente se ha creado.

Si el directorio ya existe, se produce un error. Por eso, al igual que ocurre con
los ficheros, conviene comprobar con la función file_exists() si ya existe,
para no intentar crearlo en este caso.

Borrar un directorio

La función rmdir() permite borrar un directorio. Su sintaxis es también sencilla:

- 231 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -

rmdir("nombre del directorio que se quiere borrar");

Esta función devuelve el valor lógico True si se ha podido realizar la operación


sin problema o False si no se ha podido. Si no hay un directorio establecido
como actual, es preciso poner el camino completo del directorio que se quiere
eliminar. Para poder borrarse, el directorio debe existir y estar vacío.

Por ejemplo, las instrucciones

$directorio="Pruebas";

rmdir($nuevo_dir);

eliminan el directorio “Pruebas” dentro del anterior proyecto. Desde Eclipse


PDT, con la tecla F5 para actualizar el proyecto, puede comprobarse que
realmente se ha eliminado.

Si el directorio no existe o no está vacío, se produce un error. Por eso, al igual


que ocurre con los ficheros, en esta operación conviene comprobar con la
función file_exists() si existe, con el signo @ para evitar el mensaje si no
existe y con die() para mostrar un mensaje propio si existe, pero no está
vacío. Ésta sería una forma elegante de hacerlo:

$directorio="Pruebas";

if (file_exists($directorio)) @rmdir($directorio)
or die("<B>El directorio \"Pruebas\" no se ha podido borrar
al no estar vacío.</B><P>");

Si el problema consiste en que no está vacío, hay que eliminar todos los
ficheros con la función unlink() antes de intentar borrar el directorio.

Mediante Eclipse PDT puedes abrir el proyecto Ejemplo 5 (Gestionar


directorios) de la Unidad 4. Estudia el código fuente y ejecútalo para
mostrar en el navegador su resultado.

Subir ficheros al servidor, usarlos y validarlos

Con PHP el cliente de una página web también puede subir ficheros al servidor
desde su ordenador, es decir, se puede convertir en emisor de información.

La forma más frecuente de hacerlo es rellenando formularios con la información


que el website le pida, sea ésta personal, profesional o económica, a fin de
conseguir algo, como obtener datos sobre algo que le interesa, comprar algún
producto, apuntarse en un servicio, etcétera. Los datos que el usuario envía al
servidor suelen ser de tipo texto. Cuando se reciben en su destino, se procede
con ellos como convenga según la finalidad de la aplicación.

- 232 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -

Pero también es posible en PHP enviar ficheros al servidor, en formato texto o


binario. Por ejemplo, se puede remitir un fichero con el currículum vitae o una
fotografía, etcétera.

Vamos a estudiar los pasos que se dan cuando se sube un fichero al servidor:

1. Mediante un formulario se pregunta el nombre del fichero. En el Ejemplo 6


de esta Unidad se usa el script index.php para preguntar el fichero que se
quiere subir. Explicamos brevemente el código, que está compuesto
exclusivamente por etiquetas HTML.

<?

include "uni4_eje6_configura.php";
echo "<FORM ENCTYPE=multipart/form-data METHOD=post ACTION=$destino>
Nombre del fichero: <INPUT TYPE=File NAME=fichero SIZE=35>
<INPUT TYPE='hidden' name='MAX_FILE_SIZE' VALUE='51200'>
<INPUT TYPE=submit NAME=submit VALUE=Subir_al_Servidor>";
?>

En primer lugar, se usa la orden include para acceder a los datos de un fichero
de configuración (uni4_eje6_configura.php) donde hemos definido e
inicializado algunas variables que usaremos luego en este script, como
$destino, en la que se guarda el nombre del script que debe ejecutarse para
subir el fichero elegido al servidor ("uni4_eje6_sube.php") y otras que se usan
también en este último fichero, como $directorio, que es el destino del fichero
que se sube o $fr_repetida, donde se guarda la frase que se muestra al
usuario si el fichero no se ha podido subir por haber uno ya en el servidor con
el mismo nombre.

Conviene observar que el script uni4_eje6_configura.php se incluye también


en el script "uni4_eje6_sube.php".

Las etiquetas HTML nuevas son:

 ENCTYPE=multipart/form-data para poder examinar directorios al


seleccionar el fichero que se quiere subir.
 TYPE=File para indicar que el tipo de dato que se va a pasar al script
uni4_eje6_sube.php es un fichero.
 TYPE='hidden' name='MAX_FILE_SIZE' VALUE='51200' para definir una
entrada oculta (hidden) al usuario de la página en la que se fija que el
tamaño máximo (MAX_FILE_SIZE) del fichero debe ser de 50 Kb.

Cuando se selecciona un fichero y se pulsa sobre el botón "Subir al


servidor", de forma automática se pasa el fichero al servidor.

2. Recepción de
fichero en el servidor. Al ejecutarse el script
uni4_eje6_sube.php, el servidor recibe este fichero en un directorio temporal,
especificado en la variable de entorno upload_tmp_dir. En nuestro caso, este
directorio es C:\xampp\tmp. Al fichero se le pone un nombre que se inicia por

- 233 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -

php, seguido de unos números y de la extensión tmp. Por ejemplo,


Php1001.tmp. Además, de forma automática, se crea la variables nueva
$_FILES['fichero'], que nos informan de los siguientes datos:

 $_FILES['fichero']['name']: nombre original del fichero que se pasa.


 $_FILES['fichero']['tmp_name']: nombre del fichero temporal que se
sube al servidor.
 $_FILES['fichero']['size']: tamaño del fichero que se pasa.
 $_FILES['fichero'][type']: tipo del fichero que se pasa.

Pero el fichero temporal permanece sólo unos instantes en el directorio


temporal del servidor, por lo cual hay que copiarlo al directorio donde queremos
que se mantenga.

3. Copia del fichero desde el directorio temporal hasta el directorio destino. Al


llevar a cabo esta operación es el momento de hacer los controles que
creamos oportunos para que no se copie un fichero de cualquier tipo, ni se
sustituya otro que tuviera el mismo nombre, ni se sobrepase una determinado
tamaño, etcétera.

Para copiar el fichero, podemos usar las instrucciones:

$fichero_destino="$directorio".$_FILES['fichero']['name'];

move_uploaded_file($_FILES['fichero']['tmp_name'], $fichero_destino);

En cuanto a los controles anteriores a la copia, podemos hacerlos así:

 Para evitar que se copie un fichero de tamaño mayor de 50 Kb o que no


ha sido elegido en el formulario al enviar la variable $_FILES vacía,
podemos escribir:

if ($_FILES['fichero']['size']>51200 or $_FILES['fichero']['size']<1)
{
die ("<B>El fichero ocupa más de 51.200 bytes o no ha indicado
su nombre en el formulario. No puede copiarse.</B>");
}

 Para copiar ficheros de cualquier tipo, podemos escribir:

if ($subir_cualquiera=="SI")
{
$fichero_destino="$directorio".$_FILES['fichero']['name'];
move_uploaded_file($_FILES['fichero']['tmp_name'],
$fichero_destino);
}

4. Destrucción del fichero temporal. Aunque el servidor borra automáticamente


en pocos segundos el fichero temporal, es conveniente eliminarlo también
desde el propio programa para evitar que se vayan quedando en ese directorio
temporal ficheros que ya no se necesitan. Por ejemplo, el servidor puede

- 234 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -

funcionar mal, apagarse, etcétera, sin haber llegado a eliminar el fichero


temporal. Se hace con la instrucción

unlink($_FILES['fichero']['tmp_name']);

Utilizando Eclipse PDT puedes abrir el proyecto Ejemplo 6 (Subir fichero)


de la Unidad 4. Estudia el código fuente y ejecútalo para mostrar en el
navegador su resultado.

En este Ejemplo 6 de esta Unidad puede verse comentado y completo el


código anterior. En esa sencilla aplicación se elige un fichero y se sube al
servidor poniendo algunos controles de validación.

- 235 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -

Otras operaciones con ficheros y directorios


Además de las operaciones mencionadas, con los ficheros y directorios pueden
llevarse a cabo otras operaciones, como las que explicamos a continuación.

Rellenar una ventana desplegable con los ficheros de un directorio

Resulta muy cómo seleccionar uno entre varios ficheros si en una etiqueta
SELECT de HTML pueden incluirse todos los ficheros del directorio o sólo
algunos, según su tipo. En el código siguiente puede verse cómo se hace:

$directorio = getcwd() ."/";


echo "<SELECT NAME=\"$directorio\">";
$puntero=opendir($directorio);
// Avanzamos el puntero hasta el primer
// fichero sobrepasando . y ..
$fichero=readdir($puntero);

while ($fichero)
{
$fichero=readdir($puntero);
if (ereg("$",$fichero))

/* La función ereg() permite buscar cadenas


coincidentes. Pertenece a las funciones
para expresiones regulares, como eregi() y
split(), entre otras. */

echo "<OPTION VALUE='$fichero'>$fichero</OPTION><P>";


}
echo "</SELECT>";

Puede verse cómo se lleva a cabo esta operación en el Ejemplo 7 de esta


Unidad. En el mismo aparecen los parámetros que deben ponerse en la función
ereg() para que sólo se muestren los ficheros de tipo php o txt.

Transformar un fichero HTML en otro de tipo texto

Al estudiar la función fgetss() ya vimos que esta función lee un fichero y, si es


de tipo HTML, elimina las etiquetas propias de este lenguaje. Veamos cómo se
lleva a cabo esta operación:

$origen_html=fopen("uni4_eje7_fichero.html","r");
$destino_txt=fopen("uni4_eje7_fichero.txt","w")
or die ("No se puede crear el fichero destino.");

while (!feof($origen_html))
{
$linea=fgetss($origen_html,256,"");
echo "$linea <P>";
fputs($destino_txt,trim($linea)."\n");
}

- 236 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -

A veces, puede resultar útil esta rutina cuando se necesita disponer de un


fichero en cuyo contenido se hayan eliminado las etiquetas HTML y convertido
el fichero en otro nuevo de tipo texto.

Utilizando Eclipse PDT puedes abrir el proyecto Ejemplo 7 (Otras


funciones) de la Unidad 4. Estudia el código fuente y ejecútalo para
mostrar en el navegador su resultado.

En este programa se incluyen los ejemplos cuyo código hemos ido escribiendo
junto a las funciones explicadas en este apartado.

Permisos y propietarios

Cuando se trabaja en una plataforma UNIX, cosa habitual en Internet, PHP


dispone de un conjunto de funciones que permiten gestionar los permisos y
propietarios de los ficheros y de los directorios. Como este curso ha sido
creado para Windows, recomendamos al alumno o alumna que use PHP con
Unix/Linux que estudie y aprenda a usar las funciones siguientes:

 chgrp(): permite cambiar el grupo al que pertenece un fichero.


 chmod(): permite cambiar los permisos de un fichero.
 chwon(): permite cambiar el propietario de un fichero.
 filegroup(): devuelve el identificador de un grupo.
 fileowner: devuelve el identificador del usuario de un fichero.
 fileperms(): devuelve los permisos de un fichero.

- 237 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -

Resumen

Hay que saber al final de esta unidad

 Establecer un directorio por defecto con chdir().

 Abrir un fichero con fopen() o con dir(), poniendo


controles con die() y con file_exists() por si el
fichero no existe o la operación con se puede
realizar.

 Usar el operador @ y aplicar correctamente los


diversos modos de abrir un fichero, tanto de
lectura como de escritura.

 Cerrar un fichero con fclose().

 Recorrer un fichero moviendo el puntero con


fread() y con rewind().

 Mover el puntero de un fichero con fseek().

 Localizar la posición del puntero con ftell().

 Conocer si el puntero ha llegado a la marca de


final de fichero con feof().

 Leer el contenido de un fichero con feread(),


fgets(), fgetc() y fgetss().

 Leer un fichero línea a línea con file() y saber


cuántas líneas tiene con count().

 Leer el contenido de un fichero completo con


readfile() y fpassthru().

 Escribir en un fichero con fputs() y fwrite()


sabiendo aplicar en cada caso los diferentes modos
de apertura.

 Copiar ficheros con copy() combinada con

- 238 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -

file_exists().

 Borrar ficheros con unlink().

 Renombrar ficheros con rename().

 Conocer el tamaño de un fichero con filesize(), su


tipo con filetype() y sus atributos con is_dir(),
is_executable(), is_file(), is_link(),
is_writable() y is_readable().

 Conocer la información sobre un fichero que se


genera con la función stat() y se guarda en una
matriz.

 Abrir un directorio con la función opendir() y la


clase dir().

 Conocer y saber usar correctamente las propiedades


y métodos de la clase dir().

 Cerrar un directorio con closedir().

 Leer los ficheros o subdirectorios de un


directorio con readdir() o con la clase dir().

 Mover el puntero de lectura de un directorio con


rewinddir().

 Crear un directorio con mkdir().

 Borrar un directorio con rmdir().

 Subir ficheros al servidor, usarlos y validarlos.

 Rellenar una ventana desplegable (SELECT de HTML)


con los ficheros de un directorio.

 Transformar un fichero HTML en otro de tipo texto.

- 239 -
Curso de Iniciación a PHP: Unidad 4
- Operaciones con ficheros y directorios -

- 240 -
MÓDULO 2

Control de usuarios y gestión de


sesiones

Unidad 5

Índice de la unidad:

1. Cookies

2. Cabeceras

3. Control simple de usuarios

4. Gestión de sesiones

5. Control de conexiones

6. Resumen
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

Introducción
En esta Unidad vamos a conocer qué son las cookies, para qué se usan y
sus limitaciones. Además, distinguiremos los elementos que integran las
cookies, las crearemos, modificaremos y las borraremos.

Aprenderemos qué son las sesiones de usuario, para qué se usan y cómo se
gestionan.

Finalmente, aplicaremos correctamente las funciones que permiten controlar


las conexiones y operaciones que realizan los usuarios que acceden al
servidor.

Las cookies
El sistema de trabajo basado en la comunicación entre cliente y servidor web a
través de Internet puede realizarse sin que sea necesario que el primero, que
hace una solicitud al segundo y recibe de él información, necesite identificarse.
Así lo hemos hecho hasta ahora en los ejercicios de las Unidades anteriores,
más por motivos didácticos que técnicos.

Pero lo más frecuente en las comunicaciones y transacciones reales entre


cliente y servidor web es que éste obtenga información del usuario e incluso
controle y permita su acceso, así como que tenga constancia de sus
operaciones y las autorice mediante los correspondientes permisos. Esto se
logra de dos formas que vamos a abordar en esta Unidad: mediante las
cookies, que entre otras pueden tener esta misión, y sobre todo mediante el
control de usuarios y la gestión de sesiones.

Concepto de cookie

Las cookies (“galletas”, en inglés) es un mecanismo que usan los servidores


web para guardar información en el ordenador del usuario y recuperarla cada
vez que usuario vista la página. Se basa en utilizar unos ficheros de texto muy
pequeños que contienen información del propio cliente. El servidor solicita al
usuario algunos datos, que se guardan en el disco duro del propio cliente
(navegador) y pueden ser recuperados después por el servidor en sucesivas
conexiones. Así, el servidor puede comprobar de alguna forma si ese usuario
ya ha solicitado una información determinada o contestado a alguno de los
cuestionarios propuestos, para poder seguir sus conexiones, orientarle sobre lo
solicitado, almacenar datos de conexión, carrito de la compra, preferencias,
etcétera.

La información se guarda en el ordenador del usuario en un fichero en formato


texto y está formada por parejas: nombre de la cookie y su valor.

- 243 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

Las cookies son usadas con bastante frecuencia por las web que necesitan
llevar un control de los usuarios que las visitan y las consultas que hacen,
sobre todo las que se dedican al comercio electrónico, que almacenan en ellas
los códigos de los productos que consultan, para poder recuperarlos
directamente de este fichero si el cliente vuelve a visitarlas.

No es lugar éste para discutir la moralidad de este procedimiento que, según


algunos, atenta contra la privacidad del usuario. En todo caso, conviene saber
que la información que puede contener una cookie es muy elemental y básica,
y no puede incluir información reservada o crítica, como claves personales,
números de cuentas corrientes o de tarjetas de crédito, etcétera. De todas
formas, son los administradores de los servidores y sus dueños quienes
deciden qué información solicitan y, por tanto, los responsables de su recogida
y usos. También el usuario puede completarla o no, según sus conveniencias.

La Comisión Europea publicó en Diciembre de 2009 la Directiva 2009/136/CE


que legisla la utilización de las cookies por los sitios web. Por esto, cuando
accedes por primera vez a una web que usa cookies, ésta debe mostrar la
información correspondiente sobre su política de cookies. Por ejemplo,
podemos ver este tipo de mensajes:

Casi todos los navegadores, como Firefox, Chrome o Internet Explorer, sólo
admiten un número máximo de cookies en total (unas 300 dependiendo del tipo
de navegador y sin cumple la directiva de estándar RFC 2109). Además, el
tamaño máximo por cookie es de 4 Kb (4.096 bytes), por lo cual no hay que
tener miedo de que saturen la capacidad del disco duro.

Información de las cookies

La información de una cookie está definida en el protocolo HTTP e integrada


por los siguientes datos, que constituyen los parámetros de la función que la
crea:

1. Nombre de la cookie.

2. Valor, que es el contenido de la cookie.

3. Fecha de caducidad: periodo de vigencia durante el cual puede ser


recuperada por el servidor.

4. Dominio dentro del cual es válida la cookie. Si no se especifica, sólo es


válida para el dominio del servidor que la generó. El navegador devuelve la
cookie a cualquier equipo que tenga el dominio especificado.

5. Ruta: por defecto es “/”, es decir, el directorio raíz de las páginas a las que
se devuelve la cookie.

- 244 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

6. Seguro: por defecto está desactivado (Disabled), pero puede especificarse


este parámetro para establecer un canal seguro del protocolo HTTPS si se
necesita por tratarse de una información confidencial.

Al estudiar las funciones de creación y manejo de las cookies, se verá cómo


incluir estos parámetros dentro de la función correspondiente.

El lenguaje PHP dispone de funciones para crear, leer y borrar cookies. De


ellas vamos a tratar en los apartados siguientes. Si lo quiere, el alumno o
alumna, a partir de ahora, puede incluir este procedimiento en las aplicaciones
que escriba. En el manual de PHP puedes encontrar un capítulo dedicado a las
cookies.

Crear, leer y borrar cookies

La función setcookie() crea y envía al cliente una cookie estableciendo los


elementos que la integran. Su sintaxis es la siguiente:

setcookie ("nombre de la cookie", $valor, fecha de caducidad,


ruta, dominio, seguro);

De estos seis parámetros sólo es imprescindible el primero, nombre de la


cookie. Si no se pone el segundo, se crea la cookie, pero a la vez se borra en
el ordenador del cliente. Los tres parámetros siguientes, si no se ponen, toman
el valor que esté fijado en la configuración del servidor. El último, si no se pone,
queda deshabilitado. Si se quiere habilitar, hay que poner el valor 1. Para saltar
un parámetro cuando hay que poner otro posterior, deben ponerse las comas y
entre ellas una cadena vacía (,"",) en $valor, ruta y dominio. En el caso de
fecha de caducidad y seguro hay que poner un número entero (número de
segundos en la fecha) o 0 (en seguro) si no se quiere fijar expresamente.

La función setcookie() crea y envía una cookie al cliente juntamente con la


cabecera de la página. Por eso, es absolutamente imprescindible escribir esta
función antes que las etiquetas <HTML> o <HEAD>, incluso sin poner delante
espacios ni líneas en blanco, para que sea la primera que se ejecute al
procesarse el script PHP. De lo contrario, se produce un error indicando que no
puede añadirse la información de la cabecera.

Hay que tener en cuenta que, cuando se crea una cookie, es enviada al
cliente, por lo cual no se puede ver hasta que se carga de nuevo la
página. Si se han incluido en el mismo script las dos operaciones (crear cookie
y ver su contenido), debe ejecutarse la página dos veces para que se muestre
el valor que tenga en la segunda carga.

IMPORTANTE: al utilizar la función setcookie() hay que tener la precaución


de escribir el contenido de la página después de crear las cookies con esta
función, ya que, si no, PHP mostrará un aviso y no se creará la cookie. Esto
ocurre porque las cookies se crean mediante cabeceras de respuesta HTTP y
estas cabeceras se envían antes del contenido de la página, es decir, cuando
PHP encuentra una instrucción que escribe texto, cierra automáticamente la

- 245 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

cabecera y la envía al navegador del visitante; si, a continuación, PHP


encuentra la función setcookie(), aparecerá un aviso porque ya se han
enviado las cabeceras y, por lo tanto, no puede crear la cookie. En el siguiente
apartado de esta Unidad estudiaremos cómo gestionar cabeceras HTML con
PHP.

En el ejemplo siguiente vemos un código incorrecto, ya que usa la función


setcookie() después de haber escrito texto:

<?php
// La sentencia siguiente es incorrecta
print "<p>Hola mundo</p>\n";
setcookie("frase", "Adios");

?>

PHP mostrará el siguiente mensaje de avisto:

<p>Hola mundo</p>
Warning: Cannot modify header information – headers already sent by
(output started at index.php on line 2) in index.php on line 3

Hay que tener en cuenta que unas líneas en blanco al principio del fichero PHP
(antes de la etiqueta <?PHP) también se considera contenido de la página web
y aparecerá el error anteriormente mostrado.

Nota: en algunos servidores PHP, este código incorrecto puede no generar un


mensaje de aviso y la cookie puede crearse, dependiendo de la configuración
de la directiva output_buffering. Esta directiva se estudia en el curso
Avanzado de PHP de Mentor, aquí sólo indicamos que se trata de un buffer
intermedio para reducir el tráfico de salida del servidor que permite crear
cookies en cualquier parte del código PHP.

Veamos varios ejemplos donde se crean cookies con diferentes parámetros:

$usuario="Jorge";

setcookie("Nombre", $usuario);

crea una cookie denominada nombre que contiene el valor “Jorge”. También
podíamos haber escrito más directamente

setcookie("Nombre","Jorge");

Podemos fijar su caducidad de esta forma:

$pieza="Tornillo";

setcookie("Hierro", $pieza, time()+300);

- 246 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

En el tercer parámetro indicamos que dure 5 minutos (300 segundos) a partir


del momento en que se crea. Si queremos que dure hasta las 12:30:00 del día
31 de julio de 2014, podemos escribir también:

setcookie("Hierro", $pieza, mktime(12,30,0,7,31,2014);

Al crearse la cookie anterior se crea a la vez una variable, que tiene como
nombre el nombre de la cookie ($_COOKIE["Nombre"]) y como contenido su
valor ("Jorge"). Esta variable permanece con un ámbito global hasta que
caduque la cookie.

Las variables que contienen cookies son almacenadas por PHP en un array
denominado $_COOKIE["nombre de la variable"]. De esta forma podemos
leer y mostrar cada cookie si conocemos su nombre:

print ("La cookie nombre tiene el valor ".$_COOKIE["Nombre"].".");

o recorrer con un bucle toda la matriz de cookies y leer su índice y su valor:

while( list($nombre, $contenido) = each($_COOKIE) ) {


print ("La cookie <B>$nombre</B> tiene el valor
<B>".$contenido."</B><P>");
}

La forma más frecuente de usar las cookies en Internet es haciendo que el


usuario introduzca los datos mediante un formulario la primera vez que entra en
la página. El código puede ser similar al siguiente:

<?
if ( (isset($_POST["accion"])) && ($_POST["accion"]=="crearcookie") )
{
setcookie("usuario",$_POST["tu_nombre"],time()+60);
echo "Hola, ".$_POST["tu_nombre"].". Bienvenido a nuestra
página web. ¡Actualiza la página para ver
los datos de la cookie almacenada!<P>";
if (isset($_COOKIE["usuario"]) and $_COOKIE["usuario"]!="")
print ("La cookie <B>usuario</B> tiene el valor
<B>".$_COOKIE["usuario"]."</B><P>");
}
else

echo "<FORM ACTION=\"index.php\" METHOD=POST>


<INPUT TYPE=\"hidden\" NAME=\"accion\"
VALUE=\"crearcookie\">
Nombre de usuario:
<INPUT TYPE=\"text\" NAME=\"tu_nombre\">
<INPUT TYPE=\"submit\" VALUE=\"Enviar\">
</FORM>";

?>

Cuando se ejecuta este código por primera vez, como $_POST["accion"] no es


igual a “crearcookie”, se ejecutan las líneas del formulario HTML, dentro de la

- 247 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

cláusula else. En estas líneas se establece que al pulsar el botón “Enviar” se


vuelva a ejecutar el mismo script (ACTION="index.php"), se asigna a la variable
$_POST["accion"] el contenido “crearcookie” (INPUT TYPE="hidden"
NAME="accion" VALUE="crearcookie") y se pregunta el nombre del usuario en
una ventana (Nombre de usuario: <INPUT TYPE="text" NAME="tu_nombre").
Cuando se pulsa “Enviar” en la variable $_POST["tu_nombre"] pasa el contenido
y se crea la cookie usuario con el contenido que haya en $_POST["tu_nombre"]
y se le asigna una caducidad de un minuto (setcookie
("usuario",$_POST["tu_nombre"], time()+60);). Para ver el contenido
guardado en la cookie es necesario ejecutar el script por segunda vez
actualizando la página.

Puedes ver cómo funciona un código más completo en el Ejemplo 1.

Utilizando Eclipse PDT puedes abrir el proyecto Ejemplo 1 (Cookie) de la


Unidad 5. Estudia el código fuente y ejecútalo para mostrar en el navegador
su resultado.

Si lo ejecutas, verás que aparece la siguiente página:

Para eliminar una cookie basta escribir la función setcookie() incluyendo


como único argumento el nombre de la cookie que se quiere eliminar. Por
ejemplo, la instrucción setcookie("Nombre"); borra la cookie del mismo
nombre.

ATENCIÓN: para borrar la cookie en algunos navegadores es necesario indicar


un tiempo anterior al actual con la instrucción: setcookie("Nombre", "",
time()-1000);

En el Ejemplo 1 de esta Unidad hacemos desaparecer la cookie creada


pulsando en el botón apropiado y utilizando esta función.

Para modificar una cookie basta escribir de nuevo la función setcookie()


incluyendo los nuevos argumentos y usando el nombre de la cookie que se
quiere editar.

Como hemos visto, a las cookies se les puede poner limitaciones de tiempo
(parámetro expire de caducidad), de camino dentro del cual pueden ser vistas

- 248 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

(parámetro path de ruta), de ámbito dentro del servidor (parámetro domain de


dominio) y de protección de la privacidad (parámetro secure de seguridad).

Cookie de tipo matriz

También podemos asignar varios valores a una misma cookie. Esto es útil y
necesario para no alcanzar el límite de cookies permitido por el navegador del
usuario. Para hacerlo, usamos una matriz que tenga tantos elementos como
valores queramos que contenga la misma cookie. Podemos crearla así:

setcookie("Libro[0]","El médico",time()+300);

setcookie("Libro[1]","Noah Gordon",time()+300);

setcookie("Libro[2]","1992",time()+300);

Después, podemos leer y mostrar su contenido con un bucle for accediendo


con el índice a cada elemento de su nombre, como en los casos anteriores.

Utilizando Eclipse PDT puedes abrir el proyecto Ejemplo 2 (Cookie


matriz) de la Unidad 5. Estudia el código fuente y ejecútalo para mostrar en
el navegador su resultado.

Si ejecutas este programa puedes ver una página que, mediante una cookie de
tipo matriz, muestra las últimas visitas que ha realizado el visitante a la página
en orden cronológico y permite eliminar las cookies almacenadas en el
navegador:

- 249 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

Cabeceras de los documentos HTTP, HTML y URL


Hemos comentado en el apartado anterior que es absolutamente
imprescindible escribir la función setcookie() antes que las etiquetas <HTML> o
<HEAD>, incluso sin poner delante espacios ni líneas en blanco, para que sea la
primera que se ejecute al procesarse el script PHP antes de que el servidor
envíe alguna salida al cliente. Aprovechamos este momento para hablar de las
cabeceras de los documentos que generan páginas web.

Las cabeceras contienen diversos datos, unos para ofrecer información y otros
para que la página se muestre con determinadas características. Por ejemplo,
pueden incluir textos que deben aparecer, claves para que los buscadores
puedan encontrarlas, información sobre los créditos de la aplicación, control de
la memoria caché de navegador, especificación del tiempo de refresco de la
página, etcétera. En la Cabecera reside información acerca del documento y,
generalmente, el usuario no aprecia su contenido cuando navega en Internet.
Es importante recordar que estos elementos son opcionales, es decir, no son
obligatorios o necesarios para la realización de una página web.

En lenguaje HTML una cabecera define una propiedad de la página y los


atributos de esa propiedad. En este lenguaje cada cabecera va precedida de la
palabra META. Por ejemplo,

<META NAME="Autor" CONTENT="J.J. Caballero">.

En la dirección http://www.w3.org/Protocols/rfc2068/rfc2068 y en la dirección


http://vancouver-webpages.com/META/ hay información sobre las etiquetas
que se usan en HTML dentro de las cabeceras y para qué sirven.

PHP dispone de la función header() para enviar cabeceras HTTP desde este
lenguaje. Su sintaxis es sencilla:

header(cadena con el nombre de la cabecera y su valor);

Al igual que pasa con setcookie(), para que funcione correctamente, hay
que poner esta instrucción al principio del script, antes de que se envíe
ninguna salida al navegador del cliente.

Por ejemplo, la instrucción

header("Expires: Mon, 20 Jul 2014 22:00:00 GTM");

establece que el documento HTML generado con esta cabecera y presente en


la caché de un servidor proxy o del mismo navegador del cliente expira el día
20 de julio de 2014 a las 10 de la noche.

Conviene observar que el nombre de la etiqueta (Expires) es propio del


lenguaje HTML y, por tanto, para saber cuáles son y lo que hace cada una, se

- 250 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

puede recurrir a la segunda dirección de Internet que hemos indicado más


arriba.

La instrucción

header("Content-Type: text/html");

establece el tipo de documento que será válido en el navegador del usuario, en


este caso los documentos de tipo texto o planos.

Utilizando Eclipse PDT puedes abrir el proyecto Ejemplo 3 (Cabeceras) de


la Unidad 5. Estudia el código fuente y ejecútalo para mostrar en el
navegador su resultado.

Si ejecutas este programa verás que la página no se guarde en la caché del


navegador y que se recargue automáticamente cada 10 segundos:

- 251 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

Control simple de usuarios


El control de usuarios de una aplicación en Internet es uno de los
procedimientos más frecuentes y comunes, de forma que sólo puedan acceder
a determinadas páginas aquellas personas que sean reconocidas y estén
autorizadas en sus diferentes perfiles. De este asunto vamos a tratar
precisamente en el presente apartado.

Las distintas acciones que se llevan a cabo para verificar la validez de un


usuario se agrupan en tres operaciones lógicas: Autenticación, Autorización y
Control de Acceso:

 Autenticación: proceso por el cual se verifica la identidad de una


persona.
 Autorización: proceso que verifica que un usuario con una identidad
conocida, tiene acceso al recurso solicitado. Para llevar a cabo esta
acción, se suelen utilizar listas de permisos en las cuales se enumeran
cada una de las acciones que puede realizar un usuario, o las que no
puede hacer. Normalmente, para simplificar la gestión de estos ficheros,
los usuarios se suelen unir en grupos proporcionando los permisos al
grupo.
 Control de acceso: proceso que verifica que la máquina desde la que
se ha hecho la petición, tiene acceso al recurso. Los controles de acceso
se utilizan para limitar y controlar los equipos tienen acceso a un recurso
independientemente del usuario que accede, ya que estos controles se
llevan a cabo antes de que se realice el proceso de autenticación. Por
ejemplo, un servidor web interno de una empresa debe ser sólo
accesible desde sus oficinas (Intranet) y no desde Internet.

Como sabemos, este control de Autenticación suele hacerse preguntando un


nombre o identificador de usuario (id o login) y una clave o contraseña
(password). Generalmente, esta validación de los usuarios que acceden a un
servidor web suele ser llevada a cabo por el propio servidor. Pero también es
posible hacerlo enviando en la cabecera una solicitud de validación para entrar
en una aplicación concreta.

Para que una aplicación pueda obtener un nombre de usuario y una


contraseña, es preciso dar los siguientes pasos:

1. El servidor debe remitir al cliente una cabecera de validación.

2. El navegador del cliente pregunta al usuario, en un cuadro de diálogo, el


nombre de usuario y su contraseña.

3. El navegador proporciona al servidor estos datos y solicita cargar la página,


cosa que sucede si hay coincidencia de ambos datos con los que contiene el
servidor.

- 252 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

Expliquemos paso a paso este proceso suponiendo que no es el servidor quien


controla externamente este proceso de validación de usuarios, sino que se
hace a través de las cabeceras oportunas utilizando PHP.

 Para remitir la cabecera de validación, hay que utilizar las dos


instrucciones siguientes, que envían dos cabeceras:

header('WWW-Authenticate: Basic realm="Curso de PHP 5"');

header('HTTP/1.0 401 Unauthorized');

Si se necesita conocer el valor de los argumentos HTTP/1.0 (HyperText


Transfer Protocol), puede buscarse información en la dirección de Internet
http://www.w3.org/Protocols/HTTP/1.0/spec.html.

 Al enviar estas cabeceras de validación, PHP presenta un cuadro de


diálogo solicitando el nombre y la contraseña. Este cuadro de diálogo
puede ser diferente en cada navegador.
 Una vez leídos los valores, estos dos datos se asignan a las variables de
entorno $_SERVER['PHP_AUTH_USER'] (nombre de usuario) y
$_SERVER['PHP_AUTH_PW'] (contraseña).

Como puede ocurrir que ninguna de las dos variables de entorno citadas
($_SERVER['PHP_AUTH_USER'] y $_SERVER['PHP_AUTH_PW']) esté definida porque
el usuario todavía no se ha validado, conviene utilizar el control condicional if
(!isset( $_SERVER['PHP_AUTH_USER'])) para prevenir posibles errores.

Mediante Eclipse PDT puedes abrir el proyecto Ejemplo 4 (Control


usuarios) de la Unidad 5. Estudia el código fuente y ejecútalo para mostrar
en el navegador su resultado.

En Ejemplo 4 de esta Unidad puede verse el código completo de una


aplicación que utiliza este procedimiento de validación:

- 253 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

Una vez que tenemos el nombre de usuario (curso) y su contraseña (123),


podemos comprobar de múltiples formas si son correctos y darle acceso a la
página que pretende ver:

El procedimiento más elemental es comparar la información que nos


proporciona el usuario en ambos apartados del cuadro de diálogo con los datos
que tengan asignados dos variables y comprobar su coincidencia, en cuyo caso
se le permite el acceso. De no ser así, se muestra un mensaje indicando que
no está autorizado. En el Ejemplo 4 de esta Unidad lo hacemos así.

- 254 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

Un procedimiento más completo y frecuente es acceder a una base de datos o


a un fichero de texto donde estén archivados los nombres y contraseñas de los
usuarios autorizados y comprobar si los que ha proporcionado el cliente están
dentro de ese fichero o de la base.

También es posible hacer esta validación de usuarios intentando una conexión


a una base de datos con la información proporcionada por el usuario. Como
todavía no hemos abordado las bases de datos, pondremos algún ejemplo de
estos dos últimos procedimientos en ese momento.

Otro tema relacionado con la validación de usuarios es la revalidación de un


usuario en un momento dado. Si un usuario deja abierto su navegador,
cualquier otra persona puede acceder a su información. Es más, algunos
navegadores ofrecen la posibilidad de guardar los datos de acceso en la
memoria caché, con lo cual es fácil acceder utilizando esa información sin
necesidad de ser el usuario autorizado ni conocer su nombre y contraseña. Por
esto es mejor utilizar las Sesiones de usuario que se verán en el siguiente
apartado.

Control de usuarios delegada en Apache

El servidor web Apache dispone de varios sistemas de Autenticación que se


gestionan mediante diferentes módulos, dependiendo de la forma de
implementación. Si se gestiona mediante ficheros con listas de usuarios y
contraseñas (cifradas) se deberá utilizar el módulo mod_auth. Si, se lleva a
cabo mediante base de datos hay que utilizar los módulos mod_auth_dbm.

En apache la Autorización a recursos es gestionada o bien mediante la


directiva <directory> en el fichero principal de configuración, o bien mediante
la configuración de la carpeta a través de ficheros .htaccess.

Autenticación y autorización de usuarios en Apache mediante mod_auth

Para configurar el servidor Apache para que sea capaz de autenticar a los
usuarios y verificar la autorización del mismo al recurso solicitado, es necesario
realizar las siguientes operaciones:

1. Crear un fichero con usuarios.


2. Crear un fichero con grupos de usuario (si fuera necesario).
3. Definir las directivas en el fichero de configuración del servidor o
mediante un fichero .htaccess.

Para dar de alta usuario en Apache ejecutamos en el directorio “bin” del


servidor Apache el siguiente comando:

C:\xampp\apache\bin>htpasswd -c C:\xampp\apache\conf\usuarios
admin
New password: *****
Re-type new password: *****
Adding password for user admin

- 255 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

El parámetro -c se indica que se debe crear un fichero nuevo, por lo que sólo
se deberá poner la primera vez que se crea el fichero. En este caso hemos
almacenado el nuevo usuario “admin” en el directorio “conf” del servidor Web.
Para acceder al nuevo fichero de usuarios creado, abrimos el Panel de control
de XAMPP y pulsamos en la opción mostrada en la siguiente captura de
pantalla:

En este directorio podemos ver el fichero “usuarios” recién creado:

- 256 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

En este fichero de usuarios de Apache, en cada línea se especifica un usuario,


escribiendo el nombre de usuario separado de dos puntos, seguido de la
contraseña cifrada con MD5. En el caso del usuario admin/admin el contenido
del fichero es éste:

admin:$apr1$IvxgJjXC$TLlxWN/GZhyGJ7Q2odIcd/

Los módulos de Apache que intervienen en la autenticación y autorización


básica de usuarios son core y mod_auth.

Las directivas de mod_auth necesarias para configurar la autenticación y


autorización son las siguientes:

 AuthUserFile: especifica la ruta donde se encuentra el fichero de


usuarios.
 AuthGroupFile: indica la ruta donde se almacena el fichero de grupos.

Las directivas del módulo core que complementan la configuración son:

 AuthType: selecciona el tipo de autenticación de usuarios que se utilizará


que puede variar en distintos directorios. Puede contener los valores
posibles son Basic (transferencia de claves en texto claro) y Digest
(transferencia de claves cifrada).
 AuthName: especifica un nombre del dominio para el cual se solicita el
acceso, este nombre figurará en la pantalla de navegador donde se pide

- 257 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

la clave y, a su vez, servirá para que el cliente identifique la contraseña


que debe utilizar al enviar una petición a un área determinada.
 Require: indica los usuarios que pueden acceder a un área determinada
mediante sus nombres o grupos.

En el Ejemplo 4 de esta Unidad en el subdirectorio “usuario_apache” podemos


encontrar el fichero .htaccess que contiene este texto:

AuthType Basic
AuthName "Curso PHP 5"
AuthBasicProvider file
AuthUserFile C:\xampp\apache\conf\usuarios
Require valid-user

Este archivo de autenticación indica: el tipo de autenticación debe ser Básica


(AuthType Basic), el nombre de autenticación es “Curso PHP 5” (etiqueta
AuthName), la autenticación se realiza mediante un fichero de texto
(AuthBasicProvider file), dónde se encuentra este fichero de usuarios
(AuthUserFile C:\xampp\apache\conf\usuarios) y se requiere un usuario
válido para acceder al directorio (Require valid-user).

Utilizando Eclipse PDT puedes abrir el proyecto Ejemplo 4 (Control de


usuarios) de la Unidad 5. Estudia el código fuente y ejecútalo para mostrar
en el navegador el resultado de la gestión delegada de Apache en PHP.

En este caso que usamos la validación externa delegada que dispone el


servidor Apache usamos la variable $_SERVER['REMOTE_USER'] para conocer la
identidad del usuario que se ha validado externamente.

Si ejecutas el programa y haces clic en el enlace “Pulsa aquí para la


validación usuario Apache” y escribes el usuario admin/admin en la ventana
emergente que aparece verás que se accede correctamente al contenido del
directorio usuario_apache:

- 258 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

Gestión de sesiones
La gestión de las sesiones de usuario facilita considerablemente el trabajo del
desarrollador de una aplicación web para controlar la navegación del usuario
por las páginas del servidor.

Mediante las sesiones se puede saber qué operaciones realiza el cliente a lo


largo de su navegación, dato que deben conocer las aplicaciones que tengan
que controlarlo, como son las de comercio electrónico, las de transacciones
bancarias o las que tienen una cesta de la compra, en las que suelen
proporcionarse y transmitirse datos confidenciales que exigen mejor gestión de
las sesiones.

Una sesión se crea en el momento en que un usuario entra en un website


pudiéndose identificar o acceder anónimamente. Al entrar, se genera un
identificador (id), que puede seguirse mientras esté conectado para saber qué
informaciones obtiene o qué operaciones realiza el citado usuario. Los datos de
la sesión asociados a este identificador se guardan en el servidor dentro de un
fichero en el directorio especificado en la sección [Session] del fichero de
configuración php.ini. Concretamente, al instalar el Curso hemos fijado el
camino siguiente para guardar este identificador, como puede verse en el
fichero citado antes:

session.save_path = "C:\xampp\tmp"

Hay dos maneras de propagar el id del usuario entre las diferentes páginas :

 Mediante Cookies.
 A través de Parámetros URL.

Debido a que el método ideal consiste en utilizar cookies, vamos a centrarnos


en éstas.

Este identificador tiene un tiempo de vida y, por tanto, la sesión que lo ha


creado también caduca. Este tiempo puede fijarse en el fichero php.ini dentro
de la variable session.cookie_lifetime, que está establecido por defecto a 0
para que caduque cuando se cierre el navegador. Si se establece otro valor, la
sesión caducará al pasar esos segundos y no es necesario cerrar el
navegador.

La diferencia con respecto a las cookies consiste en que, en el caso de las


cookies, la información se guarda íntegramente en el ordenador del usuario y
se envía en cada petición al servidor web, mientras que en las sesiones, la
información se guarda en el servidor. En el manual de PHP en Internet se
ofrece un capítulo dedicado a las sesiones.

La gestión de una sesión se puede se divide en tres procesos:

 Creación o inicio de la sesión

- 259 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

Si una página PHP crea una sesión utilizando la función correspondiente


que veremos más adelante, el servidor asocia el navegador del usuario
con un identificador de usuario único. Este identificador se guarda en el
navegador del usuario mediante una cookie o, si no se permite la
creación de cookies, añadiendo el identificador en la dirección de la
página como un parámetro de tipo GET.

 Utilización de la sesión

Una vez está establecida la sesión, las páginas solicitadas por el mismo
navegador pueden guardar y recuperar información del servidor usando
el identificador de usuario. Esta información se guarda hasta que el
usuario o el servidor destruyen la sesión.

 Destrucción o cierre de la sesión

Tanto el usuario como el servidor web pueden cerrar la sesión. El


usuario puede destruir la sesión cerrando el navegador. El servidor
puede destruir la sesión cuando alguna página utilice la función
correspondiente que veremos más adelante o haya pasado cierto tiempo
de inactividad por parte del usuario, es decir, la sesión temporice.

Funciones para manejar las sesiones desde PHP

PHP incorpora funciones para gestionar las sesiones de usuarios. El nombre


de todas se inicia con el prefijo session seguido de _ y del nombre de la función
que realizan.

Abrir una sesión y conocer los datos de la misma

La función session_start() abre una nueva sesión de trabajo o prolonga la


que ya está abierta conservando su identificador. Su sintaxis es sencilla:

session_start();

IMPORTANTE: de igual forma que ocurre con las cookies, hay que tener la
precaución de utilizar la función session_start() antes de empezar a escribir
el contenido de la página, ya que si no PHP mostrará un mensaje de aviso y no
se creará la sesión. Como hemos comentado, el identificador de la sesión se
utiliza en las cabeceras de respuesta HTTP (como Cookie o como parámetro
GET) y las cabeceras se envían antes del texto de la página.

Todas las páginas que quieran gestionar sesiones de usuario deben incorporar
esta función o bien se puede establecer en el fichero php.ini dentro de la
variable session.autostart=1 para no tener que incluir esta sentencia en los
scripts php.

Una vez ejecutada esta función, se crea una cookie en el ordenador del usuario
o se lee la almacenada. Además, se guarda la información de la sesión en un

- 260 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

fichero en el directorio del servidor especificado en session.save_path del


fichero php.ini.

Diversas funciones nos permiten acceder a los datos de la sesión abierta.


Veamos cuáles son.

La función session_name() devuelve y/o establece el nombre de la sesión


abierta en ese momento. Se utiliza como nombre de la cookie. Por defecto es
PHPSESSID, pero podemos cambiarlo poniendo como argumento de esta función
otro nombre diferente.

Por ejemplo, la instrucción

print(session_name());

devuelve el valor de PHPSESSID.

y las instrucciones

session_name("Mi_sesión");

print(session_name());

devuelve Mi_sesión.

La función session_save_path() devuelve y/o establece el camino donde se


guardan el fichero con los datos de un identificador de sesión.

Por ejemplo, las instrucciones

session_save_path("C:/XAMPP/htdocs/curso/tmp/");

print(session_save_path());

devuelve C:/XAMPP/htdocs/curso/tmp/ y, además, desde este momento, la


sesión abierta guarda el identificador y los datos de la sesión en un fichero en
este directorio.

La función session_id() devuelve y/o establece el nombre del identificador de


la sesión en curso. Hay que tener en cuenta que esta identificación es
absolutamente imprescindible para el manejo y control de las sesiones de un
usuario, pues identifica el nombre de la cookie que se guarda en el ordenador
del usuario.

Por ejemplo, la instrucción

print(session_id());

devuelve el valor de PHPSESSID.

- 261 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

y las instrucciones

session_id("La sesión del curso");

print(session_id());

devuelve La sesión del curso.

Registrar la información de una sesión

Todos los datos devueltos por las funciones anteriores sólo permiten crear
sesiones, destruirlas e identificarlas. Pero lo verdaderamente importante es
poder asociar información sobre las operaciones y desplazamientos de un
cliente por una aplicación web. En este apartado vamos a estudiar las
funciones que permiten guardar esta información y acceder a ella
posteriormente.

A través de un ejemplo vamos a explicar cómo se guardan los datos de una


sesión.

<?php

session_start();
$_SESSION["usuario"]="Ana";
$_SESSION["hora"]=time();
$_SESSION["pagina"]="$_SERVER["PHP_SELF"];
if (empty($_SESSION["contador"])) {$_SESSION["contador"]=0;}
$_SESSION["contador"]++;

echo "Nombre de la sesión: ".$_SESSION['nombre'].


"<P>Nombre del usuario : ".$_SESSION['usuario'].
"<P>Hora última entrada: ".strftime("%H:%M:%S
del %d/%m/%Y",$_SESSION['hora']);

?>

En primer lugar, ponemos la orden session_start(); para crear una sesión. A


continuación, usamos definimos y modificamos las variables que deseamos
almacenar con $_SESSION. Finalmente modificamos el contenido de las
variables generadas y mostramos la información guardada.

PHP utiliza la matriz asociativa $_SESSION para almacenar distintos variables de


la sesión. Esta matriz es accesible desde páginas diferentes, siempre y
cuando, esas páginas tengan asociada el mismo nombre de sesión.

Los valores de $_SESSION se borran como en cualquier otra matriz mediante la


función unset().

Una puntualización importante que distingue a las sesiones de las cookies es


que:

- 262 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

 en el caso de las cookies, cuando una página pide al navegador que


cree una cookie, el valor de la cookie no está disponible en la matriz
$_COOKIE en esa página es la primera ejecución del código PHP y lo
estará en recargas de páginas posteriores por parte del navegador.
 en el caso de las sesiones, cuando una página crea un valor en
$_SESSION, ese valor está disponible en esa página desde la primera
ejecución de ésta por parte del servidor web.

Es decir, que el siguiente programa:

<?php

session_start();
$_SESSION["nombre"] = "Pedro Pablo";
if (isset($_SESSION["nombre"])) {
print "<p>Su nombre es $_SESSION[nombre].</p>\n";
} else {
print "<p>Nombre desconocido.</p>\n";
}

unset($_SESSION["nombre"]);

if (isset($_SESSION["nombre"])) {
print "<p>Su nombre es $_SESSION[nombre].</p>\n";
} else {
print "<p>Nombre desconocido.</p>\n";
}

?>

siempre mostrará el mismo resultado:

<p>Su nombre es Pedro Pablo.</p>

<p>Nombre desconocido.</p>

La función session_unregister() se usa para desligar una o más variables del


registro de la sesión. Es decir, aquí se realiza la operación contraria: si una
variable ha sido registrada como global con la función session_register(), con
session_unregister() podemos eliminarla para que no forme parte de los
parámetros iniciales.

En el ejemplo anterior, si escribimos session_unregister('usuario'); la


variable $_SESSION["usuario"] queda eliminada y, por tanto, ya no será posible
mostrar su información.

La función session_is_registered() nos permite saber si una variable está


definida en el registro de la sesión o no. Devuelve True si lo está y False si no
lo está. Siempre que trabajemos con variables del registro de una sesión,
conviene usar esta función evitando así posibles errores si una de ellas no está
registrada,

- 263 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

La función session_encode() devuelve una cadena que contiene los valores


codificados de una sesión. Dentro de la cadena separa cada valor con un signo
¡ al principio y un signo | al final.

La función session_decode() recupera los datos de una sesión guardados en


una cadena que se le pasa como argumento y los asigna a las variables de la
sesión en curso. Así pues, sirve para restaurar los valores de las variables
previamente guardadas en una cadena con la función session_encode().

Destruir una sesión

La función session_destroy() borra toda la información que se haya recogido y


asociado a la sesión activa. Su sintaxis es sencilla:

session_destroy();

También produce los mismos efectos la sintaxis que incluye como argumento el
identificador de la sesión session_destroy($session_id); e incluso
session_destroy("La sesión del curso");

Debemos tener en cuenta que esta función no destruye la sesión ni el fichero


donde se ha guardado la cookie con su identificador, sino sólo la información
asociada a la misma que se va generando a medida que un usuario va
moviéndose y realizando operaciones dentro de una aplicación web.

Utilizando Eclipse PDT puedes abrir el proyecto Ejemplo 5 (Sesiones) de


la Unidad 5. Estudia el código fuente y ejecútalo para mostrar en el
navegador su resultado.

En este programa se incluyen los ejemplos cuyo código hemos ido escribiendo
junto a las funciones explicadas. Es muy importante que lo estudies en
detenimiento para completar el aprendizaje de este apartado.

Utilizando Eclipse PDT puedes abrir el proyecto Ejemplo 6 (Carrito de la


compra) de la Unidad 5. Estudia el código fuente y ejecútalo para mostrar
en el navegador su resultado.

Este ejemplo muestra la forma de implementar un carrito de la compra


utilizando sesiones. Si ejecutas en Eclipse PDT el proyecto verás que aparece
la siguiente página:

- 264 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

Es básico que analices el código fuente de este Ejemplo ya que en él se usan


variables de sesión de tipo matriz.

- 265 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

Control de conexiones
Mientras un usuario está conectado al servidor nos puede interesar conocer las
acciones que realiza e incluso manejar sus decisiones, como la orden de
cancelar la carga de la página. PHP dispone de funciones para conocer y
controlar, hasta cierto punto, las conexiones de los clientes al servidor. En este
apartado vamos a tratar brevemente de este asunto.

El lenguaje PHP distingue tres estados en la conexión:

 Normal: el usuario está conectado. Tiene el valor 0.

 Abortado: el usuario ha mandado detener la carga de la página. Tiene el


valor 1 que equivale a la constante CONNECTION_ABORTED.

 Caducado: se ha sobrepasado el tiempo establecido de conexión. Tiene


el valor 2 que equivale a la constante CONNECTION_TIMEOUT.

Cuando un script PHP se está ejecutando, se activa el estado Normal. Si el


cliente remoto se desconecta, se pasa al estado Abortado. Esto puede ocurrir
cuando el usuario pulsa en el botón Stop (Detener) del navegador o la conexión
a Internet tiene cortes. Si se alcanza el límite de tiempo fijado en PHP para
ejecutar un script (ver las funciones connection_timeout() y
set_time_limit()), se pasa al estado Caducado (TIMEOUT).

Puede ocurrir que sea necesario también hacer que termine la conexión de un
usuario, por ejemplo, cuando no se ha validado correctamente o su consulta
persistente no obtiene resultados.

Veamos a continuación las principales funciones de PHP que permiten llevar a


cabo las operaciones mencionadas.

El Manual de PHP explica este proceso en el Apartado Manejo de


conexiones. Es recomendable leer las explicaciones que se dan en esta parte
del Manual y en cada una de las funciones que permiten el control de las
conexiones.

Conocer si el cliente ha cortado una conexión

La función connection_aborted() permite saber si el usuario ha desconectado


una conexión en curso. Esta función devuelve True si lo ha hecho y False en el
caso contrario. Su sintaxis es sencilla:

connection_aborted();

Si el usuario de la página pulsa sobre el botón Detener (Stop) de su navegador,


la función connection_status() devuelve el valor 1 y se deja de interpretar la
página que se esté cargando. Por lo tanto, no debe esperarse que PHP mande
ninguna salida más a la pantalla del usuario. En este caso, la mayoría de los

- 266 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

servidores y navegadores tienen previsto enviar al cliente un mensaje estándar


para que sepa qué está pasando. Por ejemplo, cuando una página caduca,
puede aparecer:

Advertencia: La página ha caducado

La página solicitada se creó utilizando la información que envió en un formulario. Esta página
no está ya disponible. Como medida de precaución, Internet Explorer no volverá a enviarle la
información.

Para volver a enviar la información y ver esta página Web haga clic en el botón Actualizar.

La función connection_status() devuelve el estado actual de la conexión,


según lo explicado anteriormente: el valor 0 indica que el usuario sigue
conectado; el valor 1, que ha interrumpido la conexión voluntariamente; el valor
2, que el tiempo de conexión ha caducado; el valor 3, que la conexión ha sido
interrumpida por el usuario y que también ha caducado.

La función connection_timeout() devuelve el valor True si el tiempo de


conexión ha caducado y False si no lo ha hecho.

Un script también se puede terminar por un temporizador interno. El timeout por


defecto es de 30 segundos. Se puede cambiar usando la directiva
max_execution_time en el fichero php.ini o la correspondiente directiva
php_max_execution_time en la configuración del servidor de páginas Apache.

La función set_time_limit() nos permite también establecer el tiempo de


ejecución de un script. Cuando el temporizador acaba su cuenta, el script se
aborta como en el caso de la desconexión del cliente. Debe tenerse en cuenta
que este temporizador empieza a contar desde 1 prescindiendo de los
segundos que ya se hubieran consumido. Como argumento debemos pasarle
el número de segundos que debe durar. El valor cero indica que no hay límite
de tiempo.

La función ignore_user_abort() determina si la desconexión voluntaria del


usuario debe suspender la ejecución del script. Esta función, pues, deshabilita
la posibilidad que tiene el cliente de desconectarse pulsando Detener (Stop).
Aunque el usuario deje de ver la interpretación de la página, PHP acaba con el
código completo.

La función register_shutdown_function() permite registrar una función que


debe ejecutarse al cerrarse una conexión. Toma como argumento el nombre de
otra función, que se ejecutará al acabarse la ejecución de un script. La función
pasada como argumento sólo se ejecuta después de haberse producido todas
las salidas de la página, por lo cual no puede usarse para mostrar información
en el navegador o guardarla en un fichero normal. Por esto, recomendamos
utilizar la función de PHP error_log() que permite guardar la información en
fichero. Es recomendable leer las explicaciones que se dan sobre esta función
en el apartado "Tratamiento de Errores" de la teoría de la Unidad 8.

- 267 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

La función get_browser() obtiene la información de un navegador guardada en


el fichero browscap.ini. Toma como argumento el nombre del navegador. La
información se refiere a las capacidades que tiene el navegador del usuario.

Otras funciones de PHP que suelen usarse en las conexiones

La función exit() nos permite terminar un programa cuando nos interese. La


interpretación del código PHP se interrumpe cuando se encuentra esta orden.
Ya la hemos usado en diferentes script.

La función die() hace lo mismo que exit(), pero permite mostrar un mensaje
de texto entre comillas dentro de los paréntesis. La interpretación del código
PHP se interrumpe cuando se encuentra esta orden y se muestra la cadena de
texto que se pone como argumento. Ya la hemos usado también en diferentes
script.

La función sleep() retrasa la ejecución de un programa tantos segundos como


se indique en su argumento. Por ejemplo, la instrucción sleep(10); retrasa la
interpretación de la página 10 segundos. Conviene saber que la interpretación
del programa no se detiene cuando se encuentra esta instrucción, sino que se
detiene desde el principio, es decir, no se manda nada a la pantalla del usuario
aunque la función sleep() ocupe la última línea.

La función usleep() retrasa la ejecución de un programa tantos microsegundos


como se indique en su argumento. Por ejemplo, la instrucción usleep(1000);
retrasa la interpretación de la página 1.000 microsegundos.

Usando Eclipse PDT puedes abrir el proyecto Ejemplo 7 (Control de


conexiones) de la Unidad 5. Estudia el código fuente y ejecútalo para
mostrar en el navegador su resultado.

En este programa se incluyen los ejemplos cuyo código hemos ido escribiendo
junto a las funciones explicadas.

Si ejecutas el programa usando un navegador externo a Eclipse PDT y pulsas


el botón que para la carga de la página (botón ESCAPE del teclado) verás que
la página no termina la carga de la página y se para (es necesario desplazar la
barra vertical del navegador para ver el resultado en la parte inferior):

- 268 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

Sin embargo, si dejamos que se ejecute la página hasta que termine su carga
en el navegador veremos que aparece al final de esta página aparece la
palabra “FIN”:

- 269 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

Además, si abrimos el archivo “acceso.txt” del proyecto podemos ver el estado


en el que terminaron las conexiones anteriores:

- 270 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

Para implementar esta funcionalidad hemos utilizado la función de PHP


error_log() que permite guardar la información en fichero. En el apartado
"Tratamiento de Errores" de la teoría de la Unidad 8 se estudia esta función.

- 271 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

Resumen

Hay que saber al final de esta unidad

 Identificar una cookie y conocer la información


que contiene.

 Crear y enviar una cookie al servidor con la


función setcookie().

 Eliminar una cookie con la misma función.

 Leer el contenido de una cookie.

 Utilizar correctamente la función header() para


crear y enviar al servidor una cabecera HTTP.

 Autentificar usuarios, tanto desde el propio


servidor como mediante el envío de las cabeceras
HTTP oportunas.

 Revalidar usuarios.

 Gestionar usuarios que acceden al servidor.

 Abrir una sesión y conocer sus datos con las


funciones session_start(), session_name(),
session_module_name(), session_save_path() y
session_id().

 Destruir una sesión con session_destroy().

 Pasar a una cadena los valores registrados en una


sesión con la función session_encode() y
recuperarlos de la misma con session_decode().

 Conocer el estado de una conexión con la función


connection_status().

 Detectar si el usuario de ha desconectado con la


función connection_aborted().

- 272 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

 Detectar si la conexión ha caducado con la función


connection_timeout() y fijar un nuevo periodo de
conexión con set_time_limit().

 Desactivar la posibilidad de que el usuario se


desconecte finalizando el script php con la
función ignore_user_abort().

 Conocer las capacidades del navegador que estamos


usando con la función get_browser().

 Interrumpir la ejecución de un programa con las


funciones exit() y die().

 Detener temporalmente la ejecución de un programa


con las funciones sleep() y usleep().

- 273 -
Curso de Iniciación a PHP: Unidad 5
- Gestión Usuarios y sesiones -

- 274 -
MÓDULO 3

UNIDADES DIDÁCTICAS:

6. Utilización de MySQL

7. PHP y las bases de datos (PDO)

8. Utilidades prácticas
 
MÓDULO 3

Utilización de MySQL

Unidad 6

Índice de la unidad:

1. Arquitectura de una aplicación web

2. Teoría sobre bases de datos

3. Servidor MySQL

4. Sentencias MySQL

5. Resumen
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -

Introducción
En esta Unidad vamos conocer a la arquitectura de una aplicación web que
utiliza bases de datos.

Asimilarás el concepto y estructura de una base de datos.

Además, adquirirás conocimientos básicos de la base de datos MySQL y


utilizar correctamente sus sentencias para realizar diferentes operaciones con
los contenidos de las bases de datos.

Para acabar la Unidad, aprenderás y sabrás aplicar correctamente las


principales sentencias SQL.

Arquitectura de una aplicación web que use bases de


datos
Hemos visto hasta ahora cómo generar páginas dinámicas con PHP. En los
ejercicios y ejemplos anteriores hemos podido apreciar la capacidad de este
lenguaje para crear este tipo de páginas, si bien la información mostrada hasta
el momento es bastante sencilla y elemental. Pero PHP adquiere verdadera
potencia y utilidad en la generación de páginas dinámicas cuando utiliza la
información archivada en bases de datos.

Éste es precisamente el terreno en el que los lenguajes generadores de


páginas web alcanzan resultados espectaculares, hasta el punto de que más
del 90% de los websites se sirven de este procedimiento para enviar al cliente
su información. Por ejemplo, cualquier cadena de noticias tiene una base de
datos que puede ser actualizada permanentemente, incluso a larga distancia
por los corresponsales remotos, cuya información ofrece en tiempo real a los
clientes que entran en su web. Lo mismo pasa con las empresas de comercio
electrónico (e-commerce): usan diferentes bases de datos para contener
información sobre sus productos, los perfiles de sus clientes reales o
potenciales y los datos de las compras que éstos vayan haciendo. También las
web de las entidades bancarias usan bases de datos para archivar y mostrar
información sobre los movimientos en las cuentas corrientes y otras
operaciones de sus clientes.

En esta Unidad vamos a abordar conocimientos básicos sobre las bases de


datos y cómo se integran en una página web, estudiando concretamente la
base de datos MySQL y el lenguaje de consulta SQL. En la siguiente Unidad
abordaremos, directamente ya, cómo trata PHP las bases de datos al generar
las páginas dinámicas.

Arquitectura de una aplicación web

- 279 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -

En el apartado Funcionamiento de un programa codificado con PHP de la


Unidad 1 presentamos el siguiente esquema:

En este gráfico aparecen sólo dos de las tres capas (tiers) que integran el
proceso completo de interpretación de una página web.

En la primera capa o nivel el usuario, utilizando su navegador, hace una


solicitud al servidor, con el que se conecta a través del protocolo HTTP. Le pide
que interprete un script y le remita el resultado, que se recibe en formato de
página HTML.

En la segunda capa o nivel el servidor envía esa solicitud al intérprete PHP


para que ejecute el programa y devuelve el resultado al navegador del cliente.

Pero ahora, llegado el momento, debemos añadir una tercera capa o nivel, que
está integrada por la base o bases de datos con las que conecta el servidor y
de las que extrae la información solicitada por el cliente. Es decir, el servidor,
cuando encuentra en el programa órdenes y funciones de creación,
modificación y consulta de una base de datos, acceda a ella y extrae, elimina o
actualiza esa información, según las operaciones que deban ejecutarse en el
script.

Para establecer esta conexión entre el servidor y la base de datos, es preciso


utilizar enlaces que sirvan de canal de comunicación entre ambos. Estos
enlaces pueden ser de dos tipos:

 Acceso mediante bibliotecas nativas (APIs)

El acceso mediante bibliotecas nativas que tenga cada tipo de base de


datos, denominado API (Application Programming Interface), está
integrado por el conjunto de funciones propias de un tipo de base de
datos que puede incorporar el programador cuando está utilizando ese
tipo de base.

Este tipo de enlace es más rápido y eficaz cuando se trabaja sólo con un
tipo de base de datos, pero exige cambiar el código si se utiliza otro tipo
de base de datos (los nombres de cada función son diferentes, el orden
de los argumentos distinto, las funcionalidades disponibles son distintas,
etcétera). Por ejemplo, Oracle y MySQL tienen APIs (bibliotecas de
funciones que en PHP se denominan extensiones) completamente
diferentes.

- 280 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -

En las primeras versiones de PHP, la única manera de acceder a una


base de datos era a través de una biblioteca específica que debía estar
activada en PHP y que contenía las funciones necesarias.

Actualmente (Mayo de 2014), PHP sigue incluyendo muchas de estas


extensiones y todavía se pueden utilizar, pero en su lugar se recomienda
utilizar la biblioteca PDO que se comenta a continuación.

 Acceso mediante PDO (Objetos de Datos de PHP)

Para poder escribir programas independientes del tipo de base de datos


elegido, es necesario utilizar una capa de abstracción que permita
acceder de una forma común a cualquier tipo de base de datos.

Entre ellos, está el tipo estándar de capa de abstracción ODBC (Open


DataBase Connectivity), que es más genérico y sirve para conectar
cualquier servidor con aquellas bases que lo soporten, que son casi
todas. En PHP existe una extensión llamada también ODBC que permite
conexiones ODBC. El inconveniente de esta extensión ODBC es que
introduce un elemento más en la cadena, el controlador ODBC del
sistema operativo, lo que ralentiza el rendimiento del servicio.

Para arreglar este problema, PHP ha desarrollado su propia capa de


abstracción orientada a objetos llamada PDO que incluye controladores
para acceder a las bases de datos más populares. Si bien, al utilizar
PDO no podemos olvidarnos completamente del tipo de base de datos
utilizado como, por ejemplo, la conexión al servidor de bases de datos la
creación de tablas, etcétera.

Hoy por hoy, la extensión PDO es la biblioteca recomendada para


acceder a bases de datos con PHP y es la que vamos a estudiar en
este curso.

Así queda el esquema completo incluyendo el servidor de base de datos:

- 281 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -

Así pues, en las Unidades 6 y 7 vamos a aplicar el proceso completo:

 Se escribe el código fuente de la página web en lenguaje PHP


incluyendo las funciones PDO.
 Se guarda este código en el servidor web.
 El navegador del usuario solicita al servidor la página codificada y
guardada en los dos pasos anteriores.
 El servidor interpreta el código PHP conectando, cuando sea preciso,
con la base de datos y realizando con ella las operaciones previstas.
 El servidor envía el resultado del código PHP al navegador del usuario,
que ve en su pantalla la página en formato HTML.

- 282 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -

Teoría sobre bases de datos


En este apartado vamos a explicar brevemente algunos conceptos
fundamentales sobre las bases de datos. Suponemos que el alumno o alumna
ya tiene conocimientos suficientes sobre las mismas y, por tanto, abordaremos
sólo algunos conocimientos más relacionados con la forma en que PHP accede
a las bases de datos y trata su información.

El término base de datos es informático, pero puede aplicarse también a la


forma como se almacena, ordena y utiliza manualmente la información. Por
ejemplo, la agenda en la que apuntamos manualmente los datos con el
nombre, dirección y teléfono de nuestros amigos o personas con las que
necesitamos relacionarnos, puede ser considerada una base de datos en este
sentido más amplio. Igualmente, el archivador en el que guardamos las fichas
bibliográficas de una investigación o de una biblioteca también puede ser
considerado como tal. En todas ellas se almacena información, se ordena de
alguna forma (alfabéticamente en la agenda, por temas, autores o títulos en el
fichero de la biblioteca, etcétera) y se consulta cuando es necesario.

Sin embargo, en el sentido informático, la palabra base de datos se refiere a


una colección, conjunto o depósito de datos, almacenados en un soporte
magnético o de otro tipo, accesibles por múltiples usuarios de forma rápida y
eficaz mediante el ordenador a través de una o de varias aplicaciones
informáticas independientes de los datos. Éstos se relacionan entre sí y están
organizados de tal manera que es fácil introducirlos, actualizarlos, recuperarlos
o llevar a cabo con ellos otras operaciones de gestión.

En el caso de PHP es el servidor quien conecta con la base de datos, a


petición del navegador del usuario, y realiza las operaciones previstas en la
aplicación, devolviendo posteriormente al navegador del cliente los resultados
de esas operaciones.

Generalmente, en las bases de datos relacionales, de las que hablaremos


después, la información está almacenada y organizada en ficheros formados
por filas y columnas, como puede verse en el ejemplo siguiente, en el que se
presentan algunos datos de cinco libros de una biblioteca:

Columnas
Título Autor Editorial
Antonio Muñoz
El invierno en Lisboa Seix Barral
Molina
Fondo de Cultura
¿Tener o ser? Erich Fromm
Económica
Filas
Crónica de una muerte Gabriel García
Bruguera
anunciada Márquez
El lobo estepario Hermann Hesse Anaya Editores
La vida está en otra
Milan Kundera Seix Barral
parte

- 283 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -

Cada fila contiene el título, el autor y la editorial de un libro y se relaciona con


las demás filas gracias a que incluye el mismo tipo de información (datos de los
libros) y en todas ellas la información está organizada de la misma forma: la
primera columna contiene el título del libro, la segunda, el autor y la tercera, la
editorial.

Así pues, una base de datos contiene un conjunto de ficheros cuya


información está organizada de tal forma que puede ser tratada
informáticamente con rapidez y eficacia. La información de una base de datos
puede almacenarse en un solo fichero o en varios.

Los ficheros de una base de datos están grabados en el servidor. Tienen un


nombre (por ejemplo, flores, ríos, libros, coches, amigos, articulo, clientes,
ventas, facturas, etcétera). Su denominación debe seguir las normas
establecidas para que el nombre de un fichero sea correcto. Como puede
verse, hemos prescindido de las tildes en los identificadores que las llevan
ortográficamente.

El tipo o extensión de estos ficheros de base de datos puede ser muy variado,
según el tipo de base de datos utilizado: en dBase es dbf (Data Base File,
Fichero de Base de Datos), en Access mdb, en Interbase db o dbf, en MySQL
myd, etcétera.

Las filas de un archivo de base de datos se denominan registros y las


columnas, campos (fields, en inglés).

Así pues, un fichero de base de datos está integrado por registros, que son
cada uno de sus elementos o componentes (flor, río, libro, coche, amigo,
artículo, cliente, venta o factura). Todos los registros contienen un conjunto de
campos en los que se almacena su información; este conjunto define la
estructura del fichero que integra una base de datos.

En la representación gráfica siguiente puede observarse, en forma de tabla, la


estructura de un fichero que contiene una base de datos con información sobre
personas:

Campos

Nombre Sueldo Fecha_nac Observacion Foto


1
2
3
4
Registros
5
6
7
8
9

- 284 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -

10
11

En las filas aparecen hasta once registros cada uno de los cuales, en este
caso, contiene los cinco campos siguientes: Nombre, Sueldo, Fecha_nac,
Observacion y Foto.

En el ejemplo anterior sólo se han incluido once registros y cinco campos, pero
de hecho en las bases de datos que vamos a usar el número de registros es
ilimitado (depende de la capacidad del soporte) y el de campos es muy amplio,
según el tipo de base de datos usada. Todos los registros tienen los mismos
campos.

Si comparamos un fichero de base de datos con los archivadores de una


biblioteca, podemos decir que éstos integran la base de datos. Cada archivador
es como un fichero de la base de datos, las fichas que hay en su interior son
los registros y los apartados de cada ficha (título, autor, editorial, etcétera) son
los campos.

Cada campo de un registro tiene un nombre, un tipo, una longitud o ancho,


un número de decimales si es de tipo numérico o de coma flotante y un
índice opcional. Según el tipo de base de datos que se esté utilizando, el
identificador del campo, la clase de tipos y la longitud de los mismos pueden
ser diferentes. Nos vamos a referir, como ejemplo, sólo a la estructura de las
bases de datos creadas con MySQL.

NOTA: este apartado no pretende ser una descripción exhaustiva del uso de la
base de datos MySQL y del lenguaje SQL. Tiene como objetivo recordar los
conceptos básicos de la programación con Bases de datos.

El nombre de cada campo puede ser muy largo, si bien recomendamos que en
el orden práctico sea lo más breve posible y tenga algún significado. Debe
atenerse a las reglas de todos los identificadores ya comentadas
anteriormente.

Hay estos tipos de campos, que citamos de forma genérica:

1. Campo de tipo Carácter. Es el más común (letras, dígitos, signos, etcétera),


y contiene información que es tratada como una cadena de caracteres. Se
asigna este tipo a un campo cuando no se realizan operaciones aritméticas con
sus datos, ni contiene una fecha, ni es un texto mayor de 255 caracteres. Por
ejemplo, se asigna este tipo al campo cuyo contenido va a ser el nombre de
una persona, sus apellidos, domicilio, localidad, provincia, etcétera. Admite
índice. En MySQL hay dos tipos de campos para almacenar datos de esta
clase: CHAR y VARCHAR. Tiene una longitud desde 1 hasta 255 caracteres. Si
la longitud de la cadena que se asigna a este campo no alcanza los 255
caracteres, el tipo CHAR completa con espacios en blanco los que falten
ocupando siempre este campo la misma longitud. En cambio, el tipo de
carácter VARCHAR sólo ocupa el espacio que precise la cadena de texto, es

- 285 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -

decir, su longitud es variable y, por tanto, se ahorra espacio cuando el


contenido puede ser muy diferente en longitud.

2. Campo de tipo Numérico. Se utiliza para escribir números, incluidos los


signos positivo y negativo. Se asigna este tipo a un campo cuando se realizan
operaciones aritméticas con números enteros o reales, como sumar, restar,
multiplicar, dividir, etcétera. Admite índice. MySQL admite estos valores para
determinar los campos de este tipo: TINYINT, SMALLINT, MEDIUMINT, INT,
BIGINT, REAL, DOUBLE, FLOAT, DECIMAL y NUMERIC. Como puede verse,
en realidad los valores posibles se refieren a si es un campo de número entero
o decimal y al número de dígitos con los que debe representarse el valor en
cada caso.

3. Campo de tipo Fecha. Puede contener fechas y tiempos (horas, minutos,


segundos). Admite índice. MySQL admite aquí los valores siguientes: DATE,
TIME, TIMESTAMP y DATETIME.

4. Campo de tipo Memo. Es un campo de longitud variable que admite gran


cantidad de texto según nuestras necesidades. Para cada registro tendrá una
longitud distinta, según la cantidad de texto que se introduzca en este campo.
No admite índice. MySQL admite aquí los valores siguientes: TINYBLOB,
BLOB, MEDIUMBLOB, LONGBLOB, TINYTEXT, TEXT, MEDIUMTEXT y
LONGTEXT.

5. Campo de tipo serie. Es un campo donde se puede poner uno de los valores
incluidos en una lista o serie de valores. MySQL admite aquí los valores
siguientes: ENUM y SET.

Ventajas de las bases de datos

Hemos dicho que los archivadores de una biblioteca o de una agenda pueden
considerarse, en cierta forma, bases de datos, pues en ellos se almacena
información en un determinado orden y es posible buscar esta información,
consultarla, modificarla o eliminarla con facilidad.

Sin embargo, todas estas operaciones suelen llevar mucho tiempo y, en


ocasiones, no se efectúan tan fácilmente como desearíamos. Además, ocupan
bastante espacio si la información es abundante. Incluso, en ocasiones,
algunas operaciones fundamentales son imposibles de realizar manualmente.

Por ejemplo, si tenemos 1.000 fichas bibliográficas ordenadas por autor y


necesitamos ordenarlas por título, la operación ha de realizarse manualmente,
mirando una a una cada ficha, lo cual puede hacerse muy largo y pesado.
Podíamos haber escrito dos ejemplares de cada ficha, uno para el archivo por
autores y otro para el de títulos, pero esto hubiera llevado el doble de tiempo,
de trabajo y éstas ocuparían el doble de espacio.

Supongamos ahora que necesitamos seleccionar todas las fichas en las que
aparece la misma editorial. De nuevo la tarea puede parecernos pesada y

- 286 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -

larga, y lo es. No digamos si se cambia la situación de los libros en los armarios


de la biblioteca. También será necesario modificar la signatura en las fichas.

Hemos puesto este ejemplo para explicar los graves problemas que se derivan
de la gestión manual de la información. Las dificultades aumentan a medida
que crece el volumen de información que debe manejarse y según sean los
criterios de ordenación y selección.

En una base de datos informática, en cambio, al gestionarse la información


automáticamente, muchos de los problemas anteriormente mencionados
desaparecen.

En primer lugar, la rapidez de las operaciones fundamentales (introducción de


datos, ordenación por diferentes campos, consultas, búsquedas, elaboración
de informes, actualización y modificación de los datos, etcétera) aumenta de
una forma muy destacada.

En segundo lugar, el espacio que ocupa una base de datos es mucho menor
que el de cualquier otra forma de archivo manual. En un disco flexible de 3,5
pulgadas puede almacenarse casi un millón y medio de caracteres. En los
discos duros de los actuales servidores el volumen de información puede ser
prácticamente ilimitado.

En tercer lugar, las operaciones fundamentales de gestión de la información


son automáticas, lo cual hace que sean menos pesadas y tediosas si son
llevadas a cabo por el ordenador. Así pues, el trabajo se humaniza y el tiempo
libre de las personas que manejan la información es mayor.

Finalmente, la seguridad de los datos informatizados también es mayor que la


contenida en archivos de tipo manual, pues el ordenador nos permite hacer
rápidamente cuantas copias queramos de esa información en diferentes
soportes.

Desde la aparición de los ordenadores, éstos se han dedicado al


almacenamiento y organización de grandes volúmenes de datos. Igualmente,
se han aplicado a la evaluación de las diversas soluciones propuestas para
resolver los problemas de estructuración y acceso a dicha información.

Bases de datos relacionales

Se ha descubierto que la mejor forma de resolver estos problemas es organizar


la información de forma relacional. De aquí ha surgido el concepto de bases de
datos relacionales (RDBMS, Relation DataBase Management System).

El fundamento teórico de las bases de datos relacionales es complejo, ya que


se basa en el concepto matemático de relación entre los elementos de un
conjunto. Sus características y propiedades formales requieren ciertos
conocimientos de la teoría de conjuntos. Sin embargo, en la práctica, el

- 287 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -

concepto de relación es muy sencillo de utilizar porque en ésta la organización


de los datos es muy clara e intuitiva.

En otros tipos de organización de la información, como las bases de datos


jerárquicas o las bases de datos en red, anteriores a las relacionales,
aparecían distintas categorías de datos y estructuras muy complejas y poco
flexibles que dificultaban la posibilidad de relacionar éstos con eficacia y
rapidez. En cambio, en las bases de datos relacionales la información se
organiza en ficheros que tienen estructura tabular o en forma de tabla, en la
que todos los datos tienen la misma categoría. Cada tabla también recibe el
nombre de relación.

Por ejemplo, en el gráfico siguiente puede observarse una tabla que contiene
diversos datos de personas:

Cabecera Nombre Dirección Edad Sexo Profesión


1 León García C/ Zurita, 25 25 V Admtvo.
2 María Pérez C/ Flores, 15 30 M Abogada
Filas
José Rodríguez C/ Río Sil, 11 50 V Dependiente
(Registros) 3
4 Juana de Dios Avda. Canarias, 50 70 M Jubilada
5 Begoña López Pza. Segovia, s/n 15 M Estudiante

|___________|________|___|_____|
Columnas (Campos)

Como se ve, una tabla consta de filas y de columnas; en cada columna,


denominada campo en la base de datos, hay un dato: Nombre, Dirección,
Edad, etcétera; cada fila es un registro que contiene todos los datos de los
elementos de la base. Cada tabla tiene un registro especial, denominado
cabecera, que contiene los nombres de los campos y sus atributos (tipo y
longitud).

Generalmente, una base de datos no consta de una sola tabla, sino de varias.

Gráficamente puede representarse así:

- 288 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -

Estas tablas no son independientes unas de otras, sino que tienen al menos un
campo común con las otras a través del cual se puede acceder a la información
que contienen todas en conjunto.

Por ejemplo, la base de datos de una biblioteca puede estar integrada por una
tabla de libros, otra de lectores, otra de préstamos y otra de editoriales. El
fichero de libros puede contener la información completa de cada volumen:
título, autor, editorial, año de edición, precio, número de páginas, código de
materia, número de registro, etcétera.

El fichero de editoriales contendrá los datos de cada entidad editora: nombre,


dirección, teléfono, plazo de entrega, descuentos, etcétera.

El fichero de lectores estará integrado por los datos personales y profesionales


de éstos: nombre, DNI, dirección, teléfono, profesión, centro de trabajo, número
de carné, etcétera.

El fichero de préstamos contendrá datos de este tipo: número de registro del


libro prestado, número de carné del lector, fecha del préstamo, plazo, etcétera.

Como puede verse, la información no debe repetirse en todos los ficheros, pero
sí debe poder relacionarse. Por ejemplo, los ficheros de libros y editoriales,
tienen en común el campo EDITORIAL. Los ficheros de libros y préstamos
tienen en común, al menos, el NÚMERO DE REGISTRO del libro prestado,
gracias a lo cual desde uno se puede acceder a los datos del otro. Los ficheros
de lectores y préstamos tienen en común el campo CARNÉ, etcétera.

Son bases de datos relacionales Microsoft Access, Oracle, SQL Server,


MySQL y otras.

Hay otro tipo de base de datos que está orientado a los objetos (ODBMS,
Object Oriented DBMS) en las que cada dato es tratado como si fuera un

- 289 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -

objeto con sus atributos y métodos. Son de este tipo ObjectStore, Versand,
GemStore, etcétera.

También hay otro tipo que reúne características propias de los dos tipos
anteriores, como PostgreSQL, que son conocidas como ERDBMS (Extended
Relacional DBMS) y como ORDBMS (Object Relational DBMS). PHP puede
tratar prácticamente todas las bases de datos mencionadas.

Diseño de bases de datos

El diseño de bases de datos puede presentar distinto tipo de dificultad


dependiendo de la complejidad e interrelación de los datos que se quiera
gestionar.

Imaginemos que una compañía aérea quiere gestionar toda la información


contenida en una base de datos relativa a los aviones y su mantenimiento, a
los vuelos, viajes, destinos, clientes, personal de la empresa, agencias de
viajes, billetes, asistencia, etcétera. Es evidente que, en este caso, la
complejidad es enorme y que para realizar el diseño de esta base se requiere
la colaboración de técnicos especialistas que faciliten la tarea.

Sin embargo, en la mayoría de las ocasiones el diseño de una base de datos


se resuelve con uno, dos o tres ficheros como máximo. En este caso no es
necesario profundizar en aspectos complejos de técnicas de diseño, sino que
basta aplicar el sentido común para organizar los ficheros de la base de datos
de forma coherente.

Deben crearse tantos ficheros como categorías o grupos de elementos distintos


haya que organizar. Por ejemplo, en una tienda que vende al por menor
bastaría con crear un fichero de artículos y otro de proveedores, y a lo sumo
otros tres: de pedidos, de ventas y de clientes.

Antes de ponerse a crear una base de datos con el ordenador, es preciso


diseñarla previamente sobre el papel. La planificación es fundamental en este
caso para evitar errores graves: falta de datos necesarios, repetición
innecesaria de algunos, equivocación del tipo de campo o falta de precisión en
su longitud. Aunque es posible modificar la estructura de una base de datos,
una vez creada, se puede perder mucho tiempo e incluso datos en esta
operación.

Diseñar una base de datos consiste en determinar los datos que van a
introducirse en ella, la forma como se van a organizar y el tipo de esos datos.
Además, se debe precisar la forma como se van a solicitar y las clases de
operaciones que hay que realizar con los mismos: aritméticas, lógicas, de
fechas, de carácter, etcétera. También conviene conocer los resultados
concretos que se espera obtener: consultas, informes, actualizaciones,
documentos, etcétera.

- 290 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -

A continuación, se resumen las operaciones que deben llevarse a cabo al


diseñar una base de datos:

1. Atendiendo a la información que contiene es preciso:

• Identificar los diferentes elementos informativos


(artículos, clientes, ventas, facturas, etcétera) que
forman parte de la base de datos.

• Determinar los datos que debe contener cada uno de esos


elementos.

• Precisar el grado de necesidad y de utilización de cada


dato.

• Concretar las operaciones que se van a realizar con los


datos: aritméticas, lógicas, de salida sólo por la
pantalla, de salida también por la impresora, etcétera.

• Seleccionar el dato o datos esenciales que deben ser el


campo clave por el que se ordenarán las unidades o
elementos mencionados.

• Fijar los datos comunes a los diferentes ficheros de la


base de datos que van a permitir relacionar la
información distribuida entre ellos.

2. Atendiendo a la estructura de la base de datos

• Distribuir la información en ficheros según los


diferentes grupos que se hayan hecho (artículos,
clientes, etcétera) y dar un nombre a cada fichero.

• Determinar el nombre de cada campo de los registros de


cada fichero. Este nombre ha de ser claro y debe
significar algo para que pueda recordarse fácilmente.

• Decidir qué tipo conviene asignar a cada campo según la


clase de operaciones que vayamos a realizar con sus
datos.

• Asignar a cada campo una longitud apropiada para tener


los datos fundamentales sin despilfarro de memoria
interna ni de espacio en el disco duro o soporte
empleado.

• Establecer un orden lógico y práctico agrupando los


campos según un criterio concreto: clase e importancia de
los datos, frecuencia de utilización, proximidad,

- 291 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -

parecido, etcétera.

• Decidir cuál o cuáles van a ser los campos clave


permanentes y situarlos al principio de la estructura.

• No incluir campos que puedan ser el resultado de


diversas operaciones de tratamiento posterior.

• Fijar los campos comunes a todos los ficheros para


poder relacionarlos con otros de la misma aplicación.

- 292 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -

Servidor de base de datos MySQL


La base de datos MySQL ha formado y forma desde el principio una pareja
perfecta con PHP. En este apartado vamos a trabajar con ella, ya que es la
que utilizamos en el curso.

La mayoría de los desarrolladores, desde que PHP puede utilizar bases de


datos, han seleccionado esta base de datos. Por ejemplo, hace ya algunos
años que la NASA migró algunas de sus aplicaciones web a PHP utilizando
como base de datos precisamente MySQL.

Con el fin de asimilar bien los contenidos sobre las bases de datos, en esta
Unidad sólo se van a explicar de forma sencilla y práctica dos asuntos
importantes:

1. La base de datos MySQL, a través del Cliente MySQL Workbench, que


facilita y hace más intuitiva la comprensión de los conceptos. Así se evita, a la
vez, la poco estimulante tarea de escribir una a una las instrucciones en el
prompt del sistema. El estudio y las prácticas realizadas con esta utilidad
prepararán a los alumnos y alumnas para poder aplicar estos conceptos a otros
tipos de bases de datos.

2. Las funciones de PHP que permiten tratar las bases de datos y su


información en MySQL. Este asunto se abordará en el apartado siguiente.

Con los conocimientos anteriores bien asimilados, será más fácil comprender
con detalle y aplicar correctamente las funciones de PHP que permiten
conectarse a una base de datos, realizar consultas, acceder a los resultados de
las consultas y realizar otras operaciones auxiliares e informativas sobre
cualquiera de las bases de datos que usamos en el curso. También será
posible utilizar el lenguaje de consulta SQL para obtener informes. Esto es
precisamente lo que abordaremos en la Unidad siguiente.

Para tener acceso a las bases de datos, en primer lugar, hay que arrancar el
servidor de datos MySQL.

Arrancamos el Panel de control de XAMPP. Si hacemos clic en el botón “Start”


del servidor MySQL, a continuación, se cambiará el texto del botón a “Stop”.
Además, desde este Panel se ofrecen varias opciones para gestionar el
servidor, que nos permiten realizar, entre otras, configurar el servidor (Config)
y administrar el servidor de nuevo (Admin), etcétera. A continuación, se
muestra el servidor MySQL arrancado:

- 293 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -

En la captura anterior, si usas Windows, su Firewall solicitará permiso para la


ejecución del servidor MySQL, debemos pulsar el botón “Permitir acceso”.

Ahora ya podemos arrancar el fichero Mysql.exe (utilidad MySQL monitor) que


aparece en el directorio de instalación de XAMPP, en el caso de Windows
C:\xampp\mysql\bin. Este programa se ejecutará en modo MSDOS y se
presentará en la pantalla la ventana principal de este gestor de bases de
datos. Para arrancarlo debemos escribir mysql.exe -u root (con "-u root"
estamos indicando el usuario con el que queremos conectarnos al servidor)
desde una ventana de comandos en el directorio C:\xampp\mysql\bin. Éste es
su texto inicial:

- 294 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -

El cursor se coloca detrás del promtp mysql> esperando que vayamos


introduciendo las órdenes o comandos que deban ejecutarse. Por ejemplo, si
escribimos

mysql> show databases;

se muestra a continuación:

mysql> show databases;


+--------------------+
| Database |
+--------------------+
| information_schema |
| cdcol |
| mysql |
| performance_schema |
| phpmyadmin |
| test |
| webauth |
+--------------------+
7 rows in set (0.02 sec)

mysql> Si escribimos

mysql> \h

aparece la

For information about MySQL products and services, visit:


http://www.mysql.com/
For developer information, including the MySQL Reference Manual,
visit:
http://dev.mysql.com/

To buy MySQL Enterprise support, training, or other products, visit:


https://shop.mysql.com/

- 295 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -

List of all MySQL commands:


Note that all text commands must be first on line and end with ';'

? (\?) Synonym for `help'.


clear (\c) Clear the current input statement.
connect (\r) Reconnect to the server. Optional arguments are db and
host.
delimiter (\d) Set statement delimiter.
ego (\G) Send command to mysql server, display result
vertically.
exit (\q) Exit mysql. Same as quit.
go (\g) Send command to mysql server.
help (\h) Display this help.
notee (\t) Don't write into outfile.
print (\p) Print current command.
prompt (\R) Change your mysql prompt.
quit (\q) Quit mysql.
rehash (\#) Rebuild completion hash.
source (\.) Execute an SQL script file. Takes a file name as an
argument.
status (\s) Get status information from the server.
tee (\T) Set outfile [to_outfile]. Append everything into given
outfile.
use (\u) Use another database. Takes database name as argument.
charset (\C) Switch to another charset. Might be needed for
processing binlog with multi-byte charsets.
warnings (\W) Show warnings after every statement.
nowarning (\w) Don't show warnings after every statement.

For server side help, type 'help contents'

El uso de esta herramienta supone que debemos conocer las órdenes de


MySQL y su sintaxis correcta, procedimiento ya algo anticuado y de otra época.
Por eso, hemos preferido servirnos de una utilidad más moderna bajo
Windows, con la que podemos realizar en MySQL todas las operaciones con
las bases de datos, a la vez que aprender de una forma más amigable los
comandos de MySQL que permiten realizar todas las operaciones propias de
las bases de datos. Se denomina MySQL Workbench.

Abandonamos, pues, con el comando quit; la utilidad MySQL monitor y vamos


a instalar esta moderna aplicación con la que vamos a aprender a trabajar con
las bases de datos de tipo MySQL.

MySQL Workbench

Para instalar este cliente MySQL debemos acceder con el navegador a la


página siguiente en Internet:

http://www.mysql.com/products/workbench/

- 296 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -

Hacemos clic en el botón “Download Now” y aparecerá esta página:

A continuación, elegimos la versión correspondiente al sistema operativo que


estemos utilizando y pulsamos el botón “Download”. En la página que aparece
a continuación, pulsamos la opción “No thanks, just start my download”:

- 297 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -

Una vez se descarga el fichero, lo descomprimimos en una carpeta de la


instalación XAMPP, por ejemplo en la carpeta C:\xampp\mysql\MySQL
Workbench 6.1.6 CE:

A continuación, creamos un acceso directo en el escritorio de la aplicación


MySQLWorkbench.

- 298 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -

Finalmente, ejecutamos la aplicación MySQL Workbench y aparece a


continuación la siguiente pantalla:

A continuación, vamos a establecer una conexión con el servidor MySQL que


hemos arrancado. Para ello, hacemos clic en el botón (+) que aparece en la
siguiente ventana y rellenamos los campos que aparecen a continuación:

- 299 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -

Pulsamos el botón “Test Connection” para comprobar que la conexión funciona


correctamente. El botón OK que aparece a su lado da de alta la nueva
conexión “curso PHP 5”:

Haciendo clic sobre la nueva conexión “curso PHP 5” conectamos el gestor con
el servidor MySQL local:

• En la mitad superior pueden observarse tres elementos:

1. El menú de opciones y los iconos de acceso rápido:

- 300 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -

2. La ventana del Navigator (Navegador) muestra el estado del servidor, las


conexiones establecidas, los usuarios, etcétera. SCHEMAS muestra las bases
de datos a los que tiene acceso y las tablas y los campos que integran esta
base de datos. Si hacemos doble clic sobre el nombre de una base de datos en
particular veremos que su texto se cambia a negrita; esto indica que hemos
activado esta base de datos y todas las SQL's se aplicarán sobre la misma. La
ventana es la siguiente:

3. En la ventana siguiente puede verse el cuadro de texto para introducir una


Consulta SQL. Es importante saber que en este cuadro de texto podremos
introducir varias consultas al mismo tiempo. Cada consulta SQL debe terminar
con el carácter punto y coma. El botón Execute sirve para ejecutar las
consultas. También disponemos del atajo de teclado [CONTROL + INTRO]
para ejecutar las consultas. La ventana es ésta:

- 301 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -

Además, en esta ventana, al escribir las sentencias SQL, el programa ofrece, a


modo de ayuda, diferentes posibilidades para terminar la sentencia:

Con el atajo de teclado [CONTROL + BARRA ESPACIO] podemos forzar que


aparezca esta ventana de ayuda.

• En la parte inferior de la ventana principal van apareciendo de forma


automática mensajes que indican si la ejecución de la SQL ha ido bien

- 302 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -

mostrando un mensaje de error en caso contrario. En la imagen anterior se


puede ver estos mensajes.

- 303 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -

Principales sentencias de MySQL


En este apartado vamos a estudiar las sentencias fundamentales que permiten
tratar bases de datos de tipo MySQL.

Vamos a utilizar las principales sentencias de este gestor de datos escribiendo


mediante la aplicación Cliente MySQL Workbench los efectos que produce la
interpretación de cada comando.

Así pues, para estudiar este tema, hay que activar el Servidor MySQL de
XAMPP y el Cliente MySQL Workbench para observar lo que pasa.

Creación de una bases de datos

Para trabajar con una base de datos, en primer lugar hay que crearla. Se hace
con la orden create database seguida del nombre que queremos darle. Para
crear la base de datos “almacen”, escribimos

CREATE DATABASE almacen;

Podemos comprobar que ha sido creada de cuatro formas diferentes:

1. Leyendo el mensaje que devuelve MySQL indicando que se ha hecho :

20:20:20 CREATE DATABASE almacen 1 row(s) affected 0.000 sec

2. Mirando con el Explorador de ficheros que se ha creado una carpeta nueva


con el nombre “almacen” en el directorio

3. Desde el Cliente MySQL Workbench en la parte Schemas el botón Refresh


. Se verá que hay una nueva base de datos denominada “almacen” que aún
no tiene ninguna tabla en su interior.

- 304 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -

4. Ejecutando en la propia ventana del MySQL monitor la orden show


databases, que estudiamos a continuación.

Como puede ocurrir que ya exista un base de datos con el mismo nombre que
la se pretende crear, en cuyo caso aparecería un error de creación de la base
de datos, lo mejor es usar la sintaxis condicional create database if not
exists almacen;. De esta forma, si la base de datos existe, no se crea una
nueva destruyendo la anterior.

Mostrar todas las bases de datos

La sentencia show databases; se usa para mostrar todas las bases de datos
que haya en el servidor MySQL. Podemos observarlo en la ventana siguiente:

Recordamos que las bases de datos mysql son imprescindibles para el


funcionamiento correcto del sistema y del curso, por lo cual no deben borrase
nunca.

Utilizar una base de datos

Para poder usar una base de datos, por ejemplo para acceder a sus tablas, es
preciso abrirla antes, operación que se realiza con la sentencia use <nombre de
la base de datos>. Por ejemplo, si queremos abrir la base de datos “almacen”,
escribiremos use almacen y, si se ha podido abrir, el sistema muestra el
mensaje de confirmación Database changed . A partir de aquí, ya podemos
crear tablas en su interior o acceder a los registros y campos de las mismas. Si
usamos la aplicación Cliente MySQL Workbench basta con hacer doble clic

- 305 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -

sobre el nombre de la base de datos que queremos usar; veremos que su texto
cambia a negrita indicándonos que está activa.

Crear una tabla

Una vez que hemos abierto la base de datos “almacen”, vamos a crear tres
tablas sencillas dentro de la misma: “productos”, “compras” y “clientes”. Para
crear la tabla “productos”, damos la orden siguiente:

create table if not exists productos (


codigo INT PRIMARY KEY AUTO_INCREMENT,
nombre VARCHAR(30) NOT NULL,
precio_euros DECIMAL(8,3) DEFAULT 0.0 NOT NULL,
stock TINYINT NOT NULL,
descuento SET('S','N') NOT NULL DEFAULT 'S',
caduca DATE,
notas TEXT);

Con esta orden hemos creado, dentro de la base de datos “almacen”, la tabla
“productos”, que tiene esta estructura:

Nombre del campo Tipo de campo Longitud Propiedades


PRIMARY KEY
codigo INT 11
AUTO_INCREMENT
nombre VARCHAR 30 NOT NULL
precio DECIMAL 8,3 NOT NULL
stock TINYINT 4 NOT NULL
NOT NULL
descuento SET
DEFAULT "S"
caduca DATE
notas TEXT

La misma información puede obtenerse con la sentencia

show columns from productos;

como puede verse en esta ventana:

- 306 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -

Conviene hacer algunas observaciones que el alumno debe tener en cuenta:

1. En la tabla “productos” hemos creado seis campos cuyo identificador debe


ser válido: codigo, nombre , precio_euros , stock , descuento , caduca y notas .

2. A cada campo le hemos asignado su tipo, longitud y características


adecuadas, según el contenido que vamos a introducir en ellos:

 El campo codigo es de tipo numérico entero INT y tiene una longitud de


11 dígitos (incluido el signo – si lo hay); no puede ser nulo, es decir,
estar vacío; es el índice primario, es decir, el valor único (uno distinto
para cada registro) por el que MySQL va a ir ordenando los registros a
medida que se den de alta; y se autoincrementa cada vez que se añade
un registro nuevo. Observe el alumno que en el tipo de campo no ha
sido preciso escribir la longitud, pues MySQL asume por defecto que el
tipo INT es de 11 posiciones. Los tipos numéricos enteros pueden ser
más largos o más cortos, según el número máximo que pretendamos
introducir en ese campo: TINYINT asigna 4, SMALLINT asigna 6,
MEDIUMINT asigna 9, BIGINT asigna 20.

 El campo nombre es de tipo VARCHAR, tiene una longitud de 30 y no puede


ser nulo. Si se observa ahora la sintaxis de la sentencia, se verá que
hemos puesto la longitud de este campo entre paréntesis. El valor
máximo posible es de 255. El tipo CHAR se comporta igual que VARCHAR,
con la diferencia de que CHAR guarda la longitud completa indicada,
aunque parte del campo esté vacía, como ya hemos explicado en un
apartado anterior.
 El campo precio_euros es de tipo DECIMAL, lo cual indica que el número
que se puede guardar en él tendrá parte entera y parte decimal.
Tampoco puede ser nulo y por defecto toma “0.000”. Hay que tomar nota
de la sintaxis precio_euros DECIMAL(8,3) : entre paréntesis se ponen
dos números separados por una coma. El primero (8) es la longitud del
número completo y el segundo (3) indica el número de decimales que
tiene. Para tratar campos en los que haya que escribir números reales
MySQL dispone también de diferentes tipos: FLOAT (de coma flotante) y
DOUBLE, que no exigen poner longitud. El primero soporta hasta 11
posiciones incluidas el signo - , el punto decimal, la parte entera y la
decimal. El segundo soporta hasta 20 posiciones.
 El campo stock es de tipo TINYINT, tiene una longitud de 4 y no puede
ser nulo. En el mismo sólo podremos registrar como máximo el valor 127
para saber las existencias de un producto.
 El campo descuento es de tipo SET, admite sólo los valores “S” o “N”, por
defecto toma “S” y no puede ser nulo. No precisa ponerle longitud. El
tipo ENUM se comporta de una forma similar al tipo SET y tiene la misma
sintaxis. Hay que observar cómo debe escribirse el conjunto de valores
que puede contener este campo: entre paréntesis, cada valor entre
comillas y separados unos valores de otros por una coma.

- 307 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -

 El campo caduca es de tipo DATE, es decir que va a contener una fecha.


No hay que poner longitud. Para este tipo de datos MySQL dispone
además de los tipos TIME para la hora, minutos y segundos, DATETIME,
para la fecha y la hora y TIMESTAMP para el número de segundos
transcurridos desde el 1 de enero de 1970 (época Unix).
 El campo notas es de tipo TEXT. Este tipo de datos permite introducir
gran cantidad de información, de bastantes Mb, al igual que el tipo BLOB.
No hay que poner longitud.

3. Utilizar esta forma de trabajar resulta demasiado pesada, al tener que ir


escribiendo sentencia a sentencia.

Por eso, lo más cómodo y productivo es crear ficheros de texto, es decir, script
MySQL, que se guardan donde nos convenga con la extensión sql. En ellos se
escriben las sentencias MySQL que deseamos se ejecuten cuando sea
necesario.

Una vez escrito y guardado el fichero con la extensión sql, se puede ejecutar
de dos formas:

• Desde una ventana de comandos del sistema operativo, ejecutando


mysql.exe -u root y redireccionando hacia él el fichero sql. Por ejemplo,
supongamos que hemos creado el script creatabla.sql y que lo hemos
guardado en C:\cursoPHP5\alumnos. Nos situamos en una ventana de
comandos en el camino C:\XAMPP\mysql\bin y escribimos:

mysql -u root <C:\cursoPHP5\alumnos\creatabla.sql (Intro)

Si las sentencias son correctas, se ejecutarán y producirán los efectos


pretendidos. Si el fichero ejecutable estuviera en un camino y el fichero sql en
otro, hay que indicar el camino para que el sistema pueda hallar los ficheros
indicados.

Si las sentencias del fichero sql son muchas y se ejecutan seguidas de forma
que el resultado ocupa más de una pantalla, puede utilizarse el comando More
de la ventana de comandos para detener la ejecución en cada pantalla.
Escribir, entonces,

mysql -u root <C:\cursoPHP5\alumnos\creatabla.sql | More


(Intro)

De nuevo, reconocemos que este procedimiento no deja de ser pesado y


engorroso. Por eso, aconsejamos utilizar el siguiente.

• Desde el Cliente MySQL Workbench en la opción del Menú File/Open SQL


Script, abrimos el fichero sql y lo ejecutamos. Si no funciona correctamente,
podemos arreglarlo en el editor según los mensajes de error que se aparecen
en la parte inferior de la ventana.

- 308 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -

Utilizando MySQL Workbench puedes abrir el proyecto Ejemplo 1


(Almacén) de la Unidad 6. Estudia el código fuente y ejecútalo para mostrar
el resultado de su ejecución en el servidor MySQL.

Puede verse el fichero script MySQL con el que hemos creado la base de datos
“almacen” y sus tres tablas “productos”, “compras” y “clientes”. Como no es un
fichero de PHP, no puede interpretarse ni generar una página web, sino sólo
sirve para crear esta base de datos. En la Unidad siguiente aprenderemos a
hacerlo con funciones de PHP.

Con los ejemplos de esta Unidad, referidos todos a MySQL, sólo pretendemos
que el alumno asimile bien los principales contenidos sobre las bases de datos
y sus tablas.

Introducir registros en una tabla

Podemos insertar un registro en la tabla “productos” con la sentencia siguiente:

insert into productos values (0,"Pala",10.55,100,"S",


"2001-12-16","Fuerte y barata");

Otra forma de hacerlo es escribiendo en un fichero de tipo txt la información


anterior, por ejemplo, en el fichero datos_productos.txt, e incorporando los
datos de esta forma:

load data local infile "datos_productos.txt"


into table productos;

Utilizando MySQL Workbench puedes abrir el proyecto Ejemplo 2 (Datos


Almacén) de la Unidad 6. Estudia el código fuente y ejecútalo para mostrar
el resultado de su ejecución en el servidor MySQL.

Tanto en la tabla “productos” como en “compras” y en “clientes” hemos


introducido tres registros. Conviene que el alumno mire en el Ejemplo 2 el
código para ver cómo pueden completarse los valores de los diferentes
campos, sobre todo los de fecha y los numéricos, tanto enteros como reales. Si
ejecuta este script varias veces seguidas, se añadirán tres registros nuevos
cada vez con los mismos datos. Para comprobar que se han cargado los datos
correctamente en las tablas desde el Cliente MySQL Workbench hay que hacer
doble clic sobre el nombre de la tabla y luego pulsar el botón Execute [Control
+ Intro].

Seleccionar o consultar registros dentro de una tabla

La sentencia SELECT permite buscar y mostrar los datos de una tabla. Su


estructura es bastante rica y compleja. Por ello, aconsejamos a los alumnos
que consulten algún libro o dirección de Internet sobre el lenguaje SQL. Aquí
sólo vamos a abordar algunas sentencias, las más importantes, para poder
incorporar estas órdenes dentro de los scripts PHP en la Unidad siguiente. En

- 309 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -

concreto, dentro del propio Cliente MySQL Workbench puede obtenerse ayuda
en inglés sobre los diferentes comandos que admite MySQL. Siempre que lo
necesite, el alumno puede consultarlo si no dispone de otro material que le
resulte más asequible:

Por ejemplo, en la sección SELECT, se indica la sintaxis siguiente:

SELECT
[ALL | DISTINCT | DISTINCTROW ]
[HIGH_PRIORITY]
[STRAIGHT_JOIN]
[SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
[SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
select_expr [, select_expr ...]
[FROM table_references
[PARTITION partition_list]
[WHERE where_condition]
[GROUP BY {col_name | expr | position}
[ASC | DESC], ... [WITH ROLLUP]]
[HAVING where_condition]
[ORDER BY {col_name | expr | position}
[ASC | DESC], ...]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
[PROCEDURE procedure_name(argument_list)]
[INTO OUTFILE 'file_name'
[CHARACTER SET charset_name]
export_options
| INTO DUMPFILE 'file_name'
| INTO var_name [, var_name]]
[FOR UPDATE | LOCK IN SHARE MODE]]

- 310 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -

Veamos cómo se usa esta orden en sus cláusulas más importantes y


frecuentes:

Aplicada a la base de datos “productos”, la sentencia

select codigo,nombre,caduca from productos;

muestra estos campos de todos los registros de la tabla citada.

Si queremos que la búsqueda sólo se realice entre los 50 primeros registros de


la tabla , podemos utilizar la cláusula limit así:

select codigo,nombre,caduca from productos limit 0,50;

Las órdenes siguientes pueden incorporarse en un fichero script MySQL de


texto e ir ejecutándose una a una como hemos indicado (File/Open SQL Script
en el Menú del programa) para poder ver el resultado. En el Ejemplo 3 hemos
colocado varias sentencias select con sintaxis variadas para que el alumno o
alumna pueda apreciar la selección de registros que se hace según las
cláusulas que integren su estructura.

Con la orden anterior se muestran estos datos:

codigo nombre caduca


1 Pala 2014-12-16
2 Azadón 2014-08-01
3 Cuerda de pita 100 metros 2014-08-01

Si queremos que aparezcan todos los campos, usamos la sintaxis

select * from productos;

Si queremos que aparezca el valor del campo caduca sin repeticiones,


podemos usar la orden

select count(distinct caduca) from productos;

Detrás de la cláusula select podemos indicar, como hemos visto, varios


argumentos diferentes para seleccionar los registros de la consulta:

1. El nombre de uno o de varios campos de una o de varias tablas.

2. El signo * para indicar que aparezcan todos los campos.

3. El operador distinct para eliminar de la consulta los registros duplicados.

4. Las funciones de agrupamiento count() para contar, sum() para suma y


avg() para hallar la media de un campo numérico.

- 311 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -

5. Otras funciones, como max() para hallar el valor máximo numérico y min()
para buscar el mínimo.

En el Ejemplo 3 puede verse su sintaxis y los resultados de la cláusula select


aplicando diferentes sintaxis.

La cláusula from (desde) indica el origen de las tablas en las que está archivada
la información. Detrás de ella debe escribirse el nombre de la tabla o tablas,
separadas por comas, de las que se quiere obtener la información. Dentro de
ésta puede asignarse un alias o nombre más sencillo, breve y manejable con el
que deseamos referirnos en adelante a cada tabla. Por ejemplo, en las tablas
“productos” y “clientes” hay un campo denominado “nombre”. Para poder
identificar cada uno dentro de una misma cláusula select, debemos escribir:

select productos.nombre,clientes.nombre
from productos,clientes;

De una forma más breve, podíamos haber usado un alias para cada tabla así:

select P.nombre,C.nombre from productos P,clientes C;

La cláusula where (donde) se usa para seleccionar sólo los registros de una
tabla que cumplan una determinada condición. Por ejemplo, la instrucción

select * from productos where nombre=”Pala”;

mostrará todos los campos de la tabla “productos” que lleven como contenido
“Pala” en el campo nombre.

La condición puede ser compleja usando expresiones en las que intervengan


nombres de campos, valores constantes y operadores, como

select * from productos


where nombre="Pala" and stock>50 and precio_euros>10;

En este caso se mostrarán los registros de la tabla “productos” que contengan


"Pala" en el campo nombre y de los que haya en stock más de 50 ejemplares
cuyo precio_euros sea superior a 10 euros. Se pueden usar también alias
para referirnos a las tablas e incluir en la condición campos de diferentes
tablas.

Pueden utilizarse, igualmente, funciones dentro de las expresiones, como

select nombre,tipo
from clientes where year(alta)>2013;

donde mostramos sólo el nombre y el tipo de los registros de la tabla “clientes”


cuyo año de la fecha de alta sea posterior a 2013.

- 312 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -

La cláusula group by (agrupados por) permite hacer una consulta sumaria, es


decir, en lugar de mostrase todos los registros, se agrupan los que tengan unas
mismas características y se muestra sólo cuántos son. Por ejemplo, la
instrucción

select descuento,count(*)
from productos group by descuento;

muestra sólo el número de registros de la tabla “productos” que tienen


descuento y el número de los que no lo tienen.

La cláusula having (si hay) permite limitar el número de grupos poniendo una
condición a la integración de los grupos. Debe usarse sólo detrás de group by
para insertar la condición. Por ejemplo, la instrucción

select descuento,count(*)
from productos group by descuento
having count(*)>1;

muestra sólo el número de registros de la tabla “productos” que tienen


descuento y que no lo tienen si son más de 1. Así pues, no aparece ahora el
producto que no tiene descuento, pues sólo hace un grupo de 1.

La cláusula order by (ordenar por) hace aparecer en la consulta los registros


ordenados por el campo que se indique. Por ejemplo, la instrucción

select * from productos order by nombre;

muestra los registros de la tabla “productos” ordenados por el campo nombre.


Por defecto, se ordenan de forma ASCendente (de menor a mayor en el código
ASCII), pero podemos ordenarlos también al revés añadiendo la cláusula
DESC. Si ahora escribimos

select * from productos order by nombre desc;

los registros de mostrarán ordenados de mayor a menor (en el código ASCII).

También es posible mostrar los registros ordenados por un segundo campo


cuando hay coincidencia de dos o más registros en el primero. Por ejemplo, la
instrucción

select * from productos order by nombre,stock;

en el caso de que hubiera dos o más productos con el nombre “Azadón”,


mostraría éstos ordenados según el número, de menor a mayor, del campo
stock.

Desde la versión 4.0 del servidor MySQL es posible también utilizar las
Subqueries (subconsultas). Es decir, utilizar el resultado de una consulta dentro
de otra. Por ejemplo, la instrucción

- 313 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -

SELECT * FROM clientes


WHERE clientes.codigo IN (SELECT compras.codigo_cliente from compras)

obtiene todos los registros de la tabla “clientes” que tengan dado de alta algún
registro en la tabla “compras”.

Además, desde la versión 4.0 del servidor MySQL también es posible también
utilizar las JOINS (uniones). Las joins son básicamente la combinación de dos
o más registros de diferentes tablas usando alguna sentencia de comparación.
Por ejemplo, la instrucción siguiente muestra el mismo resultado que la anterior

SELECT * FROM clientes


LEFT JOIN compras ON clientes.codigo = compras.codigo_cliente

Como suele ser muy común confundirse con las distintas combinaciones que
se pueden realizar en las consultas entre varias tablas, vamos a aclarar las
diferencias entre cada una.

Existen las combinaciones internas de tablas donde cada registro de la tabla


A se combina con otro de la tabla B que cumpla las condiciones.

Por ejemplo, seleccionamos todos los registros de la tabla clientes que tengan
algún registro dado de alta en la tabla compras:

SELECT * FROM clientes, compras


WHERE clientes.codigo = compras.codigo_cliente;

Esta consulta anterior se podría haber expresado de forma explícitamente así:

SELECT * FROM clientes


INNER JOIN compras ON clientes.codigo = compras.codigo_cliente

Ambas consultas anteriores muestran el mismo resultado:

Este tipo de combinaciones de tablas en las consultas suele ser la más


utilizada, pero si, por ejemplo, es necesario obtener un listado de todos los
clientes, que hayan realizado o no compras, entonces debemos realizar una
combinación externa de tablas:

SELECT * FROM clientes


LEFT JOIN compras ON clientes.codigo = compras.codigo_cliente;

- 314 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -

De esta forma, se realizada un outer join por la izquierda, es decir, nos


traemos todos los registros de la tabla izquierda (clientes) tengan o no su
correspondencia con la tabla derecha. Por otro lado, si hubiéramos utilizado la
orden right join el resultado hubiera mostrado todos los registros de la tabla
derecha tengan o no su correspondencia con la de la izquierda. Aquellos
registros sin correspondencia entren en el campo de búsqueda mostrarán el
valor NULL (nulo). En este caso, el cliente Delos aparece con los campos
clientes.codigo y compras.codigo_cliente a null:

Si el alumno o alumna desea aumentar sus conocimientos sobre subqueries o


joins puede dirigirse al manual de MySQL donde se muestran la sintaxis y más
ejemplos.

Utilizando MySQL Workbench puedes abrir el proyecto Ejemplo 3


(Consultas Almacén) de la Unidad 6. Estudia el código fuente y ejecútalo
para mostrar el resultado de su ejecución en el servidor MySQL.

Aconsejamos al alumno que al ejecutar las sentencias SQL con el Cliente


MySQL Workbench haga clic con el botón derecho del ratón sobre las tablas
modificadas y, seguidamente, en la opción “Select Rows – Limit 1000”:

Así, desde esta última ventana podrás ir añadiendo y modificando el contenido


de los registros de las tablas “productos”, “compras” y “clientes”; luego, desde
esta ventana puedes ir viendo los resultados de las sentencias SQL:

- 315 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -

Actualizar los registros de una tabla

Para modificar el contenido de los registros de una tabla, hay que utilizar la
sentencia update , que tiene esta sintaxis:

update <nombre de la tabla> set <nombre del campo>


= <expresión>,...,... [where <condición>]

Por ejemplo, si queremos que en la tabla “productos” dentro del campo stock
se ponga el valor 120 en aquellos registros que contengan el valor 100,
podemos usar la instrucción

update productos set stock = 120 where stock=100;

Si no hubiéramos usado la condición en la cláusula where, se habrían cambiado


los valores del campo stock de todos los registros de la tabla.

Si ejecutas la sentencia anterior con MySQL Workbench verás que aparece el


siguiente error:

Error Code: 1175. You are using safe update mode and you tried to
update a table without a WHERE that uses a KEY column To disable safe
mode, toggle the option in Preferences -> SQL Queries and reconnect.

El error indica que la aplicación no permite modificar campos si no se indica en


la cláusula WHERE un campo de tipo clave. Para que se permita la ejecución de
esta sentencia SQL debemos acceder a la opción del menú “Edit ->
Preferences” y desmarcar la opción “Safe updates”:

- 316 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -

Nota: este error aparecerá también para algunas consultas siguientes que no
usan un campo clave para filtrar los registros mostrados.

También podemos cambiar el contenido de varios campos a la vez y usar


funciones y operaciones para modificar los campos. Por ejemplo, aplicada a la
tabla “clientes” la instrucción

update clientes set baja=now(),


deudas_euros=deudas_euros*1.10;

modifica el actual valor NULL del campo baja con la fecha y hora actuales, e
incrementa el campo deudas_euros en el 10 %, en todos los registros

Si desemos modificar los registros de varias tablas a la vez la sintaxis que


debemos usar es la siguiente:

UPDATE tabla1, tabla2 ...


SET nombre_columna1=expr1, nombre_columna2=expr2 ...
[WHERE condición]

- 317 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -

Utilizando MySQL Workbench puedes abrir el proyecto Ejemplo 4


(Actualizaciones Almacén) de la Unidad 6. Estudia el código fuente y
ejecútalo para mostrar el resultado de su ejecución en el servidor MySQL.

Si ejecutas el script SQL puedes ver el uso de la sentencia update y los


resultados aplicando diferentes sintaxis.

Borrar registros

La sentencia delete permite eliminar registros de una tabla. Su sintaxis es

delete from <nombre de la tabla> [where <condición>]

Si no se incluye la cláusula where, que es opcional, se eliminan todos los


registros. Por ejemplo, la instrucción

delete from clientes;

deja la tabla sin registros, pero no la elimina. No es frecuente eliminar todos los
registros de golpe. Por eso, casi siempre se utiliza la cláusula where para
seleccionar los registros que se desea eliminar. Por ejemplo, la instrucción

delete from clientes where deudas_euros=0;

elimina los registros de la tabla “clientes” que no tengan deudas. En cambio,

delete from clientes where codigo=1;

elimina el registro que tenga el número 1 como codigo.

Si desemos llevar a cabo una eliminación múltiple en varias tablas la sintaxis


que debemos usar es la siguiente:

delete <nombre de la tablas donde borramos los registros>


from <nombre de la tablas sobre la que hacemos consultas > [where
<condición>]

Por ejemplo, para eliminar los registros cuyo código de cliente es 1 tanto en la
tabla clientes como en compras escribimos:

delete compras, clientes from compras, clientes


where clientes.codigo=1 and
compras.codigo_cliente=clientes.codigo;

Utilizando MySQL Workbench puedes abrir el proyecto Ejemplo 5


(Borrado de Almacén) de la Unidad 6. Estudia el código fuente y ejecútalo
para mostrar el resultado de su ejecución en el servidor MySQL.

Si ejecutas el script SQL puedes ver el uso de la sentencia delete y los


resultados aplicando diferentes sintaxis.

- 318 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -

NOTA: es importante tener en cuenta que las sentencias SELECT, UPDATE y


DELETE pueden ser utilizadas conjuntamente con subconsultas. Además,
todas estas sentencias permiten actuar sobre varias tablas a la vez.

Crear y destruir índices

Los índices están asociados al fichero de los datos y sirven para mantener en
orden los registros de una tabla.

Para cada tabla sólo puede haber un índice primario, que ordena los registros
por uno o más campos al ir introduciendo los registros en una tabla. Un índice
primario identifica los registros de una tabla de forma única. Si se observa las
tres tablas creadas por nosotros, “productos”, “compras” y “clientes”, puede
verse que hemos generado en todos los casos un índice primario por el campo
“codigo”, de forma que éste será el orden natural al ir introduciendo los
registros. Este campo se autoincrementa de forma que, según se van
añadiendo registros, cada uno va tomando un número consecutivo.

La cláusula primary key , incluida dentro de la sentencia create table , permite


crear un índice primario. También puede verse en el Ejemplo 1 cómo lo hemos
hecho en la instrucción siguiente de creación de la tabla “productos”:

create table if not exists


productos( codigo INT PRIMARY KEY AUTO_INCREMENT,
nombre VARCHAR(30) NOT NULL,
precio_euros DECIMAL(8,3) NOT NULL,
stock TINYINT NOT NULL,
descuento SET('S','N') DEFAULT "S" NOT NULL,
caduca DATE,
notas TEXT);

También pueden crearse ficheros de índice no primario, tantos como se


necesite. Este tipo de índices no identifica cada registro de forma única, sino
que dos o más registros pueden llevar la misma clave. Los ficheros de índice
no primario se crean tomando como clave de ordenación uno o más campos de
la tabla. Su sintaxis es la siguiente:

create [unique|fulltext] index <nombre del índice> on <nombre de la


tabla>(nombre del campo,... )

La opción unique debe usarse cuando queremos que sólo haya un registro con
la misma clave, de forma que, al introducir otro con la misma, no se permita
hacerlo. La opción fulltext sólo puede usarse con campos de tipo varchar y
text, e indica que se tome su texto completo como clave de ordenación. Si se
usan como claves campos de tipo char y varchar, se puede indicar una
longitud de la clave de ordenación, sin que sea necesario usar el campo
completo. Si se usan como claves campos de tipo blob y text, es
imprescindible indicar una longitud de la clave de ordenación.

- 319 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -

Por ejemplo, si queremos crear un fichero de índice denominado c_nombre en


el que se ordenen los registros de la tabla “clientes” por el campo nombre,
debemos escribir la instrucción

create index c_nombre on clientes(nombre);

Si hubiéramos querido usar como clave de orden sólo los 10 primeros


caracteres del campo nombre, deberíamos haber escrito la instrucción

create index c_nombre on clientes(nombre(10));

La sentencia drop index permite eliminar índices. Tiene esta sintaxis

drop index <nombre del índice>


on <nombre de la tabla>

Por ejemplo, si queremos eliminar el índice c_nombre, debemos escribir

drop index c_nombre on clientes;

Utilizando MySQL Workbench puedes abrir el proyecto Ejemplo 6 (Indices


Almacén) de la Unidad 6. Estudia el código fuente y ejecútalo para mostrar
el resultado de su ejecución en el servidor MySQL.

En este Ejemplo 6 se realizan diferentes operaciones de creación de índices,


de mostrar los índices asociados a una tabla y de eliminación de los mismos
aplicadas a las tablas “productos” y “clientes”.

Eliminar tablas y bases de datos

Para eliminar una tabla hay que usar la sentencia drop table, que tiene esta
sintaxis:

drop table [if exists] <nombre de la tabla>,...

Por ejemplo, si queremos eliminar la tabla “productos”, hay que usar la


instrucción

drop table if exists productos;

Para eliminar una base de datos hay que usar la sentencia drop database, que
tiene esta sintaxis:

drop database [if exists] <nombre de la base de datos>,...

Por ejemplo, si queremos eliminar la base de datos “almacen”, hay que usar la
instrucción

drop database if exists almacen;

- 320 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -

Utilizando MySQL Workbench puedes abrir el proyecto Ejemplo 7


(Eliminación Almacén) de la Unidad 6. Estudia el código fuente y ejecútalo
para mostrar el resultado de su ejecución en el servidor MySQL.

En el Ejemplo 7 se eliminan las dos tablas creadas en la base de datos


“almacen” y la propia base de datos. El alumno puede estudiar en ese código
sql cómo se aplican las instrucciones comentadas anteriormente.

Notas importantes

1. Los siete ejemplos de este apartado no son código php, por lo cual no
pueden interpretarse ni generar páginas web como hemos hecho hasta ahora.

2. Es muy importante ejecutar los ejemplos en orden, pues en ellos se sigue un


proceso lógico: primero se crea la base de datos “almacén” y sus tres tablas
“productos”, “compras” y “clientes” (ejemplo 1); luego, se incorporan tres
registros cada una de las veces que se ejecuta el ejemplo 2; en el ejemplo 3 se
utilizan diferentes sintaxis de la sentencia select para hacer consultas;
posteriormente, se eliminan registros (ejemplo 4); a continuación, se actualizan
los datos de los registros (ejemplo 5); seguidamente, se crean índices y se
destruyen (ejemplo 6); y, finalmente, se eliminan las tablas y la base de datos
(ejemplo 7). De ahí la necesidad de proceder de forma lógica al ir ejecutando
los citados ejemplos.

3. Por otra parte, la utilidad Cliente MySQL Workbench puede ayudarnos a ver
los datos y a comprender más intuitivamente lo que pasa en cada proceso.
Para ejecutar scripts complejos con varios comandos SQL seguidos de ";"
debes usar la opción del Menú File/Open SQL Script.

4. Finalmente, queremos insistir en que sólo hemos expuesto lo básico del


lenguaje SQL, debido a que el aprendizaje del mismo no es objeto de este
curso, sino que se supone que los alumnos y alumnas que se han matriculado
en este curso de PHP deben tener ya previamente asimilados los
conocimientos básicos necesarios de SQL para realizar el curso de PHP.

- 321 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -

Resumen

Hay que saber al final de esta unidad

 Cómo es la arquitectura de una aplicación PHP que


utilice bases de datos y mediante qué dos tipos de
enlaces puede acceder el servidor a las bases de
datos.

 Los conceptos fundamentales de las bases de datos


relacionales: diferentes tipos de bases de datos
relacionales, organización de la información en
filas (registros) y columnas (campos),
características de cada campo (nombre, tipo,
longitud, si es la clave de un índice, etcétera).

 Las ventajas que aportan las bases de datos al


almacenamiento y manejo de la información que
contienen.

 Cómo se lleva a cabo el diseño correcto y eficaz


de una base de datos.

 Arrancar el servidor de datos MySQL, comprobar que


está activado y desactivarlo (echarlo abajo) al
acabar la sesión de trabajo del curso.

 Arrancar el programa "MySQL monitor" desde una


ventana del DOS y escribir desde su prompt las
sentencias SQL básicas para tratar las bases de
datos y las tablas.

 Arrancar la utilidad "Cliente MySQL Workbench",


conectarse al servidor de datos y manejar con
cierta soltura las principales opciones de este
programa que permiten crear bases de datos y
tablas, eliminarlas, acceder a la información de
las mismas y tratarla, etcétera.

 Crear, guardar, abrir y ejecutar Queries con la


utilidad anterior.

 Aplicar correctamente las principales sentencias


SQL para crear bases de datos y tablas, mostrar

- 322 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -

las que haya creadas, usarlas, introducir


registros en las tablas, consultar su información,
actualizarlos, eliminarlos, crear y eliminar
índices, así como eliminar tablas y bases de
datos.

- 323 -
Curso de Iniciación a PHP: Unidad 6
- Servidor de Base de datos MySQL -

- 324 -
MÓDULO 3

PHP y las bases de datos (PDO)

Unidad 7

Índice de la unidad:

1. Funciones PHP – Bases de datos

2. Crear, seleccionar y destruir una base de datos

3. Realizar consultas en una base de datos

4. Modificar la información de una base de datos

5. Instalación y uso de MyODBD

6. Resumen
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -

Introducción
En esta Unidad vamos a aprender a conectarse al servidor que contiene el
gestor de bases de datos MySQL. Además, crearemos una base de datos,
nos conectaremos a ella y borraremos sus tablas e información, sabiendo
utilizar, además, las funciones que controlan los posibles errores.

Veremos cómo consultar una base de datos utilizando queries en las que
intervengan las principales funciones de PHP para acceder a bases de
datos de tipo MySQL y tratar su información.

También insertaremos, actualizaremos y eliminaremos registros de una


tabla, haciendo uso, además, de formularios y de celdas de tablas para
mostrar su información, preguntarla o seleccionar campos

Instalaremos y usaremos el controlador MyODBC para poder conectar


desde MS Access con las bases de datos de tipo MySQL, así como saber
importar o exportar tablas entre ambos gestores de bases de datos.

Finalmente, mantendremos una base de datos a través de funciones de


usuario aplicando las principales operaciones de este tipo: altas, bajas,
consultas, búsquedas, actualizaciones, etcétera.

Conexión con una base de datos


Ya hemos comentado en las Unidades anteriores que PHP permite acceder y
tratar la información de las principales bases de datos que hay en el mercado
actualmente: Oracle, MySQL, PostgreSQL, SysBase, Informix, etcétera. En la
Unidad anterior también hemos comentado que puede hacerlo tanto a través
de los programas nativos de la propia base de datos (API) como mediante una
conexión genérica de tipo OBDC o PDO.

En esta Unidad vamos a exponer y explicar, precisamente, cómo accede PHP


a MySQL y las funciones que permiten realizar operaciones con las bases de
datos, sus tablas y los datos que contengan: crearlas, introducir información,
actualizar ésta, eliminarla, elaborar informes a partir de la misma, etcétera. Así
pues, en esta Unidad se estudiarán las principales funciones de PHP
relacionadas con el servidor de datos MySQL.

La extensión PDO (PHP Data Objects) permite acceder a distintas bases de


datos utilizando las mismas funciones, lo que facilita la portabilidad. Haremos,
pues, uso de esta extensión PDO para acceder a bases de datos.

En esta misma Unidad, más adelante, estableceremos también una conexión


OBDC que nos permitirá acceder a las bases de datos de tipo MS Access.

Si los alumnos y alumnas del curso han comprendido y asimilado bien los
conceptos fundamentales sobre las bases de datos relacionales, explicados en

- 327 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -

la Unidad anterior, y aprenden a manejar en esta Unidad las bases de datos de


tipo MySQL, estarán preparados sin duda para poder aplicar las funciones
correspondientes de otros tipos de bases de datos, que también incorpora el
lenguaje PHP.

En esta Unidad vamos a seguir un proceso similar al de la Unidad anterior,


llevando a cabo más o menos las mismas operaciones con las bases de datos,
pero en este caso usando las funciones de PHP.

Establecer una conexión con el servidor de bases de datos MySQL

Para realizar una conexión con una base de datos hay que crear una instancia
de la clase PDO, que se utilizará en todas las consultas posteriores. En todas las
páginas PHP en las que usen consultas a bases de datos es necesario
conectar primero con dicha base de datos.

Si no se puede establecer la conexión con la base de datos hay que comprobar


que la base de datos esté arrancada y funcionando correctamente y que las
credenciales del usuario sean correctas.

Para poder acceder a MySQL mediante PDO, debe estar activada la extensión
php_pdo_mysql en el archivo de configuración php.ini. El servidor XAMPP ya
trae por defecto activada esta extensión.

El constructor PDO() establece una conexión con el servidor de bases de datos


MySQL (u otro servidor de bases de datos compatible). Tiene la siguiente
sintaxis:

PDO (nombre del servidor [:puerto]


[, string usuario
[, string contraseña
[, array opciones ]]]
)

Esta función devuelve un objeto si se establece la conexión o se lanza una


excepción si no se consigue conectar.

Como hemos visto, para establecer una conexión con el servidor MySQL,
pueden utilizarse hasta cinco datos:

1. Servidor: nombre del equipo o dirección IP donde está la base de datos.


Por defecto, si no se pone nada, se asume el servidor “localhost”.

2. Puerto: vía por donde se accede a la base de datos. Si no se pone, por


defecto se asume el valor por defecto que es el “3306”.

3. Usuario: nombre del usuario que accede a la base de datos. Por defecto es
el que tenga el propietario del servidor. En el servidor XAMPP es “root”.

- 328 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -

5. Clave: es la contraseña de acceso que tiene el usuario. Si no se pone, se


asume una cadena vacía.

6. Opciones: parámetro opcional que permite establecer ciertas


características de la conexión.

La conexión con el servidor se cierra cuando acaba de interpretarse el script


PHP. Puede cerrarse antes indicándolo explícitamente destruyendo el objeto
PDO.

Por ejemplo, si queremos establecer una conexión con el servidor “mihost”


utilizando el nombre de usuario “joseja”, la clave “garcia” y conectar con la base
de datos “mi_base_de_datos”, debemos escribir:

try {
$db = new PDO("mysql:host=mihost;dbname=
mi_base_de_datos;charset=utf8", joseja, garcia);
$db->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
$db->setAttribute(PDO::NULL_TO_STRING, true);
} catch (PDOException $e) {
die ("<p><H3>No se ha podido establecer la conexión.
<P>Compruebe si está activado el servidor de bases de
datos MySQL.</H3></p>\n <p>Error: " . $e->getMessage() .
"</p>\n");
}

Hay que tener en cuenta que, para que estos datos sean aceptados como
válidos, es necesario que el servidor se denomine así. Además, el nombre del
usuario, la clave y la base de datos deben haber sido dados de alta en el
servidor MySQL antes de pretender usarlos, ya que el servidor procede a
autentificar estos datos antes de permitir la conexión.

El método setAttribute(atributo, valor) de la clase PDO permite establecer


un atributo en la conexión a la base de datos. Puedes encontrar el listado
completo de atributos en el manual de PHP. Hay que tener en cuenta que
algunos de estos atributos dependen de la base de datos que estemos
utilizando en un proyecto en concreto.

Entre los más importantes podemos encontrar los atributos que controlan el
formato del nombre de los campos de la base de datos (PDO::ATTR_CASE) y el
tipo de errores que mostrarán las consultas a la base de datos
(PDO::ATTR_ERRMODE).

En el ejemplo anterior hemos los atributos siguientes:

 PDO::MYSQL_ATTR_USE_BUFFERED_QUERY: permite realizar consultas


utilizando un buffer para almacenar los resultados. Es recomendable
usar este atributo, pues así podemos lanzar varias consultas al mismo
tiempo dentro del código PHP.
 PDO::NULL_TO_STRING: si el resultado de un campo es NULL entonces,
este valor se convierte a una cadena vacía.

- 329 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -

Ahora bien, como esta instrucción, si se consigue, devuelve un objeto que sirve
de conexión a la base de datos que después hemos de utilizar, lo mejor es
asignar a una variable el nombre de este identificador, de esta forma:

$db = new PDO("mysql:host=mihost;dbname=


mi_base_de_datos;charset=utf8", joseja, garcia);

IMPORTANTE: hemos añadido a la cadena de conexión el juego de caracteres


que se usarán en la conexión con la base de datos: charset=utf8. Hay que
tener en cuenta que el código fuente de los ejemplos del curso usa el juego de
caracteres UTF8 para que sea compatible con los diferentes sistemas
operativos disponibles en el mercado. Por lo tanto, para que los caracteres
especiales como tildes y la letra “ñ” aparezcan correctamente en el fichero final,
es necesario configurarlo de esta manera.

Por otra parte, puede ser que no se logre conectar, en cuyo caso se produciría
una excepción del tipo PDOException que contiene un mensaje en inglés. Para
optimizar un poco la salida en este caso, lo mejor es utilizar un bloque
try…catch y la función die(), para prescindir del mensaje del sistema, y
mostrar un mensaje personalizado, de esta forma:

try {
$db = new PDO("mysql:host=mihost;dbname=
mi_base_de_datos;charset=utf8", joseja, garcia);
...
} catch (PDOException $e) {
die ("<p><H3>No se ha podido establecer la conexión.
<P>Compruebe si está activado el servidor de bases de
datos MySQL.</H3></p>\n <p>Error: " . $e->getMessage() .
"</p>\n");
}

El método getMessage() de la clase PDOException permite obtener el mensaje


original devuelto por el servidor de base de datos y getCode() indica el número
de código interno del error.

Además, como lo más probable es que necesitemos usar sucesivas


conexiones, lo mejor es asignar sus valores a las datos de conexión,
guardarlas en un fichero de texto y, luego, con la sentencia include o require
importarlas al script correspondiente cuando se necesiten para establecer una
conexión.

Por ejemplo, creamos el fichero uni7_utilidades.php y guardamos en el


mismo este contenido:

<?php

/* Fijamos las constantes de la conexión al servidor MySQL.


El nombre del servidor es el que admite por defecto el servidor
local.*/

- 330 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -

define("SERVIDOR", "localhost");
define("USUARIO", "root");
define("CLAVE", "");

/* Función que conecta con el servidor MySQL y, si se indica,


selecciona la BD indicada como parámetro.*/
function conectaBD($BD='')
{
/* Intentamos establecer una conexión con el servidor.*/
try {
if ($BD=='')
$db = new PDO("mysql:host=".SERVIDOR.";
charset=utf8", USUARIO, CLAVE);
else $db = new PDO("mysql:host=" . SERVIDOR .
";dbname=" . $BD.";charset=utf8", USUARIO, CLAVE);
$db->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY,
true);
return($db);
} catch (PDOException $e) {
die ("<p><H3>No se ha podido establecer la conexión.
<P>Compruebe si está activado el servidor de bases
de datos MySQL.</H3></p>\n <p>Error: " .
$e->getMessage() . "</p>\n");
} // end try
}
?>

Después, ya podemos establecer la conexión en el script correspondiente, de


esta forma:

<?php

require("uni7_utilidades.php");
$db = conectaBD();
?>

Utilizando Eclipse PDT puedes abrir el proyecto Ejemplo 1 (Conexión


base de datos) de la Unidad 7. Estudia el código fuente y ejecútalo para
mostrar en el navegador su resultado.

En el Ejemplo 1 de esta Unidad puede verse cómo hemos usado el constructor


PDO() para establecer una conexión con el servidor MySQL. Para poder
ejecutarlo, es preciso arrancar el servidor MySQL antes de intentar establecer
una conexión. Ahora ya no es preciso arrancar la utilidad MySQL Workbench ni
conectarse mediante la misma.

Conexión a servidores que contengan otros tipos de bases de


datos

Aunque en este curso sólo se usa el gestor de base de datos MySQL, ponemos
a continuación ejemplos para mostrar cómo que se conectaría a otros tipos de
bases de datos de las que pudiera disponer particularmente el alumno. En todo

- 331 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -

caso, consultando el Manual de PHP puede obtenerse información detallada


sobre estas funciones y conocer su sintaxis.

Base de datos Función para conectarse

PostgreSQL new PDO('pgsql:host=servidor;port=5432;


dbname=base_datos', usuario, contraseña);

SQLite new PDO("sqlite:/datos/basedeDatos.sqlite");

En estos dos tipos de bases de datos, se realizan a la vez dos operaciones:


conectarse al servidor y a la base de datos.

ODBC new PDO( 'odbc:Driver={Microsoft Access Driver (*.mdb)};


DBQ=C:\\ejemplo.mdb;Uid=usuario' );;

En el último apartado de esta Unidad aprenderemos a establecer conexiones


mediante el estándar ODBC y a acceder a los datos de bases de datos de tipo
Access.

SQL Server new PDO( 'mssql:host=servidor;dbname=base_datos',


usuario, contraseña);

Oracle new PDO( 'oci:dbname=//servidor:40251/base_datos',


usuario, contraseña );

- 332 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -

Crear, seleccionar y destruir una base de datos


PHP permite también crear, seleccionar y borrar bases de datos asociadas a
un identificador de conexión dentro del servidor al que se ha conectado.

Queremos hacer aquí una advertencia importante. Las operaciones de crear y


eliminar bases de datos y tablas dentro de éstas son más bien propias del
administrador del servidor y, por tanto, no es habitual que un usuario o cliente
pueda crearlas y destruirlas. En cambio, son operaciones más propias de un
cliente hacer solicitudes que permitan consultar y, como máximo, ampliar,
modificar o eliminar el contenido de una base de datos desde su navegador.

Es importante saber que si se borra una base de datos, ésta no sólo pierde el
contenido, sino que, después, no se pueden recuperar sus datos.

En este apartado vamos a estudiar las maneras de crear bases de datos y


destruirlas. Asimismo, veremos cómo podemos seleccionar una entre las
diferentes base de datos que haya en el servidor.

Crear una base de datos

Para crear una base de datos de tipo MySQL asociada a una conexión PDO,
hay que utilizar directamente una query, es decir, es necesario ejecutar una
consulta SQL.

Por ejemplo, si queremos crear la base de datos “pruebas” asociada a la


conexión $db del apartado anterior, podemos escribir

$db->query('CREATE DATABASE pruebas');

Para asimilar bien el método query(), hay que estudiarlo detenidamente en el


apartado siguiente, donde se aborda.

Como puede producirse algún error, es conveniente utilizar una estructura


condicional de la forma siguiente:

if ($db->query('CREATE DATABASE pruebas'))


{
print("<H3>La base de datos \"pruebas\" se ha creado
correctamente.<P>Con el explorador puedes observar que se
ha creado<P>la carpeta \"pruebas\" en
C:\\XAMPP\bin\mysql\data. </H3>");
}
else // Si no se ejecuta correctamente mostramos el error al usuario
{
echo"<H3>No se ha podido crear la base de datos
\"pruebas\". Errores: </H3><PRE>";
print_r($db->errorInfo());
echo "</PRE>";
}

- 333 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -

Hemos aprovechado la estructura condicional anterior para incluir un nuevo


método que puede servirnos en la gestión de errores cuando se produzcan
éstos en cualquier tipo de operación con una base de datos. Es la siguiente:

La función errorInfo() devuelve la información del error asignado por MySQL


correspondiente al error que se ha producido. Por ejemplo, si ya existe la base
de datos “pruebas” por haber sido creada antes, se indicará lo siguiente al
ejecutarse la cláusula else de la estructura anterior:

Array
(
[0] => HY000
[1] => 1007
[2] => Can't create database 'pruebas'; database exists
)

El índice 1 indica el nº de código de error y el índice 2 es el texto de error en


inglés de la base de datos MySQL.

Si empleamos acertadamente esta función para manejar y controlar los errores,


se pueden conocer y detectar, antes de solucionarlos, posibles problemas al
realizar diferentes operaciones con las bases de datos.

Eliminar una base de datos

Para eliminar una base de datos de tipo MySQL asociada a una conexión, de
nuevo, hay que usar usando una query, es decir, ejecutar una consulta SQL.

Por ejemplo, si queremos borrar la base de datos “pruebas” asociada a la


conexión actual, podemos escribir

$db->query('DROP DATABASE pruebas');

Recordamos que para asimilar bien el método query(), hay que estudiarla
detenidamente en el apartado siguiente, donde se aborda.

Es importante tener mucho cuidado al utilizar esta función, ya que, si se


ejecuta, se perderá la base de datos con sus tablas y toda la información que
contengan, sin que sea posible recuperarlas posteriormente.

También en este caso conviene utilizar una estructura de control condicional y


las funciones de control de errores, como hemos hecho y explicado al crear
esta base de datos.

Creación de tablas

Como hemos dicho, PHP no dispone de funciones para crear tablas dentro de
las bases de datos. Ésta es más bien una operación del administrador del
servidor que contiene la información. Por ello, quien necesite crear tablas

- 334 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -

dentro de una base de datos ha de recurrir a scripts de tipo sql que puede
ejecutar mediante la utilidad MySQL Workbench. De todo ello hemos hablado y
realizado suficientes prácticas en la Unidad 6.

No obstante, en el apartado siguiente veremos que se pueden crear tablas


mediante una query, es decir, ejecutando una consulta. Por ejemplo, si dentro
de la base de datos “pruebas” queremos incluir la tabla “agenda”, podemos
hacerlo así:

$consulta = "create table agenda (registro INT NOT NULL


AUTO_INCREMENT, nombre CHAR(50),direccion CHAR(100),
telefono CHAR(15), email CHAR(50), KEY (registro) )”;

$db->query($consulta);

En la primera de las dos instrucciones anteriores asignamos a la variable


$consulta la sentencia sql de creación de la tabla “agenda” indicando el
nombre de ésta, así como el nombre de los campos, su tipo y longitud.
Además, fijamos como clave de índice el campo “registro”.

En la segunda instrucción ejecutamos la query, gracias a lo cual dentro de la


base de datos “pruebas” se crea la tabla “agenda” con la estructura
especificada. En el apartado siguiente encontrarás toda la información
necesaria sobre el método query().

Utilizando Eclipse PDT puedes abrir el proyecto Ejemplo 1 (Conexión


base de datos) de la Unidad 7. Estudia el código fuente y ejecútalo para
mostrar en el navegador su resultado.

En el Ejemplo 1 de esta Unidad aparece el código donde se crea la tabla


indicada, así como las consultas anteriores utilizadas en este apartado.

- 335 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -

Realizar consultas en una base de datos


PHP permite también consultar la información que haya en las tablas de una
base de datos emitiendo con ella diferentes tipos de informes.

En este apartado vamos estudiar las funciones que permiten realizar consultas
y elaborar informes a partir de la información contenida en las tablas de una
base de datos. Concretamente, nos vamos a conectar a la base de datos
“biblioteca”, y a servirnos de su información para elaborar los informes y
realizar las queries (consultas) de este apartado.

Ahora necesitamos conocer y recordar las sentencias SQL que vamos a poner
como argumentos de las funciones de PHP. En la Unidad 6 se explicaron las
más importantes. Si el alumno tiene alguna duda sobre la interpretación de las
mismas, puede recurrir a los contenidos de la Unidad anterior o bien consultar
algún manual propio sobre SQL o buscar información en las direcciones de
Internet, indicadas en la Presentación del curso, que hacen referencia a este
lenguaje.

Consultar una base de datos

El método query() de la clase PDO envía una sentencia SQL al servidor para
que éste la interprete. Su sintaxis es ésta:

query(consulta)

Lo más recomendable es crear una variable y asignarle el texto de la consulta.


Después, pasamos esta variable como primer argumento del método query().

Por ejemplo, si queremos enviar al servidor una consulta de la base de datos


“biblioteca” en la que se muestren el título y el autor de los libros de la tabla
“libros”, debemos escribir

$consulta="select titulo,autor from libros";


$db->query($consulta);

La función query() devuelve False para indicar que la sentencia es incorrecta y


se ha ejecutado con problemas y el conjunto de resultados si se ha ejecutado
correctamente. Además, no indica el número de filas devueltas (en el ejemplo
anterior, registros de la tabla), aunque la sentencia SQL se ejecute
correctamente.

Como puede producirse algún error, es conveniente utilizar alguno de los


procedimientos ya conocidos: una estructura condicional y la combinación de la
función die(), como ya hemos explicado anteriormente.

Como puede verse en el Ejemplo 2, hemos preferido la siguiente sintaxis:

$resultado = $db->query($consulta);
if (!$resultado) {

- 336 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -

$error=$db->errorInfo();
print "<p>Error en la consulta. Error ". $error[2] ."</p>\n";
} else {
echo "<P>Resultado Consulta de la tabla 'libros':<P>
<TABLE border=1><TR><TD>Título</TD><TD>Autor</TD></TR>";
foreach ($resultado as $valor) {
print "<TR><TD>$valor[titulo]</TD>
<TD>$valor[autor]</TD></TR>\n";
}
echo "</TABLE>";
}

Conviene observar que el método query() ejecuta la consulta si es correcta,


pero no devuelve por sí sola ninguna información al navegador del cliente. Por
eso, hemos asignado su resultado a la variable $resultado, que vamos a usar
como identificador de la consulta para mostrar, posteriormente el resultado con
un bucle foreach().

Así pues, debemos combinar el primer método (query()) con la segunda


(foreach()) para poder asignar la información de la consulta a diferentes
variables y, luego, poder mostrar éstas en la pantalla del cliente.

En la Unidad anterior ya explicamos que una tabla está estructurada en filas


(registros) y columnas (campos). Pues bien, al producirse la consulta, el
identificador devuelto por la misma es una especie de matriz bidimensional que
tiene en la primera dimensión tantas filas como registros se hayan visto
afectados y en la segunda, tantas columnas como se haya indicado. Por
ejemplo, en nuestra consulta anterior, que ejecuta la sentencia SQL select
titulo,autor from libros, sabemos que hay 28 filas (todos los registros de la
tabla “libros”) y 2 columnas (los campos indicados).

Podemos acceder a cualquiera de esos 56 datos indicando simplemente el


número de fila y el de columna, contando siempre desde 0 en adelante. Por
ejemplo, puede verse en las siguientes sentencias cómo se obtienen los dos
campos (título y autor) de los dos primeros registros de la forma siguiente:

$datos_resultado = $resultado->fetchAll();
echo $datos_resultado[0][0].' de '. $datos_resultado[0][1];
echo $datos_resultado[1][0].' de '. $datos_resultado[1][1];

En lugar del número de columna, podemos indicar directamente el nombre del


campo, como cadena, o bien el alias que le hayamos asignado. Por ejemplo,
podemos escribir también así la primera instrucción de asignación:

echo $datos_resultado[0]['titulo'].' de '.


$datos_resultado[0]['autor'];

o bien, si hubiéramos definido la consulta como select titulo,autor as a


from libros, podíamos haber escrito

echo $datos_resultado[0]['titulo'].' de '.


$datos_resultado[0]['a'];

- 337 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -

En las explicaciones anteriores hemos utilizado el acceso individualizado a


cada uno de los datos de la consulta por motivos didácticos, para que el
alumno comprenda bien cómo se produce la consulta y el resultado que
genera. Cabe destacar que no conocemos el número de registros de una base
de datos MySQL hasta que hacemos una consulta sobre la misma.

A continuación, estudiaremos otro método que permite un tratamiento más


adecuado y una presentación más eficaz de la información resultante de una
consulta. Es el siguiente:

Mediante un bucle foreach() devuelve el contenido de una sentencia SQL en


un array identificando cada elemento con un campo de la tabla:

foreach ($resultado as $valor) {


print "<TR><TD>$valor[titulo]</TD><TD>$valor[editorial]</TD>
<TD>$valor[anno_publica]</TD><TD>$valor[paginas]</TD>
<TD>$valor[precio_euros]</TD></TR>\n";
}

La función fetch() devuelve el contenido de una sentencia SQL en un array


identificando cada elemento con un campo de la tabla. Extrae sólo una fila del
resultado como una matriz asociativa y mueve el puntero al registro siguiente.
Su sintaxis es ésta:

fetch()([tipo_resultado, [sentido_movimiento_puntero
[,cantidad_avance_puntero]]])

Si la función fetch() llega al final de los registros resultantes de la consulta


SQL entonces devuelve FALSE en lugar de la matriz con los datos.

Si dos o más campos del resultado tienen el mismo nombre, el último tiene
prioridad. Para acceder a los otros campos con el mismo nombre, hay que
especificar el índice numérico o definir un alias para esos campos. Por ejemplo,
en nuestra base de datos “biblioteca” las tres tablas tiene el campo homónimo
“registro”. Para que en la matriz resultante de la consulta se distingan los tres,
deberíamos escribir así la sentencia SQL:

select l.registro as lr, u.registro as ur, p.registro


as pr from libros l,usuarios u, prestamos p;

De esta forma, en la matriz resultante tendríamos una columna para lr (registro


de libros), otra para ur (registro de usuarios) y una tercera para pr (registro de
préstamos).

El segundo argumento, que es opcional, es una constante y puede tener los


valores siguientes:

- 338 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -

 PDO::FETCH_ASSOC: el método devuelve un array indexado por los


nombres de las columnas del resultado de la consulta.

 PDO::FETCH_BOTH (predeterminado): el método devuelve un array


indexado tanto por nombre de columna como por número (el índice 0 es
la primera columna) devuelto por el resultado de la consulta.

 PDO::FETCH_BOUND: el método devuelve TRUE y asigna los valores de las


columnas del resultados de la consulta a variables de PHP vinculadas
mediante el método PDOStatement::bindColumn().

 PDO::FETCH_CLASS: el método devuelve un nuevo objeto de la clase


indicada como parámetro, haciendo corresponder las columnas del
resultado de la consulta con los nombres de las propiedades de la clase.

 PDO::FETCH_INTO: incluye un objeto en la conexión antes de realizar la


consulta a la base de datos. Es necesario hacer coincidir el nombre de
las columnas con los nombres de las propiedades de la clase.

 PDO::FETCH_LAZY: combina PDO::FETCH_BOTH y PDO::FETCH_OBJ, creando


un objeto con los nombres de las columnas como propiedades del
objeto.

 PDO::FETCH_NAMED: devuelve un array de la misma forma que


PDO::FETCH_ASSOC. En el caso de que hubiera múltiples columnas con el
mismo nombre, el valor al que hace referencia dicha clave será, a su
vez, un nuevo array con todos los valores de la fila de tuviera ese
nombre de columna.

 PDO::FETCH_NUM: devuelve un array indexado por el número de columna


comenzando por la columna 0.

 PDO::FETCH_OBJ: devuelve un objeto en el que los nombres de sus


propiedades corresponden a los nombres de las columnas devueltas en
el resultado de la consulta.

Por razones evidentes es muy interesante utilizar el método fetch().

En el Ejemplo 2 de esta Unidad podemos aplicar el método explicado


incluyéndole dentro de un bucle para recorrer todos los registros de la tabla.
Éste es el código que podemos emplear:

while ($fila = $resultado->fetch()) {


print "<pre>\n";
print_r($fila);
print "</pre>\n";
}

El resultado en la página será el siguiente:

- 339 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -

Array
(
[titulo] => El túnel
[0] => El túnel
[editorial] => Alfaguara
[1] => Alfaguara
[anno_publica] => 2000
[2] => 2000
[paginas] => 128
[3] => 128
[precio_euros] => 5.650
[4] => 5.650
)

Array
(
[titulo] => Instinto de Inez
[0] => Instinto de Inez
[editorial] => Alfaguara
[1] => Alfaguara
[anno_publica] => 2001
[2] => 2001
[paginas] => 189
[3] => 189
[precio_euros] => 20.550
[4] => 20.550
)

...

El método rowCount() devuelve el número de filas que se han vista afectadas al


ejecutarse una sentencia SQL. Por ejemplo, podemos mostrar el título, la
editorial, el año de publicación, el número de páginas y el precio de todos los
libros que sean de la editorial “Alfaguara”, ordenados por título, con el bucle
siguiente y mostrar al final el número de registros obtenidos en la consulta:

$consulta="select titulo,editorial,anno_publica,paginas,
precio_euros from libros where editorial='Alfaguara'
order by titulo";

$resultado = $db->query($consulta);
if (!$resultado) {
print "<p>Error en la consulta.</p>\n";
} else {
echo "<P>Resultado Consulta de la tabla 'libros':<P>
<TABLE border=1><TR><TD>Título</TD>
<TD>Editorial</TD><TD>Año publicación</TD>
<TD>Páginas</TD><TD>Precio</TD></TR>";
foreach ($resultado as $valor) {
print "<TR><TD>$valor[titulo]</TD>
<TD>$valor[editorial]</TD>
<TD>$valor[anno_publica]</TD>
<TD>$valor[paginas]</TD>
<TD>$valor[precio_euros]</TD></TR>\n";
}
echo "</TABLE></P>";
echo "<CENTER><H4>En la consulta anterior se han visto

- 340 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -

afectados " . $resultado->columnCount() .


" campos.<P></H4></CENTER>";

El método getColumnMeta(columna) devuelve las características de la columna


(campo de la tabla en la base de datos) al ejecutar una sentencia SQL. Puede
observarse cómo hemos usado esta función en el código siguiente:

$consulta="select * from usuarios LIMIT 0";


$resultado = $db->query($consulta);
if (!$resultado) {
print "<p>Error en la consulta.</p>\n";
} else {
for ($i = 0; $i < $resultado->columnCount(); $i++) {
$col = $resultado->getColumnMeta($i);
print "<TR><TD> $col[name]</TD><TD>$col[table]</TD>
<TD>$col[native_type]</TD><TD>$col[len]</TD>\n";
}
echo "</TABLE></P>";
}

En el Ejemplo 2 puede ejecutarse el código completo de la consulta anterior.


Puedes ver que el método getColumnMeta() devuelve una matriz que tiene este
contenido:

Array
(
[native_type] => VAR_STRING
[pdo_type] => 2
[flags] => Array
(
[0] => not_null
)
[table] => usuarios
[name] => Nombre
[len] => 15
[precision] => 0
)

Así, podemos conocer las características siguientes de un campo (columna de


la consulta), que se devuelven como elementos de una matriz:

 name: Nombre de la columna.


 table: Nombre de la tabla a la que pertenece la columna.
 len: Longitud máxima de la columna.
 flags: matriz que indica otras características de la columna.
 native_type: Tipo de la columna.
 pdo_type: Tipo de la columna en formato PDO.
 precision: Devuelve la precisión del campo.

El conocimiento de estos datos puede ser necesario en ocasiones. En el


Ejemplo 2 (opción Propiedades y flags de algunos campos) puede verse
cómo mostramos en la pantalla las propiedades del campo “sueldo_euros” de
la tabla “usuarios”.

- 341 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -

El método exec() de la clase PDO envía una sentencia SQL al servidor para
que éste la interprete y devuelva el número de filas que ha afectado la consulta.
Su sintaxis es ésta:

exec(consulta)

Es un método muy útil para conocer a cuántos registros ha afectado una


consulta que modifique o borre varios registros a la vez.

Por ejemplo, si queremos enviar al servidor una consulta de la base de datos


“biblioteca” en la que se borren los registros de la tabla “libros” de la editorial
“Alfaguara”, debemos escribir

$consulta="delete from libros where editorial='Alfaguara'";


$total=$db->exec($consulta);
echo "Se han borrado $total registros de la tabla 'libros'.";

La función exec() devuelve False para indicar que la sentencia es incorrecta y


se ha ejecutado con problemas.

IMPORTANTE: este método puede devolver el valor booleano False, pero


también puede devolver el valor 0 (ningún registro afectado) que se evalúa
como False. Para detectar la diferencia hay que utilizar el operador === para
comprobar el valor devuelto por este método.

Cómo utilizar ventanas, botones y tablas

En los ejemplos anteriores hemos ofrecido la información de las bases de datos


“a pelo”, es decir, mostrando sus datos tal cual. En este caso nuestra intención
ha sido que los alumnos y alumnas asimilen bien las funciones explicadas y su
sintaxis. Por ello, no nos hemos preocupado demasiado de la presentación en
la pantalla de su información.

Pero, habitualmente, se utilizan etiquetas HTML para formatear la salida de la


información, seleccionar algún dato o introducirlo desde la pantalla de nuestro
navegador usando formularios. Esto se consigue rellenando etiquetas:
ventanas desplegables (Select) y botones (Input) con los datos de uno o de
varios campos de una tabla de datos. Además, la información puede hacerse
aparecer dentro de las celdas de alguna tabla (Table), de forma que los
registros y campos se incluyan en el interior de éstas.

Veamos algunos casos prácticos que hemos incluido en el Ejemplo 4. Este


ejercicio es bastante complejo. Por ello, si encuentras dificultad en comprender
el código de algunas opciones, abórdalo en su totalidad cuando acabes el
estudio completo de esta Unidad.

<?php 
  // Dibuja un botón sencillo mediante una tabla HTML 
  function boton_ficticio($caption,$url) 
  { 
    return "<TABLE border=1 CELLSPACING=0 CELLPADDING=3 bgcolor=black> 

- 342 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -

        <TR><TD bgcolor=\"white\"> 
          <FONT size =\"‐1\"> 
            <a href = \"$url\">$caption</A> 
         </FONT> 
         </TD></TR></TABLE>"; 
  } 
   
  /* Fijamos las constantes de la conexión al servidor MySQL. 
   El nombre del servidor es el que admite por defecto el servidor 
   local.*/ 
  define("SERVIDOR", "localhost"); 
  define("USUARIO", "root"); 
  define("CLAVE", ""); 
   
  class agenda { 
     
    protected $db; 
     
    function __construct($BD="") //Esto es el constructor 
    {       
      /* Intentamos establecer una conexión con el servidor.*/ 
    try { 
      if ($BD!='') 
      $this‐>db = new PDO("mysql:host=" . SERVIDOR .  
                            ";dbname=" . $BD .";charset=utf8", USUARIO,  
                            CLAVE, array(PDO::MYSQL_ATTR_INIT_COMMAND  
                                                => "SET NAMES 'utf8'")); 
        else  
      $this‐>db = new PDO("mysql:host=" . SERVIDOR.  
                            ";charset=utf8", USUARIO, CLAVE,  
                             array(PDO::MYSQL_ATTR_INIT_COMMAND  
                                               => "SET NAMES 'utf8'")); 
       
      $this‐>db‐>setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY,   
                                                                     true); 
      // Indicamos como atributo que se debe devolver una cadena  
               // vacía para los valores nulos 
      $this‐>db‐>setAttribute(PDO::NULL_TO_STRING, true); 
      // Si no indicamos la BD es que hay que crearla de nuevo 
      if ($BD=='') { 
      // Ejecutamos la SQL de Creación de BD directamente 
          // en el servidor MySQL. 
      /* Intentamos crear la base de datos "ejercicios". 
       * Si se consigue hacerlo, se informa de ello. 
       * Si no, también se informa y se indica cuál es el 
       * motivo del fallo con el mensaje de error.*/ 
           $sql = file_get_contents('ejercicios.sql');        
         $this‐>ejecuta_SQL($sql); 
      } 
    } catch (PDOException $e) { 
      die ("<p><H3>No se ha podido establecer la conexión. 
          <P>Compruebe si está activado el servidor de  
                            bases de datos MySQL.</H3></p>\n <p>Error: " .  
                            $e‐>getMessage() . "</p>\n"); 
    } // end try 
  }//end function constructor 
   
  function __destruct() //Esto es el destructor 

- 343 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -

  { 
    if (isset($db)) // Desconectamos de la BD 
      $db=null; 
     
  }//end destructor agenda 
   
  // Añadir un contacto a la lista 
  function add_contacto ($registro, $Nombre, $Apellidos,  
                         $Telefono_oficina, $Telefono_movil,$email,  
                         $direccion, $localidad, $provincia, $codigo_postal,  
                         $telefono, $notas)  
  { 
    if ($registro>0)  
      $sql_script = "UPDATE agenda SET  
                          Nombre='$Nombre', Apellidos='$Apellidos',  
            Telefono_oficina='$Telefono_oficina',         
        Telefono_movil='$Telefono_movil',email='$email',  
            direccion='$direccion', localidad='$localidad',  
            provincia='$provincia',      
          codigo_postal='$codigo_postal', 
            telefono='$telefono', notas='$notas' 
            WHERE registro=$registro"; 
      else 
        $sql_script = "INSERT INTO agenda (Nombre, Apellidos,  
                          Telefono_oficina, Telefono_movil, email, direccion,  
                          localidad, provincia, codigo_postal, telefono,  
                          notas) 
            VALUES('$Nombre', '$Apellidos', '$Telefono_oficina',  
              '$Telefono_movil','$email', '$direccion',  
          '$localidad', '$provincia',  
          '$codigo_postal','$telefono', '$notas')";     
   
         
      $this‐>ejecuta_SQL($sql_script); 
    }//end add_contacto 
     
    // Nº total de contactos 
    function nume_contacto () { 
        $sql_script = "SELECT * FROM agenda"; 
      $resultado=$this‐>ejecuta_SQL($sql_script); 
      // Devolvemos el nº de filas que devuelve la consulta 
        return $resultado‐>rowCount(); 
    } 
       
    // Borrar contactos 
    function del_contacto($id_to_del) { 
    $sql_script = "delete FROM agenda where registro=$id_to_del"; 
    $this‐>ejecuta_SQL($sql_script); 
    } 
     
    // Vaciar tabla contactos 
    function del_all_contacto() { 
    $sql_script = "delete FROM agenda"; 
    $this‐>ejecuta_SQL($sql_script); 
    } 
     
    // Añadir o modificar contactos 
    function introduce($id_to_edit, $ver) { 
         

- 344 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -

  $campos=array(   
         0=>array(0=>"Nombre",1=>"Nombre",2=>15, 3=>30, 4=>""), 
         1=>array(0=>"Apellidos",1=>"Apellidos",2=>30, 3=>100, 4=>""), 
         2=>array(0=>"Telefono_oficina", 
               1=>"Teléfono oficina",2=>15, 3=>30, 4=>""), 
         3=>array(0=>"Telefono_movil", 
               1=>"Teléfono móvil",2=>15, 3=>30, 4=>""), 
         4=>array(0=>"email",1=>"e‐Mail",2=>40, 3=>200, 4=>""), 
         5=>array(0=>"direccion",1=>"Dirección",2=>30, 3=>150, 4=>""), 
         6=>array(0=>"localidad",1=>"Localidad",2=>30, 3=>100, 4=>""), 
         7=>array(0=>"provincia",1=>"Provincia",2=>30, 3=>60, 4=>""), 
         8=>array(0=>"codigo_postal",1=>"Cód. Postal",2=>5, 3=>5, 4=>""), 
         9=>array(0=>"telefono", 
                  1=>"Teléfono personal",2=>30, 3=>100, 4=>""), 
         10=>array(0=>"notas",1=>"Notas",2=>65, 3=>254, 4=>"")); 
          
       if ($id_to_edit>0) { 
         $sql_script = "SELECT Nombre, Apellidos, Telefono_oficina,  
             Telefono_movil, email, direccion, localidad,  
             provincia, codigo_postal, telefono, notas  
             FROM agenda where registro='$id_to_edit'"; 
      $resultado=$this‐>ejecuta_SQL($sql_script); 
               
        $filas = $resultado‐>rowCount(); 
        if ($filas==0) { //resultado query vacío 
          echo "<CENTER> 
            <TABLE BORDER=1 WIDTH=600 bordercolorlight='#FFFFFF'  
                bordercolor='#FFFFFF' bgcolor='#C0C0C0'> 
            <TR><TD ALIGN=CENTER VALIGN=CENTER> 
              <H2>No se encuentra ningún registro</H2> 
            </TD></TR></TABLE></CENTER>"; 
        } 
        else //la búsqueda no es vacía 
        { 
          $myrow = $resultado‐>fetchAll();; 
          for ($i=0; $i < count($campos); $i++) 
            $campos[$i][4]=$myrow[0][$i]; 
        } 
      }//end if $id_to_edit>0 
       
      if ($ver==0)  
        echo "<FORM name='form9' method='post'  
            action=\"index_agenda.php?operacion=exec_alta\">"; 
      echo "<TABLE BORDER='0' cellspacing='10' cellpadding='0'  
            align='center' width='600'>"; 
             
      for ($i=0; $i < count($campos); $i++){ 
        echo "<TR><TD bgcolor='teal' align=center width=140> 
          <FONT size=‐1 color='white'>".$campos[$i][1]."</FONT> 
          </TD><TD>"; 
        if ($ver==1)  
          echo "<FONT size=‐1><B>". $campos[$i][4]."</B></FONT>";  
        else echo "<input type='text' name='".$campos[$i][0]. 
                       "' size='".$campos[$i][2]."' value =  
                      \"".$campos[$i][4]. "\"  
                      maxlength='".$campos[$i][3]."'>"; 
        echo "</TD> 
        </TR>"; 

- 345 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -

      }//for 
      echo "</TABLE><CENTER>"; 
       
      if ($ver==0) { 
        echo "<INPUT type='hidden' NAME='registro' value =  
                           '$id_to_edit'>"; 
        if ($id_to_edit>0) //estamos modificando 
          echo "<INPUT TYPE='SUBMIT' NAME='pulsa'  
              VALUE=\"Modificar contacto\">"; 
        else echo "<INPUT TYPE='SUBMIT' NAME='pulsa'  
              VALUE=\"Alta contacto\">"; 
      } 
      echo "</CENTER>"; 
      if ($ver==0) echo "</FORM>";   
       
   }//end Añadir o modificar contactos 
    
   // Buscar contactos 
   function buscar($lo_q_busco) { 
     if ($lo_q_busco!="")  
       $sql_script="SELECT * FROM agenda  
           WHERE apellidos like '%".$lo_q_busco."%'  
                 ORDER BY apellidos"; 
     else $sql_script = "SELECT * FROM agenda order by apellidos"; 
      
   $resultado=$this‐>ejecuta_SQL($sql_script); 
               
    $filas = $resultado‐>rowCount(); 
   
     if ($filas==0) { //resultado query vacío 
       echo "<CENTER> 
         <TABLE BORDER=1 WIDTH=650 bordercolorlight='#FFFFFF'  
           bordercolor='#FFFFFF' bgcolor='#C0C0C0'> 
         <TR><TD ALIGN=CENTER VALIGN=CENTER> 
           <H2>No se encuentra ningún registro</H2> 
         </TD></TR></TABLE></CENTER>"; 
     }else //la búsqueda no es vacía 
      
       echo "<TABLE BORDER='0' cellspacing='1' cellpadding='1'  
            align='center' width='650'> 
        <TR> 
          <TH bgcolor='teal'> 
            <FONT color='white'>Nombre</FONT> 
          </TH> 
          <TH bgcolor='teal'> 
            <FONT color='white'>Apellidos</FONT> 
          </TH> 
          <TH bgcolor='teal'> 
            <FONT color='white'>Teléfono</FONT> 
          </TH> 
          <TH bgcolor='teal' colspan='3'> 
            <FONT color='white'>Operaciones</FONT> 
          </TH> 
        </TR>"; 
    foreach ($resultado as $valor)  
    { 
      echo "<TR> 
      <TD><FONT size='‐1'><B>$valor[Nombre]</B></FONT></TD> 
      <TD><FONT size='‐1'><B>$valor[Apellidos]</B></FONT></TD> 

- 346 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -

      <TD><FONT size='‐1'>  
                                <B>$valor[Telefono_oficina]</B></FONT></TD>  
      <TD>".boton_ficticio("Consulta","  
                           index_agenda.php?operacion=   
                      introduce&ver=1&nume=$valor[registro]#ancla")."</TD> 
      <TD>".boton_ficticio("Editar","index_agenda.php?operacion= 
                       introduce&ver=0&nume=$valor[registro]#ancla")."</TD> 
      <TD>".boton_ficticio("Borrar","index_agenda.php?operacion=
            borrar&nume=$valor[registro]")."</TD> 
      </TR>"; 
    } // end bucle 
    echo "</TABLE>"; 
  }//END function Buscar contactos 
   
  // Función que ejecuta una SQL 
   function ejecuta_SQL($sql) { 
    $resultado=$this‐>db‐>query($sql); 
    if (!$resultado) 
    { 
      echo"<H3>No se ha podido ejecutar la consulta:  
                             <PRE>$sql</PRE><P><U> Errores</U>: </H3><PRE>"; 
      print_r($this‐>db‐>errorInfo());          
      die ("</PRE>"); 
    } 
    return $resultado; 
  } // end ejecuta_SQL 
   
  }//END clase agenda   

?> 

En el código anterior puedes observar que creamos la base de datos


"ejercicios" mediante un fichero de texto que almacena la estructura de las
tablas y añade algunos registros a las mismas mediante las sentencias
siguientes:

$sql = file_get_contents('ejercicios.sql');
$this->ejecuta_SQL($sql);

Utilizando Eclipse PDT puedes abrir el proyecto Ejemplo 4 (Agenda) de la


Unidad 7. Estudia el código fuente y ejecútalo para mostrar en el navegador
su resultado.

Si ejecutas este programa puedes ver una página que, mediante una clase
PDO se gestiona el contenido de una agenda almacenado en la base de datos
MySQL de XAMPP:

- 347 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -

- 348 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -

Modificar la información de una base de datos


PHP permite también modificar la información que haya en una base de datos
actualizando los registros de sus tablas, introduciendo nuevos registros o
eliminando algunos de los que tengan éstas. Las operaciones mencionadas se
llevan a cabo también mediante consultas en las que se usan sentencias SQL.

En este apartado vamos estudiar las funciones y métodos que permiten


realizar consultas que modifican la información de las bases de datos. Nos
serviremos, también en esta ocasión, de la base de datos “biblioteca”, la misma
que hemos consultado en el apartado anterior

Insertar, actualizar y borrar registros de una tabla

La forma de insertar, actualizar o borras registros de una tabla consiste en


ejecutar consultas al servidor de bases de datos de igual forma que haríamos
con el cliente MySQL Workbench.

Por ejemplo, si queremos dar de alta un nuevo usuario, debemos enviar al


servidor una consulta de la base de datos “biblioteca” en la que se añada un
registro a los que haya en la tabla “usuarios”. Puede hacerse así:

$consulta="insert into usuarios


values ('".$_POST["nombre"]."','".$_POST["apellidos"]."',
'".$_POST["dni"]."','1962-09-10',
'".$_POST["domicilio"]."', '".$_POST["localidad"]."',
'".$_POST["provincia"]."',2000.000,
'".$_POST["telefono"]."','','',NULL)";
if ($db->query($consulta))
{
print("<CENTER><H3>El registro ha sido dado de alta
correctamente</H3></CENTER>");
}
else // Si no se ejecuta correctamente mostramos el error al usuario
{
echo"<CENTER><H3>No se ha podido ejecutar la
consulta.<P>Compruebe si la sintaxis de
la misma es correcta.<P></H3>Errores: </H3><PRE>";
print_r($db->errorInfo());
echo "</PRE></CENTER>";
}

Las operaciones de actualizar y borrar registros se llevan a cabo igualmente


mediante consultas SQL en las que se incluyen las sentencias UPDATE y
DELETE, respectivamente, tal como se han explicado en la Unidad anterior.

Consultas preparadas

Muchos tipos de bases de datos permiten utilizar consultas preparadas que


pueden definirse como un tipo de plantillas de SQL compiladas para que las

- 349 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -

aplicaciones puedan ejecutar consultas personalizadas usando parámetros.


Las consultas preparadas ofrecen dos grandes beneficios:

 La consulta sólo necesita ser analizada (o preparada) una vez, pero


puede ser ejecutada múltiples veces con los mismos o diferentes
parámetros. Cuando la consulta está preparada, la base de datos
analizará, compilará y optimizará su ejecución. En el caso de
consultas complejas, este proceso llevar algo de tiempo y ralentizar
notablemente una aplicación web, sobre todo, si es necesario repetir
la misma consulta muchas veces con los mismos parámetros. Por lo
tanto, utilizar consultas preparadas, la aplicación PHP evita que el
servidor de bases de datos repita el análisis/compilación/optimización.
Además, las consultas preparadas usan menos recursos y se
ejecutan más rápidamente.
 Los parámetros para las consultas preparadas no necesitan estar
entrecomillados; PHP se encarga automáticamente de hacerlo. Esto
simplifica el código fuente y mejora el desarrollo seguro de
aplicaciones.

Las consultas preparadas son tan útiles que la biblioteca PDO de PHP las
puede emular para los tipos de bases de datos que no las admitan. Así, el
código fuente es compatible en todas los tipos de base datos soportadas por
PDO.

Cuando una consulta SQL se deba ejecutar en múltiples ocasiones, por


motivos de rendimiento, es recomendable crear un objeto PDOStatement con el
método prepare() de la clase PDO y ejecutarlo repetidamente, posteriormente
cuando haga falta, con el método execute().

Fíjate en el siguiente ejemplo que inserta varios registros en la tabla “usuarios”


de la base de datos “biblioteca”:

<?php

$consulta = "INSERT INTO usuarios (Nombre, Apellidos, DNI,


Fecha_nacim, Domicilio, Localidad, Provincia,
Sueldo_euros, Telefono, E_mail, Notas, Registro)
VALUES (:nombre, :apellidos, :dni, :fecha, :domicilio, :localidad,
:provincia, :sueldo, :telefono, :email, :notas,
:registro)";
$resultado = $db->prepare($consulta);

$resultado ->bindParam(':nombre', $nombre);


$resultado ->bindParam(':apellidos', $apellidos);
...

// Insertar un usuario
$nombre = 'Nombre 1';
$apellidos = 'Apellidos 1';
$resultado->execute();

- 350 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -

// Insertar otro usuario con diferentes valores


$nombre = 'Nombre 2';
$apellidos = 'Apellidos 2';
$sentencia->execute();

?>

Mediante el método bindParam() asociamos a las etiquetas definidas en el


método prepare() las variables PHP que almacenarán el contenido de los
campos. Puedes observar que la consulta se crear una única vez, pero se
ejecuta 2 veces.

Aprovechando esta funcionalidad de PDO podemos mejorar la primera consulta


de este apartado de la siguiente manera:

$consulta = "INSERT INTO usuarios (Nombre, Apellidos, DNI,


Fecha_nacim, Domicilio, Localidad, Provincia,
Sueldo_euros, Telefono, E_mail, Notas, Registro)

VALUES (:nombre, :apellidos, :dni, :fecha, :domicilio, :localidad,


:provincia, :sueldo, :telefono, :email, :notas,
:registro)";

$resultado = $db->prepare($consulta);
// Esta parte del código se puede ejecutar de forma separada
if ($resultado->execute(array(":nombre" => $_POST["nombre"],
":apellidos" => $_POST["apellidos"],
":dni"=>$_POST["dni"],
":fecha"=>"1962-09-10",
":domicilio"=>$_POST["domicilio"],
":localidad"=>$_POST["localidad"],
":provincia"=>$_POST["provincia"],
":sueldo"=>"2000",
":telefono"=>$_POST["telefono"])))
{
print "<p>Registro creado correctamente.</p>\n";
} else {
print "<p>Error al crear el registro.</p>\n";
}

En este caso, no hemos utilizado el método bindParam() y, en su lugar,


definimos directamente en el método execute() mediante una matriz las
variables asociadas a los campos.

Utilizando Eclipse PDT puedes abrir el proyecto Ejemplo 3 (Inserción


datos en BD) de la Unidad 7. Estudia el código fuente y ejecútalo para
mostrar en el navegador su resultado.

- 351 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -

En este Ejemplo 3 aparece el código completo de estas operaciones (insertar,


actualizar y borrar registros de una tabla). En el mismo puede verse cómo
hemos utilizado las funciones explicadas en este apartado.

En los Ejemplo 4 de esta Unidad hemos incluido una sencilla aplicación de


mantenimiento de una agenda, de forma que en ellas se incorporen y utilicen
las principales funciones abordadas en este apartado y en el anterior:

Utilizando Eclipse PDT puedes abrir el proyecto Ejemplo 4 (Agenda) de la


Unidad 7. Estudia el código fuente y ejecútalo para mostrar en el navegador
su resultado.

Estudiando su código, leyendo los comentarios y tratando de reproducir


programas similares, el alumno o alumna del curso puede asimilar
adecuadamente los contenidos de esta Unidad.

También el modelo de Proyecto final se sirve, de una forma integrada, de


estas funciones con las que PHP nos permite conectarnos a un servidor,
acceder a una base de datos y tratar correctamente la información de las
tablas. Ya desde este momento, cada alumno o alumna debe estudiar este
proyecto e ir elaborando uno propio, que debe remitir al tutor o tutora antes de
presentarse a la prueba final presencial.

- 352 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -

Instalación y uso de MyODBC


Instalación y configuración

En este apartado se explica el proceso de instalación del controlador (driver)


MyODBC 32 bits para Windows (es posible utilizar este controlador en otros
sistemas operativos pero no se explica en este curso cómo se hace). Esto nos
permitirá acceder desde un cliente Windows que disponga de MS Access a un
servidor MySQL.

Suponemos que el gestor de datos Microsoft Access está ya instalado en el


ordenador donde se realiza el curso. Si no lo estuviera, sería imposible llevar a
cabo los pasos explicados a continuación.

Lo primero que debemos hacer es descargar la versión más actualizada de


este controlador, puede recogerse en la dirección siguiente
http://www.mysql.com/products/connector/:

En la siguiente página debes seleccionar el sistema operativo sobre el que


queremos instalar el controlador (Windows) y descargar siempre la versión de
32 bits:

- 353 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -

Pulsamos el botón “Download” y, en la página que aparece, hacemos clic en la


opción “No thanks, just start my donwload”:

Queremos advertir que el controlador MyODBC no se instala con el curso y, por


tanto, el alumno no lo hallará ya funcionando en el ordenador donde trabaje. Si
quiere conectar una base de datos de tipo MySQL desde MS Access, debe
instalar previamente el controlador tal como indicamos a continuación.

- 354 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -

Para convertir nuestro MS Access en un cliente Windows de MySQL, en primer


lugar debemos instalar el controlador ejecutando el fichero descargado (a fecha
de escritura de este documento se denomina mysql-connector-odbc-5.3.2-
win32.msi).

Una vez instalado el driver ODBC para MySQL, debemos ejecutar la utilidad
Configurar orígenes de Datos (ODBC) que se encuentra en el Panel de Control
de Windows:

Se mostrará la siguiente ventana:

- 355 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -

MUY IMPORTANTE: si usas Windows con 64 bits, es necesario ejecutar la


utilidad Configurar orígenes de Datos (ODBC) de 32 bits que se encuentra en
el directorio C:\Windows\SysWOW64:

Para accedr a esta utilidad debes ejecutar la aplicación odbcad32.exe.

A continuación, dentro de la pestaña DNS de usuario, pulsamos sobre el botón


Agregar, para añadir un nuevo origen de datos y seleccionamos el driver
MySQL ODBC ANSI 5.3 Driver correspondiente a la base de datos MySQL:

Después, pulsamos el botón Finalizar apareciendo la siguiente ventana:

- 356 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -

Seguidamente, escribimos los valores siguientes, suponiendo, por ejemplo, que


vamos a conectarnos con la base de datos “biblioteca” del servidor MySQL y
pulsamos el botón OK:

• Data Source Name: nombre que daremos a la conexión. En nuestro ejemplo,


ponemos CursoPHP5.

• Server: es el nombre o dirección IP del servidor al que nos queremos


conectar. En nuestro ejemplo, ponemos localhost.

• User: nombre de usuario. En nuestro ejemplo, ponemos root.

• Password: clave del usuario. En nuestro ejemplo, lo dejamos en blanco.

• Database: nombre de la base de datos MySQL a la que queremos


conectarnos. En nuestro ejemplo, ponemos biblioteca.

Si pulsamos el botón “Test” podemos ver si la configuración realizada funciona


correctamente:

- 357 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -

Conexión remota a MySQL desde MS Access

Veamos cómo podemos conectarnos a una base de datos MySQL que está en
un servidor remoto usando un cliente Windows a través de MS Access. Para
poder hacerlo, es preciso tener instalado en nuestro cliente Windows el driver
MyODBC, así como haber arrancado el servidor MySQL.

Debemos seguir estos pasos:

1. Arrancar MS Access, en este caso usaremos Microsoft Access 2010 para


mostrar el ejemplo siguiente.

2. En el menú Archivo seleccionamos Nuevo, a continuación, pulsaremos en


Base de datos en blanco:

- 358 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -

3. En la pestaña Datos externos pulsaremos en Base de datos ODBC:

4. Marcaremos Vincular al origen de datos creando una tabla vinculada:

- 359 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -

Así, Microsoft Access creará una tabla que mantendrá un vínculo a los datos de
origen. Los cambios realizados en los datos en Microsoft Access se reflejarán
en el origen y viceversa.

Pulsamos "Aceptar". Después, hacemos clic en la pestaña Origen de datos de


equipo y seleccionaremos el origen de datos "CursoPHP5" creado
anteriormente, pulsaremos de nuevo Aceptar:

- 360 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -

5. MS Access conectará con el servidor MySQL y obtendrá todas las tablas


del origen de datos seleccionado. En esta ventana bebemos seleccionar las
tablas que queramos vincular con MS Access. Una vez seleccionadas las
tablas del servidor MySQL pulsaremos el botón Aceptar:

- 361 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -

6. Una vez vinculadas las tablas de MySQL Server, podremos usarlas como si
de tablas MS Access se tratara. Por ejemplo, si hacemos clic sobre la tabla
"libros", en la parte derecha aparecerán sus registros. Cualquier modificación
que hagamos en la tabla quedará reflejado en el servidor:

Queremos recordar que para poder modificar las tablas desde MS Access
hay que tener los permisos pertinentes como usuarios de MySQL.

Creación informe en MS Access a partir de una base de datos MySQL

La gran ventaja de vincular tablas de MySQL Server con MS Access es que


podemos aprovechar todas sus funcionalidades y posibilidades con los datos
de MySQL Server. Por ejemplo, de forma mucho más sencilla que con MySQL
workbench, podemos crear macros con VBA, crear consultas, modificar tablas,
crear informes, etcétera.

A continuación mostramos, a modo de ejemplo, cómo crear un sencillo informe


con datos de una tabla de MySQL Server en MS Access.

Una vez hemos vinculado las tablas con MS Access, pulsamos en la pestaña
"Crear" y seleccionaremos "Asistente para informes". En esta ventana
seleccionamos los campos que deseamos incluir en el nuevo informe:

- 362 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -

Después, pusalmos el botón “Siguiente” y, si hemos elegido campos de


diferentes tablas, aparecerá este mensaje de aviso:

Si pulsamos el botón “Aceptar” podremos indicar las relaciones entre las 3


tablas bis_libros, bis_prestados y bis_usuarios:

Una vez creada la relación entre los campos de las diferentes tabla volvemos a
crear el informe y pulsamos el botón Finalizar:

- 363 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -

Finalmente, aparecerá un informe sencillo con todos los libros prestados en la


biblioteca:

Como puedes observar, es muy sencillo integrar la información de una base de


datos en MS Access y sacarle más partido a este servidor de base de datos. El
objetivo de este apartado es enseñarte cómo integrarlo, no a utilizar MS
Access. Si deseas ampliar conocimientos sobre MS Access, Mentor dispone
del curso correspondiente.

- 364 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -

Resumen

Objetivos

 Saber conectarse al servidor que contiene el gestor de bases de


datos MySQL.

 Aprender a crear una base de datos, a conectarse a ella y a


borrarla con sus tablas e información, sabiendo utilizar, además, las
funciones que controlan los posibles errores.

 Aprender a consultar una base de datos utilizando queries en las


que intervengan las principales funciones de PHP para acceder a
bases de datos de tipo MySQL y tratar su información.

 Saber insertar, actualizar y eliminar registros de una tabla,


haciendo uso, además, de formularios y de celdas de tablas para
mostrar su información, preguntarla o seleccionar campos.

 Aprender a instalar el controlador MyODBC para poder conectar


bases de datos de tipo MS Access con las de tipo MySQL, así como
saber importar o exportar tablas entre ambos gestores de bases de
datos.

 Saber mantener una base de datos realizando a través de


funciones de usuario las principales operaciones de este tipo: altas,
bajas, consultas, búsquedas, actualizaciones, etcétera.

- 365 -
Curso de Iniciación a PHP: Unidad 7
- PHP y las bases de datos -

- 366 -
MÓDULO 3

Utilidades prácticas

Unidad 8

Índice de la unidad:

1. Funciones matemáticas

2. Tratamiento de errores

3. Compresión de ficheros

4. Crear documentos PDF

5. Resumen
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -

Introducción
En esta Unidad vamos a saber aplicar las principales funciones
matemáticas de PHP a las diferentes situaciones en que deban emplearse:
trigonométricas, para hallar redondeos, máximos y mínimos, para calcular
exponentes y logaritmos, así como para generar números aleatorios.

Aprenderemos a detectar y corregir los principales errores de un script,


utilizando eficazmente las funciones de PHP que permiten conocer la severidad
del error mostrando al usuario un mensaje con el texto que sea adecuado a
cada situación.

Sabremos crear ficheros comprimidos, abrirlos, cerrarlos, leer su


contenido, total o en parte, así como mover el puntero de lectura-escritura por
sus diferentes bytes.

Finalmente, aplicaremos correctamente las funciones que permiten crear


documentos PDF en PHP.

Funciones matemáticas
A lo largo del curso hemos estudiado muchas funciones, si bien no ha sido
nuestra intención abarcar exhaustivamente todas las funciones de PHP. En
este apartado vamos a estudiar las funciones matemáticas de que dispone
PHP, al menos de una forma breve, para que así se conozca que existen y se
puedan utilizar cuando sea necesario.

El Manual de PHP aborda estas funciones y puede consultarse esta


información accediendo a este documento a través de la ayuda del Eclipse
PDT.

Funciones trigonométricas

Ejemplo de su
Función Devuelve
sintaxis
El arcocoseno del
acos(float) acos(120.678);
argumento en radianes
El arcoseno del
asin(float) asin(120.678);
argumento en radianes
El arcotangente del
atan(float) atan(120.678);
argumento en radianes
El coseno del argumento
cos(float) cos(120.678);
en radianes
El seno del argumento en
sin(float) sin(120.678);
radianes

- 369 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -

El tangente del
tan(float) tan(120.678);
argumento en radianes

Redondeos, máximos y mínimos

Ejemplo de su
Función Devuelve
sintaxis
El valor absoluto (sin
abs(número) abs(-120);
signo) de un número
El valor entero
ceil(float) superior de un número ceil(120.678);
decimal
El valor entero
floor(float) inferior de un número floor(120.678);
decimal
max(120,240); Para
El valor mayor de los
max(números) tipos y argumentos
números dados
ver Manual.
min(120,240); Para
El valor menor de los
min(números) tipos y argumentos
números dados
ver Manual.
El valor de un decimal
round(120.678);
redondeado en la parte
round(float)
entera según lo
round(120.478);
habitual

Exponentes y logaritmos

Ejemplo de su
Función Devuelve
sintaxis
El valor de elevar e
(base del logaritmo
exp(número) natural= exp(3);
2.71828182845904) al
argumento número
El logaritmo del
log(número) log(120.678);
argumento número
El logaritmo en base 10
log10(número) Log10(120.678);
del argumento número
El valor de elevar num1
pow(num1,num2) pow(5,3);
a num2
El valor de la raíz
sqrt(número) sqrt(25);
cuadrada de número

- 370 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -

Generación de números aleatorios

Ejemplo de su
Función Devuelve
sintaxis
El mayor valor
getrandmax() getrandmax();
aleatorio generable
mt_rand();
Un valor aleatorio
mt_rand()
mejorado
mt_rand(100,500);
Introduce la
semilla del mt_srand((double)
mt_srand() generador de microtime()
números aleatorios *100000);
mejorado
El mayor valor
mt_getrandmax() aleatorio generable mt_getrandmax();
mejorado
rand();
rand() Un valor aleatorio
rand(500,1000);
Introduce la
srand((double)
semilla del
srand() microtime()
generador de
*1000000);
números aleatorios

Al generar números aleatorios, es conveniente seguir estos pasos:

1. Generar la semilla del número aleatorio, es decir, inicializar la búsqueda del


número aleatorio a partir de un valor. Para crear esta semilla, se usan las
funciones srand() y mt_srand(). Estas funciones llevan como argumento una
expresión que inicializa el buscador de números aleatorios. Las funciones
getrandmax() y mt_getrandmax() devuelven el número máximo posible en cada
caso, que es 32.767 y 2.147.483.647, respectivamente.

2. Crear el número aleatorio. Esto se hace con las funciones rand() y


mt_rand(). Si no se indica ningún argumento, el número generado estará
comprendido entre 0 y getrandmax() o mt_getrandmax(), respectivamente. Si
se especifican argumentos, han de ponerse los dos límites, inferior y superior,
entre los cuales debe buscarse el número aleatorio.

Formatear números

La función number_format() permite dar formato a un número en grupo de


miles. Tiene la siguiente sintaxis:

- 371 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -

number_format(número,nº de decimales,separador de decimales,separador


de miles)

Si sólo se pone el primer parámetro, número se muestra sin decimales y con


una coma (,) entre cada grupo de miles.

Si se especifican dos parámetros, número se muestra con un punto (.) como


separador de los decimales y una coma (,) entre cada grupo de miles.

Si se especifican los cuatro parámetros, número se muestra con el carácter que


se indique en el tercer parámetro en lugar de con un punto (.) como separador
de los decimales y con el carácter que se indique en el cuarto parámetro en
lugar de con una coma (,) entre cada grupo de miles.

En el Ejemplo 1, dentro de Números aleatorios, se usa esta función


aplicándola a un número entero. Puede estudiarse su sintaxis en el mismo. De
la misma forma, se puede aplicar a un número decimal.

Utilizando Eclipse PDT puedes abrir el proyecto Ejemplo 1 (Funciones


matemáticas) de la Unidad 8. Estudia el código fuente y ejecútalo para
mostrar en el navegador su resultado.

- 372 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -

Tratamiento de errores
Al escribir el código de los programas es fácil cometer bastantes errores, sobre
todo cuando se está aprendiendo y no se conoce con exactitud la sintaxis de
los comandos. En este apartado vamos a enumerar los errores más frecuentes
para aprender a solucionar los problemas que se producen al ejecutar el código
de los scripts PHP. Además, estudiaremos algunas funciones de PHP que nos
ayudarán a detectar y a tratar los posibles errores de nuestros programas.

En la Unidad 7 ya hemos usado Excepciones que controlan los errores de la


ejecución del código que accede a la base de datos MySQL. Sin embargo, no
hemos usando las funciones de gestión de errores que estudiaremos a
continuación.

Si utilizamos acertadamente las funciones de que dispone PHP para manejar y


controlar los errores, se pueden conocer y detectar, antes de solucionarlos,
posibles problemas en el código PHP.

En el fichero de configuración php.ini se fijan, entre otras muchas cosas, las


condiciones de comportamiento de los mensajes de error que se generen al
ejecutarse un fichero script PHP.

Si abrimos el archivo php.ini con el Panel de Control de XAMPP:

Y buscamos concretamente, en la sección Error handling and logging se


contemplan los siguientes valores:

- 373 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -

 display_errors=On. Se activa el envío de los mensajes de error a la


salida estándar, por defecto el monitor del cliente.

 error_reporting=E_ALL & ~E_DEPRECATED & ~E_STRICT. En el texto de


los mensajes de error se muestran todos los errores, avisos e
información disponible sobre ellos salvo los relacionados con funciones
obsoletas (DEPRECATED) y las recomendaciones de funciones y
estructuras mejorables (E_STRICT). En un entorno de desarrollo de PHP
es recomendable dejar la configuración así: error_reporting=E_ALL para
que aparezcan todos los errores PHP.

 log_errors=Off. Si se activara con el valor On entonces el envío de los


mensajes de error se haría al fichero al fichero indicado en la variable de
configuración error_log="C:\xampp\php\logs\php_error_log". Se trata
de un fichero de texto que podemos abrir y ver su contenido, que puede
ayudarnos mucho a solucionar un problema al depurar un programa. Ya
que puede llegar a ser muy grande, conviene eliminarlo de vez en
cuando, para que se inicie de nuevo ocupando menos y siendo más fácil
la localización de los errores que se citan.

En el propio fichero php.ini se explican, en inglés, los posibles valores de


configuración de los errores, así como lo que significa cada uno.

En el Manual de PHP se aborda este tema en el apartado Manejo y registro


de Errores. También puede consultarse esta información accediendo al
Manual desde de la ayuda de Eclipse PDT. En este apartado nosotros sólo
vamos a referirnos a los aspectos más importantes y sólo abordaremos las
funciones básicas.

Errores más frecuentes

A continuación, citamos los errores que se repiten con mayor frecuencia, según
nuestra experiencia:

1. Faltan las comillas.

Tanto en PHP como en HTML las comillas deben ir emparejadas. Si falta


alguna, la de apertura o la de cierre, en lugar de interpretarse el código, se
produce un error. En Eclipse PDT muestra un error y cambia a otro color el
texto próximo a este error, de forma que no es difícil apreciar cuándo falta
alguna de las dos comillas.

2. Comillas no protegidas.

Cuando dentro de una pareja de comillas necesitamos utilizar otras comillas o


bien, dentro de PHP, en las etiquetas HTML es preciso poner comillas, es
imprescindible proteger las interiores con el signo \, como hemos visto. De no
hacerlo así, PHP acabaría la pareja de comillas con la primera interior y se
produciría un error en la interpretación del resto. Por ejemplo, la instrucción

- 374 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -

echo "Le llamó "gamberro"";

se interpreta como Le llamó . Hay que proteger las comillas interiores así:

echo "Le llamó \"gamberro\"";

o bien usar en la pareja interior comillas simples así:

echo "Le llamó 'gamberro'";

Este fallo es muy frecuente al incluir etiquetas HTML entre comillas dentro de
un literal PHP que va también entre comillas. No es correcto escribir

echo "<INPUT NAME="nombre" VALUE="$nombre"";

Hay que escribir

echo "<INPUT NAME=\"nombre\" VALUE=\"$nombre\"";

3. Falta el punto y coma (;) al final de una sentencia

Es un error bastante común. El colorido del Eclipse PDT también puede


ayudarnos a localizar dónde falta. Como PHP interpreta que la sentencia no ha
acabado, suele marcar el error en alguna de las líneas de código siguientes.

4. Falta uno o ambos códigos indicadores de PHP: <?php o ?>

Es otro error frecuente. No es habitual omitir alguno cuando en el script sólo


hay un indicador de inicio del código PHP y otro de cierre. Pero, cuando se
mezclan código HTML y PHP, sí puede omitirse uno con facilidad. Si se omite
el de apertura (<?php), no se interpreta como PHP el código que sigue y llega
al navegador del cliente tal cual, como si fuera HTML. Si se omite el segundo
(?>), se produce un error al tratar de interpretarse código HTML como si fuera
PHP.

5. Se omite el símbolo $ delante de una variable

Como esta característica no es propia de otros lenguajes de programación, no


es infrecuente quitar este símbolo que debe preceder a todos los
identificadores de variables y objetos. Si no se pone, se producirán diferentes
errores o bien el identificador será tomado como un literal dentro de una
cadena.

6. No aparece el símbolo $ en la pantalla

Cuando queremos mostrar el nombre de una variable dentro de una cadena, no


su valor, es preciso anteponer el signo \ delante del mismo para proteger el
símbolo y convertirlo en un carácter normal representable en la pantalla.

- 375 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -

7. Variable sin definir

Como en PHP no es preciso declarar las variables, a veces es difícil saber si la


hemos creado o no. Si no lo está, se provoca un error en la ejecución del script.
O bien los resultados serán inesperados. Por eso, cuando se tiene duda, al
escribir el código, pueden usarse la funciones isset(), empty() u otras.

8. La página resultante aparece en blanco

Cuando ocurre esto, lo más probable es que el código HTML incluido en el


código PHP sea incorrecto. Por ejemplo, puede suceder que no se haya
cerrado alguna etiqueta, como <TABLE> con </TABLE>, o que se intente
cerrar una etiqueta que no tiene esta modalidad.

9. Confundir los operadores = y ==

Es un error también muy frecuente. Cuando se quiere comparar dos


expresiones para ver si son iguales, hay que utilizar el operador de
comparación ==. En cambio, para asignar el valor o resultado de la expresión
derecha a una variable que aparece a la izquierda, hay que utilizar el operador
de asignación =.

10. Omisión de uno de los dos elementos emparejados

Además de las comillas, hay otros componentes del lenguaje PHP que deben
abrirse y cerrarse, como las llaves {}, los paréntesis () y los corchetes []. Para
detectar esta posible omisión de uno de los dos elementos, generalmente el
segundo (cerrar), lo mejor es tabular (indentar) bien el código, de forma que
resulte fácil e intuitivo encontrar dónde se produce esta ausencia. El colorido
del texto en el Eclipse PDT también puede ayudarnos a detectar este error.

11. El intérprete PHP no lee el código del script

Este problema puede deberse a que Apache está mal configurado, que no es
nuestro caso, o a que la extensión del fichero en el que está archivado el
código no es php.

12. Sólo aparece la primera palabra al pasar un valor de un formulario

Si tenemos la instrucción

echo "<INPUT NAME=nombre dado VALUE=$nombre";

sólo aparece en el resultado la palabra nombre. Para que se vea nombre dado
es preciso escribir:

echo "<INPUT NAME=\"nombre dado\" VALUE='$nombre'";

13. El valor pasado a una URL llega incompleto

- 376 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -

Se produce este error cuando en la dirección que pasa a la URL aparece algún
espacio en blanco o una variable que lo contiene. Por ejemplo, la referencia

echo "<A REF='eje.php?nombre=$texto'>Enlace</A>";

puede producir un error si $texto contiene algún carácter no admitido, como un


espacio. Para evitar este error hay que poner

echo "<A HREF='eje.php?nombre=urlencode($texto)'>Enlace</A>";

14. Errores en la función checkdate()

Debemos tener en cuenta que en ésta y en otras funciones o expresiones que


lleven una fecha como argumento o parte de las mismas, el orden es
mes:día:año.

15. Alguna información aparece en inglés

Los días de la semana o los meses pueden aparecer en inglés si no se ha


especificado otra cosa mediante la función setlocale(). Puede mirarse cómo
se cambian estos valores en la Unidad 3, Tratamiento de fechas.

16. Al cargar una página nueva no pasan las variables de la anterior

Así se comporta PHP. Para que las variables de una página puedan pasar a
otra nueva es necesario que las pasemos explícitamente, sea como campo
(incluso oculto) de un formulario, sea como asignación dentro de una URL.

17. No se puede crear un fichero, escribir en él o eliminarlo

Debemos tener en cuenta que, para poder realizar operaciones de escritura, es


preciso tener los permisos adecuados. Éstos se consiguen a través de la
autentificación al entrar en un servidor. Si un cliente no se autentifica de forma
expresa e individual, en todo caso accederá al servidor como nobody, que es un
usuario de tipo genérico que, en el mejor de los casos, sólo puede ver
determinada información.

18. La variable $_SERVER["PHP_AUTH_USER"] aparece vacía dentro de


un script

El contenido de esta variable depende normalmente del tipo de autentificación


que el usuario consiga del servidor, externa o mediante PHP. Cuando un
usuario se identifica de manera externa usando un módulo de Apache entonces
es la variable $_SERVER["REMOTE_USER"] la que contiene la identificación,
mientras que la variable $_SERVER["PHP_AUTH_USER"] queda sin contenido y
sólo se rellena si se usan las funciones de PHP de autentificación. Nota: ver el
Ejemplo 4 de la Unidad 5.

19. El mensaje del error dice: Call undefined o Unsoported function

- 377 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -

Puede ocurrir este error cuando estamos llamando a una función no declarada
o declarada en otro fichero que no se incluye en el script actual. También
puede deberse a las opciones incluidas al compilarse los módulos de PHP. En
este caso, lo mejor es mirar qué librerías se han incluido en la versión de PHP
que estamos usando y con qué opciones explícitas se ha compilado.

Funciones de PHP para tratar errores

La función error_log() remite un mensaje de error al dispositivo que se


indique.

Ésta es su sintaxis:

error_log(mensaje,tipo de mensaje [,destino [,dirección de destino]])

Esta función envía un mensaje de error al fichero de tipo log de errores del
servidor web, a un puerto TCP o a un fichero diferente de log. El primer
parámetro (mensaje) contiene la cadena con el texto del mensaje de error. El
segundo parámetro (tipo de mensaje) indica el lugar al que debe dirigirse
mediante uno de estos cuatro valores:

1. 0 El mensaje se envía al registro de sistema de PHP, utilizando el


mecanismo de registro de sistema del Sistema Operativo o a un fichero,
dependiendo del valor de la directiva de configuración error_log de php.ini.

2. 1 El mensaje se envía por correo electrónico a la dirección del parámetro


destino. En tipo de mensaje hay que utilizar el cuarto parámetro (dirección de
destino).

3. 2 El mensaje se envía a depuración de PHP. En este caso el parámetro


destino especifica el nombre de host o la dirección IP.

4. El mensaje se envía al fichero destino.

La función () se usa para indicar el nivel de las incidencias que deben ser
registradas cuando se producen errores en la interpretación de un script.

Ésta es su sintaxis.

error_reporting([nivel])

El nivel se expresa mediante un número entero donde cada bit tiene su propio
significado. A continuación aparecen algunos de los valores posibles y su
significado:

Valor Tipo Error


Descripción de error
del bit interno
Error grave que impide seguir con la ejecución
1 E_ERROR
del script.
2 E_WARNING Aviso de error que no impide seguir con la

- 378 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -

ejecución del script.


Aviso de error de sintaxis que impide seguir
4 E_PARSE
con la ejecución del script.
Aviso de un posible error que no impide seguir
8 E_NOTICE
con la ejecución del script.
Similar a E_ERROR, generado por el núcleo del
16 E_CORE_ERROR PHP. Una función no debe generar este tipo de
error
Similar a E_WARNING, generado por el núcleo
32 E_CORE_WARNING del PHP. Una función no debe generar este tipo
de error
Error generado por el script. Es como un
E_ERROR,
256 E_USER_ERROR excepto que es generado desde código PHP
usando la
función trigger_error().
Se muestran todos los errores y advertencias
2047 E_ALL
excepto los del nivel E_STRICT.
Advertencias en tiempo de ejecución que
indican sugerencias sobre cambios en tu código
2048 E_STRICT
para mejorar la interoperabilidad y mantener
la compatibilidad del mismo.

Notamos que en PHP 5 se ha aumentado esta lista para mostrar más tipos de
errores y poder encontrar los errores del código más fácilmente.

En la sección error_reporting del fichero de configuración php.ini aparece el


valor E_ALL, para que se muestren todos los errores. Si usamos la instrucción
echo error_reporting();, se devuelve el valor 32. Pero podemos cambiar este
valor indicando, por ejemplo, otro nivel de la forma siguiente:

error_reporting(7);

en cuyo caso se mostrarán los mensajes de error de los tres primeros niveles
(1+2+4). Si escribimos

error_reporting(15);

se mostrarán los mensajes de error de los cuatro primeros niveles (1+2+4+8).

Utilizando Eclipse PDT puedes abrir el proyecto Ejemplo 2 (Errores PHP)


de la Unidad 8. Estudia el código fuente y ejecútalo para mostrar en el
navegador su resultado.

Si ejecutas este programa puedes ver una página que usa estas dos funciones
para detectar y controlar los errores de un programa estableciendo diferentes
niveles y procedimientos para mostrar y escribir los mensajes de error en
ficheros.

En este Ejemplo utilizamos la orden $ficheroLogs = ini_get('error_log')


para obtener el nombre del fichero de texto donde se almacenan los errores
que se define en el archivo php.ini.

- 379 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -

Es importante que estudies su código fuente y los ejecutes en Eclipse PDT


para ver el resultado que muestra:

- 380 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -

Compresión de ficheros
En este apartado vamos a estudiar la compresión y descompresión de ficheros
utilizando funciones de PHP.

Para poder comprimir y descomprimir ficheros necesitamos utilizar la librería


zlib de Jean-loup Gailly y Mark Adler, que permite leer y escribir archivos
comprimidos de tipo gz. Podemos recoger esta librería en la dirección
http://www.zlib.net/. En XAMPP esta librería ya viene compilada
internamente en PHP, por lo cual podemos servirnos de ella sin necesidad de
recogerla ni instalarla en nuestro ordenador.

El Manual de PHP aborda estas funciones en su apartado Compresión Zlib.


Los alumnos y alumnas que lo precisen pueden consultar esta información
accediendo a este documento a través de la ayuda de Eclipse PDT.

Recomendamos repasar las explicaciones dadas en la Teoría de la Unidad 4


sobre las funciones de PHP para realizar diferentes operaciones con ficheros.
Así se comprenderán mejor algunos conceptos abordados en este apartado

Funciones de PHP para comprimir y descomprimir ficheros

Para abrir y cerrar ficheros

La función gzopen() permite abrir un fichero gzip en el que se va a escribir de


forma comprimida.

Ésta es su sintaxis:

gzopen(nombre del fichero,modo[,incluir path])

La función gzopen() devuelve un puntero, que es un número entero, del archivo


abierto. Después, al realizar operaciones de lectura o de escritura relacionadas
con este fichero, hay que citar este descriptor de archivo. Si la apertura falla,
esta función devuelve el valor False.

El segundo parámetro indica si el fichero ha de abrirse en modo de sólo lectura


(“r”) o en modo de escritura (“w”). En este parámetro pueden usarse los
mismos valores que en la función fopen(). Además, en esta librería se puede
indicar el grado de compresión, de 1 a 9. Por ejemplo, el valor “wb9” indica que,
al escribir, se utilice la máxima compresión posible. También se puede
especificar la estrategia con la que se ha de comprimir: “f” para filtrado de
datos, “h” para comprimir usando sólo el método Huffman, etcétera. En la
página oficial sobre zlib puede hallarse más información sobre este parámetro
de estrategia. Por ejemplo, el valor “wb9f” indica que ha de escribirse con la
máxima compresión filtrando los datos.

Se puede usar también un tercer parámetro, que es opcional: si ponemos el


valor 1, estamos indicando que el fichero ha de buscarse también en la

- 381 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -

trayectoria especificada en el parámetro include_path del fichero de


configuración php.ini.

La función gzclose() cierra un fichero gzip que se ha abierto correctamente


con la función gzopen().

Ésta es su sintaxis:

gzclose(puntero o descriptor válido del fichero abierto)

Devuelve True si la operación se realizó sin problemas y False si hubo errores.

Para saber dónde está el puntero o moverlo por el fichero

La función gzrewind() coloca el puntero de un archivo de tipo gzip al comienzo


del mismo. Al abrirse un fichero, el puntero queda situado al comienzo del
mismo, pero se mueve con las operaciones de lectura o escritura.

Ésta es su sintaxis:

gzrewind(puntero o descriptor válido del fichero abierto)

La función gzseek() busca una posición especificada y coloca el puntero de un


archivo de tipo gzip sobre la misma.

Ésta es su sintaxis:

gzseek(puntero o descriptor válido del fichero


abierto,número de bytes)

Por ejemplo, si el fichero tiene un tamaño de 1.024 bytes, la instrucción

gzseek ($id_fichero,850 );

coloca el puntero de lectura o escritura en el byte 850.

Si el archivo se ha abierto para lectura, la función se emula, ya que no se


comprime de hecho, si bien la operación es muy lenta. Si se ha abierto para
escritura, sólo se busca hacia delante y, en este caso, la función gzseek()
comprime el contenido saltado en una secuencia de ceros hasta que el puntero
alcanza la nueva ubicación.

Si la operación se completa sin problemas, esta función devuelve el valor 0; de


lo contrario, devuelve -1. Debemos tener en cuenta que no se produce ningún
error cuando la búsqueda alcanza la marca de final del fichero.

La función gzeof() comprueba si el puntero de un archivo de tipo gzip ha


alcanzado la marca de final de fichero.

Ésta es su sintaxis:

- 382 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -

gzeof(puntero o descriptor válido del fichero abierto)

Devuelve True si el puntero está en la marca de fin del archivo o cuando ha


ocurrido un error. De lo contrario, devuelve False.

La función gztell() devuelve el número de bytes (desplazamiento del puntero


dentro del fichero) sobre el que está situado el puntero de un archivo de tipo
gzip.

Ésta es su sintaxis:

gztell(puntero o descriptor válido del fichero abierto)

Devuelve False cuando ha ocurrido un error al ejecutarse la función.

Para escribir dentro de un fichero en formato comprimido

Las funciones gzwrite() y gzputs(), que son idénticas en su funcionamiento,


escriben una cadena dada dentro de un fichero de tipo gzip en modo binario.

Ésta es su sintaxis:

gzputs(puntero o descriptor válido del fichero


abierto,cadena[,tamaño])

gzwrite(puntero o descriptor válido del fichero


abierto,cadena[,tamaño])

Si el parámetro opcional tamaño está presente, se detiene la escritura cuando


se alcanza el número de bytes (descomprimidos) indicado; o bien se deja de
escribir cuando se llega al final de cadena; lo que ocurra primero.

Para leer ficheros comprimidos

La función readgzfile() lee un fichero gzip, lo descomprime y lo escribe en la


salida estándar.

Ésta es su sintaxis:

readgzfile(nombre del fichero,[incluir path])

En realidad, devuelve sólo el número de bytes (descomprimidos) leídos del


archivo. Si ocurre algún error, devuelve False y muestra un mensaje de error, a
no ser que se use el operador @ delante.

Se puede usar también un segundo parámetro, que es opcional: si ponemos el


valor 1, estamos indicando que el fichero ha de buscarse también en la
trayectoria especificada en el parámetro include_path del fichero de
configuración php.ini.

- 383 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -

Las función gzfile() se comporta en la práctica como la función readgzfile()


anterior.

Las función gzread() lee un fichero de tipo gzip en modo binario.

Ésta es su sintaxis:

gzread(puntero o descriptor válido del fichero


abierto,tamaño)

La lectura se detiene cuando se alcanza el número de bytes indicado en el


parámetro tamaño; o bien finaliza cuando se llega al final del fichero, lo que
ocurra primero.

Las función gzgetc() lee un carácter de un fichero de tipo gzip. En concreto,


lee el carácter sobre el que esté el puntero de lectura-escritura.

Ésta es su sintaxis:

gzgetc(puntero o descriptor válido del fichero


abierto)

Las función gzgets() lee una línea de un fichero de tipo gzip.

Ésta es su sintaxis:

gzgets(puntero o descriptor válido del fichero


abierto,tamaño)

Devuelve una cadena (descomprimida) que tiene una longitud de tamaño-1


bytes, leída del archivo de tipo gzip apuntado por descriptor del fichero. La
lectura finaliza cuando se ha leído esta longitud o bien al encontrarse un salto
de línea o la marca de final de fichero, lo que ocurra antes.

Las función gzgetss() se comporta como la función gzgets() anterior, pero


intenta quitar cualquier etiqueta HTML o PHP del texto que se lee. Además,
permite usar un tercer parámetro, opcional, para indicar qué etiquetas en
concreto no deben ser extraídas.

Las función gzpassthru() lee desde la posición del puntero hasta el final de un
fichero de tipo gzip (el remanente) y escribe los resultados descomprimidos en
la salida estándar. Al acabar la lectura, el fichero leído queda cerrado.

Ésta es su sintaxis:

gzpassthru(puntero o descriptor válido del fichero abierto)

Utilizando Eclipse PDT puedes abrir el proyecto Ejemplo 3 (Comprimir


ficheros) de la Unidad 8. Estudia el código fuente y ejecútalo para mostrar
en el navegador su resultado.

- 384 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -

Si ejecutas este programa puedes ver una página que, usado las funciones que
permiten crear ficheros comprimidos, así como descomprimirlos y leerlos. Fíjate
que, una vez ejecutado el proyecto, si lo actualizas con el atajo de teclas o [F5]
verás que aparece el fichero comprimido comprimido.txt.gz dentro de la
carpeta del proyecto que puedes abrir con cualquier programa de
descompresión de archivos:

- 385 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -

Crear documentos PDF


El lenguaje PHP dispone de funciones para crear documentos de tipo PDF
(Portable Document Format). En este apartado vamos a iniciarnos solamente
en el uso de las funciones más importantes para elaborar este tipo de
documentos.

PDF es un formato de archivo original de los sistemas de Adobe y sirve para


intercambiar documentos independientemente del software de la aplicación
original, del hardware y del sistema operativo. Puede contener documentos con
cualquier combinación de texto, gráficos e imágenes y visualizarse en cualquier
ordenador. Se necesita un lector, el Acrobat Reader, que puede bajarse desde:
www.adobe.es.

Así pues, para poder comprobar si el documento que hemos creado con las
funciones PDF de PHP está correctamente realizado, es preciso tener instalado
en nuestro ordenador alguna de las versiones del programa Acrobat Reader.
Hacemos notar que también existen otras aplicaciones gratuitas para abrir
documentos PDF en el mercado.

En el Manual de PHP se aborda este tema en detalle mediante la biblioteca


creada por Thomas Merz, que es gratuita si se utiliza con fines educativos y
puede bajarse de la dirección http://www.pdflib.com/. En el servidor XAMPP no
está instalada por defecto y es necesario que que el alumno o alumna tenga
que hacerlo previamente.

Instalación biblioteca PDFLIB en XAMPP

Para instalar la biblioteca PDFLib en XAMPP es necesario acceder a la página


anterior con el navegador y hacer clic en los enlaces que se muestran en la
siguiente imagen:

- 386 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -

En la página anterior, debes descargar el fichero que corresponda a tu sistema


operativo (Windows, MAC o Linux) y guardarlo en tu ordenador.

A continuación, vamos a obtener información sobre la distribución de XAMPP


que estemos usando para, así, poder instalar la versión correcta. Abrimos el
Panel de Control de XAMPP y hacemos clic en el botón “Admin”:

- 387 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -

Seguidamente, se abrirá un navegador con la siguiente ventana:

Si hacemos clic sobre el enlace “phpinfo()” podemos ver la página siguiente


que da la información de la distribución PHP utilizada:

- 388 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -

Debemos anotar la siguiente información:

- Versión PHP: en la captura anterior es 5.5.1.


- Sistema operativo: Windows 7 en este caso.
- Compiler: vemos en la imagen que es MSVC11 (Visual C++ 2012) el
compilador utilizado en esta distribución de PHP.
- Thread Safety: enabled indica que está activado el control de hilo
seguro.
- extensión_dir: directorio donde debemos instalar las extensiones
(bibliotecas) de PHP. En este caso es C:\xampp\php\ext.

- 389 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -

Después, abrimos el fichero comprimido que hemos descargado de la página


que distribuye la biblioteca y accedemos al subdirectorio “php\bind” donde
podemos encontrar todas las versiones compiladas de esta biblioteca para este
sistema operativo (Windows):

En este caso, debemos seleccionar el subdirectorio que corresponda con la


versión que estamos utilizando de PHP (en el presente caso es la 5.5: php-
550*), el compilador (VS11 de MSVC11) y que sea Thread Safety, es decir, que
el nombre del subirectorio no contenga el texto “nozts” (ZTS quiere decir
ZendThread Safety). En este caso, corresponde abrir el subdirectorio php-
550_VS11.

En el caso de trabajar en un ordenador de tipo Linux/MAC encontrarás la


bilioteca en el subdirectorio siguiente del fichero comprimido: bind/php/php-
<versión_PHP>/php_pdflib.so.

Una vez identificado el fichero php_pdflib correspondiente a nuestro sistema


operativo y versión de PHP, lo copiamos a la carpeta de bibliotecas indicada en
el campo extension_dir del archivo PHP.ini que hemos obtenido
anteriormente. En este caso, es el directorio C:\xampp\php\ext (en el caso de
Windows).

- 390 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -

Finalmente, modificamos fichero php.ini para que incluya la biblioteca nueva:

extension=php_xmlrpc.dll
extension=php_xsl.dll
extension=php_pdflib.dll
// En el caso de Linux y MAC sería esta línea en lugar de la
anterior
extension=php_pdflib.so

Finalmente reiniciamos el servidor Apache y volvemos a acceder al Panel de


Control para ver en la página phpinfo() que la biblioteca está activa y
funcionando correctamente:

Solución a posibles errores

En Windows puede aparecer el siguiente error al reiniciar el servidor Apache:

- 391 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -

En general, este error no aparecerá en un ordenaor Window ya que dispondrá


de la bibliotecas de ejecución de C++ de Microsoft. Si ocurre este error, será
necesario copiar el archivo “msvcp110.dll” que se encuentra en
“C:\xampp\php” al directorio C:\Windows para solucionar el problema.

Algunas versiones de Linux x86 puede mostrar el siguiente mensaje de error al


reiniciar el servidor Apache de XAMPP:

Warning: PHP Startup: Unable to load dynamic library


'/opt/lampp/htdocs/test/pdf/pdflib/bind/php/php-
530/php_pdflib.so' - /opt/lampp/lib/libgcc_s.so.1: version
`GCC_4.2.0' not found (required by /usr/lib/libstdc++.so.6) in
Unknown on line 0

En este caso, es necesario deshabilitar (comentando con el carácter #) en el


archivo "bin/envvars" las siguientes dos líneas:

#binbuild LD_LIBRARY_PATH="/opt/lampp/lib/:$LD_LIBRARY_PATH"
#binbuild export LD_LIBRARY_PATH

Notamos que, si usas un sistema operativo Linux x64, XAMPP sólo está
disponible para 32 bits y, por lo tanto, debes instalar la versión de 32 bits de la
biblioteca PDFLib.

Incluso haciendo esto, puede aparecer el siguiente error sin consecuencias:

- 392 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -

Warning: PHP Startup: Unable to load dynamic library


'/opt/lampp/htdocs/test/pdf/PDFlib-8.0.4-Linux-php/bind/php/php-
530/php_pdflib.so' - libstdc++.so.6: wrong ELF class: ELFCLASS64
in Unknown on line 0

Si usas el sistema operativo Apple OS X (MAC) en un ordenador de tipo Intel


con XAMPP instalado, aparece este mensaje de error al ejecutar el servidor
Apache:

dyld: NSLinkModule() error


dyld: Symbol not found: __cg_jpeg_resync_to_restart
Referenced from:
/System/Library/Frameworks/ApplicationServices.framework/Version
s/A/Frameworks/ImageIO.framework/Versions/A/ImageIO
Expected in: /Applications/xampp/xamppfiles/lib/libjpeg.62.dylib

En este caso, es necesario deshabilitar (comentando con el carácter #) en el


archivo "xamppfiles/bin/envvars" la siguiente línea:

#DYLD_LIBRARY_PATH

Uso de biblioteca PDFLib en PHP

Veamos a continuación las principales funciones de PHP para crear


documentos de tipo PDF.

Abrir y cerrar un fichero de tipo PDF

Para utilizar ficheros PDF en php usando esta librería es necesario definir
primero un objeto que será el que, con sus propiedades y funciones, nos
permita crear y abrir este tipo de ficheros. La clase en cuestión se llama
pdf_new, y para usarla debemos escribir:

$pdf = new PDFlib();

El método begin_document de la clase PDFlib permite abrir un nuevo


documento de tipo PDF. Tiene esta sintaxis:

begin_document(nombre del fichero pdf, listado de opciones)

Esta función devuelve TRUE o FALSE dependiendo de si se ha conseguido crear


el fichero o no.

Así pues, si queremos crear un nuevo documento PDF y archivarlo en el


fichero “prueba.pdf”, por ejemplo, debemos escribir las siguientes instrucciones:

$fichero_pdf= getcwd() . "\\prueba.pdf";


$pdf = new PDFlib();

- 393 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -

if ($pdf->begin_document($fichero_pdf, "") == 0) {
die("<b>No se puede crear el fichero pdf: '$fichero_pdf'.
<br>Compruebe que no lo tiene abierto con otra
aplicación.</b> Error: ".$pdf->get_errmsg());
}

A partir de aquí el identificador del documento PDF que estamos elaborando es


el representado por el objeto $pdf.

El método end_document() permite cerrar un documento de tipo PDF. Tiene


esta sintaxis:

end_document(lista opciones)

Es imprescindible utilizarlo al acabar la creación del documento PDF, pues el


sistema no da por concluido el documento hasta que no se encuentra esta
orden.

Así pues, al final de nuestro script de creación de un documento PDF hemos de


incluir las instrucciones siguientes:

end_document("");

Si abres el código fuente de éste y de los siguientes ejemplos verás que


aparece la siguiente sentencia al crear el objeto del tipo PDFlib:

$pdf->set_parameter("textformat", "utf8");

Con esta orden indicamos que el formato del documento crear es UTF8. Hay
que tener en cuenta que el código fuente de los ejemplos del curso está
guardado con el juego de caracteres UTF8 para que sea compatible con los
diferentes sistemas operativos disponibles en el mercado. Por lo tanto, para
que los caracteres especiales como tildes y la letra “ñ” aparezcan
correctamente en el fichero final, es necesario configurarlo de esta manera.

Asignar información a un documento

Podemos asignar a un documento PDF algunas informaciones que después


podrán verse con Acrobat Reader.

El método set_info() permite asignar al documento PDF diversas


informaciones. Tiene esta sintaxis:

set_info(nombre del apartado, texto del apartado);

De esta forma podemos asignar al documento los campos Author (Autor),


Creator (Creador), Title (Título), Subject (Asunto), Keywords (Palabras clave)
y CustomField (Campo de usuario). Por ejemplo, escribiendo las instrucciones
siguientes

- 394 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -

$pdf->set_info("Author", "Clodoaldo y David Robledo");


$pdf->set_info("Creator", "Mentor - CNICE - MECD - 2014");
$pdf->set_info("Title", "Confeccionar un documento PDF");
$pdf->set_info("Subject", "Prueba");
$pdf->set_info("Keywords", "Palabras de búsqueda");
$pdf->set_info("CustomField", "Ejemplo 4 - Unidad 8 - Curso Iniciación
de PHP 5");

podemos ver esta información abriendo el documento con Acrobat Reader,


fuera del navegador, en la opción Archivo – Propiedades. Aparece así:

Abrir y cerrar una página del documento

Antes de poder escribir en el documento, es preciso ir abriendo y cerrando


cada página en la que escribamos.

- 395 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -

La función pdf_begin_page() señala el inicio de una nueva página en la que se


va a escribir fijando a la vez su tamaño. Tiene esta sintaxis:

begin_page_ext(ancho, alto, lista opciones)

Hay que tener en cuenta que los valores ancho (width) y alto (height) de la
página determinan el tamaño de la misma, que tendrá una anchura desde 0
hasta x y una altura desde 0 hasta y. Cuando queramos escribir, colocar una
imagen o dibujar una figura en una posición determinada dentro de una página,
será necesario indicar las coordenadas x,y dentro de estos límites. Además,
hay que tener en cuenta que al situar algo (texto, imagen, gráfico, etcétera) en
una página se empieza a contar como en la pantalla del ordenador: de abajo
arriba y de izquierda a derecha.

Por ejemplo, si abrimos una página con la instrucción

$pdf->begin_page_ext(0, 0, "width=a4.height height=a4.width");

tendrá la anchura y la altura de una hoja DINA4 (210 mm x 297 mm). Es este
caso hemos usado el parámetro “lista opciones” para incluir el tamaño de la
página.

Al crear el documento, podemos hacerlo todo lo grande o lo pequeño que


queramos, pues en la pantalla se puede ver con Acrobat Reader con el tamaño
que lo hayamos creado, hasta ciertos límites, claro. Ahora bien, si queremos
imprimirlo, debemos pensar en el tamaño del papel. Las medidas anteriores
definen una página de tamaño DINA4 (210 mm x 297 mm) que tendrán una
anchura de 595 y una altura de 842. Estos valores están expresados en
centésimas de pulgada (1 pulgada=2,54 cm).

Así pues, si tomamos como modelo el tamaño de página fijado anteriormente,


las coordenadas x,y de las esquinas son éstas: inferior izquierda = 0,0; inferior
derecha = 595,0; superior izquierda =0,842; superior derecha =595,842. Dentro
de ellas se puede incluir texto, gráficos, imágenes, etcétera. Los tamaños
estándar de página en puntos por pulgada se pueden ver en la siguiente tabla:

Tamaños de Página Comunes en Puntos por pulgada


Nombre Tamaño
A0 2380 x 3368
A1 1684 x 2380
A2 1190 x 1684
A3 842 x 1190
A4 595 x 842
A5 421 x 595
A6 297 x 421
B5 501 x 709
letter (8.5" x 11") 612 x 792
legal (8.5" x 14") 612 x 1008
ledger (17" x 11") 1224 x 792

- 396 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -

11" x 17" 792 x 1224

La función end_page_ext() señala el final de una página. Tiene esta sintaxis:

end_page_ext(lista opciones)

Las dos funciones anteriores tienen que preceder y seguir, respectivamente, al


contenido de toda página que se incorpore al documento. En su interior se
escribirán las demás funciones que completen el contenido de la página, su
formato, tipo y tamaño de letra, gráficos, imágenes, etcétera.

Por ejemplo, con las dos instrucciones siguientes abrimos una página y la
cerramos:

$pdf->begin_page_ext(0, 0, "width=a4.width height=a4.height");


$pdf->end_page_ext("");

Escribir texto en un documento PDF

Para escribir un texto en un documento, en primer lugar, hay que especificar la


fuente con que debe aparecer el texto y su tamaño.

La función load_font() permite buscar la fuente que queremos usar. Tiene


esta sintaxis:

load_font(nombre de la fuente, código de la fuente, lista opciones)

El nombre de la fuente es una cadena, el código, a partir de la versión 2 de


pdflib, es también una cadena. Ésta puede tener los valores siguientes:
“builtin”, “pdfdoc”, “macroman”, “macexpert” y “winansi”. En el ejemplo de este
apartado usaremos este último, por ser el más apropiado para Windows. Esta
función devuelve un entero que identifica un tipo de fuente.

La función setfont() permite establecer la fuente y su tamaño. Tiene esta


sintaxis:

setfont(identificador de la fuente, tamaño de la fuente )

Por ejemplo, podemos fijar así la fuente y el tamaño:

$fuente = $pdf->load_font( "Times-Roman", "winansi", "");


$pdf->setfont( $fuente, 16);

También podemos cambiar el color de la fuente con la función setcolor(), que


tiene esta sintaxis:

setcolor(tipo, valor para el color rojo, valor para el color verde,


valor para el color azul, valor extra de color )

Por ejemplo, con los siguientes valores establecemos el color azul:

- 397 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -

$pdf->setcolor("both", "rgb", 0.0, 0.0, 1.0, 0.0);

Si queremos escribir con el color negro, debemos poner la instrucción así:

$pdf->setcolor("both", "rgb", 0.0, 0.0, 0.0, 0.0);

Así pues, esta función controla el color mediante combinación rgb (red=rojo,
green=verde y blue=azul). Si se pone 0.0 en los tres argumentos, se obtiene el
color negro. Si se pone 1.0 en uno solo de los tres argumentos, se consigue el
rojo, el verde o el azul, respectivamente. El valor de cada argumento, si no es
0, puede estar comprendido entre 0.000001 y 1.0. Además, se pueden
combinar los tres colores básicos para obtener los colores complementarios.

Veamos ya cómo escribir un texto en el documento PDF.

La función pdf_show() permite escribir un texto en la posición actual del


puntero de escritura. Tiene esta sintaxis:

pdf_show(texto);

A abrirse un documento PDF, el puntero queda colocado en la posición 0,0


(coordenadas x,y). Por tanto, si ejecutamos esta función seguidamente, el texto
se escribe a partir de aquí. Pero, según vayamos elaborando el documento, el
puntero de escritura se irá desplazando, por lo que no sabremos muy bien
dónde va a aparecer el texto utilizando esta función. Así pues, no resulta
demasiado cómoda.

La función continue_text(), que hemos mencionado poco antes, es


prácticamente igual que la anterior. También permite escribir un texto en la
posición actual del puntero de escritura. Tiene esta sintaxis:

continue_text(texto);

Si bien tiene los mismos inconvenientes que pdf_show(), en cambio resulta


cómoda cuando tenemos que escribir un texto que ocupa varias líneas, pues
podemos fijar el espacio entre las líneas y luego utilizando esta función
consecutivamente escribiremos cada línea con la separación establecida.

La función que permite fijar varias de las características que va a tener el


documento es set_value. Por ejemplo, si queremos cambiar el espaciado entre
las líneas su sintaxis es:

set_value("leading", espaciado);

La distancia es un número entero entre 0 y el máximo asignado a la


coordenada y. En nuestro ejemplo, hemos creado una página de 842 de alto.

Hemos visto que es necesario controlar la posición del puntero si no queremos


que nuestra página PDF sea un verdadero galimatías y máximo exponente de
la pintura abstracta. La función que nos permite situar el puntero de escritura

- 398 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -

en la posición en que necesitemos escribir es set_text_pos(). Su sintaxis


también es sencilla:

set_text_pos(coordenada x,coordenada y)

Una vez dada esta orden, ya podemos estar seguros de que la siguiente
escritura se producirá a partir de este punto.

La función show_xy() permite escribir un texto en la posición especificada por


las coordenadas x,y. Tiene esta sintaxis:

pdf_show_xy(texto, coordenada x, coordenada y)

Esta orden resulta más cómoda que las anteriores, pues permite a la vez
escribir un texto e indicar dónde debe aparecer. Ya hemos indicado que los
valores de las coordenadas deben estar dentro del rango asignado a la
anchura y a la altura de la página.

Otras funciones permiten adornar el texto usando la función set_value(), como


las siguientes:

 set_value("textrendering", modo) especifica cómo debe aparecer el texto.


Su segundo parámetro es el modo como debe presentarse cada letra. Los
valores más relevantes son: 0=compactas; 1=vacías con borde; 2=llenas con
borde; 3=invisibles.

 set_value("textrise", puntos) resalta el texto. El realce se indica en el


segundo parámetro con un número entero que especifica el número de puntos
que debe sobresalir el texto.

 set_value("charspacing", puntos) fija la separación entre las letras de un


texto. El segundo parámetro es un número entero que indica el número de
puntos con que deben separarse los caracteres del texto entre sí.

 set_value("wordspacing", puntos) fija la separación entre las palabras de


un texto. El segundo parámetro es un número entero que indica el número de
puntos con que deben separarse las palabras del texto entre sí. Si ponemos 0
en estas dos última funciones, se restablece el paso por defecto.

Utilizando Eclipse PDT puedes abrir el proyecto Ejemplo 4 (Funciones


PDF) de la Unidad 8. Estudia el código fuente y ejecútalo para mostrar en el
navegador su resultado.

Si ejecutas este programa puedes ver una página que muestra un enlace al
documento creado:

- 399 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -

Si haces clic en el enlace se abrirá el archivo PDF creado en el servidor:

En este Ejemplo puedes estudiar el código comentado para ver cómo hemos
usado las funciones que permiten crear este tipo de documentos.

Nota: al tratarse de una biblioteca de libre de uso para aprendizaje, se añade


automáticamente el texto “pdflib.com” en diagonal en la página. Para que
desaparezca este texto es necesario pagar una licencia de uso profesional.

Dibujar en un documento PDF

PHP nos permite también dibujar algunas figuras sencillas dentro de un


documento de tipo PDF. Veamos las principales funciones para hacerlo.

- 400 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -

La función setlinecap() especifica cómo deben ser los extremos de una línea.
Tiene esta sintaxis:

setlinecap(valor)

El parámetro valor puede tener los valores siguientes: 0=unidos al final,


1=redondeados, 2=con su esquina proyectada.

La función setlinejoin() especifica cómo deben ser las esquinas de una línea.
Tiene esta sintaxis:

setlinejoin(valor)

El parámetro valor puede tener los valores siguientes: 0=en forma de ingletes,
1=redondeadas, 2=en ángulo oblicuo.

La función setlinewidth() especifica la anchura de una línea. Tiene esta


sintaxis:

setlinewidth(valor)

La función setlinedash() especifica el patrón de una línea. Tiene esta sintaxis:

setlinedash(unidades blancas, unidades negras)

Si ponemos 0 en los dos parámetros unidades, se dibuja una línea sólida.

La función que moveto() permite situar el puntero en la posición donde debe


aparecer el dibujo. Su sintaxis es sencilla:

moveto(coordenada x, coordenada y)

La función que rotate() permite hacer rotar el puntero. Ésta es su sintaxis:

rotate(grados que debe rotar)

Veamos ahora las figuras que se pueden dibujar dentro de un documento


PDF.

La función curveto() dibuja una línea curva según los puntos indicados. Tiene
esta sintaxis:

pdf_curveto(coordenada x1,coordenada y1,


coordenada x2,coordenada y2,
coordenada x3,coordenada y3)

La línea curva se inicia en el punto donde esté el puntero y acaba en x3,y3,


pasando por los puntos x1,y1 y x2,y2.

La función lineto() dibuja una línea recta según los puntos indicados. Tiene
esta sintaxis:

- 401 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -

lineto(coordenada x, coordenada y)

La línea recta se inicia en el punto donde esté el puntero y acaba en las


coordenadas x,y.

La función circle() dibuja un círculo. Tiene esta sintaxis:

circle(coordenada x, coordenada y, radio)

El círculo tiene su centro en las coordenadas x,y y el radio que se especifica


en el parámetro radio.

La función arc() dibuja un arco. Tiene esta sintaxis:

arc(coordenada x, coordenada y, radio, inicio, final)

El arco tiene su centro en las coordenadas x,y y el radio que se especifica en


el parámetro radio. Se inicia en el ángulo señalado en inicio y termina en el
ángulo final.

La función rect() dibuja un rectángulo. Tiene esta sintaxis:

rect(coordenada x, coordenada y, anchura,altura)

El rectángulo tiene su esquina inferior izquierda en las coordenadas x,y.

La función closepath() cierra el camino actual. Tiene esta sintaxis:

closepath()

La operación “cerrar el camino actual” significa que se dibuja una línea desde el
punto actual hasta el punto donde se inició la primera línea.

La función stroke() dibuja una línea a lo largo de un camino. Tiene esta


sintaxis:

pdf_ stroke()

“Dibujar una línea a lo largo de un camino” significa que la línea tendrá la


longitud que se haya fijado antes con la función lineto().

Utilizando Eclipse PDT puedes abrir el proyecto Ejemplo 5 (Reloj) de la


Unidad 8. Estudia el código fuente y ejecútalo para mostrar en el navegador
su resultado.

Si ejecutas este programa puedes ver que el navegador carga directamente el


fichero PDF creado:

- 402 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -

En este Ejemplo 5 hemos añadido un reloj creando un documento de sólo dos


páginas, para que pueda verse cómo se usan las funciones de dibujo y los
efectos que producen.

Si abres el código fuente verás que usamos la excepción del tipo


PDFlibException que controla los errores que se puedan producir a la hora de
crear el archivo PDF.

Además, es interesante ver cómo hemos utilizado las cabeceras en PHP para
volcar al navegador del usuario con las siguientes sentencias:

// Obtenemos en un bufer el contenido del fichero PDF creado


$bufer=$pdf->get_buffer();
// Leemos el tamaño de este contenido
$len=strlen($bufer);
// Creamos una cabecera de tipo PDF y longitud len
header("Content-type: application/pdf");
header("Content-Length: $len");
header("Content-Disposition: inline; filename=reloj.pdf");

// Presentamos en la pantalla el resultado volcando el bufer. Como se


// trata de un documento PDF, se arranca el programa Acrobat Reader.
print $bufer;

- 403 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -

Incluir imágenes en un documento PDF

PHP dispone también de algunas funciones que permiten incorporar imágenes


de diferentes formatos en un documento PDF. Veamos brevemente cuáles son.

La función delete() libera los recursos reservados a un documento PDF. Se


comporta igual que la función end_document() salvo que libera de la memoria
del ordenador los recursos reservados antes de que el script finalice.

La función load_image() abre en el documento PDF un fichero de imagen. Esta


función lleva como argumentos, al menos, el tipo (formato) de imagen, el
nombre del fichero que contienen la imagen y la lista de opciones. Se utiliza de
la forma siguiente:

<?
$imagen=$pdf->load_image("jpeg",$fic_imagen,"");
if (!$imagen) {
die("No existe el fichero de la imagen ".$fic_imagen);
}
...
$pdf->fit_image($imagen,0,0, "");
$pdf->close_image($imagen);
?>

La función close_image() cierra una imagen abierta.

La función get_value() obtiene determinados valores numéricos. En el


Ejemplo 6 hemos obtenido la altura (imageheight) y la anchura (imagewidth)
de la imagen que hemos incorporado en el documento. Esta función lleva como
primer argumento el parámetro que buscamos, y como segundo, el
identificador de la imagen.

La función fit_image() sitúa una imagen en la posición especificada de una


página. Esta función lleva cuatro argumentos: el identificador de la imagen, la
coordenada x, la coordenada y, y como quinto, la lista de opciones.

Utilizando Eclipse PDT puedes abrir el proyecto Ejemplo 6 (Imagen PDF)


de la Unidad 8. Estudia el código fuente y ejecútalo para mostrar en el
navegador su resultado.

En el Ejemplo 6 de esta Unidad presentamos una imagen en un documento


PDF usando las funciones del lenguaje PHP. De nuevo en este caso, no
guardamos el documento en un fichero, sino que sólo mostramos la imagen
incluida en el documento con el Acrobat Reader. En el mismo puede estudiarse
el código comentado para ver cómo hemos usado las funciones que permiten
incorporar imágenes dentro de los documentos PDF.

- 404 -
Curso de Iniciación a PHP: Unidad 8
- Utilidades prácticas -

Resumen

Hay que saber al final de esta unidad

 Aplicar las principales funciones matemáticas de


PHP a las diferentes situaciones en que deban
emplearse: trigonométricas, para hallar
redondeos, máximos y mínimos, para calcular
exponentes y logaritmos, así como para generar
números aleatorios.

 Detectar y corregir los principales errores de un


script, utilizando eficazmente las funciones de
PHP que permiten conocer su nivel y enviar a un
dispositivo un mensaje de error con el texto que
sea adecuado a cada situación.

 Crear ficheros comprimidos, abrirlos, cerrarlos,


leer su contenido, total o en parte, así como
mover el puntero de lectura-escritura por sus
diferentes bytes.

 Crear documentos en formato PDF sirviéndose de


las principales funciones de PHP para escribir
texto, dibujar figuras e incorporar imágenes.

- 405 -

Vous aimerez peut-être aussi