P. 1
PHP5 a Travez de Ejemplos

PHP5 a Travez de Ejemplos

|Views: 71|Likes:
programacion en PHP, diseño web con PHP, PHP design, PHP programming
programacion en PHP, diseño web con PHP, PHP design, PHP programming

More info:

Published by: Vicente Banda Zuñiga on Aug 25, 2013
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

12/06/2013

pdf

text

original

Abraham Gutiérrez Rodríguez Ginés Bravo Garcia

ÍNDICE

INTRODUCCiÓN .......................................................................................... CAPíTULO 1, INSTALACiÓN....................................................................
1.1 Modo de funcionamiento .........:.................................................................. 1.2 Instalación en Windows ............................................................... ,.............

XV I
1 2

1.2.1 Instalación de Apache en Windows............................................ 1.2.2 Instalación de PHP en Windows................................................. 1.2.3 Instalación de MySQL en Windows...........................................
1.3 Instalación en Linux ................................................................................... 1.3. llnslalaci6ndeApacheen Linux.................................................. 1.3.2 Instalación de MySQL en Linux ................................................. 1.3.3 Instalación de PHP en Linux ...................... ................................ 1.4 Fichero de configuración PHP. INI............................................................ 1.5 Paquetes integrados ............... ...................................................... ..............

3 7 10
13 13

1S 17 18
19

CAPiTULO 2, FUNDAMENTOS DEL LENGUAJE PHP .......................

21
21
22 23 25 27

,

2.1 Fonnoto del código PHP ........................................................................... . 2.1.1 Delimitadores ............................................................................ .. 2.1.2 Extensión de los ficheros en PHP ............................................... 2.1.3 Comentarios................................................................................ 2.1.4 Fin de línea .......................................... ...................................... 2.2 Sintaxis básica ............................................................................................ 2.2.1 Variables..................................................................................... 2.2.2 Tipos de datos.............................................................................

28
28 31

VI II

1'111' S A T RAVt~ DE UI;:MPLOS

e RA·MA

2.2.3 Otros componentes asociados a las variables ............................. 2.2.4 Constantes .................................................................................. 2.2.5 Expresiones ................................................................................

41 48 51

2.2.6 Operadores..................................................................................
CAPiTULO J: ESTRUCTURAS DE CONTROL ......................................
3. 1 Sentencias condicionales ............................................................................ 3. 1.1 if................................................................................................ 3. 1.2 lf .. . else................................................................................. 3. 1.3 if .. . aleaif ............................................................................ 3. 1.4 Expresión condicional (i E compacto) ....................................... 3. 1.5 switch....................................................................................... 3.2 Sentencias de bucles ................................................................................... 3.2. 1 fer ...................................... ....................................................... 3.2.2 fereach..................................................................................... 3.2.3 while ......................................................................................... 3.2.4 do ... while .............................................................................. 3.2.5 break y continue................................................................... 3.3 Inclusión de fi cheros................................................................................... 3.3. 1 include ( ) .................................... ,......................................... 3.3.2 include_once( ) ................................................................... 3.3.3 require( } .............................................................................. 3.3 .4 require_once( )....................................................... .............

51
65
65 66 68 70 72 73 76 77 81 86

89

90
97 97 104

lOó
107

CAPiTULO 4: CADENAS ............................................................................
4. 1 Delimitación de cadenas ............ .... ..................... ................. ,...... ,., ...... ,., ... . 4.2 Vi sualización de cadenas ............................................................. ........... ... . 4.3 Acceso al contenido ........................................................... ,.............. ,., ...... . 4.4 Búsqueda en cadenas ................................................................................ .. 4.5 Comparaci ón de cadenas ........................................................................... .

109
109

11 0 114

4.6 Operar con subcadenas ................ ................ ............................................. .. 4.7 Modifi cación del contenido ..... ......... ....... .... ....... ..... .................................. . 4.7. 1 Limpieza de cadenas ......... ....... ......... ..... .................................... . 4.7.2 Relleno de cadenas ................................ ,......................... ,......... . 4.7.3 Conversión entre mayUsculas y minúsculas .............................. . 4.7 .4 Enmascaramiento de caracteres ............ .. .................................. .. 4.7.5 División de cadenas ................................................................... . 4.8 Relacionadas con HTM L ..........................................................................,. 4.9 Otras funciones ........................................... ............................................... .

11 5 120 123
130 130 13 1 132 134 136 140 141

.

e RA·MA

INDlCf IX

CAPiTULO 5, ARRA YS ................................................................................
5.1 Arrays escalares.......................................................................................... 5.2 Arrays asociativos ...................................................................................... 5.3 Arrays multidimensionales ......................................................................... 5.4 Recorrer un array....................................................................................... 5.4.1 Recorridos en arrays secuenciales.............................................. 5.4.2 Recorridos en arrays no secuenciales......................................... 5.5 Ordenar un array................................................... ..................................... 5.6 Otras operaciones ....................................................................................... 5.6.1 Modificar un array ..................................................................... 5.6.2 Trabajando con porciones del array ........................................... 5.6.3 Usando arrays como pilas ..........................................................

145
145 151 153 157

157 158 164 172
173 177

181
185 185 186 186 188 193 195 196 198
199

CAPiTULO 6, FUNCIONES ........................................................................

6.1 Trabajando con funciones .......................................................................... . 6.1.1 Declaración de una función ....................................................... . 6.1.2 Llamada a una runción .................................................... .......... .. 6.1.3 Paso de parámetros .................................................................... . 6.1.4 Ámbito de las variables ............................................................ ..

,

6.1.5 Devolución de valores ............................................................... . 6.1.6 Funciones con número variable de parámetros .......................... . 6.1.7 Funciones variables ................................................................... . 6.1.8 Funciones recursivas ................................................................. ..

CAPíTULO 7, PROGRAMACIÓN ORIENTADA A OBJETOS.............

203
204 204 205

7.1 Clases y objetos ......................................................................................... 7.1.1 Declaración de una clase y creación de un objeto ..................... 7.2 Primer cOntacto con la POO ...................................................................... 7.2.1 Aproximación Procedural ..........................................................
7.2.2 Aproximación con Objetos ........................................................ 7.2.3 Reusabilidad y mantenibilidad del código ................................. 7.3 Modelo de objetos de PHP S .................................................................... 7.3.1 Clonación de objetos .................................................................. 7.4 Acceso a los miembros de un objeto ......................................... ................

206
207 209

,

7.4.1 Propiedades privadas .................................................................
7.4.2 Métodos_set() y..........,get() .................................................. 7.4.3 Métodos privados ....................................................................... 7.4.4 Método_call () .................................................................... 7.5 Constructores ............ ,................................................................................ 7.6 Destnlclores ...............................................................................................

210 212 213 214
215

216 218 219
220

X

PHP' A 1 RA vts DE EJEMPl.OS

e RA·MA

7.7 Atributos y métodos de clase (Miembros estáticos) ................................. 7.8 Herencia .................................................................................................... 7.8.1 Miembros protected .............................................................. 7.8.2 Redefinici6n ............................................................................... 7.8.3 Métodos y clases final .......................................................... .. 7.9 Clases abstractas ...................................................................................... . 7.10 Interfaces ........... ............................... ... ................................................... . 7.11 Polimorfismo .......................................................................................... . 7.12 Funciones relacionadas .......................................................................... .. 7.13 Excepciones ............................................................................................ .

222 224 228 229 233

234 238 239 243 245 249
249 249 255

CAPiTULO 8: FUNCIONES DE FECHA Y HORA ..................................
8.1 Introducción........... ..................................................................................... 8.2 Funciones de fecha y hora .......................................................................... 8.3 EjClnplo de utilización ................................................................................

CAPiTULO 9: FORMULARIOS. COOKIES y SESIONES .................. ..
9.1 El protocolo HTTP. .............................................. ...................................... 9.1.1 Estructura de los mensajes HITP............................................... 9.1.2 Funciones PHP relacionadas....................................................... 9.1.3 Variables PHP relacionadas........................................................ 9.2 Fonnularios en HTML ............................................................................... 9.2.1 El elemento FORM .................................................................... . 9.2.2 Envío de fonnularios al servidor .............................................. .. 9.3 Fomlularios en PHP .......... ........................................................................ . 9.3.1 Fonnularios en PHP 4.2.x. y versiones superiores .................. .. 9.3.2 Fonnularios en versiones anteriores a PHP 4.2 ........................ .. 9.3.3 Fonnularios avanzados .............................................................. . 9.4 Cookies en PHP ....................................................... .. ............................... . 9.4.1 Estructura de las cookies............................................................ . 9.4.2 Utilización de cookies en PHP ................................................... . 9.5 Sesiones en PHP ........................................................................................ . 9.5.1 Creación de sesiones .................................................................. . 9.5.2 Acceso a las variables de sesión ................................................ . 9.5.3 Otfas funciones asociadas al manejo de sesiones ...................... . 9.5.4 Parámetros de configuración de sesiones ................................. ..

267
267 268 272 277 281

••

281 282
283

-'

283 288

289
295

296 297
303 304

305 3\0 312 315
315 315

j

CAPiTULO 10: FICHEROS Y DIRECTORIOS........................................
10.1 Operaciones con ficheros (nivel imemo}.................................................. 10.1.1 Abrir un fichero........................................................................

e

RA·M¡\

INDICE

Xl

,

10.1.2 Cerrar un fichero ...................................................................... . 10.1.3 Lectura desde un fichero ......................................................... .. 10.1.4 Recorrer un fichero .................................................................. . 10.1.5 Escritura en un fichero ............................................................. . 10.2 Información sobre ficheros ................................................................... .. 10.3 Operaciones con ficheros (nivel externo) .............................................. . 10.4 Manejo de directorios ............................................................................ . 10.5 Operaciones con directorios .................................................................. .. 10.6 Concepto de permisos y dueños en Unix .............................................. .. 10.7 Información de ficheros y directorios en Unix ..................................... .. 10.8 Otras funciones ...................................................................................... . 10.9 Transferencia de ficheros entre cliente y servidor ................................. . 10.9. 1 Subir ficheros al servidor......................................................... . 10.9.2 Directivas de PHP. INI involucradas ...................................... .. 10.9.3 Bajar ficheros del servidor ...................................................... . 10.10 Control de la salida estándar .................................................................. .
CAPiTULO 11: BASES DE DATOS ............................................................

3 17 317 318 319 3 19 320 321

J23
325 326 329 330 330 333 334 334 337 337 338 338 340 340 341 345 347 353 355 356 358 358 359 359 360 36 1 362 368 370 370 384 385 387 391

••

11 .1 Bases de datos relacionales ..................................................................... .. 11 .2 MySQL ................................................................................................... . 11.2.1 Conexión con el gestor de la base de datos ............................ .. 11.3 Implementación de una agenda con MySQL. .......................................... . 11 .3.1 Creación de la base de datos .................................................. .. 11 .3.2 Creación de la tabla ................................................................. . 11 .3.3 Fichero de apoyo...................................................................... . 11.3.4 Listado de registros .................................................................. . 11.3.5 Borrar un registro .................................................................... .. 11.3.6 Modificar registros .............................................. .................... . 11.3.7 Insertar registros ...................................................................... . 11 .3.8 Total de registros .................................................................... .. 11.3.9 Modificar una tabla .................................................................. . 11 .4 Seguridad en MySQL ............................................................................. .. I 1.4.1 Usuarios ................................................................................... . 11.4 .2 Copias de seguridad ................................................................ ..
11 .5 SQLlTE ............................... ................................................................... .. 11 .5. 1 Interfaz de SQLite ................................................................... ..

-'

•1 '

11.5.2 11 .5.3 11 .5 ,4 11 .5.5

Interfaz orientada a objetos de SQLite ................................... .. Diferencias entre SQLile y MySQL ........................................ . Ejemplo completo con SQLite ................................................ .. Instalación en Unix/Linux ...................................................... ..

11.6 Uso de ODBC .......................................................................................... . 1 1.6.1 Ejemplo de uso sobre Access.................................................. ..

11 .6.2 InstaJación de ODBC en Linux ................................................ .

XII

PHPSATRAVtsOEElEMPLOS

CRA·MA

CAI'ÍTULO 12: I)HP Y XML........................................................................ 12.1 Introducción a XML................................................................................. 12.1.1 ¿Qué es XML?.............................................. ........................... 12.1.2 Estructura de un documento XML............................................ 12.2 XML en PHP ............................................................................................ 12.3 SIMPLEXML........................................................................................... 12.4 SAX .......................................................................................................... 12.5 DOM ......................................................................................................... 12.5.1 Interfaces del DOM ................................................................. 12.5.2 Interfaz node ............................................................................ 12.5.3 Intcrfaz Documcnl ................................................................... 12.5.4 Interfaz ElemenJ ....................................................................... 12.5.5 Interfaz Aur.............................................................................. 12.5.6 1ntcrfaz Proces.~inglnslrU(;tion ..................................... " .. "...... 12.5.7 Interfaz characterDala ............................................................ 12.5.8 Lnterfaz Texl............................................................................. 12.5.9 Interfaz CDATASeclion ........................................................... 12.5.10 Interfaz Commenl.................................................................... 12.5. 11 Interfaz Entity ......................................................................... 12.5. 12 Interfaz EnrityReference ......................................................... 12.5. 13 Interfaz NolatiOIl..................................................................... 12.5. 14 Interfaz DocumentType........................................................... 12.5.15 Lnterfaz DocumemFragmenl................................................... 12.5.16 Interfaz nodeLisl..................................................................... 12.5. 17 Interfaz NamedNodeMap........................................................ 12.5. 18 Ejemplos usando DOM........................................................... CAPiTULO 1), EJEMPLO DE APLICACIÓN, WEBMAIL.. .................. 13. 1 Estructura general ................................................................................... .. 13. 1. 1 Variables de sesión ................................................................. .. 13. 1.2 Botonera ................................................................................... . 13 .1.3 Software necesario en el servidor ............................................ . 13.2 Entrada al correo ...................................................................................... . 13.3 Salida del sistema .................................................................................... . 13.4 Revisión de los mensajes en las carpetas ................................................ .. 13.4.1 Opciones de ordenación y cambio de carpeta ......................... .. 13.4.2 Selección de mensajes para ser borrados O movidos .............. .. 13.5 Lectura de un mensaje ............................................................................ .. 13.6 Descargas de ficheros adjuntos .............................................. .................. . 13.7 Composición de mensajes: enviar, responder, reenviar.............. ............. . 13.8 Enviar mensajes ...................................................................................... .. 13.9 Borrar o mover mensajes ......................................................................... .

393 393 394 394 397 398 408 423 424 424 427 430

432 433
433

434
435

435
435 436

,

436 436 437 437 437
438

,

449

450 451
452

455 455
458

459 459 461
472 479 482

490 496

ORA·MA

INDlCE XIII

APtNOICES A: EJEMPLO OE USO DE FUNCIONES DE FICHEROS: AGENDA ..............................................................................................

,

499

A.I A.2 A.3 A.4 A.5 A.6 A.7

Diseño de la aplicación ............................................................... .Inserción de nuevos registros....................................................... Buscar un registro ........................................................................ Modificación de un registro ......................................................... Borrado de un registro ................................................................. Listado de todos los registros....................................................... TOlal de regislros .............................. .,.........................................

500 503 506 508 512 514 515

B: FICHERO DE CONFIGURACIÓN PIIP.INI... ................................

517 5 17 518 520 521 522 522 523 524 525 526 526 526

B.I

Directivas generales ................................................................... .

B.2 Errores ........................................................................................ .

,

,

B.3 B.4 B.5 B.6 8.7 B.8

Ficheros ....................................................................... ., ............. . Recursos .................................................................................... .. Seguridad ................................................................................... . Extensiones dinámicas .............................................................. .. Sesiones ......................................................... ., .......................... . Correo electrónico ..................................................................... .. 8.9 MySQL ...................................................................................... . B.IO ODBC ........................................................................................ . B.I t MatematicaBC .......................................................................... .. 8 .12 Directivas relacionadas con los navegadores ............................. .

C: RESUMEN DE FUNCIONES DE MySQL .......................................

527

D: INTERFACES DOM, DEFINICIONES EN IDL .............................

533 533 535 536 537 537 537 538 538 538

D. I D.2 0.3 D.4 D.S 0.6 0.7 0.8 0.9

Interface Node .......................................................................... . Interface Document .................................................................. . Interface Element ..................................................................... . Interface Attr ............................................................................ . Interface Processinglnstrtlction ................................................ . Interface characterData ............................................................. . Interface Tcxt ........................................................................... . Interface CDATASection ......................................................... . Interface Commnet .................................................................. ..

XIV

PIU' S A TRAvES DE EJEMPLOS

el RA·MA

,
0.10 0.11 0.12 0.13 0.14 0.15 0.16 Interface Entity .......................................................... " ............. . Interface EnlityReference ......................................................... . Interface Notation ..................................................................... . Intcrface DocumentType ......................................................... .. Interface OocumentFragment .................................................. .. Interface nodeList .................................................................... .. Interface NamedNodeMap ....................................................... .
538 539 539 539 539 539 539
541 543

E, CONTEN IDO DEL CD INCLUIDO ................................................ . íNDICE ALF ABtTlCO ............................................................................... .

..

INTRODUCCIÓN

PHP (acrónimo de PHP: H)'fH!next Pre-Procl!fisor) es un lenguaje de programación, relativamente nuevo (su antecesor, PHPIFI, dala de finales de 1994), concebido princip..llmentc como herramienw para el desarrollo de aplicaciones Web. PHP nos permite diseñar páginas dinámicas de servidor. es decir. generar página..; bajo petición capaces de responder de manera inteligente a las demandas del cliente y que nos pennitan la automatización de gran cantidad de tareas. Si tuviéramos que definir PHP en una sola línea. podríamos decir que es un lenguaje interpretado de alto nivel embebido en páginas HTML y ejecutado en el servidor. Aunque existe una multitud de lenguajes y cOlamos de desarrollo concebidos para Internet. PHP se ha convenido en uno de los lenguajes, del lado servidor. más ampliamente utilizados para el desarrollo de páginas dinámicas junto con ASP. JSP. ColdFusion y Perlo En los últimos años. el número de servidores que Ulilizan PHP se ha disparado. De hecho. según datos de NelCr3ft (hul.:lIwww.ncICüI1f.comD a fecha de Agosto de 2004 son casi 17 millones de dominios los que usan PHP.

...

En PHP se combinan muchas car..lGlerísticas que contribuyen nOlublemente ti su ma~iva utilización: entre Olras, está el hecho de ser un software de libre dislribución y muhiplataforma (existen versiones de PHP para U·ix. Win32. Mac OS X, ele.) que sigue la filosofía Opell Source. También ha contribuido a su éxito el hecho de haberse convenido en el complemento ideal para el popular tándem LinuxApache en el desarrollo de sitios Web. Pero lo más destacable del lenguaje y una de las características que más han influido en su popularización es la sencillez de uso que presenHI a los programadores principiantes (se puede desarrollar aplicaciones sencillas en un corto intervalo de tiempo) combinada con las posibilidades

XVI

PUP 5 A TRA V~ DE EJEMPLOS

ORA·MA

avanzadas que proporciona al programador profesionaJ (comunicación con bases de dalos. comunicación vía sockels, generación de gráficos, etc.).

UN POCO DE HISTORIA
Primeros comienzos de PHP
PHP comenzó siendo un conjunto de scripls escritos en Perl que permitían a su creador, Rasmus Lerdorf, el control de los accesos a sus páginas personales. A este conjunto de scripts les denominó como Persollal Home Page Tools. Poco a poco, Ramus fue completando las funcionalidades ~ieas de su herramienta escribiendo programas en C. En 1995 decidió liberar el código fuente escrito en e para que cualquiera pudiera utilizarlo e, incluso, colaborar en su mejora. De este modo nació PHP/FI. A finaJes de 1997 se libera PHP/FI 2.0, pasando de ser el proyecto de una sola persona al desarrollo de un equipo. Tuvo un seguimiento estimado de varios miles de usuarios en todo el mundo. con aproximadamente 50.000 dominios informando que lo tenían instalado, lo que sumaba alrededor del 1% de los dominios de lnternet. En junio de 1998 se liberó oficialmente PHP 3.0, anunciado como sucesor oficial de PHP/FI 2.0, si bien había sido completamente reescrito por Andi Gutmans y Zeev Zurask::i. Una de las mejores caracteristicas de PHP 3.0 que atrajo a docenas de desarrolladores a unirse y enviar nuevos módulos de extensi6n era su gran extensibilidad, además de proveer a los usuarios finales de una sólida mfr.testructura para muchísimas bases de datos, protocolos y APls. En su apogeo, PHP 3.0 estaba instalado en aproximadamente un 10% de los servidores Web en Internet.

Evoluci6n de PHP
El siguiente paso en la evolución de PHP consistió en la reescritura de su núcleo, dando lugar a un nuevo motor denominado Zend (acrónimo de los apellidos Zeev y Andi). PHP 4.0. basado en este motor, y acoplado con un gran rango de nuevas caracteristicas adicionales, fue oficialmente liberado en mayo de 2000. Además de la mejor.! de ejecución de esta versión, PHP 4.0 inclura otras caracteristicas clave. como el soporte para la mayoría de Jos servidores Web, sesiones HITP de forma nativa. ciertas facilidades de orientación a objetos, compatibilidad con las expresiones regulares de Perl. buJfer.f de salida. encriptaci6n, formas más seguras de controlar las entradas de usuario y muchas nuevas construcciones de lenguaje, etc.

es la 5.0 soporta también MySQLi. adem5s de la inlerfaz habiruul. Netscape e iPlanel. una nueva ampliación de MySQL (está diseñada parJ. Microsoft Windows. a Soporte para múltiples servidore'i Wcb: Apache. COM (en Windows) y muchos otros. y mejoras en la gestión de las cadenas de caracteres. Salid. es decir. 5NMP. Solaris y OpenBSD). Soporte para mlís de 25 gestores de bases de datos: Adabas O. ).2 o superior). Linux. IMAP.0. Caudium. Oreilly Website Pro server. PHP 5.1. Soporte para comunicarse con otros servicios usando protocolos tajes como LDAP. También incorpora la gestión de excepciones.. tmbajar con la ver. Ingres. Unix dbm y MySQL. sino que también nos proporciona las siguientes po~jbilidades: [J Sopone para múltiples sistemas opcr. Infonnix. e. Xitami.O RA·MA INTRODUCCIÓN XVII La última y actual versión de PHP. HP-UX.. OmniHTIPd y muchos otros. unu nueva libreria de XML (libxm12). la cual. encierra una interfaz basada en objetos. Python. Hypcrwave. De todas formas. POP3. Ovrimos. es en el enlomo Web donde ha conseguido su mayor aceptación. Oracle. Oirect MS-SQL. ActuaJmente estj en preparación para las platafonnas IBM 05/390 Y AS/400. Shell. generación de páginas con contenidos dinámicos . PostgreSQL. entre otras. Personal Web Server. Sybase. no hay que olvidar que puede utilizarse como cualquier otro lenguaje (Perl. NNTP. FrontBase. [J o [J . mM OB2. el cuaJ ha vuelto a ser reescrito por completo. mSQL. etc. Mae OS X. Soporte para OOSC y extensiones DBX.llivos: Unix (enLre otras. manipulación de cookies. ap<lsionados y ortodoxos seguidores de este par'Jdigma de la programación). HTTP. Empress. InterSase. sOJXJrtc nativo para el sistema gestor de base de datos SQLite. ¿QUÉ SE PUEDE HACER CON PHP? Aunque principalmente se utiliza para programar scripts que van a ser ejecutados en servidores Web. dBase..ión 4. liberada en Julio de 2004. RISC OS.) para escribir programas que se ejecuten desde la línea de comandos. sin la necesidad de que se ejecute conjuntamente con un servidor Web. Entre sus características y novedades m:1s resahables está el completo soporte para la programación oricntada a objetos (que a buen seguro satisfará a los mm. y es que PHP no sólo nos pennite realizar todas las acciones propias de un script COI tradicional (procesamiento de fonnularios. Está basada en el nuevo mOlor Zend 2. Microsoft Internet Infonnallon Server.

Pero lo cierto es que. ficheros de imágenes. ambos lenguajes se insertan en documenlos HTML haciendo uso de emulación de etiquetas (otros lenguajes como Perl deben generar toda la página HTML de respuesta). ficheros PDF y películas Flash . bz2). e La extensión de CORBA puede ser utilizada para acceder a objetos remOlas. SIl/1 ONE Active Sen1er Pages. de documentos XML. o o Funciones de comercio electrónico. Diferencias que hacen que la balanza se vaya inclinando hacia PHP como una mejor solución paro implemenlar aplicaciones Web. que permite trabajar con ASP en platafonnas Unill/Linux). . a pesar de sus semejanzas. e PHP soporta WDDX para intercambio de dalos entre lenguajes de programación en Web. Otras extensiones muy interesantes son las funciones del motor de búsquedas mnoGoSearch. anteriormente conocido como Chili Soft ASP. Manejo de XSLT para transfonnar documentos XML. corno Cybcrcash. VeriSign Payflow Pro y CCVS para las pasarelas de pago. COMPARA TIVA ENTRE ASP y PHP El otro lenguaje utilizado para el diseño de páginas dinámicas de servidor y ampliamente elltendido es ASP (Active Server Pages). traducción . XML. soporte de los estándares $AX y DOM.. funciones para pasarelas de IRC. Es un lenguaje derivado de Visual Basic (aunque se puede programar con orras lenguajes como VBScript y JScript) desarrollado por Microsoft.. las diferencias entre ambos lenguajes son muchas. se emplea principalmente sobre plmafonnas que funcionan bajo sistemas operativos Windows (aunque desde hace poco tiempo existe un software de SUN.. utilidades de compresión (gzip. como objetos PHP. CybcrMUT.. y un sinfín de posibilidades que van en aumento cada dfa. Generación de resultados en múltiples fonnatos como XHTML. De hecho. Par~¡('T e o o Manejo de expresiones regulares POSIX Extended o Pcrl.XVIU PIIP5ATRAvrtsDEElEMPlQS e RA-MA • o Puede utilizar objetos Java de fonna ltansparente. conversión de caJendarios. PHP es en las platafonnas Unix lo que ASP en las platafonnas Windows. Evidentemente.

. mienlras que PHP sigue la filosoffa Optm SOI/ru. Sen. ClI. esto quiere decir que todos sus componentes se ejecutan en el mismo espacio de memoria que PHP. las revisiones del software y los parches a los errores encontrados tienen un tiempo de periodo de desarrollo largo.. Esto hace que ASP esté pensado para funcionar principalmente sobre plataformas Microsoft. volviendo a realizar un salla de contexto al encont. por ejemplo. de modo que. Si bien. ASP. PHP está construido de forma modular. ).. Algunos de los problemas de ASP se resuelven en parte con la última versión del producto ASP.. se produce un cambio de contexto para salir del rllrser HTML y elegir el compilador apropiado. hay que tener en cuenta que este producto no puede ser considerado como un lenguaje de programación de páginas Web. JScript. nunca podrá llegar a ser tan rápido como PHP.erObject's Qmail (gestor de correo electrónico) o Arlisons SAFileUp (necesario para la gestión de descargas de ficheros). MICro. Fill! SySII!III .rar In.• O RA -MA INTRODIJCOON XIX La principal djferencia es que ASP es una tecnología propietaria de Microsoft.NET trabaja con lenguajes de script como VBScript.NET. Req/lest. el código PHP puede ejecutarse más rápidamente al no sufrir la sobrecarga impuesta por la comunicación con los diferentes objetos COM y procesos que soporta ASP. se pueden dar mucha. debido a su propia construcción (basada en una arquitectura COM). una mayor rapidez de ejecución o una gestión de memoria más acertada. cada compilador de ASP se ejecuta en su propio proceso. etiqueta de cierre ASP para volver de nuevo al parser HTML. Finalmente. cuando nos encontramos el comienzo de una etiqueta ASP. Smalllalk y Lisp).~Oft A nivel técnico. ADO. Además.<1i aplicaciones Web entre lodos los sistemas operativos y servidores en los que funciona. . Sin embargo. Sin embargo. Hay que tener en cuenta que la filosofía Opl!lI SO/lrcl! de PHP hace que a lo1argo del mundo existan gran cantidad de equipos comprobando el producto. PerlScript y Python y con lenguajes compilados como VB. De este modo.como SWI ONE ASP que permiten su utilización sobre UnixILinux. lo cual permite actualizar el producto con nuevas versiones y revisiones que solventan sus problemas de una forma mucho más rápida. como una herramienta de desarrollo de aplicaciones Web (una de las principales realizaciones es la flexibilidad a la hora de elegir el lenguaje de progrumación a utilizar. Cobol. ASP. ASPEncr)'pt (necesario para la encriptaci6n). razones a favor de PHP: entre ellas. en PHP todas estas opciones están incluidas de forma gratuita. la comunicación de errores en ASP y su solución por parte de es muchísimo más lenta que en PHP. a pesar de que existan soluciones -con un coste económico elevado-. PHP nos permite que sin ningún problema podamos migrar nueSlm. Sin embargo. C. Todas las operaciones en ASP están controladas por objetos COM (Response. La filosoFra de producto comercial de ASP innuye además en que gran cantidad del software adicional necesario para complementar una aplicación Web supone un coste económico adicional. sino más bien.

1. De hecho. Senw Applicarioll Progl'{/ II/millg II1It'Tface) o como programa extemo a éste (modo CO I. MySQL y PH P (aunque también podría ser Perl o Python). Es de perogrullo: tantas . por fin.- CAPÍTULO I INSTALACIÓN Tal Y como se ha comentado en la inLroducción. Por lodo ello. dC!>cargarlo de memoria y de la liMa de tareas.~e s de datos y denlrO de la sección de SQLite se incluye un apartado sobre su ¡n<¡luJación en sistemas U*ix. está muy extendido elténnino LAMP. ejecutar un programa CO I le supone a la máq ui na donde está ejecutando el servidor Web ll amar al si'ilema operativo para que realice la'i siguicntes tareas básicas: cargar el programa en memoria.0. A grandes rasgos. en este capítulo comentaremos la instalación de estos tres productos en las plataformas ~e Linux y Windows. Apache.. esperar a que termine y. lanzar su ejecución. en el capítulo de ba. De todas formas. cuyas iniciales hacen referencia a Li nux. . anotarlo en la lista de tarcas. eces un cliente pida la ejecución de ~e . En este capítulo no se aborda la instalación de SQLite puesto que está disponible por defecto en la distribución de PHP 5.1 MODO DE FUNCIONAMIENTO El intérprete PHP puede ser ejecutado por el servidor Web de dos modos dist intos: como módulo del propio servidor (i nterfaz SA I)I. la configuración en la que encuentra de forma más habitual el lenguaje PHP suele ser conjunUlrnenle con Apache como servidor Web y MySQL como gestor de base de datos . Common Gafell'a:v IlIferJace).

a través del SAPI podemos añadir nuevas funcionalidades a un servidor Web (por ejemplo.II-intcrpretcrslncglbindir. serán mucho más rápidas y eficaces (no habrá creación de procesos nuevos ni ocupación extra de la memoria ((sica con copias de éstos . Si. por la razón que fuera.ción de imágenes al vuelo. para que los procesos PHP se ejecuten bajo determinados usuarios). Si PHP se está ejccUlando como CGI. si el número de peticiones e~ medio-alto. por tanto. \ Por otra pane.orgladvisories/CA-%.hlml hup:llwww. elc.html 1. I La función php_lUIpi_na_t.2 I'IIPSATRAV~DEEJa. que es el SAPI del servidor Website Pro de O' Reillyl. devuel\'e el llpo de SAPI que hay entre el servidor Wcb y el intérpretc PI-IP. lamas veces se repetirán estas acciones en la máquina servidora.. existen varios tipos de APl's: Apache API para el servidor Apache. el rendimiento general de ésta se verá proporcionalmente degradado. Esto significa que las ejecuciones de los programas las hará el propio servidor Wcb y. ISAPI de Microsoft para su producto /tl/emel ltifOntlatioll Server.. cacheo de páginas. se recomienda la leclUra de los siguientes documentos del CERT (Compllter Emergency Response Teum): hup:llwww.2 INSTALACIÓN EN WINDOWS PHP está portado para las versiones de Windows de 32 bits. Windows 95/98/Me y Windows NTI2000/xP. ).). . Lo más interesante de esta caraclcrlslica es que todas estas nuevas funcionalidades se van a ejecutar de forma más rápida y eficiente ya que lo van a hacer en el espacio de memoria del propio servidor.ar. NSAPI de AOL para el servidor ¡Pluner (antes. devolverá la cadena "cgi".1PtOS e RA-\1A un programa CGI. Según el fabricante de servidores.cen.. autenticación de usuanos. s ino por la ocupación de la me/Iloria risica del eqUipo servidor con las copias del programa CGJ ejecutándose. la versión CGI tiene innumerables problemas de seguridad asociados. Nerscape Emerprise Sen'er) y WSAPI. Además del bajo rendimiento..cen. Es fácil imaginar que. generJ. p<XIemos pensar en un SAPI como un protocolo que permite acceder directamente a las funciones inlemas del servidor: por tanto.. se necesitara instalar PHP en su versión CGI (por ejemplo.org/advisories/CA-I996-II . esto es. acceso a bases de dalas. no ya sólo por el número de tareas simultáneas a reali7.

.:lDt_~ .. la versión 2.. -.. ._.. bajaremos de la dirección hup¡fflw!?d. .x sólo se ret:omienda para Windows NTrlOOOlXPI2003. 01 I Después de la presentación y la aceptación de los térmi nos de la licencia de u!oo de este paquete software.. la versión 2. . basta seguir las indicaciones y rellenar algunos campos de formulario: _ . ....... _. plstafonnas claramente orientadas a trabajar como servidores. ".. . vamos a instalar esta última por las ventajas que ofrece en cuanlO a rendimiento y amplia gama de posibilidades... ..-__ ___.. O.__ I . ..._ "'¡¡.!L'ip7RelcaseID 17344 y para Win-9x de la dirección hllp:iN......"''''-''''' . De momento.' .. y que no incorpora las li brerías Sccure Sockets Layer necesarias para instalar un servidor segu ro (con encriptación): sufijo _no_ss lo Antes de lanzar la ejecución del fichero msi desde el explorador de archivos. _ - . .x... _ --..-..orgldown load. _-_ __ __-_ .. _ 1 _ 1 . En el momento de la edición de este caprtulo.. 50-win32-x86no_ss1 .._--...L..' .......... La instalación de Apache en Windows es muy sencilla. W\\ ._ . msi.- . _ ..ílllache. por tanto. --_ .2....microsoft. . ~ .C RAMA CAPtruLO 1: INSTALACiÓN 3 1.comidownlo..1 Instalación de Apache en Windows • De las dos ramas de desarrollo del servidor Apache 1..cgi el fichero apache_2... [ ". de hecho.~ 1'1... .....0 es competitiva con el servidor I1S de Microsoft en cuanto a estabilidad y rendimiento.microsoft.. _ _ 4 _ _ ... _ .. el nombre con 1 Se necesila la versión 1.0. .. _... _____ 'OO_ ~ -... la última versión liberada y estable para Windows es la 2.. .._-.w". aparecerá otra ventana donde se nos pide información tal como el nombre del dominio donde va a estar colgado el servidor. El nombre del fichero nos pennite saber dos cosas: que será ejecutado por Microsoft Syslcm lnslal ler2 (extensión msi). si hubiera un servidor Apache ya instalado (y además estuviera funcionando)...10 como mínimo.__..50. lo primero que habría que hacer es detener su ejecución.. .-1 ' ..a~p?RelcasdD 17343.uislrele<be.3...... _ - Ir íHt" I .comidownloadslreleasc..lt y 2... Para NT puede bajam: de hIIP..

..~ Una vez.-_1'11-"'" --r'-.. ----..........trador. _ . ----. C-¡. :_-""...--"".. -... ___ _ " ' ............- -- _.-" _ -----_...J--~_ _ ------.. el que queremos que se dé a conocer y la dirección de correo del adminio.. htdacs.. indicados los datos necesarios....._ . Al terminar esta operación. -.. _ '" ....... - r: .._ ...........a _.......-- . _ . ""-. H .- "'-''''''1 -.-.ot:J _ . El directorio por omisión donde se IOs1aJan todos los ficheros de Apache es c: \Archivos de programa\Apache Group2\Apac:he2... ... _ _ .. _ ... - "" • ...~..á1:l .. _ . excepto el código fuente) o personalizada.. ...... 10g5..... . _ . _ _ _ ..._...... o bien. En la mi~ma pantalla se nos pide además si queremos que este paquete se instale como servicio de Windows {se ejecutará de manera automática al arrancar el equipo} en el puerto estándar (well-k1lowl/) 80. -_ . al!( se crearán. 1 .. .. . -_ .... _ .~ ........ procederemos a instalar el paquete pul~ando en el bolón preparado al erecto.. _ .. preguntará si queremos hacer la instaJación típica (se inslala todo._ r_ ...~_ En la siguiente pantalla... etc..-. . deberemos ver la \ Iguicnte pantalla: .. .. los directorios canf. enlrc otros.4 PIIP 5 A TRA vts DE EJEMPLOS o RA-MA.. que se instale como una copia para el usuorio desde el que se está realizando la instalación y en el puerto 8080. .... _ .. --_ ...... "'-_. . __ ...-:..-.._--. 1ibexec. ... bino cgi-bin. ...... ~ r __ " ..

e..in~tead .._ .-.. ...... __ .. Apo'bo·po ...•...w..... O..". d ......&<hol Las operaciones de arrancar y parar el servidor las podemos realizar de (reS fonnas dis[inlus .. ."' . arran¡.... TIoo_. ~'O\I Ap.. 1110 _ b. _ho.~ ... ( I d . __ ~_ ..-_... . b_. Ap~ Mwrm.._..........""""""' n. .0.....--O.... .""_ . . nos conectamos a cualquiera de los URL.. hemos hecho una instaJación correcta.....f... ... _ _ . lO........ . 10 .....horo.. Si la instaJación ha sido correcta. La primera de ellas es a lravés del programa monitor que viene con la instalación de Apache (Inicio -> Programas -> Apache HTTP Server 2. .. n._-_ . _ _ U l ... dooInbucI"" y.. ...... 1/.50 -> Control Apache Server -> Monitor Apache Serversl que nos mostrará la siguiente pantalla: ...wIodI_"""_ ......CAPrTULO I INSTALACIÓN S f>Io _ _ .l ...u ." .¡ lO' "' .~. 'IUokJ ro... .. wot>_ ....... ....... con un navegador._lIt4>oa"......... _ _ ...... veremos la siguienle imagen: ". . _ f .0..-. ._ o ( ._.... 6t 1'......t__ IIo ... w¡w.w..amos el servidor (ya está disponible desde el menú Inicio -> Arc h ivos de Programa -> Apache HTTP Server 2... SO -> Control Apache Server -> Start) y. _ .. .r.. _ of the webllte you eJ:pec:ted? s.lo.. _ _ ......0.c¡ hup:lf1ocalhostl o http://127... .. 5 .. efectivamente. bet~"'""""6W11h . _-...... ....... .....-...."~_ Seeing thu PIuN.A. I Para comprobar que. . . "".....<L..

el comando: Inet stop apache2 l .. . podemos hacerlo desde el entorno gráfico del sistema operativo (Inicio -> Configuración -> Panel de Control -> Herramientas Administrativas -> Servicios): -.... para pararlo........ . .. ... ~ • -..... •• -~ ~~.... _. . -.. . .. _ . -.. ~~.. . .. -. .6 PIIP....... ....-....s A TRA vts DH EJEMPLOS CRA-MA Si está instalado como servicio de Windows...... .. -_ ......_ . --... .... . habrá que ejecutar el comando: Inet ~tart apache2 Y.. para arrancarlo.............. o desde una ventana de MS-OOS donde....

O.exe.1Win)2 tos ejecutables php. Nuestra recomendación es hacerlo bajo un directorio cuyo nombre sea el nombre completo de la distribución usada (en este caso. ini-recornrnended sobre php. ini Es recomendable que todos los ficheros de PHP (ejecutables. 2. De las dos versiones que allf hay. tendremos debajo de c: \php-S. librerías. aparecen de ronna continua nuevas versiones. hacemos una copia de php. para que PHP sea capaz de encontrar las librenas dinámicas que ofrecen funcionalidades adicionales (acceso a base de datos.dll. zip).php.0. y el fichero de configuración php. por tanto. Configuración de PHP: librerías y pbp.O. en la mismu carpeta e: \php-S. generación de documentos en fonnato POF.exe y php-cgi.php encontraremos tas versiones binarias del paquete (válidas para todas las versiones Windows de 32bits: Win-9x1Me.netldownloads. ini. y para ambos modos de runcionamiento de PHP (módulo y COI).1-win32.2 Instalación de PHP en Windows Los pasos básicos a realizar para la instalación de PHP en platafonnas Windows son: 1. La última versión de PHP 5 estable que encontramos es la 5. Por ejemplo.lwin32) dado que PHP es un proyecto que está en pennanente evolución y. y lo editarnos según nuestros necesidades. O . nos bajaremos la primera puesto que en ella se incluye tanto la versión COI como la versión SAPI para Apache. ini. Win-NTI20IX)fXP). O .1-win32. criptografía.2.e RA-M"" CAPITuLO 1: INSTAlACiÓN 7 1. Descomprimir el nchero bajado Una vez tengamos el fichero en nuestro disco duro. la libreña phpSts. 3. ex tensiones y ficheros de configuración) estén bajo el directorio donde hemos desempaquetado la distribución. etc. En nuestro caso.) necesitamos primero modificar la directiva extenaioD_dir con la ruta donde están todas las librerías . c:\php-S. Obtención de la última distribución PHP En la dirección http://www. el siguiente paso es descomprimirlo. Albergar la distribución en una carpeta del disco duro que tenga como parte del nombre el número de distribución e\'itan1 mezclar versiones y configuraciones direrentes.\ (almacenada en el fichero php-S. Para obtener este último. zip y msi.

y luego descomentar la trnea correspondiente a la funcionalidad que queramos. ModincHI. ahora que PHP5 no incorpora por defecto el intenaz de acceso a un servidor MySQLJ • las modificaciones que habría que hacer a php.").cont de Apache Si el servidor Web elegido es Apache. ini serian: extension_dir = ·c:/php-5.. Después de realizar cualquier modificación en el fichero httpd. conf (recomendamos guardar una copia de respaldo del fichero de configuración) con cualquier editor de texto (bloc de notas..ocesarios para hacer la instalación de PHP. pard asegurarnos de que los cambios están bien hechos. 4. se usará la barra inversa o harks/m'" (".0.0. la notación cambia: en el primer caso. Es de resaltar que.conf. ini) modificamos la directiva PHPIniOir: [PHPlniOir ·c:/php-5. hay que indicarle un par de cosas para que ejecute el inlérprele PHP cuando se le pidan páginas con extensión' . .exe" -t.8 PI\P 5 A TRAVts DE EJEMPLOS ~RA·MA dinámicas. bajo Apache en Windows. que se encuentra en la carpeta de la distribución de PHP.dll Además. según estemos hablando de directorios de Windows o de nombres de directorios en los ficheros de conligurdción de Apache. mientras que en el segundo serola barra normal o stas" ("").0. ) llay dos interfaces para lrabajar conlra servidores MySQL: IIlYllql y IIIYIIQli.:i6n del ficheru httpd. Con esa intención modificamos su fichero de configuración ht tpd.0.22 hasta la 5. ya que esta instrucción comprucba la sintaxis del fichero de configuración httpe). abría que copiar la librería dinámica libmysqlLdll.1-Win32/ext/" extension=php~sqli.1-Win32/~ A continuación. en el direclOrio c:\windows\system32.amos el ultimo porque da soporte para las versiones 3. es conveniente ejecutar desde una ventana de MS-DOS la insuucción ~c: \archivos de programa\apache group\apache2\bin\apache. por ejemplo). mientras que la lIIYaql sólo llega hasta la H:rsión 4.conf. Concretamenle. Para que Apache sepa dónde encontrar el fichero de configuración de PHP (php. de las dos famas que comentamos al principio del capítulo: como módulo o como CGI.php'. Utili7. veremos qué pasos son los Ilt.

Alias Iphpl ·c:/php-5. sólo hay que asegurarse de que las siguientes lineas están en el fichero de configuración de Apache: LoadModule php5~ule ·c:/php-5.php . con f de configuración de Apache: script.0.exe" En modo de configuración.1-Win32/php5apache2.contdeApache Para que se ejecute como un programa aparte.. O. editamos un fichero que contenga las tres Uneas de abajo debajo de la carpeta "e: \archivos de programa\apache group\apache2\htdocs" con el nombre ·prueba. arrancamos Apache.phps 6b) Modo CGI: modificación del fichero httpd. . Comprobación de la instalación Para verificar que PH"P se está ejecutando. después de descomprimir el fichero empaquetado en el direclOrio c: \php-5. hay que asegurarse de que tenemos las siguientes líneas en el fichero h t tpd.pd. por ejemplo.php .php·. si queremos visualizar el programa fuente de cualquier script PHP con la sintaxis del lenguaje resaltada en distintos colores. necesitaremos crear otro fichero que contenga la función show_source (.• o MAMA CAPfTULO 1: INSTALACiÓN 9 6a) Modo SAPl: modificación del fichero ht t.I 7. php.phtml Aceion application/x-httpd-php "/php-5. escribimos el programa: . y con un navegador nos conectamos a esa página (http: // localhost/prueba . php). Por ejemplo.1-win32/php-cgi.conf: IAddType application/x-httpd-php-source .1-win32/' AddType application/x-httpd-php . para ver el programa mi_script.phtml PHP ofrece una característica muy útil que consiste en poder visualizar el programa fuente de cualquier script PHP con ta sintaxis del lenguaje resaltada en distintos colores. Para conseguir esto.0.1-win32.dllAddType application/x-httpd-php .0. cod de Apache Para que se ejecute como módulo de Apache. necesitamos hacer dos cosas: que el fichero tenga lu clttensi6n phps y añadir la Ifnea de abajo a httpd.

..... :"~..¡.......¡ ..taw.20) y descomprimirla en un directorio temporal.... nos cambiamos a dicho directorio temporal y ejecutamos el programn setup..__ "_"""0001 __ ·.J tft [k: ] __~ J ...¡"..0...... __ a.2... _ ' " (_lo ... Luego... ~.o"'". .._.........mysgLcomldownloods/rnysgLhtml (la encontrada en el momento de la edición de este capítulo fue la 4. _ _ _ _ _ ..-- 1.. ..... _ _ ..¡.. . ... si todo ha ido bien. . . _01.... .... a. ~ J:.... _ ....10 "'II'~ATRAVÉSDBEJEMPLOS O RA-MA El resullado..'-"'-"'--_ _"' _ ...JDI -- ~_ !'IIM _ _ .1 .... exe...3 Inslalación de MySQL en Windows Lo primero que hacemos es bajarnos la última distribución estable de MySQL de la dirección http://www. ... que es el que hará la verdadera instalación de este paquete: __ . seria el que aparece en la siguiente imagen: -..._.... ..

aparecerá un icono en fonna de sem:1foro en la zona de notificación de la barra de tareas.. bases de . ini.. data (donde se almacenan las bases de daros) y doc (documentación muy útil relativa a la instalación. JCJ • U. sobre el equipo servidor donde se está ejecutando.. ---- El directorio por omisión donde se instala MySQL es e : \mysq1. elc)..__ ... Con ella podremos conocer dala!... exe. exe es una herramienta gráfica gracias a la cuaJ podremos realizar de manera sencilla e intuitiva la administroci6n de nuestro gestor de base de datos.. entre otros._. Una vez que está arrancado... - _. En esta carpeta encontraremos. índices. utilizaremos WinMySQLAdrnin. el nombre y clave del usuario del sistema bajo el que va a ejecutarse el servidor. .- ~'-'- . .._-_. tablas. También creará el fichero de configuración e: \windows\my. los mensajes que se produjeron al arrancar el servicio. por medio de la ventana de abajo. 4 etJtftOld 7 I . mantenimiento. procesos en ejecución.. Sin embargo. etc .... _---~­ ..... exe o WinMySQLAdmin.. .. variables del sistema.... dado que tiene que inicializar bases de dUIOS.... " WinMySQLAdmin... --_ ..... mensajes de erTQr que hayan ocurrido. exe porque la primera vez que se ejecuta nos pedirá. mysqld-nt.. la primera vez que arrancamos el servidor. . los djrectorio~ bin (donde se almacenan los programas para arrancar y parar el servidor)..-""' .. M " I WinMvSQLadrnin Ver ..... El servidor lo podemos arrancara con cua1quiera de los comandos mysqld.ORA-MA CAPITuLO 1: INSTALACIÓN IL ~*'-- . exe.._ .

sobre todo.. . o añadirla como opción en la Hnea de comandos. I'UtLIt .. I'\... .\IorIwI'"' O_I"_I.. . r_ . Por último.. ~W ' _ . ...I~ PIIP!i A TRAV& DE EJEMPLOS G RAMA datos eltistentes.IIUt .... .. . . " .. . .. . podremos editar el fichero de configuración. . para arrancar y parar manualmente el proceso servidor de MySQL deberemos: Arrancar 9x1Me rnysqld instalación del servicio: mysqld-nt --install Parar mysqlacbnin -u root shutdown eliminación del servicio: mysqld-nt: --remove NTI2000 ._ ~ ... __ O 0 _ 1 0 .. .. 0-. 1)"8 . )00--.. . W.. ini.-.01 en el fichero de configuración my.O_ _.. _ _ ... deberemos incluir en el fichero de configuración e: \rny . _. .r .. '1.. _~ ~".OOO_N _ ..-......~I F./ruta-datosl Para evitar que desde fuera de nuestra máquina sepan que tenemos levantado un servidor MySQL podemos poner la directiva bind-address-127........ _ . . 0. _M -_. _ _ _ ... el servidor MySQL sólo atenderá en el interfaz de red local.. _ _ I"' _ _ _ ---.- . .._ .~t... enf las siguientes líneas: [mysqldJ basedir~UNlDAD:/ruta-instalacionl -- datadir.. informes y. . 0 _ "' _ _ IO. por el motivo que fuese._. \mysql... necesitáramos inslalar la aplicación en un directorio distinto a c._ ...-"-1 Si. •• "" r __ -_.UNlDAD. ~IQ_ . De cualquiera de las dos formas.~.

Los pasos a realizar consisten en bajarse el fichero apache_l . Hp· UX (HP).3. sino a una amplia familia. vamos a ver la instalación de estos paquetes de la forma más genérica posible: desde los fuentes. tar. el fichero c:\mysql\data\mysql.. 1. precisamente por la amplia diversidad de U*ix que podemos encontramos. Truc64 Unix (Compaq). en Linux instalaremos la versión 1. 5parc de Sun Microsystems. que es frecuente encontrar~ con expresiones del tipo *ix o u*ix cuando queremos referirnos a Unix. AIX (18M).Odas estas versiones de Unix elegimos GNUfLinux por varios motivos: fiabilidad. Tanto es asf. pero. aunque existen versiones que se pueden instaJar y ejecutar en mt\quinas AJpha de Compaq.<¡.1 Instalación de Apache en Linux Mientras que en Windows se recomienda instalar la versión de Apache perteneciente a la rama 2. Mclntosh de Apple. por su precio: es gratuito. etc.orgldisllhnpdl. 3.err nos puede ser de gran utilidad ya que es en ese fichero donde el servidor escribe los mensajes de error. O.3 INSTALACIÓN EN LINUX Unix es el nombre genérico con el que se denomina a sistemas oper<1tivos tales como GNU/Linux. Es habitual que las distribuciones de muchas aplicaciones vengan ya precompiladas (en formato binario o en formato RPM. estabilidad.3. descomprimirlo en un directorio adecuado. dado que la integración con PHP no está suficientemen te estable.apache. Solaris (Sun Microsislcms). elc. mysql ~ld-nt NTI2000 (consola) --standalone --console mysqladmin -u root shutdown En caso de problemas. sobre todo. gz que contiene toda la distribución en código fuente de la dirección http://www. Pero. con este término no nos referimos a un único sistema operativo.op mysql net start. robustez (como todos los Unix). RedHad Package Manager) para distintas arquitecturas.). 1.31. De entre !. configurar el paquete y compilarlo: . esto e. maillframes 5/390 de IBM. La versión más extendida de Linux/GNU es la que corre en arquitecturas Inlel.CAP/ruLO 1: INSTALACiÓN 13 Arrancar (!>ervicio) Panr net st.

J.ter..3 HTTP server..apache. _-------. ejecutamos: • lusr/local/apache/bin/apachectl configtest Syntax OK Para ejecutar el servidor: • lus r / local / apache/bin/apachectl start . You now have successfully bullt and inatalled che Apache 1. conE para que queden con los valores: ServerAdmin webmaster@localhost ServerName localhost Part 80 Para comprobar que In configuración del servidor Apache es correcta. make inseall Si la instalación ha ido bien.conf and chen you should be able ta immediately Eire up Apache the Eirst time by running: lusr/local/apache/bin/apachectl atare Thanks for using Apache. veremos el siguiente mensaje: -----.org/ +---------------------------------------------------------+ Antes de arrancar el servidor. . la instalación efectiva hay que hacerla como superusuario 0..--_.3! $ . The Apache Group http://www.gz $ cd apache_l.31. con un usuario que tenga los suficientes derechos de escritura en directorios del sistema: It +.-_./configure --enable-module=so $ make Por último. podemos modificar algunas de las directivas del fichero de configuración httpd.3.------------.--------_. To verify that Apache actually works correctly you now should first check the (initially created or preserved) configuration files /usr/local/apache/conf1httpd. / apachectl start: httpd atarted . al menos.14 PIIP oS A TRAvts DE EJEMPLOS ORA-MA S cd ¡uar/local/instal! $ tar %xvf lusr/local/distrib/apache_l.

configurar. en Linux.3.cnf ¡etc/my. primero creamos un grupo (mysql) y.luego. hay que instalar MySQL antes que PHP con el fin de indicarle a PHP dónde se encuentran las cabeceras y librerías de MySQL.pl mysql_install_db creamo!) la tubla rnysql donde se definirán qué usuarios y qué máquinas (hosts) podrán conectarse y.sock 11 make install • cp support-files/my-medium. CQmo su propio nombre indica.20. en generol. que penenecerá al grupo recién creado: " groupadd mysql • useradd -e ·Servidor MySQL. tar. 0.html. Por esto.comldQwnloadshnysgl. el sopone paro MySQL ya no viene integrado por defecto. compilar la distribución y. . los pennisos de acceso.mysgl. y.. la otro! tabla que se crea se llama test. sino uno cualquiera que no tenga privilegios especiales. asignamos los dueños oponunos a los directorios donde se ha instalado la dislribución: chown . por último.2 Inslalación de MySQL en Linux A partir de PHP5. como superusuario. INSTALACIÓN 1. un usuario (rnysql). hacer la instalación: $ cd /usr/local/install S gzip -d < /usr/local/distrib/mysql-4.cnf 11 chmod 644 letc/my.0. gz de la dirección http://www.ORA·MA CAPfTULQ 1.tar.R mysql /usr/local/mysql ~ Las tarea" que quedan ahora son de puesta a punto de la base de datos: con el ~(T. Las acciones a seguir son: bajar el paquete mysql-4.Q% I tar xvf - S cd rnysql-4.20 $ . por problemas relacionados con las licencias de uso.-d/dev/nul1 -9 mYSQl -s/bin/false MYsql Luego.cnf 11 strip luar/local/bin/mysqld Por seguridad.5 1. como superusuario. R root /usr/local/mysql " chown -R mysql /usr/local/mysql/var 11 chgrp .20. Por esto. el usuario que ejecute el servidor MySQL no será roat./configure --prefix~/uar/local/mysql --with-rnyaqld-uaer=mysql S rnake $ BU \ \ --with-unix-socket-path~/tmp/mysql.0.

. a continuación.d/rnysqld • chkconfig --add rnysqld /sbin/chkconfig --list mysgld myaqld O:off l:off 2:0" )'0" 4.d/init.server /etc/rc. i /etc/rc.on 5. Luego arrancaremos el demonio servidor de MySQL.clave' Necesitamos ahora que el servidor MySQL se ejecute de manera automática cuando se levante el sistema operativo. Para ello. MySQL se está ejecutando y.d/init.d/mysqld start • letc/rc.ql &j • En una distribución RedHm.dt. comprobaremos que. efectivamente.d/mysQld stop Una buena medida de seguridad es que el demonio servidor se ejecute como el usuario mySQl en lugar de hacerlo como root: para ello sustituimos en el fichero lete/ re.pid-file:$pi~file & Por esta otra: ISbindirlSVSqld_safe --datadir~$datadir -·pid-filemSpi4-file ·-u••r~. support-files/mysql. debemos situar el script que ejecuta el demonio adecuadamente en la eslJ'Uclura de directorios del comando init (letc/rc. /mysqladmin -u root password ·una.t 1 1 1 +--~--------------+ +-----------------+ * .on * cp * 6:off Si alguna vez necesitamos arrancar o parar el demonio de fonna manual./mysql4-safe --user=mysql & • /usr/local/mysql/bin/mysqlshow -p I I I Databases mysql to.d/init. d / mysqld la línea: I$bindir/mysql~safe --datadir=$datadir . esta t~a se resuelve fac:ilmenle con el comando chkconfig..16 PIIP!iATRAvEsDEElEMPLOS ORA-MA podremos usarla para hacer pruebas. . d I init. podemos hacer. cambiaremos la palabra clave por defecto del superusuario de la base de datos: • scripts/mysql_install_db --user:mysql • cd !usr/local/mysql/bin • .

IIOftw4re 18 Bubject to th. • • Tn..conf la lfnea~: . Además. • 'ftrl.O ."M·W"·· "". lnat"ll"tloa proc•••• you "re bo~ by ~he terms of thi. por el contr. " . necesitamos que éste le infomle a Apache de que va a usarlo.cont: se habrá anadido al eJccutar ' _ke i nat . podremos usar la opción --with-apac he=>/camino/distribucion/apache. y usar la opción de configuración --wi th-apxs=/camino/script/apxs. obtendremos el mensaje siguiente. 1 1'. By ~ontinuino tbi.nk you tor u... entre OlTaS. licanse agreeDent.tar. pi ' .lI. "v"U"blill' 111 Lb!.gz $ cd php-S. la venlaja de no necesitar hacer una recompilación de Apache en caso de cambiar a una versión superior de PHP.mo..tribution in the fil~ LICBNSE.1. If you do not "g¡-tIe with the tl!'~ of thi. inatall"t1on p~oe •• s "t thi./configure --with-mysql=/usr/local/myaql \ '-________________ --with-apxs=/usr/local/apache/bin/apxs Si lodo ha ido bien.t abor~ th.3 Instalación de PHP en Linux Instalaremos PHP como módulo de Apache (OSO. Si disponemos de la distribución y el código fuente de Apache. you IIII. .. " Esle último comando hace efectiva la instalación en los directorios del sistema y se encarga de notificarle a Apache de que cargue PHP como módulo. point .. t1~. PITuLO 1. A la hora de configurar PHP. necesitaremos contar con el ser/pi apxs.. INSTALACIÓN 17 1. esta linea ya estart puesta en httpd. • di...CI RA·MA C. nos encontramos con que Apache ya está instalado y además no tenemos acceso al código fuente para poder recompilarlo. Dynamic SIUlred Objecl) porque tiene.. PllP Liceue. l $ .3. que suele venir con la distribución de Apache. ." '" .ing2'c"'~' ____________________-"________-"-"__" __________ Seguiremos con la compilación y la instalación: .0. Probablemente. Si. . Esto 10 hace añadiendo al fichero / usr / local / apache / conf/httpd. como hemos cumentado anteriormente. tenemos que incluir el soporte para MySQL.. $ cd /uar/local/install $ tar zxvf /usr/local/distrib/pOp-5.

tendríamos que añadir justO a continuación esta otra línea: IAddModule mod-php5.. . /di rectodo/dlle.ini-recommended lus r /local /lib/php .php '" · " " ' 7 '" . copiamos el fichero de configuración que viene como ejemplo con la distribución al directorio donde el intérprete de PHP espera encontrarlo: 1I cp php..IH PHP 5ATRAvt50EEJEMPLOS CRA·MA [LoadModule phpS~ule libexec/libphp5.ado.h-canfilJ-file-path. por omisi6n. Algunas de las directivas más imponames las describimos a continuaci6n: Directiva Valor Explicación register_9lobals display_err ors eafeJl\ode open_basedir on on on Crea automáticamente las variables Muestra los errores en el navegador (útil mientras depuramos un scrlpt) Modo seguro: s610 permite accesos a ficheros cuyo dueno sea el mismo que el del proceso Limita al directorio especificado las acciones sobre fICheros 11 Puede especificarse otra situación en el momento de hacer la configuración inicial con la opción --wi t. o en los directorios e: \WlNOOWS o e: \WI NNT.IH Si en este fichero estuviera la directiva ClearModuleList. sobre qué ficheros solicitados al servidor tendrá que pasarlos por el intérprete PHP. ' n "pc I. en Windows este fichero suele estar den la misma carpeta donde está la distribuci6n.c Por fin. Lo nonnal será que queramos que se haga par. según el caso. esto es.4 FICHERO DE CONFIGURACIÓN PHP.. J:NJ: El fichero de configuración. creamos un lipo MIME especial con la línea: IAddType application/x-httpd-php . se encuentra en el directorio /uer/local /lih en Unix6.l todos los ficheros con extensión php: por ello.60 l Queda indicarle nosotros mismos a Apache cuándo tiene que ejecutar PHP. Por su parte. ini 1.

comf . ya que nos instalan las tres aplicaciones (y aJgunas más como Perl.datacaptech.apachefriends. hemos descrito los procedimientos necesarios para la instalación manual de Apache. etc.en.) a partir de un solo ejecutable.comldownIQad. PHPMyAdmin.5 PAQUETES INTEGRADOS En los apartados anteriores.hlml • FoxServ: hup:llsourceforge.¡LO 1: INSTALAClÓN 19 Oirettiva max_executio~time Valor ExpUcación 30 Tiempo de ejecución máxima para un script (previene ataques de denegación de servicio o DoS) Memoria máxima asignada a un script (previene DoS) Servidor SMTP al que se te entregarán los mensajes que se deseen enviar (sólo Windows) Dirección de correo del remitente (sólo WindoWs) Memory_1 imi t SMTP aH sendmail from 1. Webalizer.sourceforee.wampseryer.orUenlxampp.coml • NuShpere: http://nusphere. PHP5 y MySQL. Algunos de estos paquetes son los siguientes: • Xampp: http://www.phpl • Winlamp: hup:llwww.appservnelwork.net/prQjecls{fo/S se rvl • Apache2Triad: http://apache2triad.php • AppServ: hup:llwww.ORA MA CAPf'n. existen kits de instalación automática que nos simplifican todas las laJ'cas anteriores. dada la aceptación y uso de estas aplicaciones. Sin embargo.com/wjnlamp. tanlo en Linux como en Windows.nctl • Wamp5: hnp://www.

OU'OS La simaxis de PHP es muy parecida a El vocabulario de PHP.1 FORMATO DEL CÓDIGO PHP A continuación vamos a ir introduciendo las bases sinláclicas de la progrumación en PHP. incluso. 2. Perlo. las características básicas de un lenguaje orientado a objetos. todos aquéllos que estén familiarizados con estos lenguajes cnconlmrán una gran facilidad a la hora de seguir la estructura sintáctica de las inslrUcciones y sentencias que presenta el lenguaje PHP. Además. pero sin las complejas reaJizaciones que acompañan a estos lenguajes como Java y C++. es fácil de comprender y nos da un amplio número de posibilidades. el lenguaje de script JavaScript. comentando sus aspeclos m:1s importantes y viendo aJgunos . Por tanto. PHP nos proporciona un conjunto de herramientas compactas propias que realzan las interacciones entre los usuarios y las páginas HTML. Nos permite la definición básica de clases. como veremos. Finalmente.• CAPÍTULO 2 FUNDAMENTOS DEL LENGUAJE PHP lenguajes de programación muy extendidos como son los lenguajes C. objetos y la utilización de la herencia. PHP ofrece. JAVA. permitiéndonos dar servicio a las peticiones más habituales de una fonna sencilla. antes no disponibles. relativamenle pequeño.

.1...:..:. . tal y como muestra el siguiente gráfico : ¡ .. sentencias e instrucciones que definen el lenguaje. estar lICtivada la directiva short_open.. ..' ..... menos utilizados que los anteriores.tao en -' fichefO de conllgutKlón php..ini _ . ':" ::... Las etiquetas más habilUales para delimitar los bloques de código PHP son las siguientes: <?p hp in s trucc i one s PHP ?> Existen otros posibles formatos de etiquetas.... _. si bien no todas estas opciones están disponibles en nuestro sistema por defecto.. interpretado correctamente en el servidor. genera una página HTML que será enviada al cliente.12 PIU" A TRAvlls DE EJEMPl. se utilizan etiquetas de comienzo y fina] del código PHP. correcta dependiendo de las caracterfsticas de configuración seleccionadas durante el proceso de instalación del intérprete de PHP: <? ins trucc iones PHP ?> NOTA 0._ .... tipos de dalos. Su utilización será.. 2..1 Delimitadores PHP está muy relacionado con el lenguaje de hipenextos HTML: tanto es asf..... Para diferenciar ambos lenguajes dentro del mismo documento.. que el código PHP aparece normalmente insertado dentro de un documento HTML. una vez.: . ....0..... El documento PHP.OS C RA-MA ejemplos que nos permitan entender la utilización de las estructuras.....

Además. por lo que no liene mucha importancia el poner una extensi ón u otra. ¡xxJemos in traducir el código PHP dentro del documento HTML haciendo uso de la etiqueta <script>.php) .1. .. . la ver.adal por ASP (Actrve SIINef Pages)_ El . dependiendo de dicha exlensión. deberemos indicar el lenguaje a utilizar: ..x indica código PH P (esta extensión será la que ulilicemos a la hora de guardar nuestros programas PHP) Utilizada para ver la sintaxis del código resaltado en colores Extensión en desu so .aporte para estas IltiqUlltas .2 Extensión de los flch eros en PHP La extensión de los fiche ros que se utilizan en PHP es muy importante. . 2.phps . el servidor Web utilizado decide si el documento solicitado debe ser procesado por el intérprete de PHP o no.C RA-MA CAPfTl!LO 2: FUNDAMENTOS DEL LENGUAJE PHP 23 <% instrucciones PHP %> NOTA.0 es compatible con PHP 4. PHP 3.php Código PHP 3.nadi6 . de PHP Finalmente.phtml En general. además. . ya que el intérprele las procesa casi de igual fonna .x Código PHP 4. Elle bpo de etlquetal Ion lel Llbllz.php4 . 1> por ser las más ampliamente utilizadas y no necesitar ninguna configuración por defecto. Debe _lar actiVada 11 directiVa aapt_taga IIn el fichero de conflgurKión php_ini. para ello.0.. ya que.l6n 3 O. las extensiones que indican al servidor HITP que el fichero contiene códigos PHP son las siguientes: . . .::script 14ngu4ge "" ~p instrucciones </script> En los ejemplos del Ubro utilizaremos las etiquetas <?php ...

_ •.... ... editaremos y guardaremos el siguiente código en un fichero llamado prueba ... por tanto.. ntr ••• </hU": • </crnto!r) </badll> (/ht ..) <t". _Le . ... -... que nos permite mostrar mformación en el cuerpo del documento HTML que seri interpretado por el navegador del cliente.. .···r· 1> <tphp echo "(h2>El RÓdul. Cada uno de los bloques de código PHP... .. justo en la posición en que dicho bloque está..phpl: (tltlll) <tlud) <tttlt)'rueb& PHP</tttlf) </IIUd) Ood~) (unt!!..."....... ·_..~ .. es decir.. Para ello.24 /'IIP S A TItA vts DE EJEMPLOS ORA-MA Ahora estamos en siruación de poder hacer nuestra primera página PHP y comprobar el correcto funcionamiento del intérprete. al ser procesado.!: Una vez interpretado correctamente por el procesador PHP el documento anterior. ..~ "'ooc...>I'<_ "<I"'''~ _u u· .t •• ...r.... <_ ..U " L ". el código que le llega al navegador y.. EIIII6dolo de PHP fllllcwnll QOrrectallltolec- - ~ ...._ _ . lo que éste visualiza es: ... _ ......... .. generará una salida en el documento HTML resullado. el código PHP también puede formar parte de un documento que no contenga ninguna etiqueta HTML..glf·· bOrdf...... src·"php.. .... '"._ ~ .. . De esta I En los ejemplos iniciales haremos USO de la función echo.u Como se puede observar en el ejemplo anterior el código PHP se ha1la inmerso dentro de un documento HTML que da formato a la página.. I Esto no tiene por qué ser siempre así... Habitualmente encontraremos código PHP insertado en cualquier parte del documento HTML y aparecerá tantas veces como sea necesario. <•• U.•.I.o dr PHP l'undollil CIII'"r'rct .

le comenzará a "traducir" el documento seleccionado. que lo analizará y ejecutará por ser código PHP. el intérprete lo entregará al servidor Web para que éste lo envíe al cliente. es decir. .gif border_O>".3 Comentarios Para introducir comentarios dentro del código. la idea a recordar es que el servidor Web (salvo casos muy concretos) siempre va a devolver código HTML al cliente. Cuando solicitamos una página.'. 1/ COIIIentado tipo • Comentario final tipo ahell de unix C. el código de abajo visualizará el mismo texto pero sin ningún fannato adicional: <?php 17. <?php " Comentario inicial·' echo 'Segundo t~po de comentarios'. devolviendo al servidor el texto que se encuentre tal y como está. /' /.•.. php.--_ _ _ _ _ _ _ _ _ _~C~A~P~Il1J~LO. leerá el documento. Por tanto. . C++.! : FUNDAMENTOS DEL. Shell). 2. Java. etc. Se puede usar el doble carácter " // " (utilizado en los lenguajes C. Las siguientes porciones de código nos muestran la utilizaci6n de estos diferentes tipos de comentarios: o( ' php ItCho // CObentario inicial 'Primer tipo de co_ntario.) o el carácter almohadilla uf" (Perl. C'omemtario tipo c. PHP ofrece la posibilidad de hacerlo de tres formas distinlaS que también son utilizadas en otros lenguajes.!. podemos extender nuestros comentarios a más de una línea de código.20. como se puede ver en el ejemplo. cxu:ptuando U aquél que se encuentre entre las etiquetas <?php y?>.~M~A.~C ~RA~ . es decir. el servidor invocará al intérprete PHP y 6. LENGUAJE PUf 2j forma. echo "<center><img src=php. también se puede utilizar paca realizar comentarios de una sola línea. eH '/ COlllentario Final ' / " Este segundo tipo de comentario es de tipo multilínea.. Javascript. <fh2></center>": En definitiva. Si alguna de las instrucciones PHP genera texto. nos permite comentar varias líneas de código fuente. si bien.1 . echo "<h2>El módulo de PHP funciona correctamente . c . " Este primer tipo de comentario s610 se puede utilizar paro comentar una única línea de código.

.> ...ING. sino elegir una sintaxis de las anteriormente citadas y utilizarla en lodo el documento. El siguiente código nos muestra la utilización de los diversos tipos de comentarios dentro de un documento PHP: .Sete c-ntario 88 usado para 1:'omprober . contiene otro comentario de tipo multilínea: . ya que no pueden anidarse. indicándonos la dirección del fichero denlro del servidor y la ünea donde se encuentra el error: la primera serie de cameleTes "*1' cierra la apertura del primer comentario de fonna que el intérprete de PHP intenta procesar la última línea de comentarios inlrOducida en el código y. 00 D 1 .. apcCIIIIJ . se nos presenta un mensaje de error en el cllplorador... ernr p_ errOl"..· . El siguiente ejemplo nos muestra cómo se interpretaría un código PHP en el que existe un comentario multilfnea que.~. que do. a su vez. No obstante.\Ap. Dentro del código PHP podremos usar indistintamente cualquier tipo de los tres para introducir comentarios. genera el error. . ac < H1IAO' . o 'm' PwI. no se pueden poner comentarios dentro de otros comentarios.in2"".1'... no es recomendable mezclar distintos tipos de comentario en un mismo archivo.s\c_IIIt.' 11 c:\Ardift~ •• . . al no reconocer la primera palabra. <)r • I " Tal y como muestra la imagen. También es importante tener en cuenta que este tipo de comentarios siempre tiene que cerrarse con la secuencia de caracteres ".. 11 P(l1I .. es decir. un Ar .u. multilLnea antdbdoa no pueden daree ya q.. '/ ~"tarlo..CM C. ~~dT_S'IlI..'« '.'ph....\Apadlal\atd. -h" ·COIMntario...26 PIIP j A TRA va DE EJEMPLOS Hay que tener cuidado con los comentarios de tipo rnultiHnea..

. "... s61 0 se muestra la infonnación impresa por la función echo y no el resto de comentarios incluidos en el código: I~ ~/11Z7QOll~pt. " Como podemos observar.ntario tipO IIhall <ICENTER> </BOOY> </HTKL . Comentario tipo C.. . _ C~tario Final <JH2> " * Con-.SU=' . "7>".4 Fin de linea PHP ignora cualquier carácter de espaciado presente en el código. aprovechando la etiqueta de cierre. LENGUAJE PIIP 27 <?php 11 Comentario inicial echo 'Primer tipo de cOIIIentarioa'. e . ". Comentario inicial " echo 'Segundo tipo de ca:nentari05'.. tabuladores y saltos de línea.. ' f Comentario Pinal <SR> <?php i Comentario inicial ecno 'Tercer tipo de eOll\entarioll'. excepto si se encuenlran dentro de una cadena de texto. pucsto que se .CRA-MA CAPtrul.. 11 COIDentario filltll 11 eoaantar10 tipo e. " . c·. '.O 2: I'UNDAMEl'ITQS DEl. incluyendo espacios en blanco. o bien.. .0> <?php '.1. <. Pdmer tipo de comentados Segundo tipo de comentarios Tercer tipo de comentarios 2. El fin de sentencia se marca en todas las mSlrucciones con el carácter de punto y coma.

. al definir O declarar una variable. "php . definición de constantes y tipo y uso de los operadores. En este apartado veremos en profundidad la sintaxis básica de PHP.2 SINTAXIS BÁSICA Para comenzar a programar en PHP. durante todo el programa. Además. caracteres . Por otra parte. .· "Finalizando con punto y coaa"/ 2.. a partir de ese instante.28 "IIP~ATRA~DEElEMPLOS ORA-MA asume que el final de la inclusión de código limita la introducción de nuevas inslrUcciones. 2. podremos recuperar su contenido simplemente referenciando la variable por su nombre. Por tanto. Conociendo esta posición de memoria (su dirección). A lIavés de las variables se pueden asignar nombres significati vos a las posiciones donde se almacena la ¡nronnación y poder hacer referencia a ellas de una fonna más sencilla...""" . es habi tual expresar la naruraleza del lipa de información que se va a g/wrdar. los códigos siguientes son correctos: . echo 'yjnaliaando con la etiqueta ~ho ~ cierr.. actualizar o recuperar información cuando la necesitemos dumnle el programa.1 Declaración de Variables En los lenguajes de programación.! su inicialización.1 Variables Una variable es el nombre que se le da a una posición de la memoria del ordenador en la cual se almacena información. 2.. somos capaces de encontrar.1. Las variables se crean en el instanle en que son utilizadas por primera ve7: par.2.2. no es necesario declarar las variables antes de su utilización. números decimales. se utiliza el operador de asignación (=). En el caso de PHP. las variables no tienen asociada la naturaleza del lipo . cualquier valor asignado a esa variable se espera que se:t del tipo de datos utilizado en su definición. es necesario conocer más detalles de su sintaxis como son: ti pos de variables que puede aceptar el lenguaje. provocando un error cuando se intenta asignar un lipo de datos diferente. La naturaleza de dicha infonnación puede ser de muy distintos lipos: números enreros.

serian variables distinlaS. la versión y su configuración.2 Nombrado de Variables En PHP todos los nombres de las variables van precedidos por el símbolo de dólar.. Indica el nombre del equipo servidor sobre el que se e'ecuta el ser . 2. por otra parte.3 Variables predefinidas PHP orrece una gran cantidad de variables predefinidas1 a cualquier script que se ejecute en su sistema. es decir.::3 válidus c. Indica el puerto del equipo servidor que usa el servidor Web la comunicación. por tanto. los identificadores Sn y $N son diferentes.. seguido. 2. . como el intérprete PHP distingue entre mayúsculas y minúsculas. en dos grandes grupos: por una parte. o de la A a la Z) o un guión bajo ("_") para. los nombres de variables con diferencias en mayúsculas o minúsculas en caracteres iguales componen nombres de variables distintas.. Estas variables guardan información relativa del enlomo de ejecución del intérprete y del propio PHP.2. por tanto. después. entre otras cuestiones.1.2.acar que. una variable podrá almacenar durante todo su tiempo de vida direrentes tipos de informaciones.. continuar por cualquier combinación de letras (en mayúsculas o minúsculas). le pasa al intérprete de PHP y. La siguiente tabla muestra algunos ejemplos de identificadorc. Dependen de factores como el lipo de servidor en el que se ejecuta el intérprete de PHP. de dígitos (del O al 9) y de guiones bajos ("_").. S l Para ver una liSia de lodas las variables predelinidas se puede usar la función phpin fo ( l. De hecho. las que el entorno.illble SERVE~NAME SERVE~PORT ¡tic.: inválidos: Válidos $Valor actual $NumeroDeOatos Inválidos SValor actual SIIOatos S2Saldos SPrueba. valor Motivo Contiene un espacio Contiene el carácter no válido ''#'' Empieza por número Contiene el carácter noválido .~RA·MA CAPtruLO 2: FUNDAMENTOS DEL LENGUAJE PIIP 29 de inrormación que almacenan (este tipo de lenguajes se denominan débilmente tipodos).. La siguiente tabla muestra alguna de las variables del enlomo más utitizadas: V.... el servidor Web. por una letra (de la Q a la 7. cabe dest. $N $n Finalmente. al menos. las que el intérprete pone a disposición del programador.1. S. Estas variables se pueden clasificar.

en cuyo caso no est.-SOF'IWARE I equipo selVidor.30 P~l P 5 A TRA V~ DE EJEMPLOS ORA·MA ulC:.Iz del documento bajo el que se : eiecuta el serio/. para las que nO importa si PHP se está ejecutando como un módulo del servidor o con un intérprete COI.nn'l disponible. argc Indica el número de argumentos que se pasan al seripl. Contiene la dirección remota desde la que se realiza REMOTE.ble argv I Variable] Sigdlficado array con)os argwnentos que se pasan al script.ri. HTTP_COOKIES_VARS HTTP_GET_VARS HTTP_POST_VARS HTTP_ENV_VARS _COOKIES _GET _POST array asociativo con las variables pasadas a través de cookies. ) Introducidas a partir de la versión 4.0.J. salvo que se ejecute PI-IP PHP_SELF como intérprete de la linea de comandos. La mayoría es proporcionada por el intérprete de comandos en el que se está ejecutando PHP. La siguiente tabla muestra algunas de las variables que el PHP ofrece al programador para facilitar su tarea: V.ENV el entomo. ocx:tJMENT_ROOT Indica el directorio ra. Contiene la dirección de la página (en caso de HTTP_REFERER haberla) desde la que el navegador saltó a la pAgina actual.ble S' Estas variables se importan en el espacio de nombres global de PHP desde el entorno en el que se esté ejecutando el intérprete PHP. Contiene el puerto que utiliza el peticionario para REMOTE_PORT comunicarse con el servidor Web. array asociativo con las variables pasadas a través del método GET.do Indica q~ software estA siendo utilizado en el SERVER. array asociativo con las variables pasadas desde .1.DDR la oetici6n. array asociativo con las variables pasadas a través del método POST. V ri. Indica el nombre del fichero que contiene el script en ejecución. . Otras variables de entorno son las de COI.

float' y string.0. Un número eOlero en formato decimal puede incluir cualquier secuencia de dígitos que no comience por O (cero).ORA-MA CAPtruW 2: FUNDAMENTOS DEL LENGUAJE PHP 31 Variable VariableJ SignirKado H'M'P_SERVEFLVARS HTTP_SESSION_VARS HTTP_POST_FILES _SERVER orray asociativo con las variables pasadas desde el servidor. _FILES orroy asociativo con información relativa a los ficheros recibidos a través del método POST. 2. OClal (base 8) o hexadecimal (base 16). 2. hay que poner Ox (o ox) delanle del enlero. .2. He aquC algunos ejemplos: Formato Decimal Octal Ilexadecimal Valore! -33 2139 071 03664 Ox7b8 Ox395 El sigujente código nos muestra la asignación de valores de tipo entero a una variable en los diferentes formatos numéricos que PHP puede manejar para este tipo oe dalOS: ~ Sustituya a double desde la versión 4.2. Para designar a un hexadecimal. Los enteros hexadecimales incluyen dCgitos del O al 9. Además. tipos de datos simples: integer. Los enteros se pueden representar en formato decimal (base 10). aunque no aparece definido como tal en la sintaxis del lenguaje. y dos lipos de datos compuestos: array y object.2.2 Tipos de datos PHP soporta treo. junto con letras desde la a (o A) hasla la f (o F). Los números enteros en formato octal comienzan por un cero y pueden incluir cualquier secuencia de dígi tos entre el O y el 7.1 Enteros Las variables de tipo in teger pueden contener números enteros que varían entre un rango de ·2 billones y +2 billones. y se pueden especificar usando diFerentes sintaxis. _SESSION orray asociativo con las variables de sesión.2. hace uso de un tipo lógico o boolean.

)2

PIIP S A TRAVÉS DE EJEMPLOS

ORA-MA

'1!TKl.>

'!WoD'

<TITLB>Variables

&nt.r.8<'TI~~E~

</HZAO"

"BODY>
<CEmER>

cH2>Pormatos de los

n~ero.

Enteroa"'H2>
CELLSPAClNO.·2·~

<TABLE BORDER.'l" CELLPADDIIG.'2" <TR ALIGN.·ri~ht· ..
<1'0> <?php
$n\DII •

<TC eocOLOR_'yellOlll'>Decl.lNIl PoaluV'O"/TO>

,.
</'f'R>

502; echo $rtua\:

l/nUmero dec~l Jlmostra.QS el valor

</TD>

<TR

ALIGN~'rlg~t'"

<TD aGCOLOR.·yellQW·>oecl~l Negativa</TO> ,TD.
<1php

,.
</VI>

$n\llll •

-502:

Iln~ero

echo $nUlZ\;

decimal negativo l/mostramos el valor de $num

</TO>
~TR ALlaN~'ri9ht'"

<TO BOOOLOR.·yellow">Decimal OCtal <TD.
<?php

(05021</~

,.
</T'R>

SnUlll • (lS02; .cM SnUII:

'/nÚ/:Dero ocul

IIl11Olt:r4ll108 el valor de $ftu:.

<!TO>

<TR AL!GNz'righc'" <TO 8OCOLOR_'yellow">o.et-al <TI»
"php

H$Xa4ecl~l

(Cx12)<J~

,.
</TASLE> </CEN'l'ER> </BODY" cIH't'ML ...

$nwn.Ox12¡

'/mlll\el"o hex4deeUllo11

echo $nWllj

1I1105tnunoll el valor

~

$nua

CiTO:> <ITR>

Como podemos observar en la siguiente imagen, la función echo muestra por defecto siempre la infannación en decimal. a pesar de que internamente ésta se haya almacenado en la variable con un (onnato distinto. Ya veremos más adelante diferentes funciones PHP que nos penniten fannatear la infannación a visualizar.

G RAMA

CAPITuLO 2: FU!'I.'DAMENTOS oa UiNGUAJE PIIP 33

,

• , al! " . " , 'm . .

==!!'" ::.

._18

'o

Formatos de los números Enteros
r .RIII ~ , ..... r'.... ""..,.•. ~ DoarIIIOaoI ~- m
....UI.,..-..IOII..,

2.2.2.2 Números en coma flotante
Con las variables de tipo float representamos números en coma flotante o. lo que es igual, números con valores decimales. Son. por tanto. números decimales con parte fraccionaria que se pueden expresar en forma estándar o con notación científica. En notación científica se utiliza la letra E o e pam designar el exponente. Ambos. el número decimal y el exponente. pueden ser positivos o negativos, como se muestra en los ejemplos siguientes :

3405.673

-1.958
8.3200e+11

8.3200e11

El siguiente código nos muestra la asignación de valores de lipo double a una variable en los diferentes formatos numéricos que PHP puede manejar para este ti po de datos:
~HTML·

"HEAO)o
"T I TLE>V~riablee

en

Co~ Plot~nte"/TITLE~

oc IIIEAD~ oc"lODY"
",CEN'TER>

de loa números en COMa flotant~IH2> cTABLe BORDElt-"!" CELLPAOOlnG'" 2' CELt.SPI\CING.-'·:>
~H2>Fo~toa

<TI

ALIGN,,·riqht·~ BGCOLOR~·ye!low·>EstAndar""TO ..

.TU

<1'0> «?php

Snum • 2.589; ,/formato eetAndac
echo $nUIII¡

J.4

PUP ~ A TRA vts DE EJEMPI..OS

C RA-MA

,.
ciTO>
</'l"R>

<TR

ALtCN~'~ight'~

<TU SGOOLOR·oY911ow·>Cientifieo <.o.
<?php

(1.S.2)c/~~

$num. 1.5.2- IIfoI1f\B.to cientlt1eo

,.
<I1'ABLE>
"/CI!Nr~>

eeho $nUlll¡

"'/TI» </TR>

c/BODY>

</HTI1.L>

Como podemos observar de nuevo en la siguiente imagen, la función echo mueSlr.l por defecto siempre la información en decimal. a pesar de que intemamenle
ésta se haya almacenado en la variable con un formato distinto:

.~*!'~!6~tn~,qZiI9=,li~3,=¡! = ! ?li¡jffl=ffll!i:l!i••:~i!liI!l!ZtllD!em'~H~t~:;C::=i,li~:tt~ i'~iD"I'['~';";'.'.'••__
... D~ ¡:dila-

"'o.;-

Ir frelendot !.lli!Mlas MozAe ~

1.. ""'1n2700I,c1 ,

.....

==..JgJ2!I

Formatos de los números en coma flotante
Crentifico (15e2)'

150

2,2,2,3 Cadenas
Con el tipo string representamos cadenas de caracteres. Una cadena está formada por cero o más caracteres encerrados entre dobles comillas (") o entre
comillas simples Siempre se debe utilizar el mismo tipo de comilla para rCKIear cada cadena. Los sigu.ientes son ejemplos de cadenas:

n.

ORA-MA

eAPtruLO 2: FUNDAMRNlOS DEL LENGUAJE

PHP

3!i

".

eIdenas
aludos·

's aludos'

" 112-6" -¡Sonrie por favor '"
'incluye "dobles" comillas' "incluye \ "dobles'" comillas·

Como ocurre en el penúlti mo ejemplo. en algunos casos se puede entremezclar el uso de los dos tipos de entrecomillado. principalmente para insertar una cadena literal dentro de OlIa. El úl timo ejemplo hace uso del carácter "\" para poder inlIoducir comi llas dobles den tro de un texto entrecom illado con comillas dobles a su vez. Los dos últimos ejempl os serían totalmente compatibles. Cuando utilizamos comi llas d obles, podemos incluir dentro de la cadena nombres de variables que serán evaluados (sustituidos por sus respectivos valores) a la hora de mostrar la infonnación. Si introducimos nombres de variables dentro de una cadena encerrada enlIe comillas simples, la variable no será evaluada. El siguiente ejemplo muestra la asignació n de cadenas de caracteres a variables y su funcionamiento diferenciado según el ti po de comillas utilizado:
~Fn'ML>

<HUI»
<TITL!>Va~lable.

con Cadena"

~

c

<IHEAD> <BOOY> cCEN'I'ER>

<K2>Trabajanóo con Cadenas de < <?php $leaquaje.·PKP"¡ $ve-r.. ·v4°¡ echo "<8>Estamoa 'trabajando' con $l~aje (.ver) cIB><BR><BR>"; ~ho 'La va~lable $lenouaje c ontiane, '¡ ~ho S~an'ilUaje ¡ echo 'cBR>" ¡ echo 'La variable $veT contle na, '¡ echo $ver; </CENTKR> </BODY"</JrrKL:>

,.

La siguiente imagen muestra el resultado de visualizar el código anterior:

r


36 PIIPSA1'RAVaOEEJEMPLOS

Trabajaodo con Cadenas de caracteres

rs- """'........ l'HPtM)

Las cadenas de caracteres. además de texto normal y variables, pueden contener caracteres especiales como la tabulación o el relorno de carro que tienen funcionalidades incorporadas. La siguiente tabla nos mueSlJ'a los más utilizados:
Códl,,-o de clieaoe lb
\f

SIi!nlfludo
esoacio hacia atrés backl'l](Jce\ -

In Ir It
\\

cambio de oág:ina orm ee cambio de linea line ce retomo de carro lcarrio e return
tabulación barra inversa (bacltslash comilla simule comilla doble carácter $

l '

1" 1$

Al ¡gua] que ocurre con las variables, si la cadena que contiene los caracteres especiales utiliza comillas simples, ~IOS no se evaluarán y simplemenle se mostrarán. El siguiente ejemplo muestra la utilización de este tipo de caracteres para mostrar el mismo resultado que el ejemplo anterior:
<TITLE>Variablea con Cadenas de caractere8</TITLB~ </H&AD> <OOOY> <Cfo:N'rl':lb <Hl~Trabajando con Cadenas de caraccer8s</H2> <?php $lenquaj.""PHP", $ver."v4"; echo "<8~J:scamoll "trabajando\" con $lttDgUaje I$vert </~"'B¡t~,,,nR.>·; echo "w wlr18ble \$lenquaje c~nthme, $lenquaje <lIR~"; ~,bo "La variable \$ver contiene! Sver":
< / CI!N'rER> <'1JOO'1>

</ 1tnII.>

ORA·MA

CAPtruLO 2: "lJNOAME/'IJ'OS DEL lENQUAJE PHP 37

Dada In importancia de las cadenas en la programación en PHP, veremos con más detalle estas variables en un capítulo posterior.

2.2.2.4 Al78ys
Los armys o matrices son estrucruras que permiten el almacenamiento de un conjunto de datos bajo un mismo nombre; son una construcción lradicional de los lenguajes de programación. Podemos definir un array o matriz como un conjunto ordenado de elementos identificados por un índice (la posición del elemento dentro de esta colección ordenada), de modo que en cada posición marcada por un índice el array contiene un valor. Se pueden construir tanlOS índices como se quiera. aunque el uso habitual de los arrays es en forma de matriz unidimensional. La longitud del array se modifica de forma dinámica siempre que le :ti1adimos un nuevo elemento. En el caso de PHP. los arrays pueden estar compuestos de elementos de diferente naturaleza y su primer índice o posición es la O. Además. existen unos arrays especiales en PHP denominados asociativos en los que el fndice es un valor de lipo string. de modo que cada posición está definida por el par (clave, valor). pudiendo acceder al contenido (valor) a través de la clave. La siguiente imagen nos mueslJ'a dos posibles estructuras de arrays como un conjunto de elementos cada uno de los cuales tiene asociada una posición o una clave:

Couoar

PorCl

:1.500
2
3

V6

lB2
5

o
COU04r
I1'IOdel o

1
PorCl


V'
moto r

2.500

182
potencia

!!larc a

fecha

ce

Podemos observar que en ambos {Irrays los índices son de diferente naturalcw y que pueden existir posiciones o claves sin contenido asociado. Para manejar el array de fonnn global. utilizamos el nombre asignado a la variable que lo conúene y. paro manejar cada uno de sus elementos, tendremos que hacer referencia a su posición o clave dentro del conjunto global. A modo de introducción y para familiarizamos con su uso, vamos a ver un ejemplo en el que se muestra cómo definir y manejar los arrays de la foona más sencilla. Si bien. dada la imponancia que estos componentes tienen en la programación con PHP. los veremos en detalle más adelante.

·

38 PII P!iATRAvEsDEEJEMPLOS CRA-MA
<tfrnlL,.

......""

<tTITLB>Variablea con

aat~ic@a./TITLE>

</MEAD>cBODY'>

<CDlI'ERl>

<tKl>TTabajando con matrices o
<?I'hp

<I>arr4y9</J></H2~

$matrlzl[OJ_'cougar';
Saatrizllllz'ford'; 1I la tercera posición del array .sta vacía 1I por eso le aaignano. una caa.na .in eontenido

.,IIt.rizl ¡:l1-"

¡

SmatrJzlfll··~.SOO·:

$matrizl[4j-'V6'¡
1I para adadir el último el~ento a uno ~triz

11 no .s necesario poner el número de 1ndie. $matr1z1 [¡ .. 1a2;
1/ creamos la ~triz aSociativa $matri2;2 ¡ 'lIlOd.elo' ]_. couqar' ¡ $maCJ;"iz2 f •_rea' J ... ford.· I 1/ para marca una posición sin coneenido
11

~i'n

8e puede utilizar <null,.

$matriz2 ( 'fecha' ¡_null;
$matriz21·cc'I··2.~OO·1

$matriz2! 'motor') .. ·V6';

,. $matriz21 'potencia' ¡-lB2r
<TABI...E BORDElh"!' CELLPADDING='2' C!U.1.SPACn«l .. ·~'"

<TR

ALIGN~'center'

BOOOLOR-"yellow":>

<'t'tI> < ITD>

<TD:>Kodele</TO> <'rD>Marc8</TD» <TD:>FecM</TD:>
<Tt!>CC< 170>

<TC:l>Metor</TO:>
<~Potencia</TD>

</TR> cTR ALIGNz'center":>

<TO BGCOLORz'yellow':>-atrl~l</TO> c?php echo "<TD> S~tri~l[OI cITO:>': eche '<TO> $rnatd~l flJ </'1'0:>'; echo "<TO:> $matri~1[21 </TD>'¡ ~ho "<TO» Smatrhl [3] </TO:>': ~ho '<TD:> Smatri'¡1[4] </TO>': eoho '<TD:> $matri21 15] </TO:>'/
<ITA.:>

<TR ALl~"center"» <TO BGCOLORw'yellow':>matri:2<1Tn> <?php Kho '<TD:>' " $matri;oll2['IIIOd.lo"J Kho "<'lO>' " $matr.l.z;U "_re.'J "'c/TO:>', ~ho 'cTC»' , $lUtrh2(' fecb.a' J "'</~O>'" ~ho '<ro:>' , SlIolIItciz2!'cc'j ,'</""."/ ~ho '<TO:> , " $lIIlItdz2['l!IOtor'] '</'I'tl:>" ooha '<'t'D>-" " $1IItItriz2¡'potenc:ia '1 ,'cITO>";

"

'<,,,0>',

O RA-MA CAJ>fnJLO 2: fUNDAMENTOS DEL LENGUAJE PHP 39

-

,>
</TR:» <JTABLB> <¡CErnER> ,,/B(lDY> </H'I1fi.>

El resultado se mueSlm en la siguiente rigur.!:

2.2.2.5 Objetos
Si se tiene un conocimiento de la programución orientada a objetos. se entenderá mejor el concepto de objeto; no obstante. a modo de introducción. diremos que un objeto es una estructUrJ que malllienc en si misma tanlo sus características básicas (denominadas propiedades), como las posibles funcionalidades que admite (denominadas mltodos). En capítulos posteriores veremos con más detalle este lipo de datos, asf como la fanna en que se declaran, crean y utilizan dentro de PHP.

2.2.2.6 Conversión de tipos
Como antes comentamos, PHP es un lenguaje débilmente (ipado, es decir, puede contener distimos lipos o valores a lo largo de su vida. Por tanto, en PHP el tipo de una variable se determina por el contexto. Así, una variable a la que se le asigna un valor entero será de lipo integer; si. seguidamente, sobre esa misma variable se le asigna una cadena de caracleres, la variable en cuestión pasará a ser de tipo l·/ring. Además. cuando operamos con variables de distinto tipo. el intérprete de PHP tiende a homogeneizar sus diferentes tipos en función de la operación que se pretende realizar y de los operandos que fonnan parte de ella.
Un caso muy claro es el que se produce con el operador suma "+". Veámoslo con un ejemplo:

4{)

PIIP ~ A TRAVI!S DE EJEMPLOS

C RA-MA

. •"""',

I ;;Á~
<T1~>Co~r.J6n
</KEAD~

aut0m4tica d.

tipo&</TITL~

<OOOY>
<CBNT!It>

<H2>CQnvereión de
<?php
Sn~ro-l\l,

ti~

autoaática<fH2>

SC:ldenal."21" ;
$cadana2."23abc"¡ Scadlna)·"2211.S";
$.uma.$n~ro .. Sc.den.l ¡ echo "Zl ra.ultado de aamar $mUlero y . $caden.tl , .e:

'.uma.$nu~ro'$c.dene2;

echo "El resultado de eamar $numero y , $cedena.l SauN <BR>"¡ $auma_$num9ro+$c:adena3¡ echo "El resultado de sumar $nUltlero y '$cedlCle3 ' ea: hUIIIa ",SR>",
$a~_$cadenalt$c:adena2;

."

$.."

~8R>';

echo "El resultado de sumar '$cadenal' y ' eC4dene2 ' .a: $lIuma <SR>" ; $sumo-$cadenal +$c:adena]¡ echo "El resultado de sumar '$ceo;1en41' y . $ca"-ena3 ' 'SR>' ¡
1>

,.-

<ICEm'ER> </800'1>
</H1'Ml..>

El intérprete intenlará convertir las cadenas en valores numéricos para que éstos se puedan sumar correctamente (una cadena que no pueda convertirse a un valor numérico es evaluada con el valor O para poder operar aritméticamente con ella). El resultado que obtenemos lo podemos ver en la siguiente imagen:

,-...

_ _....-

. ..... ..
~_

_.-

....

g

Conversión de tipos Ilutomatica
lllre~.

_1,,'21'.1 010

El rtlU\wlo <le ....... IP, 'Z3lb,' ~I .2
El nlllhd.o de lUmW 19 ,'ZI11 ,. el ~ ~ El ruultado de ........ '¡¡o r '23.b.' U ". El rc.\IlIadG do .".,. '21' Y'2211 ~'U 2232 ,

Además de la conversión automática realizada por el intérprete de PHP, es posible convertir las variables de un [ipo a otro cuando el programador lo desee. Se trota de obligar a que una variable sea evaluada con un tipo concreto, Es similar al conversión de tipos que se da en el lenguaje e )' que se denomina comúnmente como castillg. Paro. ello se escribe entre paréntesis el tipo deseado (integer, fl oat. 6tri ng, boo lean, array, objec t) antes de la variable a la que se pretende convertir. En el siguiente ejemplo se ven algunas conversiones de tipos:

O RA ·MA CAPtruL02FUNDAMENTOSDEl.LENGUAJE PHP 41

-

."""', <HnD:o
<TtTLE~CD8ting

6. tiP08<fTITLE:o

oI/HtAO>
<BODY~

<CENTER>
<H2~onver8i6n

de tipos por

<I~castinQ</t></H2>

<?php

$C/lidena",-J.1411S . s . l valor- de P.\.-: echo 'El valor de \Seaden/li ea: <8' ScadcAa oI'B><BR><Ba~-, $aux_¡inteQerJ$caden""l echo "El r.aultado de convertLrla en enterl) •• 1 SBUX <8R>";
$aux~ldoublel$cadena;

echo "El reaultado (le convertirla erl ClotIle ea: SaWl oIQ>-;
c / CEN'TER>
</80tlY~

"

</Ht14L>

Como podemos observar en la siguiente imagen, el casting de la cadena inicial a entero nos devuelve un valor de tipo integer en un caso y de tipo float en el OlrO. De igual forma, podríamos haber convenido la cadena inicial en cualquiera de los restantes tipos con los que uabaja PHP.

B, __

Q

Conversión de tipos por cartlng

El TellUbdo de ~-arta l1li cata'o" 3 El rel\lltado de ,OtrteI1Irla 1:11 dobIt el 3 1" t6

Como podremos ver en el siguiente epfgrafe. ex.islen además un conjunto de funciones que permiten al programador modificar el tipo de las variables con las que trabaja siempre que lo desee.

2.2.3 Otros componentes asociados a las variables
2.2.3.1 Variables de variables
Consiste en reutilizar el valor de las variables como nombre de otra variable al mismo tiempo. Las variables de variables se pueden establecer y usar

42 PUP.5 A TRA vts DI! EJEMPLOS
ORA-MA

dinámicamente: de hecho, habitualmente se utilizan en scripts en los que se genera código de fonna dinámica. El siguiente ejemplo rnucstnl. la utilizaci6n de este tipo de variables:
,HTw.. <MEAD>
<T~-E>V.ri.ble.

de

V.Tiabl~s<ITITLg>

oCIHMD>

,,801)'1>
cCENT!R>

<H2>Vari.bl •• de variables</H2>
c?php

Scaden•• 'modelo'¡
seho 'El
va~,or

de \Sca4ena

8a, <B> Scadell&.

</B"~8R .. ·;

echo 'Después de ils;i.gna:r a SScadena 'Couoar' _ .. <8ib<nn>';
$Sc.d.na~·Coug.r·1

echo 'El valor de \$\Scaden4 es, SScadena <SR>',

,>
</Knn.>

echo 'El valor de \$mOdelo

es, SlllOdelo <SR>',

c/CiN'tD>

c/BOIJY,.

La siguiente imagen muestra el resultado de visualizar el ejemplo anterior:

... OCJS¡Ulllrllo

¡cb'

1ro4~.

Ir 8'efendot Utierí". I!!OZIII
• • • "LS__

~

1 '- ~Hl 270o.lI"'.I_dlC l
4

Variables de variables
De,p~s

El. valor de teadena es. modelo de asignar a $Seadens 'Cou¡ar"

El valor de S$cadena el_ Smodelo Fl valor de $modelo es Cougar

array. pudiendo devolver como valor: integer. echo 'Si lo paso a entero obtengo ¡ $cadena <SR>': <ICEN'I'ER> </BODY></H'l'H!. echo "Si lo paso a dobla obtengo I $cadena <SR>'. object y unknown type. <HEAD> cTIT~E>Funeiooe~ para V&riables</TITLB> </HEAD> dIODY> cCENTElb <H~>U8ando gettyPe() y aettype(J </H2> <?php $cadenaw·]. Estas funciones son: a gettype (variable): Devuelve el tipo de dato pasado como parámetro. eeho 'El valor de \$eadene es."<BR><BR>'."". "double').2. <B> Seadena </8><BR>"z echo 'EQ óe tipo ·.> " El resultado obtenido se puede ver en la siguiente imagen: . Con esta función podemos. Tiene dos argumentos: el nombre de la variable y el tipo que se quiere establecer. oettype($cadena.3. realizar conversiones de un tipo de datos a otro. Devolverá valor true si ha tenido éxito.gettype($ca~ena) . class.2 Funciones para variables PHP proporciona un conjunto de funciones de gmn utilidad a la hom de tratar con las variables. 'inteqer'). aettypel$eadena. devolverá falseo El siguiente ejemplo muestra la utilización de ambas funciones: <". LENGUAJE PHP 43 2. o settype (variable.. float. pues. string.CI RA·MA CAPfTuLO 2: FUNDAMENTOS nEl. en caso contrario.1C16 es el valor de PI'. tipo): Establece el tipo de dato a guardar en una variable.

Ir ~ I/l10<'' aIo* "-' ! ~ "-'11111"1:. o bien.1416 ..r abl ••</TtTLE> c/HE. PI &de"PO'" ) Sdop_adoblitot.stá vacía' echo '<BR><BR>"¡ $cadanll"" • ¡ $ead~na¡ echo echo .tl).to ) ¡.o • _ _ """'-" o isset lvariable): Indica si una variable ha sido inicializada con un valor.dena 11'1" está "inicial1zad4<BR>".~ . .. o 3.. _ _ _ echo li ••• tj$cadene. en caso contrario. devuelve falseo o unset (variable): Destruye una variable liberando los recursos dedicados a dicha variable. ..c.. el valor 6e PI". .' .'no .. . .I..tL' s lo .))1·.aeAo '.1.ienle ejemplo nos muestra la utilización de las funciones anteriores: cT1TLE>Punc Qnea para V.stá .44 PIIP S A TRAVts DE EJEMPLOS ORA-MA • ~ ~ "". 'no •• tá ' (ampey($cadenal )?'$cadena eaeá vac'a $cadanal $cadenaa·).. echo '$cedene '. Es necesario indicar como parámetro el nombre de la variable a destruir..:. . devuelve falseo o El sigu. tiene un valor igual a O o es una cadena vada y.'00 I Usando gettype() y seUYI)eO B.ena '. '<BR>~BR>'.O> <800'1> <H2>Usando isa. echo liuet(Scodano))?'e8eá "'no •• tá '1 echo 'inicializa~~eR>'¡ echo (empty($clldena))?'Scadena ... unaetl) y (?php empty()cJR2~ e<::ho '$ca<!l. en cuyo caso devuelve true y. empty (variable): Devuelve valor true si la variable aún no ha sido inicializada. en caso contrario.t1'...cho echo echo • $c4deml " (iasae ISca.

ti v. en caso contrario. devuelve falseo CJ o . is_real (variable).'no •• echo 'inic141i~da<aR>'1 eebo C~ty($cadena)J1'Sc. "'... expIicII posteJiormente en el apartado da radares. is_long (variable): Estas funciones devuelven true si la variable pasada como argumento es de tipo integer... . . . . is_inceger (variable).W . en caso conlrario. ia_double (variable): Estas runciones devuelven true si la variable pasada como argumento es de tipo float. UDSI. El resul tado de visualizar el ejemplo anterior se muestra en la siguiente imagen: UiYDdo tuelo. '. LENGUAJE PHP 45 - eene 'InlcLelisaÓ&<BR>'./80DY> < iH'I'ML> " NOTA: En esla ajemplo se hace uso del ope. devuelven falseo is_float (variable).. . "EN'tER> ".. devuelven false. o is_int (variable). ----------------------------------------echo C-*ptyC$cadenall?'$cadena .c .Jt. echo '$cadena '.'tQ y t tnply() l:NoM _ _ ~ "I. . echo '''Slb<8!t>· J II.Lq : ---.clof condldonsl qua . .cLl'I$cadena.nsetC$clldenal. 71 . .dena •• ta vacia' l$cadenef t' t' '. echo (issetCScadena)j?' . is_nurneric (variable ): Esta función devuelve true si la variable pasada como argumenlo es un número o una cadena numérica: en caso contrario.ORA-MA CAPiTULO 2: FUNDAMENTOS DEL.

. las variable. devuelve false.$c:adentl.bl. devuelve false.s pa~s Va~iabl~._float($cadena))?'es':' no es' ¡ echo ' d. </HTKI. El siguiente ejemplo muestra la utilización de algunas de las funciones anteriores: "HTML> <'EA!» <TITLl>rune1o~.. echo ' de tipo entero <SR>'.tring(Scadena))'1'ea'.~/H2> t~'. o is_array (variable): Esta función devuelve true si la variable pasada como argumento es de tipo array: en caso contrario. $cadena cOD. devuelve false.tiene <8>' .46 PIIP 5 A TRAVIts DE EJEMPLOS CRA-MA e is_bool (variable): Esta función devuelve true si la variable pasada como argumento es de tipo lógico: en caso contrario. o is_string (variable): Esta función devuelve true si la variable pasada como. e is_obj ect (variable): Esta runción devuelve true si la variable pasada como argumento es de tipo objecc: en caso conlrario... echo 't. echo 'La variabla $esdens '¡ scho (i.o variable $eadens ': echo ¡il_integerC$caden... <C"""'.))?'ea' " no es'. <H2>Compfobando el tipa de " $eaden•• -tlola a . argumento es de tipo slring. <!IOOY.> echo 'La variable $esdena ': echo (is_... en caso contrario..e tipo real <SR>' ¡ 'c/B><BR~8R:>': . devuelve false."{TtTLB~ <..". echo 'La varl.' no ea': eeho una cadena de caracteres "SR>' I <fCENTER~ </80DY> NOTA: En este etamplo se hace uso del oparadOf condicional qua se explica poatSfiom1enle en el apartado de opetadores El resultado de visuaJizar el ejemplo anterior se muestra en la siguiente Imagen: .

de modo que convierten a integer.. En particular.t.' 38E6'. strval(variable): Estas funciones sirven para realiz..r•• e intval(variable. Sau~=intval(ScAdena) .nt~o hexadacimal: $aux <BR>'.> .~RA-MA - CAPITuLO 2.. FUNDAMEmoS DEL LENGUAJE PHP 47 Comprobando el Upo de las Vlri~ble5 1.HT!Il..ct.. echo 'El resultado de convertirla en ~loat a. echo 'El ~esultado de convertirll en entero octall SIUX <SR>'. . float o string. tomando por defecto la base 10 de los números decimales.val($cadena) . Icho 'El resultado de convertirla en entero all $a~ <SR>'¡ $sux_!ntvAl($cadena...¡ ?> <ICDl'rBlb </8001'> """..0 ___ " ... 8-octal y I (j.. _ 1."-_ el ." ...base). 16) I echo 'El resultado de convert~rla en . el valor de la variable que se le pasa como parámetro.: $aux <8R>'. echo 'El valor de \Scadena e8... <.. .0 . <8> Scadena </B><8R><BR>'..B)... la función intval () puede recibir además un segundo parámetro que representa la base a utilizar en la conversión (1 O-decimal.AO> <BODY> <CDltJtJt> ~H2>Conver. ~bu~~flo. hexadecimal). El siguiente ejemplo muestra la utilización de estas funciones: . ... floatval (variable) ... ... Seux_etrval($cadena) : echo 'El resultado de cQDvertirla en cadena 8a... $au~ttntval [$cadena.. respectivamente.... ScMo.-.. $aux <8R~.ar conversiones de tipos (casting).. Estas funciones no pueden utilizarse para convertir arraYl' u objetos.0."""" ~fTLI>C•• tlnq de tipos<fTrTLE> <flO. tul 1..iÓn ~e variables<IH2> <"''I'b¡) Scadena. .

.4 Constantes Una constante es una variable que mantiene el mismo valor durante toda la ejecución del programa.... habrá que volver a utilizar la función define ( )..... por tanto. e--~ _ ""'" 1. .. '... t.-... en caso contrario. cIoc~ .""'-Io de ~ . PHP nos proporciona las siguientes funciones: a define (constante. existe. devuelve falseo Para hacer referencia a las constantes.. aRto OCIIII 1 El "' . no es necesario anteponer el carácter $ al nombre.."" "" .. . Se puede asegurar que la constante mantiene siempre el mismo valor: en ninguna parte del scripr se puede cambiar el valor de una constante una vez que se define. _ . Bastará con hacer referencia a ellas con el nombre con el que se definieron... valor): Esta función nos pennite crear una constante asignándole su nombre y su valor a través de los parámetros que re<:ibe.nwIa .o.." 38000000 El.48 PIIP.... 1 Funciones para constantes Para trabajar con constantes......5 A TRAVt.o1 COD\usión de variables EI ... .s DE EJEMPLOS CRA·MA El resultado se puede ver en la siguiente imagen: ~ .. NI...2....2..4.IWUI_. _ .. o defined(constante): Esta función devuelve true si la constante pasada corno argumento está definida y... ...... los intentos de cambio provocan errores.no oc""" hoxIdec""'¡ 14'" E1 . _ ...... De hecho....... Veamos un ejemplo del uso de las variables: . 2.._lO _ . _ I I 3 I D . ya que no se U'ata de una variable....adoclo<~ocadona •• lIil!6 2.odo cIo. En caso de necesitar redefinir el valor de una variable. ..

2 Constantes predefinidas El propio intérprete de PHP tiene un conjunto de constantes predefinidas y siempre disponibles para el programador. . echo (deíined(·centimo'I)?·e.ENGUAJE PHP 49 <1fTMl •• <HEAD. .euro.·no eltá'. I"-'" K4_ 2.". Cadena con el nombre del sistema operativo en el que se está ejecutando el int&pn:te de PIIP.>' ¡ </CEN'!'ER> </BODY> </HTML> " La siguiente imagen nos muestra el resultado: I E1 .. . <TITu:.... euro . .o\Dl> <DO'" <CENTElb <H2.166.4. Algunas de estas constantes son: Const•• te PHP_VERSION PHP_OS Slaalfkado Cadena que representa la versión del intérprete de PHP en uso..'" Luop 1f •• E1 ..2. echo 'El valor de la constante 'centimo' •• ..o' '.centi~... . ~B>'¡ echo centilllO .ORA·MA CAPITuL.1._. No se podrán definir constantes propias de nuestros programas con los mismos nombres ya que se tomará por defecto la constante predefinida. ./8><BR>" ..té·._ .66). echo 'Lüego l€ son '..186): echo 'El valor de la constant. echo' deíinida<BR>'¡ def1neC·centimo". _ · _ ' .O 2: t<1JNOAMENTOS Da 1. . l M t..~r4bajando con constantes</H2> <'pl'lp 4eíinel'euro·.. . .coniltantes< /'fITLE> < I H E".<BR><B~·J echo 'La constante 'centi.e 'eun)' ea: <810". . .."pta8.' < (B><81\><BlI._.

Falso. '</B>~BR><BR>'. Conjunlo con lodos los producido. </CENTRR> ·. Informa que se produjo algo incorrecto que puede provenir o no de un error. trabajando con <B>PHP vera ión " echo PHP_VERSION.50 PHP 5 A TRAVÉS DE EJEMPLOS ORA-MA Constnte TRUE Significado Verdadero.. echo 'Sobre un .iatemo operativo <$>'.ALL que se han EL siguiente ejemplo muestra la uLilización de dos de estas constantes predefinidas del PHP: <TITLE>Const~ntes<'TITLE> <fHItAD> <80DY> <CII:N'l'Dl> <HJ>T~bajando con constant."</8>'. lnforma que el inlfrprele encontró una sintaxis inválida en el archh'o de comandos.> e. Información sobre errores distinlos a los de inlerpretación del cual no es posible recuperarse.s<la~> <1php . La ejecución continua.' lf'nIL> echo ·Ee~. Denota un error que no impide que continue la ejecución. Finaliza la ejecución..f8Otri> La siguiente imagen nos muestra el resultado: ..PKP_OS. erro~ FALSE E_ERROR E_PARSE • E-flOTICE E_WARNING E.

si son correctas. Las expresiones como grupo. un lenguaje orientado a expresiones. También tenemos las expresiones que surgen como resultado de la combinación de operador y operandos. float. respectivamente. en sí. Este valor resuhanle debe ser clasificado dentro de uno de los tipos de datos que maneja PHP (integer. conStantes. o puede incluir muchas variables.0 Sobre UD SlJIrma ope¡illlb:to WIN32 2. operadores y funciones conjunlamenle.<¡ifican según su uso en los grupos que veremos a continuación. . Una expresión puede ser algo tan simple como un número o una variable. Las expresiones más básicas son las variables 'Y las constantes.6 Operadores Los operadores en PHP son muy parecidos a los de otros lenguajes como C. ya que casi todo en él es una expresión. que se c!a. son evaluadas a un valor simple. Otro tipo de expresiones lo fannan las expresiones de comparnción que se evalúan a O ó I correspondiendo con el valor false o true. Podemos encontrar varios tipos de operadores. booleano array. podríamos continuar enumerando todos tos posibles tipos de expresiones.2. 402. La fonna más ajustada de definir qué es una expresión es: "cualquier cosa que tiene O produce un valor"'.2. string.MA CAPITULO 2: FUNDAMENTOS DEL LENGUAJE PHP 51 Tabajando con constantes Ertamos II1II>'JIII4o coa PHP nni. 2. Así. object). lava y lavaScript.5 Expresiones Las expresiones son la base principal de PHP. Se utilizan para determinar un valor. o bien. para obtener un valor final a partir de uno O más operandos.ORA. que es.

1'f lo __ 1.....ri~tico...1 Operadores Aritméticos Estos operadores funcionan igual que en la aritmética básica y se pueden aplicar a las variables y constantes numéricas..2.... </C!'N!'RR> </800'(> <!HTHL:' El resultado obtenido es el siguiente: .. IDOOf_l"""" .dores .. _'0)( . ClI Operadores .. illt.vall (lOO('/euro)'10411/100 .... &uro ... _".so. . _ ' _ · .... cHl~r.</H2> define e 'euro'. ItCho 'lOOOpta."" . A. echo "El valor de la constante 'euro' •• : <8>'.. ..3861 .... ...rllm~llcos m. lIon '... 166. ·f"".. "'J"21n. (15'1\501 ...</B><BR><BR>': echo '100~ 80n " 'euro'lOaO) .BR~ .6. <KEA/» • $b Resto de la división entera Veamos un ejemplo que utiliza algunos de eslOS operadores: <~ITLE>Operadores</TITLE> CIKEA!» <. intvalC!S"¡50) • biUetes de SOC'J echo • y ".'pta<8RJo'. 15'1Ir_Jw. lO'" _ • . I/0I0 __ ~_ ... IiU... .$b Resta dos operandos $_ - • I • $b Multiplica dos operandos $...'1............ 'pta... Son los siguientes: Operldor + Ejemplo Descripción $_ + $b Suma dos operandos $_ . BR>· f ~ho "lS7€ 80n "..._.....'€.IODY> cCENTER> . I $b Divide dos operandos $_ • <HTML. _ • e-o ". .p = • 52 PlIP.5 A TRAVEs DE EJEMPLOS CRA·MA 2.....

su función biisica es asignar un valor a una variable.6._ "lOOO€ 80n '/ .• ·pt8... para que de este modo se pueda con~ervar dicho vruor en memoria.1terwor todo el t.e 'euro l e81 < •• "1 Stexto .. que realmente son una combinación del operador de asignación básico con operadores aritméticos y con el operador de concatenación de cadenas. 1/ por pantalla a eonc. + $b $."" <H2>Operadorea de aaignaci6n<IH2> def1nel'euro"._ euro: $textO .: o: . La siguiente tabla resume los operadores de asignación: Opendor : Ejemplo Descripcl611 $a loma el "alor de $b : : : : : : $. El operador de asignación es un operador binario que siempre loma la fonna: variable .J .. / $b $a O $b $.Operadore8</TITLE> _8OOY> <"".1861.> -".. Este operador 10 hemos utilizado básicamente hasto ahora para asignar valores a las variables con las que hemos trabajado.> <MEAD~ cT!TLE. 11 en la variable Stextl. o..quierda lome el valor de la expresión de la derecha. /: $b Equivale a $a $a $.. : $b +: -: 0: $. -: 0: $.: $b Equivale a $a $b Equivale a $a El siguienle ejemplo muestra la utilización de algunos de estos operadores aplicados a un ejemplo anterior: _>mil. eRA-MA CAPfTuLo 2: FUNDAMENTOS DEL LENGUAJE PHP 53 - 2. PHP soporta Olros operadores de asignación.2 Operadores de Asignación El operador de asignación más utilizado es ":". $b /: $..trar Stexto • "El valor de la constant.2. $b $b Equivale a $a $b Equivale a $a $a ° $b $. +: $b Equivale a $a $a $.</B><8R>cBR>": $texto .:.exto a .166..". expresión Este operador de asignación hace que el variable de In i7.

6. ¡OOOpts ea € $valor ' a 100: ¡/lo multiplieamol por 100 $valor • intvall$valor)~ I/eliminamoe lOe ~1m&1 •• que no qu. no es necesario profundizar más en estos operadores. 80n '1 $valor -IOOO/euro._ '€<BR><BR>'/ $texto . '/10 dividimos por 100 para obtener el valor fin.. Stexto . .Ipecioa 1iI .-.. 't._ '1~7€ 80n -.. devuelve como resultado la concatenación de sus operandos izquierdos y derechos. 1~_UIf *.4 Operadores de Incremento y Decremento Al ¡guaJ que otros lenguajes de progrrunación como C. l/calculamos el valor de toOO< Stexto .. el resultado obtenido es exactamente igual que el del ejemplo original: Operadores de .. 2. $texto .. PHP soporta operadores específicos para incrementar y decrementar el valor de las variables."IOOOpts. Svalor • intv8111S1/SOI¡ $texto .3 Operadores de cadenas A 10 largo de los ejemplos anteriores hemos utilizado el operador de concarenación de cadenas representado por un punto (" ... .. SO< y ' 115'\SOI.....2. Como su funcionaJidad es la vista hasta el momento.. como hemos comprobado._ $valQr. .._ $valor: $texto .6..2.. Io_·. .· ... "). 1OC'lf 2.- 11XIOf_1..l $texto . d. .54 PIIPSATRAv60EElEMPLOS CRA-MA $valor • euro· lODO. . </CENTSR> </80OY> " </lITML:> Como podemos observar en la siguiente imagen.• $valor • billete.r~ $valor /_ IDO.). representado por un punto seguido del signo de igualdad (" . ISlr_' . . también hemos visto el operador de concale"ación y asignación. ¡obtenemos el valor d._ ·pt8<BR>&.' ¡ echo $texto. .

."""'.l valor inicial d. El resultado cOlTespondiente se visualiza en la siguiente imagen: .entoa<fK2> <?php s.. """"" """y> <TJT~~a40rea</TITLZ~ </HEAD~ .M.J devuelve¡ <B~".</B~<BR~·J echa' Al preincrenentar ( •• \$. Al poatineramea~r (\S."</B><8R>"..• 3'</~<br>'1 acbo 'Valor final de \Sbl <b>Sb</b>. ecbo echo °81 valor final de \S8 " l <B>Sac/B><BR)·. <M4~lfter. Sb-1S¡ echo ·<br~.. : echo "El valor inicial ~ \sa .8: <B>S.c....+._.) devuelve: <B>". echo '. Valor final de 'SCI <b>$cc/~<br>·.". La siguiente tabla muestra las posibilidades de estos operadores: ++$8 ++ Preincremento : Incrementa $a en uno y después devuelve $8 $a++ PosHncremenlo' Devuelve $a y despuM Incrementa en uno $a Predecremento: Decrementa $a en uno y después devuelve $a Posdecremento.ntoa y Decre. el momento de su ejecución dependerá de la posición en la que aparezcan respecto de la variable a la que son aplicados.·</B>cBR>·..-ORA. \$0 es: <b>$b</b><br>'¡ $c_$b __ + 3.. CAPtruLo 2: FlINDAMFNJ'OS DEL LENGUAJE PHP SS Además.$ ••• . Devuelve $a y después decrementa en uno $8 --$a $a-- Por ejemplo: . •• $a.. \$c le 8signamoa <b>'\Sb-.

$_ >. _ _ .5 Operadores de Comparación Los operadores de comparación se utilizan básicamente pata comparar expresiones. === $b mismo tipo.1. Cuando se utiliza el operodor de igualdad entre dos operandos..a lista completa de operadores de comparación se muestra en la siguiente tabla: Opero Dcvueh'e true cuando Los operandos son Iguales.. u 11 Cabe destacar cómo los operadores de postincrememo y posdecremento devuelven el mismo valor que reciben y posteriormente lo modifican. .' 9_IItoI . >- ....56 PHI>...1."_ .2. $b El operando de la izquierda es mayor o Igual que el operando de la derecha. 1 41 .. Los operandos son idénticos: Iguales y del $.." )..6... Los operandos son distintos.. . _ j"$o)_' ($M-+\ ' . Un error habitual suele ser confundir el operodor de igualdad con el operodor de asignación... L....1. == 1- Ejemplo $.. v. I $b Los operandos no son Iguales o del mismo tipo.. $_ <.5 A TRAV~ DE EJEMPLOS el RA-MA hu. . -. La respuesta a dicha pregunta puede ser true O false_ Dos símbolos de igual confonnan el operador de igualdad ("::=").. $_ > $b El operando de la izquierda es mayor que el operando de la derecha. ...$b $a ! = $b === 1-< > <..remeDIOS y Decrementos _ _ _ .. " .:...0 . lo que se pretende delenninar es si los valores contenidos en los operandos son iguales. $. 2. $b El operando de la izquierda es menor o Igual que el operando de la derecha. $_ < $b El operando de la izquierda es menor que el operando de la derecha. . . « v.. Las expresiones que utilizan operadores de comparación habitualmente realizan preguntas sobre los dos valores contenidos en los operandos..

O: Activa los bits que están activos en $a. A pesar de ello.6 Operadores a nivel de bn Todos los datos. tanto como oen $b. & Descripción Y: Activa sólo los bits que están activos simultáneamente. es decir. Dependiendo de su colocaci6n. $b Desplaza los bits de $a. se almacenan en memoria como bits. « $. $b posiciones a la izda $b Desplaza los bits de $a. un bit puesto a I representa un valor igual a 2 elevado a 11.ENCiUAJ6 PIW ~7 Los operadores de comparaci6n se utilizan en PHP principalmente en la toma de decisiones. $. Se pueden introducir los valores enteros como números decimales. El valor decimal del número 1010 binario se calcula del siguiente modo: 1 x 23 + O x 22 + 1 x 21 + O x 20 = la PHP utiliza 32 bits para almacenar en memoria los valores enteros. 2. octales o hexadecimales y PHP los convertir:1 en binarios cuando los almacene. La siguiente tabla nos muestra dichos operadores: Opero & Ejemplo T $. Por tanto. en el nivel más bajo. PHP por defecto siempre mucstrd la representaci6n decimal de los números almacenados en memoria. Por esto.= ORA·MA • CAPh1JLO 2: FUNDAMENTOS DEL I.2. el cual representa cualquier valor como una ristra de ceros y unos. PHP nos pennite acceder a la representación binaria de los valores numéricos a través de los operadores de bit. siendo 11 la posici6n de dicho bit dentro del número comenzando por la derecha que es la posición O. Por ejemplo: el entero la se representa con el número binario 1010 y necesita un m{n imo de 4 bits para almacenarse en memoria. pero no en ambos a la vez.6. $b $b I • I $ • • $b « » X or: Activa los bits que estan actiVos en $a o en $b. se almacenan utilizando el sistema de numeraci6n binario. $b poslClOl'leS a la dcha . CA1: Devuelve el complemento a uno del operando $. » $. se almacenaría de la siguiente forma: 00000000000000000000000000001010. Lo habitual es escribirlo como 1010 eliminando los ceros de la izquierda que no son significativos. tanto para $a como para $b. una vez en memoria el número 10.

"<!TD>'..~8 PIIP ~ A TRA ves DB EJEMPLOS e RA ·MA El siguiente ejemplo muestra algunos de estos operadores en acción: <1f1'><L "".'c!TD>' echo 'cTD>·.. <TR ALION3'center'> <TO BGCOLOR~'yellow'>&nb8p. ' </T%»' ¡ ..4»>21.. echo '<TO>"... .. ( (50r. binario en binario BORDER.I($a~81»)) ..2) l»1) . echo "<TO>$bc/TO>'. ($b&l) . ·<TD>'. c/~' ..</TO> eTO BGCOLOR_'yellow'>2<SUP>]</SUP><!TP> cTO BQCOLOR_"yellow'>2<SUP>2<JSUP>c!TO". " . < ITOl> <OC echo 'cTl»$scITOl>"¡ ITJt> cnR ALIGN-"center'> cTC 9GCOLOR~'yellow'>$b</TO> <?php echo 'c'l'O> ..· CELLSPAClNO_'a'.'yellow">2<SUP>1</SUp><rTO> <~O BGCOLOR-"yellow">2<SUP>C</SUP..".. <BODY"........C$sál).·.dorIllB de ait8</II:2> . " cf(2'»Oper.81"'>l). 'c/TO>'.( ($b&8»l>3).....</~ cTD 8GCOLOR_"yellow">valor deci~lc/·D> "TI<> cTl ALIGN_'ceüter'> <'1"0 BOCQLOR_" ye l1 ow' > $4< ! 'rO> " echo "<TD>'. ..s</TITLE> "". <TAB~! /1 1001 0011 .. ALIGN~'center'> cTO I!IGCOLOR_'yellow'>$a " Sbc/'l'D:>- <'.t($a&..."<(Ttl.' echo "<T'O>"..."l' CEL~PADDrNG.. <TC 8GCOLOR. eTJTLB~r. ($0&41»2) ..'<fTDl>" echo '<TD:>-'.'c/ TU>' ..CC$a&.. echo $aux"$a&$o.dor. . "c/TO> ' j echo 'cTO>'... ((S4~21l»lJ . c/TR> <TR echo 'cTO>'..

'</'rO>". ( ($au.> echo '<TO>$aux</TO>'¡ <TR ALIGN*'cencax'> <TD BGCOLORq'yellow">$a <?php $lIux"$i!I. ( (Saux.. ~ $b</TD> echo "<'1'0>'."4»>2). «$lIux.1) • '</1"0>'. ($aux&l).'</TO>'. y el resultado obtenido es: .> C/TR> echo '<rO>$lIux</TO>'. ($1I~'»>2) . . '<TO>'. «$aux.'yellow'>$a I Sb</TD> <?php $4UX~$1lI1 $b¡ echo echo echo echo '<1'0>'. -"/'l'O> .> </TR> echo '<TD>$4ux</TD>': <TR ALIGNa'ceater'> <TO SGOOLOR='yellow'>-$a</TD> <?php $llux"~S!l.l.'</TD>o'. '</TI» o I '<TD> o . echo '<Tt!>'. ~~--------------'1 echo '<'I'D>'.: . '<TD>$aux</TD>'. ¡ .x¡.8) »3! . '<fTD"' ''' .echo '<'rD>'.2¡> .~$b.'<ITD>". <'I'R ALIGN~'center'> <TD aocoLOR.> </111. echo '<TD>'. (f$lIux&4):»2). '<¡TO>'! '<1'0>'."2»>1) . ($aUXl<l) . «$oux&2»>1). ( ($i!lux&4) »2) ..{ ($aux&2»>1). .i{$aux~8»>J) .> <fTR> </'tA8LE> </CEN'TER> echo echo echo echo echo ·<TD>·. «$1Iux&81»3J • "</TO>": eeho '<TD>'.o RA·MA CAPfnJLQ 2: FUNDAMENTOS DEL LENGUAJE PHP 59 . r---~--. echo '<TD>" ..'c/TO>·) '<TO>'. </BOO'i> </HTKL . ($aux&lJ . "<TO>'."</TD>'.'</TD>'. {$i!lux&l) . "</TO>".• <¡TO>' J '<TD>'.

Veamos el ejemplo que moslraba el mayor de tres valores haciendo uso de este tipo de operadores: <IITML <TITLE>Operadores</T1TLE~ </IIEAD~ <BODY> .. pero no lo son los dos a la vez.60 P."... $b $a and $b II or $a II ! $h $a or $h $a . Con estos operadores se pueden combinar varias condiciones y evaluarlas en una sola eltpresión. ec:ho "<8>$a.IP. $a o $b son true. La sintruds de estos operadores es la siguiente: Opero && and Ejemplo $a && Devuelve TRllE cuando $a y $b son ambos true. ec:h? '<BR>Los tr_ n1ÍMro• • C:OIIpe.. • .5 A TRAVa DE EJEMPLOS e RA -MA -~_. <Hl~radore8 lógico8</H2~ $a_l $c_9._---- Ope".7 Operadores lógicos Los operadores lógicos (también llamados operadores booleano~') se utilizan conjuntamente con expresiones que devuelven vaJores lógicos.I"ar so.dot'et de BII" 2..6. xor $. xor $b $a es true o $b es true.. Sb </8>y<B> Se< B><BB~<BR~·J . niega el valor lógico de la variable.2. $a es false.

Ante este operador. LENGUAJE "Uf 61 . ~ I ~ 1'IIIP'1I1210nl/_.--e kA-M" CAPITuLO 2: FUNDAMENTOS DEl.(Sc>$bl?5c. Un ejemplo de este operador serra el siguiente: <H'l'toIL> <HEAO> _/11&1\0>- <OOOY> <CI!lI'l'EII> <K2>ep."..1 lIIlIyor es el "5>'1 ech.2. ~ E<it_ M~ jI ~ ¡por¡u 1:1... " ..rador de ej.~t .6.lIIlmerot _ c~_ 3..eh" • y . echo (SC>$.8 Operador de ejecución PHP ofrece el operador de ejecución representado por el apóstrofo invertido r' ").1.··/ ?> 'C/COII'ER> Como podemos observar en la siguiente imagen. 2. PHP toma la cadena que hay dentro de los dos apóstrofos jnvertido~ como un comando o programa externo y lanza su ejecución. echo o<pre>$entorco</pre>'/ .eución</Hl> </CENTER> c7php $entDrno • '.. el resultado coincide con el ejemplo base ulilizado: .t' ($a>$bl "" ($a>$c) ?$II:" I echo (Sb>$al'"I$b>$c)?$b.lCI IQí!íii I " Operador es lógicos Los tre.

.. P~~1OR~IP~lr ll~·. Sirve paro omitir Jos mensajes de error que pueden surgir al utilizar una instrucción.lla de un operador especialmente útil pero..ce.IOD'r~ "..'. .ult U..'" I.9 Operador para la omisión de mensajes de error Se Ir.o.... Normalmente."._ ..LIVrL-1 'ROCI'fQa._<'''''-C..:I¡ IC'\. es decir. ~. con lo que la ejecución del scrip' cesaría sin que el usuario hubiera tenido ningún tipo de notificación..~'C.nu. .. " .. \Pot.vn. ".62 PIIP 5 A TRAVEs DE EJEMPLOS ORA·MA El resultado se puede observar en la siguiente imagen: "TUno ..\. . poco utilizado..6.-c..RlVll iON-C7C' "OIII"T'-IPIO r .vu: ..u ~_'lA~_PID'17 2.o(. ini que nos pennite obtener el mensaje de error generado en la variable $php_errormsg.~ocuaoa_. pues evita la aparición de los mensajes de error.UT: ... . Hay que tener cuidado especial con su uso...I_. podía darse el caso de que el mensaje que avisa de la producción de un error eTÍlico no se visuaJizara. . ll.!lUI_ 11M .. a. _ _ _ _ _ _ _ _ _ _ ~ _ _~~_ _ _ ___' .. "11tNT tIIIIJUllO. Se representa con el carácter "@".lU-C.I.2.nam 'ntU. su uso está asociado a la utilización de la directiva track_errors del fichero de configuración php.n.. .\UCIttY·t\ . I Acó. .t'OII.\.n .~ . a veces.. .<". El siguiente ejemplo muest:ra su utilización conjunta para controlar la generación de los errores a través del scripl: ~tn'ML~ ~K!!AO~ <TITLE~rador •• ~ttITLE> ..f)fRAO> "'CIIn'ER> <cKl~rllcSor de OIIIhiÓfl dft errorfte<:tJC> S. . \ VUIII'T Iy.~_t-C.uoc •• n:C'T'lU·..octlao. JII..B. .¡ 1 B••"lno J.I:n:.D. pero no las acciones que se puedan haber producido a consecuencia del error.

1il:t:1n27 o. S para después . 3.. 1'14 01.o. Stext02·"S..*1. e " &.ultado<8R»-.l_erronug' </8»".6. cuando creamos expresiones que utilizan más de un operador diferente.'.! .."Blt>". da mayor imponancia a la operación de multiplicación 5 * 3 respecto a la de la suma 7 ..$ph. PHP la evalúa de izquierda a derecha.I"'r.ultedQ. 15.ostra.. i se ~ producido un .a.Sa/Sb: ."El reaulta40 de $a/$b e.·Y.nw>to tll. 5.... Por tanto. '$re.. hay que tener cuidado porque PHP no siempre evalúa estas expresiones de la misma forma.os el -onsaja de arror ecbo . I ~r~' .c'''' . Si se quería evaluar primero la suma 7 . Oo¡¡o... lOll) I!i~ ~ . podríamos pensar que. $re.l/C11*_Ct w Operador de omisión de errores 2.10 Precedencia de los operadores Cuando una expresión está formada por más de un operador del mismo tipo. ~ENTER. almacenando el resultado final 22 en $x..2... Veámoslo con un ejemplo sencillo: ante la expresión $x • 7 + 5 . I\. . .eb) lenpty($reeultado))7 StextDl: $t.11ll lOO?O'.' La imagen siguiente muestra el resultado de interpretar el scripl: (ll' ~' "..". después de evaluarla.presión se evalúa en un orden basado en la precedencia predefinida para cada operador... !t frllfeOt lJ. en $x obtendríamos el valor 36.. ..xtol. pero.. ha proóucido un error . Cada pane de una ex. . Moo¡r.'te ~per440r Staxtol. "lb. cuando PHP interpreta la expresión. lIu.CAPtruLO 2: FUNDAMENTOS DEL LENGUAJB PIIP 63 'b • O. Siempre podemos modificar la precedencia relativa de los operadores encerrando entre paréntesis las expresiones que queremos que se evalúen de una forma diferenciada.:trnu. I 1~ diviaión por O genera un error C9" I la ejecución continúa ain proble.l. sin embargo. el resultado de la multiplicación lo que se suma con el primer operando 7 . la prece(Jenc:ia de operadores especifica cómo se agrupan las expresiones para ser evaluadlls.11" 11 d. Es. por tanto.rror y '1 •• e.

f • 64 PIIP ~ A TRAVts DE. La siguiente labia muestra los operadores en orden de menor a mayor precedencia: Operador or xor = .) • .? 0- ...- II && I • & == < !::: '" =. (7 + 5) '* 3. 1= "= -= «= . • + / " - • (array) - ( int) (double) (stringl (objet.. dando como resultado 36. EJEMPLOS C RA-MA muhiplicar eSle resullado inlennedio por 3.:: <= > >= « ! - .1do los paréntesis para modificar la precedencia: x .-- and •- 1= .. se tendría que haber uliliz.

.. .. 3. Utilizando estas sentencias... es necesario dOlar a los lenguajes de prui. C++. CAPíTULO 3 ESTRUCTURAS DE CONTROL No todos los problemas que se nos plantean tienen una solución basada en la ejecución secuencia) de instrucciones: por eso. Las estructuras de conltol o sentencias de control nos permiten modificar el flujo de ejecución básico del programa. Son las c~lructuras . A continuación enumeramos las distintas estructuras de control que nos podemos enconlTar en un programa PHP. Estas estructuras nos permiten bifurcar el flujo del programa y asf ejecutar unas partes u alfaS de código según se cumplan una serie de condiciones. vamos a poder controlar el flujo lógico de cualquier programa. somos capaces de hacer que el programa elija enD"e dos caminos de ejecución diferentes en función de la evaluaci6n de una expresión lógica. gl1lcias a ellas la ejecución no tiene por qué ser totalmente secuencial. las que presentan lenguajes corno C. hacer que un determinado código no llegue a ejecutarse nunca o que lo haga tantas \'eces como queramos. Son comunes en cuanto a concepto en la mayoría de los lenguajes de programación de alto nivel y casi idénticas .'ramaci6n de herramientas que los permiLan adaptarse a las diferentes situaciones o condiciones que se pueden dar a la hom de intentar resolver un problema. else y en las diferentes fonnas que ésta puede presentar. se basan en el uso de la !~entcncia i f .. es decir. Java y también Perlo Bash.1 SENTENCIAS CONDICIONALES de conlrol más scnci1 la~..

si resulta verdadera. Para descubrir dicho valor.. se ejecutarán las sentencias comprendidas entre las llaves "(" y")" y..r lonl ". una samencia .' echo "<B>$a. NOTA: En caso de que dentro del cuerpo de la sentencia lt t6Io hay. es decir.1. utiljzamos LreS sentencias it. ?> </CEN'l'SJb </8Co:n'> </H"niL>- . podré preseindlf del VIO de 1 . Sb </B>yeB> $ce/B><B~<8R>"J echo' y al mayor ea al <B>'j i l (($a>$b)&l. recomeJ'K1at)le ponerla••iempfe En el siguienle ejemplo podemos observar la utilización de la senlencia i f para saber cuáJ es el mayor de un conjunto de tres valores. nos permite lomar decisiones en tomo a una condición. nÚlllaroa a cOm¡)!lr.<. $b-1 : $c-9: echo "cBR>Los tre. cada una de las cuales. pregunta si un valor delenninado es mayor que los otroS dos: <HEAD> <TITLE>&structuras de Control</TtTL!> c/HItM» <BODY> <Hl>Sentencia <I>lf<fI></H2> <?php $a z ). a través de una expresión lógica. ) echo 'e/B>'.66 J'IIP!i A TRAV6 DE EJEMPLOS O RA-MA 3.'d$b>$c)}( echo Sb: ) lt (l$c>$a)UI$c>$b))! echo Sc. e. PHP ignorará las sentencias y seguirá con la ejecución nonnal del programa. llaves "1" y"}" Aun ••r.. si es ralsa. la siguiente: if (condicion) { (sentencias] ) El intérprete de PHP lo que hace es evaluar la condiciono que debe ser una expresión lógica y.1 i f Es una de las más utilizadas e imponanles en la mayoría de los lenguajes de programación_ Su sintaxis e..($a>$a)) ( echo $a: ) i f (I$b>$a¡¡.

la expresi6n a evaluar puede ser tan compleja como se necesite. Ilobet.CAPfnJLo J: ESTRUCTURAS DE CONTROL 61 Como podemos observar..cho $e: I I I . Haciendo uso de ifs sanidados. I if I$b>$a){ H($b>$e){ ... el siguiente código da el mismo resultado que el mostrado en el ejemplo anterior: C'tITLIbEatructur.. ~ . 9 . lo cual proporciona una nex."cl Sentencia if LoI !fes números a comparar son 3. .. d. En este ejemplo el resultado obtenido es el siguiente: 1 IltlKh.~ <I>if</I><IH2> ?php $s . ) ~ $b_1 . de . if ($e>$a){ U{$e>$b) I . es decir.r ~ ti ~I" h Jliarl.t-ap. echo '<BR>Log tres nameros a comparar son: echo '<B>$a.1I12100'II_.E.octOn 8U11d ID 200 .... Cont. Madi ""'* _ 1 '.ct. $c .cho $b.. $b </!l>y<B> $c<{B><BR><IIR> echO' y el ~yor es el <S>'1 if I$a>$b¡ ( if{$a>$c) ( echo $8.ibilidad completa para ejecuciones condicionales.BOOY> d·:!NTD> <Hl>Sent~cis Control</Tl'rt. 7 Y SI y el mayor el e19 Las sentencias if se pueden anidar.ol wW'.. podemos poner dentro de un bloque i f otras sentencia" if.

pero haciendo u.¡ ~y<B~ Sc</B~<9R~~BR>'1 Qts.. elsc es [" siguiente: sentencia i f .. clse: éSI:l consta de un bloque i f que ~ (expresion¡ { sentencias ) clse { if sentencias ) Siguiendo con el ejemplo anterior..! $QlII!II.. else A menudo nos interesa ejecutar un código di . <ICEN'l'E:R> </IIODY.. echo "<B>$a. clse.« comparar . echo -<BR>Los tres nú=eros.lmayor=$II..on: ".. tendríamos esta posible solución: cT¡TLB>Est.yor"'$b¡ J i{IS..~et~~$ de Control</TlTLE> </KUD> c90DY. $b < if l$4~$bl { $..o de la sentencia i f .2 i f .~ " .· </HTM~ 3. La sintaxis de la instrucción i f .l~yor~$cl { $ehnoYOT"'$C¡ </C"DlTER~ </BOOr~ <fHTtq. ünto si la evaluación de la expresión que acompaña a la inslTUcción i f no es ciena.o <CSNTER> <H2>Sentenci~ <1>if</t~</H2> <'1php $a")1 $b-7: $c_9.. ULilizamos entonces la ejcculu cuando la expresion se evalúa a true y de un bloque cIsc cuyas instrucciones se ejecutan cuando se evalúa a falsc.1.• 6ll PHP 5 A l'RA vts DE EJEMPLOS =RA-MA echo "<'B>".

• e1se I Selmayor"Sc: ) .. I Oj" • • (1 .. $b: 1 ehe ( $elmayor"'$c.. c !CDn'EII.</B>".." <i B'lOY" c / Pnfl.7.elmay« el el9 ..1tt!>.8><8R>cBR>". ir ($a:>Sbl( ift$a>$c)\ S.Los tres n~ro... <('Qn\!3l.fl$b>$cll $ellllllyor .'" Sentencia if LoI tre$lIIimeros 1 C omp"'IOft 3..¡ lha ! ! .1Il27 oo11\..eRA-MA CAl'rTULO J: ESTRUCfURAS DE COr.. ~.... ! <Sil.¡. I_ID ~_3 I"\.~OL 69 Otril posible solución viene dada por el siguiente código: f<M"TIIL' <tn:A!. echo O<BR...u> c~l~LI>!atT . ) echo· y el raayor ea el <B>$elnLayol. " " mi ".lmayor" $Il. •• "".. a e~ar aonl ° 1 echo °<8>$8.etuC~8 de ContcO~</TITLE> 'fHEA» ~BOoy.> cH2>Sentencle <t>ifc/I></H2> c'1'php $e-JI $b-1/ $e...~ .. ~ e I .9 . Sb c/B>y<B> 5c<. ... .9. el resultado de la ejecución de todos los ejemplos anteriores es totalmente equivalente: .. Como se puede observar en la siguiente imagen.1ul .

. d~ Cont~ol<ITlTLE> cBOOY><Cmn:fb <H1>-Sentencia <1>if</X></H2> <t?php $a .. para estos casos se puede utilizar la sentencia elsei f que nos permite combinar ambas sentencias en una sola. [else ( sentencias )} La sentencia elseif se ejecula si.. $b </8>y<8> $c</s><BR><SR>'¡ i t I$a~$b) ( if($a>$e) ! $eltaayor.>mO <HEAD <71TLB~!at~uctu~a.. se evalúa a true y la expresión if precedente y cualquier expresión elseif precedente se evalúan a falseo Su componamiento. eaho '<8>$a..g¡ echo '<SR>Loa trea m1meroa !II COl!()a~ar son: '... y sólo si.3 H .yorc$c. 7¡ Se. elseif es la siguiente: i f (expresión ) ( ) sentencias elseif (expresión) ( sentencias ) lelseif (expresión) ( sentencias )} .. 3 : $b .70 PIIP ~ A TRAVÉS OE EJEMPLOS C RA-MA 3.1. El siguiente ejemplo nos muestra un posible uso de esta estructura aplicado al ejemplo anterior: .. La sintaxis de la sentencia i f .$a: eh.. { $eb. } eheif ISb>$cl ( $el_yor"Sb¡ . al •• H Hay muchas ocasiones en que se quiere evaluar una nueva comprobación utilizando una sentencia if dentro del cuerpo de una sentencia el se. coincide con el de las sentencias i f anleriores. por lo dem:1s..

Cleres y en notaci6n inglesa.. "Mon"' ( echo • [.l •• if ¡SeUa . "Sat") . Sun. es decir. . TUe.1I..> " 1 Este ejemplo hace uso de la función date llamada con el argumento "D" que nos devuelve el di...1. { echo 'Ni.unes' J ) .' \ ( echo 'Hartes'. nos devuelve: Mon. ) eh. .. . 1 ... de la semana en curso pero con tres can!..cho 'Saba4o' ¡ al"8 I eeho • Domingo' r echo ' .. eRA-MA • CAPtruLO 3: ESTRUCTURAS DE CONTROL 11 .'.. } ..reole.> <HEAD> La sintaxis de la cTITLE>Eatructuraa de Control</TlTLE> <IHEAD> cBODY> <Ctt. Wed.ayor~/~·1 sentencia if-elseif-else puede tener tantos componentes elseif como sean necesarios. lB>' ¡ c/CENTER" </BOOY> </tn'IU.11_ ( } Sel_YQr"$c¡ eeho • y . elleit ($dia ~~ 'Fr~') echo ·Vierne..-.U I$db . • date¡"O"): if /$di .1 <B>$el.if {Sdia _. <H2>Eentencla <1>1t</1><IH2>echo "Hoy . .. Este tipo de composición nos permite hacer procesos de selección múltiples en una sola estructura.1 . "Tltu" { echo "Jueves'.ayor es .. 'we<t'.eH I$dia . "'l'u. .a <9>": $dI. El siguiente código muestra un ejemplo de este tipo de composiciones L: <111M...'TER> <' ..

encias] endif 3.. ".y el carácter "J" por la palabra endif.." l.. . . La forma básica de la sintaxis alternativa para In instrucción i f es cambiar el carácter "{" por el carácter ": 1. ! Sentencia if Roy el Dominao PHP ofrece una sintaxis alternativa para algunas de sus estructuras de control. [else: sent. . con lo que quedaría de la siguiente forma: if (expresión): sentencias (elseif (expresión ) : sentencias) .. ~<MIo111J ~lOllI .o..~ ".. .índose en el valor lógico obtenido al evaluar una expresión.4 Expresión condicional (if compacto) PI-IP utiliza dos operadores ("?" y ":") para formar expresiones condicionales que devolverán uno de dos posibles valores bas:. La sintaxis de estos operadores es: <expresionl> ? <expresion2> : <expresion»...1... .' .- • 12 PIIP5ATRAVt50EEJEMPLOS C RA -MA I 1 c El resultado obtenido es el siguiente: . ..!! ( ." 1I ~ ~.

si ésta se evalúa a true. echo' y . El resultado que muestra el navegador es el siguiente: Operadores de comparación y condicionales L~. entonces se devolvería la evaJuación de expresion2: en caso conlr.. JI mo'tromos el ~yor de 10$ tres valor•• echo C$elmayor<Sc)?$c:Selmayor.rC>l' comparar . ech" ' . considerando expresionl. $c-9."): ~ comparsci6n y cODdlcional ••<IH2> $0_7.1 mayor es el <8>". 3. J a>' . echo "<8R>Loa tfes números a compax-a:r 80n: '. <CENTER> <H2>Ope:radorea <?php $(1.1. $b </B>y<B> $c<{B><BR>. 9 m.5 Bwitch La sentencia swi tch se uliliza para comparar un dato con un conJunlo de posibles valores.> </80DY> <{11TH".uio.yer. 1. El siguiente ejemplo nos mucslnt su uso combinado con operadores de comparación: ~tTLE>OpeT~doreS</TITLE> . echo -"8>$a. 7.."al<>" ¡ 1I obtenemoa el mayor de $s y $b Selm4yor_¡Sa>$bJ?$s:$b. nUn¡.I e RA MA CAP(TULO): ESTRUCTllRAS DI! CONTROL 7J De este modo.Ir. el vaJar devuelto seria el resultado de evaJuar la expresion3.Il0l)'(.. 01 IOC.· c/CEm'fJI. Esla larea se puede reaJizar ulilizando .' 01 9 3.

.. elseif múltiple. no se sigan realizando más comparaciones: fuerza la finalización de la sentencia switch. ] [break. se ejecutará la opción detault. La sentencia break dentro de cada una de las cláusulas case permite que. $dla • d4te("D'): _itch($dia¡ ( ca •• "MOD' 1 $texto_ 'Lunes". 'Mi.trueturas de ControlcJTITLE> c/KEAO> <BOOY:.nci4 <I>if</I></H2> c1php echo "Hoyes <9>'. 1 (break. entonces.Sent.. Esta opción se puede omitir del switch y. la ejecución de una cláusula conlinúa por la ~iguienle. ) En el caso de que el valor de la variable no coincida con ninguna cláusula case. Si no se utiliza la sentencia break dentro de las cláusulas case. La sintaxis de la sentencia switch es la siguiente: switch ($variable) { case valor!: [sentencias." I KM "J(a~t .ak.R> <H2:.~reol •• • c ••• "-. <CE:N'T'F.. no habría ninguna acción por defecto. 1 default: sentencias. J case valor2: I sentencias. o •• break~ "1'1. pero la sentencia switch es mucho más legible y nos permite especificar un conjunto de sentencias por defecto.4"1 KM . 1 case valorN: [sentencias.' break.1. echo 'viernes'] b:oeak¡ . . El siguiente ejemplo nos muestra la utilización de esta cláusula para resolver el ejemplo anterior: ~TITLt>C. en el caso de que el dato no tenga un valor con que compararlo (equiparable a la cláusula elee de la sentencia i f). '!'bv't eoho 'Juev•• ' I t c ••• "Fd.. 1 [break. break.r • 74 PUP:5 A TRA vts DE EJEMPLOS ORA-MA múltiples sentencias i f o con una sentencia i f . una vez encontrado el valor buscado. ·: br.

ocasionando que el control pase a la cláusu la case inmediatamente posterior. 'Mon": ca •• ''rus": e ••• 'w.1C! • ... "Pri': echo "un dio 4e dio~lo'...kl <lataultl echo "</8>'.10 .. 7j .'111 pIIr~ Sentencia if Hoyes Do. bre."" n Ih.. 11 l.. ... <f800Y> jtr. Como podemos observar. . c1efault. roll.1 "' ...ORA·MA CAPITuLO). break.~·l .I. IIICho "fiD de . ESTRUCI1JRAS DI! COrrntOl..'1"1/11'. ca •• 'Thu': <:05. el resultado es idéntico aJ del ejemplo visto con la senlencia i f: 1 t. El siguiente ejemplo nos muestra la utilización de ambas situaciones: <TITLE>Botructurao 4e Control</TlTLB> <&QDY. S4la • date("D")¡ owitchlSdiaJ I e .4'. habitual que alguna de las cláusulas case DO tengan asociada ninguna sentencia..o Existen ocasiones en que es interesante prescindir de la utilización de la sentencia break dentro de las cláusulas case.. <CI':NT!R> <H2>Santencia <1>if</t></H2~ «'i'php IK'ho "Hoy e8 <8>". . .. .... También e<.. • ""'" ...

. como ocurre con la. ] case valorN : [sentencias.¡0BJ ~!. • ?> "'/800'1 </trn'lL~ El resultado que obtenemos se muestra en la siguiente imagen: & D~ (di...~27 001 .. J (default: sentencias. por la palabra endswi tch.:'J . y el cnr. Un uso sencillo.] endswi tch .. iI frIMdDr Ullllllao /!ICRi4 A. "'.f • 76 PIIP. 1 [break. estruCluras de lipo arroyo . ) c ase valo r2: (sentencias.u:It I\.. pero habiluaJ.-. También se utilizan para recorrer objetos o estructuras compuestas por más de un elemenlo.-.:. ] [break. es utilizar los bucles para conlar. 3..5 A TRAVés DE EJEMPLOS O RA· MA • <::':10 '<111>'..... ! o • 1 ! Sentencia if Hoyes fm de ..2 SENTENCIAS DE BUCLES Lo utilización de bucles dentro de un script sirve para muchos propósitos. que susliluye el carácter " {" por el carácter ": . 1 [break.1cler "} ..emana También nos podemos encontrar con la sintaxis alternativa de esta estructura de control.:. como podemos ver a continuación: switch ($variable) : case valorl: [sentencias..

[exp_bucleJ){ lsent.encias) ) Las tres expresiones cerradas entre paréntesis son opcionales. se estarán ejecutando las sentencias delimitadas entre llaves. siempre se eva]úa a true. no llegaría a ejecutarse nunca y si. La sinlaxis de esta eslnlctura de control es la siguiente: for ({exp_inicializaci6nJ. si no se cumple la condición. pero es necesario escribir los caracteres punto y coma (". No sigue un patrón fijo: algunas de las formas que presenta son: . Se ejecuta cada vez que fmaliza una iteración. Mientras estas condiciones sean ciertas.2. La expresión se evalúa antes de cada iterJción y. se separan por comas.ORA-MA CAP{TULO]: ESTRUCTURAS DE CONTROL 77 3. si inicialmente no se cumple el cuerpo de la sentencia. [exp_condición). Vamos a detallar las opciones que nos permite esta sentencia: • exp_inicialización nonnalmenle se utiliza para iniciali1. al contrario. para que cada expresión permanezca en el lugar apropiado. Es una de las estrucluras de control sintácticamente más complejas de PHP.1 for Esta instrucción nos pennite realizar un conjunto de instrucciones un detenninado número de veces. Si hay más de una variable. estarfamos ante un caso de bucle infinito. sólo se ejecuta una vez al principio del bucle. la expresi6n e:xpJmcle modifica el valor de la variable o variables (separadas por coma) utilizadas como contadores del bucle. Suele ser de la forma: $variable = valor_inicial • exp_condición define una o más condiciones que han de cumplirse (evaluarse a true) para poder ejecUlaJ" las sentencias encerradas entre las llaves. Es muy importante comprobar la corrección de esta expresi6n porque.at y declarar la variable o variables que se van utilizar como contadores del bucle. ") que las separan aunque las expresiones se omitan. ya no se ejecutan las sentencias. Suele tener la forma: $variable <= límite • Finalmente.

11 . • O~O 1".. enter~ ••• ..*". 55 ... ·SiJ echo '$1"¡ i f IU_dO) ..una sentencia .> c/CENTER> e / 80DY> </H1'ML> El resultado obtenido se visuaHza en la siguiente imagen : 1""" h".'.. •• recomendable .1 Mo"".¡"".. númeroa $~·O.ltilrl...$i •• l( $a..."m B"oIdIP lI)(I~lUIIf ¡lb MOIjIa Ir e.I..-.de El siguiente ejemplo nos muestra su funcionamiento para imprimir In suma de los 10 primeros números: <HTML> <HEAD> <TIT~S>&..~ de loa 10 primero..78 PHP' A TRA vts DE EJEMPLOS CRA-MA $variable++ $variable-$variable+:valor NOTA: En calO de que dentro del cuerpo del bucle for sólo hav. ..· I """... 1:10* AjOIdj . llaves '(' y')' Aun a...l Sentenciafor la P1UI de to.eh<idoo l..cho'·" al •• Kbo .a Ooatrol</TIT~B> e/HEAD_ <BODY> <CEN'l'ER> <H2>Sentancia <I>for<fX></H2> <1php echo '¡a . 10 pnrna'0I rDne:r0l enteros es:l+2+3+4+S+6+7+8+9+10 . podfj prescindir del uso de la. echo 'cB>$auma</B>'¡ . torl$i_l. .....q--..l..tructur.-'IIIVQ01Ilb.1<_lO.1.

/IITKL .ltWl.Si.n.eh"..0..o.be'de''''n Ih.. de ContrQl</T¡T~g./1127.. . 1itp.0.CI RA-MA CAPÍTULO J: ~LRUcruRAS DE CONTItOL 19 El ejemplo consta de un bucle for que se repite 10 veces.ro_S. ["nltnl . : • ) l( • I echo ·"B>$f.. Oos.. De igual forma que el contador puede irse incrementando en cada iteración del bucle. .ctoria1<¡~·: < ICI!:ln'BJb . El siguiente ejemplo muestra este tipo de bucle para calcular el factorial de un número dado: H'Il!L:' "IIEAD> <TITLE»Estr~cture.' • !. l ¡ fotl$i.IIUdt "'("~I.. KM Sil ecbo l$i •• 11 i' ' .. . sumando en cada una de ellas el valor de la variable contador $i aJ contenido de la variable acumulador $SWM. El operador condicional se utiliza para diferenciar el número la del resto a la hora de mostrarlo por pantalla." . <IIIEAD> <IloOO'i> "CENTER> <IIJ»Sentencia <1>for</¡></H2> <?php $nwn..Jor2 ptC 1.. Sentencia/or S!=-5z4z3z2zl-1lO . •• El resullado se muestra en la siguiente imagen: ! .~~ ID 7Ull}(~ 10 121 MPI\IIII !r fll!llarldat J.t.mento ¡di:_ lL .$numero.Si>-l¡Si--!( $factorial' . echo '<BR><8>$mllnero!</B> . . I!I~ A. " $factorial . también se puede ir decrementando.1f.

Sfi 1a<_10 I $f11a. if!$oumaxo··OJ I echo' • ': $continuar_fal'lIl ) IIlae { echo'x". 10 imponanlc en los bucles es que dentro del bloque de sentencias haya. <H2>Sentencia <I.. <?php eebo °<TABLE BOROER_ '1'... Como ejemplo.80 PHP 5 A TRA vts DE EJEMPLOS ORA-MA Como se dijo anteriormente en la definición del bucle foro no siempre son necesarias las tres expresiones presentes en su sintaxis: el siguiente ejemplo nos lo muestra basándose en el código anterior: <HTML> <H. <TITLE>Estructuzas de Contrc1<ITITL2> <800'1> <CEU1'n. ~Hl>Sentftneia <I>for</I></H2> <?pt>p $factQrial"l: for(SCQntinuar_($numero>lj ¡$continu$c¡) ( eeho $numero¡ Sfactorial"·SnurnerO: $numeJ:o-.... si no ocurriera así... una que modifique algún comJXlnente de la expresión de evaluación pues.". c/C'ENTER> e¡DOOY> " -e/"""L_ Como vemos.. o) I ..O> <BOO'f'" <C.I\...tor«I></~2. el siguiente código utiliza dos bucles Eor anidados para construir una tabla de multiplicar de 10 x 10 elementos: . Dentro del cuerpo de una sentencia for podemos utilizar cualquier otro tipo de sentencias e instrucciones. 1. ) ) echo '<B>Sfactorial<'B>"." ~TITLt>E8tructur&S de Cantrol<'TrtLE~ c/HE:.°. for t Sfila... nos encomrarfumos con un bucle infinito.. al menos...

exp2. exp3): sentencias. w. endfer.. También se suele utilizar para traducir tablas de tipo luuh.oII . .ebo "c'J1t ALIGN='C'!Nl'ER'>"¡ fol' (Seol_l: $eol<"lO¡ $eol . I .. 3...... .-"~......... .JM1UI'Y:'ttCIl Sentenclafor Finalmente._.. El resultado se muestra en la siguiente imagen: o.... O</1'R>" I echo o<léR>o I ..... . ~ ~. ec)o 'C TAB~8>"J <. '~ . l$fila"$coll.... .. .. ..... CEN1'D> c / BOtly.2..' .. obteniendo en cada paso de la iteración uno de sus elementos componentes.2 foreach Esta sentencia nos permite recorrer las estruCturas de tipo urray de una fonna sencilla...CI RA ~1A CAPfTIJLO 3: ESTRUCTURAS DECON'TR:OL 81 .".1... ) ( ItCho "<TO>"..1 ¡'\ . . se debe comentar que también se puede encontrar la siguiente sintaxis alternativa para la instrucción fer : fer (expl....'11 ." " . .. tal y como veremos más adelante..... . 101.. 11_ lIto.

500"¡ $matriz[4J~"V6". no es necesario conocer la cantidad de elementos que conrorman el array.. emos mal acMI.in contenido $~t. fUnc::iof-."2"> ALIGN~'canter' ~.$i~~){ echo "<10> SmatrizlSi) 1 </TR> <¡~"I <T!t ALIGN"'center" BOCOLOR."yellow· . ) Lo que hace este bucle es recorrer cada uno de los elementos del array que tiene por nombre nombre_array. d4to. d. El bucle hace uso de un puntero inlemo que apunta a la posición actual del array (comenzando por la primera y siguiendo en orden ascendente) y que va actualizando de forma Ilutomática en cada una de las iteraciones. hay que combin. tal y como . <?php " foraachlSmatriz .. para conseguir el mismo !'e6UIt. La primera de ellas es la siguiente: foreach (nombre_array as $variable) ( sentencias. puesto que la sentencia mantiene un puntero interno para recorrerlo: <MEAD> <'l'ITLIt>ElIt.. $!lloIItriz(5) . ntruet\n de control wb. El siguiente ejemplo nos muestra dos formas de recorrer un array.r .-..ri~{Ols·eouqar·1 $matriz!lJ·"ford".teocIII."yellow·> <TR <?php forC$1.. asignando en cada paso el valor del elemento IIclual del array al contenido de la variable $variable.D> "OODY> <H~>sentencla <I>foreach<fI></H2> <?php 11 creaaoa el array y llenanQ.. <TAB~E " BOROeR_"l" CeLLPAOOING-"2" CELLSPAClNQ. poi' lo qu.0..riz(2J~null¡ $matr!z[J]s"2. 11 posición .82 PtlP 5 A TRAvéi DE ElEMPU)S C RA-MA NOTA: PHP3 no tiene incluidli . $m4t. 'res8t.nte Tiene dos sintaxis.ile con la. $valor) { .t.$1<6. . ..ado.ructura9 da Controloe/TITLE> </Mu. . 182. En la primera se utiliza un bucle for y en la segunda un bucle foreach Como podemos observar en el segundo caso. liBt y each..

además.. U.. Sentenciaforeach 00_....i I2'soo iv.CRA-MA CAPtruLO): ESTRUC1URAS DE CONTROL 8) echo '''TD> 'valor </TO>': </80DY> Como podemos observar en la siguiente imagen. .s2 La segunda sintruds (ue nos ofrece la sentencia foreach es la siguiente: foreach (nombre_arrayas $clave => $valor){ sentencias ) Con esta nueva sintaxis podemos realizar la misma operación que con la anterior.. la clave (o índice) del elemento actual se asigna a la variable $clave en cada iteración. a través de la variable $clave.. •• . además..~. se realiza el mismo procedimiento de asignación de valores a la variable $valor y. pero.a6d 10 2GIleJI1lI • r.. ¡¡. ambas sentencias muestran de igual forma el contenido del (lrray: I 'n. "". Con foreach no hace falta inicializar el puntero interno del array a la primera posición ya que se hace automáticamente.. es decir.6 [Ii2 ~SOO1v6r. rOl' •• k' . .. II oh".. nos permite conocer en todo instante la posición exacta (el rndice) del componente actual dentro de la estructura del array.~ 1>1..

J ."l" CELLPAODING_'2" CELLSPAClNQ_'2'> ~~ION..·center' <TR SGCOLOR_'yellow'> "TO>po. echo '</TR>'¡ <)TABL&> c/CEHrEJl> ~'80OY~ oo. $~triz[lJ. <ITP>'¡ echo 'c~ $valor <fTO>'. 'V6' . Svalor) [ echo '''TR ALIGN-'canter'>'¡ echo "cTD> $elav.i~i6n"/TO> <TO>contenidO"jTO> <('l'R> ""php foreach($~tr1z . I aa $c1ave . $motrit[3Ja'2.> cHl>Sentencia "I>foreaeh"/I></H2> "1php 11 creaaoa el array y llenaNO. GfII4t-ri Z [ .. .500".. de datos $matriz[O]_'cougar"¡ $motriz[lJ-'{ord". $lIIIItrh [6J _192 i BOROaR.IH'I'ML> El resultado de este ejemplo nos los muestra la siguiente imagen: Senlenclaforeac/l ...84 PHP'I\TRI\V~OEElEMPLOS CI RA-MA Veamos un ejemplo haciendo uso de esta sinlaxis: <H'llll.> <HotAD> <TITL&>ftatrueturaa de Control<ITrrLB> </IIEAO> "800'1> <CKNTD.clTH> .nu11¡ "TAa~F.

..cl'I'D> <Tn>contenido</TD> <ITR> <?php for. 182. $matriz['MOtor·J. </H!ML> El resultado se muestra en la siguiente imagen : ."V6·: '-'triz!'potencia'¡ .'2·> <ft ALIGN .. en el que el índice de cada elemento no es de tipo numérico.OR. <CENTER> <1I2~Sentencia <I>for~ach</r></H~" <?php 1I creamOB la matri~ Smatri~I'.500·.ach!$~triz as $key _ .in contenido '_tri~¡'fecha'l . null. Svalor)1 echo '<TR ALIGN~'center'>': echo '<TC> Skey </Te>"l echo '<TU> SVlllor «TO>'...\0" <TI~LE..odelo' asociativa ¡...CRA·MA CAPITuLO J: ESTRUcnJRAS DE CONTROL 85 Como podemos observar.&. ·center" eccot.. </TR> </TABLE> </CENTER> </BQDY."l· CELLPADDING-"l' CRLLSPACINQ."~. <1'D>cla". aunque una posición del array esté vacía (la ¡x>sición 2). se debe decir que esta sentencia se puede aplicar también a un array de tipo asociativo..·cougar'¡ $lI\II.t~uetural < illEAD. ) ?. El siguiente ejemplo muestra este tipo de utilización: ~HTML·· <11&. echo '</~R"".t(h [ '_rcll' J"" ford"' " posleión . si bien una posición no utilizada (posición 5) no aparece en este tipo de recorridos. $~trizl'ee·J.llow·~ . el recorrido no la sa1ta. Finalmente.·y. de Control</TITLE> <BODY. <TABLE BOROER.

sólo ha~ UIlII MntenCiII.. si ésta sigue cumpliéndose. 1M podr6 pntaandlr del UIO ele . ) Con esta instrucción se va a poder ejecutar un conjunto de instrucciones un indetenninado número de veces... pero se diferencia de ésta en que no incluye en su declaración la inicialización de la variable de control del bucle ni su incremento o decremento.86 P1IP 5 A TRA V~ DE EJEMPLOS ORA·MA Se n te n cia f o~llc¡' 3. .. siempre y cuando el resultado de comprobar la condición sea verdadera (debe ser una expresión que se evalúe a un valor lógico). se volverá a evaluar la condici6n. .'\dable ole"""". después de ejecutarlas. se volverán a ejecutar las sentencias. Oeves T V T A4ln . NOTA: En cuo de que dentro del cuefPO del bucle while. Si la condici6n se evalúa a true.1.3 while La sentencia while actúa de forma muy parecida a la sentencia for. Veamos la utilización de esta sentencia con el ejemplo del sumatorio de los 10 primeros números enteros: . se ejecutan las sentencias del cuerpo del bucle. La sintaxis de la instrucción while es la siguiente: while (condición) ( sentencias. Por tanto.2. dicha variable se deberá declarar antes del bucle while y su incremento o decremento se deberá realiUlf denlJ'O del cuerpo de dicho bucle. Esto se repite hasta que la condición se evalúa a false o en cuyo caso no se ejecutarán las sentencias del cuerpo del bucle y continuará la ejecución del script por la instrucción siguiente a la sentencia while. de forma que. IfICOIt .

. eslariamos ante un caso de bucle infinito.ebo '<Tll ALIGN-'CE:NTEJI'>'..- <1. IIOOY:.... . el cuerpo de la sentencia no llegaría a ejecutatSC nunca y si. . ... o<C'EN'I'EfI...um. por el contrario. $col_). Uil •• t. (SrUa'Scol). ' I S1"·1 . 4e'Control</TITLE> . <ICI!:NT!R> </BCD\'> </HTKL> Como podemos observar en el código. se realiza fuera de él. echo '</Tll>'. .. De igual rorma que ocurría con el bucle for.cho 'l. ~TITL!>Eat:uCLura8 </H~ de Con~l<'TlTLB> .··$i¡ toehc ($t •• 101 1 "$1 • • I "$.. la inicialización de la variable que se utiliza para controlar el final del bucle. ~J. mientras que su actualización forma pane de las instrucciones del cuerpo de la sentencia while. .. dentro del cuerpo de un bucle while puede encomrarse cualquier otro tipo de instrucción. cTITLE>~t~Ctur4.. siempre se evalúa a true. <CENTlR> <H2>Sent. whUe($fiholO¡ ( .le(Seolo10J I Kbo '<TI»'.....nela <I>while<fI></H2> <1php . aUN de lo. Si. 10 pr1. Es muy Importante comprobar la corrección de la condici6n porque.CU·o:-lOJ I S. El siguiente ejemplo nos muestra el anidamiento de bucles while para resoh'er el problema de la tabla de multiplicación de 10 x 10 elementos: <>W» _ . <?php echo '~TABLE BORDER-'l'>'.l.. '</TO:> . Scol.uaa-O¡ U-1¡ whil. H2>Sent...ncia <I>while</I></H2:. si inicialmente no se cumple. SUla •• .eroa nÚl!lero$ entero• • • 1 ": $.GRAMA CAPhuLO): ESTRUC11JaAS DE CONTROL In <.

la descompos1ción para valores> 1 I I Scaleular_($cociente>ll: Spotenci •• O. " UtU1:!:UIOII cociente ~ra poder modificar .ncla <!>whl1e"/1><!H2> '?P"P $nunullro_S040. e18l1:( 11 solo ae ~ueetrAn loa factores valido.." · : ? OI¡CVlTER> ".. I $divl. ir {Spotencia>O¡ ( echo '$divieor<SUP>Spotencia</SUP> x '. 11 ._$nu..lse.lltro inicial I $eocient.!> <IH!AD:> <800Y> .010 ~y~.obo ·o. echo o<B>$nWhero<fB> _ "..E>EatTw:tul'aB de ContJ:"ol</TI'f't. 11 primer divisor 11 probor $cSivleor-2.nt. contiene un bucle while en el que la actualización de la variable depende de vanos factores: <:HTKL~ <HEAO> c't'I'l't.ero. whilelScalcular) { lf($cociente'$dlvieor •• OI { $coelente/-Sdiviaor.ición ractorlal:<BR>".~. $potencia_O¡ I ? «/CDn'ER> </&COY:> </~> .:CENTER> ~Hl>S.r a 8S PHP ' A TRA vts OC EJEMPLOS ORA·MA echO "ciTA'U.or++.r_f. $poteru"i .1'8I:1DY> No siempre la inicialización y aClUalización de las variables que conlrOlan la finalización del bucle son tan claras como en los ejemplos anteriores.. que nos permite calcular la descomposición factorial de un número. . 11 ei el cociente ea 1 hemos acabado lf ($cociente-_ll ( $colcul.1 nw. . El siguiente código.

. El siguiente ejemplo nos muestra un uso básico de este lipo de sentencias para calcular el faclorial de un número dado: .. l ... while Esta sentencia funciona exactamente igual que el bucle while.2.. huc t.. se debe comentar que también se puede encontrar la siguiente sintaxis alternativa para esta sentencia: while (condición): sentencias.... 1 • Sentencia while DescomposIC16n factonli 504O =2 4 x3 2 1:. a1 menos... ) while (condición)...... l. el cuel1>O del bucle se realiza una vez. endwhile.. CAPITuLO): ESTRUCTURAS DE CONTROL 89 El resultado se muestra en la siguiente imagen: 1 . while es la siguiente: do ( sentencias. ' ti .. actun 80M ID. condición debe ser una expresión que se evalúe a un valor lógico.. 2!I01ü'..51 x7 1 x 1 Finalmente.. 3.e ItA-M.. U ...... excepto que la condición no se comprueba basta que se ha realizado una iteración (la condición se comprueba a1 final de cada iteración).. .a sin1 axis de l bucle do . Esto garantiza que.4 do ... aunque la expresión condición se evalúe a falseo Como siempre..oI 104 0 .

.-: .. Asimismo. Il_.. cuando utilizamos bucles... para ello... utilizaremos las sentencias break. . la condición de salida del bucle se evalúa después de que se hayan ejecutado las instrucciones que foonan el cuerpo del mismo al menos una vez.....2.. N~ .5 break y continue Cuando explicamos la sentencia swi tch..· do'acho x •¡ $faetorial·_$n~ftro: $nullla:ro. $nUlUro-6 : echo 'c8R><a>$nume~o!«/a> • ": $bctorial-l : $nl.llfle~o.~rue~u~a.. Sentencia do... de Control</TITLE> e/HItAD> «BODY> cCQrl'I[R> cBl>Senteneia «¡>do . A veces.. El resultado obtenido Sf" mUe5lnl en la siguiente imagen: I".. también se nos plantea la necesidad de finalizarlos antes de que sus condiciones no se cumplan...-_ ..• wb11e</t><IH2> . )while!$numero>l) ¡ . es posible que nos interese que la ejecución del cuerpo del bucle no ... .• wlril~ 3.. vimos que era habitual utilizar la instrucción break para interrumpir su ejecución una vez que encontrábamos la cláusula case que coincidía con el valor origen de la comparación.."" . C_ ..eho '1 • «B>$factorial</8>'.90 PUP S A TRAV~ DE EJEMPLOS O RA·MA <1m<L> d(tAO> <TITLl>a. <ICENT&R> c'BOOY> c/HTKL> Como se observa en el código.

es decir. I . El resullado es igual que el de casos anteriores de la resolución del factorial de un número dado..cho "1 • c8>$taccorl&l</8>-...net.ro •• l){ br. <I>break</I><fK2> $nu. ..ro_l5¡ echo ·c81t><B>Sn~rol</8> • ". <R2>Sent.. las sentencias restantes no se ejecuten y que vuelva a evaluarse de nuevo la expresión del bucle (si e':lI. d» ContrQl~/T[TLa> </IIEAO.000.· x ': ~f.D> ~ITLI>&ltruetura. . la condición de salida del bucle nunca se cumple. Las instrucciones break y continue se pueden utilizar dentro de los cuerpos de todas las sentencias de conlrOl de bucles. utilizaremos la instrucción continue. al alcanzar una ciena posición denlrO del cuerpo del bucle.UlYro· -: ir l$nw. El sigu iente ejemplo. que.etor1. while.CAPtruLO 3: ESTRUCTlIRAS DE CONTROL 91 . 5(actodal-l¡ lIhll. contemple ~iempre las mismas instrucciones.jste) continuando con la siguiente iteración: para ello.lla utilización de la instrucción break para finalizar la ejecución de un bucle: <JmCL> <Kv.k. oos muestra la ulJlizaci6n de la instrucción continue para sallar la ejecución de algunas inslrucciones dentro de un bucle: . por tamo. que obtiene los númerm múlllplo~ de 3 y 5 comprendidos entre el I y el 1. <8001'> <C'B:NTaJI> . El siguiente ejemplo nos mueslr.. (1) ( !ICho Snumero. desde el fer hasta el do . » </cmrD> </BODY> </HTHL> Como podemos observar en el código. estarfamos ejecutando un bucle infinito de JlO ~er por la existencia de la instrucción break dentro de su cuerpo.1··Snumero¡ $r.

lOS.. !orISi·lISi<1000.480.885.495. 195.270. 570.795. 840. 120.945. El resultado se muestra en la imagen de la página siguiente.750. sólo cuando encontramos un número divisible por 3 '1 por 5.!></H2> .C. éste se muestra por pantalla a través de la instrucción echo.555.345.225..240..0111 t$i'S 1" O)) I eontin\la.660.450.285.60. 165.. ISO. en el resto de las ocasiones.705.390. <H2 . 90.330.420..315..870.615..a de Control</TITLE> e/HEAD>o "BOD't> .-.855.210.30.645.. <!>eontinu8<c.UH) ( if (UU) !. echo 'S1...540.690. 300.45.. Sentenci. 135.255.465.810.585.780. 1 y lOOO. <jCSN'l'ER> </SOOY.405.360.825.92 1'IlP ~ A TRA V~ DE EJEMPLOS GRA-MA o(H'n!L ~ "'HEAD> ~7I~B>"truc~ur.720.615.<BR>o(BR.435.990.. 765. 180. El siguiente ejemplo muestra el uso combinado de ambas sentencias: . echo ""últiploa de 1 Y 5 ~tr.630." </HTML> " Como podemos observar en el código. '. 735. la instrucción continue hace que la ej«uci6n salte a la siguiente iteración del bucle sin tener en cuenta las instrucciones que aparecen por debajo de ella.915.525.900.930.975.75.375.960. Sentencia continue MúJup!OI de 3 y 5 enn 1 'f 1000 15.. 510..600.

> <. • ¡ $/IIultlplo .CRA·MA CAPtruLO J: ESTRUCTURAS DE CONTROL 93 <!l'l'III. 240.. 270.: <BR>cBR>' : $l1l\I1 t 1p10.105.45.. I 1. $1-01 "... ..coon ""''' 10 2llfJlOS301 ollllill " ..60.t~etura..\!» ''''OY> <O.. ifl$multiploa> ... " Sentencia break y continue 20 pomero.. 285." . Olll($as ! •• O)) { continua: echo 'Si . El resultado se muestra en la imagen de la página siguiente.75.. 135. ~5. .hUe(1) { $1.+.30..210. 120. de Control</T!TLE~ < HE. cH2>$antancia <t>break y eontinu8</I>~fH2> <?php ~ho ':lO prilOOcolI IOOltiploll de ) Y . if ((SU3 ( ."~".. 150.. . 180.90. d" Cunhul 1oI&lfl~ jL . . mUltlplol de 3 y 5_ 15. <TJrL&>t.0 . . 300.. 165. ~/cnn'ER> c!80DY> .'u c lu. 20)( break. Gracias a la sentencia continue podemos discriminar los números que son múltiplos de 3 y 5 de los que no lo son... 22j. La sentencia break finaliza el bucle una vez que hemos encontrado los 20 primeros. . . 195.m"....

el del bucle más inlerno que las contiene.. se debe comentar que ambas sentencias admiten un parámetro opcional con el que podemos indicar el número de eslrUcturas de control que deben saltarse en caso de que en el código existan anidamientos de bucles.cho $i •••.• • Como podemos observar en el código de este ejemplo.. no tiene sentido seguir procesándolo y lo que hacemos es continuar por el siguiente número gracias a la utilización de la sentencia continue 2 que nos pennite salir hasta el bucle for más externo.. Veamos cuál es su resultado: . El siguiente ejemplo muestra el uso de estos parámetros opcionales en la sentencia continue: <H'I'I!L> <MEAD> <TITLE>Eatructuraa de Control</TtTL2> <I/KEAO> <800V> <CENTER> <H2>Sentenc1aa <I>bcaak y continue</I></H2> c?php Sn\Ul\8ro"SO'O¡ echo "LOs divi80res primos de Snumero son:<BR><BR>"/ tor 1Si_1 ¡ $ i<_Snumero. si es priDo for(Sj"'2. Si . Las sentencias break y continue.1 811 un divisor if(Sn~ro'Si. Esto nos permite decidir el nivel de ruptura que queremos denlrO del bucle cuando se ejecuta alguna de estas dos sentencias. I { 1/ cOlllPCOball!Ol . ¡ I 1f tSi\$j··OII continue 21 • //ai llega basta aqui ea que . pr~ <c/CENTEJb </80DY> </KTML> .S:!<Si:$j·. por defecto. una vez que hemos encontrado un divisor del número que no es primo..~OI [ " ~robanlo. s610 saltan un nivel de anidamiento. e.• 94 PI-IP 5 A TRAVá DE EJEMPLOS C RA -MA Finalmente.

~HE1oD:> . • Sentencias break Y conlinue Los dMsore. pnmo.. </C!'Rl'EIl> C¡OOOV> ~ 'Hn-n.c:orrlftM).CRA·MA CAPiTULO J: ESTRUcruRAS DE CONTROL 95 I '"'' . para eso.TIT~:>S. El siguiente ejemplo mueslnt el uso de estos parámetros opcionales en la sentencia break: <>!TML. 1.7... todoa lotJ nÚZMIroa deada al 1 $n~ro·l: whll. 1 .~" Ui .lII12....1 1oI".5. ...~ '1 ~ <B>$factorial<!B><8R>'..D:> <80DY> «:ENTE" <?pbp ~Kl>Senteneis.. ._..$i>l.. $nUlllero .. fI. $texto. . 1¡ Ste~to • '<8>Sn~rol</8> • " 11 obtane. ~ho $texto.¡ H(Sfactorial>100) ( break 2¡ Stexto.2.w 10 l!lII~.'Sl x .~". n) ( Sfectoriel . una vez que encomramos que el valor de la variable $factorial es mayor de 100.oa el fectorie! for($i_$nwmero... debemos acabar el procesamiento de los dos bucles y. utilizamos la sentencia .3. ~ .> Como podemos observar en el código de este ejemplo.$l __ )¡ $[actorial'_Si. de 5040 son 1.... .tructuras da Con~ro1</TITLE> < IH2A.. <¡>break y continue</I>~/H2:> echo 'NU=eroa cuyo factorial ea ~nor que lOQI<8k:><8R>-1 1/ r.

". O) ( conl:1nue 2. S040: .. La siguiente imagen muestra el resultado del ejemplo: Sentencias bre4k y continllt: 11-1-1 11_2:r.96 PUP 5 A TRA vts DE EJEMPLOS =RA·MA break 2 que fuerza que finalice el bucle while..". ) Ilai llega beata aqul .2:$j<$11$j~~)( if($H!Sj. El siguiente ejemplo nos muestra cómo una pequeña variación sobre el ejemplo que calculaba los divisores primos de un número dado nos pennite encontrar el divisor primo mayor de un número: <"""'.. <H2>Sentencias <I>break y c?php continue<II></K2~ $numero .cho "El divisor primo ~yor del $n~ro •• .-1 ( 11 comproba=oa si ea un dlviaor if($numerot$i •• O) ( // CQl!\Probamoa lIi aa prime forl$j. $1. <HIUU» <TITLE>Estructuraa de Control</TITLE> <IHuo> <BODY> <C. loa nu-roa deSde 81 dado tOr( $i"'$nUllllero: $1>_1. -1 11 recorremos todo...l_1 31-3112:r..3x2)[1_14 Es muy habitual el uso combinado de ambas sentencias. primo echo "<B>$1</B>"1 break: </CEN'l'ER> </BOOY> " «HTHL> .a qua a.1-6 41-4:r.

. varios 5criplS."u. Esta facilidad del lenguaje se utiliza principalmente para la definición de librerías comunes ..:-.. de este modo. .. 11 olJ ..lA CRA-MA CAPfTULO): ESTRUcrtlRAS DE CONTROL '}7 el La imagen siguiente nos muestra el resultado: ~ I . la inclusión del fichero externo y su posterior evaluación.~ No . Deben ser consideradas más bien como conslrUcciones del lenguaje.l~ I ..3.l Sentencias breaky cont. Ambos pasos. una reutilización y mantenimiento del código más óptimos...3. cualquier código dentro del archivo referenciado que debiera ser ejecutado como código PHP debe ser encerrado dentro de etiquetas válidas de comienzo y fin de PHP. continuando con la ejecución por la siguiente instrucción. no como simples funciones. Cuando un archivo se incluye con include ( ). se realizan cada vez que el flujo del programa llega a una línea que contenga la llamada a esta función." contengan (sobre lodo si los ficheros a incluir contienen a su vez código PHP).3 INCLUSIÓN DE FICHEROS le Las funciones que abordamos en esta sección deben incluirse dentro de las estruCturas de control del lenguaje.~I.1 includeO Esta función incluye y evalúa un fichero externo cada vez que es interpretada.nue El dmsor pnmo mayor del 5040 e. TXT. pennitiendo.. Por esta razón.. elc. puesto que pueden innuir en gran manera en el flUJO de ejecución e interpretación de los scriprs que la.. la función genera un aviso o warni"g. HTML.. el intérprete sale del modo PHP y entra en modo HTML al principio del archivo referenciado. " " 3. y vuelve de nuevo al modo PHP al acabar de leer dicho archivo.. En caso de que el fichero a incluir no exista o su referencia sea errónea. 7 3.''''. Iw/Id ID ~tll • . La naturaleza del fichero externo a incluir puede ser de cualquier tipo PHP.

pie. que sólo contiene código PHP. cuerpo. for ($i _1.i6n de tichero.nteJ .98 PUP 5 A TRAVts DE EJEMPLOS O RA -MA Todas las funciones y variables definidas con anterioridad a la llamada a la función include () son accesibles para el código presente en el fichero importado.ultada: echo ·$ba .. inc. $i . El siguiente ejemplo muestra la utilización de esta función.. cabecera.bs ($expon.<OJ{ $re. contiene texto HTML y código PHP: El scrip' desde el que se realizan las llamadas a la función include () es el sigui eme: <HEAD> <TITLE>Trabejando con include</TITL!> </ KEAO> <"'DY> <CENTER> <H~>lnclu. Consiste en un ...e: I ifl$expanent. inc.$ba. se encarga de calcular la exponenciación de dos valores que se le proporcionan: .inc")¡ . ?php $re. El ámbito de las variables que se definen en los scriplS del fichero incluido depende del lugar desde el que se realiza la llamada. las variables tendrán ámbito local (a no ser que estén definidas con el modificador global)..I'cripr PHP desde el que se incluyen otros rres ficheros.ultado-l. en cualquier otro caso tendrán ámbito global. SUP>$exponente<fSUP> • echo ·<8>$r •• ultad~/8>·: y el tercero. $1<_il. Si la llamada se realiza desde el cuerpo de una función. De igual forma.ultadQal/$~e. sólo contiene texto HTM L: El segundo.</H~> <?php 1 1 •• incluye una cabecera htNl include¡"cabecera. todos los elementos definidos en el código PHP del fichero incluido eSlarnn disponibles para el scni" lIamanle una vez se haya terminado la lectura y ejecución del fichero incluido. t J ( $~ •• ult. lnc."o·.. el primero.

JL03: I!STRUCTURAS DRCONTROL 99 11 el fichero ·euerpo.eRA-MA CAPh'\. tI .•• 4782!1G' Como podemos observar.. y $exponente $baae-l: Se¡cponent.. g¡ Sexponerlt .in~· hace uso ae 1..e incluye un fichero que hace uao 1/ do v4riablao d~ f inid33 en 'cuerpo.·~G. includel'cuerpo. maR jIf ·11 ... variables Sbaa. . inc. inc. que las utiliza para realizar los cálculos.inc"¡. las variables defi nidas en el cuerpo del fichero principal Sbase y $exponence son visibles dentro del script contenido en cuerpo. la variable $resul tedo definida en este último sCriPI está disponible parn ser utilizada en el fichero pie. La función include () ~tructuras puede utilizane en combinación con otras de control de flujo. De igual forma. __ J.R> </BOOY> El resullado se muestra en la siguiente imagen: Hit 11 "' .pi . cuerpo " $baS ••11 $expc>ne%lt •• SI nc'<hr Wldth. 40""'.-cho '<br>-Se<¡unda inclusión de '(. El contenido del fichero se incluirá y evaluará sólo . echo "<br>Primera inclusión 4.. !'le <1\% Wldth . Inclusión de ficheros Ultime! re . ·'O'· .. lnclude (·cuerpo. 7.inc"¡. inc') : echo '~>Tercera incluei6n de 'cuerpo oc'<hr W..·>· includel'cuerpo.dth. ..lltado ..inc' include('pia 10c'I ?> </CENTt."Uerpo SbB .

Cuando esta función se utiliza dentro de estructuras de bucle o condicionales. en airo caso. Para ello utilizamos dos ficheros fact.-cho "1 . <B>$factorial</B>' ¡ " y divisores..""" lftl18settSnumerO¡ I Snumero .f lchero8</H2> . El siguiente ejemplo nos muestra esta situación.nue 2..nclude</TlTLE> <C"""". 1 IIs1 llega hasta aqu1 es que es echo $1. echo '<D«>~D>~n~erol<.EAL .orial. <R2>IncluBión de . el fichero nunca será incluido. $nlll<lero~- ) whilel$numero>ll¡ . ) prl~ " El cOnlenido del script principal es el siguiente: 1<I <lI.". podría obtenerse un resultado no deseado. <TITLS>Trabejando <"800Y> ~on i. do' echo Snumero. Si el flujo de ejecución del scn"pt nunca alcanza la Hnea en la que se realiza la llamada." X '1 $factorial'·Snumerol .lISi<t$n~ro.$j<$i¡$j •• ){ if!$i\$j •• O) ( conti.n~ $ factorial_1. lne.$í'~) ( $nu~ro son:<BR><BR>"1 1/ c~rob4mos ai •• un divisor i[:$n~ro\$i •• O'{ 11 comprobamoa a1 es pr1~ for!Sj_2. pues.ores primos de for(Si. l0.. '. siempre debe aparecer entre llaves.. ine calculará los divisores primos de un número: -7php lffliss8ttSnumerO)) $numero_l0¡ echo 'Los divi. que contienen el código necesario para calcular el (aclorial de un número: <. 100 PIIP5ATRAVÉSOEEJEMPLOS ORA·MA cuando se interprete la llamada.

:8:.o8'¡' lnclude ('divi.' + ".:7:.1 -3628800 El siguiente ejemplo nos muestra otra posibilidad de uso combinado de la función include( I con eSlrUcluras de conleol de bucles.2.1l. $pu~torio+~$numero¡ $numero-. denominados ficherol.·f. cuyo contenido es un scripl encargado de ca1cular el sumatorio de un número dado: c?php lf(lls.1[ 9:. hace uso de cuatro ficheros de inclusión.rnero>OJ: echo 'O • <S>$liurnat.c:torial' : . ESTRUcruRAS IlECONTROL 101 c1pll¡! SO~J:""eion.IP Inclusión de ficheros lO! "" 10.CAPtruLO). sólo se ha cargado e interpretado uno de los dos ficheros incluidos: 2tl i . if'$operac:1on~~'divi8OTe.oreli.1l.inc"¡I Como podemos observar en la imagen siguiente. el scripl principal define dinámicamente el nombre del fichero a incluir haciendo uso de un bucle: .. .: 6 x 5 1:4 1: 3. . inc a fichero4. echo "<8R><8>$numerol<la~ • " $sumatorio"O¡ do{ echo $numero.-prt.1ltp://121.1 •• ( lDClude('factorial. Para ello.et($numero) ) $nulMro-10.¡ )while($nu.orio< 'a>" ¡ Por SU parte. inc. inc·) : .

Para poder hacerlo.~ Inclusión de ficberos 11_'+0 . . _ .te ses un bloque de fundOn .HEo\D> cTITLE>Trabajando con lnclude</TITLE> </HEAO" o<SODY> o<CEN1'ER> ... o</CENTER> El resultado se muestra en la siguiente imagen: •.'. Incl~l6r1 de flcherOS<fH2> .inc'¡ $nu.~ ~"fL""'.:-4"""'+1+0 _ 10 PHP pennite que desde los ficheros incluidos se devuelva un valor: para ello utiliza el mismo mecanismo que la devolución de valores de una eltpresión (este mismo mecanismo será utilizado por las fimcjon~s. _ ...•• . Se puede devolver cualquier tipo de valores.$i++I{ $fichero.'ficharo· $l..~ . acompañada de una eltpresión. .. pero sólo un único valor (para devolver múltiples valores. </OODY> </HTMl. se utiliza la palabra reservada return. TRA vts OC EJEMPlOS O RA-MA > ."....)+2"] "0_' . Si de~pués de recurn hay más líneas de código.. ".ero-$J. dichas Hncas no se procesaron nunca.~.. como se verá más profundamente en un capítulo posterior). lnclude($ficherol. incluyendo listas y objetos.. 1 11_'+]+0_3 1l . el script deja de ejecutarse para devolver el flujo de ejecución al punto del programa principal donde se llamó a la función include ( ). En el instante en que aparece denlrO del cuerpo de un script una sentencia con esta palabra reservada. NOTA: En PHP 3 la sen/ende return no puede SpiJrec« dentro de un bloque de Hnlenclas • mano. " .o(H2 . que . deberemos utilizar un array)....> $fichero··· ¡ for!$i_l¡Si<5.102 PHP S A..

_ 'ea prUno</U><BR>'.• 'no ': $texto .ORA-MA CAPITuLO 3: ESTRucruRAS DE CONTROl."no '.-prieQ.-primozfal •• l break. for(St_2. se encarga de comprobar si un número dado es primo o no. eeho $taxto. ine' J ¡ if (J $pri1l101 Staxto . StextO . ?> El código del script encargado de incluir el fichero es el siguiente: 'O<TML> <HEAD> <TITLK>Trabajando con inclu6e</TITLE> </HI!.n'THL> . $pri~o. al ti~ divisor .ineludei· . 1 r i! $pr111101 $taxto . 1I probamoa ai 15 ea primo $numero_15.tintos da 41 ~~ Y la unidad itl$n~ro'$i~. echo $texto: ?> <ICDrrU> </BOOV> .$n~ro.{ 11 e~robamo. Su conlenido es el siguienle: <1php lf(!i ••• tl$nume~o}l $nWllerQ_10¡ $ ••. $texto • ·<eIG>·.. devolviendo una variable booleana con el resultado. '<BIG>·. El fichero a incluir es-primo..· </BIG><U>'¡ $pr llllO_inelude (· ••.'ee primo<fU><BR>'.</H2> 1/ probollos si 7 •• pd. $tI~ro·7.to.$numero.$i<$nunero/$i++. 103 El siguiente ejemplo nos muestra la devolución de valores desde un fichero incluido y su recuperación en el scripl que realiza la llamada. fic~ro..D)f $e. ."PrilllO..1)11" irno-true.· </BIO><U>'. $te. inc..AD:> <BOD'f> <aHTD> cH2>Ineluaión da <?php SprllnOl $textO. 11 di.ine·J .

. NOTA: E. no es necesario que se conozcan las características de implementación de los scriprs incluidos (nombres de la variables uti ljzadas): simplemente es necesario saber la nalUraJeza de los valores devueltos. u..3.lOl7) '. . Jos errores producidos por la redefinición de funciones o la reasignaci6n de valores a variables. PHP 4. Por último. con la única salvedad de que esta fu nción sólo cargará y evaluará cada sCripl una vez como máximo. 011.. kI. Inclusión de ficheros 7 es primo l j no e¡ pnmo Como podemos observar. " .0 p. j. es allow_url_fOPen del fichero de configuntelón php. Con esta función nos aseguramos de que un fichero s6lo se ha cargado una vez a lo largo de la interpretación de nuestro script. ini neceNno que 111 cfIrec:tM¡ este lICtiVa_ 3.. pode!" utillUll" esta ruroClonahdad.l.1" l..2 include_ once () Su fu ncionamiento es idéntico al de la función include (). evitando. ••• ". operación !SÓlO esta cksponible en wniones tupelIOI1I1 . de este modo.... 11..lfl!..104 PlIP S A TRAVils DE EJ[!MPLOS C RA -MA El resultado se muestra en la siguiente imagen: " .~. se debe comentar que el fichero pasado como parámetro a la función include () puede especificarse como una URL: incluso es posible incluir el resultado de la interpretación de un script en un servidor (dentro de la URL se pueden pasar variables a1 scriPl remoto utilizando las mismas reglas que admite el método GET del protocolo H1TP).. ""l.'¡'III) lllU..." . ~\.

> <1IEAIl> .lnc·)¡ echo 'cbc>Tercera inclusión de 'cuarpo.. Sbllse·9.O' >'.tne') </ClNTER> c/BOOY> " cfH'l'ML> Como podemos observar en la siguiente imagen.7 ¡ $.iac· inelude_onea¡'pis.ara inclusión de 'cuarpo.. cabecera ht..inc') : echo '<br>Pri. $ba. $expon. $ba•• y $exponente Sba .. el resultado es totalmente diferente al ser/IJI original en el que badamos uso de la función include ( ): .180 de variables definidas en 'cuerpo.nte·_JI include_oncel'cuerpo.lnc 1/ c~ Width-'40\ >': 1/ .. ine·IJ 1/ al fiehero 'cuerpo.E> </HI'!A(» <BODY> <CDlTER> <H~>lnelu8i6n da fieher08</H2> <>php 1/ s. Sexpo"ent_7. ineluda_onceC·cuerpo.inc' boca U80 1/ de l •• variable."t'!'U>o'rrabajlllldc) con lnclude<fTITL. iDC1~_once('cu~_lnc'): echo '<br>segu~ inclusión de 'cuarpo.lnc'<br lfJ. 2. incluye un.14th_'tOlt'»'.lnc'chr ...e incluye un ficbaro qua bace 1.4th-'.5 El siguiente ejemplo nos muestra su funcionamiento: Jm<I.xpontlllt.·S.l inelud __ oneet·e~cer •.eRA-M" CAPtruLO 3: ESTRUcnJRAS DB CONTROL 10.

rumtado .U! NOTA: EstIi lunei6n diStingue enlre que no n. Su comportamiento es equivalente a la directiva *include del lenguaje C.. pero con las siguientes salvedades: l .3 require ( ) Esta función se comporta en Ifneas genemles como la función include (). require () no puede ser utilizado con estructuras condicionales o de control de bucles porque el contenido del fichero rcrerenciado se incluye antes de que se evalúe la sentencia que lo contiene y se incluye siempre aunque la condición que lo contiene no se cumpla. ~ 'J ITInúsau. require () sólo incluye el fichero referenciado. no lo interpreta. No obstante... O. 2. si la línea en la que aparece require () no se ejecuta.106 PIIP!i A TItA vEi DE EJEMPLOS C RA·MA Inclusión de ficheros ÚltIm. tampoco se ejecutará el código del archivo al que esla llamada haga referencia.3. IU ~ pwcM no ser el aperado 11 ellnt6fprete de PHP . . es decir.oe tIIln dlttlnc:ioMl como Windows. eteetU aobre lri • llama operatIVo 3..

para evitar la carga en más de una ocasión de un fichero. .ORA·MA CAPITuLO). la cual tiene un comportamiento equivalente. En caso de que el fichero referencindo por require() no exista. 4. 3. ESTRUCTURAS DE CON"ffiOL 107 3. Se desaconseja pasar variables como parámetros de la función require ( ) • si bien este tipo de construcción funciona. require () hace lo propio con la función require_once ( ).4 require_ once ( ) De igual forma que include () cuema con la función include_once (1. se genera un error fatal que no nos permite continuar con la ejecución del script.3.

1 DELIMITACIÓN DE CADENAS Como vimos en el capítulo segundo. anteponer a [as comillas el carácter '" "). en la mayoría de los casos. cuando utilizamos comillas dobles. aunque en algunos casos se puede entremezclar el uso de los dos tipos de entrecomillado.. principalmente para insertar una cadena literal dentro de otra (:lU nque para este tipo de acciones también se utiliza el enmascarado [escaped] de llls comillas.- CAPiTULO 4 CADENAS El tratamiento de cadenas es de gran importanCia en el uso de PHP. ) o entre comillas simples (" ' ''l. c". agrupadas en tomo al tipo de función que realizan.. Se debe recordar que. es decir. el objetivo final del procesamiento de un fichero PHP c~l:1 relacionado con la generación de documentos (casi siempre documentos HTML). cosa que no ocurre si introducimos nombres de variables dentro de una cadena encerrada entre comillas simples. 4.. Por ello... Es obligatorio utilizar siempre el mismo tipo de comilla para rodear cada cadena. de las que veremos las principales. J . podemos incluir dentro de la cadena nombres variables o caracteres especiales que serán evaluados (sustituidos por sus respectivos valores) a la hora de m05trur la infonnación. una cadena está formada por cero o más caracteres encerrados entre dobles comillas (.iste un amplio conjunto de funciones para el manejo de cadenas. puesto que.

$c. .!I 1" ".. "'.<br>~br>· t 1> </CENTEP. sino construcciones del lenguaje.110 I'UP 5 A TRA vts DE EJEMPLOS = RA-MA Veamos un ejemplo en el que veremos el componamienlo de PHP ante cadenas con comillas dobles o simples.o~.</~ITLl> </KEAO> <6001"> . echo 'la ~. y cómo insertar una comi ll a doble dentro de una cadena delimitada por comillas dobles: <tm<L> <"BAO> <TITLB>1T~jandQ con Ca~..n. no soponan ningún mribulo de formato de saJida y sólo .. 11> ..> </90OY> </HTKltJ> ~ ""..cho 'la cadena "Seadeno' contiene.d...2 VISUALIZACIÓN DE CADENAS Comenznmos con las funciones que nos permilen visualizar y formatear cadenas de caracleres.dena '$codeno' cun~l. de este modo. . .oro' ~oaIIeIle Wl telorO 4. cadena \'Scadena\' contiene. $c. te.. permitiéndonos gestionar.'UVI"'lOI]) 1_ Comillas dobles y simples la udcna "1m. Ambas mueSlran información por la salida estándar. print (cadena): No son funciones propiamente dichas.d~<br><br>·. I .. la salida de los datos por pantalla: o echo (cadena).. 1f . $cadens<br><br>'¡ .l.'un tesoro'. echo 'l.:CEN'l'eR> <H2>eomill •• dobles y simples<IH2> <?php $c:adena.

Admite múltiples tipos de argumentos a visualizar.." ..baj&ndo ~/HP. "echo'. Como su uso nos es conocido.d. función <U>$funcion2</U><br>'. .cno</l> & <r>p~int</I></Kl> <?php $luneionl • ·pdnt· ¡ $tuncion2. algunos de los cuaJes se moslrarán directamente.AD> con C._ • 'CDn'Zl' . argumentos]): Imprime información por la salida estándar soportando diferentes formatos de salida..l. Esta cadena está formada por una ristra de caracteres. Imprime una cadena cuya estructura depende del formato descrito en el argumento !on1w(o. profundizaremos más en ella. los que . 1"""'· !lf't'w.51 . deberemos utilizar las comillas. El siguiente ejemplo nos muestra su funcionamiento básico: <lM'Kl.. Función print o printf (formato [.:\ ~"""""" !<uoId m 7lJ01O':.CAPh1JLD4:CAOENAS 111 admiten una única cadena como argumento en su !Jamada (cuando necesitamos pasar más de un argumento a cualquiera de estas funciones..."". como ocurre en los ejemplos precedentes). El resultado se muestra en la siguiente imagen: 1.1' ro.lDIlI . '1 ~"I" "" 1 . de los capÍlu los anteriores. no <K!AO> ~TITL*~Tr.n•• ~/TITLE~ caoDY> o:CFNI'ER> cK~>Punción <1>. " •• . prlnt 'Esto as una pruaba de 14 función <U>$funcionlc/U><br>'/ echo 'Esto as una prueba ~e :. mientras que olros.

para indicar si el resullado debe alinearse a la izquierda (carácter ". Un carácter de relleno ~pcional-. por ejemplo. Un i"dicador de precisión -opcional-. que especifica cómo se deberá tratar el dato. que indicn el tamaño mínimo de caracteres que ocupará el argumento tras la conversión. conocidos como especificaciones de cOIU'ersi6n. un idemificador de lipo de dalos. el espacio en blanco paro caracteres (valor por defecto) o el cero para valores numéricos.1o • Tntlm6talo carécter% como entero decimal como entero binario como entero como entero como entero como carácter como float o decimales como float o decimales como string caracter% Decimales Binarios Octales Hexadecimales (letras minúsculas) Hexadecimales (letras mayúsculas) Caracteres ASCII Punto flotante (signo decimal) Punto flotante (notación exponencial) Cadenas o x x e f e s . fonnado por un punto (". 3.") o a la derecha (valor por defecto). son utilizados para fonnatear la infonnaciÓn. que se utilizará para rellenar y ajustar el resultado hasta lograr el tamaño de cadena correcto.LL2 PILP S A TRAVés DE EJEMPLOS el M -MA van precedidos por el carácter "%". Finalmente. Un carácter de alineamienlo ~pciona l-. 4. 2. Cada especificaci6n de conversión se compone de los siguientes elementos (en orden): 1.") seguido del número de digilos decimales que deberán mostrar los números en punto Ootante. 5. Los tipos disponibles son: SIm_ d b Tipod~d. Un indicador de tamaño -opcional-. No tiene efecto con otros tipos de datos.

-> 03 01 € 600Ptu -> 03 61 € 700Ptu ->04. M> 'O~.60e 200 Ptu. 100 Ptu -> OO.$icllOO¡Si+_100) pr1nt~("'d Ptas.Sif$euro.8_9 : $dl..cm.~.llmllOOl .]86.a-:13 : prlntf ("s--. $ne.. <HEAC .. ·.2l€ 800Ptu ->G481€ SlOOPw ->OS4l€ l000Pw ->0601€ .: E . ' c9>Convertidor de Euros " $dia.ORA-MA CAPITuL04:CADENAS 11] El siguiente ejemplo nos muestra la utilidad de esta función para fonnatear resultados en pantalla: .Trabajando con Cadenas</TITLI!:> I <..fc/ I></H2> <I?php Seuro_166.%02d/%02d/\04d MM_c/B><BR"~BR . SsnYQ) I far (Si-100. _> 01 20€ 3(10 !'tu.2f e's".'EAO> <lIODT • .'Ttlb .·cBR>') I c CtNTEIl:> cJ 8ODY~ " C/H7ML:· El resuhado se muestra en la siguiente imagen: Función printf Cnanrtidor deEarul . -> 01 80€ 400 Ptu -> 02 40 € 500 Ptu. SanYQ"2002: $11'1.H2>JI\cnei6rl e t>print. TI...$i.

<H<AO> <TITLE~r.. No .. "< ITO><fTR:> \n' I ) .$i<atrlen($cadenal¡$i ++ l I echo '<TR ALIQN. <C!NT'BR> <H2. debe abusar del uso de estas funcIoneI cuanckI no hlya qua aplicar un formato especifico a los datos o el formato no _ Importante..</H2.. pero se diferencia de ésta en que devuelve unu cadena de cameteres.\n"..trlen<JI. o serlen(cadena): Devuelve la longitud de la cadena pasada como argumento.JnC/6n echo '1 concatenando laa cacIenaa con el opentClor' . • </TD><'I'D>" • $i.114 PHI" A TRA v6 DE EJEMPLOS CI ItA·MA o sprintf {formato ( .cho ·<T~C. .. porque se obtienen mejOfea reaultacloa haclendo 1. '. echo '<TABLE BORD!~'l'CELLPADDING_ 2' CELLSPACING_·2. o array. la cual lo habitual es a1macenarla en una variable NOTA.llow·>\o'.. echo '~?R BGOOLOR_'y...Punc!6n <I.3 ACCESO AL CONTENIDO Podemos acceder a cada uno de los caracteres que componen una cadena haciendo referencia a la posici6n que ocupan dentro de ella. 4. Para ello.1$0 de la h.<JTtTLe~ </HEAO> <BOoy. $clldena 1Si l . <?php $cadena_'Saludos'. argumentos JI: Es muy parecida a printf (1. <fCRNTD.bajandO con C&4en4. </H'niL> echo "</TABLR>\l1'.> <f80DY> . se hace indispensable conocer el tamaño de la cadena a recorrer. ec:ho "<TD>'. El siguiente ejemplo nos muestra un modo básico de recorrer los diferentes componentes de una cadena: <HTMLo.'canter'>'.rÁcter<'TO"<TO>PoBici6n<fTD>\n</TR>\n·1 for($i_O. de igual modo a como referenciamos los diferentes componentes de una malriz..

o strrchr(cadena. habituales sobre las cadenas es la búsqueda de caracteres y subcadenas componentes.-. cadBusq): Busca la aparición de una cadena dentro de otra y devuelve la subcadena comprendida entre la primera aparición de la cadena buscada (incluyéndola) hasta el final de la cadena en la que se realiza la búsqueda. se devuelve una cadena vacía.4 BÚSQUEDA EN CADENAS Una de las operaciones mru. Si el elemento a buscar no es una cadena. . En caso de no encontrar el carácter en la cadena. La búsqueda diferencia entre mayúsculas y minúsculas.) . se convierte a entero y se aplica como el valor ordinal de un carácter. ". cadBusq). La búsqueda diferencia entre mayúsculas y mjnúscula~. 4 • 4. para su posterior tratamiento. l . En caso de no encontrar la cadena.ORA-MA CAPtruL04:CADENAS liS El resultado seria: Función strlm • 2 . cadBusq): Busca la aparición de un carácter (aunque se utilice una cadena de búsqueda s610 tiene en cuenta su primer carácter) en una cadena y devuelve la 5ubcadena comprendida entre la última aparición del carácter (incluido) hasta el final de la cadena en la que se realiza la búsqueda. devuelve una cadena vacía. strchr(cadena. a = = _ .:. Dentro de este tipo de funciones destacan las siguientes: [J strstr(cadena. .

trchr!$cadena.'n"¡ '~/TABLE>\n'¡ " El navegador nos mostrarla: Funciones m-cIf.....'c/TO></TR>\n'J "CTR ALIGN*'center'>'.. .. ' yellOlol' >etrctu:" (e./TR.> '<TD>·_strrchr($ca4ena..'yellow'>eadena</Tl»'.:. '$ea:r1 ' I <lITO>' . "<TO>".'l·~LPADDlNG-'2' '~TR ALIGN. ': [J stristr (cadena. \n".-.Scarll .tr~ehr</I><'H2~ <?php Se~denaR·saludo. .ad.t~eh~ y .. ": ..116 PIIP5ATRAV~DEEJEMPLOS O RA-MA El siguiente código nos mueslnl el fu ncionamiento de ambas funciones: <IM'HL> . 'Scara')eJ~': echo echo </CENTER> <!IIODY> </H'n'!t.·<l/fD>c/TR.'do': $ca~2 para todo.dena .$trchr($ca4ena.. .MEAD> ~TITLE>TTab4j4ndo o( con C~deno8~/TITLE> IHl!:AD> <lBODY> <emt'ER> ~H2>PuncioneB <l1>..¿ do.. echo 'eTO aoooLOR_'yellow'>etrrchr(cadena.<TO echo fICho echo echo echo echo echo echo echo echo echo CELLSPACIND-'2'>\n'l BGCOLOR. '$car2')</TD>': 'cTD>' .'</TO></TR>\n'/ '<TR ALIGN-'center'>'¡ • c"rO BGCOLO'R" . ocho ·"'TD>$<.:::. '~TD BQCOLOR_'yellow'>etrchr(cadena."'/'l'D..strrchr($c~dena. yeIlow' >lIItrrchr !c:adeno. 'pc" : '~TABLB BOROER. salvo que ésta no diferencia entre mayúsculas y mi núsculas.$c~r2J. y 6trrdtr S~"I*'~ <i9! r"'lO.$c~rl) ..Scarll . "<TR AtIGN~'center'>'r • <TO aGCOLOil . '$carl' I </TO>' ¡ 'cTO>' . $ca~l".'~/TD></TR>\n·1 echo "cTil ALlGNa'center'>'..'eente~'). cadBusq): El componamiento de esta fu nción es igual al de la función strstr (l..

.~ .. <H2>PUneion.$car) . desplz]): Encuentra la primera posición de aparición de una cadena a partir de una ciena posición (si no se indica. <l>. CELLSPACINC_'2'.trstr y atristr</I></H2> $ eadena-'SaluÓG8 para todo. La búsqueda diferencia entre mayúsculas y minúsculas.atratr($cadena. el valor por defecto para el desplazamienlo es O).cho 'cTD>$cadena</TD></TR>\n'.8> </HEAD> cllOOY~ « . 'Sear' )</TO>'.'2· Sesre'Pa' .. . echo '<JTA8l. aaRD2R~'1'CRLLPAnDlNO.atriatrl$cadena. .> Veamos el resultado: Fuadones"""Y m7Itr o strpos (cadl..cho '<TD>'.B>\n': <ICEN'I'SII..<{TITt. . '$esr' ) <litr» o ..cho '<Ta ALIGN-'centar'>'¡ echo -cTC BGcoLOR-'yeUow'>atriat:rtc44ena.""/TO><JTR>\n'. eeho '<TABLI sehe '<TR ALIGH*'centar'><TO BOCOLOR_'yallow'>cadena</TD>".. ..... </8OO'r> IHI'JII... cad2 [... echo '<TR ALXGN-'centar'>'/ Beho '<Tt! 8QCQLOP.'yallow' "'stratr (ead~..\n'. ..'.ORA·MA CAPhULQ4:CADENAS 117 .$ear) . El siguiente ejemplo nos muestra el diferente comportamiento de estas dos funciones: • '!Al» «TIT'L!>Trabajando coa Cadeftu.. echo '<TD>'.'< /TO><ITR>\n'.

. todo •.d.'</TD></TK>\n'¡ echo '<JTABLB>\n'/ e/CENTRR> </BODY> El resultado que obtenemos es el siguiente: Funciones strpM Y smpos .</r></H2~ <?php $cadena··SaluOol pa~.. Si el elemento a buscar no es una cadena. se convierte a cnlero y se aplica como el valor ordinal de un carácter.cho 'cTD>$cadenac/TO»cfTR>\n'.. echo '<TR ALIGN·'center''''¡ echo '<TC 8GCOLOR.> .f')cfTD»'.> .~.'yellow'>.'</TD></TR>\n'.' l ' CELLSPAC'lNO-' 2 '>\n-: aebo '<TR ALIGN.'1 $car-·'do" ¡ Icho "<TJUU.'Sc.'clntlr'><TD BOOOLOR.trrpoa¡cadena.E 801\DER'" 1 ..rl.</~·J .. carácter): Devuelve In posición de la última aparición de un carácter determinado en una cadena (aunque se utilice una cadena de búsqueda sólo tiene en cuenta su primer carácter). . IIR PIIP5ATRAVt50EEIEMPLOS ORA-MA o strrpos (cadena... CSLLPAPDlNO. Veamos un ejemplo del funcionamiento de ambas funciones: <>m<L> <MEAD> <TITLE>Trabajando con <taSAD> "'800Y> Cad.... '- " .. ttc:ho 'cTR ALrClN"'cente.·. .~/TITLE> <CEm'ER> <H2>Funcional <I>strpaa y atr..'yellow'~.t~a(c.8trrpo8($c.$c.na. En caso de no encontrar el carácter en la cadena.·yellow'>e.1· ~ __ . se devuelve falseo La búsqueda diferencia entre mayúsculas y minúsculas.• t~($caden. :~pralodot -~.$c.PQ.r')c/TD>': echo '(~·..f'>"¡ tteho '<TD BGCOLOR. H'!'III.dena.f1 . echo 'cTD>' .den. 'SC4..

2' CltLLSpACrHG . se abandona la búsqueda La búsqueda diferencia entre mayúsculas y minúsculas. máscara): Obtenemos la longitud de la subcadena que está formada s6lo por caracleres no contenidos en una máscara (esta (unción es la complementaria a strapn (1). </CKm'KR> </BODY> El navegador mostraría: . <CENTER> <H2>~ciQne. ·'c. '<fT~</TR>\n'. .</TD>". .ho o</TABLE>\n".·5aludos para todos.pn y 8CTcapn<!I></H2> c?php tcadena. '$ear'.e RA-MA p \ CAPlnrw4:CADENAS 119 o strapn (cadena.pn ($cadan". acho "<TR ALION..r')(/~". Una vez encontrado un carácter que no está contenido en la máscara.'y.trspn(ca4ena. a strcspn (cadena.~ Cadenas<fTITL8> <8ODY. <I>str. máscara): Obtenemos la longitud de la subcadena más larga que esro formada sólo por caracteres contenidos en una máscara. Una vez encontrado un carácter que está contenido en la máscara."1 $car. se abandona la búsqueda.. Veamos un ejemplo con el funcionamiento de ambas funciones: <1m<!. La búsqueda diferencia entre mayúsculas y minúsculas.lItrc.nóo ~Dn <IHU.Scar).. </HTML> ar. . echo "<TD)' .atTspn($caóena.llow')..' 1 'CELLPAOOING" ."<fTO></TR>\n' .'yallaw'>atrcspn!ca4ena.cho "<TABLI BOItbER. <.·OO"1 .'centar'>": echo "<TO BOCOLQR. ' 2' l>\n" 1 ~ho "<TR ALIGN*'center'><1D 8GCOLOR*'yellow'~cadena</1D>'1 acbo '<T~$cadena</~</TR)\n"¡ echo "<Ta ALIGN"'canter'>"1 ~ho "<TO BGCOLOR.cho "<TO)" .EA<» <TITL~Trabaj. $c"r) .

P-~ '.·c/~</TR>\n·1 ·-c~$c.nal.llow·~. ·<l'tV></TR>\D··"·_ _ _ _ _ _ _ _ _.' :o-c:adana2</'fTI>".eÓlm.'Do') ¡ . _ _ _ echo '<1'0>' . :. y O. cTITL&>Trabejando con Cadenaac/TITLZ> c/H&AD~ <BODY> <CENTKR> ~H2>Funeion •• cI>stremp y c?php $eadl.120 PIIPSATRAVIlsOEEJEMPU)S CRA-MA Funciones ftn]JIf Y stl cspn [ -.>o ')'ello.eatt. cad2): Se compona igual que strcmp ()...Scltd2.trc.5 COMPARACIÓN DE CADENAS Otra operación común con cadenas es compararlas para saber cuál es mayor.. c. "<TP: ALIGN .treasee~/I~</~~ echQ echo echo echo echo echo sebo .. o excepto en que no diferencia mayúsculas de minúsculas. ~ . ·center·>·· 'cTU BOOOLOa-'y.k:.d2<1TD><ITR>\n'¡ '<TO>'.':z..aa.~(e6d.cedene2)<'TO>'1 ." o -=-=~·--=l cM.• trclIseeaap($cadl.$cadll echo '-cTR ALIGN_'center'>'..\n". " I '<TD>$cadl-clTD></TR>\n": '<'I1t ALIGN . ' cc:atar' ><TD 8JCOt. 'c'rR ALIQtI .trcas. Veamos un ejemplo con el funcionamiento de ambas runciones: drn<lL~ <HVJ).BLB BORDER .. ' center' >-cTD BOCOt.. si la segunda cadena es mayor que la primera: mayor que O... echo '<TI) BGCOLOR_'yellow'>.21 </TO>". cad2): Compara dos cadenas y devuelve un valor menor que O.1. .-' yellow' >ea<lenal<rro.PAI)DJ:NG_' 2' CBLLSPACD«J.stTCapI$cadl. Dentro de este tipo de funciones destacan las siguientes: o strcmp(cadl.oR..'Ateoeióo"¡ $ead2-'ateocióo"¡ . ' 1 • C1tLI.. si ambas cadenas son iguales_ La comparación distingue enlTe mayúsculas y minúsculas_ strcasecmp (cad1.a.p(cadenal. en caso conlrario.eho '<TA.\o')1 !i 4.

.. "<TR ALIGN_'center'><TD BOCOLOR. . atrnCIIIPI $cadl. atrnClllP I$cadl. _ . sólo que permi te comparar los long primeros caracteres de dos cadenas. $1ol'lgl_5: $long2_10..1... ..:000 '</TABLE> c{CmrER> </BODY> n' .'y.. long): Funciona como strcmp ( ).dr. $long2 J • </'I'tI></'I'R>\n" I "</TABLE>\n"l ~ I .'2· CELLSPACINC_'l'>\n'. ~ • . '<TR ALIGN~'center'><TO aGCOLOR. CADENAS 121 I .llow'>caden.I"...Om<L> <HEAD> cTIT~. se usará su longi tud como long para la comparación. 2 -~ 011 Funciones strcmp y slrcarecmp .1Inc1Ón _q._<IoM1 <.trn~(caden.'12J4561890': $cad2_'12J456'. $cadl.de~.ORA·MA CAptruLQ 4.0. Si a1guna cadena es menor que el número de caracleres a comparar....'center'>·. '1_ . dwl 1.l</~D~·¡ "<TO:>$cadl</'I'D></n>\n". _ _ . "<TD>'..nter'~"1 "~BOCOLOR.eadena2.bajando con Cadena8</TIT~1> e/Ii!Al» <800Y'" <H2>Funcionea c?php <I>8trn~/l></H2> $ca41. .c.$longll'/~·.a2) o o strncrnp I cadl.. "<TIt ALIGN·'c. . "<TD BGCOLOR_'yellow'>strnacoCcad"'. .."""'-2) -t <Uli.'y..'yellow'>. $cad2.l.. : --~ <IHTML> " El resultado se muestra en la siguiente imagen: ....<1< . .. Veamos un ejemplo con el funcionamiento de esta función: .$lonqll "<TD>'. Diferencia mayúsculas de mi núsculas. cad2....llow·~c4~ena2c/~~·: "<~$cad2</~<ITR>\n"... $longll • </TD></TR>\n": "cTR ALIGN...onp<u.(~.. echo '<TASLE echo echo echo echo echo echo echo echo echo echo echo aoROER·'1'CEL~PAOOING.1.

". excepto en que no diferencia entre mayúsculas y minúsculas. a strnatcasecmp (cadl. cad2) : Se compon. echo "cTASLE BORDEfl_' l' CELLPAODING .: ."J "cTR ALIGN~'ceDter'. $ced2.tr~1 $C~cn. ' 2' CELLSPACINCl_':I' >\n'.llow' >c. $cacU¡ .".> «CENTEfl> <¡90PY> "oo. .ornu. echo '<TR ALIGN'" center' :><1'0 BGCOLOR-' y.'y. echo echo echo echo ecbo echo echo '<TD>$cadl</~</TR>\n'l 'cTR ALIQN·'c.d.<TD "<TD>$c~dJ</TD>c/TR>\n'l ~. "C 11'O></TIl>\n" I "cTR ALIGN_'center'..c. Veamos un ejemplo con el funcionamiento diferenciado de strcmp () y strnatcmp(): <H'rML' "'litAD" <800'(> <TITLE>Trabajando con Cadenae</TITLE> </HEAI» <H2>Func1one8 ':1php <I>strn4t~</I></H2> $e8di-'lOOOO Pta'.a4amal</TD>'.. excepto en que utiliza una comparación "nalural" de las cadenas alfanuméricas.'2S00 Pt.122 PIIP S A TRA vts DE EJEMPLOS CRA-MA I " ."1 "cTO BOOOLOR. . Distingue enLre mayúsculas y minúsculas..enter'. cad2): Se comporta igual que strcmp (l.~2<'TD.tlow'.'yellow' •• ~rCDP(cDdcn~l.a igual que strnatcmp ( ).: El resultado se muestra en la siguiente imagen: Funciones st7wcmp 4 o strnatcmp (cadl.cadenD21</~"¡ "c'J'D>.·.

no I . Un tamaño con valor negativo indica cuántos caracteres del final de la cadena no se tendrán en cuenta....• RA-MA CApfruLQ4: CAI)ENoJ.. Entre las más utilizadas están: o substr(cadena.6 OPERAR CON SUBCADENAS No siempre nos interesan todos los caracteres que componen una cadena. Los argumentos enteros pueden ser números negativos de modo que: Una posición de inicio con valor negalivo significa que se debe comenzar desde el final de la cadena.. pudiendo de forma opcional decidir el tamaño de la subcadena a recuperar.. Para ello conlamos con un conjunto de funciones preparadas para extraer subcadenas de una cadena original.. inicio L tamai'lo]): Devuelve la sulx:adena que se encuentra a partir de una posición dada y llega hasta el final de la cadena original.S 123 .. .. /CDlI'E1b .echo ·<T~o . "<ITO><{TR>\n'! echo o<{TABLE>\n'.</TITLB> .> El resultado se muestra en la siguiente imagen: Funciones stntatcmp cadena! cadl:aal ~100oo~3 ~ PE.. ""'' D> <TITLE>Trabajando con Cllden".!IChO o <TD BGCOLOR-' yellow '1>IJtrnlltcmp (cadtlOlal.d_MlI. .Scad21 . sino que s610 estamos interesados en trabajar con un conjunto.<:ao:kr~J -1 4.. . </80DY> " fHntt.cWla&l) cad.• trnatc=p($cadl. ca&lrla2) C/TO>""·C '. ttRqI(c..

. La cadena .> eeDo echo echo echo eeho eeho ocho echo echo '<TC aacOUQR_'yallow'>subetr(c«dena.5 A TRAV~ DE EJEMPLOS '!lWÚ» cSOOY> cCENT2Jb <Hl>Pun~ivn •• <l>aubstr< 'I></M2> <?php $c«d.Sinil. $in11. . .- rae! [J substr_replace (cadl.$iniJl .d"". inicio [. '<eTO BGCOLOR... . ~ .na. ocho '~TR ALIQN-'cOnt~'~'.!lk2) JOJbl1r(e~dena.2) N~!~c1lJena. cad2.2. o Funciones substr ~~\lena .8uhstrlSc«den«. 8ubstr (Sc:adena....go" S...eho 'cTD BGCOLOR_'yellow'>eub8trlcade~.d..124 PIIP.o]): Devuelve una cadena que es resuhado de la sustitución de parte del contenido de una cadena original (indicado por una posición de inicio y opcionalmente por un tamaño) por el contenido de otra cadena.$taml)<:TO>'..Sinil..eho '<eTR ALIGN'" ceDtar' ><1'0 I'IGCOLOA-' yallow' "clIdena< ITD>' ..murc1elllO ~11ol'O rub~c.. Veamos qué muestra el navegador con el código anterior: t .LPAOOUtGs' 2' CELlSl'''Cl~'2''''n': .....S l ni2)c/TD>'j '<TD>' .:\c«dena. tarnaf!.$t~l ..l.. ·<TD>· . ~hO '<TD>Scadena</TD></TR>\n'.¡.¡ • • e-- ... 'c/TO>c/TR>\n' I '<TR ALIGN~'center'>'.. 'c/TD></TR>\n' .2. DL1 • 21 Sio12 • -2 r St_l • 31 Sttua2 ~ -3 ¡ ecchO '<TABLE 8OJtDER-' 1 'CEL. »:do . Do.$lnl1)C/TO~'j echo ·<TI»'.'~r~l. echO 'cTR ALtGN.• ubstr($caden4. . 'ye11ow'>sub8t.Sinil. '</TABLE>\n'.1I17QC! . $ttulll) 'c ITD>c/TR> \1'1' ¡ • <'I'R AL1GN-' cantar' >' ¡ ' cTD 8acoLOa_'yellow ' >substr{cadena...Gts m1 1<!TD>'/ • <TD>' . sub8tr ($c«d8na.3) rel &0 rubJtr(c. 'c!TD>c/TR>\n' . S ini 11 ."..'centar >' ....

·~ureielaqo·¡ $<:&(12.vbstr_replacelcadenal.$inil. ·. \n' : echo '</TABLE"\n'." <¡SC:)Y> " ." c/TD>< In".·c/TD></TR>\n·J echo 'cTR ALIGW1'center'>'¡ echo '<n> BGCOLOR_'yellow'>". cadeoa:!. echo '~TR ALIGN.'yel1ow· >cadellal</TD>". $cac!2. echo echo • <TO>" . $tlllll2/ ..- y el resultado oblenido es: .cadena2. Un tamafto con valor negativo indica cuántos caracteres del final de la cadena no se tendrán en cuenta..Staal)<iTD>".$~1<¡~·. echo "<TC 8QCOLOR*'yellow'>"¡ echo ". $ in! 1.ubetr_rep14c. $cadl.1m<. • 2. echo "<'rR ALICN~'t8Cter'>'1 echo '<'rO 9GCOLOR_'yellow'>". 'ublltr_replate ($ea"1. echo ".cadenol.eubstr_replate($cadl. echo • .nter'>". Distingue entre mayúsculas y minúsculas.- = CAPfTUL04: CAI)[NAS 125 e RA-MA original no sufre ninguna modificación. $tam2 • -3: echo '<TA8LE 9OROER. StlUllJI ' • c/TD'»</TR> \0'. <11 '-:ENTER. echo '<TR ¡\LIGN='center'><TD BGCOLOR.$C4IIdl</'l'1P<I'TR>\n".$ca02. $C:4d2.cadena2. substr _replllcé ($c4dl. $inl:'¡ • -21 $tMll • ~. $1ni21 ' '</1'0>< In>\n".'l'CELLPADDINC*'2' CELLSPACINO-'2'>\n'. Los argumenlos enteros pueden ser números negalivos de modo que: Una posición de inicio con valor negalivo significa que se debe comenzar desde el final de la cadena.ubBtr_replace{cadena1. echo '''''rO>'..Sinill . $1n12) </TO>' ¡ '<1'0>'. "<TR ALIGN1'center'>'¡ "<TO 8GCOLOR~·y.Sinil. $in1 1. Por ejemplo: ·:HTML' ~!ieAtl> <T!TLE>Trab4jando eon Cadenaa</TlTLE> </HEAD> ·iIOOY> <C!N'T~ <H2>FUneionee <?pnp ~I>~atr_replace</I></H2> $eadl. Tt):>$("~</TO:><'TR"\n·: eehCl "<Tll ALIGH'" center' ><TD 8GCOLORr' yel1c-.ublltr_r@plate {Sea"l.lc4denal..-123'1 $inl.'c.llow·>·. echo "cTC>'.' >eadotNt2< ¡TD~· : echo "<TD. echo echo echo echo • sublltr_rep1acfl (c4d'~m41.$inill<ITD>".

o. I echo '<TABI.SR> <Hl>Funcione.tr_~~lac8</I><IH2> <1php $cadena. </CDITER> c(BOO'i> .126 PHP S A TRAVÉS DE EJEMPLOS C RA-MA o str_replace (cad8us. cadena): Devuelve una cadena.<'t'D 8GOOLOR-'~11ow'»>-tr6n<JTD>'..llOW"'1 echo 'str_replac.> cHI!:AO> <TITLB>Tral»jando con <lHEAD> Ca~a~ f't'ITLE>- <aoov> " '. echo '~TD'$c&dB</TD></'t'R'\n'l echo '<TR ALIGN_'centar'. cadRee. 'c/TD><JTR>\n"¡ echo 'c/TABLa>\n'. echo 'c't'R ALIGN_' cantar' >~TO eo:::cn.>ma. Por ejemplo: . <I>. ..reempla.$cadenal.. La cadena original no sufre ninguna modificación.reemplazo</TD>'¡ ecno "<'t'O>$cadS</TD></'t'R..• tr~eplac. por otro contenido en la cadena original.!~tr6n. 'c/rD>" 1 echo ·cTD>· .-el ~rclelago vuela aobre el lago") $cacSB"'lago'l $ca(25a' -t-\GQ_.$cadS.cho '<TD>$C4dena</1'Ol>~/TR'\Il': echo '<TR ALIGN-'center'. que es resultado de la sustitución de todas las apariciones de una subcadena.(ScadB.<'t'D 8GCOLOR_'yallow'. Diferencia entre mayúsculas y minúsculas.> .'2'>\o·.E 8OROER_' 1 'CBLLPADOtNQ.'2 .oa-' ~llow' >ca4ena< ITO>'.\n'l echo "cTR ALIGNa'center""¡ echo 'cTO BGOOLOR-'y./HTML> y el resullado obtenido es: . CBLLSPACIHG.c~ena)·.

". echo echo echo echo echo echo echo echo echo '<TR ALIQN..dena.na</~D></TR>\n·.." 1" ~)Il171 . cadRee): Devuelve una cadena.C RA·MA • CAPITuLO 4: CADENAS 127 1..'2' CELLSPACrNG. '<TO BGOOI~R.'2'>\n"! ·<TD>$ca4.. Por ejemplo: .t" ><TD 8GCOLOIt« 'yeUow' >cadena< /TD>" I . ct>. La cadena original no sufre ninguna modificación... por sus correspondientes caraeleres dentro de una cadena de ~usti lU ción dada..·ce~ter'>·. .... <lIOlly.".. que es resuhado de la sustitución de cada una de las apariciones.gu"¡ $c... el ~. 'l"" j . $clldB. I ..R> ."Erurcielago·.'</~</TR>'n') 'c/TABLE>\n". ¡>C6o ~l ~ lIM"t~lI¡o vuela~I""!-~...zo~</TD>'¡ ·<T~·. W""I .'ce~ter ' ><TO BGCOLOR.p.~~ h.. en la cadena original. .S<f1"U></'Nt> \n'..bsjando con cadenaa</TrTLE> «.dS~ .. <H2>Pun~lon..'/ellow'>atrtr(caden.~.tctrl$c. .ree~l.1.$cadB." 8 .l1ow'>~tr6n</TO>·1 '<TD>$cad8</TO></TR>\n".. cadBus. '<TR ALlOO_'ceatel"'><TO BGCOLOR"'yellow'>I"_pl. . -<""i»Scad..'y.TR ALIGN1I' c~t. lf'IlIL> <l<!AI» <TITLE>~.. cClNTE. . '<tR ALIGN....dS-'Aau". '--I l~ 11f_~~t(Pr~~~jelmwt~~~<i"~obre ~l-LAOOo strtr(cadena.. ."a. de cada uno de los caracleres de una subcadena.. echo '".trtr<fI></H2> $cadana.'l'CeLLPADDING.$c. . ~ho "<TAaLB BORDER._ Funciones str_replace ..~o</'l"I»·. Diferencia entre mayúsculas y minúsculas..trón.

.'c~nter'><TO BGOOLOR. $matri:a l .tr~l"<' 1>< I H2> $c. el segundo parámetro e~ un llrray asociativo que tiene información sobre los reemplazos a realizar. <:tIJ >I\mc iOAeB <:>php "l>. eeho eeho echo echo echo echo 7> C/CENTER:o </aOOY> </Ht'Ml. '<TR ALIGN_'center'>'.128 PIIP5A TRAVasDE ElEMPLOS CI RA-MA El re~ultado se puede observar en la siguiente imagen: Funciones strrr strtr (cadena.d.n. $catr1z('4')_'A'. '<TO BGCOLORs'yellOW'>strtr(csdana. .• </l'O>-</TR>\n' 1 echo '</TABLB>\n'.90'.·yellow·>~~triz</~·1 '<TD>$matriz</TO></TR>\n'.matriz) (/TD>'J • <1'0>' • strtr (Solla.~·~ci.na. ~ho "<TABLE eoRD!R~'l'CELLPADDING_'2· CBLLSPACINQa'2'>\n'. $matril ( 'o'j-'O' J $lNItr1:a ( 'u'j_'u'.:o '<TD>$cadeaa</TO></TR>\n') '<TR AL1GN. echo "<TR AL1GNn'center'><TD eGCOLOR-'yellow·>cadena</TO>'. En este ca'\o. array_reemplazol: Es la fonnll alternativa que permite esta función. Su uso se mueSlra en el sigujente ejemplo: o ~}I"fJ'!:"~ <HEAO> <T1TL!>TTabajando con "IIEAD> CD~a<'T1TLE> <8OOY> """"'.l..

'c 'TD>c /1'It>' n' .. $patron2' ) c.. 8(:.. ni rl ~te PHI' q<o: 'e lIIIbMI mIy~ p-* la ". ·' echo "<1'0 8OCOLOR_'yeUow' >subatr_count (c. ..o. echo 'cTP ALrGN~'center'>'. '. _ " •. c'I'I1': ..r· .n.".. ee~ .. ruo..TO>\~": ALIQN·'cent.trrKI <!lEAL... CELLSl>AC I NQ_'.') . b/lsad.nta ~ra la'.¡:'" \n" : Kho "cTR ALION~·center'>·.. "H2>runcióll cl "S'.21 ..-. MJIt ~I""U~"".trO:ll· I <1m . '..n.dena.:ount</l . Diferencia entre mayúscula'i y minúsculas. I _n.. < 80"'> cCEm'ER .E>Trabojaudo c.n ..a.. l 'I'Af!lLE>\n' . cubn: lar ICtrII<A$ b. TO~·.lbstt" _r. '$"pa. ee "lo • ~ ~ ac· :O:.(1e~ '"4I')..."EI l..NTER). c { ("7. $patrc.' echo ·c~· •• ubstr_count(Sclldena."" creación de si t ios We-b" . ~ho 'cTO 8OCOtoR·'yellow'>cadena< '~c~$eed."c'TO>crrR>\n". F. Por ejemplo: ·.. c/H2 .. subatr count $cad . $cad.' J 'CELLPADOJNO" .lllbr. . . util1Lan moyoritarlam.oP:"... $patrol\2..:¡." en el lengl..'. n ~ Función substr_counl cll<k'lol.t (cadena .PHP qua s. o ".. C?php """'> $patron1.' yeUow' >sub8tr_cour:..s".ibro cubre las técn1c....ua611 « #lO' Web 1" 4 ..c.. '~Y> c/lnM! El resu ltado se muestra en la siguiente imagen: 1.:J substr_countlcadena.Spatronl) .ITO>' . ? :. echo • <'tASLE OORDER". patron): Devuelve el número de apariciones de una subcadena dentro de una cadena. Scsdena .denll..bJll"_f~\III{~.l8je'. depas</TITLE . SC". w.• .

C$cadena) . scho "<TO BGCOLOR_'yellow'>chop~cadena)</TO>'¡ echo " <TD><pre> " .n.'yellow'>cadena</TO><TD><pre>$cadena</pre></TD>'. s t rlen (chop ($cadena) ) . echo '<TR ALIGNs'center'>'. o trim{cadena): Elimina los espacios en blancos que se encuentran al principio y al final de una cadena de texto.pacios por delante y • por detr'. echo '<TD 8GCOLORz'yellow'>ltrim(cadenaJ</TO>' seho '<TD><pre>'.'</pre></TD>'¡ echo '<TO>' .·</pr.1m I $cadeM) .tri".'y. echo '<TO>'. echo '<TO BGCOLOR. '</pre></TO>". Recibe como argumento una cadena de caracteres y devuelve como resultado esa cadena sin los espacios iniciales y finales.7 MODIFICACIÓN DEL CONTENIDO 4. rtr.1l1' I $eadena) 1 ' '</TO>< /TR>\n'. " </pre></TD>' ¡ scho '<TO>'. echo '<TR ALIGN_'cantar'>'. echo '<TO>'.chop($cadena). echo "<TR ALIGNI'csnter'>'.tl"lenllt. echo '<TJ'l ALIGN_'center'><TD colspan_2>wnbap/</TD>'. echo '<Te BGCOLOR.J</~·: echo '<TO><pre> ' . strlen I rtr. echo ·<TD>'.rlen($cadena) . Recibe cumo panlmt::lro una cadena de caracteres y devuelve la mi sma cadena pero sin los espacios iniciales. '</TD></TR> \n· . ltri~ y tr!m</I></H2> <7php // 6 e.rila($cadenaJ J '< /TO></TR>\n '.' abcdefghi '¡ echo '<TABLE BQRDERa' 1 'CELLPADDING-'2' CELLSP~CING·'2'>\n'. ~t~lm.'</TD></TR>\n' .llow'>tr~(cad.• 110 PIIP S A TRA V~ DE EJEMPLOS C RA·MA 4. $cadena.ltri~($eadena) ..strlenttri~l$cadenaJI .1 Limpieza de cadenas o chop(cadena): Devuelve la cadena argumento sin los espacios en blanco y caracteres de fin de línea que se encuentren al final de la cadena. echo '<TD BOCOLOR_'yellcw'>rtrim(cadenal</TD>'.7. o rtrim (cadena 1 : Se comporta igual que chop ( ) . Veamos un ejemplo de estas cuatro funciones: <H'n(L> «HtAD> <TITLE>Trabajando con cadenas</TITLE> </MEAD> d!ODY> <CDn'EJ'l> <H2>Punciones <I>chop. echo '<TD 8GCOLORc'yellow'>tamano<fTD></TR>\n'/ echo '<TR ALIGNa'eenter'>'. o ltrim(cadena): Elimina espacios en blanco que se encuenlran al principio de una cadena de te¡c:to. echo '<TD><pre>'.'</TD>\n<TR ALrGN~'center'>'.Bt.></~'.

_ . _ __ ~ __r"... y trlm ... <T1TLE>Trabajando con cadeDas<{TITLB> «80DY'" C/!!EAD'" <CINTER'" «!!2>PUne16n c 1php cI>.~ . 11. ~ I. 4.Pad (cadena . o STR_PAD_BOTH: Intenta rellena con el mismo número de caracteres por la derecha '1 por la izquierda..' . ".. _ lO. _t. __ ·· _ _ . t~~! ~ ~."... .~t .cho "< / 1'ABL!> n"s ? </Ct:NTER> </BOPY> </HTML~ El resullado que se obLiene es el siguiente: '. Funciones cltop...._ --.. CI RA-MA CAPtrul04 _CADENAS 131 . . ltri". . " " .... es el espacio en blanco) hasta que la cadena resultante tenga la longitud deseada... _.1m.. Opcionalmente se puede indicaT el modo de relleno con los siguientes valores: o STR-P1ú>_RIGHT: RelJena por la derecha (opción por defecto).. . ""... long): Rellena una cadena con un carácter de relleno (por defecto.. ~..•• "" .~~ ... Veamos un ejemplo de esta función: <>mQ.7. <"""'....tr~d< / l></K2> $eadena · ·012ltS6789" .- _"'Ot>. .. r<J'" " • o str.. w.2 Relleno de cadenas .~I <!lo. o STR_PAD_LEFT: Rellena por la izquierda.~. " . ' • Q.

< .. . . Recibe como argumento una cadena y devuelve la misma cadena con los C3r'dClereS alfabéticos en minúsculas. $1 onQ... STR. IICbO "<")1 Al. $cat.JtlOB1) 0I234~9 OI2145~ 1IJ.~ >--\n· I . Q.. ---J ] '" I'\·f- Función SIrJ ad -:"Padtc1 dma.1: BORDER""l'CD. 'Scer' .$long. Sear.'YIIllow'>....."center'>".3 Conversión entre mayúsculas y minúsculas Conviene una cadena de caracteres a minúsculas. .p&d(c/ldt!na.· El resu llado se mueslra en la siguiente imagen: '~. Ir eo-_ .STR-PAD_BOTHI~/TO>'.tr"'p&d(c&~.. .fOId( . 20: '.l. .LPAOOING-'l' CEL!.'yellow·>8tr-Pad(cadene..'~". -" '_'" 1fIloo'.S~PAO_ L8FT)<ITD>·l echo • <1'0>' . el strtolower (cadena): .'y.enter'>"¡ IIcho "<'1'0 8OCO~R..SPACING-'2'l>I. IItr.I <So.~PAO-KtGHT) _·< / ~~ / ~R"\n·: ALIGNm·eentlll">·~ IICno '<TR IIcho '<1'0 BGCOLOR.J>AD_1.che! '~TR BGCOLOl.' ') tlJ..lltld ($cadena.IGN"'lOe'nte¡"·>": echo '"<TD ..". IIC'ho "cTD BGOOLoR.PAD_LEtT! ..T1»o.$lang... .. $long. $lonq. '$car·.'yellow'>.sn."'"1 eclto "<'I'II: Al.EFT> 1I1 ~.PAO.tr.:i!O:_'.20. atr--Péld ($e&del'ta.. Scal' I _.ol. eclto "<TO>' .BO'l'It) .If"""" .. . •• . "</1'0>< ITR>\tI" .$long.JIId(cadena. 'eentllr''''. ~ D+ __ t .. ' }1illow' >.pad eSe&derut.tr-p&dCcadene.7.<.~_PAD~[~I< ' TD>"t echo ·<TD~·. '<1 TI»< I1'II>\n ' ¡ liCitO "</TABLE>\n"/ </CBNTIUI> < / BODY. 'Seer' 1<1'trP" I echo "<'rO:>'.II .$long.tr-P8dC$cadena.aIIQ'c. STII_..STRJ'AD_BOTIiJj: OI234S61119 • 4..llow'>eadena</TD><~$eadana</~\n·: ALIC.n rllPjATRAVEsDEEJEMPLOS Slong • 20: See¡" • ... .Scar..~ " < 1IITKt..eho "<TR ALIGN. '$cer'... Slong. ec~ "ero aacoLOR . ~ O O I~". ...SI'R_PAD. . "~.34~/09 J QJ"Id(tÑllwl..".lItr... echo "<1''''81. .20:' .

a.'yellow'>. o le~ "<rD acooLOR~·yel1QW'~ucfirst([r. ~TITL!~~ab4j.LIGfI . siempre y cuando sean caracteres alfanuméricos.·<.TO.oR_· yello.. echo "<TR ALIQN_'right >".B. echo ·cTABL! 8ORDRR. ' ". "..'</TD></TR~'n".CAPtruL04: CAOF. siempre que bte sea aJfabético. con Cadena.llow·>ucword${frBBe)</TO>·J echo "':'r'O>'. <l>strtou~r.PADDING< '2' o o C'!:LLSPACING~' 2' > \n-: echo "c1t ALIGN~·riqht'~·: et"ho 0<'t'D BOCOLOR_ ~llow >t~asa<f'l'D><TO. . Beho ~<1'P: AJ. echo "~TD 8GCOLOR..T~<¡TR>'n'. CI ucfirst. hemol de prestar atanción a 1'1 caracterfltiCallocalel propias de PHP..·~ .trtouppar{fr"I)~/TD"·. ITa. CI ucwords(cadena): Se Vamos u ver el funcionamiento conjunto de todas estas funciones en el siguiente ejemplo: <1rHL> • HEAO.NAS 113 Funciona de forma contraria a la función anterior. ucf!rlt y ucworda~/I~/Bl> <'P"" $fr•••• • •• ludos PARA todoa . Btrtoupper ($fr.ndo ~illEAo.. echo '<TD>O ostrtolowet ($fr4sel .."..... echo ". ucword$ ($tras8) "</'1'0>-< I'I'R> \n' . "C/TD></TR>\n' ..86' .·1' CELt. de modo que IfIfIglmoslall que necelltafTlOl comporta ¡guaJ que la función anterior.IGN""right'>4¡ Icho 'cTO BOC01. sa1vo que ésta convierte a mayúsculas el primer carácter de cada paJabra que compone la cadena. 8t~tolower. eTO"" .r~N_' right'''·: echo '<TD ~OLOR~'y.. echo '<TR o\r.".trtolower I fr •• el "'. Convierte una cadena de caracteres a mayúsculas.$frlllut . • riqht· . echo .~¡7ITLE> <800\'> <C8NTlrJb ~J~runc1ane.(cadena): Se NOTA: Para hacer un uso correcto de esta funci6n.)</TD>·¡ echo "<TD~'oucfirst($fr~sl) .. CI strtoupper (cadena): encarga de convertir a mayúsculas el primer carácter de una cadena de caracteres....... RLB>\n·: o Y obtenernos: . 'n° : echo ""'I"R .

o~2~ . \ \..ripcslashes (cadena): addcslashes ( ). l.. (.. ").o. +.4 Enmascaramiento de caracteres Al generar documentos. Al estilo del lenguaje e. comilJas simples C') y barra invertida (\). _ .!lf~~ 4. Realiza la operación conlraria a o quotemeta (cadena): Devuelve una cadena de caractcres igual que la original en la que se han escapado Jos caracteres especiales: . J.Idol PARA lOdol ."~'~~. [J st. los caracteres con código ASCII inferior a 32 y superior a 126 son convertidos a representación octal. .!oOol d "WOlIll1l_ s~PJ.134 PHP!i A 11tAV~ DE EJEMPLOS ORA-MA Funciones strIOllppO.. '. .rludoI ~. [J o addcslashes (cadena): Nos pennite enmascarar cualquier carácter que desce el usuario.!..) y Mm invenida (\).-.y). ucfim y IICWO" ~'.. aparezcan enmascarados. PHP cuenta con las siguientes funciones: o addslashes (cadena): Devuelve una cadena de caracteres igual que la original en la que se han escapado los caracteres especiales comillas dobles ("). $.~ SIbiSH PAltA. 1.) h nb. para que el intérprete de PHP los considere como a otro cualquient. *. esto es. es habitual que los caracteres que lienen un significado especial (metacaracteres) aparezcan precedidos por una barra invertida (". strtolqwer. comillas simples (.. stripslashes (cadena): Tiene una función contraria a la función addslashes () ya que devuelve la cadena resultante de eliminar las barras invertidas que protegen los caracteres comillas dobles (").~S~AL~UDO~~PARATO~ .7. Para realizar operaciones con caracteres especiales.

"c/TO>c/TR>\n".E> 'BODY> <CENTER> <Hl>puneiones <?php <1>~~. stripcslash •• (cadena) cITO>' .'HlW» <TtT't..• tripcela. </BODY> c/H'nfL> El resultado oblenido es: Funciones addslaslfe:s y srripslaslte:s .E>-Trabaj~ con C4denaa</TIn.or\\S\....!$~denal ..dena</TO>\n·: echo "<'1'R ALIGNz'caoter'>'."n-1fIOI:&::ta(~ P~~~~ """'(cHmo) po&lJoo{\"I...·c.'</TO></TR>\n'¡ echo '<TR A~IGNm'center'>'1 echo '<TD BGCOLOR.' 1 'C!LLPAODINQ-'2' echo '<TR ALIGN~'center'>'..... ~ho 'cTR ALIGN~'cent. ~ho ·<TO>'." t -<~ pao..l"lIIhelll y scripslashea</!><IHl> ¡ CELLSPACING~'2'>\ft'l $cad.h•• ($cade~).TD>c/TR>\n'¡ echo 'cTR ALIGN~'csntsr'>'.". .. 1... ':<~111 : !. 'yellow'>qUotematlll (cadan. echo '<TO>'.. . CADENAS 13' Veamos con un ejemplo el funcionamie nto de las funciones anteriores: <lI'TML> 'BfW» .he.hB.~..... "c/~c'TR>\n'. echo '<TO aocoLOR· ' yellow'>etripslash.'</TD></TR>\n"z echo '<'1'11. .CRAMA CAPtruLQ 4. ALIGN_'center'>') Beho • .dana)<'TO>·.: /TD>' .quotemeta($cadena)..eTO BGCOLOR_' y..la. "Sl <) ..t: . seha 'c/TABLE>\n"/ c/CENTER . echo "<TD>'.tlcw' :>addcaloshea (cad_mi. echo '<'1'0 8OCOLOR.:.. I'<'ho "<TD 8GCOLOR"·y.ddsla. seho ·cTO>" .addalaahe.1 ..'path_["\uar\$usuariO"¡ !\usr' echo '<TABLE BORDER..llow·>caden&<no"<~$c.{--.(Scadena) .[..strip.l</TD>' i ..·~11ow·>..aÓdcal •• h8s($cadena... 'SI' ) ...r'>·.s(cadenalc/TD>".--. eCho 'CTO 8GCOLOR_' yallow' .~::.1:t!L~)...na.u-I·JI. echo '<TQ>'..(c...r.

. .'. /HEAD> <BOUY> cCEN'TER> <H2>Función <I>atrtok</!></H2> c1php Sp.na~ 11'1» \n° : echo "<:f'It ALION"·center'''".tron.""" ..e.d.. subcadenas.'2' BOC:~~.'R> '11)" : $datoS•• trtokf$patronl.dentl~/TO~.5 División de cadenas a strtok(cadena.eho 'cTR ALtGN··een~er·>·: echo -"'ro !IQCOLOfI. ~bo "cTASLE BORtIIm. '$p4trO~'I< TU.... IIC'ho "eTO eoLSPAN.ubc.• 136 PIIP~ATRAVtsDEEJE.'..~toS·. e<.d'IUI<I'l~>·.to2:dato3:4atQ4.\n".tOI • atrtokl$cadena.ndo con Cadenas</TITLE> ...bo "C/TR>\D'. "'ha "<':"7. Sa. divisor): Divide una cadena en diferentes Veamos su utilización con el siguiente ejemplo: .1 BOCOLOR.7.'/ Scadena.$c. . </1I00V> " </li'l'ML> La solución se muestra en la siguiente imagen: .llow· "e.-ha ·oC'tO>$d.."tI'»..·yel~ow'>subst~_count(c4den4.. ¡ ( ~ho "<'1'& ALIGN_ ceoter "'.d.ato8</TO><1 .Spatronl.'!'CBLLPAODINQoo'2' CELLSPACINQooo'2'.·datol. 'y..H&.\1PLOS CRA-MA 4.¡ Sda t. <ICENTER. scho 'c/TA9LE>\n"......\I»o ~T1TL~·~r6baj. -yellow' >. whU..

(JTD>. separador]]): Permite marcar una cadena en porciones diferenciadas de tamaHo menor. incluso."-"/ Scadena_aux.. '$ ••p' )c/TD>° J .eho "<TO>Sclldeml_aux. echo "cTA9LI!: BORDER.Slong. echo 0<TD BQCOLOR_ 'yellow'>chunlL~lit Ceaden..·cTD 8OCOLQR··yellow'>ei!ldena</TD>".C RA-MA CAPITuLO 4: CADENAS ]37 Fu. Podemos indicarle eltamafio de estas porciones e. echo "cTR ALIGN.'l'CELLPAOOrNG. '10ftQl. chunk-split(Scadena. o aplit (patron.cló.·2'>\n'.'2' CI:LLSPACINO.$aep)¡ $produetoa • aplitlSsep. nrtot CI chun}csplit (cadena (. Scadena_auxl.'eent~'>·J echo. No modifica la cadena original. El número total de elementos del arra)' puede ser elegido a través de un parámetro opcionaL Veamos con un ejemplo el funcionamiento conjunto de las funciones anteriores: <llEAO> cTITLE>Trabajando con < lUWl> '80DY> Cad~oc/TITLE~ cCItN'l'!!b ~H1>runcione8 cI>chun~$plit y splitc/I></H2> <?php Scedenag"el mutci~l4go vuela en el lago"/ $long-51 50ep.(/TR>\n·: . el carácter o cadena con el que las separará. KM • cTD>$cadena< 1'1'O><fTR> \n· I edlo 'cn ALIGIIJ-' canter' >". cadena): Devuelve un arruy resultado de dividir una cadena en diferentes subcadenas. long [.

.. echo 'cTR ALIGNo'eeoter'>". • 'CENTEltil' </SODY> </HTML" El resultado se observa en la siguiente imagen: l .... e....:TR ALICN... . s. echo "....o ... 1 . El número de elementos del array puede ser elegido a través de un parámetro opcional...[ J38 P.'yellov· COLSP1\N.$i«COWlt ISprod\lctosJ -1¡ $14 . cI. \n·- .. pero con una cadena en medio de ellos... ..'2'>"..- "N •• ..d .. cadena): Devuelve una cadena resultado de unir todos los elementos de un array en el mismo orden en el que aparecen. Veamos con un ejemplo el funcionamiento conjunto de las funciones anteriores : . -ao.. ... r:J a<iou ~bd..... cadena): Devuelve un array resultado de dividir una cadena en diferentes subcadenas.m' U "11 ...opII(.1'O>$producto.daI:: opW(c...... ) o\~ . .eb~6plitlc4denA.u.. '$~'}J</TO><ITR>. .. ------'-"" ...plitt'$Bep' fOlC"l $1_1 .. 11 _ ". ) '.m>$i</'l'O>c.k-""" "... o explode (patron.a~ . S o .IP5ATRAVÉSOEEJEMPLOS CRA-M.$long. s.. eI~ ':» d_ lpII( '. Kilo '. <..n'.. K~ • ..'ceIlter'). _ ~ .s ($i I c/ro>c TR . o implode(nexo. ... r. .. " ..'" l' ~_ ..": ~tw "<TD 8GCOLOR....

Sliftdta)</TD>'.·S¡ ..xo.$dato..cho "<TO 8GCOL08. c/BODY> El resu ltado se observa en la siguiente imagen.'yellow'>cadana</TD><TD>$cadana</TO>\n': echo 'cTR ALIGNc'cantar'>'¡ echo 'cTD COLSPAN.. .datoa)<!TD>·.'yellaw'>Úftplode¡'$nexo'. <[>explode • i~lode<fI></R2. echo 'c/Tlb\n'. <IIIW» <T!TLB>Tr~l~cSo con Cadotn.. .($patron.>mI!. for($1_0.. ~Hl>FUnc¡on •• " $patron.$cade na.CADENAS 139 .'l'CSLLPADDING_'2' CtLLSPACING-'2'>\n ' .> ~ho 'cJTABLE>\n".eho .$limite)¡ echo ' cTABLE BORDER.i~lodefSn.cho -CTR ALIGN-'center'. </CaTEA. · </TD></TR>'n·1 • .-CI RA·MA CAPITuL04.n</TITLJbo <¡IIItAD> <BOOY.. </1'1'00. .'. $llmit. /TR»\Jl · .~ ·~·.$i<$limite:$i++)( echo • <1'R ALIGlf'" center·"· t . $cadena*'datol-dato2-detol-dato4-d&toS'/ $datoa • exploa. <C>:NTD. ..eho '«Te 8GCOLOIt-·yellow'>hbc.). Sn_xo··".o. echo 'cTD>$dato.(S1}</TO><fTJt>\n·: I . echo ' cTR ALIGN-'center'>'¡ echo '<TC BGCOLOR.cadena.--".'2' 8GCOLOR-'yellow'>explode('Spatron'.~ $te/TD>".

to3 JUbc... .5 A.._ _~I . TRAVÉS DE EJEMPLOS . PHP proporciona las siguientes funciones entre otros: o htmlspecialchars (cadena 1: Se encarga de convertir los caracteres con un significado especial en HTML en entidades HTM L según la tabla de la página siguiente C.8 RELACIONADAS CON HTML Gran parte de las cadenas con las que trabaja PHP tienen como función convertirse en partes de un documento HTML que será enviado al usuario.. 2 d... ~ .. M1cadcM.'0 t . 0". &gt. UtIoo~ tt'" . & o Traducdón a entidad HTML &-amp. &quot¡ &lt.datcl) Ldato_~<b.tol _~_ ~ _. Paro.... e-. O 1" hllp/lc:Jc~ I Funciones explode e implode ~ 1·~2-dato3·ciI104·<ilco:. d. facilitar algunas de los problemas que tiene la transfonnaci6n de texto en código HTML válido.ubeaokna 4 tmpIodr(".....adena 3 _dat04 _ datoj _. < > o htmlentities (cadena): Es similar a la función anterior. t'¡dma...r.• 140 PIIP...~~to3 dawI dato5 4. salvo que esta función traduce todos los caracteres :l su correspondiente entidad en HTML... aplode(' •....~) ..

echo 'c~R. $clave u Svalor) echo " [co. OI</TO~". "< ~<.. « TASI. ( 'SCIld.· ~Hl>FUr~16n <1:>count_c~rsll~.linu.<JrR··.iblc: de esta función: .rsl $cadenll.I _c~rs ($caden4. l).9 OTRAS FUNCIONES o chr (entero): Recibe como argumento un valor entero correspondiente a un código ASCII y devuelve el carácter asociado a dicho código.. :J:>". $1I'.<TD BGCOLOR~'yellow '>count_ehar8('$cadena Icho '''TD~'. TR>' .e¡ve).'. a count_chars (cadena (.._ 1'<' $~. modo)): Cuenta el número de apariciones de eada carácter dentro de la cadena. pero s610 los caracteres con frecuencia de aparición superior a O 2 Como el O.!:> </80DY. < flrl'M: - .~ <H<M» c'la'U:'EJCI!:\Ilo de la funcl.na'.CRAMA CAl'truL04. '._cruu:ail '</'l:!TLZ:> cCENTI:. "o<ml BGCOLOR. for_eh 1$!!I&Itria e. &eh. CADENAS 141 4.denA "el ~urclelago vuela en el lago".. valores son: o Devuelve una matriz asociativa con el valor del carácter como clave y su frecuencia como valor (valor por defecto) 1 Como el 0.' yellow' >count_char. O).E llOROSJl. '«O" : $valorl " echo "< 'TO. chrl$cl.atr ia_count_chll. l) « 'TD".' . El modo en que devuelve eSla información depende de un parámetro opcional cuyO!. pero sólo los caracteres con frecuencia de aparición igual a O 3 Devuelve una cadena que contiene los caracteres utilizados 4 Devuelve una cadena que contiene los caracteres no utilizados El siguienle ejemplo nos muestra una ulilización ¡>O!.ón <IOPY> count.eh '«'l'R~cTD • «.1></H1> dAB1.

El siguiente ejemplo muestra la utilización de ambas funciones: '!<EAD> <TITLI>~robajan40 . .."""'. echo '<TA8L! BOROER··1·CELLPAOO!NG~·2· CE~L6PAC!NG*·2 ' >\n.. eeho • <'rO>' . echo '<TR ALtCNa'center'>'¡ eoho '<TO BOCOLOR~'y.f 142 PIIP 5 A. ' yellow' >stT_repeat ¡ . . l' er_icbi IJII-_ . 5) (¡ 2) (i 1) ~ 5) [ m 1) C a 1) (o 2) (r. nUJfLvecea): Recibe como argumento una cadena y un número entero para devolver. echo '<TO SOCOLOA .<'TITLE~ </KEAD:. trrs". - 1 a [J strrev (cadena): Devuelve la cadena invertida..... .2) (..arsO 1(·5) (d) « 1 )(.. con Cadena..'centex'>·. r """" ------. 1 ~~/~1 • • o Función count_ e/.. a continuación.na<'TD>\n·¡ echo "<TR ALIGN..lItr'.=: . o<8001/'> <cartER.. 1) . ' " RAVa5 DE EJEMPLOS ORA-MA El resultado se visualiza en la siguiente imagen: ~ (dial . . .llow'>cadnna</TO><TD>$eod. 21 c''I'O~' ...trrev</I> y <I>Bt~_repe6t<JI"~(H~~ <?php $cadano··0123456189'. ¡cadena) . 2J ' " ("D>< T1b' n' I .> c~> ~'. str_repeat (cadena.H (strrev( $cadana) .1) (u._repe.. . la cadena repetida tantas veces como indique el número entero.. <H2~Funeion •• <I.Ii·"~n.

bTev(cadena).-J s"_"I"at(.2) 987654 321 0987654 321§]j .CAPITULO": CADENAS 14' El resultado se muestra en la siguienle imagen: o Funciones strrev y str_Tepeal cadena 0123456789 .

Existen diferentes fonnas de crear arrays. en cada posici6n marcada por el índice dentro del array. es decir. está formado por un conjunto de valores ordcn:ldos respecto a un índice de tipo entero. El siguiente ejemplo nos muestra estas dos fonnas equivalentes de definir el mismo array: . U\ más sencilla consiste en asignar el valor de cada elemento de manera explfcita. indicando cada uno de los valores que lo componen e. o simple. de esta forma. Como veremos. PHP tiene gran cantidad de funciones cuyos parámetros. . escalares y a50C1aUVQS. En especial. son ampliamente utilizados en las funciones ligadas a las bases de dUloe. 5. lanto unidimensionales como muhidimcnsionales. son variables de lipo orroy. incluso. asociarlos bajo una misma denominación.1 ARRA YS ESCALARES Un array escalar. tanto de llamada como de resultados. y las distintas formas de hacerlo. En este capítulo profundizaremos en los distintos tipos de arrays que podemos definir. haya un valor. la posici6n que ocupan dentro del array.CAPíTULOS ARRAYS Los arrayl' o matrices forman una parte muy importante de la programación en PHP ya que permiten manejar grupos de valores relacionado~: nos permiten almacenar múltiples valores en una sola estruclUrn y. Este fndice indicará la posición del elemento dentro de esta colección ordenada. Veremos las principales funciones para su manejo y tratamiento. de modo que.

ho '<TO:> SIIIIltrh211J </TO>' echo '<TO:> Smatd.· .</l.146 I'IIP ~ A TRAV~ DE EJEMPLOS ORA-MA '>m<L' . <TR ALlaNa'canter':> <'%'O BOCOLQR-'yellow':>Smatrizl< " .'center· 8GOOLOa. H4tric~<ITITL!> <BOoy· <CEN'I'ER> cK2..ho .ho echo echo echo '<TC· SlII/I.imp1e..TO> $lll. $matrizlll) "<m.' " . <TR ALlan. $~trizl 4¡_'V6'. ..PAOOING.'ford'... Smatri zJ [J _.<¡KZ.0'.(D1. <?php $matrJzlCO¡_'cougar': "'tr!!lll).500'/ $matrlzJrl··V6'/ $matl' lz2 (J _17J I " ASoLE BOROI2_'l' Ce:w..Si</TD. </Ttr."""" cTfTLB>TTebejandO con .. . ~ol:d' I Smatril2[¡.SPACINGa"Z"..'¡ </'fI):o' </TO:>' I </'1'0..l ee< I TO. h. $matr1z2[)_'cougar'.··.".tritl10) '<ro> S!l'\etriz. $lIIatrizl '5)-172."''''' " ~• .Arreye <I. $matriz1[4} '<TO'> $matritl [51 «m. 'matrizl 3J-'2..> <?php .l 11 1 ·<TO· $~uhlr2J " <TO.'Z' C. <l'plIO rOrl$1_0.z2f2J cITO>' ocho '<TO> SlIII!Itrial[J) cITO>' I ocho 'cTO· $Jutrizll41 c 1'10>' ocho . $matriz2[1··J.. ...500'. </TR:> <TR ALIGN_"center"> <TO BGCOLOR.atrizJ!S) </'f'lb.. </TO.> .ELl.$1<_5:5_+ echo "<TO.~llow' 1't))o..ho '<'%'0> SlNItrhJCOJ </TO.·ye11ow'>$~triz2</Ttr.

~. ./tt. .ncUe. Como observamos en el código anterior. ~ ______ .F:t I~ Ntrf.1 ti..T11't. El sigUIente ejemplo nos muesll1l estas realizaciones: lI'l'M" <HEAI)Jo c80DY .11.. "n lo! .. .::Ou: 7 .. podemos definir el orden numérico que nos interese.AIIL& lIOItDER. al generar el arroy. elementos vados.. . tritl[3J··coUQor"~ $matrisl[$J·"ford"¡ $_trhl [71..50r ~t Cmatrid [ J ."."". inclu~. é-tos se van situando secuencialmente respecto a la última asignación realizada fiobre el array.'. simples Cuando. no indicamos la potiición de sus elementos.. .·CltIlter" ac. ~.h"" 101".Z¡ l> e..-y.".</~·I'l'LE> <n:!:>Arroyl <¡. <?php $.ll_·" <TD>t.t.....simples«!>«H2 .! Arcay... El resultado se mueslra en la siguiente imagen: T.. es decir. Ihnl.'2 .." . HRAYS 14'7 < n. "l" CELLPADOING" "1."EAD> ·.... r-.!:JoTrlll>ajondo con <C!tm'ER' ~tl"ice.. un a"ay puede combinar elementos de naturaleza distinta: en el ejemplo.SPAr-!l«Joa"l"" eTl ALIGH... La asignación numérica de posiciones denU"O de) array no tiene por qut! ser secuencial."V6": S-Otr-ld[ t-l . valores enteros y cadenas de caracteres (que deben aparecer entrecomillados) e.ORA-MA CAPfTUL05: .cn.

trhl[a¡ eCho '<TO> $matri:cl[9¡ ~~ • Tt>.lbill'lndo con Millo..trizlI6J echo '<TO> $matrizl[1] "no '<'1'0> $ll\lI. 'c.148 PI1P5ATRAVtsOEEJEMPLOS dphp fo~( •• O. guardados en la posición 9 del arra)' y pensar que hemos definido un array de nueve elementos.. ya que con esta definición nuestro arra)' sigue siendo de cinco elementos.. < I'rD>' I </'1'0'" .." cITAStE> . </'1'0>' .ld 10 20Ul0!lJ RIiJ EJ o .TU> $matrizllOJ K~ "TU> $illalulE 1 ! 1 J K~ '. "" c/cmI'ER> ctOOOY • HTIIL> No debe confundimos el hecho de que [engam~ valore. tal y como muestra la siguiente imagen: T'. </'1'0.nte~·. M01'U" Illher"clon Ilu..1"0> $llWltrizl!2J ~ho '<'1'0> $matrizl!Jl ~no "TI» $lMtrizlí4) • cho • . ~ BOOOLORm'vel~ow~>$~trlzl</~ . 'rD.. pues estaríamos en un error. <(TO".<~r$i •• ~ . J ~<'l'tb-$i</TO>'.... 'lb TR All3.... </'1'0>' ...$. < '1'0>' </'1'0>' «TO>' . . trblI5) Kho "TI» $m.'. $ .ce. .

\CIM(loo'2'" ALIGN.$P." 8GCOLOR~'ye11ow':>$maLCi~1</~ ~ho ~ho ~ho '<1'0> $lWltrhllOI '<TD:> $N..$matcill • • <TR <?p"" cr.1721: <'fASLE BORDQ-'l' CELLPADDING....$ic_S.$!++) .cho "<1'O>$i<I1'O:>'. </Can'BR:> </BODY> ..S00·.'~llov·> cTD>indice<I1'O:> forl$i_O.ha '<'ID • $ru.~ter' BGCDLOR. ) El siguiente ejemplo nos muestra cómo utilizar este constructor paro definir el mismo array que en ejemplos rulleriores: . • ..n~11.. Este constructor no es una función regular: tiene la siguiente definición: arrayarray (mixed valores.. <HEAD> c1'!TLI!>Tr~jando con Matric••c/'I'I'I"J R> ""MEAD> <aaDY~ cCENTD> cH~>El con. . </'I'fI..trizlIS] -</TD:>'."focd'..pITULO 3: ARRAI'S 149 La otra forma de definir arrays es utilizar el constructor array () prop:>rcionado por el lenguaje.fA CA."V'·... Kha '<TI» $rutcizll4J <ITI>".J.y('c~ac'..o RA \..t~~ctor <!>array</I>c/H2> c?php . ?> < 'l'R' <TR ALIGN-'center'> <1'0 ..·l..·c..'2' CIU..trhllll </'1'0:>' ¡ '<'!'D:> S_tdzll21 </TO:>' I ~hO '<'l'D' $matrizll31 <ITD:>'...~ -c/TABLB:> .

.cbo "<T'O> $JMtr1al[SI </~'I ."VI"..r·> ~"TO aocOLOa-·yellow·>s.loe/TD> .S00"... los índices se asignan.. " "TAlILII BORDER.rI~O PUP 5 A TRAVÉS DE EJEMPLOS ORA-M" Como podemos observar en la siguiente imagen...Si<_S¡$io+) echo '<~$i</~'1 1> <jT~ <7~ ~~lGN. ..112).ello '<~ $DWltrhl!" </TO>' . Por ejemplo: <li~ <JIEAO> cT¡~Tr~jando coa Katric ••</TITLI> <.null. por defecto.. <rO oeTR ALIGN-"c:.l_. indicamos el índice..~etor ..°2. . °V6°....</~ <TR ALIGN-°cantar" BGCOLORs"y. y el valor del elemento.r"> ..17ll.'pho <I>array</l></B2> Sza~ri~l $~ttitl • arrayl"cougar"...atrizl </~ oe1php echo '<~ "'tdz1(0) oe/TO>-.~llr. Para ello.eho "<1'0> $_tri%llZ l oe/'l'lb' f ."ford"."l" CELLJlADD:ING-"¡" Cl:LLSPACINI>"'·" <TP. de modo secuencial comenzando por la posición O: El constructor lU7'lO' 11"""[ ~~11Go'."ford". seguido del símbolo ...nt.' !IZAt'> ..O_. • arrayC2_.c:ho ~<TD> $matdzllll </TD>°.:80:11"> <H~>al con.SOO".{n4ic.null."~llGW·>$matri.·cent.. "he "<1'D> $aaubllll oe/TD>" ."l.°coUQ4r".~_ [i]§lS 172 o 1 2' f4' El constructor array ( ) también nos permite asignar los elementos del array en el ordt:n en que queramos..llow"" <1php fcr{$i_O. >. . BOOOLOR.

es decir.u Moda ~ I~ "".'"".~ $matTh:2[l) </'J'DJo': ..rillg...> Como se muestra en la siguiente imagen. $Jnatrlz2 [O) </TO>·.ll.tieIl.. nuestro array va a estar compuesto por pares clave-valor. siendo necesario proporcionar la clave para poder acceder al vaJor almacenado en el array.11IJ 111112113]111 /1 ~ ~ f:i I . . <'In'MI.. S...)OY~ .~ho ·<TD> .ORA·MA CAPITuLD5:AHRAYS 151 ~ho "<'rO> .2 ARRA YS ASOCIATIVOS A diferencia de los arrays simples. 5 5. los arrays asociativos (también conocidos como tablas hash o arrays indexados por cadena) están formados por un conjunto de valores que están ordenados respecto a un índice de tipo s..0 I LE . 3 •4 .cho '<TD~ echo .. los elementos a los que no se les asigna explícitamente un índice loman la posición secuencial relativa a la última asignación de posición dentro del array: II<lh.<TI».-•• </TAllt.$Jnatri:t2U) </TD>"¡ echo ·<TD> $. D~ ¡litar M0:S!I5 1r Befecidos !J.E> </LENTER> <. o El constructor I a~ . $~tri%2[11 <(TD>".. De este modo.II.mdu ..atriz2(5) <JTO>. una cadena de caracteres.cho .un M"tllces MOl llld U Ihf!ldCIUn Bu.""". trl%2[2J ~ITD>·.I.

$matri. <I>aaoeiatl. TD>Fecha< 1't'Dlo <TD><.\lPLOS CI RA-MA De igual fonna que ocurre con los arrays simples.182. $lIIIItrid [ 'lIIOdalo' I ... BODY> cCEN'I'ER> ·:fl2>Array. $~8triz2r'potencia'J.-cho • <TC>" . ~ho ' . '<lITO>" ¡ '<1'0."". o bien. 'poteneia'_>172)¡ $matr!z2[<modalo'I_'cougar'¡ ...1 [ '!lIBrea' J ..>'ford' • Ceel . fecha' J .• e/'l'!»' . 11'0>' .11.tl ( • cc' J .. 'V6".. I . $. '<'rtt> •. TO:>Hotor</TD> <TO>Potanci. echo ·<TO ... '< ¡'1'D>' : ·~TD>"./HI!:AIbo .$Matri:r. ..~( '~enei.. """ 11'011'" : echo '<TU>?> <fTR> <TR ALIGN~'cante~ '> <1'0 BOCOLOR_'yel1ow'>$mntriz2</TD> <?php echo echo echo echo echo echo '<'rO:". IT!»' ... podemos utilizar el constructor del lenguaje array () para definirlos.:ho '<TD>'.> "/11'1." .E> "/C'!NI'ER> </BODY> <JH'n1!.. ~OO'.500'..' I .-rABLB BOJUlER. hacerlo especificando de fonna explícita cada uno de sus componentes_ El siguiente ejemplo nos mueslnl ambas posibilidades: . .:r.. _tr1:l."C< I TI» .:' .'<..'..~....AD:· ~TITLI>TT.$~tri%l~ 'cc' I .. potam'ia' 1 .rit2 ( 'mo4elo' 1 .'marca·. $/IIIItrir2 [' facha' 1 . .> '<TC>·.> . $1Oat.$lllatt . Smatri z2 [ 'motor' J . ·. 'c/TO>' .c/TO>". voae" I><iH2> ':?php Smatri~l ~ array("~alo·"'C0U9ar·. Smatdz4 [ 'marca' 1-' ford' I $matriz2( 'fecha' l~nulll $matri-z2 ('cc' 1..11 .. $matrilll [ 'motor' 1 .or· . . • ·mot.atri z2 ( . TD>" .$~..·</TO . '<TC>'. """'. "_. _rc". 'V6' .L~2 I'HI'!iATRAvtsDEEJE. $aatrh:l [ . 'l.."2 .<'TO> <ITR> <TR ALIGN~'center'> <TO BOCOLOR*'yallow'>$~triz1</TD> <?php e<. .bajando con H6trLcase/T!TLB> «.' <lITO>' .I."2" C'tLLSPACIMl-'2"> <TR ALlGN~'canter' 8OCOLOR~'yellow'~ . <TD></TO> <TD>HDdalo</TO> <TD>KarC8<f'l'D> ...HF..'l' CELLPAOOlNQ.trizll 'motor'I. -. 'c. " echo • <'rO>.·<'TO~·J -c/TABt.

. array('peaeU".r·l·· ..C RA·MA - CA Pfn¡U)5: A.r. l! echo '<TR ALlGN~·cent. "". 0.10111' }"''''lr...96))1 ?> cTABLE BOROERc'l" CBLtpAOOING_"2" CELLSP~C1NO-'2'~ cTR ALIGN_'center" BGCOLOR. '·M .. "' tI.s" I: H La siguiente imagen muestra los dos orrays defin idos en el código anterior: l.arrayl'doiar".3 ARRA YS MULTIDIMENSIONALES PHP nos permi te defin ir ar rays mull idimcnsionales mediante la combinación de arrays unidimensionales (que pueden ser tanto de ti po escaJar.ionales<jT>< Hl) <l'tlhp Slll4trhl [O) (01 .l.. ...96..nri zl (O) (1] SlMtrhl[ll{OJ SllWItrlzllllll] • • • • "peseta" . como asociativos).. a <HEAD' Arra)' multidimcnsional de tipo escalar: <~ITLE~Traba)ando con Matrlc•• </TfTLE> </HEADI' o::80DY> <CUlTER:<H2>~~aY8 <l>multidimen..y¡"dolar'.9€i)¡ Smetrlz3 • arraylarrayl'peaeta" 166...t> ..IIII·I"... .O.... joI " ' • • II .RRAr.. Los siguientes ejemplos nos muestran las difcrcnles formas de definirl os...$i<¡¡..386).$I .. .na LOIlrpI rQ..O..386 : "dolar'.. 166. d.... .~ Arrays asociativos $maInz I co.. G6. . $tn. O...atrh2 [ O] .386) .·yellow·~ <1'O></TD> <TO>Honeda<ITO> cTO~Cambio €</TD> <171'1> "php for($i .d V6 5.... ford 2500: V6 l?~O 172 182 s. Smetrll':2!l1 '" arn..

TD> _cho '<Te>"' _Smatrizll 'pe•• ta ']1 'nw:mr!de 'j ...3ae $aatrirl('dolar I '....O¡sj<Z¡$j .$1++.r·. <. "'''''Elb . '2"' CELL$PAClNO-':. $matrirlt'peaeta ' J ['ca=bio'l . 'c.' . •• for($j.:oWItlo'yellow'> .lB6I..1flb10· _>16 ~ l86J $~trlz2('dolar·1·"rray{·mon~·A>'dolar·.. ¡ ( echo o<.96: $lII4triz2 ¡ . php ~ho '~TR ALIGN.. <TITLB>Trabejando con </KJtAD> <8OPY.loo'.TD:>I"!.eentec'." <H2>Arra~ <I>~ultidi~.$h+l( echo '<TR ALIGN~'e. _____ echo ' <:J1»'.'yellow'>\$~tciz~< .. '''en».' I .>·dol.. '''/~' .$ for($j·01Sj<2:$j~+I{ ti.meda</TD> <TD>Cambto €</Tl):> . . 1'1'0..·cambio·~>O. 'camblo·. .$rMtrbJ!SiJ [Sjl ''''/'1'0>'/ ) echo '</TR.TO>'.tl echo -<TO>' IIcho ) $~trhl Si} I$~ 1 • I .lonales</I></Hl~ $ l'IIIItrizl('peaeta'J('lI\OnecSa) • '""aeta'. $matri:¡:3 • are5y('pe8et"'·>arr"y('moneda·. $metrizL['d.IMtfid I '"".I:.OR_'yeLow'>..~O. ·camblo·. t. 'dola~·.J"bl '1)<1'TD:>" for($j-O¡Sj<lr$j·. $.'· echo '<TO SOCOLOR.: I EN'l'EJt:'> e " a <Iaarrt> o( _1_ ~_ Array multidimensionaJ de tipo asociativo: He~iee.triz2 $i Ujl ) '</~'I echo "C/'"1t>' t for($i_01$1<2."'l' CELLPADDING. </Tt»o' eeh" "<TO>O s-. peseta' ) ""rray{ 'moneda' _> 'p..ete' 1 '~oQIb1o' 1.</TITLE> <HTH1 o::HEAD .96) 'TABLE aoru:1I1. echo '<TR ALIGNa'center'''".') • 'dolar'...> • tor(Si_O¡$i<2..>166.nter·>·f echo '<TC BOCO(.166.·yellOw'. 61.:R..>arcay(·mon~·.olar I 'coIIl!Ibio' • 0. TR. ''I'R> ...' ) J c/TABLE> .> . echo "<1'1) d..>'~sata·.$l~trl&1'1 ITD .:'" ~ ALIGN~'center' ~1'D>~ 9QCOLQR.onedl!.I U4 PHP' A TRA vts DE EJEMPLOS I O RA-MA echo '<TD 8OCOLOl!-·yeUO'W·>\'IIIo!ot.

...'IO hacer USO del operacIof de oonc:.r' ) [ 'catnbic' I .ho '</TR. "cITO>' I .: lj_.r...nter'''"¡ echo 'cm BGCOLOR. En PHP3 no el posible referirse 11 .... ".. . ·' '<rO 8GCOLOR. .ur..) _ . 3861 I S_t.nada' J ' '<J'l'D>-' I ".= CAPtnJL.O. "rr. <t . 1'0.. ' I [ 'cambio') .. ooha '<rO BOOOLOR. "eambi..'~llow' >\$lMtri~2<.... ~ho "<'rO>" • S. ""0 ". 'ellmbio'. " </BOOY" c... '. • pueda hllcer uso de le CO/'ICIIl enaci6n ele cadenlls o "' ¡rn.... r' II 'c. <HBAO> Array multidimensional combinado: <TITLS>T~abajando ~on <IHE..ede " ..".'yellow·>\$Nt. echo "c'tD'I>'. " : "<TR ALlGN_'cencer'... $_tri~) 1'dolar' 1 I . <C!N'TER .o 5: ARRAYS " '" ~ho ~ho "</'Mt . 0 . "</TO.·~encer· <TABU! SORnE"'"' '1' CELLPADDING_ '2' eELI:..".... ---- ooho "<rO 9GCOLOR-'yellow'''\$~cri~l<ltD'''. ' .rraY['moneda"&>'dolar..llow' .911 II t <~ ALl~.. echo "<TR ~GN~'c.y ¡"IIIC:. Smatriz 3 (.p' "'166. cedene) entnl D .eho 'c/'!'fl>'...../T~·: " " 0 "<TJ»o'..·c:uiblQ· .. 8GCOLQR&'yellQW" .l [11' '.l! 'dole. '</1"0>".·y.\D~ Matr~ee8</TITLF . $ll\atru. tr1~l( 'dol .b1o' ) • " </'J'O>" ~ ~'o 4</'l1b" : ~ho "<111 ALIQP.r1~3"JTD>·..SPA"'ING. 1~2 • 'pesElta' I 166.'cence:r''''. 'dolar" 'e/l.denaI. " . es necea.. Smacrir.'center· . -. $matt i~31 'dolar' ) I 'cambio' I .. ~ho '<1'0>' • SlNIcuzl ( 'dol .dón pat1I lOIudonaf este problema.. r· I ( 'II'IOned4. Smatriz2( 'peseca' J ( 'moned4') .'cent~r''''1 KM '<"rO echo echo echo echo echo echo echo cJo:'ML!> "'~iN1'tJt> eacoLOR...·yellow· .96r 8Ntriz:¡ :'0 J _ar ray( "IIIOneda' _>"peseta'.../'Ido . ro .. referenCIa e' 8fT8y (dentro ele . •</1'R .. "" :1'0.y$ multidtn'MlnSlon8les directameote defltro ele c..9Ei.' ) ..IiTHL" NOTA. ...Smatri~J( 'peseta') ('moneda' ). ~dolar'l • • '). Iin embargo. multidi~enaio~leB</r><JH2" <'phI> Sll'l4trhl lO 1 ¡ 'IIIOneda' ) $rnatrhllO) ('utrlbio' 1 $nIatrit. ·. ·c1'O>·. ·peaeta· 'j'~io"~~166 '861.386.'!" .lio' .:.rr"ylarr. <H2>~rray.ten. '. lodo el proOIen'II MIOIUCIOn8 enc:err. 't'I»" I echo "<TO>·. echo "<TR ALlGN.... \Sma~i~2</~~·1 '<'rO>'. peBeta' 1 [ 'clUllbio' 1 •• </TO .aneda 1 $Ntritl (1.. En PHP4. Smatri:r2 t 'peaet. echo '<'tI»'. _.Smacri~21'dolar·II·~n8da' 1 .Smat~izlcJ~·r ".'</1"0>'.. • ¡ 'cTR ALIGN.-</'1'0. <BODY .yl·lI\Oneda· . lemb. ' ¡ '</TR ..

:z:l[Si) c4lllbio .... '. $matd 2:3 ¡ Si 1 [ • mooedtl' 1 'ciTO>' I "<TD>'... . (1'0 echo • "'/TR> .' . </'tABLE> c/CRm'r.'</TO.zlc/'l' " ec .. echo aeho echo echo '<TO aocOLOR~'yello~'>\$m!ltr¡z3</TD>'J ' <1'0>'. ALIGN"" etmter' >' etC 1) :'I'D BGCOLOR-'yellow \$cetr. $1 H ) ( echo ''''TR ALIGN .SlIIat.. .dz2($iJ ¡ 'lIIOtIeda J . ' center' .:ho • . son equivalentes: • -.'C »O'.L56 PILI'SATRAVt5DEEJEMPl.oeda ..$1<21$i·~1 etCl..2«1'0>' echo ·"'TD> '.SJllatriz:l[$il './ TO>' '(/TR>'. TD .tr. mt.: < """".. tor ($1-0) $1<2. ) r('l O.Jt c .$l\Iatri:z:..$1<2. ·..:l"l!$l. ec:KJ "'/nt>' .$i··I( echo '<TR ALIGN~'center'>' echo '<1'0 aocoLOR"'yellOW":>\$/llatr .HSi l'cmalbJo'j "".~ Arrays ttUtllidimensio"aJa . <1"'" La siguiente imagen muestra la salida de los tres ejemplos: observamos que los tres arrays.· t!1. definidos en el código de diferentes modos. ~~rt$i~0.QS ORA·MA <TD:>cITO> _TO>Moneda< 1"'0> <TO>C~i~ €<'TD .¡ ·<'l'D>-'.:.$Ju. '<'l1I.lo .'<ITO'J echo "".$w<1L.

II</TITLE> <Ctm'ER> <H2>ArrayII función <I>count</!></H2> <?php $lII4tritllOllOJ • "pelleta'.</'TD> <TO>Cambio l€</TD> </TR» <"'php for($i. NOTA: Aunque e..!. rtruw' : ARRAYS 157 5. 5.4 RECORRER UN ARRA Y Como hemos visto en los ejemplos anteriores. que devuelve el número de elementos que tiene la variable que recibe como argumento.atr1~1[S11</~·1 . en el que nos pennite recorrer un array multidimensional: <H'I'ML> <MEAD' CTITLE>Trabej. PHP proporciona la funci6n count ( ).ndO con <IHEAl)3o <SC. podemos aplar la función a walqUlef Olro tipo de vartable. 85. habitual que el argumento pendo ala filnaón IN un Mr8y. podemos realizar la operJci6n.Si<oountl$~tri~l). El problema principal en este tipo de recorridos es conocer a priori el número de elementos que componen el array. llene velor o O. $matt'hllll tDI • 'dolar-.·yellow·»\$. podemos utilizar un bucle para ir recorriendo sus elementos.96. $matt'itt{21 rOl • "INIrco". $matrizlIOlll) • 166. lal y como muestra el siguiente ejemplo.1 Recorridos en an-ays secuenciales De los ejemplos anteriores podemos destacar que recorrer los diferentes elementos que componen un "rray secuencial es relativamente sencillo.'2"> <TR ALIQN.O.~ ~triC.)( echo '<TR ALIGNa'eentet")'¡ echQ '<TD 8GCOLOR. si ésta aún no ha SIdo inic:ialluda. haciendo uso de un bucle e itemndo en funci6n del valor del (ndice. pues. Una vez conocido el número de elementos del array.'eenter" BOOOLOR_'yellow'» <TO»<I'f'tno <TD>Moned.O RA M"" c . sil.$i+. una operaci6n habitual a realizar cuando trabajamos con arrays es recorrerlo para obtener sus elementos. . Precisamente para solventar este prob lema. en cuyo caso devoIvefá el v. ~ABLe 9OROeR~'l' CELLPADOrNGw'2" CELLSPACINQ.. para modificarlos o trabajar con ellos. $/!\8tritlI21 tI} • 1.4. $rnatriz1IlJ 11) • 0.386..1or 1.. variable.

un array no secuencial no parece muy fácil de recorrer. </TABLE:>e ICDn'E:ll> </80OY~ " La siguiente imagen mueslra el resuJlado de realizar el recorrido: Arrays funci ón counl )l-u ~l¡OJ ~"cta C-'olf 166 ~ Otra función relacionada con el recorrido de arrays es eizeof (). además del número de elementos que componen el arroy. El ejemplo anterior podía haberse resuelto haciendo uso de esta función: bastaña con sustituir la Unea: :::..\.orU. Por ésta: ftor(s\-OJ $i<d".·</~·I echo o</TR>".1PLQS C RA·MA forISj-o.15.$Datrizll$1J [Sjl . Esle mismo problema se presenla con los arrays asociativos. Para poder lIabajar con arrays estructurados de modo no secuencial.2 Recorridos en arrays no secuenciales A primera vista.4.5 A TRAVÉS DE. puesto que no sólo necesitamos saber el número de elementos que componen el array. .tlr"hll" U++J [ 5. necesitamos conocer las claves para poder acceder a los valores almacenados. sino también su posición dentro del array. PHP cuenta con el siguiente conjunto de .Sj<counttS.8 PHP. tamo de tipo escalar como asociativos. E1E. que obtiene el número de elementos del array pasado como argumento en la llamada a la función. puesto que.atri%lIS11).··I( echo ) ·<~·..S.

1 C RA-MA cAPfn. ando next.~ funciones eBR> <I>r . En caso de que el elemento ac[ual sea el último del array.ando con Matriees</TITLE> <1. <80DY> cCDlTER> <H4>Arr.500·j _tth¡ 1-"v6".. En caso de que el elemento actunJ sea el primero del arra)'. e next (matriz): Devuelve el valor del elemento siguiente al actual (si existe) y avanza el puntero interno una posición. .Jl. prev. devuelve falseo o end(matriz): Coloca el puntero interno en el último elemento de un arra)' escalar. El siguiente ejemplo muestra la utilización de alguna de estas funciones: <HTML> ~HEAD> ~TITLe>T~ab4.. . . en el caso de que el array sea de tipo asociativo.o':ItRRAr~· 159 funciones (estas funciones secuencialmente): también son aplicables a arrays estructurados o current (matriz 1: Devuelve el valor de la posición nelUal del puntero dentro del array: todos los arrays tienen un puntero interno que apunta a la posición del elemento aClIlal con el que se está trabajando en un momento dado. o una cadena de caracteres. devuelve falseo o prev(matriz): Devuelve el valor del elemento anterior al actual (si existe) y retrocede el puntero interno una posición. o reset(matriz): Devuelve el valor del primer elemento del array y sitúa el punlero interno en su primera posición. t. en caso de que el array sea de tipo escalar. o pos (matriz): Es idéntica a la funci6na anterior a key (matriz) : Devuelve el índice de In posición actual del array pasado como argumento: un número.". eurrent y key</I><IHl> e?php lmatrlsllll·"eougar'¡ ~t~ialt51_·ford"1 $matrlal(71_"2. Devuelve false cuando el puntero está al final del array o cuando el array no comiene ninglÍn elemento..

. 'yellcw·" <TD>PoaiciÓnc/TD> ..500'¡ S~tri~2!'f.et($matrizl] ...'<I'~·I ) c/TABLE><BR> cTABLE OORDER. echo 'cTO eocOLQR.:::') .. " <rc BOCOLOR··yellow.'ciTO>".5ATRAVtsOEEJEMPLOS ORA-MA s.valotc/TO> <?php <TR ALIGN..at~izl )-112: $matriz2f'modelo'). '2.xt!$matrJ~ll){ echo 'cTO </TR" BGOOLOR. Smatrü:21 '_rell' ¡"'ford°' S-tri'a2J 'c.re. <7ABLB BQRDBR. whil.'l' <?php CSLLSPACING-'2'> <TA ALIQN..(n. mientras que el primero se muestra complelamenle: .'</TO>'.cho 'cTO eocOLOR.'yellow''''.cU$rent(S~trlza) .cha'lg"ul1¡ $\'IIlItri~2 [ 'lDOtor' ¡.llcw'>·."center'.'~llow·>·.atriz21 .r 160 PIIP.> </80C'{> <TU BOCOLOR_'yellow'>Velor</TD> echo ·<TD>'.al .eurr..'</TD>'/ I </TABLE> Como podemos observar en la siguiente imagen. .'c/Ttb'. ve</TD> .'</TD>': I "TR> <TR ALIGN-'center'> .'</TD>'. while(next($matri:l))( echo ·<TO>·.keytJ. while(prev($matrlza)1 echo '<TU>' ..nt($matr1~2) .'yellQW'>'.> $matriz2['potencia' 1_182..·</~·1 whlle(prev!$matriz2) ){ echo '<TD BCOOLOR.key($matrl.mI($_tTi~2.·y.pbp .?php lIltléI (S_tdc21 1 .key(8~trill) . '1' CKLLPADOING-' 2' C8LL5PJ\CING..'clmter' 8GCOLOR . el recorrido del segundo arra)' (en orden inverso) se detiene en el instante en que se encuentra un elemento vado. echo 'cTD>'.> < ICENTE!'.'2·" " cTR ALIGN.key{$matri¡l¡ ... cTO>Cl .curr.."cent.nt(~tri%lJ ."V6· I CBLLPADDI~'2' .er' BGCOLOR"':r-11ow"."COUger '.

$matr 1I2[·~·J . .~ . r...s no secuenciales haciendo UM> de ambas funciones: ~ <MEAD. rs ]6] 1.7.1:..50 • $ma. W.21 '_rcoS' 1"" ford' " $/IIatr1. currenl y ley 1'0SIClQa ) 5 7 a ~ el each (matriz): Se usa para recorrer arrays (sobre lodo los asociativos).... pues devuelve un par de valores correspondientes a la clave y al valor asociado a esa clave.I:. $matrizl¡~l·'fora'¡ $matrizlI7]-"2.' ?> . r...2 [ 'fecha' J""null: .</TITLE> </IiEAD> <BODY~ <Hl>Arrays funciones <1>each y list< J><JH2> ¡'php $matri.2 [ ·lIIOtor· J=-" .l: [ 'lI'. <TtTLB>~abajando con Matr~ce. nal. '. II"d..z] 1 $matr~ ]_. ·OO. each ( ).ra).. .odalo' 1s 'cougar' .·cougar".'" ' .>I"~""'.500'¡ $matJ:id r J ."V6": $matr.. end. Además. Si el pUnlero ¡nlemo apunta a la última posición del array.U· . $matrh. la ejecución de esta función devuelve falseo o list (1: Asigna una lisIa de variables en una sola operación... prel-'..'.l [3].U 1I2 r ·potencia' _:8. avanza el puntero interno hasta el siguiente elemento. $rna...C RA·MA CAf>fruL05:¡\RR. It"... w. Suele utilizarte en combi nación con la función anterionnente vista. El siguienle ejemplo muestra el recorrido por dos a. Arrays funciones reser.."..

·</TO>< TR>"..(li8t($clave. CI array_keys(matriz): Devuelve las claves que forman el array matriz. <?php wbjl.....$clav.162 PIIP. <TR ALIGN~·c. </TABLL"~/TO><TD> <TABLJ: SOROtlt..Svalor....$v. /TAStE' </CENTER> "/I:IOOY~ " </H'tML> Como podemos observar en la siguiente imagen.. ( echo "<fa ALIONg'Center'><TD.....1ATRAvtsOI:EJEMPLOS CRA-MA eTABLE SORDERa'1' CELLPAOOINC. <TO... "2" CELLSPACJNG. echo ''''TD~" .". trlz~111 " echo -".each 1SlIIIIItrh 11 ..TR ALIGN."yellow"> "TO>Cbve< /TD><TO>Val ore I TO> '" ITA ....·yellow·" <TD>PQsiciÓn</TO.r' eGCOLOM.o Array~ funcione~ eadr y lisl v ."-~ __ ".1" .. ... <TD ..·</TD~<¡TR>·1 <ITAB~E'«TO'</TR> "</~D>'I . CI array_values (matriz) : Devuelve los valores que forman parte del array pasado como parámetro.lor. el recorrido de ambos arra)"s es completo independientemente de que tengan elementos vacíos: .'2" CEL1~PACI~·2·~ <fR ALlGN"'cetlter" 8OCOLQR.. Valor</TO><)TR ._ .. "' . ·.'center' ..$valorl~each(S. ·. <7pbp while 111 lit ($pOlI. "''-. Admite un parámetro opcional que nos permite seleccionar sólo las claves cuyo valor coincida con un patrón dado.. echo ·<~·.·.Spo•• ·</TO... .nt.·l' CELLPloOOlNG. $valor) . . 0.

""'''' <HEAO> <TITLE>T~abaj.</I>c Ha> '?PhO $~t~izl[]I·"c0U9ar"1 .$~t~i~l.rr&y_keY8'$~tr~zl."il...1: BORDER.·</~·t echo "<TO>-. funciones<BR>cl>.: ITD>" I "I"'nn "":'1'0>" f.1c16n</TO><~V. .y_v. y B~r.1ITIIt."2"" <TR ALI(¡N""c:enter" fIGCOLOR·-yellow'> <TO>C1.p $c:l.+I{ ."O" CELLPAODINOa"" CELLSPACING~"6"> <TR ALICN·"center"><TD> cTABLB BORQER*"l" CELLPADOING~'l' CELLSPACING~"2"> <T'R ALIGN"·ee:nte~" !!JGCOLOR..'yellow'> <~Po.'c/TD></'I'R>".rray_key."</TD>c{TR>": .y_valuestS~tr1~1)1 forl$1_0rSi<sizeot'$clavee):Si.$el&vea[Si[J .500' r -TABLt BORDEa.-ford"..lue.> En la siguiente imagen vemos el resultado del código: . <JTABLE></TO></TR> </TAllLf. ·l~ CELLSPACn'::.CDrMm> ~H2>ArrBy.. " 2.VIII:$i~+)( echo "cTR ALIGN~'c:enter·><TD>".f no secuenciales haciendo uso de estas funciones: . '1" CELLPAOOING.lo~</TD>< TR> <?php tclBve.loree.8<f!!TLE> <JHEAIb <80OY> .:> <ICENl'ER~ </BOO't> <. ?p¡'.C$aatr:zl)J tv.> ) <tTA9LI>c/TO><T~ <T-'81.·a~~By_key.Selavesl$il . $c:lavee [$\ J . Smatritl ('¡aotor' 1. SOO"."V6" ¡ Gmotri~l¡ 'potencis'J·lG2t SlMtrizl ['ce' 1.SOO') r for($i. "l.. ' c:e:nte~' ><TP>' .Br~.v.fj El siguiente ejemplo muestra el recorrido por dos arraY."J.""lnr.> $matrlz115J.cho '<TR ALIGN .</TD><TD>valor</~~/TR> . $m4trl111 L'll... '.OISi<81zeof($cl.va8·.ndo con Mat~iC.

S YO • :::!!! ~. 6&101 pc!Ifderjn IUI clavel y se convertirán en Brra)'S Simplel o escalares El siguiente ejemplo muestra la utiliz.."4· CEW.5 ORDENAR UN ARRA Y Veremos a continuación varias Funciones que PHP pone a nuestra disposición para poder ordenar los elementos de un tlrray. por ejemplo."" ..LPADDIN('\-·. ya que es Frecuente que necesitemos tener los elementos de un array ordenado~ para después.>Array8 funciones <I"8ort y rsort</I></K2> <?pnp $matri~l[Ola'Madrid'l $~tri~l[ll~'Zaragoza'. Para ordenar de manera inversa....-. a sort (matriz): Ordena alFanuméricamenle los valores de los elementos de un urray de menor a mayor. ·I· CEl.< TITL2> </II&AD> <aooy> ~Hl."Ali':~l11te·l "'rABl B I!IOJIDER . ~trizl!41·-Leri~·."2· > .ación de ambas funciones: <"".. NOTA: S i apllcarTlO$ estas luncionel a 8m1yS asociahvOI. . tmAtri21\21*"Silbso'¡ $matri:l[)J~'ValeQ~ia'¡ .164 PIIP'ATRAV~I)EEJEMPl..l' caLLsPACroo.fI...:: ACINQooc"6" <TI» <'rABLI BORDE.. <1<'-'" <TITLE. . .OS ORA·MA -Arrlyt (unciones anvy_ bys y arra)'_ WIlues ¡-.T~4b&j4ndo con Mat~lce. « .. $catr r [51. ':... .~ . 'G « 5.. "O· CE! LPAOOINC.. disponemos de la función rsort (matriz)... poder lislarlos en orden alfabético.

orden:m en rcaJid3d los (ndices: . 1TD7'.CAPtruL05:ARRAYS 165 <TR ALIGN~·eenter· BGCOLORs·yellov ~~TH e r~n.$valor..$poa..' 2 CELJ.> whil.cbo <TI'_ ALIGN_ center'><11»' $p 8 0< "'D>.tISpo8. echo '<TD>'..sPA( TOO."t (J /TH <TR ALIGN'"center' 8GCOLOR"yellow'> <TO>Poaic!ón</TD><TO>Valor</TD></TR> <1php aort ($matrh."e.'</TD></TR ' 1 .l.Svalor.· 11'0>'. ) -< l' ABLE~ ITD> )RDER' '1' CELLPADDING. R ALlGN"center' BGOOLOR"yellgw'><'l'H c)lapon_'2'>180rt( cTR ALIGN"'center' BGCOLOil""yellow'> cTD>P~a1 ón</TEP<'t'D>Valor<fTD></TB> c7p. -< TABLB>c'~<TO> <'t'Abt.t{SPO•• $valor)~eachtSmatr!t l' .ch($Gatrial' echo '<Ti ALIGN='center')<TD>'_5poe .'</TD><fTP>'. Whl1.$vlIlor '< fTD>< I~>' ¡ .Svalor).E 8OIlOER.$valor..' 2'.(~i. 'l' CE:LLPAOOUK>_'2' C6t. -<TARLI: <'l'R ALIGN~ 'conter" 8GCOLOR""'yellow' ><TH colapan_' 2' >80J.L pACtNO '2'.".]). .. c/TASLE></TD> <I'Mb . echo :TD>' ..(li..'tP raort(Smatr!tlJ. 'l'D>Poaie X1<fTD><'It»Valor</'lU><1 '1. <ITASL/'!> </CENTER> </80DY" <'HTM~ La siguiente imagen muestra el rcsult3do de ordenar el array del código ascendente y descendentemente: en ella observamos que ambas runciones. echo '<TD>'. while(liat(SpoB. Array rlg nalc TH> cTR ALIGN='center' • l'php BGCOLOR_'y~llowo. al ordenar los v310rcs del array..aach($mlltrillJ){ echo '<T~ ALIGN='canter'><TD>'.

..'2'>Array Original</TH> <TR ALIGN2"center" BOCOLOR...:.1oI . ... -!. Arrays l'unciones :10ft y -.. . "Ha4rid" .. ..8LE BORDER-"l" CBJ...LSPACIHQoo"2"> . .. o arsort (matriz): realiza la ordenación inversa. ik_ E . "O" CBLLPADDrNc.."4· CELLSPACING .. ... ~ V. $matri¡ltlJ. podemos usar las siguientes funciones: o asart (matriz): Ordena aJfanuméricall'cnle los valores de los elementos de un array de mayor a menor.." Silbao".] Hj• ) v. Smatrizl[5]·"Alicante".... ..1PLOS ORA-MA _ L _ _ l r .. $~trizl(3]c'Valencia".::. e.."..."center"><~ cTA.....-.. <TABLB BOROEJI ....on...... Esto es posible debido a que la ordenación se hace sobre los elementos del orray y no sobre los índices.·yellow"> <~Posición</TO><TO>Valor</TO> . 'i."Zarago~a·¡ $1ILItr i zl (2). .... .LPADOINt¡._ _ _ . <TR ALIGN.ort<fr></H2~ $matriz 1 ¡ 01 .pool " ¡. tanto para los arrays escalares como asociativos.. ~ ~ O @ Ii:::. • ..........._ .. .... "".dl~~ ~ Para evitar este efecto lateral en el que se redefinen los índices.. ~ .. 1. El siguiente ejemplo muestra la utilización de estas funciones: <H'I'tCL. ~..r 166 PHP 5 A TRA vl!s DE EJE... pero manleniendo la relación existente entre los índices y sus valores asociados....<HEAD> <TITLB>TTabajando con Matricea</TITLE> </1iEAO> <BOOY> <CEN'l'ER:>o <H2>Arrays funcion •• <r>aaort y <?pl'¡p ar.... Smatrizl[4]·"Lerida"... .. "6·:..-::el u.~ ..."2" CEt....-.... -[: ~ot1 ~ v. .~ __ v_.. <TR ALIGN:"center" BOCOLOR~"yellow"><~ c01D~.

.... _= .'yellow'> <TO>PQelc16n</TD><TD>Valor</TO></TR> <1php .e4ch($~tri%1).'center'><TD>'...'</TD>": ~ho "<TD>'..nter" BGOOLOR. "'"* I ."</TD></TR>".... ...• v~ Arrays runciones asot1 y anOf1 v_ v_ .Spo...·~(TD>"1 echo "<TD>".·yellow"><TH colapan.$valor'......... </TABLE></TO><TD> <TABLe BORDER·'l' CELLPADDING-'2' CELLSPACINO...$valorl_aachC$matri%111( echo '<TR AL1GN.."2" CELLSPACING. .. ~ ."2·~ <TR ALION~'c.'2· >aaort {)</TH> <TR -'LlONo'canter" 8GCOLOR.$poa...--It:: .. 11"..'Z"> <TR ALIGN3'canter' BGCOLOR~'yellow'><TH colepen~·2·>8r.. .ORA-MA CAPtruL05:AHItAt'S 167 <'1pbp whl1a(li. •o . .$valor.."</TD></TR>"¡ ) </TABt..... • .. o .$valor.aach{$~trizll) { echo '<TR ALIGN~'canter'><TD>·.-"'.I:>< TO> <1"0' " <TABLE BORDaR."'" R .. .·center' BGCOLOR. " " </BODY> </lfTML> Veamos el resultado obtenido: o •• : '..ici6n</TO><TD>Valor</TD></TR> <?php 88ortC$utri%1I1 whllelli8tC$poa...ortCI<f~~ <TR ALIQN. • o .. .. ( echo "<TR ALIGN~·center'><TD>·.!> "/CENTEJb.rsortCS~trlz11 I wh11aC11etISpoe.'yellow'> <TD>Po. • . • "'"'. ..-.t($po..'</TD></TR>"¡ </TABLB></TO></TR> </TA8t.. " .... ·1 • .."</TD>·1 echo '<TO>".'l" CSLLPADDINO..Spoa..$valor).$valor.... ...j ........ "'"* _ ....

. 'CJ~'I .Sv.¡TR>·.tllow·> <'rO>i'osiciÓn</TD><TD>V. ~trizl[eJ~*Bil~O"r ..·centec·><TD>·... La función que realiza la ordenación inversa es krsort (matriz).'c/TO>. Smatrizl[b]_"Valencio'¡ $matritllf¡a"Lerida'¡ SMOtcizl[ala"Alicanto".168 PBPSATRAVEsDEEJEMPLOS O RÁ·MA [J ksort(matriz): Ordena alfanuméricamenle las claves de un orra)' de menor a mayor manteniendo las correlaciones entre clave y valor asociado.Svalor. ch(~trlzl) 1 ( echo '<TR ALIGN. ..• <ITO>·. El siguiente ejemplo muestra la utilización de estas runciones: <HTMl.' CE..t.. <H2>Arraye <I>kaort y krsort</I><IK1> <.$poa. lorl .$valor. IQrc:TO></TR> C?php krSQrt($matrizl).TD>·.CINQ. while¡liltt$poB."2'> ALlQN"'center' BGCOt..$valor)_aaeh¡Seatrirll)í echo 'cTR ALICN.·ceater·>.. <TABLE BORDER_ '0' CELLPADOING_' 4..QR_'y... funcion~.LSPIo.. $matri%lld]_"M4drid".> <IIEAD> <TITLE>Trabajando con Katriceec/TITLE> </KEAD> "900Y> """".. while!list($pos. ksort{Smatrirl}.> • El resultado se muestra en la siguiente imagen: . echo "<TQ>'. $motrizl(c]_"Zoragoro'. echo ·cTD>·.·2'> eTR ALrGN~'ceater' BGOOLOR-'yollow'> <TD>PosiciÓn</TD><TD>Valor</TP><ITR> <>.tsPAC1OO_· 6' > <TABLE BORDER~'l' CRLLP~INGc'2' CEL~SPACtNG."</TO></TR>'.> <TR ) <'TABLB></~<TO> <TABLB BORDERc'l' CELlJ'ADDINIP' 2' CEn. 'IlTML...> </TABLE></TD></TR> </TABLE> c/CENTER> "¡SOOY> .$~ ..

func_ c omparar): Ordena las claves de un array en base a una función pasada por el usuario como argumento..¡ .¡... RltUS 169 - -• • r Arrays funciones UD" y AISD" . El siguiente ejemplo muestra la utiliznción de estas funciones: <H'nIL... La función de comparación debe devolver un entero menor. a ukso rt (array matriz. menor que. ... . Si los dos argumentos resullan ser iguales. <BOD'l> <CENTER" <H2>Arrays funcione. igual que o mayor que el segundo. ...$PACING-·2' > <TR ALIGN.. entre comillas (las funciones se verán en profundidad en un capítulo posterior). ~j ' . .. <I>uaort y <?php $~tri~l[l··Madrid·1 $matri~l(l··Zarago.¡.- v_ • . .. La función hay que pasarla como una cadena de caracteres... ..-J a usart (matriz... ~........ $matrizlI1_'Valencia'.~n.....1.. manteniendo las correlaciones existentes entre clave y valor asociado.LPADDltt::.'center· aocoLOR*'yellow'><TH Qrlglnal<fTH> cQl....a·1 uk. si el primer argumento es. func_comparar): Ordena los valores de un array según el criterio de la función pasada por el usuario como argumento..·2'>Arr4y ....O RAMA CAPfTuLo s: . $matrizl[l_'Lerida'¡ $matri~l(l··Alicante·. <>mAl» • <TITLE>TTabajando con Matrices<}T!TLE. es decir..O. su orden en la matriz ordenada será cualquiera .ert</t~</H~> $matri~lll··BilbaQ·. -. (/HV. <TMlU BORDER.: v.. •• v-..·center·>cTO» " CRLtsPAC'~·6·.? .. • <TR ALICN.. respectivamente.."2" C1!:l.. ..... <TABLE BORDD-'O' CELLPADDING·· .. • . . igualo mayor que cero. . v.. '1" CEt. v_ • • ~ • ~ '~ • • ~ ...-.

.ow'><TH c:. ' boo$bU. 'tinb_'b[.1.ro iDdica. pano. fb} ( ••••• U..$POI .v-.a·). it ( •••• 'b) raturn D. )<!'J'H> <TR AtolaW-'center' aocoLO~'yeUOW'> ~Poalci6n</TO><TO>Villor</TO></Ta> <?php 11 or4a~ &lt~tic.'yellowo> CTD>Po..t($po•• $v~lor'._ "Ulort.' . <TR ALICN..eaeh(S~~ri. últt. funotioo o~.I.ic~n<IT?><~V. ubort ( "'tri. > .PADOING. r..cho '<TR ALIGN.'l CELt.. ¡ •• .$villor)_eaehl$matritl)) echo '<TR ALIGN-'center'><TO>·.¡ cr """PAe IlG-' 2" J <TR ALIGN-'center" 8GCOLOR..$valor)_aach(Smatrlsl)) ¡ Beho '<TR ALIGN_'centar'><TO>'.n('b)_lJ.\ClNO...'<f~D>·j «ho '<1'0>" $villor..·</TD>~(TR>·1 1> ITABLE></TO></TR..ol' CEU.ti~·'. it I$tioa ••• tiDb) raturn O.-nte ao tunei6ft de l.~_ 4 >1Ibe.> El resultado se muestra en la siguiente imagen : .·).'center' BGCOLOR-Oyellow"lI><TH col.lor</TO></TR> c1php wh!lej11.'center' BGOOLOR-'yellow" ..'yel.$poI '~/TO>' 9cho ) ·<TD>·.l))j .o2' CEt.turn ( . whila¡11It($poe. ~.$P. <fT. '< TD>". tuoc:tioo or4an&rCl.Svslor... </TR> "?php /1 o~ prt.)-llJ let~. ) t () ':1t.170 PIIP 5 A TRAV~ DE EJEMPLOS O RA-MA <TR ALIGN. 'center'><TP>'. 1. 'f. l' </ TABWr>< 'TD> <'1'0> <'l'ABL& IIORDER.~. •• .1 .· ordaoarY.trlan ( .1 • 1.v-.:.lor.tiDb) ? 1 . -1.·or4a~1.SPOI.b ){ .1. .turn > 'b ) .fAl>DllCo<'.tin. { ..'center· BGCOLOR. .rea y dAapu. <TD>Polici6n<fTD><TD>Valor<¡TD.'<ITD> 1'rR"">".lore..\BL&> <ICEN't'ER> </8OOY:o-c/H'rHI.. whilellist(Spoe.'<JTO></TR>': </"A!lLE>< TD><TO> <I'ABLI BORDilI.I¡pa. ) uaort ( ~tri. Heno '<TD>' $valor.trl..'2·~ <1'It o\LIGN.

..rizl (.' Bi."Madrid" .'l· CELLPAODLNG. . ..'centar' BGOOLOR_'yallowO><TH c:olspan_'2'>Array Oriqinal</TH> cTR ALIGN_'eentar" BGOOLOR.... .~ . .. $d\oIItri=. . ..ort (¡"ITa> <TR ALZGN_"centar· ________________________________ BQOOLOR... TH c:olap. .. Arrays rundon" IUDrt y lIbo rt • . .. ~ • .eh($matr1s. ". ."yellow" ~ .. • .....·c/TO>c c/TABL€>c/TO>cTO> c'l'MLE 8OlI. <MEAD' <rlTLE>Trabejando eon Matricea</TTTLS> e/MEAD> 'llBOOY~ ~>Arr&ya func:i6D <Z>uasortc I Z>C/K2~ C?php $mat. d' 1-·Val.."· CELloSPAtINQ.llow· > . "c/'I'O>° I echo -cTD>°..'lAr!""· ¡ $matrizl('f'j.·yallow"> cTO>Posiei6nc ! TO>cTO>Valorc/TD></TR> . .$valor....a.. • .~l"~ cTR ALION .¡"> <~R ALIGN.·O· CELLPAOOlt«. "'_1 ."1" CELLPAODrOO.. "." ~ .r· >c'n»oo" .... Slf¡&trisl('b' J • 'Zara!ilOU .·centar"><TD> <TABLE &eROER.' .O RA·MA CAPtnrLO 5: ARRArS 111 '...¡."Alicants"I <TABLB BOROER.sn.l { 'a' J . -O ". .'i'php whila(listl$po•• Svalor)· ._~.."2" CELLSPAC¡~'.rÍ!:l ( 'a' ¡. ~u....) echo "cTR ALIGN_ 'c:ent. "2" TR>-.. . manleniendo las correlaciones entre clave y valor asociado..lbao" $lMot.."6'lo CTR ALZGN.-.. .ncia' .. v. " CELLSPAC'IHO.. y- 1:) uasort (matriz.. $poe.O!k. ..~ . func_comparar): Ordena los valores de un array según el criterio de la función pasada por el usuario como argumento. 'canter" BOCOLOR_ "y. . $m&tl"l&ll 'c:' J... El siguiente ejemplo muestra la uti lizución de estas funciones: <!m<L.

TR ALIGN_ 'c:ent..·~alor •• · " whilelli.6 OTRAS OPERACIONES Veremos a continuación un grupo de funcio nes que nos serán de gran utilidad a la hora de trabajar con un array ya existente.. re~ (. Uillb-fb(l). ..j .. ua. _ nt>..:~~. . "<fTO.' I . i r (tUDA •• Ui!lb ) r.".------fuDci6a die a la n . < 1'1''''''' .. • b d _"..> El resultado se muestra en la siguiente imagcn: . ~~18'>D BII:>.$valorl~each(5metrizl»~ echo "". > 'fiAb) . v..o VlllcnQlJ ""'" ""'''' -v. </aoD'{~ ¡ echo "<TD>".112 I'J I?!i A TRA vl!S DE EJEMPLOS CI RA-MA --~<cTD"Po.iC.a("'. $po•• 0" ITD'.t.t($pOA.~ [z.1':>< I'l'n> < I1'R> </TASL!:> </C!NTER> <IHTMr.er' ><TD>" .rta. ¡ or </TD>< t.tri.l.-o d Y• . • - -b < Arrays función lUDO" ...1.\Sn</TO><TO>Va 11 o~ ...wtic ~alor..~ A>o_ 5. " l. • r • .__ o.. 1 I ....</~R>"..ort ( ".. r ""~.$valor.turn 0.1.ra r_ti_ alf..fb ) ( Ui_-'aI1).

<".. resetl$lIIl1trh. Si estamos juntando arrays asociativos.tri:tI.. >\n': • c1\O • c"'R ALIGN.~ll$m.px") .t.~100'.¡¡. echo <TR>"'ttl COLSPAN. ARRAYS t73 5... "alLch..'l' CW. echo '<TABLE BORD6R-'O' C~LLPADOINQ.PADOINQo. matriz2l: Combina en un solo array los valores de los arrays que recibe como argumentos.a.PAC?l~ 01.AD> cTI'I'LE>Trabajando con </HEAO:o> <DODY". -2"."" $lII4trlzl .. ' CBLLSP...11 do! echo ) echo· '<TD>'.'</TD>'. "J') I $matrJz3~array'·lOO·. 1'1".'center' ~·..< 'M't " echo • cTR ALtGN .1 Modificar un array Las siguientes funciones nos perntiten modificar el tamaño de un array añadiendo elementos o uniendo diferentes arrays en uno solo."vnldad'·..key\SlM.' (. <1'ABLE BORtlp.. 'center'. array' "al tura """.\!'I": cTR "LrGN~'("entltr' 1:!OC' I. eche • <TtI C·)LSPAN . ' J ''''<b>an:aY.llow'> n' do! .'4 echo" <TR AtlGN~'center "\1'1-.l 11:1. S_trhl J . SEllltr-izM-=array"perqe l$rutrhl.6. '" ><8R>< ITD.c:mo-· 2' . hay que tener en cuenta que las claves con igual nombre no se añaden al array.tLLSPM.Sj"41$j~+)' liELLSPAC]NG~'J >\n".. El siguiente ejemplo muestra la utilización de esta función: <H'I'ML:o> <liY. $JNltr U4.>"C1I\" i .current($~tri~) .. ''''1'0>'..matriz$j<C/b:o>\n".oR"·y. yc!low ~\n'l do! echo "<'tO>" .. ir if ($j.. Los elementos van siendo añadidos al final del arra)' precedente.ING.. l)~matrb:"$lIiIItru2: if l$j •• ll$matrJz.¡ra" . mat rltJ.trJz*$matr\zll t$:f. $NLtru2"'array ('1'.. "OJnlctad' . tort$j~1. e<:ho echo echo • <7D>"tp./T>< H_".JnCIrge ¡_t. !Mtr ~z3) '" b. aoRDER . o array_merge(matrizl. Matrice8</TITLE~ "H:hArraYA fw[~16n <I:o>array~rveo:.. whtlei!'lext($~triz))/ echo' echo· } </TR>\1'I'1 <f'tABL!:>\n' t </TD>\n'/ echo' </'!'lb\n'. "10' . '1' CEt.OR .--" O RA-MA CAPiTULO 5.. ) while(next($matri~)): echo' c/TR>\n': echo' <TR ALIGN='center'''\n". ..'15".$natr~zJ. sino que se actualizan con el último valor suministrado... n' ¡ eeho • ~ABLI!.

...miLi . .rhlU "<!TO>" </TR>\n"1 </TABLJt.tIid.o... ) "<"!'O>"...keyl$matri~M] . 11 ..!. ~le(next¡s. e ICtN1'llbo c/BODY> La siguiente imagen muestra el resultado: I "' ..'" "'" _11\ 0II1II .. ~l 100 100 pa ~ "'rill...........-..o</TD>"¡ lwhi le (next (Saw!trizM) }: . fWlCión <t>~rraY...dMI ~ !O....I . --.P4d</I></1I2> ..-a 01_ • "'l'loo" tio T -~ .atrizMJI ech) • edu • . relleno): Devuelve un arra)! igual a matriz.. tamaf5.current{S/lat. <fll'tMt.>\n" < ITD> \ n' .... l :rll~l~ o array-pad(matriz.> eeM' echo' <!TR>\n" erh) 'c'TAB~\n'.... pero modificando su número de elementos hasta alcanzar la longitud deseada (tama:f'!o) añadiendo nuevos elementos por la derecha (tamai'lo es positivo) o por la izquierda (tamano es negativo).]14 PlIP 5 A TRAVEs DE EJEMPLOS ORA·MA echo ·<~"...eho • </TR>\n". El siguiente ejemplo muestra la utilización de esta función: 'Im<" <KEAD> <TITLE>Ttabaj~ndo eon MatlicesclTITLR> <¡KEAP> <BOPY> ... h • . r ..>1 CID wca'f~'oo( .IlrioJJ 1~ 3 aMa iIda:n .._1.oo. <114>'" ' ay. .. echo" cTR ALI<aI"'ceoter'>\n"j r •• et¡$~tri~HJJ ~ <ID.

..llow·".'2'. echo ·cTD>'.(tK./~."1· C!tLLPADDIJIloo" 2" CItLLS.a_?_"" $Mtrld"2aarrav.tpo•• ·clTD>".-.".oa-'tPP8aAA'.rr.'2'~.ter" 8QCC:IU)lloo"yallow" ..·2'~.. eebo ~$poe>l'?""·:" ~"PP8IAA''''': ."'trhl.atar" aoc::ot.auzo" <'l'!»Po.-5.. 5.·c. echo ·cTO>'."cetl. .~...tvalor)-. .TH ALX~"ceater" I!QCOLOJloI*y..<)"""":" aoc:ot..TO> <'fABLB !JOIIDI!:R.rrayl-l*.. AI. ALIQN.... ALION..y-P&dl"'tri~l..tC~.·</TD>c/~"J I </'l'ABLE>< /1'D"..·Ylillow·~C'l'IJ 1JQC:QI.AJlDISa".lor.<TR <TR ALXQN.I.atri&l.$v..cbC"'tr1al..> wbileCl1atl$poa."c/TD>c/Tl>". ·1· CILLPADDrtfQ.aehI".-5. '.·catat. echo "<TO:>-' ."center" BQOOLOR."2" ec.-" '. La siguiente imagen muestro el resultado: .. • VJU.lII". "c/'l'DI>< 1ft>" ..'valor. echo "...'caDta:r'·.y~ls. <'rAILIt " -.:TD:>".ft ALII3II-'c...lCJla'eop'_'ftbo' .5."..·-'-·'fc/TH> .ter·~·.rray~I"'~1&l.tri"1-. <TA..LIlMCtIRJ..> •• col.·2"" colapan.---..tpoa. ... eCho ·<TD>·.IIL. $~ca' .TD>V.."y.( echo • ...c'l'K eol~..lor)·..r..ebI"'trlaP2"( eebo '<TI!."·7-·"..pw.llow"" <TD>Poslei6n... "2"..lorc/~/t.. • MbileCllat{Spo.1'-.lQfM"ceter" lo¡11\alc/'J"al> 8IJCC!oOIl.PlJ){ echo "cTR...·y. </T~c/'tfp <ti» cTABLI 1ORD... ~ .lor.. echo "po. .ped.Oft.LI'N:IDI'l.o\CllIIQoo" . ALIGN.e.·2" (:BLLSPACnto. ".rr-V . c"l'Il ALn."c.$po•• ·c/ft)joo.lorc/TD></Tft> ~1.c!BODY.oa... I <1'R.O RA-M" C"PlruW5:ARRAYS 175 ---''''''tnt:l-.)... .---------. ·0· CZLL. .'2·" oCft At..I:QN-'eet..'!'A8LI: BCaDIUbo"l' CID:..llow"" <TD>Poalcl6n</TD"<TD>V.. cJTABLB><JTD></TR> </TABLa> c/CDnBR> <.1ci6ncl'ftho~lorc/'f!> .tr1.'cl'rO>·." ClLLltJlCIMoo"'·~ <ft .$v..$..

.$valor):eachl$preeios¡ I ( echo '<TR ALIGN-'center.'center' 8GCOLOR. con Hatriee9</TITLE> . _ (_ .~ Svalor)¡ echo '<JTO></TR>'. <TR ALIGN... $preciOIl t 'prod7 ' ) _soo. f!ooIoooIoo """ .. ..5PAClNQ_· ~'... . se pasan como parámetros a la función array_walk (). func_usuario (. ..'6·~ <TR ALIGN:'centec'><TD> <'1'ABLI!: aoaoef{ .""". p.. el puntero inlemo del array se encontrará a1 ftnal de él. v . . ... .. Una velo aplicada la función.176 PIIP S A TRAVts DI! EJEMPLOS e RA-MA . .._....~l~·.."""' • HUI)... ~ . 'C' " . . El siguiente ejemplo muestra la utilización de array_walk (): . funci6n <I"array_walk<!r~<'Hl> <?php $pceciolt'prodl'j_1SOOt $prec!ol [ 'prodl ' ¡_1000 I $pcaciol [ 'prod3 ' ) "eoo ¡ $preci09['prod6' )_10C. al menos.. dos parámetros (el valor del elemento y su clave asociada): si fune_usuario () necesitara más parámetros."4' CELLSPAC1NC....lII . ? ~/HEAD. ~ . a array_walk(matriz.... · printf("'4d Ptas.Iad45-w.. VoIoor .. Freei oc ITO>< fTR> <?php while(llst($pos.... . parametrol): Nos permite aplicar una función definida por el usuario a cada uno de los elementos de un array.--' '"): ~ ... <TABLB 8QROF..TD ."O· CELLPADDINQ... ~ .-.<TD>~ Spo..CENTeR> ~H2>Array. 01 o -l'_V'" Arra)'s función armyJlUl .. ~TITL!>Tr&bajando .P. '1' CELLPADOING."yellow'> "'l'o> Prod!.:J-.. ~.. ..' '-.leto< ITe> <ro.. 1(0 _.... . La función func_usuario () recibe.. '2' CI!Lt... ". .

. /TAStE> c. echo ·</TO...lor/166. fuDctica aEUro. o'" pr<>e12 .. 'aSUroa'). $poa.e 11 i!lllt ($pO&. íTO .te~· BGCOLOR"'yellow'" .CRA MA CAPtruLO 5: ARRAI'S 177 .. .. .. ¡BODY> C/HTKL> La siguiente imagen muestra el resullado: ~ ... ...1'0>' . ..lk($preclo. etc. crn.2 Trabajando con porciones del array De igual forma que es habitual trabajar con porciones de cadenas de caracteres (modificar.21 €'. .> . • : printf {·\Ol. ' Cllnrer' > . .. ·¡ . proQ .. las siguientes funciones: .6. c1'R ALIatt-'cen. ) ..... resetl$prec1oBI ~ whil... también pueden realiz3ffle este tipo de operaciones sobre arrays.. $valor) "each {$precloa) ) ( echo "<TR ALICN ..... $valor) .. .(... )( $... entre Olras.. "" . 'TII.alor-$.)..... array_-.1OOOPW '-"---' -' 00<> "' ...{CENTE1I..TO:>Precio<l'!':):>o .. 'f'O.... extraer... .letO..0/1 (11 t to4 81 f ...... /TR ..>oProdl. ~ Pro_. PHP nos pro¡x>rciona.$~lor. ·c{TO.. " . pr") p...0<> C1Ol~ ~~ "lO 5.$cla.386. ) </TA8LE></TD>"fTR> .

$.·b'. . • H." ~TITLB>Tr~j. podemos indicar el total de elementos que queremos._11..~2.J) : eeho echo echo eeho echo echo echo echo eeho echo echo echo echo echo echo echo '<BR><TAB~a 9ORDER_'1'CBLLPAODlNO. illlPlodet '. '<TD>'. ' .3'</TO>·¡ '<TO>'. triz2).2.implode¡'·' .800'1. implode ( ' . . Los parámetros desplazamiento y tamafto pueden ser valores positivos o negativos.l-.to V.lar positivo Slan_ Posición de comienzo ne ativo Posición de comienzo desde el final 1: ••• 60 Valor positivo negativo 81gnWlcado Número de elementos a considerar Ultimo elemento a considerar desde el final Se consideran todos los elementos hasta el final del 8ITSY nuto Con un ejemplo vemos la utilización de esta función: . c:CENT!R> <K2>ArraY8 función <II?php <t>array_81icec/I></HJ~ $matriz~arcay('a'.. '<TU 8GOOLOR.atriz. tr1z. '<TU BGOOLOR...·~'. '</1'D>\n' 1 '<TR ALIGN~'centar'>'¡ '<TD 8GCOLOR.. $. ..lic.ndo con Hatric•• </TITLE> <JKEAD> .'centar'>'. .ll</~·: ·<TD>'..·c·.s. '<TR ALIGN..'yallow'>arraY_lliea($. Esto da lugar a las siguientes interpretaciones reflejadas en la tabla de abajo: 4ellPla.' • S_trh4) • '</TD><I1'R> ='n " -"'' -_ _ _ _ _ _ _ __ .O.$matriz3) .'</1'D></TR>\n'.ll : S~triz4 •• rraY_llica(S.'yellow'>array_alieat$matrlz.I 118 PHP5ATRAVltsDEElEMPLOS ORA-MA o array_slice(marriz.2l</1'D>' 1 '<TD>'. int tamafto]): Devuelve Jos elementos del array que están situados a partir de una posición determinada por desplazamiento.&trizll .·2. triz.'</TD></TR>\n'¡ '<TR ALIGN-'canter'>'¡ '<TD BGOOLOR. ·1¡</~·.·yallow'>array_.licel$matr1z.'e').O.($~triz.2..'2' CELLSPACINQ. S~tria3·arraY_Blice($Matriz.atcizl_arcay_alice($matriz.implode¡"·' .atriz</TD>'¡ "<TD>·. desplazamiento [.·</~</TR>\n·.implode¡'·' .$matriz) . '<TR ALIGN_'cefttar'>'. .2)r $matriz2_arcaY_Bliea(S.'2'>\n'¡ "<TR ALIGNz'eenter'>'¡ '<TO BGCOLOR*'yellow'>\$... Opcionalmente.'yallow·~arr4y_..

Slanlflcaodo Valor positivo negativo nulo Número de elemenlos a eliminar/sustituir Último elemenlo a eliminar/sustituir desde el final Se eliminan/sustituyen todos los elementos hasta el final del erray El siguiente ejemplo muestra la utilización de esta función: . si está indicado.ORA-MA CAPtTULOS.lBOOV'> </~~ '<(TAn""'\n'. . Los significados de los diferentes valores que pueden tomar despl y tam se especifican en la siguiente tabla: deo»l Valor positivo negativo Posición de comienzo de la sustitución/elim ¡nación Posición de comienzo de la sustitución/eliminación desde el final tul !Ii!'_. Elimina y.. .ARRAYS 179 I . susti tuye los elementos que están siruados a partir de la posición indicada por despl. '2 ' . Devuelve los elementos eliminados. d El La siguiente imagen muestra el resultado: e array_splice(matriz. .:' " <íCEHTEk> <e. despl [.tam [array substituto]): Elimina elementos de un array. sustituyéndolos opcionalmente por los elementos de otro array (substituto)..

1\ &-10. 1) . "C/1'ABt. 1< bol"" J. \.. Arrays función array_splice $Ul._lJ'k. 'd' .-e •...1.>< ITR> \n' i 'cTR ALIGN~'center'>'. M." "'I1J..~ .4. -1.~lodel'- ...aplie.1> .0 •. '</TD>c 1'l"R>\n° .1) ._4 ._~ 1~. . trill·Smatr1z2·Smatriz)·$matriz4~~triz¡ .l.rcay(-x'.\$matrlz</TO>\n'¡ '<TD>' . .5..·yellow·).Ib.21... 'c'. array_./IMoI.. S. TI\ ALIGN"" ~ho ~ho (.. ~) '" ITtl>' ..atTi~tl _·~J~<JTR:>'~·: ooh.o-c. '<TO)..nucnz. ~ho '<TR ALIGN_'center'>-..> ' .ISmatriz3.:> cHl:>Arrsya funei6n <I>array_splice</I><JK2> <>.arcayl'x'. 11</70>' I od>o ·c~'...$matritll •• </TO></TR> \n' ¡ 'cTR ALlaNe'center'>'...TD>·1 od>o ·cTO>' _ hlplodot ('..l. Smatriz:2) .-1).1¡ _. '</TI). . '<'t'O BGCOLOR"'yellow'>· f -arr. 1. 'y'll..ttt~' • ~' ¡ echo ~ho echo echo echo .' • Slll4triz) .. 'eTO aocoLORa'yellow'>arraY_Gplicel$matrlz. ..' .1¡nploóe f ' -' . <& ~ ~6I. 01 .countIS~tr1z1 arrav_. aa.. GT1LJ_FAo:l'(f.y_8pllce{~triz..:/HEAD).. $matril-array( os' • 'h'. ~ L¡.l...a:~. implode ( ..:CP¡¡ tIi. $matr1t:) . t'lltl ~. c'XO BCCOLOR_ · yellow· >array_. .· .E>" r'j': " La siguiente imagen muestra el resultado: "m 1it .. 'eO) ¡ array_ap11ce{Saatrizl.'y·))c.Mf'I7\"'V • ..pliee (Smatri z.rr4Y_1P1ie.pli~($matriz2..= .1. Kho 'CBR>eTABLE BORDtR_'1'CELLPAODING_'2' CELLSPACINGd'2'>\n'¡ to"hc... . 'c/TD>\n' I '<TR ALIGN_'center'>'¡ . ($matriz4.ho ~ho ~ho ~ho ''''TD BGCOLOR. ~bo '<'J'D 8GCOLOR_'yellow'>array_spl i ce (Smatri 1:.".-l)c/TO>·. ----------------------~--~--------<'EAD> <90D'f • <7ITLI>Tr~jando con Katricea<ITITLE> ..~) 1. 'eTO>' • ill'lPlode I ... ISO PIIP5ATRAVt5DEElEMPLOS CI RA·MA <~~ .s.

.. array-POP.6. .push(matriz. 'V41enc:111' .Y-PUlh. .. a array_unshift (matriz. J): Inserta uno o más elementos al final de matriz. $BOTQN-S_POSTI'BOTON']: $pil~·expl~I·-· $PJLA). Son estructuras con una gestión de tipo UFO (Lasl /11 Firsl 011/). "Z.·· . valor2. <:CEN1'Elb <=/1f2> <Hl>Arrays funciones <I>arr. S_POSTI·datol' 1: $dato2·S_POSTI·dato2'J. ] ): Inserta uno o más elementos al principio del array.'U1l realizar Ins operaciones anteriores sobre dicho array: ·HTML> <HEAD> <TITLB>Trabajando con HatriceIK/TITLE> ~/READ> <80DY. .bltt y accaY_lbift</I> <?php if \llI\Pty {LPOST ( 'PILA' l ) ) ( $pila"array ( • Alava' . es decir. Devuelve el nuevo número de elementos.. I $PLLAdS_POST[ 'PILA'JI Sdatol . valorl (. PHP proporciona las siguientes funciones que nos permiten trabajar con los arrays como si fuesen pilas: a array.. •• .y_l~iftCSpi14) : break. valorl (. Devuelve el número total de elementos contenidos en él.atol .. array-PUshCSpila.. $d. array_un.ORA·MA CAPtruLOS:ARRAI'S 181 5. El siguiente ejemplo muestra la utilización de estas funciones: nos presenta una tabla con un array y cualrO botones p..pop (matriz): Devuelve y eljmina el último elemento del array (el que se corresponde con la cima de la pila). <-" ~>' 'PUSfI Sd. switcheSBOTONI casI 'Sf':I" c~S. e18.ta·) . valor2. el úllimo en llegar es el primero en saljr. SBOTON*·· ¡ } $d... Q array.3 Usando arrays como pilas Las pilas son esttucturas de dalOS en las que la inserción y la recuperación de los datos que almacenan se realiza bajo un orden prefijado.. "Bilbao' • 'Madrid' .$datoll' __________________ .atoZ..atol·arr.. a array_shift (matriz): Devuelve y elimina el primer elemento del array (el que se corres¡xmde con la base de la pila).araqo.

~" eGCOLQl\.KTKOo-' POS'l'".... • 'J"~'''''''' ...... ... ..'&mP't <e . ALIGN_·ce.*. cf"ORM AC'I'ION.. _ ..tNC'" 11 '."SUBMIT' NAMEoo-"BOTON' VALUE.Sv. 1...... ·4' CELLSPIoC.) <INPUT TYPE"'RIODEN" NAME.·2'" <TD>Posiciónc/TO><TD>Valorc/TO>c/Tfl> <?php whilll(list($poS.$v. .'BO'IU!I' VALuz.ak."t.'popl$plla¡ I bre.. .·y . rUllt ($pila) : $n~·.. . ~ . v_ 1 ..i%eofl$p11..-'-> 1'?P'> <I TI» -C / 'MI> .. ease • <.. I . ~ r. ~TR ALIGN~"center'~ ..'I(~oII .$po•.'PlLA" VALUB"'<?php echo 1mplodel· </fOOlU4> c/C!N'!'ER> <l800Y.to:!' ?..)/ </TABL'E> ~ ·.• '><Bfl>cBR. ----------------------~ eaS8 '.UNSHIP'I"..'TEXT' NA)tEoo'4ato2' VAWB.o • "'- J .'SU5MIT' NAKE. <DlPUT TrPS_"TEX'l" NI\.lor.. Sdato2..'9OT(lN' VALUE.atol' VAUUE ' "c?php echo 'S4at02' ?"':o~BR><B~ <tNPU'l' TYPB.'c?php echo 'So._ .."2" CtLLSPACING... cTULB 8OROE:R. "''%'JI.&>< 'TO> <TD> cINPUT TVPE..BR_SR> <INPUT TYPE.'ptJSH <ITI» -..o..'><B1t><BJt> <rnPIJT 't'Y'PE""SlJBHt'l" NAME...tmSlI1FT'... ) } <"t'D> <INPUT T'fP&--SUBMIT' NAM!too"II01'ON' VALUZ. • MM "'" ..uyaY. '</TO" ' / { echo } 'cTD> · . .... I ..> POP' $daeo..lor'~eaoh($pjla)) echo '<TR ALION_'eenter ':>o<TO>".'.182 PUP :5 A TRAV~ DE EJEMPLOS C RA·MA I ------------~----~ _k~ . .·c?php echo LSUVER ( .. . .> oT. : break. . PllPJJELP' 1 1:0' H..." O' CELLPAOOlNO. ..'c/~</TR"'...$pil... lluw·" cTABLB BOROEfl_"l' CELLPAODING. . 7>'> el El ejemplo se muestra en la siguiente imagen: 1..KE>o 'd. array_unah1ft ('pila... _ ~_'" ~ . . e/TABt.....¡-..

ambos inclusive. función o compact () : Esta función recibe como argumenlo una lista de variables que han sido previamente definidas." I a array_reverse (matriz): Devuelve el array pasado como parámelrO.S 183 I NOTA: En ." profundidad . "RIlAY.jemplo MI hace USO de formularios qu. o range (limite_inf. limite_sup): Devuelve un array con los valores enteros comprendidos entre el primer argumento y el segundo que recibe la función. pero con sus componentes en orden inverso. o array_count_values (matriz): Recibe como argumento un array y devuelve OlrO cuyos índices 500 los mismos que los del array original y sus valores asociados son la frecuencia con la que se repiten dichos valores en el arrayoriginal. que pueden aparecer como cadenas de caracteres o como arrays y devuelve un nuevo array en el que los [ndices son los nombres de las variables y el contenido de los elementos del array son sus corresJX>ndientes valores. . aerán eapi~ poeletiom:_ ~ .CAf'fTuLO!'i. a ifLarray(elementoJmsqueda. matriz): Con esta podremos saber si un elemento está comenido dentro de un array.

Una función PHP es simplemente una sección separada de código a la que se le ha dado un nombre (cualquier instrucción PHP válida puede aparecer en el cuerpo de la función.nan parámetros o argumentos y pueden devolver valores. Esta estructuración del c6djgo nos permite escribir JCriplS más sencillos.1 TRABAJANDO CON FUNCIONES La mayor prute de las secciones del código de un scripl PHP deben ser ejecutadas tan pronto como dicho SCriPI es interpretado. agrupando instrucciones relacionadas paru lu ejecución de una tarea. Utilizando este nombrc. para que cada una de las cuales sirva a un propósito espedfico e individual. se usarán como variables locales dentro del bloque de sentencias que conforman la función. Estos valores se denomi. pero. También es habitual que partes del código se repitan un número indeterminado de veces dur. como veremos más adelante. otras veces. es preferible que el código actúe después de que se haya producido alguna acción especffica o s6lo si se dispara un evento. incluso la llamada a olta función o la definición de clases). Las funciones pueden recibir valores desde las sentencias que las llaman. las funciones dividen las tareas que debe hacer un scripr. Por tanto.mle la ejecución del scripl PHP. . Los parámetros. en un JCripl se puede llamar a esta sccción de código tantas veces como se quiera y en los momentos en que se necesite. legibles y fáciles de entender.CAPíTULO 6 FUNCIONES 6. Estas necesidades hacen que nazca la idea de dividir el código de un scripr en parte~ menores.

1.1. sólo hay que escribir una sentencia que contenga el nombre de la función y. los argumentos son variables que contienen informaciones necesarias para que la función realice correctamente su labor y que son pasados a ella en la sentencia de llamada. NOTA: En PHP3las funciones debetl deftrwrse enl" de ter 1la1Nldas_ En PHP4 no eute esla restrico6n 6. simplemente hay que volver a llamarla: una función puede ser llamada tanLas veces como se necesite. se encuentran los nombres de los parámetros. que conforman el núcleo de la función. en la declaración de la función deben escribirse los paréntesis. 8n el momento en que ocurre esto. Aunque no se incluyan parámetros. Para volver a hacer uso de la función .186 PflP 5 ATRAvtsDEElEMPLOS O RA-MA 6. el cual sirve como identificador para el conjunto de sentencias comprendidas entre las llaves. Las sentencias. nombreFunci6n. 11) ( [sentenci a s ) ) La palabra reservada functi on se utiLiza para especificar un nombre. El resultado es el mismo que se hubiese obtenido al insertar todas las sentencias de la función en la posición de llamada a ella.. . los valores de los argumentos de llamada de ella. Después de ejecutar las sentencias que componen el cuerpo de la función. Encerrados entre par~ntesis y separados por comas.. el programa salta de nuevo a la posición en que fue llamada la fun ción y continúa su ejecución. . Técnicamente. ésta no se ejecuta hasta que se le llama desde cuaJquier parte del script. la ejecución del progmma salta inmediatamente a la primera línea de la función llamada. entr\! paréntesis. Para llamar a una función.is de la declaración de una función es la siguiente: f unc t ion n ombre Funci6n ([ parame tro l [.1 Declaración de una función La sintax.2 Llamada a una función Una vez declarada una función . que son los que recibirán los vaJores con los que es llamada la función. son ejecutadas cada vez que se llama a la función .

IU..·.l0.-O RA-MA CAPtruLO 6: FUNCIONES 181 El siguieme ejemplo nos muestra de una fonna sencilla cómo definir y llamar a una función.· .· CELLSP.-6"" <TR ALIQN.$i>O:Si-~) echo $i. Como podemos observar.lNO. se trota de una función declarada sin parámetros: <IM'I<L> <HIW» ~TtTLe>Tr~jando eon Punc1onea</TITLE> «111!1. <BR>' ¡ echo • i Booooon l' ¡ ?> C'TABLE BORDBR.s t) : ?> </TD> <TO 8OCOLOR-"PFFBAO'" <.?> </TD> euentaAtr"'s() : <ITa> </TABL€> </CENTER> </800Y> (/KTML> El resultado se muestra en la siguiente imagen : .·center'> <TC BGOOLOR_"FFBBAA'> <7pbp c:uentaAtra.'O· CELLPAllOING..0> <80OV" <C'EIITER> <H2>Puneiones da Osuar1o<t>< ¡><tal> <?php function cuentaAtraa(){ for($i.

. ~_ . B 7 4 3 2 1 (Booooom I 6.188 PHJ>!iATRAV~DEEJEMPLOS o RA·MA .. .> c(ff&AD> . Por ejemplo. podemos querer utilizar una función múltiples veces a lo largo del programa..3 Paso de parámetros En ocasiones.h UtMi. El siguiente ejemplo muestra una modificación de la función presente en el código anterior para que el inicio de la cuenta pueda ser configurable por el usuario.>Tr. necesitaremos definir funciones que aceptan parámetros o argumentos. pues se hace mi.1. Pero esto incrementa la confusión del código y su mantenimiento. Como podemos observar.O l Funciones de Usuario 10 .. difíci l segu ir su comportamiento...S. los parámetros se utilizan como variables dentro del cuerpo de la función: """ <HEAu. De esta foona conseguimos que la función sea más utilizable dentro del propósito general para el que está definida. cTr-t. D~ ¡... Ir fMt... MoI:tJ..ba linde con Funclonesc/TITLS. pero algunos de sus valores internos pueden variar con cada llamada.. Otra fonna de solucionar este problema es utilizar variables globales (las veremos en una próxima sección del capítulo) que puedan ser modificadas tanto dentro. como fuera de la función. I~ hllp.. . La mejor solución a este problema es definir una función que pueda aceptar argumentos en su llamada para cada valor con el que queramos trabajar.

.o?php cuentaAtraB {SI.-·'FYBBI\A·" . </CEN't'ER'" . El siguiente ejemplo nos muestra una combinación de estos elementos pasados como argumentos a una runción: . oeTABL! BORDER~·O· CeLLPADDINQ_'4" CeLLSPACINC.. </TO> <l/TR> <l/TABLX:. <ITO> <TO aocOl. . esta infonnación puede suministrarse mediante una lista de variables y/o constantes separodas por comas.$lnlcio:$i>O:$i . .o'rl) BOCOLOR." tFFT8I.ORA·MA CAPITuLO 6...QR. "."".. . .~ ""' ... Em'ER' <H2>Punc1ODea de <?prp O~iooel"'< 1"'</H2". •• cuflntsAtras(51. .."center'> .... .·' ect • &oooooaI !'... <BR"._ '~'" "'I·r- Funciones de Usuario . ... .) ~ho $i.". Dado que en la llamada pasamos valores a la runción.•. ."6" <TR ALIGN.· . . RJNCIO!\'ES 189 oeBODY".1>'''' <?php .ollm: El resultado se muestra en la sigu._.iente imagen: . function cuentaAtras!$lniciol ( forISi.

"".= Funciones de Usuario ..· • • _<...190 PHP S A TRAVEs DE EJEMPLOS CRA-MA ·'¡n~L> <HEAD> <TITL!>TrabajendO con Funci ones</TI TLE> c/HRA~ <BODY. " <fTABLI!> <ICENTER'" </BODY> ... ~I __. . "r·-.. .fiD.'IPPPBAD'> c1php ~J. <I~I!:R> cHl>Punclon•• 4e Usuario<I></I></Hl> <?¡:¡hp O.dio U. O). ..___.R>·¡ eabQ • I &oooo<xa l · I ) cTABLE aORDER-'c' CELLPADDING~ ' 4 ' cTR ALIGN ~'eenter'> <TC BGCOLORa'IFP8BAA'> c?php cuentaAtra8(11...-) -..fiDahl¡ functlon ~taAt~.ria_CUanta-. t-J.. .. _ _ . $fin)( fo~(¡.$~f1nalll " CELLSPACINQ~'6'> CITO> c1'O BOCOLOR.'''' • I • ) .. .8u..ntaAtr•• (8 Pi~'u&ntal I cJTD> " ..inieio>$fin¡$inieio. .( ..nicio. .. El resultado se muestra en la siguiente imagen: ... ...' .. ( $inieio. ...

además de nombrar el parámetro. De este modo. éstos tienen que situarse los últimos en la declaración. Como su propio nombre indica. este tipo de parámetros toma un valor predefinido cuando.2 Parámetros por referencia En el caso de que queramos que los cambios que se producen en el cuerpo de la función afecten a la variable que se pasó como argumento en la llamada a la función deberemos pasar el parámetro por referencia. hay que marcarlos en la definición de la función. podríamos pensar que las modificaciones que se realicen con dicho argumento dentro del cuerpo de la función afectan a la variable. En el caso del paso de parámetros por valor. escribir el operador de asignación (.3 Parámetros por defecto Los parámetros por defecto son la forma en que PHP implementa los parámetros opcionales en la llamada a las funciones. hay que.'! ha proporcionado ningún argumento. desde la llamada a la función..3.3. es decir.3. anteponiendo el s[mbolo ampersand (~) al nombre del parámetro. 6. de esta forma.1. los cambios que realice sobre el parámetro se realizan sobre la variable. en este caso. Cuando se usan parámerros por defecto...O RA·MA CAPtruLO 6: FUNCIONES L9L PHP permite pasar los parámetros de tres fonnas distintas: por valor (el comportamiento por defecto que hemos visto en los ejemplos anteriores).1. las modificaciones que puedan hacerse dentro del cuerpo de la función a la variable parámetro no afectan al valor final de la variable pasada como argumento. no se Ie.1. que es la opción por defecto en PHP. 6. a la función le llega una referencia a la variable y. Para indicar qué parámetros se pasan por referencia. de otra . a la derecha de cualquier parámetro nomwl. por latllo.. Para definir un parámetro por omisión. a continuación. 6.) y. por referencia y con parámetros por defecto. lo que recibe la función es una copia del valor de la variable pasada como parámetro.1 Parámetros por valor Cuando pasamos una variable como argumento en la llamada a una función. el valor que vaya a recibir el parámetro en caso de 00 especificarse en la llamada.

ott."'/'!'ITLE:· . aoco e » 1-) ( .fu.jando con </HUI» f'unclOfllll. _~8R>' ¡ Sfin_Sfin. ·. 192 PI IP$ A TRAVts DE E1E. OOO'i> <C!.$inicio· -) echo $inieio .·'PFPBAO·~ <?php J $mifinal vale J o.t. __. =_tUtl'•• ('.rt:.JIA1" 1'· </TO.uoriamente han de utilizarse todos los valores por defecto de todos aquellos parámetros que se encuentren a su derecha. taifi. NOTA: En PHP " 0 tarrtHn es posibMI espec:ibr ". <iR ALJQN·'center'> <:-: "-.QR.\tPLOS CRA-MA manera.wvumento no tomariIl'IIf'IIlU" \I8k)r en absoluto ti el valor no es sumlRSltado.·4· CELLSPAC)OO.~i. ( 6.· <TU BGCQ~R. SIIIifina1 vole O $1II1final vale 2 _ _ taAtr.N't'tR> <H2>Puneiones de Usuario</ H2> <?php fUIICtiOll <N_taAtr•• "iA1cio..' 'FFBBAA' • • 1pt-. oblig.. " </'rO> </TR> <J't'AlIL8> </CENTER> </BODY> </HTML> El resultado se muestra en la siguiente imagen: .. .o'Y :. 2¡ echo $<nensaje. Cuando se util iza el valor por defecto de un parámetro.... .> ~TABLE Bt'IROO"'O' CELLPA[.'EM» <TITLE>Trabe. Eslo 5Ignw que el .... talfiaal._:1_-..'fj·". .~nx. forl:$inicio>Stin. las cosas no funcionarán de la forma esperada. El siguiente ejemplo nos muestra el uso de estos tres tipos de parámetros: <HTKl· .· I 1/ $mifinal vale 4 l·). como parMnetro por defecto..

desde cualquier punto del código. Variables locales esl61icas son variables locales que tienen ámbito local: por defeclo. Cualquier variable que se use dentro de una función eSlá. es decir. y se destruyen cuando se acaba la función .<¡ variables. • • .4 Ámbito de las variables Una vez vislas las funciones. dentro de la función trabajaremos con la versión local de la variable... podemos definir dos tipos de variables respecto a su ámbito: o Variables globales son lodas aquéllas que se definen fuera del cuerpo de una función y son accesibles.1.es del código del programa o scripr son accesibles las variables. Para o . De eSla fonna podremos detenninar desde qué pan. En PHP. Un segundo método para acceder a las variables globales desde un ámbito local es usando el array $GLOBALS (es un a"ay asocialivo con el nombre de la variable global como clave y los contenidos de dicha variable como el valor del elemento deltlrmy).. si declaramos una variable locaJ con el mismo nombre que una variable global.. Básicameme. CI Variables locales aparecen definidas dentro del cuerpo de una función y sólo pueden ser accedidas desde dentro de eSla función. anteponiendo a su definición la palabra reservada global. se crean cada vez que se coJl'tien7... del contexlo denlTO del cual existen Ia.. 7 6. por defcclo.a a ejecutar la funci6n que las define.0. podemos abordar el problema del 6mbito o tI/callce de las variables. en generaJ.C RA-MA CAPh1)LO 6: FU:-ICIONES IQ~ Funcionel de Usuario • • . las variables glabaJes deben ser declaradas globales dentro de la función si van a ser utilizadas dentro de dicha función. limilada aJ ámbito local de la función. &10 quiere decir que.

. evitar que una variable locaJ pierda su vaJor entre diferentes llamadas a la función que la define.. anteponiendo a su nombre la paJabra reservada static.O. -6") <TR ALIGNo'centero> <TD BGCQt. for(..Sm1final...194 PUP S A TRAvEs DE EJEMPLOS::. !unction cuentaAtraa¡)( I1 variable glo~l global $U/UllJ 11 variable local $inicio-7¡ 1/ variable eatAtica atato!e '_0. f80O"t> El resultado se muestra en la siguiente imagen: .. hay que definirla como variable estática. cuentaAtras()¡ 11 Snum vale 1 . El siguiente ejemplo nos muestra estos tres tipos de variables y sus diferentes comportamientos: <H'rHL> <NCAD> ~TITL!>1Tabajando con runc1onee</TITLI> </Hr..CELLSPACINQ .. '¡ 800000III -$nUUl.[' ¡ } <TABLE 8ORDER. 'O· CELLPADDING-"... cuentaAtras(8.$lnicio--) eeho $inicio.$inicio>$final.AD> ~IIOOY:> <CEN'tER> <H2>Funciones ee Uluario</H2> <?php $in1c10_9r $fi/Ull. pero no pierde su vaJor cuando la ejecución del programa abandona este ámbito. 11 $flUIl:I vale 2 '¡ De3pierta [') I </TO> </TR> <¡TABLB> < ICEN'!'ZR> .OR_-'PPBBAA'> <?php </TD> <TD BGCOLQRs'tPFPBAO'> <?php . Una variable estática existe sólo en el ámbito local de la función.·" <811>'1 SnUIII++ ¡ ~ho ._ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _--=C~RA:::::-M~A::.

</KEAD> <SOD'!:> <K2>runcion•• de oC?php uau~io<I></I:><'H2> function .1. 7 4 . Pm.. deberemos utilizar un array. Se puede devolver cualquier tipo de valores incluyendo lislas y objetos. es habitual que aparezca como última instrucción del cuerpo de la funciÓn. también pueden devolverlos. En el instante en que aparece dentro del cuerpo de una función una sentencia con esta palabra reservada. C.1~yorzISdatol>$dato2J?Sdatol. Para poder hacerlo. dichas Uneas no se ejecutarán nunca. pero sólo un único valor: para devolver múltiples valores. El siguiente ejemplo muestra la devolución de valores desde una fu nción: <HTML> <HUD¡o. 3 1 I Booooom -2.5 Devolución de valores Del mismo modo que las funciones pueden recibir valores.lMayorl$oatol. Si después de return hay más líneas de código. olver el nujo de ejecución al punto del programa donde se llamó a la función. de manera que el valor devuelto desde una función puede ser asignado a una variable o utilizado dentro de una expresión..CI RA-M .Sdato31{ $. la función deja de ejecutarse para de .! 6..$dato2 .. se utiliza la paJabra reservada return acompañada de una expresión..$dato2.. por eso. La devolución de un valor desde una función lnlbaja de igual forma que la devolución de un valor en una expresión.. .rL06:FUNDONES 19' Funciones de Usuario .

9 e.fUTm. o( 112)0 . pero su funcionamiento se basa en el siguiente conjunto de funciones definidas en PHP: e func _num_args ( ): Devuelve el número de argumentos pasados a la función.~·'FTFSMI"> "?phI:! echo "It. ..• lKayarC17." ~E.-PAOO~·. . "". TI):>- c. es decir.S.6 Funciones con número variable de parámetros PHP nos pcmlite definir funciones en las que el número de parámetros no está fijado a priori. en PHP se consiente que una función reciba como parámetro una lista de valores de longitud variable.. 9).)o" .. _yo¡:.1. c. de 17. !MOY.. No se necesita de una sintaxis especffica. S y..!"PAr~Na- iIl")o ~TR ALI~' enter'> <Te aacou. . _ "W!><K:. S. 17 6.LL..JY6 PHP' A 1'RAvts DE> EJEMPLOS o RA ·MA $_ .'l"ABLI> "/C!:N1"RR . .atOJ ."or CEI... ~tu~n yor"'fSe yQr>$datoJI?SelmaYOl" $d.$elmayorl c'-A8LE se xrt. El resultado se muestra en la siguiente imagen: Funciones de Usuario El mayO! de 11.

returo $el~yor.5.7.. 1\Ier1i del euerpo de una tu"""" El siguiente ejemplo muestra la utilizaci6n de estas tres funciones: '1n'HL."O· CELLPADDINGc°4" CIn.ORA.19). 1:.11."FFrBAD'> <?.. ai bien el PI~ . con Punciones</TITLE> <90DY> <C!NTER> <H2>Puncione.elM4yor(1. "'MEAD> ~TITL8~Trabajando o(/HEAD~ ..1.ar9$¡ l: '4~• • tun~et-arg.$i<$n~rq.u4rio<I~</t></H2> tunction elMayorll ( $1WIIL4rva • f~nwn.80..$i++l $elm4yor·(Selmayor>Sargs[$il¡'Selmayor:func_get~r91. a func~et_arg ( ): Devuelve un elememo de la lista de argumentos pasados a la función ."cent. </TABLB> <ICENTER> </80DY:> . <TABI.35...22. 191.. '</H2>'.'<fH:I>"/ " . Si se solicita un argumento de una posición que no existe. puede lOIventar ~.ndo un amly como pilrimetro TodaI 1M ~ anterlorn gerMtllln un aYiao al son lamaclas ele.MA CAP{1lJLQ 6: FUNCIO~ES 197 a func_get_args (): Devuelve un array con los argumentos pasados a la función. al igual que los arrays. 22 y 19 es <8R><H2>' .> < .12 Y 19 ell <8R><K2>".r"> <TD BOQOLOR. 22. </tn'Kt. 5.. 35.. S.Il BOROER.fllMayor¡17...22. 7. 80..Laayor_($datol>$dato21?Sdatol... devuelve falseo NOTA: PHP3 no soporta un número variable ele ~r6matrot.chQ 'SllMYQrde 1.ll. de c?php U.Sdato2¡ for(Si·2. Los argumentos comienzan en la posición O.. .php " ficho 'El mayor de 17.LSPAC'ING-"/j"> <TR ~lGN.

Funcion~</TITLE> <Hl>J\mcionea de u8u.:> <HBAO> <TITLE>Trabejando con «liBA!» <90D't> <CEN'l'ER).7 Funciones variables Son una herramienta muy útil de PHP que pennile implementar.6t.·.. PHP buscará una función con el mismo nombre que el contenido de la variable e intentará ejecutarla. 7.($datO) ( t.y(· .2300. El siguiente ejemplo muestra la utilización de estas tres funciones: <HTHI.5 A TRAVa DE EJEMPLOS CRA·MA El resultado se muestra en la siguiente imagen: 1 .Dol.rT . retrollamadas (callbacks) y labias de llamadas.·)' 8printf{·'Ol. ""..22..7000J l runction aEUroa¡$dato)( return ) •• ·.1 Funciones de Usuario Fl mayor de 17.35.2f".1.~ro.2f".n. 5.)6)1 . Su funcionamiento es el siguiente: si una variable tiene unos paréntesis añadidos al final.r $Pteeio•• "rray{lOCO.S~to/166.------------------------------------------------~.80.pdntf("'02. entre otras cosas.~r.. --- 198 PIIP.printf!" 02. ) functlOn aTen.tu.$datO/195.386) J function aDo1ar •• I $dato} ( tetuen .l:io<1:></I:></H2> c:?php 'array fune.12 Y 19 el 80 6.lf" $~toI:106. 22 y 19 C~ 22 FJmayor de 1.·.y.·.

.8 Funciones recursivas Se dice que una función es recursiva cuando en algún punto de su cuerpo se Ilamn a sí misma..1..'Center'>".$funcionISprac:loal$il).O. YtDI 1000 0601 os 11 2300 7000 13 82 11 76 lll!i ..ORA-MA CAPInJLo 6: f<1JNCIONES 199 cTAB~! BORDER. . /T. 'YELLON"> c~>P ••• t •• </TD>c~EuroB</~<TO>061are.79 33." .<ITtb c/TR> <?php torISi .5j •• ' t Sf~ion·$array_tunc(Sjll .Si •• ) I eelw "cTR ALICN. forISj."c/TD>"."c:. Hay que lener cuidado al escribir una función recursiva. Por tanto.. ) echo "</TR>'.izeof!~rr.. .y_func) . es esencial asegurarse de implementar una forma adecuada de tenninar la recursión: es lo que se denomina como condición de parada.> El resultado se muestra en la siguiente imagen: Funciones de Usuario Pu_ ~ D6!1re. O¡Sicalzeof ($prec:ios) ...$jc..")" CELLPAODINGt"2" C~PACING~"l"> cTR ALICN.che "<TO> ..cbo 'c7D>$prec1Q81 $i 1 ciTO:. ) ? . .ter" BGCOLOJ.BLIt> <ICENTI!:R> </8001/> </trrM\.92 6. ya que puede ocurrir que se llame a sr misma indefinidamente.. " 2m 35.c~<TD>Yen..

un ejemplo típico de recursión es hallar el factorial de un número.>ADDING. $nwnero>1: $numez:o· ) ( Stacl!orial·.oo·.... El siguiente ejemplo nos muestro cómo implementarlo en PHP: .. return $numero • faetorial($numero~lll function tactor_iteraeivo{$nurneroj ( echo "$numero I .Snumero."l' CELUP-'Cll'a. td>-2</td> <TO><?php echo tactor1al(2).e/TD.al(3).ÚrI</td> eTQ>'.tivo (4) t>< 11'0> </TP:" <TP: A.~OI ~. i'><{TO> <TD><?php factor_iterativo (3) I 7>< ¡TO> </TR> cTR ~LION"center'> <td>4</td> eTD>e?php echo tactorial(4). <TITLE~Tr5bajando con FUncioneB</TYTLE> "/HEAl)><SODY> <CEN'tER> <H. Bebo • S"WI'Iero x '.. <?php echo ta~torial(51. for (5facl!orial_1... 1 <1'J\BLE IIORDeR. aeeursiva</TO>eTD>l"\lnci6n No P:ecursiva</'t"D> < 1T¡t> cTR ALIGN~'center'> . 1></TO. i'><'TD>eTO>-c?php facl!or_iterativo(2) J ?>c/TO> . .ctot_iterativo(SI¡ ~></T~ .5 A TRAVá DE EJEMPLOS CRA-MA La recursión nos vale para solucionar algunos problemas complejos. 1 . '.t· .'I:>l'UncioneB "-e l!Buario<I>-". "'TO>-<:?ph¡) factor_itera.. In ."1' CELLI. return líactorial. I></H2> <?php functlon faceorial($numerol \ if (Onumoro..turn l. <TR AL[~N··center· BGOOtoR~·yELLOW·> <td>N>. "TD><?php f. <TR A~tGN~'center'> <td»</td> "'TD><?php echo faetorJ. <REAL .. echo "1 • Síactor!a1'.200 PIIP.¡.LtQN"·ceater·" "td"S</l!d> <re.

> El resu ltado se muestra en la siguiente imagen: r'" 3 Funciones de Usuario 2· (¡¡.. </T"flLE> </CDn'ER> . -- 51-5x4x3x2xt-120 j ..1-2 31-3J:2x 1-6 41-4x3x2xl-24 • I ' 2• 12..~""-r 2 6 -~ F....... BOOY> <..JrI!on.----· RA-MA CAPtruL06:FUNCIONES 201 </._N.R... 2'-2...

'comportamiento'. A diferencia de los lenguajes 00 nativos tipo Java. en toda ella nos encontramos con ciertas palabras un tanto grandilocuentes al estilo de 'encapsulad6n'. que suelen generar una cierta impaciencia en un programador clásico (procedural) y provocar que la POO se vaya dejando "para más tarde".. . Sin embargo. ) ) ( !!: echo "Hola· . El nuevo mOlor Zend (Zend Engine 2) ha sido rediseñado por completo y proporciona todos los mecanismos necesarios asociados a este paradigma de programación. a partir de esta nueva versión. nos provee con un soporte muy complelO para la Programación Orientada a Objetos (POO). la literatura que podemos encontrar sobre la POO es mucha y muy variada.. As!. en general. valga como ejemplo el programa más simple • escrilo en Java y en PHP• que nos imprime un mensaje' Java public class Saludo ( public sta tic void main(String[] args) System. C++. PHP es un lenguaje de script en el que no es indispensable dominar y conocer toda la parafernalia de c lases que incorpora el lenguaje. cubriendo las carencias de las versiones anteriores. 'abstrad6n'.out. De hecho.• CAPiTULO 7 PROGRAMACIÓN ORIENTADA A OBJETOS Por fin. 'herencia'. ele. etc. 'modeliZiJci6n'. Eiffel. podremos usar PHP indistintamente. 'polimorfismo'. en sus dos facetas: Procedural y Orientada a Objetos (00). Por otra parte.printC"Hola") . PHP 5. según el gusto personal.

explicar tcoría de la POO. creamos un objeto a partir de la clase declarada. esta tan extendido su uso que seguiremos utilizándolo. de hecho. no existe con esa acepción en castellano. No obstante. Esta redenominación se justifica porque en el enfoque OO. en la POO. la clase serfa el plano y el objeto la casa. en este capÍlulo ¡remos entremezclando los conceptos de la 00 con las herramientas que PHP5 nos ofrece para su implementación. La relación que hay entre éstos. es la misma que hay entre un plano dibujado por un arquitecto y la casa o casas construidas a panir de ese plano. en la práctica.1 CLASES Y OBJETOS En la POO vemos que aparecen constantemente dos entes principales: las clases y los objetos. por último. ejecutamos el método contenido en el objeto: La traducción de la palabra inglesa. 'muestra'. no es el propósito de este capítulo.W4 PHI' 5 A TRAVa DE EJEMPLOS CI RA-MA Por supuesto. por un lado. por otra parte. instance' a1 caslellano es 'ejemplo'.1. dicho de una manera sencilla e intuitiva. el proceso que está ejecutándose con el contenido de ese flchero: podremos crear o ejecutar tantos procesos (objetos) como queramos a partir de un mismo fichero (clase). siempre trabajaremos con objetos y. para poder utilizarlos. útiles y reaprovechables. y el significado con el que se utiliza en lo POO es el de 'creación de un nuevo ejemplar'. Los objetos. asignamos un valor a la propiedad del objeto y. Por tunto. Desgraciadamente. el fichero ejecutable que contiene código máquina y. la nomenclatura cambia.1 Declaración de una clase y creación de un objeto A continuación definimos una clase que contiene una propiedad (una variable) y un método (una función). I . 7. ni del libro. Otra equivalencia válida sería. por otro. La palabra 'instancia' es una mala traducción porque. primero hay que declarar una clase y luego crear un ejemplar o instanciar l un objeto de esa clase. sino mostrar cómo esta metodologra puede ayudamos a hacer nuestros programas y aplicaciones más fáciles. y las funciones realizan modificaciones sobre dicho estado. de manera que las variables que contiene un objeto reciben el nombre de propiedades y las funciones se llaman métodos. no son más que una colección de variables y funciones que actúan sobre esas variables. En la POO. Por lo tanto. definiendo el comportamiento del objeto. las variables contienen infonnación de estado del objeto. 7.

Además.mJ primer _obieto->.)"¡ ) $. Vemos que en el código aparecen dos palabras reservadas: class y new.ando este par'. • 1 La verdadera pOlcocialidad de la POO.2 PRIMER CONTACTO CON LA POO En este apartado queremos mostrar que sin lener conocimientos previos sobre los conceptos asociados a la POO es posible programar utm1. intentaremos haccr ver la conveniencia o ventaja. 7. observamos que para hacer referencia n cualquier miembro del objeto (propiedad o método) usamos el operador '->'. Para ello. ?. pam resolver este ejemplo de manera más elegante. aquellos que ya esten ramiliari7. .. y mucho más eficaz. de usar objetos en lugar de runcione'! y variables.ados con este paradigma pueden ir direclamente a ellos. ~ _Primera_elape var $mi-Pt~r. color de fondo) y su contenido (Iipo de lelnl. no haremos uso de ningún concepto asociado (abstracción. alineación horizontal. herencia. etc/o dado que lo que pretendemos es hacer ver que trabajar con clases y objetos está al alcance de cualquiera. tipo de letra.¡aludatl'le! 1.07: PROORAMACIÓN ORIENTADA A OBJETOS 2O~ . polimorfismo. tamaño. color)3. vamos a resolver de las dos formas distintas el siguiente problema: queremos generar tablas HTML cuyas filas tengan un aspeCtO (colores.-prop1edod¡ function aaludame" ( echo -Hola Hundo . Por supuesto. ) Evidentemente.ORA-MA CAPfrut. tamaño. ctc. tenemos que ser capaces de poder definir las características de las celdas de una fila: su continente (alineación verticul.1ctico.) que podamos establecerlo a nuestro gusto. la mostraremos en los siguientes apanados.Idigma. desde un punto de vista pr.. hllbrill que usar hojlls de estilo (CSS). las que ulilizamos. Es bastante fácil. para declarar la clase y para crear un objeto de la misma. De hecho. Por tanto. el ••• . respectivamente. y cómo implementarla en PHP.

En definhiva..1 Aproximación Procedural En este caso.. pensemos en el enredo que tendríamos si el lotal de filas con aspectos diferentes fuese mayor. 'orange'. . . SaUn. Obviamente. Simple: en total son seis las variables que necesitamos.1dA_a1i~ri •• $let~_eipo.-v. embrollar) si. $llltra_color pint __c.r . eoho '</td>".Q._t·meno. la solución es bien sencilla: a tantas características diferentes. 'miden. $cel4a_a1in _~.'St. el código queda más difícil de mantener por su mayor 'complejidad'. plnta_cel4a{'5'. . tenemos que acordamos de declarar..'. no confundir el nombre de los argumentos (los usados en la declaración de la función) con el de los parámetros (los pasados a la función). fcolo~ .mita' ect"o ·<tablll bordee. $eolW'_tonc1o. teal4a __ alinJ¡orlz. !v. Además.cel. $celda_1I1in. por cuaJquier razón. $oo1or_ce14a.4a.·Sali~' va11gn. Stipo.vart $c010c"clll& $leua_tipo $llltra_tMl&lO • 'Acial' • '10' I '><te>' fce~_a1in_ . > $c:ontenido <1 tont>'.). Y como las cosas siempre son susceptibles de empeorar. el problema no estaña relacionado con la lógica del programa sino más bien con su codificación.'StipO'...l~ali~oriz • 'center' I . . más bien. esta solución tan rápida se nos podría complicar (o. iniciaJizar y asignar todas y cada una de las variables. $c. fletra_tipo.. Sin embargo. $letre_tamano. f1ee~.&Mno· eolora'kololr tat.1ze.14a{'PHP'. necesitáramos tener dos filas con aspectos diferenciados: el total de variables a manejar se verla duplicado por dos . ~. fletra_colo~).t~al $color_f~'~ allgn. .. fletrecolor).r 206 PIIP 5 A TRA vts DE EJEMPLOS CRA-MA 7.... echo '<t4 $t~no. $colc~ . tantas variables donde almacenar los valores correspondientes.'$alin_v' bgeolor_ <fone face.2.nc: _ pint4_celdaIScontenido. $aU".. En el código siguiente generamos una fila con dos celdas: . depuración y mantenimiento: hay que controlar que las variables que pasamol> como parámetro son las que realmente queremos. • '..h. necesiLamos una función que genere las etiquetas HTML necesarias para la celda y para el contenido de la misma.

(2o) I echO "«td 411gn.li"-hori~ontal· v&¡lgn.T CAPfnn. es al contrario: se pone el énfasis en las variables (propied~des).tr __ tipo .ld. ~ceI~eolor_fondo: var 'le~r•.n"e' ¡ Sfilal->letra.·'~.~ido «/font~": echCl 1 1 'fila1 • ·c/td~·.color__ fondo'" or. Dado que un objeto es una especie de caja negra en la que eslli todo autocontenido (propiedades y métodos).e cel4a ('1'ID" 'tilel->plnt.1ze. echo '<table border.l~.~.cel4&('S'" echo "< / tr>< table>'. veremos que el ejemplo propuesto. ver Sletr&_ta..2. Sfilal->letr. <.-~celd&_color_fondo'~-¡ echo "«ont (ace..o 7: PROORAMAOÓN ORIENTADA A OBJETOS 207 7.ll~ori2ont._color·~ Scont. como el método que imprimirá el código HTML oportuno.._~nQ· color.li~vertical. sin cambiar la lógica de la programación. el.·Arial'.r' I $f1 la 1._t~no. Cl .' . $filol->c.'middl.:>celdlt .l·'cent. .·. En primer lugar.2 Aproximación con Objetos Si el eje fundamental de la programación procedural son las funciones.-~c.·'~. Lógicamente.l. tipo. . y las variables se usan simplemente para almacenar datos intennedios._Celda { v~r Sc.lln_v._."tbie·~letr. ver var SLel44-elin-hori~ont.-~celda_.'O'><tr~· ._e. el método operará directamente con las propiedades que estén declaradas en la clase.'.l4aI)1 $filal->celda_. y las funciones (métodos) se usan para acceder a ellas y modificarlas.tipo. 'tilel->plnt.tbie-~l. I .. definimos una clase que contendrá tanto las propiedades que almacenarán las características de las celdas..anoj ver Sletra_colorl function plntaJ'elda (ScOllten1.·l0' : Sf:lal->letra_color='white'.-~letr. ~ Cl .rtic&l· bgcolor."~. se nos puede hacer más 'cdmodo' de implementar.& .l~lln_vertlcal.... en la POO.

podríamos haber eliminado los parámetros y usar las variables globales directamente dentro de la función. no habrá problema al equivocamos al escribir los parámetros en el código correspondiente que. Además. simplemente. '< ". Afonunadamenle. incluso. dado que el pensamienlo humano tiende a pensar en estruclUras jerárquicas. . se simplifica enonnemente y es más fácil de mantener ya que. esta solución tiene el gran inconveniente de estar expuesta a efectos laterales difíciles de detectar y depurar: se corre el riesgo de que se modifique la variable global en cualquier punto del programa y no lo detectemos..~ .lS propiedades y métodos que penenecen a ese objeto en particular.1 Palabra reservada $this Como podemos observar. c:arac:tedaticaa d.208 PIIP ~ A TRAvts DE E. Sf . podemos comprobar que queda más 'limpio'.ta caracteríat lc•• d. s61 0 tendríamos que crear más objetos. • n •• el ••• Celda!). y 10 que es peor.2. ""he.. celda{'PKP'). la2 En la versión procedural. en este caso. asignarles los valores requeridos y mandarles imprimir a través del método: 'fil. !'><tr>". $hlal ¡~ una2 • "'_ Ch. que en elementos dispersos como serían las variables sueltas (variante procedural).< 'table>".fila~->pi".•• __ Celda(J I codigo de inicia 1 izacion oon '-<Ulble border • .. Si necesitáramos más filas. ffilal->pillta_cel4a('5').IE~IPLOS Cl RA·MA A priori. desde dentro del método pinta_celda () para acceder a las propiedades del objeto se usa la palabra reservada $thi. 7. : ésta es una referencia al objeto concreto en que el método se está ejecutando. Sin embargo. el número de líneas 00 sería menor con lo que podría argumenlarse que no parece muy útil.. conceptualmente es más lógico o natural pensar en entidades con una serie de características comunes. codigo da inicialü. echo '-<Jtr>": echo "<tr>" ffila2->pillta_celdal'SeguDda'). $fila2->pillta_celda{'Pila'). la cual le pennite acceder a otr. el método (la [unción) sólo recibe el paráme[ro realmente imponaote para el programador: el del contenido de la celda (las características de la misma las loma del propio objeto). Viendo el código. ec:)K . nos imposibilitaría usar la función para imprimir dos tipos de filas di stinlas.2. quedaría menos farrago so pues no habría ni tan siquiera que poner las propiedades como parámetros. Además. en la versión orientada a objetos no existe este problema dado que cada objeto es dueño de sus propias variables (propiedades)."cion 00" 1. Sin embargo. declarándolas como 'global'.t .

además. sabemos que las especificaciones de una aplicación tienden a cambiar con más frecuencia de la deseada. Sin embargo. . pues con esta ultima se intentará acceder a la propiedad del objelo cuyo nombre es el valor que está almacenado en la variable $"ropilld44. la tarea habóa sido muchísimo más sencilla y. Con la aproximación procedural tendríamos que añadir más variables ('JI/e/ras').lLO 7: PROORAMACl6N" ORIEr\"ADA A OIUETOS !O? Así. reusable: bastaría con añadir nuevas propiedades a la clase y modificar ligeramente el método usado. además. que estará vacla. puesto que ahora necesitamos. poder variar el ancho y el alto de la fila. modificar todas y coda una de las llamadas a esa función para que refleje la nueva definición. modificar la definición de la función para que ¡\dmiliera como parámetros los nuevas varinbles y.3 Reusabilidad y mantenibilidad del código Por propia experiencia.>') que sigue a Sthis se utiliza para discriminar cualquier propiedad o método que esté declarado dentro del objelo~. quedaría 4 No confundir la expresión $thls->pro"iedad con $thla4>f"ropiedad. claBB unaClale { '!lOY una propiedad': funetlon wll ( $011 • 'IOY una variable local'. no haría falta modificar las llamadas al método y.· new ~ unaC148f1 ¡) . nos vemos obligados a modificar el programa que genera tablas HTML con las fi las diferenciadas entre sr. el código que usa al objeto. ) $0 • 7. ech<> $. Asf. el operador necha (' . $o->ppO Imprimirla: ¡ SOY una variable local . se estará h3ciendo referencia a una variable local o función primiliva de PHP: var $4 d . SO~' una pfopie4e4 7. .2. si hubiéramos apiado por definir una clase. '<br J>'.e RA-MA CAPfl1.. Si se hace referencia a una variable o función sin que vaya prefijada de Sthis u otro nombre. "<br I~': echo $chh->a . sobre todo.

7. . Como vemos. En definitiva. Vemos gráficamente el resullado de la creación de objeto ($obj l:new una_c lase() o): . Afortunadamente en esta nueva versión del lenguaje esto ya no es así y lo que se obtiene en la creación de un objeto es siempre el manejador del mismo. una conexión con una base de datos (sobL bd.>cierra ( ) . la forma de usarlo. un fichero gráfico ( Sob j J_gen . para evitar colisiones de nombres. Por otro lado. 7.1 Creación de espacios de nombres Una última consideración de orden práctico: impHcitamente. el uso de clases y objetos nos hace crear espacios de nombres diferentes.210 PIIP5ATRAV!1sDEEJEMPLOS CI RA-MA prácticamente invariable: sólo asignar valores a las nuevas propiedades.2. etc. más fácil de leer y más fácil de reusar (elementos todos ellos que constituyen los principios de la ingeniería del software). una ventaja de usar objetos es que podemos modificar su funcionalidad.l\ndir mejoras o corregir errores sin necesidad de cambiar su imerfaz.. Por ejemplo. y como hemos querido moStr.3.3 MODELO DE OBJETOS DE PHP S Una de las principales carencias que tenía PHP 4 para ser considerado por los puristas de la POO como un verdadero lenguaje orientado a objetos (tipo Java o e++). Esto quiere decir que podremos usar el mismo nombre para tantos métodos o propiedades como queramos. siempre y cuando estén en objetos diferentes. Esta característica era en ocasiones fuente de errores que en muchos casos eran difíciles de detectar.-cierra l .. si utilizáramos funciones. otro de los beneficios añadidos de la PúO es que no es necesitamos definir y recordar tantos nombres. podríamos usar el mismo identificador ' c ierra' para métodos que cierren un fichero ( sobLtichero->c h rn (J ). 1. Como vemos.>cier r a o ).lr a lo largo del ejemplo. o lo que es lo mismo. ) o i_gell. ) o f ichero_c ierra l •.. tendríamos que usar identificadores diferentes en cada uno de los casos anteriores: IxLcierra l . una conexión HITP (SobLhttp>cie rra (1 ). era que la operación de creación de un objeto (sentencia new) lo que devolvía era el propio objeto y no una referencia o puntero (lwndler) al mismo. a. el código 00 es más fácil de mantener.

G RA-MA CAPITuLO 7: PROGRAMACiÓN ORJENTADA A OBJETOS 211 PII1'~ "'" Evidentemente. $02 • $01. en PHP 5 tenemos dos variables que referencian el mismo objeto: PHP4 PUP! J SOb". al hacer una asignación de variables (Sobjl-Sobj2.alucloJIIAtinal): ($obj--param->ssludo) <br J>' $obj-parAm~>.aludo. . .'soy 01'.cho • ¡. $01· >saludo. por ejemplo. $02· >saludo_'y yo ~2'..): mientras que en PHP4 tenemos dos variables que contienen dos objetos distintos.-.. esta característica provoca diferencias de comportamiento.'.'buen ¡ el ••• Cla•• _Ssl~do VAl' $aAludo¡ $01 • new Class_saludo(}. Sobj2 El siguiente código de ejemplo nos ayudará a comprender mejor las diferencias ex-istentes entre ambas versiones del intérprete: tunction aAludo~tinal(Sob1-PAr~) dia'.

sin embargo. pues.212 PIIP5ATRAV!tsOEEJEMPLOS el RA·MA _ho '011 ('01 >aaludol al ¡S02->aalu"<Sol<br I~· .) se realium mediante sus manejadores. vemos en la tabla de abajo que la salida es diferente. o al pasar un objeto como parámetro no se hará una copia del objeto con sus propiedades y métodos. En PHP 4. 0:1: Iy yo (2) Esta caracteñslica hace que los programas en PHP S consuman menos memoria y sean más rápidos dado que no habrá lanto trasiego de dalaS: al asignar una variable que contiene un objeto a otra. proclive a errores de codificación y muy difícil de depurar en caso de errores: Creación de objetos: Asignación de objelos: Paso de parámetros: $obj : & new Clase_Objeto(). PHP S lo único que asigna es la referencia al mismo. PHP 4 crea un nuevo objetoS en la asignación y. en determinadas ocasiones. se estará repercmief/do sobre la otra. paso de parámetros. PIIP4 01: 01: (eoy 011 ¡ 02: (y yo 021 [Baludo_matinal]: (buen dial (soy 011 01: I'HP S (y yo (2) 1 02: (y yo (2) [aaludo. PHP S nos ofrece la sentencia clone para hacer una copia exacta de un objelo. etc.. asignaciones. por lo lanlO. lo cual resultaba engorroso.. como hemos comentado.. . necesitaremos que la copia realizada tenga alguna característica propia del nuevo objeto creado.'. Cuando \o'eamos los destructores se comprenderá mejor. function una_f (' $parametro) {} 7. solamente del manejador (que suele estar representado por un número enlero). para conseguir este efecto y poder lrabajar con referencias había que usar el operador .1 Clonación de objetos Dado que ahora todas las operaciones con objetos (creación. No obstante.Jl'latinal]: (buen dial 0 1 : (buen dial 1 02: (buen dial . que no . cualquier modificación que se haga sobre una de las variables.cho '011 1$01 >aaludo) : 02: l$ol->aalu<50lc:br 1>' 7> Según se trale de una versión u otra de PHP. es decir.. $obj2 '" & obj.3.

Así. los métodos se .. ec~ .ORA·MA CAPnuLO 7: PROGRAMAOÓN ORJENTADA A OBJGTOS 213 sea idéntica.o vae $un_contadoc_O.dad~'nada'.4 ACCESO A LOS MIEMBROS DE UN OBJETO Uno de los principales pilares de In POO es el concepto de encapsulación..rISobll¡ echo '<¡pre>'.. print_rl$ooll J prlnt.. si PHP 5 encuentra declarado un método con el nombre _clone (). la saJida del ejemplo anterior seña: lu"-contadarl . lo que significa que no se pueden acceder a las propiedades de un objeto si no es accediendo a ellas a través de sus métodos...w u~cla8"1) $001 • clone &obl: 1 "<pre>'.->un_con~dor+~J ) $obl • n. 1 (uM. De esta manera. ocasión que podemos aprovechar pata hacer las modificaciones a las propiedades que necesitemos . . sólo los métodos de éste son capaces de manipularlas. Encapsular las propiedades de un objeto comporta que éstas están ocultas o inaccesibles desde fuera del propio objeto.() ( $th1. lo ejecutará nada más realizarse la copia del objeto. Para conseguir eslO. vaT $unO-Propi. function _clon.propi'ldadJ _> nada 7. claaa ~_cla....> runa-pcopl~adJ ~cla8e o _> nada Object I (~contadac) ..

" vat $calda_colot_fQndo¡ Cl~a.. 11 prClVQ(:er.e. para tener el control del uso de las propiedades del objeto. declarando una propiedad con la palabra reservada privat. no es recomendable porque si desde fuera del objeto se pueden modificar sus propiedades. Por esto. fuaatlaa JOa-oolo~_foa6o($eolor) ( i f ($eolor •• . rojo y amarillo.. Sin embargo. sólo accesible y/o modificable desde los métodos del objeto).214 PHP!i A TRAV~ DE EJEMPLOS CRA-MA convierten en la interfaz de comunicación con el objeto o._Celd5rJ ¡ $tlla • new $tOa" l ~ca¡". se puede llegar a alterar el propósito o la funcionalidad del mismo.. orange' ¡ 1 $color _.. privada del objeto (y. Esta posibilidad. cualquier referencia del tipo Sobj ->prop-privada provocará un error del intérprete de PHP. de su uso exclusivo. 7. definen el comportamiento del objeto. los que se corresponden con los colores corporativos de la empresa: naranja. como color de fondo". en PHP S.oaia" .-"cflld. en definitiva. En PHP 4 no existía esta posibilidad y por ello era ampliamente criticado por los puristas de la POO. . l $tila • new el ••a_Celdall ~ JI Stil. . dicho en otros términos. . 'red' $th11->cald~_color_tondo~$colorl ¡I $color •• 'yellow') } el . sin embargo.. . tenemos que ser capaces de indicar que una determinada propiedad es illtemD al objeto. P'O'Lool._color_fondo-" t.1 Propiedades privadas Hasta ahora.JGDIICtC· taca"').njJt~ . por tanto. Lo vemos mejor con un caso concreto: imaginemos que en el ejemplo inicial. no tenemos fonna de evitar que quien use el objeto pueda escribir algo como: el~. VIl enor del iatecpreUi . Con lo que sabemos hasta ahora.1 Cl ••• _Calda ( . necesitamos que el color de fondo de la celda sólo pueda ser elegible entre tres posibles. ..4._colcr_fcmc50-'fucei. todas las propiedades que hemos usado se dice que son públicas puesto que podemos trabajar con ellas desde fuera del objeto simplemente escribiendo: Sobj ->propiedad.". ( dle¡'BRAOR: no está pe~itieo "$color .

PHP nos avisam de que estamos accediendo a una propiedad que. !$va. Por ejemplo. Svalor) { .r~a ta echo l> $obj·>identif~y_largo: Afortunadamente para nosotros.etISprop. respectivamente) a propiedades que no están declaradas en el objeto.nenr & PHP 5 incorpora dos nuevos métodos. ftO de<:lara. contiene uoa errata que nos podría dar más de un quebradero de cabeza: <. propiedad 'Sprop' <. que sirven para 'atrapar' todos aquellos accesos (de modificación de valor o de consulta..5 oe.pl'te ¡ var Sidentlf~y_largo. y el nombre de la propiedad que se ha querido consuJtar: function _set($nombre-prop.nr'.ta2 ( funetlon __ . _set () y _get ( ) . sobre todo. no existe: cla. Asf. $valor) ( // codigo del usuario ) function --get($nombre-prop) ( // codigo del usuario ) En un lenguaje interpretado como PHP.eRA-Mio. ) Sobj • new Deepiate (). CA PtruLO 7: PROORAMACJÓN ORJE/ln'ADA A OBJETOS 215 Como vemos. moch1lcan 'l dewelVen sus contenIdos. en la fase de depuración .2 Métodos _set () y --'let () acceder a ellas de fl'I8I"I8f8 controlada mediante ~ ~1odos denomlnados como prfYsda y 's. loe cuales. clas. el scripl siguiente.pi. Los parámetros definidos en estos métodos son el nombre de la propiedad no definida que se ha querido as ignar más el valor. ·hola' I 11 aqui •• ta la . podremos introducir comprobaciones en los accesos a una propiedad declarándola como priva te.lo!')<br ~/ ~ > ~ ·~ .4. los intentos de actualización de la propiedad $celda_color_fondo han de efectuarse obligatoriamente a través del método pOlLcolor_fondo (J. por un descuido o errata a1 codificar.el» -OJal U. c. _ _ _ __ . NOTA: En La POO es pricbca hitbttual declararloda1l11s I getl.s. respectivamente. 7. Sobj·>identi~uy_largo. siendo perfectamente 'legal'. si definimos cualquiera de estos dos métodos. estas funci ones nos pueden ser de mucha ayuda. en el que no se oecesita declarar las variables que se van a usar.

tenta. " La salida de este scrip' sería: OJO! I l. $ohj~:.a'" hola' : kM $ohj ·>b.w D&spiate21¡. I Svalor) { ..-tl) echo "{211 ($o-:.ara el . '¡ / / e..).t.i."u1ano· "nI: ($o~>otr. t~o paaa p.ne:dstentalwr /:. propiedad 'h' NO óeclartlda Estas funciones. 7. :epo_Prop~Q_Declaradaslll: . por cierto): ela ..n~_.'. ·.:. propiedad 'a' NO declarada thola) OJOI I 1.nt. 1 ajecut.. '~ction ':epo_Prop~o_Declar"dasl ~at(Snombre_var. " el". Esto significa que aquellos métodos que han sido diseñados para consumo interno del objeto deben de encubrirse de manera que el usuario no pueda ejecutarlos desde .3 Métodos privados Otra de las 'acepciones' de la encapsulaci6n es que ni usuario hay que ocultarle todo aquello (propiedades y/o métodos) que no es importante para él. 1 (' .~.tentel<br I~": la otra.. $0.~var_i. $objPn. .t..e.'ru.. _eet (1 1 $0' n.otrll.sDEEJEMPLOS C RA·MA lUnctl~ -e'(1o ~OJOl _get($prop) ( 1 l.. .I) echo '~ontenido de var_inexistente: tSo-:..rapa4a por ._inexi.") I I tunet .'.t..>nOlllbre_varJ { aval ( I .'.. .w CIaae.b.tente"'_ngano· J / / a.t. además de usarlas para la fase de desarrollo y depuración.pa4a por _ . a modo de divertimiento...tbJ.fl $o-~otr __ illexllJtente:'. ..J.'1 _.-i.->' • 'v.:r-..216 PH I'!iATRAVt.. t. y..->.. para ailadir propiedades de rorma dinámica a la clase (idea nada recomendable. no •• at.or' . // e. ) 7.~" !. podemos aprovecharl as..0·~var-lnexi..4. ~ .nexl.". t. propiedad '$prop' NO deelartlda<br 1>".var_inexiatenta)<br 1>'. Los detalles internos de implementación no tienen por qué conocerlos (ni usarlos).r ...:zl.bre "f'&:r_".' I~anganol (11 I () (.oy La salida generada del último: Contenido de v"r_i~exiBt. DO ee at..te .oylaotra. • ....

I ¡$color .i._tipo.tral¡ $thls·>color. •.letral) : ) tunc t ion pon_color_fondol$eolor ) { i f (Scolor .tbi.• e RA-MA CAPiTuLo 7: PROGRAMACiÓN ORIENTADA A 0 8JETOS :m fuera del objcto.lda_ali~v.vertical () I return ·vert1cal-.on t.:$thi8-~letra_t~o. private $letr __ taNano¡ private S1etre_color¡ private function a. yallow') ( ) eb.llgn..->g.rtie.->c e l~ 1 I n_hor1tont..>r&.·: pdvate tun<:tion color_letra!) ( return 'color:Sthia ~letra_color¡': prlvate ~tiOD gen...-·alin_:".:rrangll' r I Scolor .. >$conlenido< I ) td.ll ) · ' private funetien aUI\. cl~88 Cle ••_Celda 1/ .. pues su uso directo puede falsear. functl. ' re(!' Sthls->c. modificamos la implementación del objeto Clase_Celda para que la especificación del tipo de letra sea mediante estilos en Unea (esto es.• private Sl..ra •• tilo! ) ( raturn St~a1.~ \n' I . ..aqnlLletra" ( return ·fOnt-81:. <.->c.ll·1 private function eolor_foDdo(l ( retunn 'baekground-color:Sthi$ >celda_color_fondol'¡ ) prtvate tunctlon tipo_letra O { return "!ontfaaily:$thla· ~l e tra_tipol"1 pdvat.dQ) ( echo '" td atyleE" . '» en lugar de las obsoletas etiquetas <font>.lda_color~fondo~Sco l or.. . ( dial"ERRoR: no .ri umtal I 1 $tbl. la intención origi nal del objeto..-•• tllo () .Sthi. Para iluscrar lo que queremos decir. <td style=' font-family:arial.. ' . lign:$thl.lin_ho lC" h:on t al () ( return ·t...t~..-~alin_verticall) $th!s->color_'ondo() $thls->tlpo_letral) $thi8->tamano_l.xt. potencialmente. tunction pinta_TD($conun.at' ) pe~itido '$eolor' coeo oo)or de fondo').. .

. $arraY-PAramatro8_11·. el a •• Sobrecargada ( function _call !$metodo.rray. evita la generación de un error y la parada del scriPI.'O'><tr>"1 Sflla->pinta_'t'D1 "PKP' I I Sflla~>pinta_TOI '5'1. ejecutar una acción u otra. hacer llamadas a un método y.. $atr1but sI { i f (S_todo •• ' operadorJllll8') ( i! ¡l__ iotegar($atributosIO¡ " i __ intevexl$atributo8 11 J return $atributoa¡OJ • Satributo8(lll eb.4.4 Método _call () Hemos visto que para atrapar accesos a propiedades no declaradas en la clase tenemos a nuestra disposición [as funciones _set () y _!Jet ( ). etc. _$ateibutoa[$l r. . respectivamente. " métodos 'auxiliares' color_fondo ( ). tipo_letra ().218 PHP. que ejecuta una concatenación o una suma dependiendo de si los operandos son cadenas de caracteres o números. $i ·counl $4Itributoa' S. Además. en función de los parámetros pasados a éste (podemos examinar el array S. de alguna manera. Para hacer 10 propio con llamadas a métodos no declarados. . Por ello.s A TRAvés DE EJEMPLOS ORA-MIl.. Si los 7. PHP 5 nos proporciona el método _call ( ) .turn $8te: h+ I .parametros_llarnada). ••. los declaramos como private para. $fita->po~eolor_fond"oC'I":oCro. ( ! Jr ¡Sste . proteger al usuario contra sí mismo. esta función nos puede ser muy útil mientras se está desarrollando pues.~'"'""J ~ ."C.. el resultado no sería el adecuado. o lo que es lo mismo. da) ( // codigo del usuario ) Al igual que con aquéllas. --------------~----------------~----~· 1 -cbo "~table border. U-O. tamano_letra ()... cuya definición es la siguiente: function _call ($m.tr .todo. en caso de despiste. pudieran ser Uamados por el usuario. _call () se suele usar para implementar la sobrecarga de mftodos.eho ·~/tr></table>·. En el ejemplo siguiente simulamos el caso del operador '+' de JavaScript..

color. elc.. que se ejecuten una serie de acciones previas. para partir así de una posición conocida. Así. $tbi. $thia->celda_alln-horizontal.:t1on _~~EVoQt.'middle' .cdo' . Cunc. conexiones. objetos. si en la declaración de Clase_Celda incluimos el siguiente cóctigo. • qu. incluso. En PHP 5.l). logramos este efeclo cuando el objeto tiene definido un mélodo con el nombre _construct (J. Para conseguir el comportamiento descrilo.'. se usan lo que en terminología de POO se denominan constructores o.). lo que es 1 0 mismo. en el ejemplo propuesto en el inicio del capítulo.coloc _fondo_' OCan91!!' : $thi8-~letr. $thla->celc!a._t~n~·10'1 $thi8-> letu ••c:'olor'" 'whi te' : } / J . } } $obj • new Sobrecargada{).5 CONSTRUCTORES Una costumbre que debemos adquirir al programar es inicializar siempre todos aquellos elementos que intervienen en el programa (variables.'centec' .1 •• echo •••• OJO.ORA-MA CAPtruLo 7: PROGRAMACiÓN ORIENTADA A OBJETOS 219 } . es muy común que al crear un objeto queramos que tenga una serie de características por defecto o.. br ''''.->l. ' tal')..tr. _todCl no declarado: '$_t._tiPQ*·Ariel· .). $r• • • $obj-. As!.. al crear un nuevo objeto Clase_Celda. operador~{l. querremos que éste tenga ya un valor por defecto para lodas y cada una de las características de la celda (tipo de letra. Por esto. etc. Sr••• Cobj->operador ___ sl'hola'. métooos que se ejecutan automáticamente nada más crearse un ejemplar de un objelD. echo • Cre~1 ~n'J 7.O { $thia->celda_ali~vertical. alineación. cualquier objelo que creemos tendrá las propiedades con los valores asignados en el conSlrUctor.

Para ello.6 DESTRUCTORES Como puede deducirse de su nombre.o.. el destructor se ejecuta cuando desaparece por completo el objeto de memoria. Es!. este método recibe por nombre _destruct (). por ejemplo. Cadenes { prlvate Satr. Sin embargo. _eon. no t.l ( i t [gettype{$~raml ¡" 'Btdng') d¡~!·.:laa. dado que si en algún momento hubiéramos de renombrar el nombre de la clase.'RROR: parAm~tTn NO vál!60 .): elee Sthie->atr_$param. declaramos estos parámetros en el constructor. clase en el momento de creare! oqeto te corresponde con el declarado en el conlll'UC1Of.ene NIde que v. & Por compatibilidad. previamente.:tion . en el momento de creación del objeto. también.a6n de la dase que no llene partmel105 alguoos En PHP 4 el constructor era aquel método que tenfa por nombre el mismo que la clase6 . y como complemento al método constructor. también habría que hacerlo con el del constructor'.220 I'HP' 1\. es decir.con la declet. ésta no es una buena práctica. En PHP 5. func. PIIP 5 sigue manteniendo esta característica. efectivamente. de tipo 'string': c. pasar como parámetros los valores con los que queramos que se inicialice. 1 . 7. $obj_new Caoenall ['hola'). 11 darA un error " ATENCIÓN: el parémetro pasado al nombre de l. ~ ejecuta la ultima que ha sido declarada. Imaginemos que creamos una clase para tratar cadenas de caracteres: comprobamos que el valor con el que se inicializa el objeto es.a característica la aprovechamos. Podemos. para hacer alguna comprobación previa.truct l$paraJI. un destructor es aquel método de un objeto que se ejecuta automáticamente cuando se libera la última referencia u éste. $obj_new Cadenas/?). si en la clase existen simultáneamente la función _CQnnruet (1 Y una función con el nombre de la clase. TRI\. vts DE EJEMPLOS CI RA·MI\. No obstante. En el apartado de la herencia veremos las implicaciones negativas que esto tiene.

ml>· automáticamente.. sigue existiendo otra referencia al objeto talllo. : I ( mate al rey . 'rey • 1'1_ Ajedrez. 'J roo e..tructCI echo "_!aLero . Esto puede ser cerrar descriptores de ficheros.. el destructor no se ejecuta hasta que no desaparece la úllima objeto.aet ($reyll echo 'mate al rey .« tener en cuenta es que es elllICOIector de basura de PHP 5 quIItn.. en el caso de un objeto que genera una página HTML. " Al copiar el manejador del objeto creado (almacenado en variable $principe tenemos dos referencias aJ mismo objeto. Vemos en un ejemplo cómo combinar e l uso de constructor y dc<¡tructor para saber el tiempo que larda el servidor Web en servir una página al cliente: . :(t Si no se hubiera hecho la asignación $principe=$rey. mate al rey . al uur"w de la mem0tJ8 La existencia de un método destructor es muy útil dado que es buena costumbre liberar aquellos recursos que no vayan a usarse más.. por referencia al Ijaque al rey . me muero .•.~~. destruir olros objetos. También para realizar tareas de úhima hora como generar información de depuración. 1 J 1 Sprlnclpe • 'rey: echo 'jaque al rey . Por eliminemos lu vuriable $rey. $rey) en la esto.truct (l.et ("pdndr-I."". <br I~' I _. • NOTA: un malrZ. etc. _ ...•• <br /~.lecud6n de ...a AjedTtll! t function __ ) ~.1(".a la e. ent. hacer algún tipo de comprobación última o. aunque creado y. ¡ lUl... de elim.•.• = O RA-MA CAPtnrLo 7: PROGRAMACIÓNORlENl'ADA A OBJETOS 221 " '?php cl. me muero .l". sockers..~~_ob¡eto.te m6todo qUien . escribir las últimas etiquetas '< / body>< / ht.~mln. conexiones con un gestor de base de dutos. entonces la salida hubiese sido: ¡jaque 81 rey . Ianz..

l _~() ( $tbl.l~icrcti~Bi) ¡ li.ntelJ. tot{l.GD $~rt.parecer' el objeto y •• ejeeutar' al óe.li~ar el acript des. Crono. $s8gal • expl04e{" ·. ... sabemos en qué momento se empieza a ejecutar el scriPI. y que esta clase tiene definido un constructor que guarda el instante (microtime (» en que se crea el objeto.i. La finalización de éste dará lugar también a la desaparición del objeto y. funetion __deatrwot(J ( Snu.loj_en~rcha ~I • new cronometro!) .tante_aetual)! raturn (((loat)$micro_seg • (tloatJ$sagaJ J ) } $r.ciBieato • Sthia->6aae_inst. cIa.. al {in.. • 7. cuyo cometido es lanzar la ejecución de la función pasada como parámetro en el momento de la finalización del SCrip' .l .Sin. 1.isúa este método destructor y para simularlo se solfa usar la función register_shutdown_function (). Sti~_tot. J) 1 scno 't._aetu. r •• to d..inll ha tardado en c.etro private $nactaiento: privete fWICt.Host) $tbia-)of\acia1ento)..rtB • $tbie->dame_inetante(). .~~n. halla la diferencia de tiempos y la muestra en el navegador del cliente.t($mlcro_seg. Este tipo de miembros de clase suelen tener cabida en una clase genérica que se usa a modo de librería para toda la aplicación.rgllrse.222 PIIP 5 A TRAV~ DE EJEMPLOS CRA-MA .7 ATRIBUTOS Y MÉTODOS DE CLASE (MIEMBROS ESTÁTICOS) Los ambulaS y mélodos de clase (también llamados es~tJcos) son aquellos que pueden usarse directamente desde la clase sin necesidad de crear un objeto.. por tanto.tructor Gracias a que la primera instrucción del programa en ejecutarse es la creación de un objeto de la clase Cronometro.. el cual averigua el instante en que esto ocurre.undoe·¡ private funeeion d~e-instant. paginat. :-01. En PHP 4 no ex.(l{ $inat~t.l • . a la ejecución del destructor.1001 t (flOlltl $lIIUerte .a p'. Stiel!CX).

\$uno: " • unaEstatice oSuno 'l. ¡' $o->uno echo '\So >('h. Dado que se usan desde la propia clase. vemos un ejemplo de clase con miembros estálicos privados que nos permitirá llevar la cuenta de cuántos objetos de esa clase hay activos. 'l'. T&r ~. habría que declarar el constructor como privado: !pl:lv8t:e function conet:zouct: [) {} A continuación... De hecho. '1'.lanea . 11 IIQ exiete II. Para ello contamos con una propiedad estática privada $contador que se incrementará en el constructor y se decrementará en el destructor: al ser privada y eslática sólo desde dentro de la clase se puede manipular dicha propiedad. y con el operador' I l ' hacemos una llamada al mismo. " So • new unaEatatice[).l. echo' \$0 >uno. el objet. . si no queremos que se puedan crear objetos de una clase. con lo cuaJ.. cle •• uneEatatica I .t:ic fUDCt~(ln eut-oceel) ( ceturn 'At!rah4lJl G\ltiérrll:¡: " G1. ." ~ abajo dade \Izt error unar.:bJ:" f .. por eSto es por lo que no se puede usar la palabra reservada $this desde dentro de un método estático.cM ·unabtatlc..: .0.: C' $o..c. et:.D.:br . '¡<br . un truco muy habitual para evitar que una clase sea instanciada.tatic se usa para calificar aJ miembro correspondiente como estático o de clase.t:at:lc SUDO. '. d~ 'l<br / .iacelan"'llIutoresCl • •• Como vemos en el ejemplo anterior. es decir. ) . ·. ' ·j.cho ..tetice"Sd08.nés BravD'J . sólo eSlarán accesibles desde denrro de la clase. estos miembros de clase no pertenecen a ningún objeto en concreto (no ha habido ninguna instanciación).o Los miembros de clase pueden ser también privados a la clase.. la palabra reservada . 1'/ JI eeho 'C' la 11.O RA-MA CAPrruLO 7: PROGRAMACIÓN ORIENTADA A OBJETOS 22) e' ele •• ) ~I.

3 0bjeto9 'vivo. Tomemos como ejemplo el 'objeto fichero'. un gr:1fico en fannato GLF. etc ..224 PIII'5ATRAVtsOEEIE.. echo -nbjet··. una película en fonnato DivX.Qtn''''t () C'Ullnta_obja: : Seontador·· ¡ $01 • new cu~nta_objllt) I $02 • new cuanta_objll(): S03 • new cuanta_objll() ¡ echo ·Objetol 'vivolI'. Las acciones que podemos hacer con un fichero son también conocidas: borrarlo. etc.8 HERENCIA Siguiendo con la premisa de que las personas concebimos las estructuras de manera jerárquica. dependerán del sistema operativo en el que esté almaccnsdo.: _con&truct (1 { :$cont4dor++¡ lunction _d. V!VD$" -<bt . las fechas de creación y modificación. Pero. 'vivo.te Scont~dor a O.- El resullado que obtenemos con la ejecución de este script es: IObj. almacenado de alguna forma en el ordenador y que tiene una serie de caraclerCsticas B como el nombre.tic fUl\Ction cuantOIlObjetoll1l ( return ) cuent~obj$' .\1PLOS ORA-MA IIt. copiarlo. un fichero es un conjunto de un determinado número de octetos. • Lógicamente..'.Scontador¡ tunction ) cuen~_obj. una canción en mp3. el propietario. por otra pane. renombrarlo. ele. unllet (sol). . es narural pensar que un objelO siempre puede verse como pane de Olro. su contenido puede ser de lo más variado: un texto en caracteres ASCII. los permisos de acceso.tic priv. n.': l 7. Para nosotros.'~ .

Además. seguida del idenlificudor de la clase que quiere obtener su~ caracterfsticas: . mAs una clase específica por cada tipo concreto que recoja las posibilidades especiales de cada uno de ellos. .. y la duración. la clase genérica deberá ser campan ida por todas las especfficas. además de tener sus propias propiedades y métodos. para representar los distintos tipos de ficheros como objetos.. subclase o derivada).CRA·MA CAPhULO 7: PROGRAMAOÓN ORIE. el caso de un fichero gráfico y otro de sonido: ambos comparten las mismas característica. para que una clase pueda heredar las características de otra (convirtiéndo. número de bits por color. para un fichero gráfico. Sin embargo. etc. alto. por ejemplo.'~ y acciones descritas.c en hija suya) tiene que usar. podríamos aprovechar el código de la clase que implemema las características comunes (de esta manera nos evitamos 'reinventar la rueda'). muestreo de bits por segundo. Deducimos con facilidad que. que no compar1en entre sí como es el número de pfxeles. En PHP 5. la palabra reservada e:JC:tend. si es estéreo o no.VTADA A OBJETOS m r------=~=---r_-----fichero gráfico fichero audio fichero video fichero formato PNG formato JPG formato GIF Tomemos uhora. ambo!> Ijenen aIra serie de características exclusivas.. Trasladando esto a un terreno más formal: el concepto de herencia en la POO es la relación que se da enlre dos clases por la cual una de ellas (a la que llamaremos hija. ancho. etc. inherentes a su propia naturaleza. El propósito de lu herencia es la reutilización de códIgo: si quisiéramos implementar un nuevo tipo de fichero (por ej. un documemo PDF). necesitaremos una clase genérica que describa las caracterfslicas comunes a todos los ficheros.. tiene a su disposición (hereda) los miembros definidos en la otra (a la que llamaremos ))Odre o superclase). para uno de sonido. en su declaración.

los bits empleados para representar el color.a. e18e ( 4i. por ser la que refleja las caracterfsticas comunes a todo lipo de fichero...f) . prl_te Sf~ficae10n¡ functlon __oODBt~tC'f) ( H tie_nle(Sf) J ( $this->Dombre_fieh_Sf¡ Sthis->octvto.~uevo¡ recurn 1.fich. al •• echo . private SbitB-POr_color¡ function __CODAtrDCtC.1 ficb. se convertirá en la clase padre de todas ellas: el ••• Pichero ¡ pci~te $n~. a_tich))._fich¡ .(Sthie->n~ee_fichl)¡ Sthi.->nombre_fich·$nombr.('.JIW)41 ricllclon" (fil_tilnv ($thi.. privat.~(fil. function rsggebr.226 PlIP' A TRA vt.siz. los que tienen formato PNG). ERROR: no Be ha podido renClllbrar . private Salto.bCB~JI lf(rename{Schis->nombra.ero·1 I I . tales como las dimensiones de la imagen.. Snombre_nu. Por supuesto. esta clase 'heredará' las características de la clase Fichero definida anteriormente.(··~* ERROR: No se encuentes el fichero 'Sf")r function I oc~te. paol_te Scetetos.(J functj~ fedba~floaclOD{J return I SthiB->fec~ificacion. creamos una clase que contemple las 'particularidades' de los ficheros gráficos (en concreto.~¡onUIIIL..s DE ElEMPLOS o RA-MA Para ilustrar lo que acabamos de explicar. tal y como hemos dicho.voIJ $thi.~>t~h• . Ahora. vamos a hacer una pequeña implementación de la clase Fichero que. Sancho.

...o RA-MA CAPITuLo 7: PROORAMACfÓN ORIENTADA A OBJETOS 227 $propa • getI. H ISpropar$1ncLtipO_illllJ) .->bit.... el constructor de una clase hija no ejecuta el de la clase padre de forma automática: hay que hacerlo ex:p](citamentc. padre y que...lto(' 'x' $olIj-PD/1-:>aQCho( I '<br". en PHP 5.Png-:>.. .['bit.-~.>6.11 • • $ob:l. Sl~ancho_img·l... si ésta es heredada. br 1. vía herencia. De 10 que se deduce con facilidad que.. " En la salida comprobamos cómo podemos aprovechar el método octetos () que está declarado en la c1ast:.. ¡ funcríon altol) { r.rurn 6thil->llto. también habrá que modificar el nombre del constructor en todas sus hijas..l fichero .-por_color~$prop.. ¡ ¡ $objJlf1'l • n_ PlcherQ_PNG( 'gra! .ne~o·Sprop$[Sind_ancho_i.e I SiJld. el.ob:!. en la herencia es donde vemos la importancia de que el nombre del constructor esté unificado: si el constructor es aquel método que tiene el nombre de la clase (como ocurre en PHP 4) y. 1I I functlon bitl-PQr_color() return $thia·>bita-PQr_color. tenemos disponible en la hija: El tam&no del fichero es: 96731 octetos Las dimensiones del gráfico son: 384x320 Si nos fijamos bien en el constructor de la clase Fichero_PNG. echo 'Lota d.. echo 'El t.toICI • ·oete\. 2... >ancho.~nlionea del qráfico aonl • ~ .lto_img.$props{S~elto_lmgl j Sthi.a un fichero PN07 cH.O. Por mm parte.._ )) { " . $in4.alleshe(St).. hay que modificar el nombre de una clase. Sth1.. $thi.tipo_iMg . functlon ancho () ( return 6thi. en un momento dado.C···· &RROR: 'S!' no tiene formato IIráfico PNG'). veremos que la primera sentencia es la expresión parent 1 I_ construct ($f).-no d.->elto...png 'l..lZo-:>oct.

pnQ->alto II ·<tr~td>< t. '0... . Las runcioncs IINgeC"reate 11. __ •• tl:..ageCre. '0)1 *cho '<tabla <tr~<t.pri<¡J .e I st-IJ_ . l. añadimos a 1 3 declaración de la clase este nuevo método a1 que hay que indicarle el nombre del fichero 3 crear y las dimensiones de la muestra: fW'lcct 10n CI:.png'.ct. propiedad nombre_fich para que sea protected en lugar de priva te..JIIUeet .Poo·>.~flch' ~ <td>' '<td>" .or1gitlaL) I ... en la clase Fichero.. <..-br. <iao . modificamos la declaración de la. Sobj. .'~e8t. $üug.. tIlWlIJeCrNtePromPNG !tthi. $obj.bl... ' .>al~ e I .JWlle' ra-~il.--J:'. etc . Sfie~uestra) ¡ lmaqePNGI$1malJ_muestr•• Aqu( nos encontramos con un problema: neces itamos hacer referencia a la propiedad nombre_fich que está declarada como private en la clase padre Fichero y. San<.OS e RA-MA 7.228 PIII' 5 A TRAV~ DE EJEMPl.ail) del fichero gráfico representado en el obJeto'). $alto lII\le8tl:al.~r. Para resolver este conniclo.bl:...:h. ($Uch.. Así..IrafJfl' '~8tra. existe otro tipo de modificador del ámbito de acceso de un miembro de una clase que es prot.·..wlestr.e ImegeCreate($anebo_l:IUlJlltre.ed($imelJ~e8tra. . SaltO_muestra._ U . Una propiedad o método protected es accesible tanto desde la propia clase como desde las clases derivadas.·l ' ~ ~tr~<th~Imagen<th~Tamano Fich.Cb l' lmag&CopyRe8i.• son de la biblioleca GOl.ncho (1 ·x·. $imag_originel."".. 'x' .neho() . pero no desde cualquier Olra clase que no tenga ninguna relación de parenlesco con ellas.'. •.o.. fich_ au •• tra. Sobj un..lmaO. por tanto. y añadimos el código siguiente para comprobar el funcionamiento de ambas clases: 'gra(.>· $abj_". .!lteFromPl«i t l." ..). tmaqeSX ($imaq_original).. lmaqeSY ($.<th~Dlmensione.no.rc . no podemos usarla en la clase hija pues los miembros privados no se heredan.atr.~ .8.d> border. $obj. au •• tra!$na. '~ • <td>·~it". e..-td. ->...estra~~o<:teto.. () $obj.o. Para ello..l 01.tra.. $obj""png ->actll'tQS (f • .png 'obj-PD!J~ > c~..original .1 Miembros protected Vamos a añadir ahora a la clase Fichero_PNG una nueva funcionalidad: crear un fichero cuyo contenido será UDa muestra (lllllmb.bl:. Sel tO.new l"ichero_PNG ($n~bre_f ieh I ._flch~.g al:c.o.t. $ancho~e$tra..

tld' que encuentren en las páginas. en muchas ocasionel>...W!jo publicitario. • 1_ _ _ r .ORAMA CAPITuLO 7: PROGRAMACIÓN ORt(NTADA A OBJelOS 229 El resultado lo vemos en la siguiente figura: -_ .. vamos a definir una clase que nos permi ta generar direcciones de correo que no sean susceptibles de ser romldas por los robots O agenles de estos individuos: cualquier texto que esté generado desde JavaScript l1 no forma parte de la página HTML como lal. la usamos para reflejar las lógicas particularidades de la clase hija.. es guardar cualquier cadena del tipo ·usuarioidominio. las que enviarles cualquier tipo de COII.'1 verdadera potencia de la herencia está en la redefinición (overridillg). Por esUl razón.8... . con respecto a la clase padre.". La redefinición. los spammers LO hacen algo similar: una de sus fuentes de direcciones de correo.uario: private $da. con el siguiente método conseguirfamos nueStro propósi to: '7 cIa•• Dh:_Cornto_-'tIti_ Spam ( pllvate $u. Veámoslo con un ejemplo.2 Redefiniclón L. por lo lanto.~>dominio·$d/ 10 !'ersonas que se dedican a cnviar correo no solicitado (comunmente llamado basura). ~ ~ . de los métodos declarados en la clase padre. en la clase hija...--~ e )". - 7.inlQ/ [unetlCln _cQnlltruct ¡Su. Sd) { $th18->uBuacJo~Su¡ Sthi.o. 11 ¡¡OJo con los literales!1 .. De igual manera que los buscadores rastrean y almacenan cualquier página que haya en la red.

. de correo auti-apam ... Dir_Correo_Anti~pam { priv~t. private $despl-x-2._ _ _ . _ ... $t~..1•• <1 . - ~ -..-nt wrlte!'8'1:\n'.."... '. la dibujaremos en un gnUico GIF.. '. _ .o-Anti~~_GlY extend._ Dlncd••u " COrftO ... _ poedeI _ _ _ _ ." . lC. .... o.. ... Ahora creamos otra clase que. vés DE ElEMPLOS • AA-MA.'java. . __ . ·_·II <I. que.230 PHP 5 A. </hJ> puedas enviar un correo a: So • nev Oir_Correo-Anti~(·v1rginia'.. . .... ".•.o() { echo "<acript ianguaoe... . .:CplU!SW' a los robots: . .. . priv~te $t~.. viendo el código HTML de la página y su visualización en el navegador. • .. ... 10 que hará será generar la dirección de correo en otro formato no 'compromerido' como es una imagen. -"'-·".... <lo .....1... function piDt.-..~ .. ' •• 6 ••11. el ••• Dir_Corr..~ ..2S.. '..205.1 -....l~ _ • . '--")_"... .wrtte(" echo "</acript>\n"._d1r~aorr. ... .~- • 111. concretamente. no existe ninguna cadena' t. co.1"'1_ _ .. " • • . efectivamente..... ti i:l_'~ •. } ofhtml> <hMd> oftitle>Kerencial redafinición</title> </hNd> <body> ..._ •• </ . 'laatabla•.... I .eript'>\n"¡ echo 'dOf:ume"t.. " .~e!" $thi8->UIlUArio ~h') '4oc.')J So->pintl_dir_correo()r En lac¡ dos siguientes figuras podemos comprobar...." _-" _ UlfI' "..wl .. • th_ . __ '''_' <ro _-)( .....óoeinio echo 'doc:uaIent..... ofh»Oirecciona.<-... teniendo las mi smas funcionaUdudes que la anterior.. . Sthh-. . TRA..U(·.....10 .. .ul··UIl··'··I.

body. Sdlr_Beript.leeptll: 1/ nace.ttf·. echo '<lag 8rc.o 7: PROGRAMACIÓN ORIENTADA A OBJIITOS 231 prival. tunction _conatruct(Su.. ..e Sfich_temp. $this->tamanyo_letra. private Sfuente·' fW1NDOWS/Fonts/coaic. . Sthill->fuenta. $d) paraD.ra~12..y..e tunction haz_tlempo{) ( 1/ para que el fichero te=poral con la Imagen llegua al JI navegador antes de que ae borre en 41 aervi60r $yatel!l("echo .</h» echo '<u1><l1>' Sdir_ext . td. uniqidf) 4 .. Sthill->uauario ' 8 ' . I $this->t:ich_temp. $t~o_lel. Sthla->deapl. 01 t Seolor_texto • imagecoloralloeate (S~.dirna~(S_SERVBR('SCRIPT_YlLENAME·J)1 unlln~("$dir~8eript/$this->fi~tenp'I: pdval. eOlll' 1.. 2SS1 ¡ lmagettftext ¡Siroq.. ¡an.aria para lE ) tunetion pi. $this->fieh_temp). de correo anti-apam. 2SS.tabl ••.y. ~ imagecreate ($thiB->t~X. Seolar_texto.Ulo.CAPtnn.. prlval. 255.411' .. <htrn1> <h•• d> <title>Hereneia: redefinición</title> </head> " ..png'.If1Ict ($u. 0. funetion _destruct () ( $thia->haz_tiempo(). . co=-o tJ 1 .'1.t I '_OOlUI.1'1_ Dir _Carreo~ti_S¡:Nllll{ 'virginia'. 4U_co=-oO I $an{lUlo 0.ut->p1nta .e SdeIlPl. Sthia->t~-y)¡ Seolor_fondo • imaqecolorallocate (Si~.. ) ) <h3>Direceione.. .22: '---prJvat. $th18->dOlllin1ol: imagePNG (Si"9... 0. $thia->despl_x.Ql. 141I'.'$this->fleh_t~'>'¡ imagedestroy (Simg). ·la.

. . . •••• .. las propiedades también pueden verse afectadas por la redefinición: una propiedad declarada en la clase padre y en la clase hija con el mismo nombre podrá ser tmtada como una sola propiedad o como dos distintas.I<. Por el COnlTariO..".....'.·.. declaradas en la clase Dir_correo~ti_Spam como privadas....232 PlII' 3 A TRAVI!s DE EJEMPLOS e RA-MA KM ·c1i. .-.~GrF(·vi. se puede redefinir en la clase hija un método de la clase padre.....IIk~. Como sugerencia sobre la redefinici6n de métodos...~ • -.r·'·" <u..a f • • '1 1 func~lon dame_al) .l 'l&. eof"reo~ti. la clase hija puede seguir accediendo o ejecutando el método correspondienle de la clase padre invocándolo de la forma: par.....ore hija..... " " " " " ' " " ".abl_.. Comprobamos que la dirección de correo generdda es inteligible para las personas.. ' . <. • •1... f41"1" gU->pUU..."(... .1 • • r'K el · "f .. _ · " <1-. a la vez que se puede usar éste.. " ' I . • • . '- _ _ ... tendrán que ser redeclaradas como protected.... lo más probable es que tengamos que duplicar pane de ese código en los métodos de las clases hijas. .. . _ <.. si hacemos que un mélodo sirva para varias tareas a la vez.. ..".. "oC 'ul>... Por úlrimo....'... se usan en la c1a.nt I Imeto4o()."". ' • ......... -«I><t"4OJ. ><u.. a la hora de diseñar una jerarqura de clases.<_~ •• t~ ..'i1nb·._"'. t _ __ r. _ -1)( "". _ re! on~.. es decir...1. Dado que las propiedades $usuario y $dorninio.t.... • ti . . 1" .. .cOlllo') . ... eehC.. . ¡¡die 91t • IWW DI. t«. cia•• C=~& •• l ( protect.. dependiendo de cómo esté declarada en ambas.... ' . aunque ya no tanto para los programas de rastreo automático: .... ...1> Aun redefiniendo un método.... ""..'(' }eV • . di "1" _oorreoO... una regla de diseño básica a seguir es hacer el código de los métodos lo más pequeño y específico posible ya que así se podrán reusar con mayor facilidad .

new clal..e2 .8. "2222'...•••211. M1C:~ __ :.xt~ lUCIa . public protected rivate private el¡._ filial funct1ot"• . El siguiente código provocará un error: c141 _ Mi.).CAPtruLo 1: PROORAMACJÓN ORIENTADA A OB1FrOS 2Jl } ela. observamos que si la propiedad de la clase padre es~ declarada como privada. a partir del código de ejemplo anterior.a1u4aO . un resumen en rorma tabular donde están reflejadas las distintas pos ibilidades de protección de las propiedades y la salido generada: el••• l l l .allr eu-"" ·[[$thl.nction ~_ . ) ) che. f1 ( • .. " Vemos. public public Public priva te Solida (2222) ((2222]] (2222) ((2222]] (111) (12222) 1 (111) 1(2222) J En concreto.xt~ clasel { prot_te4 ' .211¡ $o· .4aJ.-uJl'. $0.ame_a. 7. { function ealu4a11 { . t-.Cla. Icho 'hola mundO!'.¡o par_nt...3 Métodos y Clases fina1 Un método declarado como final no podrá ser redefinido en ninguna clase derivada. Con esto podremos evitar que determinados métodos no puedon subvertir la intención inicial para la que estaban destinados.A ela.r .d. enlonces tendremos dos propiedades dado que la hija no la hereda.

el métooo se vuelva a declarar abstracto: si ocurre esto. • Cuántos clientes distintos nos han visitado. como cualquier clase padre. los cuales.> "la•• otra_cla. . . obligatoriamente.. cabe la posibilidad de que en una clase hija. Además. . además de declarar e implementar las propiedades y métodos que desee. las clases abslractas se encuentran en lo aho de la jerarquía de objetos. De hecho. ._fin. Estas peculiaridades hacen que estas clases sean muy útiles para los diseñadores o analistas ya que. cuáles han sido los clientes que se han conectado y cuántas veces. • Para una determinada página. Por ejemplo. no tienen código alguno porque. es decir. obligan a los programadores a codificar una subclase que implemente la especificaci6n dada en la clase padre. figuraa .9 CLASES ABSTRACTAS La característica fundamental de una clase abstracta es que no puede instanciarse.lase. • Número total de visitas recibidas. Una clase abstracta. tienen que ser implementados en las clases hijas. El siguiente ejemplo daría un error del intérprete de PHP: fi_l cl.. las clases que se declaren como final no pueden ser heredadas. . no se puede usar directamente sino a lravés de una subclase (la cual.J Por último. recibe el nombre de concreta). definiendo una clase como abSlracta.O RA-MA echo "passa. puede definir métodos abstractos.' :re . . l ( 1 .)". la responsabilidad de la implementación recaerá en el siguiente nivel jerárquico.. • Cuántas páginas diferentes han sido descargadas. ".. queremos disponer de una clase que analice las bitácoras (ficheros tog) de un servidor web y genere los siguientes datos estadísticos de accesos: • Total de octetos enviados por el servidor.e exten4a clase_final ( ) 7.

11 laa fachas deban . rlS.e RA-MA CAPtruLo 7: PROGRAMACIÓN ORlENTADA A OBJETOS 23S • • Para una determinada dirección IP. <? abatract el al' BLtaeora I 11 total ~ octetos enviados por el servióor a~tr. cuáles han sido las páginas que ha visitado. . los datos que se tomarán en cuenta serán los del día anterior).~vi. en el _rvldor ~tract lunction total_v~'ta'I). Por ello. 1/ nu.er tiaelteaps de unix functLon interva1o(Gtimeata.tlnir el intervalo de tieqpo en que le calculan 1. para cada registro. tadl. Definir la franja de tiempo a la que se limitará el análisis (por defecto.tintaa lervidas ebltraet funetion paginae_~lferente8() . Lógicamente. . separa los campos que contiene (parsing). hemos escrito una función (lees_andiza ().lt1a 4b8tract tunctlon que-P8gs_vLsita($que_ip)¡ 1I para ~. Xitami. Blt.ero ~e paginas di.~peehe f~tlon extenda Bitacora public total-oetetos("'-" .d. encargar a distintas personas la implementación de las clases correspondientes a cada uno de los servidores que tengamos y queramos analizar..tle. Aquí las clases abstractas son muy útiles ya que los servidores web con que nos podemos encontrar son muchos (Apache. cada uno de ellos suele tener un formato particular para guardar los ' Iogs ' de accesos. .. además.ita($que-Pa9)1 /1 ~evolverl el arrly asociatLvo: arrayr·paqina.it_ recibida. comprueba que ese acceso ha ocurrido dentro de la franja de tiempo deseada y almacena en una serie de variables los dalaS relativos al acceso en curso. di.1 dil Interior abst~act 1 ? Aquí. . haremos una implementación para leer las bitácoras de Apache. AOL Server. y cuántas veces lo ha hecho. con posterioridad.itaa funetion qUi~vi.tintos abetrlct funetion clientee_di ferentes(1 i 1I dwvo1vera el array alociatlvo: ~treet arrayl'lp_eliant.visit~·J. Por esto. $ti~'ta. etc. <? el ••. la parte más importante de la implementación es la relativa a la lectura y análisis de las líneas de la bitácora.p_de.eor. 11 n~ro de vi'itant. . If au-ro di vl.·J~vi.p~steIJ 1/ por dalecto. es . lo que hacemos es diseñar una clase abstracta con las funcionalidades expuestas y.) y. la cual.ct functlon total_octetost). ______________________________________.

.~>ip_cliente ...\IIPLQS O RA-MA ) publ Le func::t. P4111' i M I $tot +_ $cont-PaOinal return $tot: ) public fun~tion pagina$_diterenteaCI return ~nt(S~~$->~_vi.sit •• private Slp_clientezarray() I // vi..PolI.. O. urlencode y alUUMr el poaibla quel"Y_atring ..date I ''1' ) J : l/ayer • B640~1 11 sume un di.lni_intervalo"r. j $thi... private Sfi~. ) publlc functlon intervalo($timeltamp_deede. c~o.yl): o. O..ini. referer..1. agent private $tich_log¡ private $pol~ses_eo~nYOI private $inl.ntervalol function _conatruct ($fot'lllAto_iog.lttilllll (O.'" fortllll to_lag" $ f Orfllll to_log : O~n rat.log) ( 11 poaibliidades del formato tipico: combin~.n_anyo() I '~') $thl. ip} return $this->ip_cliente[$qu __ ip].a..a di. . on-. JI arrey[-jp'l-nu.dat. data ('11\') .o private Spaq_vieieada..v. privata functlon dar.. J al.intervalo.. .·>fin._intervalo.j···· ERROR: NO exi.. t~_h4.· ).~iaa($atrl ( 1I pcmar .->fi~lnterv.ta.~ 236 PHP!i A TRA vts DE EJE.->pag_vieitada[Sque-PagJ • • pubL!c funedon que.·. $ th! .lO"$tbi.ral aqent $thi.. · .a $ip->$paglnac { fCl"lIach ($pagin.. ) . IiII $paQlna.\.iC function o.stamp_haltal I $thi.~>lee-y_aIl41i%..(.Jf\eses_.$tl.it~)1 publ!c functlon clientes_diferente.ini_intarvalo -l..ta~_de8del $thJ.ta la bitAccra '$fleh-iaq' ' j .t.ion total_visital (1 { $tct_O: torelleh ) ($thi.paqs_vieiul$que . tf ¡1a_Ulal$fich_log)) ( $thia->tich_l09~$fich_10qJ $thi. $tu..it •• por ipI private $oetetos_enviados_O¡ 11 vidtll. $fich.!) return count[Sthis->ip_cliente): publ. a cada pagina private $to~to_log: I poaibilidadesi c~ned.~>ini->ntervalo~$t~. .ag) { return '~i.zuien_vlsita($que.."$COIl.

ing!Ol. t.to_.gJIt· 'pos. fin_intervalol recuro 11 elae returo 2. el..~..' po. 010 '~oct.. '~_guionl'.s (Sp lB_fllcn ) 1 I ( e. ·. ~ag:nal) ¡ Sthh->ip_cliente [ScalllpOa fspoa_lpl I [slaJ>llg) H J Sthis->Pllll_viai t. "r" ~ ¡ whila < !teotl$df) &.n. ~lOnl' .t08 ) {$i $lco:xmcl$icS-('ampo. < (intl$this~ .:ol 'Mar .:o~ ·l!Iay'. $b1 ti..$dia.a... ___ t~ 5ISp?s~vina~6¡$poll-protQC o-71$~. "¡\2d/'3c '..egl. ~ttp 8/$p? • oete " $e.Sdia.>" ·. Sain.lta(:{)ra--"P!lche I cClmbOn'. 10. $4f. Jl. l.) ( ••eanfIS. functioo ini. e· . fecha anterior break. SC.Y_que:ry_.eh. ($camp. . e. 'lag. $pagin4-Y_QUery_5t. . t :. Spos_guionl .. 021)1) • "!:1' 1k H'l"I'P'" 21 D O 1 Sido c:.~>po. Deo: _.(·7·.:1. ::'a • .mpoB... aa..(htrJ J.. an~echa($.)lletodo·.. c. .p..gina(Scarnpoarspo. sólo estA implementado 'cc. po • ..~_http'.¡!.eif \ (intISahor... privat..t~cn urlde«:ld.. 40j61._f~ba· po.gu_.:. CI RA MA CAPITULO 7: PROGRAMACIÓN ORIENTADA A OBJETOS 237 Spagina. .>1.. l!u!IIlSdO.. ::Ipoa. $...n_tu!lyoO ( . $eat..ata function a.. $anyo. break.t • .). .po. NOv·.~esta_efLfech...a_en_fecha:false¡ I I f.. Aug· .._en_anyoaarray( 'Jan'.a". __ ..posJllEl8es.a_en_fecha) $lUl•• _fgetSI$df.~xplode <" " $l~ne..~rue..Jul·~7 Sep'".¡II~.' pM. $seg.n_f. toea 48 log tlpo 'cOIIIIIOn ~ (1)fllpr/lCC4'14.e.. private function 1. ~yo) : ir ((lntISahora < \intlStbis-"ini_!ntervalol raturn O. . 11 nad.ase O.e8_.on'cbr>" ' J e-janplo de i.m2"2¡ $poa fac::ha-3¡ $pos $po. t· .. ~or 2(1 1~ J4 'p).e 11 $this·>octetoB_enviados +~ $campov{$pos octetos): Sla-pag~$thjs~>dame-P8.d:'2d:\2d:\2d*.. .anyo I'_J .. S..11 Apr' ..¡..thi.. Sahora-aktime I Shorll..aae .!! .e-Y_anA1iza() { if l~this·.to_10Q' \_ coltllllOn'! die ("ERROR' de m~ento.ada [Sla-pag J [$campoa [Sp08.. $nün.. 'Feb'..leq. 'Jun'. 'po.. 1teh <Stllis. $..PaC' .-proto.trinq~1()d.'21 prl.fonna.fopell ($tbla->!lch..11 .apoll • array ('poB_ip'..>5. $bor. 1 p) J ++. $tllia-:."¡ I • $poII_. 8.!Il¡ $i •• Sid_ca¡apoa:!$i 'wSi: '1..

>'.Jlhp4. eeh? ·cl1. es una especie de catálogo de métodos a . ) 7. .~>Svalor) echo ' . Dlfprentes ¡.J). ')<br>.rina. para evitar que los métodos abstractos se usaran de fonna estática (Clase: :metodo (). 'páJ..t.bezado</td></t.." fu~tion • ) b. mientras que la abstracta puede ofrecer una funcionalidad (porque puede implementar el código que necesite).. if ' •• gun4a")) di.aludat) dlel'qu~ no.138 PII1'5ATRAv!lsOEEIEMPLOS CRA-MA echo 'PagiMs visitao.~l.visiu. Además.. se empicaba la función is_sub_class_of (1 : .10 INTERFACES Otro lipo de clase. muy simiJar funcionalmente a la abstracta..s: . tr><td>SclAv~</rd><r~ .rray. toceBch í$. visitadaa por Slp'I. .. echo ?> '$enca~zado: O<br>'¡ PHP 4 no reconocía las clases abstractas: un truco que se solfa usar para evitar que la clase se pudiera instanciar ero poner una sentencia die () en el constructor de la clase. . i~r)."_. o bien se hacía como con el constructor y se ponra una sentencia die (l como única sentencia de un método abstracto.t~hl$bit. o bien..: ')<br~' . 'ipa: <¡\le vi.I nc lile puedes lnstanciar :"¡.. Al igual que aquélla..btm'.a. Ojfe%~te. .·.j:'ti-. __ o).1i~n..t) I di.itan • SP'lg • I I f~nction lmpri~_tabla{$el_.'l'><tr><td colspan~·2'>Sene. echo ·PagIna.l_array as $clav.$~)._~la ••_of(. -. f' Sip-·ll.l. t· ERROR: la llamada no des"e una subclase·) I Ili. Seneabe~ado) ( d ¡hl_"rray) f echo '<table border.tt·.cora->que-P4gS_visitaíSip). es el interfac e.. l!!:pr l __ tabla IRtitacora->quien. $pag··/indnx. Se diferencian en que.·right·~$valor~/td~~/~r~'1 . en el interface sólo se declaran los métodos (no se pueden declarar propiedades).. Sbitaeora->eoeal_viSlta. .cho "</table>' ¡ ) el .t¡ Sbltaoora->pagin••_dlferenteall $bitaeora->cllent•• _diterent ••• ' "'''br>'. no pueden instanciarse. t'ERROlI. ·¡U' .' "-on.nt.ehi. que no.

es equivalente a este lipo de programación. si para derivar una clase hija de una clase abstracla se usa la palabra reservada extends. a cuál llamar. de entre todas las funciones definidas.1 foreac~ • array ('funet·.Io¡Jl_nt.!nterf4z{JI 01 . la programación de código genérico con variables de función se usa con bastante frecuencia y de manera natural.oy CUNO\n'.' ¡ ) $p new hijo_ine. no tiene sentido declarar un mélodo privado denlro de una inteñaz).oy E_DOS\"'.11 POLIMORFISMO Para los programadores de lenguajes interpretados como PHP. mandar ejecutarla: es PHP quien. . ) functlon la .. $~·>~. 'tJ') ¡ $1Ula. el polimorfismo no les resultará un conceplo dificil de comprender puesto que.tl).CAPITULO 1: PROGRAMACIÓN ORIENTAI)A A OBJETOS 239 implementar (de hecho. . ~ tunctlon If\et_interfe. luego (poniéndole los paréntesis abierto y cerrado). Sintácticamente. se djferencian en que para declarar una inteñlll.. Además.. ($ltsto_f as $una_fl 'la~t2'. p~ hacer lo propio con una inteñaz se usa implements. Lo que hacemos es especificar una variable que irá recibiendo distintos identificadores de función y."~("4 J. nO ( echo '. Por esto..lo(1 ( echo 'lIIoy _1 hijo dol interfaz. tunet10n ) ~t.rf4lo!). El siguiente trozo de código es un ejemplo de 10 que acabamos de mencionar: function [uncl() ( echo '. .. int. en tiempo de ejecución. ~! . hLjg 1"t. ) fuoction [J() (echo 'IIIOY CTIU!:S\n'. una clase puede heredar de una clase solamente (PHP 5 no permite la herencia múltiple) pero puede implementar tanlas inleñaces como quiera: "' 111 7. ) $liata . en ciena forma. decide.t Por último. Perl o la Shell de U*ix.r~III~(). l"t. . no se usa la palabra reservada claS5 sino interface.

cada vez que el usuario 're sitúa encima (o saJe) del elemento con el rató n... P<lG-. por un número indeterminado de objetos sin importamos cómo lo implementa cada uno. de manera distinta. crear código genérico. . Vemos.. Dicho al contrario. Campo_Formulario. visibi 1i ty' . new clasell) Ir f"rNch Uobj~. El ejemplo propuesto define una clase abstracLa.r 240 I'IIP 5 A TRAVts DE EJEMPLOS e RAMA Consideremos ahora el siguiente ejemplo paralelo pero. i'. new cloae2(). por tanto. on-b1ur_ Sc!ad. pcotected Scape_ayuda. con array Inew claselll... . cómo a la variable $un_obj...ob:!->_todo. a¡"tcact class C4lllpO_FoI'1tulllci. el cual debe generar las etiquetas HTML necesarias para mOSlrar un elemento de formulario..~ protected Setiquetal protected Si~c ... t .obj ) { . que declara el método abstracto pinta_campo ( ).UliI...t) ( · dOCWll. 1'I_e) .~. El polimorfismo es una herramienta muy potente ya que permite a clases diferentes compartir una misma interfaz.. lunction _constructtSidi $etiq. en tiempo de ejecución.. 'Scmd_ !''''·visible\· I protected ~tioa pon capa ayu4a( 1 { 11 el identif de .•.) ( Sthil-..tected fWlCtiOll ~c ~a . ~() " redefinid" en c . decide cuál de las implementaciones del método es la que va a ejecutar.. $thia->Cllp~syudlla$syu~¡ abIItl'act function piDt __Ca. _" . Ss . a capa el el prefijo SI ··position:relative¡top: 10: ..'"hidden\" \D'. $ayuda. ' font'flUaily: Arilll ¡ ' : '~' • el ~ombre del elemento .veat.• tyle... .. pudiéndose.id_clll1(>O"'Sid. cetucn "onfocus. objetos: $objetos ~ eSla vez. sucesivamente.. se le asignan todos Jos objetos (que son de clases diferentes) que hay en el army Sobjetos. PI . el polimorfismo permite que un mi smo método pueda ser ejecutado. En esto consiste el polimorfismo en que.. basándose en la clase a la que pertenezca en cada momento el objeto. Esta clase ofrece dos métodos imernos que generan el código HTML y JlIvlIScripl preciso para mostrar (u ocultar) una capa flotante. con un texto a modo de ayuda. es el intérprete quien.getElelllen':ById t ·c. Sthil->etiqueta=Setiq.. _ 'wa. mpo.po ¡) . también.. clase Vemos. que dentro del bucle se invoca al método metodo_comun () que estj implementado y redefinido en cada una de las clases de las que se han creado los objetos.ent .

lin.• ·vl. ¡ ~\n'¡ .e. Sayudtl'.-~~pa_ayuda<l. estando la e tiqueta alineada verticalmente dentro de la celda.ize. '</tttlttal:""~ • $thll->po"-capa_ayuda() '</td~</tr~< tllble~'1 ) .tyl•• ·$.·text· na. generar las etiquetas HTML apropiadas. cla . ca. . . ~$linaa8¡ $thi. Por ejemplo. priv~te functi~ $tamanyo: __ CQ~t~ct ( .~ id. ··backgraund~color'.extarea se di buj an en una tabl a de manera que la etiqucta csté en uno eelda y la eaja de texto en otra. redefinida cada una de ellas pard. .·~ 'thl. .·$thia-~id_c~· IIclw $thi!! ..po () ( echo "$thla->ettquettl\n'¡ echo '~input type.Ollet. ___ e NI.')I\ p1llt& ca.pan>\n·1 ) Declaramos tres clases derivadas (Campo_Text.·c_Sthi8-~idLcampo· . $e:tiq. $. •. .->col.' • $thia.-~tamanyo· ~­ echo Ithia ficho '<br '~pOl:Levl!!ntos. los cOnlroles t. $lineaHI C~_ronallarl0 ! functlon __ eODatruot($i4._construct($ld.t~.po . latiq • • 1i"'. . en el caso de los radio o checkbox.ClRA-MA CAPtruLO 7: PROORAMAClÓN ORllNTADA A OBJETOS 241 .~POlL8V1JntOIJ--5B () • ">. ra~ axtende privat. 001a.id.Js e) ·~POrl.truct e Sido $etiq.. la etiqueta y el elemento de formulari o se imprimen en orden inverso al de los text y textarea: primero el elemento y luego la etiqueta. P<'Tllmt : .fffbad. parantl'.~Sco18. $tlyuda): $thi. ..' $thia->col.turn '<.Ctlpll_llyuda ( . lógicamente.tiq. Campo_TextArea y Campo_Casilla) que tienen la misma interfaz (el método pinta_campo ()).·.-.nct ion piDt&_ CUlpO () { '<tabla bordar·'O'><tr~~td $thia-~etlqu8tll</ td><td~ ~t~xtar94 typ~D'text' vallgn. pero.->id-e~' rawlI_' $thi II-~Uneaa' cals. ' >\n-. ' mi~la ' > n~'$thi. . $thla ~t~n~'St~nyo¡ $~I ( fl. $ •.tbl1ity:hidden·¡ r.·lth~.~) I ~ha tu.

tal") I.elecc>\n $thia->etiqueta\n' • $this->pDnLcapa_ayudatl <br />\n'. 'no'.. 'Obeervacionea'. $etiq.42 PIIP S A TItA vt. . 1. echo '<fo~ Sc~oa n_ n_ CIU/IpO_Text ('rn. . • array I 'O. '0. ·f~r'. 'I'uDar . prlVate $valor¡ $preselecc. __ 'che<:kbox' I $thia->tJpo_caailla c $tipc_casilla. '.'return fal •• '>'.'). 'afl". n_ C&npo_'l'extArea ('obee[V'._col18tructISid. "NOM!IllE'. for •• eh (seampos as $~obj) ' ___o~j->plnt:. la casilla debe ser 'radio' o 'cneckbox' " )¡ hmction pb... 'el noltbr. "~iea'.. Sayuda)¡ Sthla->valor*Svalor¡ i! I$pr••eleec . con un bucle foreach ejecutar la interfaz común (se trote del objeto que se lrnte). . en crear un array de objetos de distintas clases distintos y.selece_' checked ' ¡ el •• $thia'>preaelecc a ' .tar'del ( parent.").() ~ •• '$thie~~i4-c.abre'. O..w Caapo_Caailla ('checkbox'. onsubmit. n.poreJat. pri mero. htiq. '~te".->pon_ev. ea.t:. ''''-er "ta''').-po' $thia->pr. segundo.s DE EJEM PLOS O RA-MA p~Jvat._c~() ( echo '<input typec'$thia->tipo_casilla' value-'Sthia->valor' Sthl. tia. 11 $this->pr. "af2'. el uso que hacemos de las clases consiste.a?"I.nto. 40. "LIl r:u. new Camp<LCaailla ('radio'. elle dial'ERROR. de pU. O. privace $tipo_caailla. La salida de este scriPf es: . n_ Campo_Casilla ('radio'..~.~ . "MelÓM4l\o1'). I if I$tipo_eaailla _ 'radio' 1I $tiP03UJll.2.quiu. O.l_. "1iO ruma'.po_Caallla ('cheekbox'. w. ..> eeho '<¡foon'" ¡ Por último.. 'al'._o~(). 'S! ru.1'. function _ _ t:t'GCIt(ft:lpo_c_l11a. 'al'. 'o. 'fUlll4dor'.a".

en caso contrario devuelve FALSE. a get_class_vars (clase).ORA-MA CAPtru LO 7: PROGRAMACIÓN ORJE:NTADA A OBJETOS 243 1 7.12 FUNCIONES RELACIONADAS Paro finalizar el capítulo dedicado a la POO.. o class_exists (clase): Si clase está definida devuelve TRUE. o get_declared_clases ( ): Devuelve un array numérico con las clases que están disponibles en el script: las nativas de PHP y las definidas por el usuario.. el operador instanceof y la constante ~OD_. hacemos una somera descripción de las funciones que guardan relación con las clases y los objetos. . a get_c:lass (obj): Para el objeto $obj. gec_object_vars (obj): Devuelve un array asociativo con las propiedades (públicas) de que dispone la clase (o el objeto). o get..parent_class (obj_o_clase): Devuelve el nombre de la superclase de la que está derivado el objeto o la clase pasada como parámetro. respectivamente. devuelve el nombre de la clase de la que es una instancia.

El resuhado se mueslCa en la siguienle imagen: . Si sc usa en una función.) c/$1"'lLE> </I!E. '«b>'.t _cl••• ($Obj. devuelve el nombre de la clase y el método desde el que se está ejecutando..~/H2~ <?Phl> $docXKL new dIXlOoaW'llErnt 1I1 $el .ene¡ ' El.tanceot : $obj instanceof nombre_clase. OJO. •• echo '< 'td></tr></table>w.~lcrar).bajando con Claaes y Ob).. . p. no es una función sino un operador puesto que liene operandos a ambos lados. echo '<tr>-<ed colapan_'. devuelve el nombre de éSla.>. Si la variable $obj es un ejemplar de la clase nombre_ clase.. Constante ~TBOD_: cuando se usa desde dentro de un método. a Operador in. en caso contrario devuelve FALSE.D> c80DY> cCBNTD> <B2>~. A ¡fone= p (f~t l~px "aDR08P4Ce".rl). "/ echo' Métodoa de <b>·.. g.!' bg. tmetodo • • g. devuelve TRUE. </C!Nt'ER:> cJAQOY> <¡II'11(1.>l" yell" .ento • SdocXML->createEle.t ol ••• ttcbj foreach (t.(g.todo • •• tpos _> t~~.) ( ) _ ~lor.to. echo "<table border~'l'>'.'>l.-ento' .a • 244 PHP S A TItA vts DE EJEMPLOS o RA·MA a get_class_methods (clase): Devuelve un array numérico con el nombre de los métodos de que dispone In clase. echo '«td></tr><tr><td>". 12px "Verdana'¡ color: red. a El siguiente código nos muestra cómo ulili zar algunas de estas funciones para recuperar información sobre una clase u objeto en particular: -<HTML> <HtAO> <TITLE>Trabajando con Objeeoa</TITLE> cSTYLE> TABLE.t~cl ••• ___ thod.

.-~ .lo .to que se basa en una clase nativa de PHP 5: Exception.. la sentencia throw s610 pennite objetos de esta clase. .. que tiene el aspecto siguiente: try ( /1 cOdigo a proteger ) catch ( // codigo para tratar el error producido ) La idea es que si. _ . Para ello....... _ _ -.13 EXCEPCIONES PHP S incorpora... .... . gracias a la cual..... _ .. ~ J .._u'!Q" l •• l' .. Python. El constructor de Exception admile hasta dos parámetros: una cadena de caracteres (que describirla el enor) y un número enlero (asignado por nosotros que se correspondería con un código de error)...... ...... .. detectamos cualquier anomalía... n_".. mecanismos para la gestión de excepciones. dentro del bloque try... 110. ~ .. u -- 7._ ......•• . _ _ ¡ _.... 110..<._ .... IIIA...... De hecho........ ~.. .... .J.TADA A OBJETOS 245 --~ Trabajando con Cluu y ObjelOs '.... '¡II.. . .. 1 ... ld.. _ la . . los juntamos y separamos del flujo normal de la aplicaci6n. . el flujo del programa saldrá de este bloque para saltar a ejecutar las sentencias del bloque catch...C RA-MA CAPtruLO 7: PRQGRAMACJÓN ORIW<. al igual que lenguajes como Java.... .... o derivados de ella.. ...... IIo.. . _ .. tdl". e#. . _ ... . La gestión de las excepciones se suele ver dentro de la POO pue. ¡ .. etc ._ " .... ü· . s <-~.Ittul>....... Se pretende que el c6digo sea más legibl e: en Jugar de controlar los errores en cada Hnea donde pueda producirse un error. _ . ...ullo _ _ _ ~~_ ll' " u...." " ' .... generamos una excepción (con la palabro reservada throw). ."~ UI u - ... provee la estrucrurn de control try / catch.-. .... . Los mélodos que podemos usar son: ...._...........-.

ageSYI Simag. t. o getCode 1) : Devuelve el número entero pasado como segundo parámetro al constructor. TRAVts DE EJEMPLOS ORA-MA o getMessage (): Devuelve la cadena de caracteres pasada como primer parámetro al constructor.l00.tra tMageCopyRe. $elto~ueetra. o getTraceAsString ( ) : Igual que el anterior pero en fonna de cadena de caracteres.0.. .neho~u. o getTrace ( ) : Devuelve un array con información sobre los puntos donde han ocurrido excepciones. $. A continuación. Sim$9-orig!nal. ( t.0. ¡mage$X\Siaag_originall.iste el fichero del cual se quiere sacar la muestra y si el contenido de este fichero tiene formalo gráfico PNG: '''' SnCQbre. $~re_fich·.981: ImagecreateIS.lto~e.ncho~eetr.ptlcnl"Snambre_fich no tiene formoto fNQ'. En concreto. $i~ag_original • • Imag&CreateFromPNQ{$nombre-lich): if 1I Sima9_originall ~row n.ized!$imag~estr. $. original 1 I .w Exc. il 1I f'le_exi. o getLine (1: Devuelve el número de la Unca de código en que ocurrió la excepción. o getFile (): Devuelve el nombre del script en que ocurri61a excepción.atra.' lich. el código de un ejemplo anterior que generaba una muestra de un fichero gráfico lo reescribimos para rratar con excepciones los posibles errores que se puedan producir.. 0. si ex.• 246 PUP.l00. f ieh.x~.tra. S.~e($nombre_fichl t~ DeW 1 axceptlcn C'NQ exieee '91: Sancho~ee~re.5 A.lto~ •• tr411 Simag_mue.0.

~b6¿*chu~plit(base6~_encode(ob_get_cont. con las runcionalidades que consideremos oportunas.6.trG). "<br>'¡ .eeption e<.rc.:ho "ERROR • ..$en_b6~'~· 1 ) eateb (.C RA-MA CAPnuLO 7: PROORAMACJÓN ORIENTADA A OBJETOS 247 ob_atart () l lmAgePHG($iMA9~e. $e->getMea.. podemos crear subclases de Exception.age¡1 ..iasg. S. Se->getLinen . en la linea " . . I .baa. Por supuesto.e' $a->getCode () .nC) ...fIIJI ob_eM_cl .nt.'data. simplemente extendiéndola. . echo "<:mq ./png.

.. conocer la fecha para .. o bien. En casi lodos los sistemas infonnáticos hay una fecha de inicio común. En PHP todas las funciones de fecha/hor. . existe un montón de circunstancias donde es necesario conocer estos datos. al igual que una breve descripci6n de elJas: fundón time ( ) checkda te ( J date() descripción Obtiene la marca de tiempo UNIX actual Valida una fecha en formato gregoriano Da formato a la hora y la fecha locales . El contador de tiempo se conoce como marca de tiempo (timestamp) y representa el número de segundos tran!«:urridos desde una fecha dada.1 INTRODUCCIÓN Es muy importante en muchos problemas y aplicaciones llevar un control con la fecha y la hom en un detenninado momento. 8.¡ que trabajlln con marcas de tiempo hacen referencia a esta fecha.- CAPjTUL08 FUNCIONES DE FECHA Y HORA 8. a partir de la cual se empieza a contar el tiempo. En el caso de los sistemas UNIX la fecha elegida como comienzo es el dia 1 de enero de 1970 a las 00:00:00 GMT.2 FUNCIONES DE FECHA Y HORA La siguiente labia nos muestra el resumen de las funciones de fecha/hora proporcionadas por PHP. PHP nos ofrece una gran variedad de funciones para abordar con mayor rapidez y de una forma más sencilla los distimos problemas relacionados con el manejo de fechas y tiempos que nos puedan ir saliendo a la hora de realizar nuestros programas. fecha que se conoce como el principio de la era UNIX.aber si tenemos que ejecutar un programa u otro ..

la función devuelve un valor falso _ o da te (forma to (. incluyendo los ai'los bisiestos). la función devuelve un valor verdadero. es decir.!SO PIIP. times tamp 1 ): Esta función nos permite darle un formato específico a una cadena que contendrá una fecha y una hora_Acepta como parámetros una cadena de formato y un parámetro timestamp. en caso contrario. Si pasamos una fecha correcta. dia. todos los parámetros están dentro de los rangos establecidos: anio es un número entero positivo. Esta función es bastante útil en los formularios en los cuajes hay que relJenar campos de lipo fecha. Estos caracteres son: .5 A TRAV~ DE ElEMPLOS C RA -MA fIInti6a des<rlp<loIa Obtiene información sobre la fecha y la hora locales gettimeofday () Obtiene la hora actual Formatea la fecha y la hora a formato gmdate() getdace () GMT gmmktime( ) gmstrftimel) microtime ( ) mktime () strftime( ) strtotime (1 Obtiene la marca de tiempo UNIX de una fecha con formato GMT Formatea la recha y la hora con formato GMT a las caracterlstJcas locales Obtiene la marca de tiempo UNIX actual en microsegundos Obtiene la marca de tiempo UNIX para una fecha dada Formatea la hora actual de acuerdo con las caracterfstlcas locales Traduce una fecha u hora descrita en inglés a su correspondiente marca de tiempo UNIX Pasamos ahora a ver cada una de ellas en mayor profundidad: o time (1: Devuelve la marca de tiempo correspondiente al instante en que se ejecuta_ o checkdate (mes. se tomará el instante de ejecución de la orden_ Hay una serie de parámetros que tienen un significado propio y son reconocidos dentro de la cadena de formato. mes es un número entre I y 12 Y dia entre 1 y 31 (teniendo en cuenta el total de días que hay en cada mes. si éste se o mite. anio): Verifica si la fecha que se le pasa como parámetro es una fecha correcta.

deben ir precedidos del caráclcr ".M." O "P.m" "A.m: O "p. o getdate ([timestamp]): Esta función devuelve un array asociativo que contiene información sobre la fecha y hora asociadas a la marca de liempo. ésta obtendrá la marca de tiempo del instante en que se ejecu ta. "ndO) Número de dlas del mes dado. t. pasada como parámetro. que estén dentro de la cadenu formato.M: Ola de! mes con dos dfgitos (de "01 " a 31") Ola de la semana con tres caracteres Nombre del mes Hora en fonnato "01· a "12" Hora en fonnato ·00· a "23" Hora en fonnato · 1" a "12" (sin cero) Hora en fonnalo "O· a "23" (sin cero) Minutos de "00" a "59" Ola del mes en fonnato "1" a "31" Ola de fa semana. . Para que los caracteres utilizados en la cadena formato se puedan imprimir. FUNCIONES DE FECIIA Y UORA 251 \'llores descripción "a. en texto completo 1: si es un ano bisiesto O: si no es un ai'lo bisiesto Mes de ·01" a "12" Mes con tres caracteres Mes de "1" a "12" (sin cero inicial) Segundos de "OO· a "59" Sufijo ordinal en inglés ("th". es decir. es necesario enmascararlos.= - e RA-MA CA PfTULO 8. En caso de no pasar ningún parámetro a la función. se imprimirán tal cual aparccen.imestamp. ". de "28" a "31" Segundos transcuniclos desde el valor de inicio (01-01-1970) Ola de la semana de "O" (domingo) a -S" (sábado) Ano con cuatro dlgitos Ano con dos dlgitos Ola del ano de "O" a "365" Diferencia horaria en segundos de "43200" a "43200· • A d D F h H g G i j 1 L m M n • S e U w y y z z Los caracteres dislinlos a los que aparecen en la tabla.

Minutos al oeste del meridiano de Greenwich. cuya eSlructura contiene los siguientes campos: campo see usee m: nu teswes t descripción Segundos. Corrección horaria entre los horarios de varano e invierno. a excepción de que los parámetros que se pasan en 111 llamada a la función representan la fecha en formato GMT. Da formato a una fechalhora GMT según las convenciones hx:ales.l la función strftime (). la fecha devuella es la de GMT: por lo demás. Identifica. Identifica. anteriores. la diferencia horaria de ElPBna respecto a la cM Greenw/cti en Yel'llno eade +2 h~ "'-8n inVierno 88 de +1 hOta a gmrnktime(hora. el dla del ano. el dla de la semana. Identifica el dia del mes. Identifica. el mes. seconds minutes houra ""'ay wday mon ye. mes. es muy parecida . NOTA: Este formato le toma como referencia para 18a diferenCias horerias Como curioSIdad. weekday month Identifica. dsttime 1:1 grndate (format r. timestamp]): ESIa función es muy parecida a la función date () anteriormente vista.f 2j2 PIIP 5 A TRAvés 06 EJEMPLOS e RA·MA La estructura delllrray asociativo devuello es la siguiente: ~Ia\it descriPción Identifica los segundos. en texto . Al igual que en las funcione!. con una salvedad: la hora devuelta por esta función tiene formato GMT (Greellwich Mean Time). yday Idenlifica los minutos. anio I . seg. dia. en número. . Microsegundos. en número. IdentifICa. el dla de la semana.is_dstl): Es muy parecida a la función mktime (). en numero. Identifica las horas. Identifica. 1:1 gettimeofday (): Esta funci ón obtiene la hora aClUul en un array asociativo. en nllnero. timestamp): . en texto. min. el ano. o gmstrftime (format. el mes.

'1 . lile. correspondiente a la fecha y hora pasadas a la función como parámetros.C RA-MA CApfTUlO 8: FUNCIONES DE foTCIIA y llORA 253 CI microtime (void): Devuelve una cadena compuesHl de dos elementos "msec sec". seg. que indIca. En este caso. También hay que tener en cuenta que la función admite que el parámetro anio sea codificado como un valor de dos dígitos. los sistema. el UIO correcto del parametro Es muy importante tener en cuenta que esta función posee la característica avanzado de calcular la marca de tiempo para parámctros que estén fuera de rango: aproxima los datos introducidos a la fecha más cercana correcta. operativo. o strftime (format 1. Existe una última aclaración de esta función consistenle en que el último dra de cada mes puede indicarse como el día "O" del mes anterior. "32 de marzo de 200 l". valore. Si alguno M ellol se omIte. o NOTA: Lo. '1álldos para el allo estan entre 1902 2037. se tomará por defecto la marca de tiempo correspondiente al instante en que se ejecuta la . parjmetros se loman de izquIerda a derecha de forma que. representa los microsegundos restantes. es decir. es decir. hotWlO de verano o no. Ambas porciones se devuelven en unidades de segundo. obtendremos el valor de timeSlamp correspondiente al"¡ de abril de 2002".y (J. mes. elide enero de 1970 a las 00:00:00. la función realiza la siguiente equiparación automática de fcchas: los valores comprendidos entre O y 69 se ajustan a los años 2000 a 2069 y los valores enlre 70 y 99.nl0 pueden tom8r el VIOlor O El paorámetro b_dllt le utilIZa pata indicar al se tiene en cuenta . dia. anio [. En caso de no proporcionar este parámetro. is_dst]): Esta función devuelve la marca de tiempo (el número de segundos trnnscurridos desde el I de enero de 1970 a las 00:00:00). La segunda parte. seco representa los segundos transcurridos desde la fecha inicial de referencia. timestampll: ESla función nos permite dar un ronnato específico de hora y fecha a la marca de tiempo que ~e le pasa como parámetro. pordeleelo llene el valor-l.. que aoporten la mktime (hora. a los años 1970 a 1999. Esta función es especialmente útil para realizar cálculos matemáticos con las fechas o validaciones de ellas. mienr:rns que la primera pane. PHP qua ~ ou'I . min. cuando ejeculamos la función sobre una fecha incorrecta. por ejemplo. se sUlthuye por el valot de la techa '1 hora actual correlpondlente NInguno de los valores de di'!!. NOT"': En 101 sistemas que codifican el tiempo como un enlero con signo de 32 bits. lo. NOTA: Elte luoci6n sólo at' dIsponible en llamada al sistema gettilDeofw.. msec.

o ·pm". [J strtotime (ca~fecha 1.2S4 PHP 5 A TRAV~ DE EJEMPLOS función. o bien. .w %x %X %y . %Z %Y % NOTA: No te permiten todas \al combinaciones Cle formatol poloibln.lera dnnipdjD o. timestampll: Esta función traduce una cadena que contiene un texto en inglés que hace referencia a una recha en su correspondiente marca de tiempo relativa a la marca de tiempo dada en el parámetro opcional tirnestamp. %0 %S %w am. a la marca de tiempo actual. \c 00 OH %I %j %m %. si este parámetro no se proporciona en la llamada a la runción. Los fonnatos posibles a tener en cuenta se especifican en la siguiente tabla: ". \A Nombre del dla de la semana (abreviado) Nombre del dla de la semana Nombre del mes (abreviado) Nombre del mes Fecha y hora en el idioma actual Ola del mes de 00 a 31 Hora de 00 a 23 Hora de 01 a 12 Ola del ano de 001 a 366 Mes de 01 a 12 Minutos de 00 a 59 M Ob o. segun corresponda a la hora dada Segundos de 00 a 59 Ola de la semana de O a 6 (O se corresponde con domingo) Número de semana en el ario (el primer lunes del ano es el primer dla de la primera semana) Fecha sin hora Hora sin fecha Ano de 00 a 99 Ano en cuatro dlgitos Zona horaria .

php·> <TABLf! CBt. El ejemplo consta de dos ficheros. elc.aci6n habitual de las funciones de fecha y horo vistas en este capítu lo. HEAI):> <TITLE>Funciones de Fecna y Hora<ITITLE> <STYL!> TASLE {font-family:Verdana:font:12px:l INPUT (t.·O'.·a" TYPS-'TBXT" NAKE·"anio· KAXLENV'TH_'4' SIZ&-'~'></~ </TR> </TABLI!:><BR> <INPUT TYPE~'SUBMIT' VALVE"Obtener Calendario'> <ff'ORH>~HR> <CODE> <B>NOTA'<fB>Cualquier dato no codificado <BR>a8 t~r' como el valor <BR>correlpondiente de la fecha a~t~al </ CODS> ~/CBNTER> ~ oe / 80DY> IfrTML> El código se visualizarla del siguicnlc modo: . mes y ano de una fecha en panicular. <TR IIGCOLOR"'·'l&U.. por tanto. next Friday.> .·l'></~ <TD><INPUT TYPEs'T!XT' <TD>~INPUT HAXLeNaTH. 8.right¡) </$TYLE> <l / HEAD> e8ODY> «ENTERo cHl>FunciQn•• de Fecha y Hore</Hl><KR> <lFORM METHOO.LPAODINOs' O' CBLLSPACINC.'C'lDfteP'> <rO>014</~<TD>He8<JTD><TD>Afto</TD></TR> <TR> ~TD><INPUT TYPB~'TEXT' NAKE_'d1s" MAXLKNGTH."2· N~'"m&8" SIZ8s·l·></~ SItB.OW' ALIGN.• O RA-MA CAptruLO 8: FUNOONES DE FECIIA Y llORA 2SS Esta función se comporta de acuerdo con la sintaxis de fechas de GNU.. uno primero de HTML que contiene un fonnulario en el que el usuario podrá introducir el día.. se le pueden pasar como argumento cadenas del tipo now. +1 day.3 EJEMPLO DE UTILIZACIÓN A lJ'avés de un programa de ejemplo que mostrará un calendario con el mes deseado por el usuario.xt-align.. vamos a ver la ulili z.. El código de esta primera página es el siguiente: <lHTM!."GET' ACTION~·fecha8J.

a purtir de la fecha dada en el formulario.rcay ¡. ._ .. 'Septiembre".. . -".font weiVbt:boldll a {text_decoration.. rastivo (eolor.. 11 ~ ambos podrian haberse combIMCIo en uno solo_ El código completo del segundo scripl es el siguiente: <H'T1<l..• Enero' .. ·Novie~re·."4)1trua:flll..> <H""...'BOOOOD.opc Icolor:vray. • S' .font-weight:bold. .xt~..._ . L' • 'M' • 'X' ._. ]._ -_ --_.. ..rray ( ••.." <TITLE>Funclon. ·Oicl~r.¡fls_txt*. ..si un dia pertenece el Un de . Q ---"~ Fundonf$ de redil y lIon .j p.. El segundo fichero del ejemplo es el scripr. "AVosto'. } (1 • allurey 1.. ' J ' .lign!f~ijhtl} tr...cabeCera ibac~ro~_color.color:oranv e ..color. el calendario del mes que contiene dicha fechu (si el usuario no proporciona ninguna fecha.} •.none.eIII!Inal$diat { "etuco IGdia>Ol?$dia-l. NOTA: Se ha optado por dividir el ejltlTlplo en dol flct1erol PB'" mantener el código ponelpal del ejemplo lo mal legible poslb!e. • rebrero' . 'Moyo' • 'Junio' ._.6..nct!on ectual1~di.. 'Marzo'.1 •. 'V'. .oranq8It. el programa asume la del día en curso). 'O' f : JI 11 FUnción qua transf"oC'llla el dia de 11l e_na ~re que et eL 6 al ~omingo fu.FPPBAO:color tSOS080..-. de fecha y Hora</TITLE> «lItyle> body (tont: 12pX Verdana¡) table ltontl 12px verdana. fre! 1 ~-.aeror {font:14px:color:redJfont-welvht bold¡ j </styla" </HEAD" $me..<Oo_.. .. . 'Ju 1io'.• emana lbackvround-color:. 'Octubre'.__ h _ _ vl .808080:color:'P8'8P8Ifont-weightlboldl tr . functi~] F\1neión que info. ratu~ ..·)l $diaa_txt-. que se encarga de generar.• 256 1'1IP ~ A TRA vts DE EJEMPLOS CI RA-MA _J.-na fe. 0_. . ~reado (backvround-co1or.) a.vreen.... • /J:lril" .clvo{$dial{ {S4i.

'. el últir-o di. for ISi-O.ASS.i.19711 ( echo '"SR>< "A HRRPc'f~has3.er día del IIIEla $prhlflr _dia~actual i za_dlll_s. 1 elsa $di./p>'.'.. O..p.m' J $anio-Iemptyl$_GETI'anlo'JJ7S... echo ·>$OODtador..d~dias</A></TD>".o "<'MI: C!.nio+.LJ. $. ·Cesttvo'·. Silla. 'cabecera'>".~r1bir lo.&me. 'IIIa •• . CBL. fecha introducida.aljlna {date I '\01" ..dat.'tO>" I ~ho ·"JTR>\D~R>·: . $dla.. 1epty ($_OIT [ 'lile.' ¡ obten~...'e-rror >ERROR: I..LSl'AClIlG-' WIDTHQ'SO\'>\n'._$c:!ia) echo ' claBs"'~ccado"J ~rl[. $. .nlo) I I (1 escr¡t¡¡ra da la tabla que repreSenta. ><HR>' ) ela. .' I t?LGETI 'lile.o-o) echo -"TI»$d..' 1) 1S_GST[ 'dill' I $hoy\ 'MaY' J' $md .PAllD!NQ" '2 .mktime' O. diea del _ $~cncedvr_de_d[a8.retdate 1).." $anlo<l!/TO>' 'Tlb\'n" 1/ es~ribir la cabe~ar4 que indlca los diaa d. 11 rllato da Bea\anaa $odla_Bemena~Sprimer_diel whilel$rontador_ds_dis8 <_ $ultiNO_di.5tivo(Sdia_semana)) echo" cla.ruol 1I $41110. tiRE~'''' fechas3 . O.~7 "BOOY> <c:tNTER> "HbPunr " on. 1I huacal de la primere semana ¡ f ($primer _dla:>O) ~o "<I!TD COL$PAN~'$priaer_dia'>~.DER-'O' CI". ¡". $~ontador_da_dlas~~ if{$di. O.KA MA CAPiTULO 8: FUNCIO:>lES DHI'ECIIA y llORA 1. ~ '<nI COLSPAN.s._s~na~~61 ( e<ho '"/TR>\n<TR>'1 $dla_.pnp?dia-$cont.s_t)tt [$. .al_darío ~ho '".html'>volver"/A> $. . no es vál ida.1..l.TR ctASS .~OOOI echo "oCHR.( ... la .7ABLl! BOR.eoaoa'>·. . 1.99) l f' I checkdate I $lIIes.CETI anio'] '$hoyt'veer " ~t($anlo". ( • C' . $1-<'1. $i. .AS8."I tteho '". .n1o' • ! tI $contador _de_dia. ."/~·. $dio: InptyILGE'r[ 'die. de Pecha.\0.lDkt 1.( echo ·"''r0>· I e-cho '<A.. < "''''' $hoy.s_na del ¡H:'ür.$iM'Se8_l)ttISme. y Hora</H).. Sanioll I : . // escribir la cabe<:enll que incluye 111 __ Y .doc_&lLdla. el c&landar10 de un Hlt./.'7' >' ..>"' echo '"p Ct." $hoyl '.1 atlo del .a.$mell&anl 0._ae~na++: .na «t.. I {I obtenemall el día de la .. del meAI sul tl"l~u:1ia. O.ana· .

getdatll(mktlme(O._ "oIlflio.chaa3..Sdia.'epc' HREF.$aea.php?dia~$dl. ._-12 1 ...anlo.·-1) $url . . 121 S\lr1 . ¡Sanio+l).· ope' HREF_' Sur1' "m8I1" C/. .php?di •• Sdll.lI... .. • • ..el .. " " " " " " '" (Jrh..... _ ...'opc' HREP~'tllchaaJ.-.J. ...cM '<P ST'iLE_'celor..- 011 JU"""o "'" 211 1 .. .' ~ho Sfechal'~y'J·l.. . echo Sur1 echo echo 'cA CLI\.II.> I '.I. c ICEN'I'E:R> c/800'I'> CfHTML> .. . 1 _ ' ! . • >c/PRE>'.'opc:' HREl'. l': ehe $url ..Ov .$url >~o-cJA> $url • 'fecha.. {$mea+l) I 1 El resultado de ejecutarlo pasándole como fecha el "301912002" se visualiza en la siguiente imagen: . • 'fllehaa3. CLASS.hr~ ~l)lIt M .·. 'techa.....php?dia=$dia'l U 1$_. '..'$\lrl'>a~o.'..1. '>Día julieno n· ce.. '<8R>c cl\. Q ~~.phP?dill=$dia'~lIa~$m~a.·.._ "ln!o"Sllnio'-leIl'" {S:r!ell-ll J echo 'cA CLASS. $ur1 .. ..O.r-ed. ·"onie ....anio..'fllchos3..-ml funciones de fed1il! y Heril! .$mea.mes.SS.</A> >'...·c/B>c¡p>caR>\n·' Surl . ".l). i$anic-j¡ • eche 'cPRE>\nc <A CLASS-'opC' KREF. fe«"..1 • Sud .> ·'anioa$.. .l. ' ) < .' fSaniC)o.·opc' KRET.-". " " .Saniolll . . . "".2!i8 PHI>!i A TRAVru> DE EJEMPLOS el RA ·MA echo -c/TR>c/TABLE>cBR>\n'l Sfecha. U ($lOIel . 1 ..'Surl·>mea-c/A> [ '1 IIC'IO 'cA CJ.") Vamos a ver pormenorizadamente cada una de las acciones que realiza el código.. . 'f. Lo primero que hacemos es recuperar la información enviada desde el ..html' nueva fechllc//\.O.SS.... 'cA CLASS..php?'>hoyc/A~ I "...... (Sanio.ni~mllll··.

n10 •• 2000. $di". el usuario puede optar por no completar todos los datos referenles a la fecha con la que quiere trabajar... todas las funciones que generan una marca de tiempo de tipo UNIX fallanan: if (Icheckdate($mes. aunque la fe<:ha est~ correctamente formada. $hoY"\letdat.C RA-MA CAPfTuL08: FUNCIONES DE FECHA Y llORA 259 cliente para procesarla Del código del primer fichero HTML podemos observar que hemos elegido por utilizar el método GET: "'-FORH MEtHOo-"GET" ACTION~" fech.. se mOSlrana la siguiente pantalla de error: . Antes de pasar a vaJidar la fecha. San10l J l$anlo<1~71) ( echo '<HR><P CLASSz'error'>ERROR..' 1 : $h. un array que contiene la información de la fecha actual del sistema. I Una vez que la fecha ha sido recuperada y completada. lif($enio<~99) $ ..¡l. pll. Hay que tener en cuenta que...ll8J.. se comprueba que el año proporcionado no sea inferior a 1970. Smes y Sanio. </P>". La tacha introducida no vál1d . respectivamente). d I esnpty (LGE'r'{ 'dia' J ) ?$_OET r 'tU. si el año es anlerior a 1970 (año de comienzo de la em UNIX). .H:> I Como se ha comenlado anteriormenle... se le complementa hasta cualro sumándole 2000. se vaJida a través de la funci6n checkdate ( ). </FOR.$hoyl 'l'IIon + 1 : $anio%Jempty(S_GET[ 'anio' J)1~_GET['anio'l !$ho ['ve. haciendo uso de la funci6n getdate ( ).oy [ ':roday' I1 SmeB-lernptY(LGET( '!I'lel' J) ?LG!T[ 'mes' J . se hace una última comprobaci6n con el año mandado por el usuario: si éste se compone de dos dígitos solamenle. si el usuario no proporciona cualquiera de los datos solicitados (día.. é$ echo '<BR>< <A HREPz·techaal .". Además. De este modo. r' 1 ¡ En la variable $hoy obtenemos. mes y ano que se almacenan en las variables $dia. en cuyo caso se asumirá que desea utilizar los va10res de la fecha actua1 del sistema.ht~l'>volver</A> ella { 1I trat4miento de fecha correcta >~HR>·¡ En caso de proporcionar una fecha errónea. los obtendremos de la fecha actua1 del sistema. $dia.

mos el dio d~ la S~ del pri~r día d. ..O... pasamos :1 generar el calendario del mes que contiene dicha fecha.Saniol 1I dla~datel·t·. Si la comprobación ha validado la fecha.$~8.-.- es¡. • . Este valor se pasa a su vez como argumento a la función date () indicándole en la llamada..n.. s6lo que esta vez solicitamos a través de la opción de fonnato "t" una infonnación diferente: ! J llúll\t'YO d . que lo que deseamos obtener es el día de la semana. 1I obt. funttlon actualiza_dia_9emana($diaj I return !$dla>OI1$dla·). llamamos a la función actualiza_dia_semana (). $ult¡~Q dias del _s l. . • --.-• . ~... utilizamos también la misma combinación de funciones date() y mktime( 1 que anterionnentc. que ~ encarga de actualizarlo con nuestras preferencias.6¡ ) CJ Número de días del mes (almacenado en lu variable $ultimo_dia): para ello. Como dicho valor no coincide con la e!r.• 2bO PHI' 5 A TRAVts DE EJEMPLOS C RA·MA . El valor devuelto varia col:re O para el domingo y 6 para el sábado.. utilizamos las funciones date () y mktime (). Con esta última obtenemos la marca de tiempo del primer día del mes de la fecha dada..l ~. a través de la opción de fonnnto ··w"...O....lTUClura de semana que deseamos utilizar (el lunes como primer día de la semana)..mkti~. . ~ . ". Lo primero que haccmo~ es recuperar algunos datos esenciales para poder generar correctamente el calendario.O. o Día de la semana del primer día del mes (almacenado en la variable $primer_dia): para eUo.

un HES echo '<TABLE " BOHDER~'O' CELLPADDING~'l' CELLSPACINGo 'O' wrDTH~'SO\'~\nO. $ultt.'.de. no acabe en domingo. d{as da la ~SS.'cabec.l. . ·</TR~\n<TR~·.na•• 'J{ . o. ..· San10< T~><TP~\n'... la tabla que representa el calenMrIt> d.crlbir le cabecera que indica 10.ebo ·('Ta~\D<~~·' idla _ _ na. "Marzo'. . "Enero'.di .emana echo' <'rO COI.di •• ('TD~·1 ~e_dias++1 Scontador iff. Hay que tener en cuenla que en la primera y última de estas fila. Paro ello vamos a ulilizar una labia en la que la primera fila corresponde a una columna que contiene el nombre del me) y el año consignados en la fecha: ti . tiene una primera posición vacía pam hacer coincidjr el número de mes proporcionado por el usuario con su posición denlro del array. I .. podemos generar el calendario del mes deseado..SPAN:· Sprimllr_dia'>&.o_41a)I acho "(TD~'coDte40r. SlI!IIIana" '.arre. $malile.eman. Una primera .. ti hueco.acritura d.. if($primer_dia~O) r". SiH' echo '<TD~Sdia. y el aao del calen~rio echo '<TR CLASS. del cual se obtiene el nombre del mes solicitado en castellano.S .(. A punir de aqur se completan las diferentes filas con cada una de las semanas que componen el mes. proximación a dicho código sería el siguiente bucle: 11 eacr1bi'r lo._txtt~I. ... 'Olciembre') J Las siguientes filas están compuesLaS de siete columnas cada una: una por día. pues de las funciones proporcionadas por PHP sólo podemos obtener información textual en inglés. txt.~nas $di. 'Fe~e:ro'. pueslo que es habitual que un mes no comience en lunes. $1<7. .'>·1 ~na echo 'cTR echo Lor ISi-O. Cabe destacar que el array $meses_txt.y(··. 4e la primera .nbsp¡ <'TO>'._txtISi)</~·. . 'Noviembre".coDtador_~_di.pr IlIIer_die . ~.ra·~·: *Che '<TC COLSPAN~'7'>·../ re8to de .CAPmJL08: FUNCIO~ES DE Fl!e1IA Y llORA 261 Una vez obtenidos estos valores.s se pueden producir columnas vacías. el código que genera el calendario debe considerar si se produce esta circunstancia. Por esto. ••crlbtr la cabecera que iDCluye el . Q bien. dÍIIII do·l $contador_d~41~a..".. La primera de estas filas contiene una ctiqucla por cada uno de los días de la semana: 1I e. wbil.

262 PIII' ~ A TRI. En el bucle while posterior. 6) I echo ' .~ivo(. La primera sentencia i f soluciona la generación de espacios en blanco que se producen cuando el mes a generar no comienza por lunes (día O).ador_de_dias). hace uso de la variable $di~semana que.a_dia) ( 1ftfe. .. como es lógico.dias</1'D>'.dor _ de_d i OIl<J'!'D> ' • SC~:'lt4.¡..6l( . if(f•• ti~(.tado:r_d•. se comprueba si éste es festivo (hacemos uso de la función es_festivo (). Para ello.... para ello. en principio. respeclivamente). indica el día de la semana que estamos generando (siempre contiene valores entre O y 6). comenzando.~r _de_dias.cho • cl •••• 'f•• ~i~'·' ecllo ·"SC. la clase "festivo". recorremos todos los días que pertenecen al mes dado (dentro de este bucle se incrementa la variable $cont.J echo • cl•••• '~ado··.4!.4i. whilel$cont6dor_de_diaa <lO $ulti..)Jl. ·'. antes de escribir la celda correspondiente a un día. Una segunda revisión del código nos debería permitir diferenciar enlre los días festivos.a .&na» echo' cl.n.'T'D:> • if('con~. en todo momento. La variable $contador_de_dias Lleva la cuenta de los días del mes seleccionado.di. En principio.e~na"'$pri~r_4i._dias <.. se genera una fila por cada semana contenida en el mes. que devuelve true en caso de que el día pasado como parámetro sea sábado o domingo (valores 5 y 6."'n4~$primer_di6.a. en cuyo caso se le modifica su aspecto haciendo que pertenezca a una clase diferenciada. OlJ'a mejora consiste en marcar de una forma diferenciada el día concreto para el que el usuario solicitó el calendario. que escribía los días de cada semana de la siguiente forma: $4i6~. vt.s DE EJEMPLOS eRA·MA Vamos a desglosar los diferentes elemento!) de esta porción de código. 'IR> \n<TR>' J ScU •.ana» . Gracias a la sentencia i f que contiene. .ho '. ._ • . sábados y domingos. generando una celda de la labia por cada uno de los días. -. .na"'O.: whUe ($contador_d._.+ ¡ if($di'-II~_. por el primer día: el l. $eontador_de_dlas··¡ a<.. . Para ello.nta. podemos completar el código anterior modificando el bucle while. del reslo de días laborables de la semana.oor_d. $ul tilDO_dia! I echo ". I Así.k:".. no hace falta ningún tratamiento específico para los posibles huecos que se generan al final del mes. 'f•• tiYO··' • ._4ia ••• .ho • <TO»O I cfl$dia. sólo tenemos que completar el código anterior de la siguiente manera: ldia_. a .

Una funcionalidad más que tiene el script es aquélla por la que el usuario pueda pulsar y seleccionar cualquiera de los días que le mueslnl el calendario.. while($contador_de_dial c. el código calcula la fecha juliana (los días del año se numeran desde el 1 . la celda del día solicitado por el usuario tiene un aspecto diferenciado que se debe al estilo particular al que pertenece: "marcado"...1 de enero...·eolor:red.. if{$dla_. U I Se-mte&:.tlvo". ··"I_t-10··. tivo($di ..• C RA-MA CAPtruLO 8: FUNCJONES DE I'ECI'A Y llORA 263 echo "c/TR>\ncTR>'1 $(1 ia_lIe11'1oU1l1.l echo • class" '_rclldo' • : if(f .d1 .. del que..+. el juego de enlaces que aparecen al final de la página generada se obtienen del siguiente modo: para obtener un acceso al año anterior y posterior.. De este modo.-O..r _"-_41"11 ~~$di.IIo='fe. podremos obtener el día juliano correspondiente. _bao . echo • >tk"'lt ddor _de_dilu!lc¡ A></1'O>' . posterionnente.$me. _. +¡ Como valor añadido al calendario.O.Sanio))¡ echo "CP BTYL~. El código que realiza estas operaciones y muestr'd el resultado por pantalla es el siguiente: St&cha_o... echo S fecha [ 'y$y' 1"1.emana... Sultimo_dia){ echo " <'rO".. simplemente se generan dos enlaces cuyas rererencias hacen una llamada al script pasándole el día y el mes de la fecha con que se está trabajando y el valor del nuevo afta deseado (sumando o restando 1 al año actual según corresponda).~~·6J I echo '</TR>\n<TR>'¡ $(U... El código quedaría del siguiente modo: $dia_.0 I ) el•• ) 'di4~.. '>D1.tdatelmktimelO. $cont.O. .Qmena~$prim.._a_n..al 364 Ó 365 -3 1 de djciembredependiendo de si el año es bisiesto o no) del día seleccionado por el usuario. Para obtener la recha juliana. "</B>'c 11'><BR>' : Finalmente. Es necesario sumar I al valor almacenado en el arra)' porque el campo yday guarda valores entre el O y 364._•• ~na . . .$dia.pIIIp'41_~_4e_41 . 'r~1. . juliano n" cB>'.. se realizan los siguientes cálcu los: obtenemos la recha del día seleccionado y la guardarnos en un arra)' asociativo. ) elae Sdi.r_dia.ocA .doJ"_de... se convierte cada unti de las celdas correspondientes a un dfa en un hiperenlace que llama al mismo script pasándole como argumento la nueva fecha seleccionada.. Para ello._~JI ecno' Clll.

'$u.·.pc' .·op HREP·'~v~l':>anot«A:>:>' Pam obtener un enlace al mes anterior al aeroal.~olor. ." ·.~e9. body (tont: l2px Verdana¡) tabla (~ont.1) • '''--1 . 'fe<:halll. la generación del URL de llamada al scripf se complica.A CLASS." ' •• nio.c/A> ..·$~"anio.• "meo .~ el siguiente: Ilmot.~nio·$eni~8.php?di4~Sdia·.f~nl weJght:b)ld:) a It.111 lIRU.. pttp?dJ.• eaana 'backqr~d-color:'FYY8AO..ra (backqround-~olor:'B08080Icolor:t~ F8P8¡!ont .$dia'¡ it ($meu". obtendrá el calendario de la fecha aClUal del sistema: ~ho '''A CLASS 'op<:' HREl" .gray¡font-weightlboldl p •• rror llont :14px: color: red: lont.csbec. U' ) el"e Su.l) Su. en cuyo caso deberíamos saltar a enero (mes J) del año siguiente. 1f ($me8•• 121 $ur1 .~rclldo lback9round-~olor:qT~n:) a.MTM).5Al'RAV!lsDBEJE. simplemente hay que llamar al seripl sin pasarle ningún parámetro.OS ORA-MA $ur1 • ·f~hall. posterio~ Surl • ·fecha. El código que solventa esta situación e. (Sanio-1) .l.-.. $ur1':>4IIo-0I/A:> • Surl • 'fecb.:~QlQr)or~nqe. '.anio. l2px Verdana. se mucslru el siguiente listado obtenido al solicitar la fecha "30/9/2002": . La situación contraria ocurre en el caso de querer obtener el mes posterior y encontrarnos en diciembre (mes 12). pero del año anterior al actualmente visualizado.':O". .rl ..-wei9ht :bo14¡ ) ..J 1I. ($4nio.~.Sdia"-"les.color:o~snge¡text-a1jgn:riGbtJ) tr. echo '.cA CLASS_'opc' HREF ..s.'$url'>".\otPI.'B081 BO..A..264 1>JIP.eOOOOO:l lI.felltivo lcolor. el mes anterior será diciembre (mes 12)..php?·~hoy<IA~ 1 • Para aclarar la estructura de la página HTML generada por el seript.php?d~~HSdia&oe. si actualmente estamos en enero (mes 1). l.ope lcolor. Para obtener el calendario del día actual.xt-deeorlltion:non. De esta forma.-5. IIEAO:> 0II1ty1 .·.u¡io"· ($-to+l) ~ho .:A CLASS"'opc' HREy.php?dia.. ($mes·l). puesto que hay que tener en cuenta que. 1' J el •• Sur1 . • .S. anterior $url • "fechall.rl':>mes-c/A> 1 " 1/ me.d _" '&.$anio.S_~.1$.. echo -cp!tE:>c ." -'anio.) tr ....1qnt:bold.. ($&DJo-l).· echo "<A C!.

php?dia.g&anl0._g&sniQz2002'>6</A></~ <TO><A <TD><A HReF~'fecha81..php?diat9~8.2002'>25</A></TO> <TO><A HREFa'fechasl.php?dia-l1&me•• 9&anio_l002'>2?</A><'TD> <TD><A HREF~'fechasl.php?die.l)~ •• 9'anio.php?dia214~es.g'anio~2002'>20</A><JTD> <70><A HHEF='feehasl.php?dia~11~eag9&anio_2002'>11</A></~ HREP.php?dia.TR> <TD><A Hl\EP.4&me$~9&snio*2002'>4<fA></TO> <TD><A HReF-'fechasl.9&anio.php?dieg16&me •• 9&anio.php?dla=21&mes_g&anio_200l' cla98~'feativo'>21<fA></TO> <TD><A HREP.'fechasl.php?dia.pQp?dia.php?dja212"e8. KA.2002'>12</A></~ HREF.'fecha81.E BORDER"'O' CELLPAOOlOO.php?diaa6~..2002' class-'festivo'>14</A></TO> HREF2'fechasl.l002· class··festivo'>15</A>~/TD> </71\> <Tlb <Ta><A HREH~'fechaal.php?dl~=22'mes·9&anio.php?diae21kmae29&anioc2002'>2)</A></TO> <70><A HREF~'fechasl.l002'>26<fA~"'/TD> <TD><A HREFa'fechael.2002· C148s~'festivo'>29</A></TO> .nio_2002'>10<1A><.9~anio.·2' CELLSPAClNQ_'O' WIO'l'H .2002·>16<IA><JTD> (TD><A HREF#'fechssl.9'~nio.2002·>5</A></TP> <~<A HREF$'fecha81.l002' cla88~'festivo'>7</A></TD> HREP.['R> <TO><A HREF-'fechaal.26&mea.24&mee.pbp?dia_29~ •• g&anlo.2002' class_'festivo'>8</A><!TD> </'l'R> <TR> <70><A <TD><A <TO><A <TO><A <TO><A <TO><A <TO><A RREF~'feehasl.9~.php'dia~25'ma8.php?dia~10~es.php?dia~2&me9.</TD><70>&nbap.18&me.nio_20Dl'>1?</A></TD> <TQ><A HRRF~'fechael.a9&anio.php?die~IS~8. ·~Ot:·> <TR CLASS~'cabece~a'> <TO COLSPAN~'7'>Septiemb~e 2002</TD> </TR> <TR CLASS2 'semana '> <TD>L</TO><TD>M<JTD><TD>X</TD><TO>J~/tD><TD>V<J~<TO>S<JTD><TD>D</TD> <JTR> <TI\> cTO>&nbsp.·fecha81.7&~e.l&me •• 9&anioa200~' cla8s~'fa8tivo'>1</A><JTO> <JTR> <'.php?dja.2002'>11~/A></~ HREF:·fecha81.php?dia~28&me8..2002'~9</A><fTD> BR€P~'fechasl. <JTP><TD>&nbsPI </TO> <TD>&nbsp. MA CAPITuLO 8: FUNCIONES DE FECIM y llORA 265 </styltl> <IHXAD> <BOOY> <CDn'ER> <H3>Funeiones de Fec~ y Hota</H» <TA.9~anio*2002·>19</A></TO> <TO><A HREF:'f~chasl.9&4nio.<JTD><TO>&nbep¡</TO> <TD><A HREFz'tachaal.9&An10.g&4nio.php?dis_3&me'_9&snio*2002 · >J</A></TD> <TD><A HREF~'fechs81.~9~anio22002·>18</A></TD> <TO><A HREF='fechaal.2002' elass m'festivo'>28</A></TD> <TQ><A HREF~'fechasl.php?dla=a~ •• 9&an10.8t.php?dia.9&anlo~2002'>2</A><ITD> <TD><A HREF='fechasl._ .l002'>24</A></TD> <TD><A HREF~'fechasl.9&anio.php?dia.TO> KREF.2002' class a 'festivo'>22<JA></TD> </1'R> ".php7diSa~O&mee.'feehasl.·fechasl.ph~?d1s25&ma •• 9&snio.·fecha81.php?d1a_11&mes_9&.</TD><TD>&nbsp.19&mes.

.. <A CLASS.nio_aOOJ.·opc' HRSPa'fecha81.:>.~8...al.OR..red..'opc' HREP.JO&anl~2002~ ••7'>me.c/A:> > <!:Itt:>< CA t:i..php?">hoy<IA> I <A CLASS.·JO •• nio. " fecha!!l.9'>me •• ~/A> <A CLASS.JOkmes_8'.:> .2002.'opc· HREP.'feeh•• l. htlll1 ':>nueva t~a< I A> » </PRD</CENTER:> </BOOVI> </HTMt.l.alO~ •• 9kanio. ha e'A> eA CLASS.'f~chaal"php?di.9~anlo.a002' cla••• ' . <''lIt:> </TABL!::> ep BTYLE.no.....p: «TI):><TD:>knbap¡< "I'D:><~IIPJ< TD .'opc' HREP~'feeh. rcado':»O<IA></~ <TD:>knbep:</TD:><~knbap.'color.'opc' HRSF_'fech•• l. :>oLa juliano n.266 PIII" A TRAVts DE EJEMPLOS CI RA-MA .20 ) ' . e/A .php1dioc)O~..A::i::i=" ope" HttU.php?di.php?dia.<8>27)</8:>e '><SR> <PRE> e <A CLASS. .<ITO:><TD:>~Pte/~ <TD:>~nbe..php?dia.. <In:> cTO><A KREPc fecha.

..ietf. Todos los recursos proporcionados por un servidor web (documentos HTML. Por ello. su uso principal está relacionado con los sitios Web. gráficos. a través del uso de (ennularlos.1 EL PROTOCOLO HTTP Aunque sabemos que PHP puede funcionar desde la línea de comandos. COOKIES y SESIONES En este capítulo vamos a ver cómo PHP procesa o gestiona la infamación que el cliente (el navegador) envía. 9.orWñcJrfc2616. ~ste es un sencillo protocolo cliente-servidor que articula los intercambios de ¡nrorrnación eorre los clientes los servidores web a truvés de operaciones simples de tipo solicitud/respuesta. a1 servidor y cómo éste genera una respuesta adecuada a la petición solicitada.txt. Estos servidores fundamentan su funcionamiento en el uso del protocolo HITP. para entender el funcionamiento de las técnicas que se proponen en este capítulo. La especificación completa del protocolo HTfP/ l.I está recogida en el RFC 2616. I . ) están asociados a un URL o Localizador U"ifonne de Recursos. disponible en la dirección hno:/Jwww. ficheros de sonido . de hecho. videos.CAPÍTULO 9 FORMULARIOS. se hace necesario un conocimiento previo del protocolo HTTP1. del Protocolo de Trallsferellcia de Hipertextos . PHP puede ser definido como un servicio complementario a los proporcionados por los servidores Web. Básicamenre controla el modo en el que los clientes web solicitan recursos de los servidores web y el modo en que éstos les envfan dichos recursos de vuelta.

el comando HTTP.nt".1 Comandos HTTP La pri mera línea de un mensaje de petición. sin embargo. Las peticiones siempre cuentan con cabecem y.5I\TRAV~OEEJEMPLOS CRA-MA 9_1_1 Estructura de los mensajes HTTP Las peticiones y respuestas se envían como mensajes de texto que se componen de dos partes.. en algunas ocasiones. una cabecera y un cuerpo (ambos elementos se separan en el men. con cuerpo.268 l'IIP.aje mediante una lfnea en blanco). uno para realizar peticiones y otro pam responderlas. Sólo existen dos tipos de mensajes.1. las respuestas en la mayoría de las ocasiones cuentan con ambos componentes.. la URL del recurso del servidor al que deseamos acceder y la versión del HITP utililada. proporciona el comando HTrP utilizado (nannalmente se denomina méto(/o). La siguiente tabla muestra los métodos H1TP disponibles: . tiene la siguiente estructura: Es decir. Cabeceras de la petlCl6n petición Linea en blanco (separador) InfomladOO adldonal Resultado de la peboÓfl Cabeceras de la respuesta respuesta Linea en blanco (~) Infonnaa6n adicional 9. 1. La estructura de estos mensajes se puede resumir en la siguiente tabla: Tipo de mensaje Comando HTIP Compone.

Po". las cabeceras de respuesta proporcionan información rererente al sojf'rvare del servidor y a la naturaleza de la información inc luida en el cuerpo de la respuesta.S V SU. NOTA: En '. etc.2 Cabeceras de petición y respuesta Las cabeceras de petición proporcionan información sobre el cliente Web utilizado. IO~ES 269 mftodo atiliud6a Obtención de l"eCI. nonnaltnente un navegador.Q()$ O.1." 9.. Algunos de los métodos restantes están en desuso o tienen una utilización experimental. Hellld del serviclot EnvCo de Infomlael6n al servidor Obtenci6n de infol'lT\aClOn sobre un recurso especifico del servidor AcluabzaclOn de un recurso en al nrvidor ELimlfl8cl6n de un recurso en el nrvidor Obtención de información de diagn6&tlco sobre la comunlatdÓn estabLecida con al servidor Reservado para la comunicación a través de un prol(y Obtención de Información sobre IlIIs opciones de comunlcacl6n de un recurso Creadón de un enlace entre recursos Eliminación de un enlace entre IlIWfI. La siguiente tabla muestra las cabeceras más habituales: . El formato general de una cabecera es el o. Por su parle.CAPtruuJ 9: FORMULARJOS... COOKII:. los tipos de contenidos que es capaz de aceptar. ".OS '"' 00I1ete Trace Connect Options Link Unlink A pesar de contar con todos los métodos enumerados en la tablo anterior.MCCIÓI'1 de formularios veremos a fondo el funcloosmletllo de loa mModos .1.iguiente: Existen cabeceras comunes a peticiones y resultados y cabecems específicas. además de ser los más estándares. post y head. los más utilizados son get. la longitud de los contenidos.

270 PIIP S A TRA ~ DE PJEMPI.<~ HOllt If-Hatch If-"odifled-Sinee It-Nona-Match U-Ranga rf-unrnodl ti«1Sinee Hax-Forwara ProxyAuthorlzaUon Ranga Referar User-Ioo¡¡ent cabecera utillZltc1a para soIicltude. perbdo . Cabectras de petición ubf!ccra Meept Meept-Cha. concIicIor'llllell Cabecera utilizada para soIidtude.OS ORA-\tA Cabeceras comunes ubectrll Content-Type Conten. oondiclor'lllles Limite de salios para el metodo TRACE Inrormaci6n de autentrficaclón Intnle a un aervidor proxy Rango de bytes solicitados URL del recurso desde el que M ha realizado la petición InfOJmllCi6n sobre el navegado!' del qua n..atlon Expect .t-lAngth Content-Encodin9 Tranllter-Encoding utilización TipO MIME de" ir'Ifom1adón contenida en el mensaje TlIIT'IoItIo en bytes de la Infom\ad6n contenida en el men .".. condlclonale.net Accept-Bncoding ~ccept-Languaga Utilización Usta de"POS MIME aceptados por el cliente Usta de tueoos de caracteres aceptIIdos por el diente Tipos ele codIficación sopcrtados por el cliente lista dlllengU8jes aceptaGoa por el cliente Información ele eutenbcaci6n Estado eipefado Dirección de OOffllKl electrónico del utuano Nombre y puerto del /IOst $OScilado ~uthori:. Cabecera utilizada para solicitude.~ Formato de codificación de Iot dalos enviados en el _oaje TIpo da codlflcac:ión empleada en el CU8fPO del menNje Fecha y horIi local de La opel'llci6n Incluyendo zona hol'llria Opciones de comportamiento dél protocolo http Directlllas da control de caché Información del estado de la coneKlón después de un enlll0 InfonnaclOn de pasarelas y aefVldoru proKy Infoonaci6n adicional sobre el estado de un mensaje o"'" Pra911\a Cache-Control Connection Via Wamin.oon ... condicional" Cabecera utilizada para aollcitudes condlclonales Cabecera utilizada para soIiCllude. ..

oo. Mensajes de reduecci6n Mensajes 81OC18dos a 8fTOfeS de cliente Men"" aaociadOI a ermres de servidor . Eltisten cinco categorías de mensajes de estado.1. cod ificadas en función del primer dfgito del código.. sc:c:eder Permite redirigir solicitudes Informac16n del tipo '1 versión de .3 Resultado de la petición Ante cada petición...1 que n Intenl. Expires r.oat-Hodified Lo<:ation Server Proxy-Authenticate Retry-After Server Fecha local de ültlma modiflcKl6n del ao. El fonnato de esta primera Unea del mensaje es la siguienle: Es decir.ociada al alltema de ca~ InformaCión &Obre el ac:ceao a un recur80 protegido o de acceso restringido Va" WWW-Authentieate 9.CRA-MA CAPtruLO 9: fORMULARIOS.~ . éstas son: utegoria utiliz.adón . de estar d!5pOnlble "". COOKléS y SESIONES 271 Cabecero de rnpttata cabc«ra Allow Ac:c::ept-Ranges UIiliud6D Comandos opdonaJes que tambiitn obtener el tecut"lO le pueden IpIicw paI'II indica el rango de bytes mane. el servidor H1TP genera un mensaje de respuesta en el que inserta una primera línea denominada [(nt'o de esrado en la que se infonna sobre el resultado de la operación. por el MNidor Estitnac:i6n de Mg~ que n-n peNdo deade el instante en que se genefÓ 111 reapyeata Fecha en la que el f8CUrao d.= 2= .= . un código numérico de tres cifras que indica el estado de la solicitud y un texto que contiene una breve descripción del código de estado devuelto..eto Direcd6n delrecurao..1. la versión empleada del protocolo HTfP.~ Mensajes Informativos Mensajes asociados a operacionel finalizadas de forma 00ITect.ervldor HTTP UUllzado Información de autentificación frente a servidores prolCy Instante en el Que el recurso solicitado estaré disponible Informac\6n sobre al software utilizado en el nfVldor Información .

2 Funciones PHP relacionadas PHP proporciona las siguientes funciones para obtener la inrormación contenida en las cabecer-J$ HTTP: apache_request_headers () (denominada getallheaders () en versiones anteriores a la 4.!> </HUD> .:m PIlP S A TRAVÉS DE EJEt. ha creado un nueva recLnO que no .:scripci6n 200 OK comentario Operación realizada COI'T8Ctamenle Operacl6n realizada correct...entos soI"lCItados por el dl8flte El servidor no se encuentra disponible Noc IlrIPl_nted Servlce UMII"il"ble SOl 9. fundones s6Io eslén disponibles cuando . El recurso al que se ptetendla acceder I'IIIldo movido a otra ubicación de forma pennanenta El recurso al que se pretendla acceder ha sido movido de forma temporal a otra ubicación Petici6n no &ntendida por el .HEM» rH~ <80DY> <TITLE>Cabec~r4a HTTP</tITt..1PLQS La siguiente tabla muestra algunos de los mensajes más habituales: mensaje d.t 401 <al Urnluthorll:ed Forbidden Not Found Internal Servar Error .. ted Aecepted No Content OperaCión realizada COITeCtamente. ha generado ntngún contenido de inter'. ademe.. Ambas funciones devuelven un orr{IY asociativo que contiene todas las cabeceras HTTP de la petición/respuesta de la operación actual. .mente. eata ejecutando PHP como módulo ele Apeche. El siguiente ejemplo nos muestra cómo recupernr las cabeceras de petición: . ademh .04 SOO >al Se ha prodUCIdO un error Intemo óeI servidor El servidor no llene IFTlpiemelltado alguno <MI le» requeom.1..3. encuenlra disponlbte 201 202 204 Cr. NOTA: Ea.ervidor la petición requlen! de una autenbficaclOn Esla prohibido el acceso al recurso solicitado El recurso aoUcilaclo no se encuentra en el servidor 301 302 400 Kav"" Permanently MOVed 't'empoul'ily Bad Requa. no ..0) para los mensajes de petición y apache_response_headers (1 para los mensajes de respuesla.. ha creado "'" nuevo fecurao que se encuentrll disporubte 0per8CI6n realizada comK:tamente.

petlclones- PHP también nos proporciona funciones pam la gestión de las cabeceras. de carácter booleano. t_header. y headers_sent (). .. 8cont./TR>". éMas son: header (). reemplazar I .tlJ II$cabecera~getallheader.. C/CiN'I'RR> </SOOY" El resultado se visualiza en la siguiente página: . debe añadir una nueva cabecera del mismo .'ES 273 <C!NTP:R> ~2>Cabeceras HTT~/Hl> <H2~- peticiones ·«H2> • Pphp $cabecera:apache_requ. COmaES V SF. Su sintaxis es la sig uiente: header (cadena [. echo "<TABI.'l' WIDTI:I....E I'IOROI!'lt. por el contrario.nidoJ . - .'v-11ow'. http. nos pcnnite indicar si la cabecera debe reemplazar a una cabecera similar previamente fijada o. para enviar cabecera::.o.> <1H'tm-~ echo '<TR><TD>$campo</TO><TO>$contani~</TO></TR>"¡ echo "</TABLE>". foreach($cabecera •• $campo . para confirmar que las cabeceras han sido enviadas correctamente. DGCOLOR.'1 . http_reponse_code)]) headers_sent ( ) El primer parámetro opcional de la función header ( ). f1)RM ULARlOS.o RAMA cAPfrotO 9..'80'·~<TJI.S IOr.. echo ·<TD>C~</TO><TD>Contenido</'I'D>.

U 5 ti E J J F '1' k Y (1 w g O n 1/ Z b R Y P Z X y (1 1 h V t 7 N 3 V W G M O 8 I g !. A Y N U o '1 U . g . r L .A 2 B . pS5p%CIroY01101 • el ! R (. H K b 6 R • 1 1 Y O b S o P H B X . • 8 lO • 9 k M .. Y e R S 7 O K ! z y V Z • R G t 6 q L k I Y T 111 • 9 " O e k ti }j H :& lo • k J l!I " H J JI V 9 • 5 H S O • t T S e k Q 7 JI A '1' E u N d l' 4 Ir. fuerza el código de respuesta que debe enviarse al procesar la solicitud.. o J k 11 .1 W X P JI J S e Z S f W K l' U Q r eo El resuilado se muestra en la siguiente imagen: El siguiente ejemplo nos permite indicar al navegador que el cOnlenido de la información que se le envía es de tipo XML: . lo e Y :. '1' C q x 11 J 11 S Z oS o v y S o P b F ..ACU"YIL9. O D . 'l Y • lo ti N :x B L ~..t o r O e k z n q S e t ti. 7 i IJ e A a x o o 1 Ito 1 j v o N y V O b 1 W JI J A o. E • U 7 9 k . X A A H a q lIIl 2 S • F .¡ haaoarl'Cont~nt~Type= i-aga/gif').274 PIIP S A TRAVt:'. E i A 8 E N J P N e R. GIPBIJII_W t i o U N N a n H X :J j h S ? 1 t A N O E ti! 5 W J Lo y " .. i g o i n II 11 E (ji • 5 9 H 1 o T J M 1 9 v Z A q Z J z W p • 11: z F J '" ~ W lO V x a 11 t K :1 • N O 1 e p v o It Ir..J A S Y D G N U 1 h D O M lIIl V 1t X I Ir: j T O v 6 V Z v x 9 1 n f K n Q L n ) p V t lit O " !'I A e N q B o.)' f o o e ¡r h g O 3 1\ g e i K W e x B r S 11 U o o S 111 6 i O p o 2 h r 1 o B 1. j' 1 q Y k p o o y G T r 9 i .:J a 111 y 111 !J 1 lo P O z Z2/QABOJCkABBucrwguEmORS$lztfhjrwBOlqOy S 4 1 Q h I B V q 1 e 11 f z + 5 k JI "1 .. v Ir...1 e " . 1 " Y <t Z A F 1 Z 1 Q o G " H u o B A B • M 1\ N r b 8 J q !" O g r x G . S 9 V G . Il lo a e ti 1 1 .. R (. haa~r('Contant~Tran8ter-Encodin9' besa64'/.XEOf4ZY8DkC40h01HD. a 1 111 H 'l e p :4 Y Y 1\ 8 8 h q ~ J m g 2 G k O q k 8 e y e Cl \ff r d N e r P b t k 8 O b .. El siguiente ejemplo nos muestra cómo utilizar la función header () para indicarle al navegador que la infonnación que se le envía tiene que interprewla como un formato gráfico: .. e . g .. • • g G 1 " J 9 A 1 Y M " 6 ..( 1pl. '1 5 S 6 e H L V r o p. un valor entero. El segundo panimetro opcional. 1 h S I ' 1 1 R G 1 . n b h r . f 8 j L D t t :w..... " G 1 ~ f 111 P k o I ) g JO x o o A • !I . ti. h I f h E ? 2 z B N W N + v v 1'1 :1 H 7 1 4 o T b S x y a a l .. • O U 11 d a frie Q d 5 1 X N e b XliiI 11 H 1\ b 1.J W 8 le .RCkU..1 O q :11: Q 11 W Y 1. JI: n a % .. do ti 1 ti. DIe n 1 JI. J 8 11 C S W !( 10 Y 5 6 5 .. 8 e Z n V 8 • w O B N b 9 o Jt 1:1 t J A !> • e r lRJwBkKO). . 6 O 5 1 K T G 11...W'Iro..s DE EJEMPLOS ORA-MA tipo (el valor por defecto es true)." b h Y V C G j l' 3 e E 1 Y 1.. e 3 3 4 f P h A H l" t.DOlrvM'2:500RvO~ . A JI 1 11.. c !..

</ftombr.G<Jnoe.stado~ <nota>9.ign..>TeJedor Cerbel<I..cion> <oo"oat&l>2800s<lco"oatal> <I •• to. El siguiente ejemplo muestra su funcionamienlo: .ignalura> <•• tedo>aprcbaaa</ealado> <nota>9 .tura> <•• t4do>. ~tricul.~~onal ._. atad~coa> <a.0> "pu.osill.</puert~ qoroyincia>Badrtd<l..direeeion tipoz·ealla·>M.~org.lle~>Her. De esta fonna podemos redireccionar las peticiones enviadas a nuestro servidor.> </u\l8ll\lI> Uno de los usos más habituales de la función header 1) consiste en enviar la cabecera ux:ation al navegador.~ailla</direeclOft> <Dua>!t<Inua> <p180>?</p1..~x0500</matricula~ Ga~llido.a>9</n-=> qoiao>?</piao> <pQert~.rGYinoia> <. <alwano> <naabr. > .e11i.lgnatuca>Siatamaa oparativoa</a.o M oMA CAPtruL09: r-oRMULARIOS. o</nota> </datoa ao.~~ajedor Carbel</a~llidos~ ~to.d~oo. .an~e.iraooloR> <n.ader(OContent-type.> </datol_4cadamicos> <1.atricu1&> <n~r..o. COOKIES y SESIONES 275 "?php h.<I.er..> applieation/x-lO¡.-.1UMO> El resultado se visualiza en la siguiente imagen: <alDmo> ~trl~xOSOO<t.> <~re~oion ti •• ·~e.ato.on~ea> <deloa_acad~ooa> <eaignatur&>!iatemae Operstlvoa</a.er.aL11 ••• > <.probada</.0_1aoion>Kadrid<I •• ~.rta>A</p~arta> <proyincia~Madr1d</provine1a> <poblaeion>Kadrid</poblacioD> <codpoltal>28005</eodpoatal> </dat08-Personalas> <dato• .>JorQe</n~re> <.

1 A TRAVru.ra-ma . de todos los ejemplos anteriores la función header () debe aparecer antes de que se genere cualquier tipo de contenido en el documento.•s"). Si en el ejemplo anterior hubiéramos insenado un espacio en blanco delante de la primera etiqueta de php tal y como muestra el ~iguiente código: <1php header("Loeation: http://www. tal y como muestra la imagen siguiente.'YWw. " El resullado de ejecutar el script cargará en el navegador la página de la editoriaJ Ra-Ma.es·)¡ El resullado de ejecutar el scrip. hubiera sido el siguiente: . J>E EJEMPLOS CRA-MA dphp hudert "Loe¿¡otionl http:/.216 PHP.ra-ma. Como se puede observar. puesto que va a definir un componente de las cabeceras H1TP del mensaje.

de modo que la llamada n la función header (J se ejecuta fuera de la cabecera del mensaje.1..-~.... C_todd ." 1a<. Descripclón Nombre del script PHP que te eatj. Es decir....CAPh1.NAME SERVER __ SOP'IWARE SERVl\R..·""~I. La inscrción del espacio en blanco marcn el inicio del cuerpo del mensaje. !rL . ejecutando At1lIy con 101 parámetros ~sacto.. 9. ~·""a&rt~_~( . que es" utilizando el Nombre y versión del protocolo utllll8do por el Ml'Vldor ~ Método utilizado por 1_ IOllci:tud acceder_\oI ~Cadena de pelici6n Oirectorio I1Ilz del documento ......'!.cE SERVEIl. pandos como argumentol al GATEWAY_INTeRF'.3 Vañables PHP relacionadas Las variables PHP directamente relacionadas con la información manejada por el protocolo HITP son LSERVER. . ..'.. $_POST Y $_REQUEST...... l ... _".. ...a siguiente Inbla nos muestra los conlenidos de esta variable: campo PHP_SELF .."""~.. EstaS lrtS últimas serán vistas en profundidad en el npan... ..ado dedicado a formularios..¡1I e PN.. enlrt airas.f ~ 1orUm>o. _.."".JLO 9: FORMULARIOS."pt orgc Número de parámetro.. como argumentos al "..6.fa... ~ ... se genera un mensaje de error en el que se informa al cli ente de que no se ha podido añadi r información a las cabeceras puesto que éstas ya han sido enviada... . $_GET. r: ...?RQTOCOL REQUES'rJtImfOD QUI!:R'CSTMHIG """" Eapecificecl6n del CGI que Ullllu el lelVidor Nombre det equipo servidor -"""" IclenllfieaCl6n del so/rw..(lue<.. .. el que se ej8JCUta el DOCUH""-"""" ...'""""'IrJ l}.. loda la información dI. .. COOK/~ y SESIONES 277 • W. La variable global $_SERVER es un array asociativo que conliene... <~ .. caheceras I:mln de pelici6n como de rC<...

...AO> cCENrER> cK2>Cabeceree ~P<!H2> cH2>..6glne de la que se procede Conlenido& de la eabecenl UMNJQfJnl Dirección IP dell..}.AU'IlLE'W Variable ubhzada para reahz8r autenllfic8ci6n de PHP ....O> <TITLE>Cabeceraa KTTP</TITLE> </HF...r 218 PIIP'ATRAV~DUfJEMPI.UTtLUSER Vanable utilizada para realilar aUlanllflC8C1oo de usU8ños con HTTP Almacena el nombre de uau. PHP-.. Sólo funciona cuando PHP se e}ecula como módulo de Apache...CCEPT IfM'PJoCCEPT_CHARSET Jlaeripdóa Contenidos de le eabecefa acc.Atrl1L..langtJlIgfJ Contenidos de la cabec• • connecbon Contenidos de 'a cabecera ho$/ HTTP_ENCODING IfI'TP.ceflll la clave del UIUllrio...A1macenaeltlpode autentifiCélClOn SOlo funciona cuando PHP le como módulo de Apache.no Sólo funciona cuando PHP se efecutlI como módulo de Apaoho Vanable utilizada para reallZal' autenbflcaci6n ele usUitlio$ con HTTP Alm.SIGNATURE PATH_TRANSLATED SCRIPTJW'(E REQUEST_URI a¡stema de ficheros Camn:I de acceso al sctipt actual URt utiüzada patlI aecadw al rec:urlO PHPj.NT REHOTEJ.[lDR OfrecciÓfl de l.l5uario Pueflo utilizado por la maquh'MI del Camino de acceso el scripl que REHOTE_PORT SCRIPT_FI~ENAME uluano la 81t6 ejecutando SERVER.S_!lKR1In ~<'IQ> c?phl> .pt Contendo& de la e&becet'8 accept-chlH'SfJt Contenidos de la cabecera sccept·encochng Contenidos de le cabecera accepf. p.TYPE usuarios con HTTP.PORT Valor de la directIVa SERVERflMIN de Apache Puerto utilizado por el equlpo"rvIdor Cadena que Idenllfica al servidor Camino de acceso al scripl teniendo en cuenlJl al SVlVER..OS ORA·MA nmpo HTTPJ..CCEPT_LANGUAGE KTTP_OONNECTION H'M'P_HOST H'M'P_REFtRER H'M'P_USVV\QF.ADHIN SERVER. ejecu" El siguiente ejemplo muestra la utilizaclón de la vari:lble $_SERVER pam recuperar información sobre las cabeceras HTTP: <HTML> <HFJ>.

·~llaw''''·..SOP'nl </'I'D:>o</TR... /TD:>o</TR>· I Khe ·<T'R><TD. TD>-SEJlVD. Un uso habitual de las cabeceras HTTP en conjunción con los campos PHP_AU'I'H_USER y PHP_AUTICPW de la variable $_SERVER nos pennite realizar una autentificación básica de usuarios para el acceso a recursos restringidos.<TD"'HTTP_~IONcfTD>·1 echo.. J echo '<TR>cTD"'HTTP_U~GBMT</TO""1 ItCno • <TI»$_St.·./80DY> <!K'!1on.>'..$ERVBR.' I 8GCOt. 111.IIT!PJIC)ST</TD>·/ !ICho '<TD>$_SZRVBR IH'ITPJfOSTl </TD></TR>'. -. • .l(VIUt IH·'·I'J../TD""¡ echo ·<TD>$.. COOKJES y SESIONES 279 echo • <TABLI.. TD>-SJmVlDLl'ORT</TI)..JIAKE</"t'f»..POIlTl c/TD>c/TR>' J .ITO>o· I ac:bo ·<1"O:>-$.. El siguiente ejemplo muestra su funcionamiento: ....:ho.90fPI'W~</~·.. Khe !ICho echo echo echo echo echo ' . .Jo' I • . Khe '<Tll> .. '<TD:>o$JERVBlt l. c/CKNTER> .. '<TD>$_SERVER[HTTP_CONN$CTrON1</~</TR>'1 echo ·<TR>cTD>SER~srGNATURE....'l"tb-SBRVDLPROTOCOLo<.' I '<T!t> . echo ·<TD>$..'_US~) </'tD></TR>' I echo '<TR.«TD:>oSERVER..5ERVD [S2RVBJL... '<TR><TDl>RBtlUKSTJOl'l'HODc/TIbo'1 ItCho '<TO>LSKRVlUl [RE<IU&S'lJlE11lQOl </TD>-< ITIt> . 'n»$_SEltVERI$EIWE:lLI'OoBEJ </~"/TR>' I ·<T'R..PRO'l'OL] .CRA-MA CArfn¡L09: r-QRMULARIOS... ~ c1'O:>C~ ITO:><1'O:>oContanido< I TD:>-c/11I.> El resultado se muestra en la siguiente imagen: Cabeceras HTTP • S_SERVER...Olt..$ERVBR[~SIGNATUR21c/TO"'c/TR""J echo 'cITARLE>'. TR.· '.$ERVD {Sf2WBJL.. 8ORDEfl~' • lfltl'nls 80" tELLPAOOrg.¡...

aer 11 este recurSQ.xit¡ ·~admninlatrlldor</A><8R><HR>'j echo • < CIiN'f'ER>'. .. .o eonc~do..OS CRA·MA <?¡)hp i ! I !is. hll4derl 'H'M'P/1....dmnini8tredor</A~<BR><HR>·' 0000 ·<t':HN'I'Dt~ .AtMIN') ~ho .t.\ HR!F-'llllulto:' ..ue en contacto cen el '¡ echo '<.toKl'): e~h.<BP""" r echo '4UI:>PónQ." echo '<A 1111.. .do •. .-MmI_!JSERIII headerl 'WWW-A~thentie...At.. '. : echo '<dIR>h neceBllrLo contar cen lIutorhadÓII . • <CDn'1!lb<H2~Acce.. < .e/Io no.. lal y como mueSlra la siguiente imagen: r. ' accaso' ) I 1 . -- o Si los dalaS proporcionados son los esperados... ·~.)(~.SERV1l:R[pttP.: echo 'para IIcceder 11 e:ate recu~. • /K2~< Cl!N'!'ER>· El resultado de ejecutar el scrip' hace que se abra una caja de diálogo en la que se solicila que se introduzca un nombre de usuario y una clave.lP'" .o concedido •... echo '<CENTER><H2>Acee8o restringido . la respuesta sería la siguiente: .•• </H2>' I echo '<HR>Ea necesario contar eoo autorización '1 eCh.41~·WebPHP·' 1.0_'_111.$_SERVDtISERVElLAOKINj echo" . rb.O 401 Unauthor1. (SERVER. h"i r ( header('WWW-Authenticate: Basie: real~2·WebPHP· ') I helldaT( 'HTTP/1.o 280 I'IIPSATRAVe50EEJEMPt. exit JI Acc • ..0:'.. $_SBRVEJI.. se accedería al recurso solicitado: en cualquier otro caso..) '~ra acc. .e r.. ( {LSI!!RVER[ PHP...UTH.:J oo1 Car>tr.O 401 unaUthOrited'j... PW] ! .rnCUSER} 1"" libroPHP' 1 ¡ I ($_SERVER [PHP J..t¡gl.<BR>': ~ho '<BR>póngllse en contacto con el '1 ) ..I _ 1 tonIIMIIII "'*iIadot 1-•• "'WobfI. • «:Dn"E:R><H2>Acceeo restrJ.. aas1. tl$.

radiobotones o radiobulto"s..".1 El elemento FORM Todos los controles presentes en un formu lario. por tanto.. etc. Como el lector conocerá. U '~'M.) y rótulos (labels) asociados a estos controles. cspecifica entre otros: o El programa que manejará los datos del formu Jano una vez haya SIdo completado y enviado (atribUlO a c ti on)... seleccionundo objetos de un menú .. ele. además.SIONES lSl .). a un servidor de correo.. La etiqucta FORM actúa. deben aparecer inclu idos dentro de un elemenlO form de HTML. corno contenedor de controles." ".r-r Acceso restringido. Los usuarios nonnrumenle completa" un formulario modificundo sus controles (introduciendo tex.). antes de enviar el formulario a un agente para que lo procese (por ejemplo. un formulario HTML es una sección de un documento que contiene texto normal. etc. El programa receptor debe ser capaz de interpretar las parejas nombre/vaJor para poder hacer uso de ellas. COOKJES y Sl:.to. 9. . 9."" 11> ". Pero. para que sean efectivos.Cl RA-MA CAPfTuL09: FORMULARIOS. etiqueta._" 1 "". menús desplegables. a un servidor Web. a La forma en la que se enviarán Jos datos del usuario al servidor (atributo method).. " ." HTML y elementos especiales llamados controles (casiJIas de verificación o checkboxes.2 FORMULARIOS EN HTML Esta primera sección pretende ser un resumen de los conceptos más imponamcs asociados a la definición de formu larios en HTML.2.

9.ortlform· da tll . caracter •• JIS010646] eompIeto . Este atributo puede tener dos valores: o get: El conjunto de datos del formulario se agrega (con el carácter "?" como separador) al URI especificado en el atributo action (el programa que tratará los datos) y este nuevo UR I se envía al agente procesador. El valor por defecto de este atributo es application/x-wwwform-urlencoded. En general (excepto en el caso del elemento textarea). que son ambos cadenas de caracteres."lWltip. el valor actual del control puede ser modificado a través de la interacción con el usuario y/o mediante scripls que se ejecuten en el cliente. o post: Los datos del formulario se incluyen en el cuerpo del mensaje que se envía al agente procesador.5 A TRA vEs DE EJEMPLOS ORA-MA o El tipo MIME usado para enviar los dalaS del fonnulario (atribulo enctype).2. a partir de ese momento. Los agentes de usuario pueden avisar al usuario del valor de este atributo y/o reshingir al usuario la posibilidad de introducir caracteres no reconocidos. El conjunto de datos del formulario que se envía al agente servidor es una secuencia de parejas nombre_de_control / valor construida a pan:ir de los elementos del formulario. De igual forma. Sólo el metodo po$' (con enctype. como un valor accual. NOTA. el valor actual de cada control se iguala a su valor inicial. o Juegos de caracteres que acepta el servidor para poder manejar este formulario (atributo accePt-charset). cuando se reinicialil.282 PlIP. se le asigna el vaJor nulo.: El melado get restringe loa valOJes del conjunto de datos del formulario • carecteres ASCII.) cubRI el COI'IJUnlo d. el valor inicial de un control puede especificarse con el atributo value del elemento de control. Cada uno de los controles tiene asociado un nombre que viene dado por su atributo name. Si el elemento de control no tiene un valor inicial. El vaJor actual del control se iguala en un primer momento al valor inicial y. El valor inicial de un control no cambia.2 Envío de fonnularios al servidor El atributo method del elemento form especifica el método HTIP usado para enviar los datos del formulario al agente procesador. Así. cada control tiene tanto un valor in icial.8 el fonnulano.

rTlIy IfM'P_POST_VARS de vefSIOnM IIOlenontIlla" 2 O _POST de PHP (aun disponible pero obsoleto)_ Array que contiene las variables pasadas e través del método Gf./Tlly IrM'P _GET_VARS de versiones snteriores • l. SU uso es análogo .. Las tres variables principales para realizar esta operación son: V. formando pane del cuerpo del mensaje. la.1 Formularlos en PHP 4.1 . Si el servicio asociado con el procesamiento de un formulario causa efectos secundarios (por ejemplo..ClRA·MA cAPtnJLO 9.. trlI . a través de sus respectivos nombres.. cuando no tiene efectos secundarios). Muchas búsquedas en bases de datos no tienen efeclos secundarios visibles y constituyen aplicaciones ideales del método get. si el formulario modifi ca una base de datos o la suscripción a un servicio). después. se produce el emparejamiento de sus controles. haciendo uso del método get. Corno hemos visto.2. óel mélodo POST. Estas parejas variable-valor configuran el conjunto de datos del formulario que se envían al agente servidor.83 El método get debería usarse cuando el fonnulario es idempOlente (es decir. el navegador) para. poder trabajar con ellos. FORMULARIOS. hemos escrilO un documento HTM L que contiene un formulario que hace uso de dicho método: .3. COOKIES y SESIONES 2. 9. Para ello. variabln pasadas.3 FORMULARIOS EN PHP Cuando se envfa un formulario para su procesamiento. PHP. 42 O de PHP (aun disponible pero obsoleto) Amly que contiene las variables paladas a través da cualquier mecanismo de entrlld. es capaz de recuperar el conjunto de datos del formulario que han sido enviados desde el cliente (esto es. unas veces la información se enviará fonnando parte de la cadena de consu lra (query string) que configum la solicitud y."I'.rlable Contenido Array que contier. con los valores actuales que tienen. Su uso es "lago al . debería usarse el método pos t. otras veces. dependiendo del m6todo HTTP usado (get o post). a trav6s de un conjunto de variables globales. _GET _REQUEST 9.X y versiones superiores El siguiente ejemplo mueslra el paso de información y su posterior procesamiento.

<INPUT . 'RAOIO · NAME . ')'.."LEFT'>H4rc8:</TO> <TO ALIGN ."Ul....'RESET'> P'Ol!M> < I CDi1'ER:.• CI RA·MA 284 I'IIP5ATRAVIlsOEEJEMPLOS <>m<L> <HEAD> <TITLB>Yor.·<1i ••• l· >Dll1l1el <ITO> </'I'R> </TABLB><HR><BR> <.8·~S·> <c/TR> <TR' <TO ALIGN.do:</TO> <To...l>U''I' TYPE-'TEXT' NAKE... <. 'RIGHT' COLSPAN .. • KIUH'r' l. <INPUT 1YPE~'TBXT' NAM2 . INPUT TYl?E . IZE."· 3'.. /TO> <TR ALIGN./1'R> <'ffl'" ~'TEXT' NAMEs'cc' $lZ'~'5'~/~ <TD <TC ALIGN~·L8FT·>C~.. /TD.'L!FT'."5''''' i'li» ·~iliftdr. <INPUT TYPE"'TEXT" .tible:</TD> ALIGN~'RIQHT' COLSPAN.<fTITLE> oC/KEAD> <IIODY> <C"""" <Hl>Por-ulario8: cTABLB> ~~odo GETc/H2><KR> php'" <PORK METHOn..otor" . NAME~'moaelo' STr... ·cQl!\bu.. ·~rc&· 8IZE_25"> .'SUBMIT'> <INPUT TYPE.U!.')'> <INPUT TYPEc'RAorO' NAME"'cQMbultible' VALUE_'gasollna' CHECKEO>O•• olina .ulario.19 <TO ALIGN~·L8FT·>Modelo: ..tible' VA1...!lPAN.. /TO> <TC AJ..lt>N . </KTML> <INPUT TYPB.rio...'r. cTD>MOtor:</TD> <rD><n.'GET' <1'R> ACTION~·to~1..so:n'" . .

Formularios: método GET M. aoJ" • • 11 . Motor Combasbblc Cilindrada.·. ~ ~ .""..901·1J '~volverc/A><!P~~'J <fCDn'&R> </BOOY> c/lttKL> . ~ ..> '"<800Y" <TlTLE~rormul.. HREF.<Jt¡Mulu_S_SERVER[ QUDY-oSTRING": echo '<H2~'oraulaTioal método Smetodo</H2 . (l Ouolllla (" Dluel El scrip' encargado de procesar dicha información (valor del atributo action del rannulario) es el siguien te: <Imn.otorl • : edu: • IS3i!'T{eel ee . ""'......stib1el . ·. .'_S!:RVER[ 'REQUEST_HE'nK)O ' 1 : $c.ava~rlpt:history. ·.". ' lluokIlIl ""/O'IlO1J1 l' •.1 .C RA-MA CAPITuLO 9: FORMULARIOS. COOKIES y SESIOr-. echo '<!"Oulry Str ing</I~: Sca~consu lta cHa .J.. ...d.'ES 28S El fomlUlorio se visualiza en la siguiente imagen: 1 ".r~Olc/Tt7LE' </HEAD" <C'ENTEIl" C?ptlp $metodo. . loreach (S_GlT as $cla ve _> $valor) echo ' cl>$clave</t> • 'valor <!IR> " : echo "<HR>$_OETlmareaJ $~G!TI~ol $~[. BR"""fflbo": echo "<PaI>cA ".. S_C!T!C<:III\bu..

....go(_11 '>volver</A></PRB>": . echo "<KR>8_POST[marea) '¡ echo "$_POS'l'tlllQ(!elol "¡ echo 'S_POST{lIOtor] ': echo' ($_POSTrccl ce -$_POSTrco~tiblel ) <RR><HR>'f echo "<PR8><A HRBY_'java8cript:hiatory..: .. sí que muestra diferencias notables: It1'HL> <HEAD> <TITLE>Pormulario8</T1TLE> </HRAO> <80DY> <CENTER> <1php $metodo"'LSERVER ( 'REQUEST jlR'l'HOD' 1 ¡ $cad_conaulta_S-SERVER{'QOERY_STRINQ'): echo "<H2>ForMulario....Ir _ . ' $valor) echo "<l'$clave<'l~ • lveLoe <8R>".. En el caso de haber utilizado el método post para el envío de los datos.. _. sin embargo.·fOlD _.lllarlos: metodo GET l' • _ . foreaeh ($~ST a. "'" " ..s DE EJEMPLOS CRA-MA En la siguiente imagen podemos observar cómo aparecen en el URL tanto los nombres de los controles.etodo SMetodo</H2>".. echo "<¡'Ouery Strift9</l>: $eadLeonaulta <HR>'.286 PHP S A nA vt. como sus valores actuales: For... la única diferencia a nivel del fonnulario HTML se refleja en la siguiente línea: <{YORK> El código del script. $clave ..

. ....:/CEm'ElV <r80OY.'¡ "...tOlSo_' SUWll [ ' lUQu&8TJOCftOD' 1 . 'vaza "cho ~ho to~lar i Q.· ce '¡ ~ho "-'. _ QRT $cad_~ r -ulta-S.. ~1'Jntl(."--------------------------------------------O RA·~A CAPÍTULO 9: FORM ULARI OS.. eeho Svara_fClnlUlario[ '!IOter' J.. el scripl para procesarlo sea el mismo.ER\lER[ 'QUER\'.•_P08T' 'valor' ·cH2>F<:¡:~".V6 «-2500 CC''''''''cJ>'o .~IlIt>".. lNtI"ra • fOllD --- _.) . .ultibl..t04o •• ·~·). MOlÜ¡. c:C¡¡I\TER> <1p hp ".-- -. ' /'. 'vars_fOnllUlariol'_rca. </HTML~ El resultado es an áJogo al del ejemplo anterior.ry String~.. El primero consiste en hacer uso de una variable intermedia que recoja los contenidos.. tal y como muestra el siguiente código: <H'M • <HE1ID~ ...0$1 '<I>OU.fvars_fonnularlo('conb\..<jI) $IIIetodoc:IHl> o ..vara_for~lario[·cc·¡. independientemente del método utilizado en el rormulario.. ~:aa><KR>'J . $eadLconBulta <KR>"j &8 toreach ($v4rB_formu14r~~ $clBve t) echo "cI>$clave</I> • $valor ~BR>"l ecJ¡. . • t .·C . . con la direrencia de que en este caso la cadena de consuha (query atring) está vacía: Formularios: mttodo POST ..I>' mét.rio8</TlTLS> </MEAO.' J.. <BOD\'. eeho ." .($.TITLS>~r~ul. Ex isten dos formas para que.!.' J. COOMES y Sl cS IO"'-ES 287 .eh) Svara_foraulario('nodelo"¡..ila¡.

9. . además de poder acceder a las variables pasadas en el fonnulario a través de los arrays HTTP_GET_VARS (equivalente al actual _GET) y HTTP_POST_vARs(ídemcon_posT). ' <In:..II.todoslos valores asociados a los controles de un fonnu lario estaban accesibles a través de variables globales.hi.re.ve</l> . por cuesuones ele OCII'!lIIIbbIt~ aUn .3.. .~UIiST • • $e 18"'8 _> $valo r J 8ebe:> '<I>$ela.ulta <KR>' .pt PHP.$valoX" <SR>'."· En ambos casos el resultado es el mismo al obtenido en los ejemplos anteriores.2 Formularios en versiones anteriores a PHP 4.0. 111 d. E.."NTER> <'lph¡) $m. echo '1. .!tOUEST(·comb\aatible·l~lcNl>-<HR>·. echo '<Hl>Fe~ularioB' método $metodo<!Kl>'.288 PIIP 51\. NOTA.\!' . TRAVts DE fJEMPLOS CI RA-MA echo '<PRE><A HREP_ javaucript:hiatory vol 11 ICDlTe:Jb >'olv~r (A>< PRE>'¡ " La otra posibilidad consiste en hacer uso de ID variable _REQUEST.. Ac:tua!mente por coes~ de segundad.. que contiene la infonnación enviada desde el cliente al servidor independientemente del método utilizado: <H'M11.PRE><A HaSF.ry String</I>: $ead_con. es decir..rectiYa reqililter_glo~ls (opci6n CjL18 aparec¡a actrvada por dafecto).che -.cho '<I>Qu.')a~ript..l utlllZIICIÓn.2 En versiones ameriores a PHP 4. ya que éste generaba un conjunlo de variables globales cuyos nombres coincidían con los dados a los controles del fonnulnrio a través de sus atributos name correspondienles. efH'nl. todo_$_SERVSR[ ' REQUEST-METHOO' JI $eadLconaulta c $_SERVERt'QUtRV_STRlNG'1. peRMe lI. "la d. *Cho --:Iff'>$_RBQUEST{·lI. <TLTLE>ForMulari08<JTITLE> _/1IEAl» <80DY)Io C:C1:.tory.qo( 11 '>VOlvare/A>e'FaE>'.redfv1¡ aparece dnNl~ SI bien. fo~oh ( .~ caracterlsbca estaba dispolllble el ac1lvar en el ftehero de configuraci6n. las variables de un fonnulario pasaban a estar autom1hicamenle dispon ibles en el ~'cr. < C'!NTB:lI.> c/fII\DY.2.. !tEOUBST('ce'] ce ~$JI. . (php _lni).'1 LRl:QUES'tr'lIIOdelo'] '~!'QUL~I'lIOtor·J '.

~ho "c»RE>o<A HRa. Posteriormente. i . formulario_ ($metodo-..- <'. Sea<1.O 9 FOR.3... Esta caracterlstica también se pUI.:P'O!QI He'U·' ':). <: 11fl"I!C.VMS['QUf!:Ry_S'MtING· 1.. se puede hacer un uso avanzado de estas variables: en el rormulario HTML podemos agrupar variables relacionadas en rorma de array. COOKIES" SE...3 Formularios avanzados Además de la traslación directa de las variables de un rormulario en variables de PHP.t>Formulariolll: f(létO<.~ cMEAl» <1'ITLDPonlUlariOli"'lTITLE> <.'iIOr>.go 1. desde PHP podemos acceder a estos mismos arrays y. • jBvB.phP":¡.t).·...2..~ ..crlpt.' echo ·~H.'GE1'") l$H'I"J'P _GET_VAR$.d_con8ultR <HR>".. $KTTP _ POST _VARal .ES 289 El siguiente ejemplo nos muC)lra el uso combinado de estas variables de lipo global utilizadas en versiones anteriores a PHP 4.lor <SR>'..cho 'cI>Query String<{I>: $~lI.-'rO ALl(¡N "LEFT">M.ORA-Mil CAPh'ui. 1) . recorrerlos para obtener sus claves y respectivos vaJores. :1'AB~E . El siguiente ejemplo nos muestra dicha utilización: <H'l'ML> <HUI)) <TITLE~Pormularlo8o</TITLE> . ':H~ ·F'I~1.' <TD ALIGN~-~IGHT" ~LSPAN~"l':¡' .).'Cupemr los valores de un campo select de lipo múltIple...'de usar para n.1:o $metodo</li..0..: 11l1'.. var ahl •• eo. h1atory . como laIes.jelo:</T!).\ofULARlOS.. fOl-each ($varIJ_tormulario aa $c1ave _> $vlllor) echo '<J>$cl"ve</l> • $v.' onaulta~ $HTTP_$ERVER. ~todo·SHTTP_SERVER_VARSI'~JU!ST~HOO'1 . $v"ra..plejlla< H2><HF. c/KEAD:> <(:EtNTER.. con un resultado idéntico al de los ejemplos ánteriores: </9ODY> <HTML. echo 'cHl'I>$¡urcR $mode1o $l\IOtor t$ec: oc -Scombuatible· J <8R>cHR~" .AO> <!!lOOY - <:cmnl1. <"R> .. c/CDn'ER> </800'1> 9...'o1 • [ol"lDulal i04l2 . >vo1vercllv< I PRE>" ."P\S1'" AC':"IO.110.

cHR><8R" <INPUT TYPE$'SU8MlT' ..l.rro> e 'TR" <TR> <TD ALIGNz'LEPT'>Opcionea¡</TD> <TO "LIGH<... TRI+..·L~·"Co~.'RIGH'1'~ eoLSPAN.. . ."LI!:FT"" c7D"Motor¡e!TD> «'fD>eINWr TYPE.. """. . ~io CDc/OPTIOlb cOPTION c/SELECT:> ."S·>c!TO> </TR" <TR ....d0C/OPTtON" COPTIOH VALUE.)· CHEcKED. vEs DE EJEMPLOS o RI+. l· V~"die.1:·25'> </Te> TYpg.·g~. </CENTRR:. <INPUT e/FORM."1re Aeondlc10n..tible¡</ TO> <TO ALlcm..290 PIIP ~ 1+. se defi nen dos variables de tipo arruy (uno de ellos de ti po asociativo)... .l_[I· .te.olina" ' utU..\LlGlil.. c1:mvr TYn."CO" ..~..'rR.' LEF'l" "Harca ¡ e/m> <"rO . .-opc.. c'I1I ALIQ... Ol •• el ".cióne/Opt."JUU)I O' .'I'lIGHT' COt.1.MI+.·GOGbelo VALUE. «-*orl· SI%E-"S'''</TD> <TO>cil1n4reda. .. COPTION VALUEt"SN""Si. "RIGH '1" eoLSPAN.bl.tI..dorc/OPTION CQPTION VALUE. ... ·eoo.olina <INPf1l' TYPEoo-'AADIO' .bra.. .·COCJbeloc.'T!XT" ."AA" .'3" .."TEXT" _ _ • . IOG)· SI?R.J' 812..'CA·"Cl~ti2.e/~ c~<rNPUT .~3'" <~ 1mL'I'J'" ..'J"> <INPUT T'Y'PE-"T!XT" .a de e/TI» </T]b Nav. ·ooabe(M . </H'l'ML. <TO "L IGN."TBrr' ~· ___ ~lo)· SIZÑS'" e/TR> .l· . VALUE..ON </T"SLK. TYPE='RESET'~ </DOOY:. eINP\rl' T'lPE...SPAll.C.... Como podemos observar en el fo mlulario...... El formulario anterior se visualizaría del siguiente modo: . eTR ALIQN.

" ~..']I'cc'Jlcc -'.'HL> .. . " .» $valor) echo echo echo echo echo 'Sval. SR»"¡ echo '"HR>".or • ¡ '<HR»ILPOS'l'!'coche') ('marca')l ILPOST('coch" I ['modalo' 1) ".. echo ·<HR> . . utilizamos el ~iguicnte código: ':H7'Hf > <HUD ... " " .CAPiTULO 9: FORMULARIOS.. ". /lr.'... '1 '-:t: Formularios: variables complejas ~~~-- Para recuperar la información suministrada por el cliente.< 'TITLE> <. !»Opcion~$ • </~»'¡ ~foreach rS_posT('opelones'] as Solave .iIo"'HR>' J '<PRE»<A HREf.S y SESIOm:.s 291 . tQre~ch '¡LPOST['coche') ¡'motor']} ({S_POS'l'('coch..MEA!» <8OIJY MmU' "I"php echo "<H2>~ormularios<fK2~"1 ecbCI o<HR>". . _foreacb ($_POST('C:oche'1 as Se lave . ~T1't'lZ>"'>r1llU1..:-10.'java~eript:hi$tory.» $valorl echo '<I»$clave«I» • Svalor <SR>'. '( $_POS'l' [ 'cocha '] [ 'combuatible' J I ~ >"'SR.Ool-l) iIovol~r . ($_POST as $clave e» Svalorl echo "<I»$elave</!» ~ $valor . • '''. ¡A></rR~'1 7' <ICDlTER> <tOOOY> .. COOKIl'.

...lo~1 . • $valor <BR>"¡ .::c' 1 cc -$coche('combustibla' I -)"BR><Hk>": et"ho -"PRE><I\ HREP .-..cho "$va tor • ¡ echO '<HR>Scoche('fMrce'] $eoche{'mQdelo'J $co.-.----- ~·CDC". e8 $cltwe . . ...2.V6~ _-----:--~--- .> ¡ El resultado.. 1 o Formularios _ _ Vt ----~ .....-. FORDc.. UO-.~- "" a .... ' javBecript 1hiatory . $valor <BR>'.. _ ..-......) ..2\12 l'IIPSA'TRAVt:'sDEEJE MPLOS El código del ejemplo anlerior para una versión de PHP anterior a la 4.· oC/BODY> oC/H'nI!.$clBve</I. echo "'HR>". .ho "<H:i>Pol1lnJlerios" /112..> $valorl echo ""I... se visualiza en la siguienle Imagen: .. ""HR"'": .::ha('motor'] ($co. echo ·<HR><I>Opciones ~ </1>"' ~for •• th ($opcionea a$ $elav• • > $v..r. ~rrLB~POrmul. toreach ($HTTP_POST_VARS .BOOY> CCmrf:R~ ~ ?php ....0 sería el siguiente: ·HTML> <HiALl .ve .foreach ($c~h.. 110* _ !~':i.. ~ $v...8 $cl....lor) echo ""¡"'Sel... ~ . h..::hel'. equivalente en ambos casos..Q:o (-1) ')ovol ver"} "''''<fPRE>" 1> <ICDl'I'f:R.....\1 ____ 'o • _ l ____ .ve<!I..rl08~'TIT~ e HEAD> ..

<Tb <INPUT TYPE~'TEXT' $12a_25 ' ..._tIaoI'·J ?>. <1'0 ALIGN~'LEFT ' >Marca:</T~ <1'0 ALIGNc'RIGHT' COLSPAN~'l'> <TNP'UT TYPE-'TBXT' NAtm_·cocb ...> <TABLB> . El sigu iente ejemplo muestra el uso de dicho modo de trabajo: .alina' ~r.'TI> ..')'> <INPUT TYPl.:cfTO> <TD ALIGN~'RIGHT' COL~PAN. COOKIES' SESIONES 293 Una práctica muy habitual en PHP es agrupar en un solo fic hero tanto el rormulario que se le presenta al cliente.D>Ga.'coche[Coabultible]' V~·die.[~elol' . Aunque el runcionamiento interno es direrente. .'TI» ...'RADIO· NAKB. . .·coche¡notor)' 81%8 'S'><III <Tb>cl1indrada:<'~ ~ <TO><INPUT </~R> TYPE_'~8X~' NAME.ollna <INPUT TYPB~'RADIO ' NAME.act'Ja. .C RA-MA cAPfTuLO 9: FORMULARIOS.·POST· .'cochefccl" SIZE 'S'></TD> . .-. I· .T"-' <1'0 <1'0 ALIGN~·LEFT·>Hodelol<'TO> ALIGN~·RIGHT· COLSPAH~·)·> NAME-·coch. • TR> . .<!'pbp eobo ."""'> 'MEA!» ~ITLe>FonDUlario5</TI~LB> C/ HEAD> <800'1> <IIIC!NTBR> <K2>Formulario y Respuesta</R2> <?php Jf(ILPOST~{ ?> <FOIUI KETliOO..l' VALUE"ga. _... t_rcal' SI2&-25'> <(TO> < / TR> <1'R ALIGN~'LeFT'> <TO>Hotor:< 'TO> <TD><rNPOT TYPEc'T!XT' NAKE.el . como su trutamiemo.1'R> <~O ALIGN~'L8FT'>Combustibl... el resultado que observa el usuario es idéntico.el·>Ole.·c~lcombuatlbl.

. PO • [opcion..J'QS1' 'eQ h.. El resultado de la ejecuci6n de este script 'ie mue~tra en la siguiente imagen: .·CA':>{"li.) 'cKR>IS.. el flujo de control evolucionará.cnO '<1:>$clavec/l> • $valor <~ll_" echO 'cKR..PO'nI'coche • J ('!Mrca')l S.! el formulario HTML al clientc.eOP1't<.IPU ~·opciOn . :) (IN> letbo OPTl c I'SELBC"I • "TD. ..roltM c?php ) .' ~t Ille' }-j<BR. P .BOOY> </IITML> eeb be I ce I 'ce .) IftQdelo') • $~' be') eQ "~l" "PO • c.che 'cKP f reae ~ ($.. t "")pelones.t~ ae ~Yegeci6ac ~pt~OH> c/Tll c/TABJ ><¡ffi. para tralar la parte del código que muestr.tu foteaen (S_POST as $c14v~ _> $valor) .<HR>". ~OP'lI('IN VAWE.11 'iPE: RESBT' c..el ' . tu • $vo. e¡I>': .dio CD</'li'TlOO...• • 194 I'IIP5ATRAVÍiSI)EUJEMPLOS e RA-MA <'"") l\LIGN.T(' cocne'} Ila $elllV8 -> $valorl echo 'c-"$clllvec/l> • 5v41ot cBR>". En caso contrario.)l" eQ aa ~.el" pt hlstory 'Ole • 1($ POST 11 >volv.>c fU " c/l"'!N'r~> Como podemos observar.rcU.': fore 'h 15 1i'C. . lo primero que se encuentra el intérprele de PHP es una sentencia i f quc evalúa si el formulario ha sido enviado (preguntando por el contenido de la variable global encargada de alm:lcenar la informaci6n transferida). cOP'llUCi VALUE_'C'D·>llo. ZLECT Ht: .aP'i">Opcionaal<'TO' .othadorcl . . pu A . se evaluará la alternativa contraria en la que 'ie procesan los datos enviados en el fonnularlo. VAL~·~·>Si.IlU" Java. BR <INM' 'n'P "StffiMtT" NAME""enviaóo"> cIN..UE-· AA' >Aire AconcUeio v... este modo de ITabajo consiste básicamente en dividir el código en dos secciones: cuando el usuario solicita 1:1 página en cuesli6n...eTD ALIGN-' GHT' _ '5PJ>. En ca~o de que el fonnulario no haya sido enviado..N VAI.N-'P:> .

. conexiones. Efectivamente... Por tanto. _. o Almacenar la información en el servidor.- ..4 COOKIES EN PHP Como comentamos anteriormente.. El problema principal que presenta esta posible solución es que los dutos tendn1n vigencia. Para llevar a cabo dich'l facilidad.."i 2'15 -r:. además. Esta solución nos permite que. y~. cuando necesitamos que algún dalo o información de relevancia (preferencias del usuario. • -r :=.. es necesano implementar un mecanismo que nos permita almacenar y acceder a dicha infommción. si el usuario deja de navegar.. es una sol ución válida cuando el númcro de posibles usuarios de nuestra aplicación Web no vaya a ser alIO.ele~s.. siga la secuencia de p:iginas prevista en la aplicación.. si enviamo. por parte del ~rvidor.. número de accesos. es un protocolo sta...s esta información en campos ocultos de un fonnulario (elementos input de tipo hidden). recursos visilados .".. podremos manejarlos entre las diferentes páginas de nuestra aplicación y arrasrrar esa ¡n[aonación de una página a otra. por tanto. existirán. _.ga de una manera ordenada. . sus datos los tendremos disponibles. tenemos varias soluciones posibles: o Hacer uso de elementos de formulario ocultos. =-000 • _ ..:_". ) esté di<¡ponible entre diferente. COOKIES y SLSJONI'. cuando retome el uso de nuestra aplicación Web. mientras el cli ente esté navegando y.5 ORA·MA CArf'ruLo 9._.. fORMULARIOS..-- • 9. 10 tw. esto es. El único problema de esta solución está en el hecho de que un númcro muy grande de usuarios supone. la reserva de gran camidad de recursos de almacenamiento .. el protocolo HTIP está definido de forma que nunca se almacena información acerca de las conexiones y desconexiones que haya habido entre diente y servidor.._.-. - r_.. .

d. los directorios en que se almacenan y resto de características propias de una operación de leclura/escritura sobre disco dependen en gran manera del sistema operalivo y del navegador que tenga instruado el equipo cliente.nsmrtld.. puesto que el servidor no puede asegurar que los datos almacenados (supuestamente) en el equipo cliente están disponibles en el ¡nstanle en que son requeridos.ti u.lEMI'LOS C RA-MA CI Almacenar la información en los equipos c1ientes_ Esta solución es la más utilizada en las aplicaciones Web puesto que el almacenamiento se realiza en los equipos clientes y el servidor no debe preocuparse por la reserva de recursos. e. válida la cookle. '~ Es muy importante tener en cuenta que todo el tratamiento de las cookies se realiza en la cabecera del mensaje H1TP y. e.1 Estructura de las cookies Básicamente. eslé habiljtada. De igual forma. Su tamaño es relativameme pequeño. no superando en ningún caso los 4 Kb. el contemdo que bel1tl Indica cual as el tiempo de v.rtlr ele! cual la cook/e tiene valldaz Indica qua l. Contiene al directorio a p. la posibilidad de hacer uso de cookies depende de que el software utilizado para acceder a la aplicación Web (nonnrumente un navegador) cuente con esta característica y que.296 PI1P'ATRAV~DEE. deben ser manejadas antes de . A estas estructuras de información que se almacenan en el equipo cliente se las denomina cookies. por lanlO.lldez data cook/e Indica el rango de dominios an 101 cuala. cookie.. La siguiente tabla nos muestra la estruClura básica de una cookie: Elemenlo N~'" SignifiCjldo IndICa el oombre que • le n. unieamente por un C81\81 seguro SSl R. decir. El problema principal que presenta es el de la integridad de la información. se potencia la distribución natural de la información.ck) • W cooNe Vator C.ducldad Dominio tndJca el valor de la cookIe..4.. 9. las cookies son ficheros de leXlO ASCII que almacenan información siguiendo una estructura básica de pares identificador '" valor. El modo en que se almacenan. Además. . además.

r.. se hará uso de una variable global. con especlflc. al menos. que se le asigne un valor inicial. NOT": P. cada uno de los parámetros coincide con los elementos que componen la estructura básica de una cookie. httpJh.al1'llMMI a la función aetCt. cuando un formulario y una cookie hacen uso de los mismos identificadores. int seguro]). Cuando no queramos hacer uso de los parámetros de tipo string. 9..2 Utilización de cookies en PHP PHP propone una sola función para el manejo básico de cookiel' (creación y borrado) cuya sintaxis es la siguiente: int setcookie (string nombre l. También vemos que el único argumento obligatorio en la llamada a la función es el nombre que se le asigna a la cookie.d6n sobre las fXlC!kif¡s vlllt. mil inrorm.1 Creación de cookies Como se puede observar en la definición de la función setcookie (l.ww. Para acceder al contenido. string dominio] [. string ruta] l.. información al navegador (la parte del cuerpo del mensaje HTIP): en caso contrario.cl6n oficial. string valor) [. si no se utilizan los parámetros ruta y dominio.. obtendremos un error. se lomarán por defecto el camino y el dominio del servidor en los cuales se ha creado la cookie.CAPtnlL09: r{)RMULAR IOS..4. cu. los valores de las cookies sobrescribirán los valores de las entradas del formulario.ndo en un mlamo saipt apereclan múltlplel . Por otra parte.netscapecom/newsreflltdlcoollle_tpeC. De igual modo. int caducidad] [. obten. tu 9.4. la he.2.).hlml.. Sin embargo. se deben reemplazar con la cadena vacfa ("") y los de tipo int. tal y como veremos más adelante. con un va lor O. COOlm::s y SLSIO~I_<¡ 297 que se envfe cualquier otro. en el caso de la creación es necesario. estas eran evWuadas en ordef1lnYWSO" ordwo de IU apar\cl6n .. el valor de una cockie tiene preferencia sobre los valores pas:ldos mediante un formulario. se tomará por defecto el tiempo que dure la sesión de U'abajo activa en el navegador. Si no usamos el par~me[ro caducidad.>ki. NOTA: En PHP 3. es decir.

d•. PHP proporciona una vuriable global consistente en un array asociativo formado por todas las variables pasadus a través de las cookies.$.4.·) II 1/ d la cookia exbte rtreupen IIU Sa. Nuestro primer script contendrá la creación y actualización de 111 cookle: "pAp Sacctlao. eonfig~ por defecto) ActualmMlte.OOOKIE! n~aOO8Soa'l 1.2.t1. por cuestiones de ngurtdad.a«ón Una vez que conocemos los tres pasos esenciales para trabajar con cookiel'._l¡ i' t ia•• t (S COOIUE{ valor 'nWlLac:c:~.2. para borrar una cookie.o6n. usamos la misma función que para crearla.4.- 298 PIIP5ATRAVaDEEJEMPLOS C RA·MA 9.(·n~ce80. vamos a ver un ejemplo que hace uso de esta técnica para implementar un contador de accesos.lni. .o. genemba._$. 9. Es la variable LCOOKIE: Si se está usando una versión anterior a la 4. setcookie ( l.etc:ooki..0.ctu. I 1I . una variable global de igual nombre.os time(I.2. Ólrecbv• •palllCfl de. ell.cuya funcionalidad es exactamente igual a S_COOKIE: Adicionalmente.billt. PHP. al bien. en estas versiones anteriores a la 4.lj~ l.·. de forma automática. por cada una de las cookies.tica estaba dispoflible al ac:tNar e" el fichero de configur. por cuesbones de compatlblllóad.3 Consulta de contenidos Para poder acceder a los contenidos de las cookiel'. se deberá utilizar la variable SHTTP_COOKIE_VARs..360r :r .. cookie <>mU. l.un se permite IU "".' .1e dlAlCtlv. pt>p. NOTA: Esa caraclerl.2. .2 Eliminación de cookies Como ya sabemos. sólo que en este caso la llamada a la función sólo cOnlendrá como parámetro el nombre de la cockie que deseamos eliminar del sistema.cce.0.ee. roaqister-'11obals (opción que aparecl.

giM".. A HREF.php">Actualizar</A> I ~A HREF&"coDkj •• ~.. Ita p4qina <&>$a<:<: ••o. COQKIES y SESIONES 299 «I!AO> <'I'I1'lb'I'~aba:Jardo con Cookie8</TI'rlb < "\lIAD> e8l)0Y~ <t: !NTI:JlJo <Hl~'f'rabf. e/(:Dn'&P> " e/800Y> </H'nIt. e?php lfl$ae.-••o .·cookie.CRA· MA CAPfTULO 9: FORMULARIOS. •• tcookla(·n~m-acc •• oa·)¡ l/elimina la cooki • e/!iRA!» <DODY> <CENTEIl.1I> Vec' •• -. tiene un tiempo de expimción de una hora (3. <IIR>eBR><U> cA aREFa"COoki •• l. El segundo scripl contiene la eliminación de la cookie creada para a1bergar el contador: . l) fICho "Hal acceduSo .ndo con Cookiq«TITU> ...</Kl de .tlll pá..600 segundo!)). accelOS borradoe/H3> <BR><SR><aR> ePR! .> Como podemos observar.php->El~inare/A .php">volvet</A>e/PRB> <ICENT'!R> <'.Q..". 4 e..¡e puede mostrar a través de las siguientes imágenes.. <KlJoTrabajando con ~ODkie8e/H2>ebr> eH3>~ont. tola • • cho "Ee la prilNlrlll vez que accede.e..l. El resu ltado t.:.jando <Hl~OQtador con cookie.DOOY" <{HTML.dor d. nUIlLaccesos. que se accede obtenemos el siguiente resultado: . la cookie creada.. Trabaja...lphp <H'lJ!L> <HEAO> <'!'t1'l. La primem \iel..s<IH2>ehr> acc~.

... c .."... lel)(1 .. Coul. '"'0"" !Lob~_ ....t. .. Finalmente. por tanto... ..¡.. !lIt_ _ 8uold 10 1OIl<"II'lol8llt ~.IIiII..: ... P'Fa 9 vece...to8l . ¡"....?oOO PHI'. 1 " Hlp/Arx:ahldlcoollMl """ Trabajando con cookies o Contador de accuos E...." ~ . ~on . cuando pu lsamos en el enlace Eliminar la cookie.. cuando volvamos a la página anterior. pnmen ve: que accede.. ertl P'Pa Actua1itar I Ebnunat Los accesos posteriores a la misma página irán incrementando el número de accesos almacenado en la cookie nUIl'Laccesos: r .. nUIIL8ccesos es borrada del sistema del cliente y. no ex......... Buold ID 2OlI1O'~JQI"1 ~ ..... ... 1 " _J~I""" Trabajando con cookies o Contador de accuol He accedido a est. ].....istirá: ... )1 ~ Il*ola HOIIII """* ~"~J:I...s DI! EJEMPLOS o RA-MA 1 ... ~ ¡lb .5 A TRA vl'i.. L . o..~ ¡...

php · >volver</A></pR~> </C2NTER> </SOOY' <e)tn'Mf.anloJI.tr. '<7php echo $_COOKIE[entorno) [letrs_[uentel¡ 7>' J .o. TD t tont4[amily. El siguiente ejemplo muestra un uso avanzado de cookies con eslrUctura de array: <'php if f$_POSTH ••teookie{"entornolcolor_fondo] '.$_POSTI1...S_POST[letre_fuanee¡ 1. .·eoo~iaBJ..tr.cee.e como un array. Para ello._t. <H'1'NL' <MEAD> <TITLE>Trebajando con CookleR</TlTLE> </HItAD> <OOOY> <CENTER> <K2>Trebajendo con cookie8</H2> <KJ>Cooki •• CR~~/K3>~BR><8R> <PRI><A HREF. definiremos la cook.etcook1.cAPtruLo 9: FORMULARIOS. <HTHL' <HI'!AI)' <TtTLE>TrabajanóQ con Cookies<iTITLE> <STYL!:> BODY. . utilizando la notaci6n propia de éstos al especificar su nombre.$_POSTlcolor-pleno)I : letcookle{'entorno[letra_fuente)". pero también es posible que una misma cookie almacene múltiples valores. TABLE._t~iol·.f·entornQ[1..$_POST[color_tondol).' <?php ) alee ( . bon-ado I En el ejemplo anterior hemos visto que una cookie puede almacenar un umco valor. setcOOkieC"entorno[color-p1ano]'. COOKIES y SESIONES 301 Trabajando con cookies COlltador de .

AMARILLO</OPTION> c I SEt..'Ccrurier N_">COURIERc."COCllic San..php·" Color de Pondo:</TD><TO> ~SBLECT NAMe··~olo~_fondo·" <OPTION VALUE.E><8R> ~INPUT TYPE.tON <1 J'l'ION VALUE..1 ?~ 1 <fsnL8> • IIBAJ» ".R" c/80DY> </1l'l'ML> c?pnp . >Ackllt'CIund-c:olor: <?php echo $_COOItlE1eat"':lMOl C':Ilor foldo.he: <.'SUBMIT" VALUED"Crear qookie'> <INPUT TYPE_'RRSET'> </rORM> </CEN1'F...MPLOS O RA-MA tont-.l">ARI~/OPTION> cO"'TtON VALUE.OP'l ION> ~PTION VALUB""T&homa">TAHOKA</OfTI~ c/SZLECT><aR><fTD></TR><TR><TO> T.·GRAY·~RIS<fOPTrON> <OPTION VAt. t~Tol >PXI l)lor ?php echo $_COOltIE [etltocno) ¡cola%".nt •• utili~~:</TO><TDD • ELECT NAHE_"letra_fueote"" ~~ION VALUE-"Ari..trez'Y!l.·WHITE·>BLANCO</OPTION~ <OPTION VALoa_'GREEN'>VEROE</OPTION> <OPTION VALOB.OllY. .. "". .. KSo>COM1C</OPTlCll> VALUE.anol..~nQ de la fuente'</TD>cTD> <INPUT TYPE_"TEXT" NAMEz"letra_t~io' 8128-")' HAXLENGTH~'2' VALOt··12·>~ c/TASI.'color-p1ano"> <OPTIQN <OPTION <OPTION <OPTION VALUE-'RED'>ROJO</OPTION> VALUS_'GREEN">VERDEc/OPTION> VALUZ_'SLVE'>AZUL</OPTION> VALUE_'GRAY'>GRlS</OPTION> <OPTION VA..EC':l'>c I Tl»</TR><'l'FI><'l'O> ru.pl./OPTION~ oCC~.!. .LOW.....·SLUE·>A~UL</OPTION> <OPTION VALUE..>php ~o $J:'I)Of::I8leneornol etra.. 1 El resullado se puede observar en la siguiente imagen: .."G:aramont->GARAMQN'tc. <H2>TrebDjando con eookies</U2> <p>Definición del <TASto!> <TR><'I'tI> <~RM Entocno:</~ MRTHOO_'POST' ACTtON_·coakieI3..• 302 PIIP!I A TRAV~ DE E1F.UE~·YELLOW·>AMARILLO</OPTION> </SEL8CT><ITD></TR><TR><TD> Color de Pr~r plano:</T~<TO> <5BLBCT NAKE.

r-. Estos métodos no son todo lo útiles que desearíamos cuando los scripls que deben compartir la información no se ejecutan secuencialmente. inc:1uso teniéndola. pasando las variables y sus valores u lruvés de la URL. a priori. puesto que un error habitual consiste en intentar establecer una cookie y acceder a su contenido en un mismo paso. I 1_.S SESIONES EN PHP A Jo largo de este capíluJo hemos visto que teníamos tres formas básicas de hacer que la información generada en un scnpl estuviera disponible en scriplS diferentes 111 de creación: utilizando fomlUlarios... están distantes los unos de los otros dentro del Oujo de ejecución normal de nuestta aplicación. no es posible acceder a sus contenidos. definiendo cookies. esperar a la siguiente carga de una página para poder acceder a los contenidos de la cookie y actualizar la visualización con los valores definidos por el usuario.¡. Hay que tener muy en cuenta esta caracterís[ica en ellrabajo con cookies. .-po e... fiNCO' e. COOKIES V SESIONES 303 Tra'-Jando COto coakl.~a. 9. _ _ _ ¡Mió • _.. hay que tener en cuenta que no todos los navegadores tienen dis¡xmible esta funcionalidad y que. o bien. Es necesario._ ItU 7 --- En el paso intermedio en que se informa al usuario de que la cookie ha sido creada con éxito. el uso de cookies parece adecuado para solventar este problema (pueden ser consultadas en cualquier momento hllSUI su eliminación del sistema de cliente). Aunque.. o bien..O RA-MA CAPtruLO 9: FORMULARIOS. por tanto.. ésta puede aparecer deshabilitada por parte del usuario.

cierra el navegador. o bien. que se identifica con un identificador de sesión único. El modo principal de activar el uso de sesiones cuando lo deseemos es hacer uso de la función session_start () cuya sintaxis es la siguiente: bool session_start() Esta funci ón crea una nueva sesión y genera el nuevo identificador.1 Creación de sesiones La configuración por defecto de PHP tiene deshabilitadas las sesiones. podremos tener muchas variables con el mismo nombre pero con contenidos diferentes.'i en las diferentes peticiones a lo largo del intervalo de tiempo que el usuario necesite para hacer uso de nuestra aplicación. PHP proporciona las variables de s~sj6n.5. Todas las variables de sesión se almacenan en el servidor. o retoma la ses ión en caso de que exisliera. por tanto. a~nenl un arror. Su sintaxis es la siguiente: . en un momento dado. se genera un identificador único para eUa. . ini). El ciclo de vida de una sesión comienza en el instante en que el usuario se conecta a nuestra aplicación y acaba en el instante en que sale de la aplicación. Para evitar confusiones. Haciendo uso de la función session_id ( ). utilizando el identificador de sesión que se había propagado haciendo uso de la URL o de cookies. Son algo así como variables globales a la aplicación entera pues van a estar accesibles para todos los programas de la aplicación. la Iuncl6n sessioo_stattO debe MI' Ramada al pnnopio de nuestro scnpI (antes de abnr eualquter ebqueta o de fmprimll' cualquier contenido) En calO contrano. auto_start a I en el fichero de configuración php.. esto quiere decir que. Como hemos dicho anteriormente. El modo de mantener de forma persistente este identificativo a lo largo de la sesión es utilizar cookies .)()4 PUP j A TRAVÉS DE EJEMPLOS CRA·MA Para solventar esta situación. cuando queramos hacer uso de ellas. podemos recuperar o modificar dicho valor. que son variables que estarán disponible. NOTA: SI MI Mt8 hecMtndo uso de Misiones bandaa en cookI8s. propagarlo a través de la URL. permanece un lapso de tiempo (fijado por el sistema) sin interaccionar con la aplicación. 9. podemos activar por defecto las sesiones en PHP de modo que en el primer acceso de cada usuario a nuestro sistema se le cree una sesión. o bien. Cambiando la configuración (modificando el valor de la directiva session. en el instante en que se crea una sesión. cada variable de sesión está vinculada a una única sesión/usuario. deberemos indicárselo de forma explfcita.

S y SESIONES 30$ string session_id ([string id]) Si llamamos a la función sin hacer uso del parámetro id. proporcionamos dicho parámero. estaremos reemplazando el identificalivo de la sesión nema! por el valor dado al parámetro (debe ser llamada ames de crear la sesión). También es posible identificar a las sesiones asignándoles un nombre específico..ORA·MA cAPfruLO 9.. obtendremos una cadena con el identificador de la sesión actual (debe ser llamada una vez que exista la sesión).SSION ¡ . COQKfF.2 Acceso a las variables de sesión El modo de acceso a las variables de sesión es a través del array asociativo LSESSION disponible como variable global (SHTTP_SESSIONS_VARS en las versiones anteriores a la 4. elae ( S.0). ccmUdor' J • 01 . El siguiente ejemplo muestro la creación de una sesión y de una variable de sesión al igual que su acceso.ta~t{l: . Si.J>t.2.. seaoion. Para ello. utilizaremos la función session_name () que tiene la siguiente sintaxis: string session-"ame ((string nombre]) Si no hacemos uso del parámetro nombre.5. por el contrario... $nOftlbre_"ntarior . obtendremos el nombre de la sesión actual. si.. por el contrano. 9. actualización y eliminación para poder obtener un contador de accesos: " 7php •••• ion_.. hacemos uso del citado parámetro. la sesión actual pasará a tener por nombre el argumento pasado. FORMULARIOS.f ti ••• tl$_SESSIONI ·contadoc']JJ { S_SESSION [ 'contador' J •• .na:ne (.:ON'tAOOR'): <HTKL> "litAD> <TITLB>Trabajando coa Seoion•• <fTtTL!> </HEAO> <!IOOy> . SES!ON".

1></TD> <cA HRlF. <'\'R> <TD BOCOLOR. ·l· CBLLPADDINC_'2' c~~ ALIGN_'center' BGOOLORo'yellow'> <TD COLSPAN_'2'><B>rnform!lciÓD de la se. saber si hay que crearla o actual izar su valor.·yellow·>Noabre «ne.llow·>Nombr.. además. para crear una nueva variable de sesi6n.eho sl!ISeion_idll ?></TO> </711.TABLI:> <.cho .· ••• lonea2 php'>Jteaetur coneaóor<!A> < CEN'!'ER> </BC'PY'> <JIITHl.306 PIlP 5 A TRA vts DE EJEMPLOS CRA·MA <CEN'11IR> <t!2~Traba1ancSQ con Sesionl!ls</K2> CELLSPACINGo'~'> < 'ABLC 8ORO."/TO> <TD> . actual"/TD> CTD>"'PhP . ?php echo $_SESSION{'contadoc'j ?></TO> </TI\> <TI!> ~TD 8GCOLOR~'y.¡1'R> c. s6lo hay que definirla dentro del array $_SESSION. La siguiente imagen muestra el resultado después de haber reaJizado 10 accesos a la página que contiene el contador: . El ejemplo.'y~llcw'>Número de secl!Isc.rior</TD> $n~r8_aneerior <TD><?php echo .> Como podemos observar. obtiene el identificador de sesión y modifica el nombre asignado por defecto. .>- "TII.· ••• l0n•• l. ... <TD BOCOLOR. En el código se pregunta si la variable de sesi6n tiene valor (si está definida) y.l!Iesio~8(1 1></TD> <c/TR> <"'."yellow'>IO</TD> <TD>~?phP . de este modo.php·>Aceualizor</A> <A 1UtD'.>- cTO BOCOLOR.i6n</B>c/~ <m.

.che •••• io"-id() ?>«D::o<8R> con n~r. se restaura con el valor almacenado por defecto en la directiva session.. t4Tt~11 .. la sesión sigue siendo la misma (su identificador es el mismo).ai~ •• </TITLB> -. l • •asi6n <D::o<?php .:CENTE:R::o "H2::oTr..t(I-BESSION('cone.. <B>"?php .~jando con se. <~rrLE::oTT. io~() 1></B::o <BR><BR><A HR!F.D> .ndo con s.. <S>'conta4or'~/B> .. si no.ion•• </R2::o<BR><8R> <P>variabl..r</A></P> <JCDn'ER> </BOOY::o ilM'lOL' Como se puede observar en la siguiente imagen.CAPtruLO 9: FORMULARJOS. ' •••• ion__ .· ••• lon•• l..li~<BR> d. ini: .dor'll¡ cHnrL::o . Este valor es necesario actualizarlo en cada petición../ <80OY::O . un. pero ha perdido el nombre de la sesión.php·::ovolv. COOKIES y SESIONES 301 Trabajando con Sesloaes El segundo scriPI de este ejemplo se encarga de borrar la variable de sesión creada en el scripl anterior. name del fichero de configuración php.~j..eho .HV.ocu..

==--=-- - .. ~_ """"-- _.lk>r • o. Puede recibir múltiples argumentos.1o~.---'''''''--- .8.tered(·cont. ... nombre1): Registra una nueva variable global para la sesión actual.. sessiofLis_registered(nombre). será necesario activar la directiva register_globals en el fichero de configuración de PHP. la elimina de la sesión. if (1 . En caso de que no exista una sesión. El siguiente código muestra el mismo ejemplo anterior... . .308 PIIP.. pero haciendo uso de este método de acceso a las variables de sesión: '.c.. NOTA.e•• lon_regi.. .terl'contador· I j 6coata. Para que esta opción esté disponible. MA --""'~... . la crea realizando una llamada implícita a la función sessiofLseart ().. Devuelve true cuando la a variable cuyo nombre se ha pasado como argumento a la llamada está registrada dentro de la sesión actual. o session_unregister(nombre): Evita que la variable que se ha pasado como argumento a la llamada sea salvada como parte de la sesión actual... Existe una forma alternativa para acceder a las variables de sesión sin utilizar la variable global $_SESSION que nos permite manejar estas variables directamente haciendo uso de su nombre... I0~i. cada uno de los cuales será una nueva variable global para la sesión actual (devuelve true cuando todas las variables pasadas como argumentos han sido creadas sin ningún problema).rt()....) .a 084 IIfI"lIy Este modo de trabajo está usos son los siguientes: a~ociado con tres funciones PHP cuyas sintaxis y o sessiofLregister(nombre (. es decir.~r· ..~.-_....r u. pero sigue siendo una variable del ~'cripr donde se ejecuta (para esto tendríamos que llamar a la función unset (). Por cueltlones de seguridad y LSS:SSION_ rendlmlenlO. A TRAVas DE EJEMPLOS ORA. preferible n.~egi..

·2·><a"lnfo~ciÓn de la s •• i60</B ..<¡H~ .<BR> M la a •• ión <8>c:?pbp echo •••• 1on_ldfJ ?><..·. </HTKL> El fichero encargado de eli minar la variable de la sesión tiene el siguiente contenido: <?phl) •••• ion_.ScontadoOr".> <HF..ce. <~<?php snteriorclTD> echo $nombre_anterior ?></TO> <8R:o-<cPItE> cA KREF. <TABLB BOROeRa'l" CELLPAODrNO..l</~O> <TO><?php echo session_n&mell ?"</~ .~or ?></~ <TR' <TO BGCOLOR··vell~·>Nombre . 1ft" <TR' <TO </TR> </TABLIt> BGOOLOR~·yellow·>NONbr.'a><8b COP na.. <?php echo •• ssio~id(1 ?></TO~ <ITa> <TR> <TC BGCOLoa.---. cA KREF.~ ' ----------------------------------------------) <lITKL.r l~l.estones).a. Be•• ion-n~(·$BSIONLOONTADOR' I r <HW>' <TI~t>Tr.~j.red( ' contaÓQr' 1) .ter! 'contador'] ¡ ? <!fTM!..bre <B><7php echo 8 .ndo con SesiOPes</TITL!> </HIAD" <80DY> <CBNTD> ~H2~Trabajando con SeslQne."..tart!) ¡ it! •••• io"_i.· .·sesiones4.• CRA-MA cAPfruLO 9: FORMULARIOS. ".php·>Aet~li%Br<'A . eTR M. . <8>' contador'" 18> aetualizad... ."yellow"" <TQ COLSPAH.ctu.~.AO)o <TtTL8>TTabajando coa SeBione8~/TITLE> <"""..rlor ._r~iBt.~t.·yellow ' >Número de .'2" CBLLSPACJNQ.·. ____________ .php'>Reset •• r coolador<IA> C¡PIUt> </CEN'1'ltIb> .sIONES lOO . </TD> </TR> <TR' <TO SGOOLORc'yellow'>ID</TO> <TO. ¡RODY .oVa.eale/TO> cTD><7php echo <c/TR> $cont.ICN"'·center' 9GCOLOR.aion_unreqi. •• $~~. COOKIES y Sr.aion~name(1 ~><f. oC/MEAD> <CIINTER> oeHl>Trabajando eon S•• ionea</Hl><SR>oeaR> oe¡>.

path ({strin.. e session_destroy () : Elimina todos los datos asociados con la sesión actual. sin modificar las variables globales asociadas a la sesión ni la cookie de sesi6n. a session_Q"et_cookie.. o session_save.310 PHPSATRA\'tsOEEJEMPLOS ORA-MA <8R><BR><A HREF. e sessiofLunset (): Libera todos los recursos asociados a las variables de sesión actualmente registradas.5.. camino!): Nos permite obtener o modificar la rula donde se guardan los dalOS de la sesión actual. camino [ • dominio [. seguridadll] ): Nos permite cambiar los parámetros de la cookie de sesión actual. en caso de que éste haya sido el método elegido para gestionar las sesiones. o sessio"-encode (): Codifica los datos de la sesión actual en una cadena. .3 Otras funciones asociadas al manejo de sesiones En este npartado se muestran algunas de las funciones más representativas que PHP proporciona para el trabajo con sesiones. dominio y seguridad). o session_cache_expires ({caducidad]l. a sessiOfLset_cookie-params (tiempo [ .php">volver<JA></P> < I clI:N'nlt> <'800\'> </1I1'XL> Los resultados son análogos a los mostrados en el ejemplo originaL 9. se actualizará el tiempo de caducidad de la sesión.params (): Obtiene los parámetros de la cookie de sesión (duración. Devuelve el tiempo que resta en minutos para que la sesión finalice. camino....e. o session_encode(datos): Decodifica los datos de una sesión pasados como argumento en una cadena. Si pasamos un valor entero como argumento en la llamada a la función..ion •• l.·. generando las variables guardadas en dicha sesión.

.c:oolt. 1o~.-P. . <. <TO IIQCOLOR..do</TD> Icho ..llow·>ID</TD> c~<7php echo •••• ion.'"><8:>ll:ItoDllcl6D ñ 11 sallónc/aH/Ttb </'1'11> «'lb cTrl BGCOLOR..tvllor) . /'l"lTLD> </HIAI» <80DY> cClNiBil> "K2>Tr~j. . iOlLcacbe_apire C).. iott.8'I!iCIRQoo""o> <'I'It ALIQN.."yellow".' .Pt-c:ookJoI"..dlow">Ti~ de ce4ucidadc/TP> <1'D><?pbp echo . . . MA CAPtruLO 9: FORMULARIOS... Tt'J'l.... • I ) •I ? </'1'0> </'I'Ib <T1I. iOll..troe))C ICho 8pe.PU_¡) I wbile¡ll.v..so con S-ion.O:IdUlcKi6nc I TI> cTl><?php echo •••• 1~odell ?)oc/'l'tb- c/n.1e ~ .liaiterCI 1_/TOJo c/n> <T1I.chltpar.". ...</K:..."yellow' :. .CI RA.. .. .alv. •• Sv....etol'10 di .. COOKlfS y SESIONES JII El siguiente ejemplo mueSlra la utilización de algunas de estas funciones: <?php ••••ion. c~<~ c{TABLa> /CDn'IJ\> c/IlOOY> 0I.SPAIiI. .control di c. . ._1áD.{1fTML> Se visualiza en la siguiente imagen: .'y. cTR> cTO BOCOLOR. .cecM..·~llow"> <'l'D CQt. . S.i> cTABLI: BOflDa.'l" ClLLPADDnIQoo"2° CILl..'cctel'" lQCOIoOR.tartll' SJUSIOlf('lIC4elo'l • °COugar '16'. ."yellov·>Cdr.1'." aLnuto.tl$par.sasSlON('cc'J • • 500¡ ?> < .1'_tl'o..cM</TD> cTD><~ ec:bo .&>oTr~j.idl) ?>c/TO> c/TR> <T1I..lor.' 1'>c/'l'D> <1ft> <T1I...ncSo eoo 8MiCDI.thll ?></TI> </TR> 01. cTO 8GCOLOR. cTl) IIiICOLOR. c1'O 80C'0L0R""~low".."y.c/Tr» <'rO> <?pbp $pe..

utomálica._only_cookills ._hlndl.tart .php """"".cooki __ lifetU»e O ....n_ •• s.uslI_cookiIlS saeaion.aion. i~V6".: . JI? " ~ ..5. O Oeflne el controlador que .. colocar In •••• io"-cookll.ar cook/es para guardar el Identlflcativo de sesión en alIado del cliente Especifica si aóIo se deben utlliur cooIdes para guardar el identiflcativo de 111116n en aliado del cliente Eapecrf\ca la duración de la ~ en segundos qlHl se manda al navegador EI .. ..e..J.t••1~r un. •••• ion..rd...•• riali~..I~r y r8CUperw ~ date» ....ealion.~analer IlIsaion.e •• ion.<~~2500. .. . u..--'--'.. PKPSESSID Especifica el nombre de l. l~ ..a para gu. Ruta donde se almacenan ~ dato.cooki~th .ta que se cierra el navegador' Eapecifica la ruta.i~~666~~~ 9.s DE EJEMPLOS Trabajando ton Sesiones M t .1OCiDlI • 11 _On Podemos especrficlr u•• r si . ..u.312 PIIP 5 A TRAVt. ~ ....ion ••av.i.. La siguiente labia muestra un resumen de las directivas del fichero php. pebClón .auto_. MlIoneI se Inicia .. c.... salOn que .r -o filll' Valor por Doocripd6a Eapeafica si el m6duIo que gellJona la. operaciones las implementa al usu..no •••• ion . -' ! ij¡iii:i~ ~ ~ ....r y restaurar los datos de forma senallzada Indica al el módulo pueGe u.4 Parámetros de configuración de sesiones relacionadas con la gestión de sesiones: _..-P4th I'Slion . asoclllOol I las . u.. para .L . D......'.1or O IIgnlb 'ha... utillz.._ .-.. ....• av. corno nombre de 11 cookio Define el tipo de c:onlrolador qua . ... :!_ nI?~. ini ...J~~ü...... _. $. _ ..

COOKIES y SESIONES ~ 13 Dirtotüva .gIn.ngth O Especifica el número d.. fra lI\e"src.olIga 180 O Especifica elliempo de 'IIdI en mlnulos de l•• pAgina.lla Inclusión del . inp ut. cookie_secure Valor por Dd«lo Dacripct60 EspeCIfica el dominio 8 .caehe_expire sea8ion..che a uur en las pI.e•• lon. ae •• ion .tfIca la Pf~bdN:IMI cM que .r.. de la SHi6n que H encuentran en cacM Indica .uae_trans_aid url_r~lt.•ntcopy_l. nocache..o extemo (un archivo) que se u.._..CRA-MA CAPtruLO 9: FORMl1LARIOS. public) seBalon.ticIonaI de entropia en el proceso de Cl'II.5 de la aesi6n (none.id transparente •• té activada o no .c8che_llmlter n<>cache Contiene la aubadena oe comprobllclón de 'HTTP Referer" ~ Espedfica el mécodo de control del c.qc~lifeti.are .rc.•ntcopy_file 1440 India la ruta. byte. como fuente .r_check a ••• ion.r..xpir. un recur.r.-cookie.keenCT y Especifica qu4t etiqueta.. .9c-probabillty 1 Espec.aoo de IdentrficaÜVOl de sesIOn •••• ion .n leido.adon..lIIb1ec:er en se•• ioll. del archivo indiclldo en l. que aerf.r. inicie la rutina gc (getbage coIItJct/OO -recoIedón • basura-) en cada pelkXlo en porcentllje Eap«rfica el nlimera delClgUOClol rn lOs cuales los datos se conslderwin como"baunl" '1 . . ión lila Inclusión del sid transparente ea" actiVada a ••• ion._tu-ef..e•• lon.~o_. •••• 1an.. .cooki.. priv8t. Especifica el dominio •••¡ebleoer en se88ion_cookie. t._h:rt:!f. dlJKbva anterior • . elimlOlldos. for _f. private.._~omein a. html sertn reesental pera incluir el klent1ficallvo de .

disponemos de la función fopen (l. borrarlos. recorrer . podremos acceder a un fichero que podamos haber creado previamente. podremos consultar los datos que contenga. Gracias a estas fu nciones. escribir. Por esto. o bien. modoApertura [. la información que se necesita guardar de manera permanente está almacenada en ficheros.1 OPERACIONES CON FICHEROS (NIVEL INTERNO) PHP nos provee de funciones que nos permiten realizar operaciones típicas de fic heros: abrir. cuando llegue la siguiente.. leer. PHP nos pcnnite abrir ficheros locaJes o remotos. leamos el número que contiene y lo modifiquemos convenientemente. cerrar. Para poder implementar este tipo de tareas. necesiten realizar operaciones con ficheros del sistema local. ruta_busquedall Para poder abrir un fichero. PHP dispone de fu nciones predefinidas para la utilización y manejo de ficheros. es bastante habitual que las aplicaciones..1 Abrir un fichero fopen (nombre. abramos el fichero. Que el fichero esté en el disco duro de nuestra máquina o en otra dependerá de cómo esté formado el parámetro nombre: si . 10. añadir otros. Por ejemplo. modificarlos. poDer un simple conlador de visitas en una página nos obliga a guardar en un fichero el total de visitas recibidas para que. 10.1. sean del tipo y del entorno que sean.CAPÍTULO 10 FICHEROS Y DIRECTORIOS Como es bien sabido.

los descriptores serán imprescindibles a la hora de realizar operaciones sobre ficheros tales como lectura. El puntero se coloca al inicio del fichero. El puntero se coloca al inicio del fichero. se crea. como ficheros abiertos si multáneamenle vayamos a necesitar. Modo de lectura y escritura. De aquí deducimos que usaremos. En caso contrario. se borra todo su contenido. el canal por el que vamos u poder acceder a él: por tanto. entonces PHP lo buscaría además en los directorios que estuvieran definidos en la directiva include--P8th del fichero de configuración php.316 PIIP'ATRAmDEEJEMPLOS éste comienza por he tp: / / o f tp: / /. Modo de s610 escritura. se crea. Si no existe el fichero. se crea. Si ya existe. SI ya existe. l . Modo de lectura y escritura. se crea. se tratará de un fichero que PHP buscará en el sistem.3. Si no existe el fichero. w w+ a a+ La función fopen () devuelve un descriptor de fichero. Modo de lectura y escritura. el punlero se coloca al final del fichero para aMad Ir datos. de ficheros del servidor. El segundo parámetro (modoApertura) puede tener los siguientes valores expresados en la tabla de abajo: Valor Slgnlli<ado r r+ Modo de sólo lectura. SI ya existe. cerrado. rozón por In cual habrá que tener atención a la hora de indicar el camino o ruta de acceso al archivo deseado. Si PHP no pudiera encontrar el fichero en la ruta especificada en nombre y el parámetro ruta_busqueda estuviera a \. se borra todo el contenido. esto es. SI ya existe. tantas variables que almacenen descriptores. indicará que es un fichero remoto y que se accederá a él vía el protocolo correspondiente. el puntero se coloca al final del rtchero para anadir datos. Si no existe el fichero. Modo de sólo escritura. ini. Si no existe el fichero. escritura. etc.

10.iptor·.. ~br~'t I . que una formu común de leer un fichero entero sea mediante el bucle: I$ca~acter • fgetcl$~f)l fgets (descriptor. excepto en que purga del tex to leído las etiquetas o ° . el ficberQ no •• puede abrir. De todas formas.. Característica por la cual la forma más habitual de abrir un fichero es: <?php it (1 Sdeacriptor.fcript.2 Cerrar un fichero fclose (descriptor_fichero) Con la fu nción fclose () cerramos el fic hero que está refcrenciado por el descriptor que pasamos como argumento. 1total_cars_a_leer J): Devuelve una cadena de total_cars_a_leer-l caracteres de menor longitud si se ha encontrado un cambio de linea (que se incluirla en la cadena a devolver) o se hu llegado al final del fichero. Dado que un fichero abierto consume recursos del sistema.ORA·fo. fclese ( ) devuelve true.1."'CIIEROS y DIRECTORIOS 317 En el caso de que el fiche ro no se pudiera abrir por la causa que sea. De Ilquf.~ aeceder "1 fl. este descri ptor es el devuelto por la función fopen (1 vista anteriormente. fopen (O~fichero_cualqui. si el fichero se cierra correctamente.ra·.1.1A CAPtruLO 10.ero " través oe ·\$descc.Permitidas): Es idéntica a fgets (). a fgetss (descriptor. etiQ. devuelve FALSE. Si se ha llegado al fi nal del fichero. PHP lo hará automáticamente al terminar de ejecutar el . Por supuesto. es conveniente cerrar todo aquél que se prevea que no se va a usar más. fopen ( ) devolverá FALSE. t~o. y false..3 Lectura desde un fichero PHP tiene distintas y variadas formas de leer el contenido de un fichero.1 •• t echo . usaremos siempre la más conveniente para nuestras necesidades: O fgetc (descriptor): Devuelve un carácter del fichero referenciado por descriptor. en el caso de que no se cierre expresamente un fichero. si no se ha podido cerrar. Lógicamente.ch. 'rOI) ( echo •••• ERROR. tbr"'I: 10.

respectivamente. la procesa de acuerdo con el fonnato especificado en el segundo parámetro formato para asignarla convenientemente en las variables que se indiquen. a readfile (nomb_fichero [ . a fseek (descriptor. a fscanf (descriptor.. excepto en que el parámetro que necesita es un descriptor de fichero. pero es muy útil cuando leemos ficheros: indica si se ha llegado al final (no quedan más datos por leer) o no.. y en que lee y muestra a partir de donde se encuentre la posición del puntero de lectura. a fread (descriptor. SEEIC. . varl .rutaJ)usqueda}): Lee todo el contenido de un fichero y lo devuelve en fonna de arroy: una lInea en cada posición. Sigue el mismo fonnato que printf (). desplaz [.SET. Para poder movemos a determinados puntos de fichero. ruea_busqueda] ): Lee el contenido de un fichero y lo muestra por la salida estándar. Como puede apreciarse...4 Recorrer un fichero En muchas ocasiones necesitamos colocamos en una determinada pane del fichero para poder leer o escribir cadenas de texto a partir de esa posición..J:ND. a feof (identificador): No es una función de lectura propiamente dicha. 1 ): Según lee la entrada. PHP nos ofrece las siguientes funciones: CJ rewind (descriptor): Sitúa el puntero de lectura/escritura al principio del fichero. 10.. .. a ftell (des criptor ): Devuelve la posición del puntero. El tereer parámetro puede tomar los valores SEEK.. formato (. excepto en que no deja de leer cuando encuentra un cambio de línea y en que devuelve exactamente total_cars_a_leer (si los hubiera).318 PllPSATRAVé)OEEJEMPLOS CRA-MA HTML que haya encontrado.. lo que significará que los desplazamientos son relativos al principio del fichero.Permi tidas indicamos las etiquetas que sí queremos obtener. a fpassthru (descriptor): Igual a readfile ().. desde_donde]) : Desplaza la posición del puntero de lectura/escritura desplaz posiciones. En el parámetro etiQ. total_cars_a_leer): Es id6ntica a fgets ( ) . esta función necesita el nombre del fichero y no un descriptor. Devuelve el total de caracteres lerdos.. la posición actual del puntero o al final del fichero (entonces desplaz será negativo).m __ CJ file (nombre_fichero r .1. .CUR y SEEK.

... En caso contrario.1n bldonn_ ~ . com o bat). . .. Por defecto. devuelve FALSE..._A'~ ''''' .CI RA·MA CAPhvLo 10. Devuelve TRUE si nombr_fich existe. Si se hace uso del tercer parámetro. total_carel). en caso contrario. En caso de que no exista o no lo sea.. puede pensarse que una es un alias de la Otra.1. Devuelve el total de caracteres escritos o FALSE en caso de producirse algún error.2 INFORMACIÓN SOBRE FICHEROS o file_exista (nombr_fich): Comprueba si el fichero nombr_fich existe. dado que son muy lentas todas las operaciones en las que está implicado un acceso al sistema de ficheros (al disco duro.. Ra tEROS y DIRECTORIOS ~19 10. pero.. devuelve FALSE. q.. se recurre a la escritura mediante buffers para hacerlas más eficaces... Ambas funciones escriben la cadena (completa) pasada como parámetro. fputs (descript. cadena [. o sea. el buffer de escritura de PHP tiene un tamai\o de 8 Kb. devuelve FALSE. E" de . Esta función nos aholTlltá desagradables mensajes de error si antes de abrir un fichero hacemos uso de ella. total_caral)." " " " - do """.. sólo se escribirán los total_cars indicados.. a is_executable (fichero): Devuelve verdadero si el nombre del fichero pasado como argumento tiene pennisos de ejecución (Unix) o es un fichero ejecutable (extensión exe. si en algún momento necesitáramos cambiar esta cifra por otra. Esto quiere decir que la escrirura no se hace efectiva en el fichero hasta que no se llena esta memoria intermedia. En general.5 Escritura en un fichero Para escribir. " ~I 10. podríamos hacerlo con la función set_file_buffer (): I NOTA. fwrite(descript.. a is_file (fichero): Devuelve verdadero si el tipo del fichero es un fi chero nonnal. disponemos de dos funciones: fwrite () y fputs (). para ser más exactos). Estas funciones se pueden usar de manera indistinta pues en la práctica son la misma. . O is_dir {fichero): Devuelve verdadero si el nombre del fichero pasado como argumento es un directorio.. cadena [..

El nombre generado empezará por lo que se pase como segundo parámetro. mientras que en Unix sólo se usa uno (fine Jeed). Es muy útil cuando necesitamos crear ficheros auxiliares en entornos multiusuario. unlink (nom_fichero): Borra un fichero. 10 crea. Si no tiene dicho permiso o no existe. Por defecto.3 OPERACIONES CON FICHEROS (NIVEL EXTERNO) Con los ficheros podemos realizar operaciones para simplificar nuestros programas cuando utilizamos ficheros. toma la fecha actual..320 PIIP 5 A TRAVÉS DE EJEMPLOS CI RA·MA e e is_readable (fichero): Devuelve verdadero si el fichero tiene permiso de lectura.original... tempnam existente) en el directorio que se le indica como primer parámetro. fich. Si no ha nOflLfinal) : Cambia el nombre a un habido ningún error. devuelve FALSE. respectivamente). devuelve FALSE. devuelve FALSE. fichero o directorio... link (fich_original. e touch (fichero r. esto es. destino): Copia un fichero destino. 10. devuelve TRUE. filesize (fichero): Devuelve un número entero que indica el O tamai'lo en bytes del fichero pasado como parámetro. Veamos algunas de estas operaciones: e O a a a copy (origen. CR y LF. En caso de error. el fichero se creará en el directorio temporal del sistema. is_writeable (fichero): Devuelve verdadero si el fichero tiene permiso de escrituro. Si no tiene dicho permiso o no existe. Si el directorio no existiese o fuese la cadena vacía. e filemtime (fichero): Devuelve el instante ' timestamp) de la úhima modificación hecha sobre el contenido del fichero. sin el segundo parámetro. siendo ligeramente inferior en este último: los cambios de Ifnea se indican con dos caracteres en Windows (carriage retl/n1 y fine Jeed. (directorio. instante)): Modifica las fechas de último acceso y modificaci6n del fichero. . rename (nom. Si DO existe el fichero. Hay que resaltar que un fichero de texto tendrá tam:ll'los diferentes en Windows y en Unix.. Devuelve el nombre del fichero creado.-enlazado): Crea un enlace duro prefijo): Crea un fichero ónico (no (válido sólo en Unix).

o lO.): " readdir (descriptor): Lee una entrada del directorio a partir del descriptor devuelto por opendir ().··· SRROR: no •• ha podido entrar en (Snu.-o_dirl< . etc. etc.. A: .{·<h). a opendi r (nombre): Abre el directorio pa. 1/ quithIDs la..4 MANEJO DE DIRECTORIOS Al igual que tenemos runciones especrticas para ficheros. Con ellas podremos crear. .sBR~[·"INDIR·Jll. -J').dir".. . Aplicamos estas runciones para conseguir un sencillo navegador de archivos que nos permitirá movemos por la estructura de directorios del disco duro del servidor: < (i8.ub8tr(Snuevo_dir_ 21..ORAMA CAPlnrr. Devuelve un descriptor de directorio. averiguar en qué directorio nos encontrarnos.tras de l. cambiamos a otro.'\J.1 dl..ado como parámetro. e: . ~. AClIEROS y DIRECTORIOS 321 10. leer las enrradas que tiene un directorio.): c?php opend1r('/mil documentosllibro .. un par de consejos en beneficio de la portabilidad: usar el carácter"" como separador de directorios (en lugar de "\") y no hacer referencia a la unidad de almacenamiento (ejemplos. a a closedir (descriptor): Cierra el directorio indicador por el descriptor.<. unida" $nuevo_d1r •• trtr $nuevo_d1r. if ) 1f I !$dt_dir • opendirrSnuevo_dir.$_OET['nuevo_dir' 1 ¡ e18e ( 1/ e8 14 primera vez que le ejecute sI ~ript $nulvo_dir~gstewdl) : U (iBBetU. "\\". Si se están escribiendo scripts para plataformas Windows. borrar.·)I ..vo_dtr· 1») $nuevo_dir. ( Snuevo•. también tenemos a nueslnl disposición una serie de funciones predefinidas para el manejo y utilización de directorios.et{$_GE~[·nu.

/' acho '<~ 8rc·'/icone'beck.. Para ascender al directorio padre... Sini_atiq....gif'>$iQi_atiq·$u~dir'><font 111.dir. .·<III><br>·1 ( if jll\lbnr_count I $\ln. Sit . '>$~it.lDi_etiQ7f$~it.... ir (ea_directoriol$nuevo_dir. seleccionaremos el directorio cuyo nombre es .</font>'fin_etiq'./fo1der.)¡ all1e echo ·c189 arc.. '\\'.tiq·: } I funetion e. . ind"..dir/$~it""1 raturn fis_dirl'$fich-4-Pre.cbr>'.9if.. . ••• 2>.'<1I href. . . El aspecto que tendría lo vemos en la figura de la página siguiente. Ir Ifin devual~ .>...cHr_atrtr{dirnarlle($un.4ir... } ir ($unJt_ •• '. '/1' _1 lf ¡$un_dir ..'SI_SERVlR['PHP_SELF'j)?nuevo_dir"/ $fi~atiq. "/') ).. Sun_it . .." J alaa ( it: lSun. !unction ( po"-url($~air.'/ieon.'/icon.dirJ... '!') $fie~lI-prequnt8r·"$un_it"'1 el •• Sfich-8-Preguntax··$un.. 8(:00'<1-.322 PHP 5 A TItA V6 DE EJEMPLOS =RA·MA •• fal_. "")...gif'>$it . ". whi1e II$it_.it_)) ( pon_urll$nuevo_dir._directoriof$~dir.. r_&1irl$dCdirll if (Sit_ •• '.'/icoos/oeneric./folder. .r')): " . . Sólo los directorios tienen asociado un enlace (además de tener asociado un icono que representa una carpeta): para movemos por las carpeUls de nuestro sistema de ficheros. ."8!lo puede haber un noldna de directorio con doa '1'.lo l' ( $un.rc. .") continue.1 ·I·' ..9if'>$ini_atlq·$un. bastará con hacer dic en ellos.dlr'Sun_it"'>'~ltea4fi~.unt.$fl"-atiq·¡ elas echo "<illlg IIrc.. $un_it~J " en .

. podemos garantizar el acceso ordenado de múltiples procesos a un recurso compartido l ... $ 1$ D. no funciona correctamente en tooas las implementaciones de servidores Web......... Sólo funciona correctamente cuando se usa CGI.. ACILEROS y DlRECTORlOS 32J . . O getcwd (l: Devuelve el directorio actual de trabajo (también llamado activo) del script.....5 OPERACIONES CON DIRECTORIOS Veamos algunas funciones básicas para trabajar con directorios: e rnkdir (nombre_dir.. Dado que la operación de crear un directorio es atómica en cualquier sistema operativo. No funciona en Windows.~ . pues así se garantiza la consistencia de la estructura de árbol de un sistema de ficheros.. del proceso actual al directorio que viene indicado en el parámelrO que se pasa a la función._Stllhlml o rewinddir (descriptor): Sitúa el punlero de leclUra al principio del directorio. . D_ .. Se suele usar para limitar el acceso a determinados recursos.·O$ tú programtlfapac/fe groll¡kapacJlI!' iuJocs . podemos crear una región crftica haciendo uso de las funciones de creación y borrado de directorios. ni en tooos los sistemas operativos.. • CARPETA: /a...rdU. 10. Devuelve FALSE en caso de error... . . D _ ..... DEN'I1WlA-TXT . ". permisos): Creamos el directorio nombre_dir con los permisos indicados en el segundo parámetro D nndir (nombre_dir): Borra el directorio nombre_ dir. e chdir (nuevo_dir): Establece nuevo_dir como nuevo directorio de trabajo. sin embargo. esto es. " .O RA·MA CAPITuLO LO. I La función fl ock t ) parecerla la mis adecuada para esta tarea. e chroot (nuevoDirRaizl: Cambia el directorio raíz.

. ~ho "libero el ~errOJo :) .1 el directorio . significará que hay otro proceso haciendo uso del recurso: en caso contrario. _.leep(ll r 1 1 function 1 ibera.ca oc/tltl.filel$fio~contador) . necesita previamente consultar si tiene pentliso.rrojo!) while (limkdlr($GLOaALS{'cerrojo').. br>'.• chr.. "M¿¡d~ pruebll de regio".it"'B.. . . podría implementarse un contador de accesos: bastaría con incluir el código de abajo entre las llamadas a las rutinas crea_cerrojo (1 Y libera_cerrojo (): $n~vi.rrojo~'¡tmp/o. /1'1111"'<1.32A PUP. et"it1. Una vez satisfechas las necesidades de uso del recurso. ?.~. bE'''': $<l.~s_l·'1 ecllo 'Ere..rrojo' I funotion < < cr. $viai ta ..JIIBB_lc rtl"i.. .p(10) .1-. cerrojo (1 < rmdil"t$QLO&ALS~ 'carrojo'})¡ echo 'intento e. tr.. Esta autorización se implementa de manera muy sencilla: si e~ste un directorio (de nombre convenido previamente). 7pbp $c.> .. ..f. .lt.tUJl4s_1\n") I felo •• IJeU). br>\n~..perando ...a~o..it<l. el visitante numero: <b"$v!f¡. echo '&hora haqO lo que quiera... ._eerrojoll. estoy e. borrar.visih.. . . Por ejemplo. ($nllfll-. .l cerrojoo:br>'. ¡b.fopen($(ich.<eontador. creará el directorio y accederá a dicho recurso.NIIJ. ti u.:-_r .¡ . . libera_ cerrojo f) .. "Svi.5 A TRA vts DE EJEMI'LOS CI RA·MA Este mecanismo se basa en el uso de semáforos: para que un proceso pueda acceder a un recurso. html . 0700)) echo 'me du. 'w") I fwrit. [01 ) ¡ $vt... .. b!'>'.II$d(..

los permisos siempre se darán en trios.6 CONCEPTO DE PERMISOS Y DUEÑOS EN UNlX Todas aquellas Funciones que hacen reFerencia a usuarios. establece una semántica de operaciones. El sistema operativo. usuario grupo resto 4 2 1 4 2 1 4 2 1 . se diferencian tres entidades: usuario.. Por ello. elC.J4 CAPfTuLO 10: I'ICUEROS y DlRECTOIUOS J2S 10. Además de los permisos. quien no es ni el usuario ni otro usuario que pertenezca al grupo). fichero consulta ejecución (independiente del contenido) bajar al directorio listado del dlnctorio contenido del directorio Por otr. por ejemplo. un valor de 5 indicará que sólo se puede leer (4) y ejecutar (1): un 6 equivaldrá a poder leer (4) y modificar (2). grupo y el reSlO (esto es. para operar con los permisos. escritura y ejecución.t parte. Así. un peso igual a 7 equivaldrá a tener todos los pennisos activados. es decir. en función de si se trata de un fichero o directorio. grupos y pennisos sólo lienen aplicación en plataformas UNLX. cada uno de éstos tiene una valoración o peso: 4 2 1 De manera que el tOlal de pennisos estará detenninado por la suma de pesos que tenga. Cada fichero o directorio en Unix tiene tres tipos de pennisos: lectura. determinará para cada lipo de permiso lo siguiente: lec:tura ("r") escritura ("'w") modificación creación y borrado de ficheros en el directorio eJeeaC'16D "'X. razón ~ta por la que mencionamos sus funciones relacionadas en un apanado separado.

a chgrp (fich_o_direct. por esta razón. fecha de acceso. a chown (fic~o_direct. o bien. grupo): Cambia el grupo al que pertenece un fichero o directorio. prefijaremos con uro O el valor del permiso deseado. dispositivo donde esté almacenado. grupo al que pertenece. del nombre del fichero pasado como parámetro. O chmod (fichero. a fileperms (fichero): Devuelve los permisos del nombre del fichero pasado como parámetrO_ a fileowner (fich_o_dir): Dicha función devuelve un numero entero correspondiente al identificador de usuario del dueño del fichero o directorio pasado como parámetro. u tilegroup (tic~o_dir): Devuelve un mlmero entero correspondiente al identificador de grupo. o bien. Devuelve verdadero si se ha realizado el cambio correctamente. El segundo parámetro permisos se espera que sea un número octal. que el usuario sea dueño del fichero y que. su UID. 075S)¡ o umask (mascara): Establece qué permisos no tendrá un fichero o directorio al crearse. el sistema de ficheros de Unix está basado en unas estructuras de datos denominadas i-lIodos. además. 10. El superusuario no se ve afectado por los permisos de un fichero. Para que tenga éxito esta función. número de enlaces. etc. Sólo el superusuario (root) puede cambiar el dueño de un fichero. usuario): Cambia el propietario de un fichero o directorio. que el usuario que realiza esta operación sea el superusuario (roo t). pertenezca al grupo al que quiere cambiar el fichero. su OID. se ha de cumplir. el valor 640 indicará que el usuario tiene penniso de lectura y escritura.s A TRA V~ DE EJEMPLOS CRA-MA Por ejemplo. que los integrantes del grupo tienen permiso de lectura y que el resto de usuarios no tiene permiso alguno. que es donde se almacena toda la información relaliva a ficheros ylo directorios: Lamai'io. punteros a los bloques de datos donde se encuentra.7 INFORMACIÓN DE FICHEROS Y DIRECTORIOS EN UNIX A grandes rasgos. Toda la . quién es el dueño. Ejemplo: IChInod !"!lIIYsqlrlich txt". Al igual que en chmod () el parámetro mascara hay que expresarlo como un valor octal: empezará por O.326 PHI'. permisos): Cambia los permisos de un fichero. esto es.

elc. ctime. para averiguar el número del i-nodo. ino. uid.txt·: $v~l •• t. Como podrá apreciarse. blocks: o bien. blksize.CI RA-MA • CAPfTULO 10: F1CIIEROS y DLRECTORJQS 327 infonnación de los ficheros JocaJes almacenada en el ¡-nodo puede obtenerse rácilmcnle usando la función stat (1: array scat (string nombre_fichero). Si hay algún error. mode. las funciones siguiemes están en realidad basadas en la informaci6n contenida en el ¡-nodo: Devuelve el número de ¡-"odo correspondiente al fichero que se pasa como parámetro. rdev. b:. podemos llamar lanto a fileinode () como a stat (): Sf··entr~da. Para ello. O fileinode (fichero) : Vemos con el ejemplo que. con el 1. . le pasamos como parámetro la ruta del fichero y lo que obtendremos será un orray COD la siguiente información relativa al fichéro: • dispositivo ¡-nodo 1 • • permisos • número de enlaces • dueno del fi chero (UlO) • • • • • • gru po (OID) tipo de dispositivo tamaño del fichero en octetos fecha de último acceso fecha de última modificación fecha de úlrimo cambio tamaño del bloque número de bloques asignados trav~ • • El array devuelto por stae () puede ser accedido bien a de claves (array asociativo). nlink. gid. size. S(val!'ino'}I_. mtime. devuelve FALSE. ! En Windows a: se corresponde con el O.t!$f)¡ $el_inodo_Cila1nodet$f): echo '{nodo de Sf. atime. en cuyo caso lendrfamos los índices del O al 12 que se corresponden con Ins claves amenores. en cuyo caso éstas son: dev.Sel_inockl"j". como array numérico.

) correspondiente al fichero pasado como parámetro. filegroup {l. devuelve FALSE. fileinode ( ). Si hay algún error. esta función no devuelve la fecha de creación del fichero. pennisos. unknown: tipo sin determinar. Por tanto." 328 PHP!i A TItA ~ DE EJEMPLOS CI RA-MA o fileatime (fichero): Devuelve el instante (/imeslamp) del último acceso hecho al fichero. is_executable(). Ojo. lo que se hace es cachear dicha inrormación. las operaciones mAs lentas que puede rea1izar un ordenador son los accesos al disco duro. file_exista(). o filectime (fichero): Devuelve el instante del último cambio que se ha hecho en algUDO de Jos campos del j·nodo (número de enlaces. elc. Si lo único que queremos es pedir inrannación sobre un fichero (por ejemplo. is_dir(). se necesitara preguntar algo más sobre el mismo fichero. is_link(). filetype (l. una opción de implementación para aumentar el rendimiento de estas operaciones consiste en guardar en memoria el resultado de la primera petición. fifo: tubería (pipe) con nombre. Si. filemtime (). filesize ( ). fileowner (1 Y fileperms (l par.l preguntar sobre un detenninado fichero. En caso contrario. Como ya se ha comentado anterionnente. • dir: directorio (también en Windows). • char: dispositivo carácter. En definitiva. PHP . filectime(). block: dispositivo especial de bloque. devuelve FALSE. mM tarde. necesitamos saber quién es el dueño). is_file(). el sistema devolverla lo que liene en memoria en lugar de volver a hacer un acceso al disco. • • a is_link (fichero): Devuelve verdadero si el tipo del fichero es un enlace simbólico. is_writeable(). o readlink (fichero): Devuelve el nombre del fichero apuntado en el fichero simbólico pasado como parámetro. dueno. cuando usamos cuaJquiera de las runciones stat (). [J filetype (fichero): Devuelve una cadena indicando el tipo de fichero que se ha pasado como parámerro: • file: fichero (también en Windows). is_readable(). fileatimeO. • • link: enlace simbólico.

devuelve la ruta de directorios y subdi rectorios donde está ubicado el fichero: los directorios por los que hay que pasar para encontrarlo. Pero los datos contenidos en la caché sólo son válidos durante el tiempo de ejecución del programa. obtendremos tal a dirname (ruta): Hace el inverso de In funci6n basename().").. como lo que obtenemos de ella. de cadenas de caracteres ya que tanto 10 que pasamos a la (unción. basename () nos devuelve los caracteres que están después del último carácter que usamos como separador. Por esta razón. La cual lo que hace es borrar o libcmr esta memoria caché donde se alrnuccna la infonnación que hemos pedido sobre los ficheros que sean. es un stnng: dada una cadena de caracteres que definen una ruta o posición de un fichero en el disco duro (separados los directorios por el carácter ". sino. aplicado a " ¡ hola /que/tal". Esto tiene dos efectos: consumir recursos del sistema y (lo más importante) podemos no llegar a tener in(onnación real del fichero porque otro proceso haya modificado cualquiera de sus propiedades o incluso lo haya borrado. es decir. obtendremos" / hola / que". La siguiente vez que se utiliza cualquiera de las funciones enumeradas arriba.O RA-MA CAPiTULO lO: FICHEROS Y OIRECfORIOS 329 guarda en memoria caché el resultado obtenido (que es In información completa que hay en el i-nodo). PHP usará lo que haya guardado en memoria y no accederá al sistema de ficheros (siendo así mucho más rápida la respuesta). 10. más bien. estos datos se reinicializan. . funciones que de alguna manera están relacionadas con los ficheros: basename (ruta): Ésta no es una operación de ficheros o propiamente dicha. o '".8 OTRAS FUNCIONES En este apartado incluimos. a modo de misceldnea. PHP cuenta con la función: void clearstatcache (void). Una vez que se vuelvu a cargar. Por ejemplo. Cl disk_free_space(dir): Esta funci6n toma una ruta a un directorio y devuelve el espacio libre en octetos (bylt's) disponibles en el sistema de ficheros que contiene al directorio. si le aplicamos esta función a la cadena /hola/que/ tal.

También en los clientes de correo vemos esta posibilidad: en la página de componer mensajes lo normal es poder adjuntar archivos para enviarlos junto con la redacción del mensaje. las operaciones en las que están involucrados ficheros que nos quedan por ver son aquéllas en que el cliente le envía un fichero al servidor y a la inversa: el servidor le envía un fichero al cliente.tlQno· s\1bir _fieb. El problema de subir ficheros al servidor se divide en dos escenarios: uno es la página HTML donde el usuario indicará (a travts de etiquetas) qué fichero de su disco local quiere subir: el otro se encuentra en la parte programática: gracias a la página HTML (en realidad.·~1tipaxt/f~-4a~.J30 PlIP' A nAvas 06 EJEMPLOS O RA·MA o disk_tocal_space (dir): Toma una rula a un directorio y devuelve el ramaño del sistema de ficheros donde está situado dicho directorio. Casos como éste lo encontramos.. tantas como ficheros queramos subir). gracias al protocolo H1TP). para que el usuario seleccione el fichero deseado: La segunda etiqueta necesaria es la que nos pennite construir un fonnulario «form». En la página HTML sólo necesitamos dos etiquetas: la etiqueta <input> (en realidad. y un botón de navegación (browsing). pero con una serie de cláusulas adicionales: el e.9... por ejemplo. 10. php" _~b04-·po.t· enct~. es decir.1 Subir ficheros al servidor No es raro encontrarse con páginas que nos penniten transmitir ficheros desde el cliente al servidor.·> .9 TRANSFERENCIA DE FlCHEROS ENTRE CLIENTE Y SERVIDOR Por último. 'Ir. lo que vulgarmente se conoce como subir ficheros o hacer uploads. gracias a la cual el navegador mostrará una cajita. 10. en páginas donde se ha de rellenar un curnculum vitae y uno de los campos a rellenar es incluir una fotografía de la persona interesada.. el fichero ya ha sido transferido al servidor y ahora lo que tenemos que hacer es poder acceder a él para realizar las tareas que consideremos oportunas.

'2S000Ó'> Texto del Menaajel<br> <textar.O 10: F1OfEROS y D1RECTORIOS )3 I Es decir.'~til.. se puede expresar el tamaño máximo que podrá tener un lichero para poder ser enviado con un campo de datos oculto (tendríamos entonces tres etiquetas) al que hay que identificarlo como ma~file_size (si no se indica. y que viajarán codificados como multipart l form-data. ' _ _ ti1. c~la.1_ti~djunto'> <br><br><input type. se tomará la directiva upload~filesize._. tenemos que indicar que el método de lnUlsferencia de los dalOS del formulario es mediante POST (viajan junto a la página).'. a Adjuntar:<tnput type_'fil. el fichero se encuentra en el servidor.G!'r> L090' > Veamos un sencIllo ejemplo de página HTML desde la que se podría enviar un mensaje junto con un fichero adjunto: <TITLE> aubir fichero. </TITLE> <JKEAD> "'900Y> <h2>COMPOner Hen~j. comentada más abajo).me.ubmit· valu•• 'enviar dato.!~:X. limitamos el tamaño máximo a 1. Por ejemplo. Opciona1mente.000 cameleres: [ "input type_ 'hilld_' ~. Evidentemente.</b2> <FORM .'50' rowae'S' ~'texto'~ </texurea> <br><br>Fich.~!.CRA·MA CAPtrtll.etbOd·'po$t' action.php' enetype·'multipart/form-data'> <INPUT type_'hidden' n..!'~ </FORM> </800'1'> </II'I'ML> Componer Mensaje Después de pulsar el botón de enviar._.'.' yalue. el fichero transferido no está en un directorio al azar: se almacena en .' n4~'.iz.ubir_'ich.

Código de error devuelto: indica cómo ha ido la transferencia'.. el fichero es demasiado grande)... El fichero es mayor que el tamarlo Indicado an la directiva uploa~max_filesize del fichero de configuración php.INI_SIZE 2 UPLOAO_ERR.lllare O UPLOAD_ERR.2. mientras que las claves de la segunda columna se corresponderán con las características de cada fichero: Clave name tmp_name Deterlpc:hln Nombre del fichero transferido.. entonces obtendremos none. Nombre del fichero temporal donde esta guardada el fichero recién subido. Pana poder trabajar con los ficheros asf transmitidos. Tamano en caracteres del fichero. El tipo MIME del fichero (indicado por el cliente). El fichero es mayor que el tamano indicado en el campo oculto ~file_size. los códigos de error que podremos encontramos son los que se muestran en la tabla de abajo: V"'r COD..3)2 PllPjATItAmOEEJEMPLOS ORA-MA el directorio que se especifica en el fichero php _ini a través de la directiva upload_tmp_dir.0_ .... PHP nos proporciona el array asociativo S_FILES_ Este Ilrray tiene dos dimensiones: en la primera columna se indican los ficheros que han sido subidos usando como claves los identificadores que usamos en la etiqueta <input>.. aize type error Por su parte. 1 UPLOAD_ERR.. ln1. Si no se pudiera haber cumplido esta operación (por ejemplo.FORM-SIZE 1 Esta clave ha sido incluida a partir de la "ersión 4...OK SlgBlfkado Sin errores.

t. off). ?. 10. Uimita el tamar\o máximo que podrá tener un fichero poder transferirse al servidor.p~' J)) $~lor) le I I il_uploaded-tilaIS_F!LSS¡'f_adjunto'¡ ! $error_$_FILES r . para up1oa~fi1esi2e .2 Directivas de PHP. Veamos un ejemplo de cuál seria el programa que tratarla los datos introducidos en la página HTML anterior: . permitirá o no subir ficheros al servidor. hay que considerar tres directivas del fichero de configuración phI'. S~or </h3>')¡ if ILFILRSI' C. 'o'Ippllclleion/x-:tlp-compr••••d') echo "<b»"" ERRORl el fichero enviado no .djunto' l' 'tw-' J J . No se ha transferido el f}Chero .• CI RA-MA CAPITuLO 10: ACHl!ROS y DIRECTORIOS ))) Valor COlISta. ini que nos determinarán el comportamiento del intérprete PHP en lo que a transferencia de ficheros al servidor se refiere: Dlrectln fi1e_up1oads up10a~tmp_dir Descripción En función del valor que tenga (on. destino).udo</h]>".seá c~ri.? toreach • S_FILES ! . INI involucradas Por último. Directorio en el servidor donde se almacenan de manera temporal los fICheros que han sido subidos.. • UPLOAD_ERR-NO_FILE También disponemos de un par de funciones que son muy útiles para trabajar con estos ficheros.ES[$c. f_adjunt.l"<b»"· ERROR. Una nos vale para saber si el fichero ha sido subido: is_upload~file($_FILES('identif_fich'J ('tmp_name']).. echo "\$_PIl.o' J [ 'error' J ¡ di.9. (. L.:lave): I$valor)<br>·. Este valor prevalece sobre el valor dado en el campo oculto Identificado como tnax_f i le_si ze. fichero no transferido.te 3 UPLOAD_ERR-PARTIAL Sipllkado El fichero ha sido parcialmente transferido.~junto· J •• $clav• • . y la atta nos sirve para renombrar o mover el fichero temporal a otro que será permanente: move_uploade~file(no~fich_original.

. por defecto. dar(·Content·Typ8: application/octet-at~~. Por ello. MA 10. es decir..334 PtlPSATRAVésOEEJEMPLOS ORA. se envra directamente a la salida estándar.fich-"BaCO' ¡ h. enviarnos al cliente. etc. ?php $nam. sino que lo guarde automáticamente. Adentás. el resultado de estas funciones no podemos asignarlo a una variable o pasarlo como parámetro a otra. O ob_ge t _contents ( l: Devuelve el contenido de la memoria intermedia. PHP nos ofrece toda una ¡omitid de funciones para poder controlar todo aquello que se dirige a la salida estándar.3 Bajar ficheros del servidor La transferencia de ficheros entre cliente y servidor también puede hacerse en sentido contrario aJ visto hasta ahora: desde el servidor podemos enviar un fichero al cliente forzándo a éste a que lo almacene en su disco duro. CI ob_get_length (1: Devuelve el número de octetos de lo que hay en el buffer.poB1t1on: attachment. If opcjonal 4 ?~. a ob_ end_ flu s h ( ) : Envía el contenido del buffer a la salida estándar y luego lo vacía. fpassthru (). f11enama.nt~Length: " filewize( $nOfILfichll I h.10 CONTROL DE LA SALIDA ESTÁNDAR Hemos visto que.ad8r(·Cont~nt~01. queremos enviarle un fichero gráfico (por ejemplo.. cualquier texto enviado a In salidn estándar no llegará ni navegador del cliente. la recibe directamente el cliente. Para realizar esta transferencia. Esta funci ón no vacía el buffer. por lo tanto.. print ().. CI . un fichero de tipo jpg) que no queremos que lo visualice en el navegador. la saljda generada por cuaJquiera de las funciones readfile (). a ob_flush{): Envía el contenido del buffer a la salida estándar.'$no~fich'") I header("Content·DeIlCI:1pt1on: ¡nenadje que quie~a·).'$nOM f1ch'"). O ob_end_c lean (): Borra el contenido del buffer y da por terminado el bllffering./Jers) : ob_start ( ): Activa el almacenamiento en memoria intermedia. da por terminado el almacenamiento intermedio. 10. h. gracias a la función header (l. Por ejemplo. CI ob_c lean ( ) : Borra el contenido del buffer. name. lo que hacen es trabajar con el contenido de una serie de memorias intermedias (bll. du I·Cont. los siguientes comandos del protocolo HTTP: . echo () .9.. En la práctica.

·datalimage /pnq .una imagen en una página HTML pero. en lugar de hacerlo como siempre.chun~. nos \amos a ahorrar una conexión HTrP pues vamos a empotrar la imagen en la propia página haciendo uso del esquema: <img .~g~~ ••_64·> .plit(base64_enc~e($1.~b5. echo '<img ./png¡be8. .rc.·~O·>'._lmgl) .png") : $la_Jmg_ob_got_coneaneatll ob_end_clean/) 1 $.> Vemos en el código de ejemplo que podemos caprurar la salida de la función readfile ().ORA·MA CAPfTULO :0: F1CUEROS y DIRECTORIOS .·~ata:imag. .64.n-b4•• 64.lH En el ejemplo que proponemos queremos enviar .ba ae64 .e6(· w1~th. tratarla como mejor nos convenga y enviarla cuando nos parezca. .dfile¡'worldl.re.cho '<h2>Ej~lo de Cofttrol de le salida</h2>'¡ ob_etArt!l¡ re.. recuperarla del buffer.

la gestión de los datos se vuelve cada vez más lenta pues los accesos a ellos son secuenciales. mSQL.) e. la generación de inconsistencias es muy fácil que aparezcan y muy difrcil de gestionarlas. Las teóricas venlajas de esta implementación se basan en la rapidez con que podemos programar las rutinas de acceso a los registros (insertar. que en cua1quier momenlo podemos ver o modificar dicho fichero con cualquier editor de texto.1 BASES DE DATOS RELACIONALES Existen muchos tipos de base de datos en función del modo en que almacenan y acceden a la información que guardan: relacional. modificar.~ ron muy poco eficientes. SQLite. incluso. tendremos que usar un gestor de base de datos. Ejemplos de gestores de bases de datos relacionales o RDBMS (Relotional Dolabase Management System) hay muchos: MySQL. jerárquica. 11. M~ razones de peso para no usar ficheros de texto como elementos de almacenamiento de información: los accesos concurrente.. confonne crece el volumen de infaonación almacenado. esto es. orientada a objetos. . Microsoft SQL Server. en red. usar ficheros de texto tiene muchos inconvenientes. si necesitamos que el rendimiento sea óptimo. resulta muy complicado (imposible en ocasiones) limitar los accesos de manera selectiva (en función de usuarios y en función de determinadas áreas). Por lo tanlO. eliminar. elc. Oracle. PostGres.. etc. utilizamos un fichero como estructura para almacenar la ¡nfonnación. Informix. SyBase. etc. Sin embargo. El más evidente está en que. siempre desde el principio del fichero.1 CAPiTULO 11 BASES DE DATOS TaJ como podemos ver en el anexo A donde hemos desarrollado una agenda. elc. etc.

MySQL sigue esta misma arquiteclUra y. Este sistema de almacenamiento proporciona bloqueos de columnas. las aplicaciones que siguen la arquitectura clienteservidor (Web. presuponemos una cierta familiaridad del lector con el entorno de trabajo con bases de dalas relacionales y su lenguaje de consulta. El nuevo sistema de almacenamiento para las bases de datos gestionadas por MySQL es /tmoDB. proceso que consiste en evitar redundancias. realizan conexiones a ese puerto. es necesario tener arrancado el programa servidor tal como vimos en el capítulo dedicado a la instalación.2 MySQL De entre todos los gestores anteriormente mencionados. del cual no haremos una descripción exhaustiva dado que no es el objetivo de este libro dar una visión profunda de este lenguaje. en su disponibilidad para distintos sistemas operativos (la mayor parte de los sabores Unix. Durable). ftp. para poder realizar operaciones. los clientes que. Por tanto. un gestor de base de datos relacional almacena los datos en tablas. el servidor de MySQL escucha peticiones en el puerto TCP 3306. si hubiera que cambiar un dato que estuviera repetido. Por otro. etc. están formadas por columnas (o campos). en el otro. desarrollado y mantenido por Heikki TUllri. la elección de MySQL como gestor de base de datos radica en que es gratuito tanto para usos privados. lecturas no bloqueantes. es muy rápido y no necesita grandes recursos de máquina.338 PIIP. el acceso a los gestores de bases de datos se hace a través del lenguaje SQL (Strllctllred Query Language). a su vez.1 Conexión con el gestor de la base de datos Como ya es bien sabido. 11. rlews. es decir. dos.s DE EJEMPLOS ORA-MA Básicamente. lso/ated. Windows 9x1NT/2000/XP. Antes de definir una tabla. correo. además. OS/2. En la misma distribución donde viene el servidor .) basan su func ionamiento en dos extremos: un servidor que se mantiene a la escucha de peticiones en un puerto determinado y. hay que normalizarla. etc. Consistefll. Por defecto. parte. que la información est6 duplicada ya que.2. integridad referencial. cuando quieren contactar con el servidor. 11. múltiples niveles de aislamiento. como comerciales (sólo hay que pagar en el caso de que se desarrolle un producto comercial que esté basado en MySQL).5 A TRAV"é.). en que es capaz de trabajar con millones de registros y porque. por tanto. habña que cambiarlo varias veces. y éstas. recuperación automática y todas las garantIas ACm (Atomic. cada una de las cuales está formada por fil as (o registros).

. 11 eboW whil. óe Ó$tos: $f1la(01<»r>': Sba ••_d4to •• 'ey. c..... myaql_liat_tables() y myaql_close ( ) : $db6 " ~ IIIyI<¡¡l_connectj 'lcx.. fet. .p).... ..JNM) . . teclearnCK exit...dbU._4a~o. ~l_li.:ray(S:.ctLarJ:4YiSJ:"e•• KYSQr..".. tu I . rnysql_select_db().'. ....tille ($Ula • 1IYIQ1. _ . ro . t . MYSQL_NVM!) ech~ "S. . Las operaciones que hemos ejecutado en la pantalla anterior son las correspondientes a ver uxlas las bases de dalos que contiene MySQL. . ... $Gb4)..o¡' er • .....~.... 'J:"oot'. poner activa la base de datos mysql y ver las tablas que contiene ésta. 1. _ ....ql' ¡ III:)"Iql_ ••lect:_..e. ".:es.' _ _ _ __ . puesto que los comandos que podemos introducir en la sesión con MySQL tienen su equivaJente como función de PHP (Iodas estas funciones empiezan con el prefijo mysql-l. ..loo . '''''I. El ejemplo de sesión anterior lo podemos hacer desde un script PHP exactamente igual con las funciones myaql_connect()._. . _ h .. Para salimos de la sesión.. (Sfil • • MYsql_fetch_l:. ''''' .. ..~_~(fdb4). e RA·MA cArfTULO 11: BASES DE DATOS 339 enoontrnmos un progmma cliente (mysql) que nos pennitc hacer la conexión y trabajar inleraclivamente con el gestor: t . . . u Al comando le indicamos el usuario con el que nos vamos a conectar (-u roo e) y que la clave la introouciremos mediante el teclado (...:alhQet.... .. También podemos hacer la conexión al servidor a travé'l de una ¡erie de funciones implementadas en PHP. _l •. ':':QOt') t 4a~aba ••• ...... 11 abow tül •• echo O<br>Tlbla.. en <b>Sbase_datos</b>:<ul>".. .

. En este apartado vamos a simultanear la descripción de los comandos de MySQL que nos permiten ejecutar las operaciones mencionadas junto con la descripción de las funciones implementadas en PHP y su aplicación en la implementación de la agenda del anexo A. modificación.1 Creación de la base de datos Por segu ridad. lendrá como palabra clave una_clave.t Como vemos. respectivamente. el resto de las operaciones se hueen 8 trav6s de la función rnysQl_Query ($seLencla.340 I>HP 5 A TRAVa DE EJEMPLOS CRA-MA echo ·~ll>$til. 11. será necesarlo para realizar cuaJquier operación con el gestor. eliminación. creamos la base de datos agenda y. Excepto las operaciones de conectar. y lodos los permisos sobre la base de datos agenda que acabamos de crear: . As(. que sólo tendrá acceso desde la máquina donde reside el gestor (determinado por la cláusula TO un_usr@localhoat). la operaci6n de crear una base de datos está reslringida al usuario root. 11 -. Por esto. en el código de abajo vemos cómo nos conectamos con el usuario root y.J.c/u1>·. desconectar y alguna más.3 IMPLEMENTACIÓN DE UNA AGENDA CON MySQL Como ya sabemos.¡l. una vez dentro. a continuación. la base de datos que albergará la agenda la crearemos desde el programa cliente rnysql. la cual nos indica el número de registros que se han visto afectados en la operación recién realizada sea la que sea (inserción. 11. búsqueda. etc.3.-rows ( ). Este descriptor es equivalente al usado por las funciones que realizan operaciones con ficheros. las operaciones que podemos reaJizar con una base de datos son crearla. es decir. y dado que esta operación s6lo se realiza una vez._s(. $descr). Muy importantes también son las funciones rnysql_error () y rnysql_errno í) pues nos dicen la naturaleza del error ocurrido y el número de éste. aftadimos el usuario un_usr. borrarla y manipular sus datos (insertar.{OJ<br>·¡ echo ·. la función mysql_connect () devuelve un descriptor de la conexión establecida con el gestor de la base de datos.). borrar y buscar). Otra función que usaremos con bastante frecuencia es rnysql_Affected. modificar.

." -) te .111 .a_' ¡ . 0.u ... ..... las distintas columnas que tendrá Gunto con el tipo de cada uno de ellos). .u "" _ ." ...o" (l • • u d ~)"""""...3. . (1.fr. l....la..._ f. ..1 Tipos de datos de las columnas Los identificadores de las columnas pueden empezar por cualquier letra o número. ..2... y la descripción de qué columnas serán usadas como claves primarias... ~' fu IMI..... 4 .•• _ .... .ch' <l . 011..*.... .. I o ... ... .. .... _ • • _ _~ 1c_ le . 1\ • 11... I . 70'.. .. úr.. Ce_ • _ . .. PRlMARY KEY ( (campo] ) J [DEFAULT valor] (campo)] l. _ ..1> ..1> " .'. además..... . ..... .. Ejemplo: nombre CHAR(SO) .. . La sintaxis si mplificada de la sentencia SQL que nos pennite crear una tabla es la siguiente: CREATE TABLE tabla { (campo tipo [NQT NULLINULL) I AUTO_INCREMENT]] [.. ' ..1' ."'-..= ORA-MA CAPfTuLO 11' BASES DE! DATOS 341 _ ""IH. . II.h .... l4 b .Uf_ lo!I .2 Creación de la labia En la creación de la tabla donde se almacenarán las filas (o registros) de nuestra base de datos hay que indicar el nombre de la tabla. e _ e H.10011.. !'PO . Id.nuu"...... .''' .cQL _ f u . FOREIGN KEY campo (nomb_ind)1) (ON DELETE RESTRlCTICASCAOEISET NULLINO ACTIONlsET DEFAULTl (ON UPDATE RESTRICTICASCADEISET NULLINO ACTIONlsET DEFAULT] l. . '10.. ... U ..... .. pero no pueden estar const ituidos s6lo por números.. Internamente... U r ....... A continuación... . .......... ... .. • tU) ".. resumimos algunos de los di~lintos lipos de datos que MySQL es capaz de manipular: e CHAR (L): Lo usamos para almacenar cadenas de L caracteres. .. ce cJ..... Una columna de este tipo puede lener un tamaño máximo de 255 caracteres.... 1' ... .. )...... ..loa. . .ou. pueden tener una longitud máxima de 64 caracteres... .. te ....... .....3. d) ra.. . -) !<Ioo. UNIQUE {INDEX] [nomb_ind] 11 ... INDEX [nomb_indl (campo)] l.. .... se reservan siempre 255 caracteres.......... ...u .... ¡.. ... . . .

BLOS es un acrónimo de Binary LArge Objec/).147. Dado que hay una parte entera y O(ro real en estos números. o desde O a 65535.294. YY-MM-DD. o DECIMAL [(E. temperatura FLOAT (2 . excepto en que no hace redondeo de la cantidad puesto que almacena los números como cadenas de caracteres (es útil. Los valores que puede tomar van desde 1000-01-01 hasta 9999-31-12 . o DATE: Almacena valores de tipo fecha. si se especifica unsigned. excepto en que especifica valores en comu f10lunte de precisión doble.2 342 PHP' A TRA vlts DE EJEMPLOS CI RA-MA o VARCHAR (L 1 : Es igual que CHAR.D)): Es igual que FLOAT.483.%7. o SMALLINT [unsigned]: Especifica un entero pequeño cuyos valores van desde ·32. enlonces los valores irán desde O hasta 4. Los valores que admite son cadenas de caracteres con distintos fannatos: YYYY-MM-DD.648 hasta 2. La única diferencia entre ambos tipos está en que.D) J: Especifica valores en coma notante de precisión simple.11.768 hasta 32. si se especifica unsigned. TEXT distingue entre mayúsculas y minúsculas mientras que BLOS no. Así.483. [] TINYNT [unsignedl: Especifica un entero pequeño cuyos valores van desde ·127 hasta 128. Ejemplo: edad INT unsigned.D») o REAL{{E.295. o YYHHDD. CHAR es más eficiente en términos de rapidez. por ejemplo.2). excepto en que internamente sólo se almacena el tamaño real del dato.767. para tratar camidades de dinero). o INT lunsignedl: Especifica un número entero cuyos vaJores van desde -2. al tura o OOUBLE{(E.648. se puede especificar el tOlal de dígitos para ambas cantidades.535 octetos (de hecho. D) J: Igual que FLOAT. Ejemplo: nombre VARCHAR{SOj a TEXT I aLOS: Ambos tipos de datos pueden almacenar hasta un tamaño máximo de 65.147. o desde O a 255. Si especificamos unsigned. mientras que VARCHAR Jo es en términos de espacio de almacenamiento. o FLOAT{ (E. Ejemplos: media_ari tmet FLOAT{1. FLOAT. a la hora de hacer comparaciones.

no podrá haber dos registros que tengan el mismo valor en dicha columna. 'viajar ') Al especificar qué tipo de datos pueden almacenar las columnas.. además. a ENUM: Especifica una columna que sólo podrá contener un único valor de entre una lisia. podemos. Ejemplo: aficiones SET('snowboard'. aplica a campos de tipo entero ya que su efecto es. HHMMSS o HHMM. 'casado'. lo usaremos para diferenciar una fila de otra. 'nataci6n'. Dado que este campo es la clave primaria de la tabla. a TIMESTAMP: Almacena valores de tipo inslall/e con el formato YYYYMMDDhlunrnss. AUTOINCREMENT: o Sólo se o DEFAULT valor-POr_defecto: Al insenar una fila. al insertar un registro en la tabla y dar el vaJor NULt. MySQL inde~ará automáticamente la tabla en función de esta columna (esta característica es la que da el calificativo de relacional al modelo de datos. se asignará (a la columna que tenga esta característica) valor-POr_defecto c uando se especifique NULL como vaJor a asignar. 'senderismo'. ya que relacionaremos unas tablas con Otros a través de las claves). No se puede definir más de una columna de este tipo por tabla. para dicho campo. asignar aJ correspondiente campo del registro nuevo el vaJor más grande que haya en esa columna más uno. .. o YEAR: Almacena valores de tipo ano con el foonato YYIT. indicar una serie de características que pueden cumplir como son: a PRlMARY KEY: Si una columna tiene esta característica. a NOT NULL: Un campo que tenga esta característica no podrá nunca asignársele un vaJor NULL. Ejemplo: estado_civil ENUM ( 'soltero'. 'otros') IJ SET: Es igual que el anterior excepto en que la columna podrá tener cualquier combinación de uno o más valores. e RA-MA CAPtruLOI1 : 8ASESDEOATOS 3Jl o TIME: Almacena valores de tipo hora. es decir. Admite los formatos HH:MM:SS.

Ullr· "una_el. le dimos (con el comando GRANT) los privilegios suficienles al usuario un_usr sobre ella. 'lll_llg~"1 Sla_Labla • $dbtrJll)'IIQ1_eonnect "loclllho8t' 'un. esta operación sólo necesitaremos hacerla una única vez.2 Creación de la tabla Comparando con la agenda realizada con ficheros. Entonces.v. $la.2. Las sentencias SQL necesarias son: • El script PHP que habría hecho esta misma operación: .3. la secuencia de comandos es: conectarnos como un_usr. ahor'd.~ PHP.bd • "Ilqanda'. para la creación de la labia. También. en este caso.. hacer que la base de datos agenda sea la que esté activa por defecto y crear la tabla la_agenda. La última instrucci6n que ejecutamos es la de comprobar la estructura de la tabla recién creada.5 A TRA V~ DE EJEMPLOS ORA-Mio a NULL: Son campos cuyos valores serán NULL o aqUlHlos especificados por DEFAULT. Dado que en el punto anterior al crear la base de datos agenda.. como se desprende de la sintaxis del comando eREATE TABLE. basta con crearlo vacío). la única operación que resulta m1s compleja es la de crear la tabla que nos servirá como base de datos puesto que..·' C ' _ _ _ _ _ _ _ _ __ . lo haremos como dicho usuario. tipo y longitud de cada campo. 11. hay que indicar expresamente el nombre. y qué campo será el usado como clave de la tabla (en el caso de hacerlo con ficheros..

~1_..g. $aql' t· .~1IQ1_.O RA·MA CAPITtJLOILBASESDEDATOS 34' i t (I$<lb) d1.<td>$fl.. $dbl) die (' .. 1('): .rTno() II echo 'cr . las situaremos en un fichero aparte (ag~datos. $i. PRltO. La primera de ellas es ta función de establecer una conexión con el servidor MySQL (a la que habrá que indicarle tanto el usuario. Sr.L. (' <h3>'" DROft al ejecutar: I $..$1 .ql. . if (!Sr•• ult~8Ql_QU.1~type(S~.~ftr>\n'¡ .y.. $db)) die ('. Si . como la clave de éste) que nos devolverá un descriptor de la conexión .ndo tabla $l....·CRBAT& TABLE Sla_tabla ( nOfllbn CKAR (J 5) N01' NtIt. C"<h3>o •• ~OR al eonec~.3 Fichero de apoyo Dado que habrá una serie de rutinas que serán utilizadas por casi todos los scripts. <" <tabla borderIl> Si)..'. r $nUIILc~ $n~ca. tlf_fijo CKAR(lO).. correo... t.. ($r . Se.eh).ql_ri..11t·"Y1IQ1_quny(S¡tq1.JlY KIY\nc-bra) 11 • I U' t 1$1"••1.myllQl_errnQ() 1.ECT • FROM $la_tabh'.. • r...yaql_query (' SI!l.... "Yaql_arror () ) . ERROIl al crear la BO.•• ·. Saql.bd. Si ....q1' ('.: Stipo • ~1_(1. CHARt251. ine) que será importado por éstos.. $4bd11 di. haortlOll CI • uta () I toG EQaa1-a ir 11$d!:d1 ~t(·'-JJtoet· .3.gp($r ••• Sil¡ echo '~tr><td>$nombre<td>$tipo<td>Sta. h3>&JlIU)R: . $nUIILCaIIIIPOP. tlf~il CHARtlOJ.. ir (1. .. • ~l_ri.-hd.ry($...ql_fiel~len(Sr .ando l»se da dat:.lda($re8)..po • • ~1IQ1~~fi...· " ~ die I'<hl>·" ERROR al conectar . $f1ag....a .ldlr .leet_4b('aoenda·...rrno()11 ~ ) . 0._bd<¡h»" .('<hl>EaROR: 81 •• 1ecclonar</h»'.01..>'J 11.yltql_. ·: $aql. if (l~ql_ •• 1IRCCdb($1a.1 •• leccionar BD Sl.'1 ¡ echo 'cr.ld_(l. • ~. • ..·CRBAT& DATABAS! $l."....~tabl •••.~ .. $db)) di.<Jb> tiene CUIpOa:<bT> bgeolora'llghtgray'><th>Noobre<th>Tipo<th>Tamafto<th>Opeionea"ftr>\n'I for ._ •• ---.cho '</t~l. echo 'La tabla <b>$l . } I SnoabT. . .. SIl.bl.

au-. y pon.. naee-'tlf~l' v. ¡ ir ('l __ victi..pie_de_vuelta (l que sacará otro enlace que nos llevará a la página principaL t hDot:J.'jav..-.·]!1· DCMI"'r\OIIIbre' val.. ¡tsbl. td.. td>r.... I !om> .l.. • ••l.'text' alze-'IO' ~'tlf_fijo' v.-U.. ( lila ~: agbdLa~l-planeill •• php •• 11...'O'" ...·'$l.... .lue-"el~·~ </tr" . echo '<input typa. td.tbod..<iAPUt type_'text· aize-'2S' e/t" <tp na.'2'><input type. td colapan.._toII( . input type.. __Cl. tr" .r.A.n·" ....»IIP.......i~.. /tl'> value-·$l~~t·..... td"Correo-. ti • • 1a. . .'aubait' . tdl>Cinput type-·text' </tr" <t~ name....l~·" ..php· .. ..1IIa.a.346 PHP' A TRA V~ DE EJEMPLOS Definimos tres funciones más relacionadas con la generación de texto HTML: pinta_entrada_datos (1 que nos permitirá sacar por pantalla el formulario donde el usuario introducirá los datos para ser insertados o modificados en la base de dalas: página_anterior (1 que imprimirá en el navegador un enlace para volver a la página amerior... tl''' .'cor~· ~lue-·'... td"Tel'fonc rijo: .... .e.~ir-plantill ea) acho '<'Ot1ll action··Sel. ( hDati_ ...l'fono móvill . __ y pbp t~ .'hidden· echo' <tabla bor~. td"NOIIbnI: .. .acript:hiatory.'v1ct~ific....eriot'{) echo '''a hrer.c1on' valu... te1.oa plRa_._vict~'''''¡ .lue-·"l_tf'. td><lnput type_·text· aiz"'lO' </t"' <tr" . td> .·get·" .go(·ll '''&lt¡&lt¡volver l l " .aat.

un_valor .• CAPtnn. simplemente. respectivamente). o nombre_da_campo LIKE . los cuales indican cualquier cadena de cameleres.4 Listado de registros La sentencia SQL que nos permite realizar búsquedas de datos que satisragan una serie de condiciones es la sentencia SELECT. hay una serie de operaciones con los registros de la base de datos que nos requieren un listado de registros: para elegir uno de entre todos para modificarlo. incluida la nula. y un solo carácter. para elegir todos aquellos que queramos borrar. la condicion normalmente será una expresión del tipo nombre_de_campo= . En el ejemplo de la agenda que nos ocupa. Por ejemplo. php) la generación de todos estos listados. cuya sintaxis simplificada es: SELECT lista_de_campos PROM tabla WHERE condicion [GROUP BY (campos) (HAVING condicionlJ [ORDER BY (campos) [ASCIOESCJl Donde listA_de_campos indica las columnas que se desean obtener en la consulm (puede ser el nombre de un campo o una lisia de ellos separados por comas. hemos juntado en un único script (agbd_listados. OR o 1I y NOT o !.. No obstante. En la cláusula WHERE.si queremos filas cuyo campo de búsqueda tenga una coincidencia exacta con el valor iodicado. Las cláusulas GROUP BY y ORDER BY nos permiten agrupar u ordenar el resultado.. Por tamo. también puede ser el carácter . para mostrar el resultado de uoa búsqueda o. Obviamente. cada uno de estos liSiados tiene unos requjsitos distintos.reqular' • si queremos encontrar registros cuyo campo de búsqueda coincida con un patrón dado por una expresión regular (los melacaracleres que podemos usar son '. las condiciones de búsqueda se pueden hacer más complejas usando los operadores lógicos ANO o &&.. Por supuesto. " en cuyo caso se obtendrán todas las columnas). el primero debe contar con elementos de formulario de tipo checkbox para que el usuario pueda marcarlos según sus necesidades y. para mostrarlos.. Por este motivo.oll:BASESDEDATOS 3<17 = 11 .3.. no es lo mismo generar un listado que tenga la posibilidad de elegir un grupo de registros para ser eliminados que un liSIado normal de registros: mientras que este último no requiere nada especial. las llamadas a e~le script habrá que paramctrizarlas adecuadamente pues hay que saber qué tipo de liMado debe generar . expresion.. por supuesto. este formulario debe indicar el nombre del script que va a hacer efectiva la eliminación. ." y . tabla es la labia donde se va a hacer la consuha...._".

los datos que obtendremos serán: el lipo de operación a realizar.da.' '¡ $..c. ca•• 'MODIPICAR' : $cabee.. ¡ •¡ br.348 PHP' AntA vlts DE EJEMPI.._bule..· '¡ Sley.g~if-pl&ntill.ak: $cabeeer•• "Ag.~·¡ Intra~ • MOdificar'.'ASC' I iaclu4e{'agbdLdato.05 CI RA·MA y con qué características.ql_qu.bu. foElll.po']¡ $ •• ntiÓO-S_OET['dlr·]1 .car\· '1 S.. .S_CtT[ 'ea..I' .e. .'Ao¡j'.. U • __ loa' • I _l_'-.. BUSCAR' br.eaticio· I $r. {ver!ilion.ra.da!iI • Borrar'J $egl··a. el campo por el que haremos la ordenación de los registros y el tipo de ordenación (ascendente o descendente): ewit. : br_k . blaqu"': • .____________ H ..nda·'Modifie. la cadena de caracteres a buscar (en su caso).'.t.ion BOl: Selecci6n 4.l.fonP'r·¡ $ley. 'WHERB nDlilbre Llk! ·'~. .ql . BOl a Li. ' .. $.· • ¡ $..ql .r.ine'l¡ Sdbd. Intr.bu.' . ..nda..nda·" I Sa_bulca:r.ry($eql.do !Se entr. ~l_. ( •••• autoR ano l.pbp'¡ $. 'LISTAR' I $eabee. Así.·eonectatlJ S-ql. k¡ echo ·<titl. ·J ' e_.bu..:r..'Agenda (ver. ' Borr....>$~e.11. En la práctica.y..r.. I br. programa expresaremos esas particularidades en forma de valores dados en el QUERY_STRING..'SIIU..rw' .nda (verlian BOl: Se.ión 801 Seleoc:ión 4. $dbd)¡ 11' (I$r.l-.<ftitl.rw· .ak¡ : bdlqu~ ( c•• .nda..r l '¡ S.rrorn .~rr. $egi. · ·¡ $.r.r I S.'. esto significa que en las llamadas a este ..> </bead> <body> <hl>Seabecara</h2>'¡ ir ti ••atIS_GET['caapo']II ( $c&mpO_ord.lelllLfOElll"· • ¡ $ley. di..l __ fo~'c·.en) S.." 'OItDItR BY (Sc~_o~) S.. ea_ • 8ORRAJI. { Sea-pQ_ord.' I Scabecera·'Agenda: {ver.i. 'nombre ' ¡ $ •• ntido.ICT • 1'roa l __agenda • ¡ (S--.a. ea l • •genda': $egi. $leyancSe ..·'_OET¡'a-bUlear'] I de regiltro.

. N~ v 6 . el nombre del programa que va a traJar los datos del formulario (si es el caso). 'agbcLmocUC.. 'r ' .. el tipo de elemento de formulario que aparecerá (checkbo:r.~ Jlh.• .niIV J.40I$r••• $egi~ $~. LISTADO ' ..... .. 'MODIFICAR'.11 Arm4r. I ..~IjI.plantilla . $leyena. 17fq IllI ~~ pepe~QOIII ••e~"". $4. r(ldio o nada) en la primerJ. o un listado del resultado de una búsqueda.• = CRA·MA cAPf11JlO 11: BASES DI DA10S . V' ..~.. haga la impresión del listado....6 .pc_?8l6~..php'. . 'Modificar!'. llamamos a una función que hemos declamdo en el mismo script (con el nombre pintA_listado (l) para que.. la leyenda que aparecerá en el botón de tipo submit que efectúa la llamada al siguiente seript PHP (si es el caso) y.... MODIFICAR O BORRAR)..J>w¡e4l 1. cuyo resultado seña: A&enda (version BO): Listado de entradas en la a&enda ..6... ). . Esta función está definida con los siguientes parámetros: Los parámetros que hay que pasarle son el cursor donde están los resultados ele la búsqucd" realizada.a_listado (Sres. tlif911 a2¡2 ~:m yolrp . 2~ 3 pepdo • I~ hIetII@I. una vez unidos los distinlOS valores y hecha la consulta a la base de datos. llamamos a esta función de la siguiente manera: pinta_listado (Sres. ..... Se1eILfona. OC"" La llamada que generará un listado de todas las entradas para poder seleccionar aquella que queramos modificar será de la siguiente manera: pint. Entonces. '¡¡¡IZ "+lia..... BUSCAR. con el resultado de la consulta..y generará: . para generar un simple lis tado de ¡odas las entradas en la base de datos. si es que la operación es de búsqueda.clon. por último. Por lanlo.V. columna de la tabla." ).\49 pin~ll~t... la cadena a buscar. " . . el tipo de operación o listado a realizar (LISTAR.

...'" _ """C """-"''''' ·~. la llamada a esta función para obtener el li stado de aquellos registros que contengan una determinada cadena en el campo nombre..- Por último.. b _ _ lIIIIit .. _ ._r.. " .350 PIIP..s A TRAVru.'9'6 . 'BORRAR' . 'ito ')yla pantalla que obtendríamos: • .-_ LIJ 7 •• - le. y la salida: ... En este caso. php'.-"'. . . .. .. DE EJEMPLOS CI RA-MA Aleada (venion 80): Selecd6a de Eauadas a Modlftcar Para borrar registros....n.. 'agbd.. 6.. • n. por ejemplo. .-borrar.. . Borrar 1.-. la llamada a la función seria pintlLliatac10 (Srea.. 'BUSCAR'...... 'ito'. ..seriapinta_listado(Sres.110'...-".. al usuario se le muestra un listado de todos los que hay y asf pueda seleccionar (mediante checkhoxes) aquellos que quiera borrar.. ").. ' ... •• . .\&eada: (versl6b BD) Seleccl6n de Eatrad. 2(':__ n. 'Borrar!'. J' . "..... " . 'e'.

_~--' El código correspondiente a esta función es muy sencillo... $i<countl$r-.or. $bot_a.. ./u"'cJh4:o'¡ whil."¡ Sin~colcres \2 2..· : br.lfle" 'victi~$cont_ lineas' value_' SV81or''''. $IUI'iLcol.cOI ( global $CUlpOS. . 'cu.ble>": if ($eglol ec!\o '<forDl act. bmit.ion='$e<¡¡:i {$buKoI seno • .. .. l i". ' lo: '111' . . delault SaifV-col.. MYSQLJ.~_~ . _ _ .:cccc'.'!I)1.ena de bo..ore••OI Sccnt •. ... ....~~~~ .' <input t~-' checkbox' nll... ' $'valor'. h4>cad.. . . $cgi.hO -<!:d>o $reg{$Cill\C)QelSl)1 '</t4:>·' ~~~_~_ _ _~~_ _~~__ • .ak. Saaog_col_' <input type.. . $.¡J. ...cti_' val._. foro ISi.. ..\. ' • IfQS •• :v&i.$req('n~r. .O. ct~$Geo_col</td . básicamente se lrata de imprimir una tabla HTML donde cada fila se corresponde con un registro y tener en cuenta el upo de elemento de formulario que se va a imprimir para la elección de registros: function plnta_listadol$cursor.r..".__ 011. "caso... &bu... $operac..aQue<1a: _thod"·post ''''.. .. break.SSOC») ( Sin!s'-eOloraa.witch($ele~torm) ( ca •• 'c': $valor_Sreg{'nombre'). .... ')..·'.-white'''$cont_lineaa</td.de lutu· y bu.. echo -. H '<\I"Sbuseo. ..' radio' nlllMl".'I.. lIIY.CI RA-MA CAPtnJLO 11 : BASES DE DATOS JSl A¡enda (venion BD): busqueda de reeistros ea-.ql_fetch.. ($reg .....n(C.=ay (Scu.•• l l ~ho 'llghtbl .) l . S1.'vi. ·. 2~ 1. JI'. Scolor __ fila ••array(' Icc. tr bqcolor-S(coloree_filas[Sind_coloree)I"'¡ .e8r echo "<td bgCQlor. .. $el~form. C8e8 'r': $valor.

3. j . un grupo de filas almacenadas en una estruclUra interna de la que habrá qutH:xuaerlas con la función. desde la función pinta_listado () llamamos a la función pinta_cabecera_tabla () la cual lo que hace es imprimir la cabecera de la tabla con los nombres de los campos y un par de iconos que representan la ordenación de los registros en función de esos campos..aqenda.ac-arl $aql .tcbo ) En el caso de una selección de registros..ubcdr..-ctr:>o .. pero en orden ascendente o descendente: De nuevo.. la devolución de la consulta se hará ordenada alfabéticamente en orden ascendente (ASe) o descendente (DESe). pondremos como segundo parámetro: MYSQL. • ypea'..4.'t . ~nput . l . S... TIPO-ARRAY) Si queremos que nos devuelva las filas en forma de array asociativo. Sbot.. 11. es decir.. mysql_fetch_array($recurso. respectivamente..=. 6 > . ftr> _ ·. td colllpan. MYSQL_NUM o MYSQL_BOTH." I if I$cx¡¡' ech:.. Como vimos anteriormente._ "Cl!WER BY I$CallClO_or41 Saent. vemos en un extracto del código mostrado anteriormente cómo construimos la orden de búsqueda o listado de registros: $lql"'SELEC'I' * ir. numérico o con ambos tipos de índices. Por esta razón.' valu.. lo que devuelve la función mysql_query () es un recurso o cursor. esta operación se simplifica enormemente pues la operación de ordenación no tenemos que implementarla nosotros ya que la sentencia SELECT 10 hace por nosotros._ "1IoIHERE nOlllbre LIU "Sa bulcar\' ". con respecto a la búsqueda en la base de datos con ficheros.ASSOC. tr:>o" Scon~ lJ. • ¡ lf C$aJ. gracias a la cláusula ORDER BY (campo) tAse I DESel.~.w'-it .. 1 .1do" ¡ . ..1 Ordenación de registros Como se podrá observar en el código anterior.- & 352 PIIP5ATRAV~DEElEMPLOS CRA·MA } echo ".

cm ( pint4~ <:abecllrll.gif" border.campo) ( 'PHP_S~' $pratijo • '<s href.3. SsufiJo_arriba •• <~ erc.: nua.dir-DESCSparalll' >'.'C'>«II>".·1oper. Por este motivo... da $pllram··'s_buacar-Sop2"¡ ) al . Sop2) echo ". functl. . ( ) torMch {SCSmpoll $11 Sun. como es el caso.S_SERVER( • J ... ejecu tar la operación de borrar sobre aquellos registros encontrados)" .gif' border_'O"><fa>". Seufijo_4bajo • "<i-o erc-'down. necesita para ello conocer los datos de la consulta. En el caso del ejemplo con ficheros se podría mostrar los registros de manera ordenada puesto que podrlamos ordenar el array donde leramos los datos. • ·SpreUjo¡.Sop. ) 11. . sintaxis simplificada de la sentencia del lenguaje SQL que nos permitirá borrar filas de una tabla de la base de datos es: DELETE PROM tabla WHERE condicion Donde la cláusula condicion es idénlica a la que indicamos cuando hacemos una búsqueda (borrar implica hacer un primer examen de los registros que cumplen la condición indicada y. ir ($*2) ( I( 2 cal~. la hemos declarado con dos parámetros que se corresponden con el tipo de listado y la cadena de búsqueda.f .• CAPfruLOII:BASESDEDATOS )SJ • Dado que la función pinta_c:abec:era_tabla () genera los enlaces para obtener el mismo listado que tenemos pero ordenado por Olro campo y/o en otro senlido.blljo ·$pretijo'di~ASc:$param'>·r . fonqulll'U' .. esto es. El problema eSlarla en las operaciones de modificar y borrar.c4mPO·$u~ampo·: $pref_~.5 Borrar un registro La.. acto seguido.'up. puesto que se basaban en la posición que ocupaban en el fichero y no en el nombre.tr><td></td~<td>< 'td>' . echo '<th> Spref_&rribaSeufljo_arriba $un_&&mpO Sprllf_srclba $pr.oSaufljo_4bajo</th>': ..r4cion ~ a1 .-' ab14 (Sop. el tipo de listado y la cadena de búsqueda.' '.

el nombre del script que hará efectiva la eliminación es ag~borrar.gbcLdato•.nt.r IIIntrad. strlenISsql)-3)¡ 1/ quito el ultimo 'OR ' $dbd • conecta!) ¡ Su• • IIIYlllql_query($lIql.aTl: nOIf lB_agenda nn:E . '~bd. el cual generará un listado de todos Jos registros de la agenda llamando a la rutina pinta_listado (J de la siguiente manera: pint __ liltado (Sr. llamamos al programa de listados: agbd. inc") : if IcountlLGIiT) . cuando borramos.-D&t. • 8<lrro\r 1 '.'checkbox' </td>' I brellk I ~_'v1ctiMa$cont_11n. se genera un formulario con casillas de verificación (checkboxes) para que el usuario seleccione los registros que van a ser borrados.<1> <title>Avenda: 8orn. php'.NO ha lIelec:cionado ningún revistro ~ril borrar C. O) ( •• ql. lo que hace esta operación más fiable. ?.lll (vlllrllliÓD BOl: Borrllr ent..¡h4>"..3M PHI' S A TRAV~ DE EJEMPLOS CRA-MA En la agenda. lo hacemos por el nombre de la clave (que es única) y no por posición (como en la agenda implementada con ficheros). . Mostramos un extracto de la función pinta_listado! J para ver cómo se generan estos elementos de formulario. • <td> <input type.. 'BORRAR'.my8ql_ilffect~ow8($dbd) : IIIcho '<h3>Borradol <u"$total_victi~s</u" registros </1'1)"': el l.tr(S. php: <htal> <1'1. puesto que es imponanle conocer cómo es el mecanismo por el cual se seleccionan los registros que se van a eliminar: awitch($tipo_IIIlem-form) ( cale 'c': Svalor_Sreg ( 'nombrlll' ) ¡ SehllL.valor' OR ".. I ec:ho ·<h4. •• I • Como ya sabemos. ~gina_. .form .. c'.ql.B. Como apreciamos arriba._"$valor) ( $lIIql •• "nombre_'.-listados?op:::BORRAR. fore.borrilr. ) Saql_$ub. O. $dbdl: $totlll_victimes.ch '$ OCT B • • clBv.rad. .as<Ih2> <?php include I '.riorl)¡ ~ie_de_vueltilCI. •• ' ••lu•• '$valor'" Es decir... <1'I2>Agend. para borrar registros.as< 'title> </hud> <body.

Svic~ima·S_C!T('victi~·J¡ ""_"tr". .-aneariorIJ.l.ELaCT • n<- l&_agaDda WDII..tDa· .. (l . J I A continuaci6n.. el j'cripr agbdJl\odif--plantilla... ( 'nolllbre' 1)' 0$ {campos ( •C'orraoa' ))" ·S{campoa['tlCUjo'JI'. • $victi.6 Modificar registros Para realizar la operación de modificar o actualizar datos.gtin X"eg-istro par" III04ific"r</h4>0¡ "". MODIFICAR' • 'agbd.. BASES DE DATOS ~SS 11.flodif. 'modifica! • .lI1 t I $campoa~myaQl plnta_entrada_c!atoa (-"gbdJhQdiUcar php' fetch arraylSrea.. php'. Sras • H ~y$ql querylSsq1 $dbdl ~sq1_errorLI¡ II Sreall echo •••• ERROR en el SEL!CTl " pon_pie_4e_vuelta(l.. .. " .ecior~r elementos para SU ~flc.E Dc...br..! seleccionado nir. 'Modi ficar! '.3.gl pon-Pla_de_vuelta()¡ exit. HYSQL_ASSOC). • S {campo. por lo que la generación dellisLado de registros será: plnta_Uatado I $res. $dbd • conecta!}.• = ORA·MA CAPITuLO LL. seleccionar registro para </h_d> <body> ~ificar1o</titla> . 'r'. [WHERE condicion] La operación de modificar un registro la hacemos en tres pasos: primero ejecutamos ag1><t-listados?Op=MODIFICAR.c16n< h2> ir IthsatL$_GE"l'!'victilll4']» ( echo "<h4>NO h.. poI\Jl1a_de_vuelta J. php (expuesto abajo) mostrará el conten ido actual del registro seleccionado para que podamos introducir los valores oponunos: <bUll> <head:· <titla>Agenda. 'aql • ·. SQL proporciona la sentencia UPDATE.. I <hl>~. cuya si ntaxis simplificada es: UPDATE tabla SET campol=vall. ·SLcllIIIPOa(·tlfnovU } °1 pagi".lant lUa.nda Iverstón SOl S. e._' Svict~··. .

Yic~t.<th2> c1php $nOlllbr.1a I t..'.a~flc.i t l. po~i..do <u>'.. no será necesario comprobar lo que ha teclado el usuario en el formulario previo..J ._·~ $~e •• ey.. el campo no~re no pueda •• tar vacio<br>")¡ inc·).ql. br>·1 11.~lt.(I. tlf~il·'Stlf~11· ~.brol·.nodiHclldon' J. . __ . .it¡ • G'. la lista podrá tener cualquier orden e.156 PHP ~ A TRAV~ DE EJEMPLOS ORA-MA Por último. co~.".php y su contenido es el siguiente: <htlll¡..d> <ti tle>Aganda.¡)ie_de_vuelt.IIIIII.ql. '. Este script se llama agbd.n(trt. t···· • S_GET [ 'nombre' I ¡ ERROR.. $corr. !JQOvil'J. la lista de valores deberá conlemplar a todos los elementos de la fila en el mismo orden en que se declararon cuando se cre6la tabla.a(J. lneluóel·ag~to •. campo2._fijo'. :~l. • .bn.3.Jflodl'lcaclon POZl.oho 'Modi flc. el scripr que hace efectiva la modificación también se beneficia de la carncterísuca de que el campo nombre sea clave primaria (será imposible introducir un campo repelido pues el gestor generará un error) y de que.~ 8ft ~.)~C... /u" pO~ie_de_vuelt.:l . valor2 •.q:l.($nQmbrcll~~OI echo lIudtl ) pagina_anterior.Ql_erf. ex.lta[). iE (. Svietll11!1."> ·/b_d> <bo<:!y> ch2>Agenda (Yersión 80): HOdilLeaci6n óe entrada.JD01.·$nc:.. ..tro .·. )1 VALUES (valorl.._d •• vu. al igual que en la opertlción de insertar d:uos.uali::ar $v!c:tlme.c4lcion '"' S_GEIT[ 'victi.. S_GEO[ .ifl..~\1PDAn l .. Modificación dI!! ent:rao. my8Ql .qu..ql H .• ·nc.ry/$. En caso de indicar los campos a insertar.lIIOvil ...nodificar .oe r S_G&TI eo~~_' J ¡ $tlf_fljo ~ S_GETI tl'_fijo'1/ $tH.go=--'..affec:ted.7 Insertar registros La sentencia SQL INSERT presenta la siguiente sintaxis: INSERT INTO tabla [(campol.. $dbc1_conectll (J . al no existir caracteres no penllilidos.. ) Si no hacemos uso de la parte condicional en la que se deben indicar los nombres de los campos a insertar.rowa (J. .ciOD'·.~h.. .. ~... SdUdJ I! $1'•• 1 i echo •••• BIUtOR al Ilct. ~lf fij_'.trl.

nterior 111 ponJIi •• ~e •• ~ v. TEXT.br. VARCHAR. CIC. .ql. donde tcníamos que programar una rutina específica para asegurarnos de que no imroducfamos nombres repetidos. if C.iste el concepto de carácter delimitador de campo. " :s.oorr. siempre teniendo en cuenta que se asociarán los valores 11 sus respectivo!. al insenar un valor de tipo cadena de caracteres (CHAR. '.. Lo único que tendremos en cuenta es recoger adecuadamente los valores introducidos por el usuario en el fonnulario previo e introducirlo en la base de datos: Snumbrf! ~ S_GBTt 'nOlllbre'1.trlenlu:i..H $corr_ "S_GIIT[ 'correol!' J ' $tlf_fijo • S_GETf'tlf_fijo'li $tlf.a($noM>re11"...¡ 'flobd_d. '. éste hay que englobarlo enlre comillas. Existe una segunda forma aJlemativa de la sentencia rNSERT en la que los nombres de las columnas se especifican expresamente jUnio con su valor. $dbd): ($raa) ecno 'Aftadido " ~sql_flffl!ct~row&( ..'.. el gestor hace este trabajo por nosotros: nos impedirá introducir claves repetidas generando un error que tendremos que capturar y mostrar al usuario para que tenga noticia de ello.n4a VALUBS ('Sno..:rvll LGET { 'tU JIIOvil ' 1 ¡ includ. puesto que no ex. al haber definido este campo como clave primaria.ato. $dhd .).clcoeb.• O RA·MA CAl'fTuLO ll' BAS~ DE DATOS .tltJlllOVil')· . con MySQL no hace falta preguntar si está duplicudo ya que. INSERT rNTO tabla SET coll:vall. Lo que sr hay que tener en cuenta en ambos casos es que. inc'. U $uJo IIIYlql_QUery(S.oe'. conecta(l¡ ¡ I •• Ql··tN8ER~ ~NTO la .O) t -=00 ( •••• ERROR: el CoUlPO IlOIabrl! no ~ol".welta ( : e.ag. no incluir algún campo. tampoco tenemos que comprobar que el usuario lo introduce en los datos del formulario. Además..IH incluso. co12 =va12.. campos siguiendo el orden en que aparezcan estos últimos .tlt. A diferencia de la agenda del anexo.. ' .tijo'.

&C'r coo-r¡. cuya sintaxis simplificada es: ALTER TABLE tabla [ (ADO campo tipo [FIRSTIAFTER campo]] [ADO PRIMARY KEY (campo l 1 (CHANGE campo_ant campo nuevo tipol (DROP colJlamel (DROP PRIMARY KE'i) (RENAME (T01 nomb_tabla_nuevo] . Por tanto.ql_f.</t1tl. podríamos hacerlo con la sentencia SQL ALTER TABLE.StotaliO!.y. 0< ~i. averiguar el número lotal de registros lambién es muy sencillo si hacemos uso de la cláusula COUNT: <htAll ~ <head> <tit_.) tn.. e MIN (campo) : Devuelve el valor mínimo.-av-ftCSa".>A¡anda.J58 PHP 5 A TRA vas DE EJEMPLOS CRA-MA 11.ad> aqcnda<Jh2~ <h2>Aqenda \ver81ón BOl. Total da <bod.X [J (campo) : Devuelve el valor máximo. $(Uld-con. $totel-.dato.-aql . regilltroe en al ~Ilnda.n le <1php inCludeC·agbd.).y~ regi8t~O.erreyISrelll: ~ho ·<h4>Totlll d..ltll() ¡ u~</h4>": ._ine' 1.tch.> 11.... MA... COUNT (DISTINCT campo 1 : Devuelve el total de fijas seleccionadas sin tener en cuenta aqueUas donde campo esté repetido..9 Modificar una tabla Adicionalmente.3. <u>"._d. 18.ctalll fr • • • . Total &8 registros ...> </h.. '4bd.. si en algún momento necesitáramos modificar la estructura de una tabla de nuestra base de datos por la razón que fuese. QlWry( "BI:t. [J AVG (campo): Devuelve la media aritmética de campo.3. ): Devuelve el tola! de filas seleccionadas.._vu.8 Tolal de registros Paro mostrar el total de regish"OS que hay en la base de datos usaremos una de las funciones agregadas que tiene la sentencia SELECT: e [J COUNT ( .

RELQAO. UPOATE y DELETE) Y para definición y gestión de datos (ALTER.4 SEGURIDAD EN MySQL 11. cada vez que recibe una petición. comprueba que. este superusuario no tiene palabra clave asignada. CREATE. SHUTDOWN y USAGE). MySQL permite asignar privilegios para cada una de las operaciones básicas del SQL para manejo de datos (SELECT.1~9 Por ejemplo. GRANT. PROCESS. etc. suposición que no es necesariamente cierta en el caso de la agenda implementada con ficheros. por lo que es urgente asignarle una (por ejemplo. en el siguiente código vemos cómo haríamos para añadir una nueva columna en la agenda donde introducir la fecha de cumpleai\os: L' • Hacer más grande el campo de la dirección de correo electrónico: Eliminar el campo destinado al teléfono fijo: Cambiar el nombre a la base de datos: Gracias al empleo de una base de dalos. borrado. el usuario root es el usuario que liene todos los privilegios sobre la base de datos completa. FILE. DROP.4. como el equipo desde que se realiza la conexión. 11.) tiene el usuario para realizar qué operaciones sobre qué tablas. clave_del_root. tienen permiso de conexión a la base de datos. Es decir. INDEX. realizar una modificación en la estruclUra de la agenda no supondría mayores problemas para reflejarlos en los scripts. MySQL comprueba qu~ tipo de privilegios (lectura.1 Usuarios MySQL. REFERENCES. El problema es que. escritura. tanto el usuario (reconocido por su identificador más palabra clave).-O RA-MA CAPtruLO ll' BASES DE OATOS . una vez permitido el acceso a la base de datos. nada más instalar el paquete MySQL. Además. Como ya se ha visto a lo largo del capf[Ulo.): • . INSERT. y tal como está diseñada la aplicación.

esta situación no es la ideaJ desde el puniD de vista de la seguridad: por defecto.) y alta que nos permitirá gllardar la base de datos de la agenda: ~y.t~·localhost· mysql> DELBTE rROM user WHERE myllql.sql Otra forma alternativa de guardar la base de datos consiste en aprovecharse de la estructura del árbol de di rectorios de MySQL: debajo del directorio da ta. C.qldump -q -uroot -proot ·-all-databeaea ~ todas_laa_bda. Obviamente. esto es. estos usuarios tienen privilegios sobre toda la base de datos. Además. M'iD'.. bastará con hacer una copia del directorio que alberga la base de datos deseada.. FRM que contiene la estructura de la tabla. root -p reload 11 . por cada base de datos crea un directorio con su nombre de ésta en el que encontraremos tres ficheros aten vez con el mismo nombre pero con extensiones distintas: -.4. por defecto. el comando scripts / rnysql_inst:all_db establece una serie de medidas que pueden catalogarse como de pmdemes.2 Copias de seguridad Como todo buen administrador CODoce bien. sin especificar ningún usuario. El comando en cuestión se llama mysQldump Y la salida que genera son los comandos SQL necesarios para regenerar la base de datos completa (creación de las bases de dutos.aql -q -uu~uar -~_clave --óatabB. Por tanto. MYI. para los datos de la tabla y •.. cualquier usuario puede realizar cualquier operación sin indicar palabra clave alguna.~~ agenda> agend4. en Wiodows no existe tal comando y. es recomendable (y prudente) guardar una copia de respaldo de la base de datos cada cierto tiempo. se permite la conexión de usuarios anónimos a la base de datos. tablas e inserciones de filas).qldump ~. .p = • J60 "IIP!'i A TRAVés DE EJEMPLOS O RA·MA Mientras que en Unix. impedimos los accesos anónimos desde la máquina donde está instalado el servidor. ex! t CI\>\mysql\bin\mY8QladBin ~u ANO crser_". Este programa tiene multitud de opciones de las cuales sólo comentaremos un par de ellas: la que nos permite sah'ar todas las bases de daLos de MySQL (paro ello habrá que ejecutarla como root. fichero que contiene los índices (información sobre las claves y otros datos que MySQL usa para las búsquedas).\~\my8ql\b!n\MY9ql -u ~oot -p Ho. Por este mOlivo. MySQL nos lo pone muy fácil ya que nos proporciona una utilidad que nos permite hacer esta tarea de una manera muy sencilla. .

.. Id ... SQLite es una libreña e que implementa una base de datos SQL empolrnda.!) paro el desarrollo de aplicaciones PHP que trabajan con bases de datos. Su código fuente es de dominio público y puede ser utilizado para cualquier propósito.. En su lugar se ha optado por incorporar por defecto la extensión para trabajar con bases de datos SQLite. ... NOTA~ Parll obtener mM Infonnación ~ saUIe MI puede AlCUmr a la dtreoci6n I ...lI 11. IIVO 2U11I:1Dlll.CRA·MA CAPtruLOII _BASESDEDATOS JOI .. Isolll1ed. de forma que los programas que trabajan con esta libreña pueden acceder a bases de datos SQL sin necesidad de trabajar con un gestor SGBOR externo. COlIsistellf.. tmp¡ttwywg !SI!te ore!. Toda la base de datos (tablas.41G:!. Durable).... Entre sus realizaciones destaca: • • • Implementar casi completamente el estándar SQL92.) se almacena en un solo fichero en el disco.. como ocurTÍa en el caso de MySQL: es en sí misma un servidor de bases de datos... I . índices . Permite transacciones ACID (Atomic... • • Es dos veces más rápida que PostgreSQL y MySQL en algunas de las operaciones más habituales.. 1M .u ld . debido a problemas de licencia de utilización no forma parte del paquete por defecto de PHP 5..5 SQLITE A pesar de que MySQL sigue siendo una de las opciones más utilizada. Soporta bases de dalOs de hasta 2 lerabyles. SQLite no es una librería cliente utilizada paro conectarse contra un servidor..

sc. Por ello suele sc.0"' . • Tiene el mi smo runcionamiento que la runción anterior. Devuelve un manejador de la base de datos o false en caso de error.. . . el valor 0666 en octal). 1 L. 11M ~ aft8mdva.. sqlite_next(). o Esta función almacena los datos recuperados en un buffer intemedio. Devuelve false en caso de error. ~ .¡lite_current(). utilizarse conjuntanleme con las funciones sqlite_rewind()..5. devuelve un cursor asociado a los datos recuperados o true.. pennitiendo de este modo el acceso aleatorio a los mismos.. En caso de sólo necesitar acceso secuencial a los datos es preferible utilizar la funció n sqlite_unbuffered_QUeryO que se comporta de una fonna más óptima por no hacer uso de memoria intermedia.1 Interfaz de SQlite Las funciones proporcionadas por PHP para lrabajar con SQLite se pueden dividir en diferentes grupos_ Estas primeras nos penniten las operaciones básicas de apertura. mensaje): Abre la base de datos indicada por la cadena bbdd. 1 NOTA: P.. En el panimetro opcional mensaje se puede recuperar el posible mensaje de error generado en dicha acción.mt. consulta): Ejecuta la consulta SQL sobre la base de datos referenciada por el manejador bbdd.¡li te_seek ( ). modo. y sc. modo.rows (). o sqlite-popen(bbdd. creación y cierre de una base de datos: o sqlite_open(bbdd.362 PlIP' A TRAV~ DE EJEMPLOS CI RA-MA 11. mensaje): o sqlite_close (bbdd): Cierra la base de datos asociada aJ manejador bbdd proporcionado.. En caso de que la consulta sea correcta y dependiendo del tipo de operación que se haya ejecutado. con ob'M ~ como M CMlNndo de orden 101 . en caso de no existir la crea. El siguiente conjunto de funciones nos penniten realizar consultas SQL sobre la base de datos: sqlite_query(bbdd.. con la diferencia de que devuelve un manejador persistente . P'opo!~. compeIibIeI.. El parámetro opcional modo nos pennite indicar el modo de aperturo de la misma (por defecto...¡lite_nUll\.

La siguiente tabla muestra los diferentes tipos de arrays que se pueden obtener: tlPO_lrrlY descripd6a AlTay e&Oeiativo cuyo. Las funciones sQli te_seek ( ). BOLZnJoBIIOC columnas rectJpef8da. decodificar): Devuelve una cadena con la primera columna de la siguiente fila del cursor proporcionado.¡lite_current (cursor. D sc. tipo_srray. es decir.IOf'B' coIUfOOU rec:uper8du Amy con [ndices numilricos y con los nombre. consulta. decodi ficar) : Es idéntica a sqlite_fetch_array() con la única diferencia de que no avanza a la siguiente fila antes de devolver los dutos.ORA-Mio CAPtruLO 11: BASES DE DATOS 36~ consulta): Realiza la misma labor que la función anterior. en el que cada entrada es a su vez un array asociativo con tantas entradas como columnas o campos se hayan recupeT'Jdo. con la diferencia de que los datos devuehos sólo se pueden acceder de forma secuencial. [J Bqlite_array_query(bbdd. en ellas el primer pan1melrO no es un descriptor de conexi6n a la base de datos sino los datos sobre los que vamos a tmbajur: [J sqlite_fetch_array (cursor. .. Se puede indicar el tipo_array del array devuelto y si se debe o no decodi ficar los datos que aparezcan en binario. decodificar): Ejecuta la consulta SQL sobre la base de datos referenciada por el manejador bbdd. Q sQlite_fetc~9ingle . la primetll columna es le O 8OlJ~""JIUfI El siguiente conjunto de funciones nos permiten trabajar con la infonnación recupeT'Jda desde una consulta SQL. sqlite_rewind (). y sqliteJ1WJLrows () no pueden ser utilizadas con los cursores devueltos por sqlite_unbufferecLquery ( . de la. En caso de producirse un error devuelve falseo Se puede indicar el tipo_array del array devuelto y si se debe o no decodificar los datos que aparezcan en binario. devuelve los datos de la fila actual.. en la consulta SOLZn_ . [!\dices son los nombres de le. (cursor. sqlite_next (). Alrey sólo con Indices num6ncos a!lOdedos a tal c:oIu!'I'Ir\n recuper. decodificar): Devuelve un array con la siguiente nIa del cursor proporcionado. tipo_array. Es especialmente útil cuando trabajamos con consultas que sólo devuelven una columna de dalos. tipo_arrsy. sqlite_current(). [J sQlite_unbuffer~query(bbdd. en la consun. Devuelve un array escalar con tantos índices como filas recuperadas.aas por la consulta. Se puede indicar ei tipo_array del array devuelto y si se debe o no decodificar los dalaS que aparezcan en binario. tipo_array.

:1) CHAJI(30) El scr ipr es el sigu. índice): Devuelve el nombre de la columna o campo cuyo índice se proporciona. R. a sqlite_nUlTLrows (cursor): Devuelve el número de fila s almacenadas en el cursor proporcionado. a sqlice_field_name (cursor.". tipo_array.. a sqllte_oum.. Q sqli ce_changes (bbdd): Devuelve el número de filas que st modificaron en la última consulta ejecutada sobre la base de datos referen<:inda por bbdd. Se puede indicar el t. CRA1I(30) FLOA'l'( B. A (font: 14px "...ien!e: <HeAD> <TITL!>~ab&)lIndo con SQLite<JTITLE> <S1'YLE> TABLa..anospoce·J P Ifonl.1i funciones para recuperar la información almacenada en la base de datos (pruebas_sqli te.tock en almacén. El siguiente ejemplo muestra el uso de algunas de esta. No funciona con los cursores devuletos por sqlite_unbuffere~query ()... "SCRIKION 9UCIO 8 . <"""'> earnDO Estructura SJIIALLIN'r UJlBIGlaD Daerloc16. tipo_array. Pr ecio en Euros.ipo_array del urray devuelto y si se debe o no decodi ficar los dalQS que aparezcan en binario. 12px "\lerd4na': color: red.eferencia de la pieza./S'l"YLE> < 'EA&> . o sqli te_colurnn (cursor. P.fields (cursor): Devuelve el número de columnas o campos recuperados en el cursor proporcionado. decodificar): Devuelve una cadena con la primera columna de la fila actual del cursor proporcionado. Oescripción bAsiclI de la pieza. Es especiaJmente útil cuando trabajamos con consultas que sólo devuelven una columna de datos. Información .364 PIIP . db) cuya una única tabla (tornillos) liene la siguiente estructura: . decodificar): Es un alias de la función anterior..~ . J . o sqli te_hasJlIore (cursor): Devuelve true si quedan más filas que procesar en el cursor proporcionado o false en caso contrario.obr • • 1 .5ATRAvé)OE EJEMPLOS o sqlite_fetc::h_string(cursor.

. .. 0666..f. sqlite_OPenl"pru. .<O~ roy ( $d4t. El resultado se muestra en la siguiente imagen: 1 • 'u. echo cTR BGCQLOR"')"IIl1ow'''': forfSi. nUllLf ila ): Pennile situamos nUllLf i la deseada de) manejador de da tos proporcionado.B>$pieztl ( 're!' ] </B></TO>' ..qlite~s~r.s aqlite_QUery($bd. eoho '<TO>$pieza ¡ 'c\esclripclon' 1</1'D>'. echo '<TR>'¡ echo • <TD>..I. . SOl..01$i<BQlite_n~fi. "... echo ) aqlit~clOA. . Dlngun reqiatro</P>·. . Il.. '</TO>'/ echo • </TR> ' ¡ whil.")' CELLSPACTNQ-"O'>'.($dat08lf ir($n~[il •• I. . ) echo "< / TABLE>'.bas_sqlit •. ellle ¡ echo"<P>La consulta no devuelv.a....</P>·..8qlit.. . echo '<TO>$pieza( 'precio' 1</1'0>"/ e<:ho '<TD>$pieza[' stock' J c/TO>': echo '<I'!'R> ."._flel~~me(Sddto •• $i).-O RA-MA • CAPtruLO 11 BASES DE DATOS 365 ". .. ~ ~J~JlI~ • a• • Trabajando con SQLlte • ---~ -- .. .I$bd! '<P>Recu~r8doll Snun'Lfil.8 r""heto¡a.:.. db'.. n ".($dotoB)11 ~pie za_sqli... .Ol ( R echo '<TABLE BORDER~'l~ CELLPADOINQ...')r • •qlite_n~rOW.ASsoc. en la El siguiente conjunto de funciones nos pennite movemos por los dalas pre<¡entes en los manejadores devueltos por la función sqlite_query () : [J sqlite_ seek (datos.....: I .$i··)1 echo · <TD>·. te_fet".l.ldal$dato. $datos $n~fil. diel$errorl.. 'S8LECT • fElOH tornillo.J'n.BQDY> <CIN'l'ER> cH1~TT4bajan~ eon SQLite</H2> 'error» c ?php if (!$bd .. .d<O!r1 lfII r-a t i l " ' _ .

echo "</TR>'..nt{$~to •• SQLl~'.Qlit.(.mt.za.MA o sQlite_rewind (datos): Permite situamos en la primera fila del manejador de datos proporcionado. obtendríamos el mismo resultado: ._eurrent($dat08. A /font: 14~ ·monoepac._eurr.a (' precio' ) </'It»o': echo '<TD>$pieza['etock')</TD>'. El siguiente ejemplo nos muestra cómo utilizar estas funciones para generar un completo mensaje de error: <HTML> "HEAD~ .SQLX~SOC)1 echo "<1'R"": echo '<TD><B>Spie:a{'ref']</B></TD»'. } Con el siguiente código también se obtiene el mismo resultado: forl$fil. echo '<'l'R>". Iqlite-P8Ktl$datosl. edlo '<1'D>$piet.acripeion']<ITD>·. . Si sustituimos el bucle while del ejemplo anterior por la siguiente porción de código.<S~fila. en la que se hace uso de estas funciones.ekl$datoa.z•• ~lit.$fila¡ I Spi.. echo '</TR>".aO:Sfil. echo '<TD>$pieza['deleripeion')</TD>". o sQlite_next (datos): Permite siruamos en la siguiente ftla del manejador de datos proporcionado. ¡ C/S'O'L& .~. echo '<TD>$pieaa{'atock']</TO>". echo '<TD>$pieza['preeio'1</TD>'.lqlit."¡ P I t'ont.a~ref$dat~ll( $pi.TIT~>Trabajando <STYLB~ con SQLite</TITLB> TABLE P.366 PHP S A TRA V~ DE EJEMPLOS Cl RA.++1 ( aqlite_s._rewind($datOSI ¡ whil. PHP cuenta con las dos funciones siguientes: o sQlite_last_error(bbdd): Devuelve el código del último error que se haya producido trabajando con la base de datos referenciada por bbdd. 12px ·Verd4na' 1 eolor red. o sqli te_error_string (código): Devuelve una cadena con la descripción del error asociado al CÓdigo proporcionado.:Sfil. Para el control de errores específicos de bases de datos SQLite. echo '<TQ><8>$pieza('ref')</B></TD>'/ echo "<TO>Spieza(·d.

bas~litll. [J sqlite_udf_decodeJ>inary(cadena): Decodjfica binarios pal.~lIrror{$bd)¡ $. ) el . . . echo "Error ¡Scoo:Larrorl.oll:8ASESDEDATOS 361 </HEAD> "BQO'{> <CKNTDI> <H2>Trabajando can SQLit.red. la sentencia SQL que se solicita está incompleta y como resultado genera un eITor que se visualiza en la siguiente imagen: Trabajando con SQLlte EmIr (1): SQL\osi< omII"GI" .ados en la cadena proporcionada a UOF.ada.tc_arror • sqlit __error-*tringIScodLerrorIJ echo '<br><hr><span atyle. Además de todas las funciones anteriores.. ·SeLECT· FROH"llf 11 error echo "<P>ConsuLta correcta .·color. . $r. . ir (!$bd • •qUte_open( ·pru. Serror)) dielSerrorlJ it($dat. . . .clb'..._la. . { $codLerror • aq11t.r. . . PHP proporciona las siguient.o• • ieqlitll_Q\leryl$bd. . . . '>'. .s funciones de carácter genérico: Q sqlite_libversion(): Devuelve la versión de la libreñn SQLite actualmente utiliz.tr_error</apan_he..= - CRA·MA CApfnJl. [J sqlite_libencoding (): Devuelve la codificación de la libreña SQLile aclUalmenle utilizada.. <fP>". . ¡Hl> <?pbp .> Como podemos observar del código. 0666. los datos [J sqlite_udf_encodeJ>inary (cadena): Codifica los datos binarios pasudos en la cadena proporcionada a UDF.·: ) </CENTEIb- <f80DY> </HnlI.e.

i te_libencoding 1) .. IQl.t!JI'--. Superado este tiempo se genero el correspondiente error. milisegundos) : Fija el máximo tiempo en milisegundos que se debe esperar para que la base de datos referenciuda por bbdd se encuentre disponible.J"Io.8.11 codificación: iso8859 LA.R> <1I2>'I'r.-.abajando con SQLite</H2> .2 Interfaz orientada a objetos de SQLite La extensión de SQLite nos permite trabajar como si se trnlaTn de un entorno orientado a objetos. "<br>". la conexión a una base de dOlOS se convierte en un objeto sobre el que podremos invocar métodos o acceder a sus propiedades..5.e imagen: II~ ~ }!Ief E~ t..usy_timeout(bbdd. <HUI» $QLit~<JTITLE> <TITLE>Trabajando con <!HUO> <BOOY:I<?php <Ctm'I!.& S 368 PIIP 5 A TRAvru.. echo 'cadi ticsción: '.s "'~ • or. DE EJEMPLOS ID M -MA o sqlite_esc ape_string (cadena): Enmascara la cadena propor· donada para utilizarla como parámetro de UDa consulta.~ T rabajando con SQLite v"nión: 2. De este modo. T. • <bz:>' : <JI!COY> El resultado se muestra en la siguient..rn t"tq)·/~. La siguiente tabla muestra los nombres de algunas de las funciones principales de SQLile y sus equivalencias en fonnOlo orieOlado a objetos: . </HTKL> echo 'verl16n: " .(lU te_libVlrsion C) .. [] sqlitej.· 11. El siguiente ejemplo nos muestra cómo utilizar alguna de estas funciones: <"""'.

h~ .fJ"/~~/TD>·¡ echo '''TO>$pie~8Ide. ~ .. '<'i't'O>'1 wnileC . echo '''TR ~.HTML¡.1 t?r(S1.d-color . o"'.yellow..lasl ~O) ( echo '<TABLE BORDE:R~ '1" CEw.IIEAD> cTITLE>frabajando con SQLite</TITLB> <STYLr:¡.tc~array(Sr. echo '<TD>$pia~a[pr aciolc/TD> ' .sql) sqlite_f. dielSerror) : ." O'. Saql) Sr• • ~liu_QUery_unbuffered(Sbd. p. ._f.a::'! • l'llOIII ~0J:D...aql1t8 _4b ' . CEN7't'l-:> </800'(> <..111oa·).. color: r.~ aoco::.l._f.· .Sio( $4ato.4a~_.$:i·."]" c!J.. CI RA·MA CAPfTuLO 11 BASES DE DATOS 3(1) form. I echo 'C/TABLB>": echo 'cP~Recuperadoa $n~fl1as reglatro/ •. ~'.LSPAC1OO.w SOLiteDa~~( ' pzuebaa ..pl•••• $4ato.0.PADDING.IHTM .->~().> f1.~~) ) if ($nuO'. _ _ Ull . Sbd->unbulferadOuery(Ssql) Sra->fetcn¡ ) Sra->fetchSingle( ) Scad • Sbd->••cape$tringISa¡ Snum • Sbd·>laatInaertRQwidISra) • sqlite_eacape_stringISa) ~lite~aat_in8ert_rowld(Srs) Snum • El siguiente ejemplo nos muestra cómo recuperar la infonnación de la la bi a tornillos haciendo uso de la interfaz orientada a objetos de SQLite: <.d:1 <BODY:> cCIln'ER> cKl·-'trabajt!lndo con SOLite<JH2> c'lpnp ir CI'bd. cJP>·J ehe { e<:ho· .oR· · ~l1cw·>·. echo • </1'R> " . Ssql) Sta • aqHu_query_atray(Sbd. TABLB.)( '<TO>·.>"".->f.) $c~ Sbd->tlrrayQuaryfS~l) $ n .tc~single(Sr.1.~~~ • 'bd->qv. .) ~lit.~(·am. TR>': echo ·cTD>c8>Spie~a(r. backgt"OUt'.1~ {).tch(» ( ~h0 ' ./~·. A (font: 1 4px 'monoapace') P (fQnt: 12px 'Verdana'. > La consulta no devuelve ningún regiatro<fP>'J '> <.-¡o S(. '~fil ••• '4a~o. P STYU!:.to proceduraa Sbd • ~lite_open/Stabla) FOnDllto 00 Sbd • new SQLiteDatabaae(Stabla) unset(Sbd) Sra • Sra • Sbd-~ery(Saql) aqlit. <..._close/Sbd) Sra· aqlit __queryISbd.c~ipeiQnl<. a. echo '<TO>$plaza(atpck]c/TD>".

..-"".os 'H.. ~_.u.. ~"•.row_icl.. _ l A 1:-' o. u-.370 PUP 5 A TRAVa<> DE ErEMPLOS CI RA-MA El resullado se muestra en la siguiente imagen: Trabajando coa SQLlte ~ . S.t~row(1 ~eql_f. ...Lerrorll .(J mysql_query (1 mysql_f. ' .5._k _ _ 3. o.5. .. t J aqli tL.""" .at~ertect.. ." 11.: u-. Todos los scripls hacen uso del siguiente código (conectar_8BDD.. La siguiente tabla muestra los nombres de las funciones principales de ambos sistemas: SQLite MySQL mysql_eonnec:t () ~l_e1o. bajas.. pero no idémicos.octl eql1 ttU1~OWIIII sqli tU.er-t_icl. ulng( J 11..!) IIIYSql_nlll_eacope.php) que se encarga de abrir/crear la base de datos utilizada y que además define una función para mostrar los errores que se puedan producir: <1plip tunctlQn moatror_error($bbcl.la.(J l!IyaQIJlUlll.d)I ~error • aqlitLloat_error($bbddl.~ ___ ... o..~ '.!!....3 Diferencias entre SQLlte y MySQL Tal y como hemos comentado las funciones proporcionadas por MySQL y SQLite tienen nombres muy parecidos.acape3tring.. ....tc~..tc_error • sqlite_error_string(Seocl.·.JOWS 1I III)'1IqLin. . modificaciones y consu ltas) de la tabla tornillos vista en el ejemplo anterior.4 Ejemplo completo con SQLite Este apartado muestra un ejemplo completo de una herramienta para la gestión básica (altas.

li te_query! $bd.~. iniciales".olltrar_error4$bd)I ¡ $aql • 'INSERT INt'O tornillol 'fl. if (Iaqlite_queryl$bd. . ( ref SMl\t.... stock CHARIJOI.'.. lO.:> . SlIql) 1 die¡moatrar_error($bd))¡ echo '~l» -3. . 12/li0ii1. echo' _II:OrrlC1:0I</li>".".flla19</b>. $$ql)) die(moatrar_error($bd)) ¡ S8ql • '!NSERT INTO tornilloB VM. <!lEAn> ~TITL!>Trabajando con SOLita~/TITL!> </HF."). bd).ostrar_error($bd).in stock").= o RA·MA CAPfTuLo 11: BASES DE DATOS J71 return "~br><hr>~span>&rror ($c~~ror t $ltr_Ir or~/~~~hr>".. precio PLOAT(8. la ba_ de datOI no exillte •• cr_ iC I!$bd • aql te_OpClC'prufl)al_sqlite db c.J. U ~ I sQ. $aql. .lJES n04.'.. it (laqlit __queryC$Dd. ''l'orn~llo 12%a.·.2). ·INSeRT IN1'O to.rn1. dc!scripeion OfARCJ('~.l!l.·'l"Uerca12111111.llos VAUre$ 1100.~8_lIqljte~/b> <?php tnclude ( "conectllr-Pbdd. echo ".ue(1IIIC ~ar. PR1MAJlY X!:Y4refl).05. $lIqlr) Il02. lcorrec!..I{$bd). SsqllJ d1e4.J.ht~l·><b~Mlnu i~ic~. "en litO.. r"" rC ~bd) filia J El primero de nuestros scripts (crear_BBDO. 'OROP TABLE tornUlou·lr faql • "CREATE TABL! tornillo.o!</lb' ¡ Iqlitl_clo.> l 11 11..")) IIqlitl_Q\leryCSbd.. la tabla (torni 11os) y la inicializa con tres registros: ~HTML.'et1 diIC.¡UES stod").. php) genem la base de dacos (pruebas_8Qli te. ~br><br><]i><a href~"menu-BeoO.".LlNT UNSIGNEO NO'1' NULL.0.'Arllndel..l«b></a></li> . FROM tornillol. php") . ~Iol> C/CENTD> </80OV:> oefKTXt. ¡correcto!<'ll>"¡ U (8aqUte_QUery~$tx!. .C> o:BODY> <CItN'!'ER> <H3>Trabajando con SQLite</H2> <01> <li>CrallnOo la BlIlIa de Datoa <b>pru. O... echo '<li>InBertando dato. ecbo '<li>Creando la tabla <b>t~11'oa</~·! if Ilaqlita_Q\lery4$b4. 'S!LECT .

... _____ ...php·>Consultaa</A~<8R> <BR><SR><A HREF~·crBar_BBDO.tlón ct.php'>ModificacionBB</A><BR~ <A HREF~·conl~Bon.¡o. tlbl.n nock .> El resultado se muestra en la siguiente imagen : .php·>Bajas</A><BR~ ~A HREF~·modl~DD.tg1.ro..on~e·l) (text-decorationl none) color: blue¡ font: lOpx A:hover (background-color.D...urar datos inic!al •• <fA><8R> </CENTER .. Después de la ejecución. .. 12_....372 PHP S A TRA VJts DE EJEMPLOS CI RA·MA El resultado se muestra en la siguiente imagen: Trabajando con SQLlte 1...J. </800"(> c/Hnoll.·J. ic_~ ." "C&'~h TQctúli. yellow:) o:/STYL!> <JHE. . .tock La siguiente página HTML muestra el menó de opciones que proporciona la herramienta: <. •• . _. 0.AI» "800Y> <CENTER> <H~>Ge$t16n de 8aoo<aR>~ tabla Tornillo8 ~<fH2>.<Ifn<1O! J 1I_1aido dMOI ¡"¡cial.tg l.php·>Re.. 88O!k/TITLE> <9TYLI.8R> ~A HREF~·altal~BOO. 12_.o 12_ . 'i~! 2....) ·..tock . H1 (color: grey." <HE>..30 1\aecc..".1." .05 ... 0. c1'ITLl>Ge. ..... [a tabla tornillos tendrá e[ siguiente contenido: . ...html·>Altas</A><8R> <A HREF~·bajal~8DD. font: 26px ~ '~ce'...S-deo.t..15 Acanlif.. 0.... ere... ere..

PRECIO.CRA-MA CApITULO 11 . <BODY ..pR¡CIO.php· <PORH HETHOD.tOI. eodificar una referencia v.fo~rOl. dQeument. INPUT.'return eQmPrOber &ef¡ <'I'ABLB BORDER"I' CSLLPADOlNO-']' -!LLSpAC'lNC]oo'1'..u.ECT lfont <'Gnt.REP tOC)s!): retllrn false.form.·J~vaac~ipt'> l4POt mono&pa<e") tunr-fil'>n romp .ti6n de <SrYLE:> BBD"><'1'. el primero de ellos es una p~gina HTML (al tal_BBDD..·TEX~· NAME.. <I1'D> .forn..formsIOJ.'REF'. <fTR:> <INPUT TYPE. ve.values~'·.forms{OI. BASES DE DATOS 313 Gestl6n de BeDD • tabla Tonll.. deS( r J.~ 'l'ABLS..NaN¡~nt.valuea·O.LTL.~ - El proceso de allas se compone de dos scri¡J!l'.REF'. f!l( Uldocwnent." document. document.REF.·vellow·)RSPERENCtA</~ '~ <TD.REP. SItl.E:> <SCRIP\ LANGU~E.DSSCRIPCION...value=1O·· ! I i.. <TO· ~o BGCOLOP.v~lue •• '·1 doeUJnent. I if Cdocument. I <CENTBP> <H2:>Po~lario de AUrAS</H1> ACTION~·alta2~.lue·' '.K:>u..(C).·_ .formslOJ ..'.> <IGCPTPT> </HUO. A.peión· tf Idoe~nt. HEA. ohl..O· rel. html) que muestra un formulario en el que se introducirán los datos de la nueva fija a insertar en la tabla: • "'MI.DESCJU PCION.nida '¡.urn true: 11· .valueJ J( _lertl'Debe.vallle.·PO~· ONSUBHIT.! e':11'l. forma I o J .fonnll¡Ol.

.. además de recoger la infonnación intrOOucida por el usuario..adJ. <JorTION" <OPTIOH VALUE.Y ~!."location.r regiatro":o clNPU'f 'l'Y'PE-"BUTTON" VA.ellow" >Dl:SCRIPCIÓN< 11'0> <TI» <INPUT 'r'Y'PE.LU!."yellow" .BBDD_htal' t"> Como se puede observar.-TEXT" NAXEa"PRBCIO" VALtJEoo·"> <1= <ITA> <TR> <TD BGCOLQR.·yellOW·"A~<fTD> <TI» c SllLtCT NAMs-" STOCk" > ~OPTION VALUR~"."TII:XT" NAHE-"DJ:SCftIPCla¡" VALOS.". un precio y un valor de almacén (stock) por defecto. se realiza un control básico de errores con la función javascn"pt comprobar_ref () que se encarga de comprobar que se ha introducido un código de referencia (ref) válido para la nueva pieza.. <1_ "TA> <TO eocOLOR.tock·~ ."_nu. .in . También se encarga de fijar una descripción (descripcion).tOQk·~ b-.xistcnc1a. .e~l.·· .n </SELECT.. <INPUT TYPS..374 PUP S A TRA vts DE EJEMPLOS ORA-MA <T1<. <INPUT nn··StlBMIT" </I'OlII'I:o </CEIITD:o </1100'/> <JII'nIL> ~·N!. PRECIO PVP</TD> <1'1).cfOPTIOR> </'rR."Cancelar" cu:LICX. La página HTML se visualiza de la siguiente fonna: Formularlo de ALTAS Hlil En caso de que la referencia proporcionada por el usuario no sea correcta se muestra el siguiente mensaje: . <TO 8GCOLOIloo-y. c/TD.

Qlit.. <CENTER'" <H2>'ormulerio d. oc:. I Por otra pane el proceso de altas tambit'!n tiene el siguiente ~cripr (alta2JBDD. oINSERT INTO 'lORNrLLOS VALDES 1$_I'OS'l'(REPJ.BASESDEOATOS 37S . si se ha reaHzado correctamente la inserción._uribuffer~queryt$bd. uno primero (bajal_BBDD. </P><Bk> hoal" >He:nu prinei~loc/"" <A KREF_"altal-BSDD. SlIql ...htnU">Otre 4~te</~ HRZP. ORA·MA CAPtruLOII. dl.(mo.... lr II.-ent•.tión d... Ba~/TITk!> <STYLt. ·) p (fontl 12px ·Vardan. «ICElfl'Elb . Para realizar las bajas se utilizan de nuevo dos scripts. $aqll) <p>Regiatro cA .pbp) que muestra los registros que aclUalmente contiene la tabla en un formulario para que el usuario pueda decidir cuál eliminar: . ~do correet. se puede observar en la siguiente imagen: • . encargado de aBBdir en la tabla los datos introducidos en la página anterior: rH™l' <HEAO> cTITLE~e.·~8800. ...trar_error($bdl I I aq11te_cloae ($bdl. (tuntl 14¡.php). colorl redIl </STY!."..y> <tJ:f'I'KL· ~ El resultado. ALTAS</R2><8R> ""php inelude{"coneetar_bbdd. Formularlo de ALTAS • n.php"). '$_POST(DISCRIPCION) • ILPOS"I'[PRl!CIQ! '$ _POft!S't'OcItJ '}:.>x ·IOO"U"''''''....!> </HItAD=- <BOOV .

!NPVT (font..·: ~ho ·~<B>Spi. '1> cCDlI'2R> <K2>Fo~l.. <TD>&nOsp¡</TD.php"" CBLLPADOING~'J' cTA8LE BORDER_"!" CELLSPACINQ. TITL!:> <S1'Vt.>". A.. 14px 'monospace') </S'TYLE> </HEN»> -80DY> <'lphp include("conec:ur. echo • <TD>$pie~& r 'stock' 1</TD>' I echQ .($bd.. htlll ' : .$bd).E> TABLE.a¡ regl...n..> <?php hql"·SBl.. SQLlTB-ABSOCI.t~ll' VN.- J76 PIIP oS A TRAvts DE EJEMPLOS CRA-MA <11TMt.{$datQ. "q1tl die llII08trar_flTtor ($bdll .1 )1 Spi.f' J".bbdd.> <HEAD> <TITL&>Cesti6n de 8801>< .Q\le.'center'>". ?> <!'I'A811E><BR:> <INP~ ~lNPUT TYPE~'SvaMIT' VALUe~·BOrrar r&gi. wh11e(BQlite_haB~r.php·!.ello "<fTl».UJ:oo'Spieza [rel J '>'. <TD>REI"< ITO> cTD>DESCRIPCI6u</TO> <TD>PRSCIO</TO> <TO>S'f'(Xl«/TO> <11'11. eeho "<'1'0 ALIGN.ECT • FROK 't'OP:Nlu.trol·~ TYPE*'SUTTON' VALUS_'CaneelBr" ONCLICk .za2./~cJ~' I echo '~Spieza['deBcripcioa'I</TD>' echo • <TD>Spieza ( • preclo' J <f'rD>' .' ."yellow·.ez. 'loeBt ion_ '1II1!lnU_J!. echo " . </1'it>': ) sqlite_cloBe /.rio de BAJAS<JHl> ~FORK I"IE'mOD<>"POST" ACTION-·baja2JDWD....qlite_t. '1:1I. o( I F'OIIJoI> <fCENTElb </BOOY> </KnCL> El resuhado se muestra en la siguiente imagen: .oS' ¡ 1 f I! $datos'"'aqll te_unbufhre<l. TR.·O·> <tR BGOOLOR..8DD.t~.rr.. echo "<lNPU't' TYPE"'checltbox' NAME.vi~co •..

. '<lB> regiatro/a eliminado/a COrrectamente ...clo.-.1) j f -. echo '<P><B>"._ . se puede observar en la siguiente imagen: El resu ltado." IQli t echo '<P>No s. .... rl.¡'¡TML> -cHEAD> <TITLE>Ge8tión de BBDO</TITLE> <S'1'Ywt> A (tont: 14px "mon06pace") P (font.html">Henu p r incipal</A> <A HREP-·bajal_BBDD.PI'u.. __ . ·. ___ Uo.. ~ ~ "'O y un segundo script que realiza la baja de los registros seleccionados en el paso anterior: "... Fonnulario de BAJAS . WHERE re! INI$lhu...ulario de <?php lf li ••etl$_POST( 'regiatros'J»O) Sliata_baja' • joiD("~~~['reqi..• .. I $bd) ..~·I..</P><BR>"/ 1> <A HR!P.' ---'____ . $aQll) 4ie(~Btrar_errorl$bd)). ~t·KI l· ....5qlit~change81$bdl.. ha seleccionado ningún . --~-..o fl'. l~px "Verdana"._ .u..CRA-MA -~ CAPfnJLO II BASES DE DATOS 377 • . 0. _ ... ..baj ..... 1".:_. BAJAS</H2><~> 7> <CDn'BR> <¡'¡2>Por... </P><8R.'menu_BBDD.. if ¡ l$datoa·aQlite_unbufter~query{$bd. ¡ r " .+ ... u: ____ ___ _____ Olrr "'"" . si se ha realizado correctamente la eliminación de algún .. )·. o....php">Otra baja</A> </ct:m'ER> </80OY> </HnlL> • registro. color: redl) </STYL&:> </KEAD> <BODY> <7php lnr:udel·conect~r_bbdd.troa' J)! hql • "DELETE PROM tornillo. -:. r-_~_ 1_.. r~iatro . '1...

?php while (sql it • ..rror'$bd)1 .html' " . it (! Spieza"sqlita_...srny_q"aryl$bd.JllOr.Z'tUS::OC11 diel~8tr8r_.~ ...CE'rt· ret ']0.php·> <BR>5eleecciona la pietal <SetECT NANEo'. INPU'!' {'ontl 14pX </S'fYLE> ·~pae.(~strar_errol ISbd)). StQlll di.I$~toall! $piez.has.'lIIOdl_8BDO. ·cn· ACTlOO. " "T'<LE> TABLE.05 9IHEfU~ rar • $.. hql. echo 'cOPTION VALOE··$pieza·>$páez."> </P'OfUol> <?php ) .<'OPTTóN~·1 </SELECT><SR><BR>cBR> <INPUT TYPE~oSUDM!T' VALUE~oSelaccionar regIstrO"> <fNPUT '!"lPE"oaUTTON° VAt.nelude(·eotIectar. se muestra una lista con los cóchgos de las piezas (ref) disponibles en la tabla para que el usuario elija el componente a modificar: <1I'1'1'lL:> :IIEAD> cTITLE>Ge$ti6n de SaOOc(TITLE> " <. ':ot.lr.. ·'OO:U aBDD. "'FOR.. f'ROH 1'ORNILt.·} c?php I.lae { $aql"'SELBCT . ·'FOM HE'I'HODoo"P(l!"TO AC"'!'IOJI . <'tULE 9ORDER.I1E".ef'> c... ?> cCDlTEll> cH2"l'ormUluio de! HODlF¡r".php'!. J . php).'SELECT ref PROM 1'ORHILLO$'.php· .qllte_fetch_att:Ulg I $elato.ClONfSc/H2> <?Phi> ifl~ty(LGETt ret'J)I( &sql."!: KETI:IOO .Ol" CELLPADDJ~"J' r:et...--378 Pltp S A nA ~ DE EJEMPLOS ORA-MA • Formularlo de BAJAS • • • • El proceso de modificaciones cuenta también con dos scripts...J*>dd. ti ItSdatos=aqlite_unbuffered-Query($bd.:Q>M:JNC-'O·" <TR> ..oCancalaro CNCLICKD·locaLi~n. En el primero de ellos (modl_BBCO.'Aen~BOD.

parJ que el usuario pueda .nu_il800.u¡:. pitzll Este mismo script también se encarga de mostrnr un rormulario con la inrormación de la pieza solicitada en el paso anterior. '" /t'O> <"'I!> <1TA8LE><BR><BR> <INPUT TYPg.·hi~en· NAMt..ancelar· CBCLICIt. <'I'R> <TC BOCOLORs'yellow'>PRBCro <TD> PVP<.UEa'Actualizar _egietro'" <1 NPO'l' TYPB. <B><?pbp echo SpieEa[O) ['rer')?>< B> <INPUT TYP&.·T~XT· NAMB.cho SP1.·~IO· VALUE.e :$bdl.' . • Formulario de MODIFICACIONES Stleccd_ 1.T~ <INPUT TYr2..BASESDEDATOS 379 <TD> - .htllll I '" <'POR!'!" c?php </CENTElt> "..'BU'M'ON' v.~4[ J I ~'('rlpcioT'l' )1>'.O RA·MA CAPITuLOIL."> </1'0> <..'loc:at.-yellow·>OESCRIPCIONcfTD> <'lO> <IriPO'T TYPE-'TEXT" NAMEIt'OESC'RIPC!ON' VALl)Ea"<.'RSY· VALUS. ?php echo $pi. ·('.TI!> <'I'R> <TD aGCOUOR..u.. ?php ech. ·> </To> </TR> <'1'R> <TO SGCOLOR ..on·'-.¡BOOY> JK"I'ML> .?php .qlit~LnO.. <'TD> <fT.aa[OJ I ref' )'.·STOCK· VALtlE"' ..r> $piexa[O): at<Xk' 11>" .'c1php echo $pie~a[OJ ['p~acio·J? .."SU8MIT' V7U. 1> El resultado se muestra en la siguiente imagen: .. 'yellow' >ALMACtN<fTtl> <TD' <INPUT TYPE·'TEXT' N~R.

php">Otre mod1ficaclón</A> <ICKNTE.> die (moatrar_error (Sbd) ) ¡ .. tilm de BBOD</TITLIb'S'I'Yl.ht~l">Menu princlpal</A> I <A KREPe ' modl_SSOO._unbuffer.. <H2"~rmulario de MOOIPICACIONES</B2~<BR> <?php tnelude ("conectarJjbdd.380 PIIP!i A TItAV~ DE EJEMPLOS CRA-MA modificar cualquiera de sus campos. se puede observar en la siguieme imagen: ..""a _ jíj. menos el campo clave (ref).. El segundo script (mod2_BBDD..._.ql..R> <JeoOY> <P"Regiat~o </tn'ML> El resultado.q Iil~ ---- . • Formulario de MODJ}'ICACIONES ".. php).c. El resultado se muestro en la siguiente imagen: • Q. · LPOSTIOESCRIPCION] '.. STOCK.qliee_elose (SbO).php·. 14px '~nospace') P «(ont. PRBCIQ8$_POST[PRECrOI. $.E> A (tont.</P><BR> <A HREP. ~TYLE> </HEAD> 'BO!>Y> .Qltt. si se ha rea1izado correctamente la modificación del registro seleccionado.·menu_BSDO."UPDATB TORNILLOS SET OESCRIPCION. 12px 'Verdana"¡ eolo~1 red:1 -0:.d-~ery($bd.. .. $sql) . ' LPOST (STOCK] • WHER8 REre$_POST(RU]·: tt (!.. es el encargado de actualizar la tabla con las modificaciones realizadas por el usuario en el paso anterior: '>m<L> <MEAD> <TITLE>o. . actuali:ado correctamente.

/TITLE" ·~noapac.h. _ If [$condicio n !~'"J 6c:ondicion .' "COnect4T_bbdd. a part ir de dichos par:1metros: :HTHL> c:HEAtI· <TIno!:> . ··] Scondicion .._ ~ OR "._ ' OR " $c)ndic:ion . headerC"LXation: con::il_8BDO.SOL' ¡-$cOnlulUSQL.' . ( 1')- "P'ORM ME'nlQDa'POST' ACTIONoo"conl_8BQD." . muestra al usuario un formulario en el que se pueden aj ustar algunos de los parámetros de la consulta . . . El primero de ellos (conl_BBDD..SQL..)ndlcion •• • (DESCfllPClOO . que almacena en una vari able de sesión.¡ . [ 'conlult.._ • OR "..php)..· for ~..t> A.. "SELEC't • f'ltOH TORNILLOS': $condlclon . iSeondiciont-"J Sc:ondici(>n . " 4.pbp'J .. tf • WHER! $cond1~tcn~J •••• ion.O> <80DY~ <CE»TER> . lUl ."I! .IKE LPOSTISTOCKI ' J"~ IS~dic:iODJ. <STYLE> IIl . ~. 8ASF.. el proceso de consuJtas también cuenta con dos scripts... $c.php"> <TABLE BOkOER_"l" CELLPAODlNOa')' CELLSPACING-'O'> ..] . BBOO<.14px < HF... ri" de CO»stn.·J TABL& ."CREY~$_POST[RETI)': 11 ILPOST['DXSCRIPClOO'jt.I." . ~ tIX. Tambi én se encarga de constru ir una consulta SQL correcta. t I LPOST( 'UF' J 1 I ( Sc:onsult._ '(STOCK L. 11 1$_POSTI'REF' I 1.'") $cor~ltaSO.· C RA-MA CAP ITULO 11 . H.r if (LPOST('PRECIO·]I*·")( if ILPOST[ 'STOCK' I l·") { . JlITYl.tartfJ¡ S_SESSIU. nO.S DE DATOS 38 1 . ~ A 1P • ~ ~om1Ulario de MODIFICACIONES Finalmente..php'l ¡ .. .• "(PRECIO_S_POSr(PRECIOI)". l . .w .'IKE 'S_POST [OESCRIPCIO¡'.TAO"¡fI:I> <1php lnclud.. J . GeondJcion .. Al ($eondiciQ~lp'") SeondieiQn . P INPUT {font..

.LOB.~I~=¡ ". ..' low">5'R!:ClO PVPc /T'D1> <TD> <INPU'l ""/'t'D> '!!'YPEoo"TE.. <m'. lI."PRBC1J"> </TR" <T.XT· N1IH!.. • SUaHI't· <tNPUT TYPE.~..11ow·. <TO SGCOLOR~"y.. ...n IItock<fOP'l'ION> </SEL!C."XI-' n>eD\I" .ENCIA< 'n» <Tll> <INPUT TYpg. .. </TD... .TI<> <T><> <TO EIGCOLOR..i. ..~st:To8<C ". :~ re¡¡. .lo·Con."yellOW-"OEJCaIPCIÓH'/~> <INi"UT TrPS.IPC1OO'."SU'M'ClN· <c/PORH> VJ\..·RSF"> <TR' <TD BGOOLOR. - i 3 ~ •••• u.. El resultado se muestra en la siguiente imagen: . Fonnularlo de CONSULTAS .ooIW'''''T =1 I_raa . ~(TD:> <c/TAlILE> <f'><SUP>"</SUP>NO rellena ningún pa .]82 PHP 5 A TRA vts DE EJEMPLOS O RA-MA <TI<> <TD 8GCOLOfI.~ock</OPTION~ <Oi'TION"....."locat..OISPONIaLE</TD> <TO> <SELECT NAME_'STOCX' " <OPTION></OPTION. .BBOO."y.aul~ vAL~'CancellT' : abla' ONCLIa::.'T!!X1" < ITD" </TR> No\ME. _ _ _ _ .btlDl ' . <OPTION>lin .> c7php ) 7> .":vellow· >RErs:JI."TEX"l'" NAI'fBoo':JE <..o. Ir"ENTE:R> </8fJt)y c/H'I'!IIL... <clNPVT 'tYPe. obtener f:....... .

B> ~/H&AD> xwd... l~tyC'-a&'I'l 'CI!aOO' 1II S.·cOll:il.· ~ ar "...a_oase·> <DIG srte.'·OI { caLL8~.AIC·:o­ <lMG SRC'o·up.gU' ~_·O°:."A8C"..·con2J:1b4(1.JllllBZ<Y( SbIS.. A (fOlltI U'*" '~'} P (fODtl Upx ~'I colcn-I </BTYt.gif' BORDER. pbp?C4IIpJ_ Pll.gif· BQRDD-'O'_/b </TD> <TD>D8SCRIPCI6H . En caso de que el usuario no haya ajustado."~.. ifl$eondiciOQe••• tratrC'c~lta~txt.</A> 0:0\ KRBP..bbdd.' r.. .o_DalCIlJ:JCIC*lool'C'M-AIC-" <IMG saca·u¡. . en el paso anterior.SQL·). J al ...tart(I' Sc~ltaSQ~txt·'-Bl8iION(·coa..oc2.-. """"" <IIODY> <'n'l'U><Jati6D de .ptyIS_car(·ordea·)11 s_a./A> <JI..pbp?caapo-IUIP"'rden. 1f '_"RII".bb4d..uleasoL.qlite.:'106ol'd.1atl'lU'_errol' ($bdll r Scoa. $n-.. P. se encarga de ejecutar la consulm SQL construida en el paso anterior y mostrar los resu)mdos obtenidos. php1e-.'down. HRJnI'..php?~ItInordan.ult..·O'~ <TABLB BORDEA_"l' CBLLPADDUIQ>o"]' <TR BGCOLOR_'yallow'" <=RZF <A HREFto·con..gLf· IORDIR_·O"~.-orden..ocrl'cupo· lfle.J..'.DUC·~ <uta SRC.. 'dowQ.eoo2.. gU' 1I01UJIR..J.. i f 1I Sd.{= .GftI·o:r6Ia·].o-J«ICIOIlordaooASC· ~ <rNG sac.<I"" <A HRBPa .glf' BORJJtDt-·O·:.l1~or4erK/~·." • ••... $eOllS\lltaSQI..ak/'fl'rl&>- <Sl'YlJI> TABLB. ·n:LIC'r • PROM toraillo.ba.r891atro• • sql1ta~OWIIISdlltOll)' ifl$Du-.aIkB"'( . $cooauJ taSQt.·O °:o-</A> ----> < . ptlp1cupolfllllCU'PCrCl" o~W8C· . t.rr'~I).. RRBI"* o conl-.". BASES DE DATOS 3SJ Por su parte el segundo scn'pt (con2_BBDD_php).bb4d...·O·~/~ <A IIREP..Jlbd4.¡~..to... ningún parámetro de consulta se mostrarán todos los registros presentes en In tabla: .pbp?c </TI» <TD>PRECIO <JI. lnclu~t"conecL&r~.. SCOl*Jl~tdQk.1 J di. ~IMa SRC.'_Oft('cupo').' <CatEBR> cB2:o-ponulado de C'CIISUL'l'A&c/R2:o< .pbp·)1 •••• 1OD-.$cou"l~. O RA-MA CAPtruLO 11 ..cho '<Pl-$connl~ <br"$condieionaa<br>kOftal.txt.'U¡.regiatro.. echo '<Pl-Sconault&~"$coaaalta~"o~/P>'1 .

.. ~ho '<TD>$pieaa[preeio!</TD>'.gif' BORDER.cho ) ·<c/TR~·· scho '<c/TABL€~'1 echo '<p>Racuperados ..SOLI~SSOC) e<:ho "cTR:O°. eoho'<P>La consulta no devuelve ni".STOC~or~~n.·con2_bbdd. 11 .f\<la><'~'1 echo ·<~O>Spi.'up_gif' 8ORDER~·O·~</A' <A :mulO •con2_bbdd .</P>'.scripl también permite que el usuario reordene los dalOS obtenidos por el campo que desee: • Formulario de CONSULTAS • .¡. S'J'O(:]I.ll.. este ..<S:oSple~.."down.php':oOtra consulta</A> or :CFmBJb KR€F~'manu_BBOO. DE$C o :o <lNO $Rr.oO·~<'A> o( • 'I'D> TR. <1php whlleC5ql Spie~a •• qlJte_f..ordM'l .s • ~84 1'111' ~ A TRAvlls DE EJEMPLOS C RA-MA <T"'ST<>C& <A HREF.php1campo. .html·>Menu princi~l</A> "' '90DY </H'I"ML> Como se puede observar en la siguienle imagen. t.5 Instalación en Unix/Linux Aunque la librería para utilizar SQLite desde PHP viene incluida por defecto en la distribución de PHP 5.~re!$dato. phplc~lIa"o .'conl_BBDD.1 •• $"~registro.scripcionl<ITD>'. echo ·<TD.zal~.5.0 en ocasiones puede ser interesante instalarla por .{r._~.tc"-array!Sdato&. echo '<TD>Spiez:a {stock\ < lTU:O' J ...At~·~ <lKG SRC. regiatro/a.ún ragiatrc</P>'! aqllt8_clo •• (Sbd) I " <BR><BR><A <A HRBP. ~ .

En Ifneas generales. y Unix dbm. dicho sopone se implementa de dos modos diferenciados. IBM 082./r.15 mkdir bld cd bId •. . Los ficheros binarios de Windows son generados utilizando el compilador cruzado de Linux. . entre otras. Empress. puesto que ante nuevas versiones del producto podremos aClUalizarlas sin necesidad de modificar la instalación de PHP.6 USO DE ODBC A1 0 largo de este capftulo hemos visto algunas de llls fun ciones (las más frecuentemente utili zadas) que PHP proporciona para trabajar con MySQL. PostgreSQL. mak. ejecutar la configuración desde el directorio de compilación. de igual fonna existen olras mucha. y segui r los mismos pasos que vimos en el capítulo de instalación. linux-gcc" y ejecutando el makefile. dBase.. \ x. I. simplemente hay que seguir los siguientes pasos: $ $ $ $ tar xzC . Hyperwave. Sybase.8. Ingres. crear un directorio pura lu compilación. Adabas D. E.9~ $ _ke $ '" .-2. In fonn ix. Ovrimos.te es el método utili zado panllodos los desarrollos y pruebas oficiales de SQLite y para construir los ficheros binarios precompilados que se encuentran en la web. desempaquetar el producto (en fonnato tarbafl). Como complemento a realizar la instalación por separado contaremos con un programa que pennite la manipulación de la base de dUlOS desde la I[nea de comandos (tusr/local/bin/sqlite). o bien. $ eo"CJ9\lr . Para ello.t. Dirccl MS -SQL. como superusuario.h-~lle •• I_r/local.C RA-MA CAPtruLO 11 BASES DI DATOS 385 separado. hay que indicarle a PHP que haga uso de la nueva librería.eaóaa Si lo prefiere también se puede compilar SOLite realizando las modificaciones que desee en el fichero "Hakefile.ql Ic. compilur la di~tribuci6n y. MinGW. Oraele (OC1 FrontBase. in. o bien. --wit. mediante funciones nativas propias de cada uno de los diferentes gestores de bases de datos (ta] y como hemos visto para MySQL). to de opcion$8_de. Salid. al comando de configuración hay que añadirle la opción --withsqlitelll/usr/local.aU Es decir. Posteriormente.qlit.o¡ que nos dan soporte para diferentes bases de datos: 7 y OC18). hacer la instalación. Para in~talar SQLite sobre un sistema UnüúLinux.:Oftli9\lU tar. lnterBase. mSQL. 11.<.

si bien perdemos la transparencia proporcionada por OOSc. I:l o Una representación estándar de los diferentes tipos de datos a manejar. Además.386 PHP 5 A TRA vt. también es independiente del sistema operativo sobre el que se esté ejecutando nuestra aplicación favoreciendo. elc. por tanto. La interfaz. sólo es necesario que la base de datos (la fuente de datos OoBC puede incluso no ser una base de datos: una hoja de cálculo. OOBe. presenta un modo homogéneo de manipulación de datos independiente de gestor específico (DBMS) que se esté utilizando. la API estándar de conectividad de base de datos desarrollada por MicrosofL Conectividad mediante ODBC Conectividad mediante funciones nativas I I Aplicación ~ ODBC I I I Aplicación I I Driver OOBC I I Driver ODBC I I Driver ODBC I DBMS Oracle ~ DBMS lnfonnix DBMS dBase OBMS BBDD OOSC presenta un nivel intermedio de software.) tenga el driver apropiado. un conjunto de llamadas a allo nivel. definida por OOBC se basa principalmente en los siguientes elementos: Una librería de llamadas a funciones ODBC que nos permiten conectarnos a un gestor de base de datos. un editor de texto. Cuando hacemos uso de las funciones propias de cada gestor. Para utilizar OOBe. de este modo. La contrapartida más importante que presenta OoSC es la sobrecarga que supone el uso de esta capa intermedia de softwau. que pennite el intercambio de instrucciones y daloS con cualquier gestor de base de datos sin la necesidad de conocer sus detalles de implementación. . obtenemos un método de acceso mucho más eficiente. la independencia y transportabilidad del código generado respecto del entorno de ejecución.s DE EJEMpLOS ORA-MA mediante oose (Open Da/aBase Coneclivity). ejecutar sentencias SQL y recuperar resu llados.

,
C RA.MA CAPtruLO 11: BASES DE DATOS 387

11 .6.1 Ejemplo de uso sobre Access
Los pasos para utilizar oose para conectarnos a una base de datos definida con Access serán los siguientes: l . Arrancar el Administrador d~ ODBe. Este componente de todos los sistemas operativos de la familia Windows nos permite administrar las fuentes de datos y los controladores OOSC. a. Normalmente se encuentra ubicado directamente dentro del Pallel de control. en los sistemas Windows 95/98.

_ _ ea • - - ---- ,• - .. - -•
_¡U_l
... _ _

"_4.... .•

$-

,anel de control

~_._,

',,"
~ n,

~

iI!II... ,- @II

lo ......

lJl lo
"1 w
rJl

4

-

'-

b. O bien dentro de las Herramientas administrativas accesibles desde el Panel de co1ltrol. en sistemas Windows 20001NT1XP.

--JJ1---

388

PHI>5ATRAV~DEEJEMI>LOS

2. Comprobar que nuestro sistema tiene instalado el dri\'er OOSC necesario. en nueslTO caso el de Access. Para ello accederemos al contenido de la pestaña Comroludores y comprobaremos que el driver necesario se encuentra instalado en nuestro sistema. En caso de que no eslé, sería necesario instalarlo. Los drivers OOSC habitualmente los proporciona el constructor de la base de datos.
NOTA: El controlador de OOBC de MicrosOft Ac:eess se proporoona por defecto en todas 185 velSlones de WindOWl. En caso de no tenerlo dllponlble. se puede instalar desde el CO de Office o descargarlo desde el .. bo Wab de MIcrosoft
, •• _",_, . ...... _ ........ "

~-I,-I-.-I-.

._- _._, .- ' - " """~-_

11'"

__ . . .... ...._ . ...... _ ~_._r...:

----_ _-_

3. Crear una nueva fuente de datos desde el Administrador de ODBe. Para ello mostraremos el contenido de la pestaña DSN de sistema (el administrador del sistema, o cualquier usuario que tenga privilegios puede utilizar un origen de daros configurado con un DSN de sistema) y agregaremos un nuevo origen de daros.

--1-

-_

I

.=-¡-...!..::.
:0:-',
' · ......

1

I

1

»' _ _ •• _ _ _ _ o» _ ...
~

. . _ _ _ _ ......

k

___

,._~

...............1

_._-

";"~l

~

__ 1'''')--1

O RA-MA

CAPtruLO 1I BASES Oh [)ATOS

:\89

4. Asociar a la nueva fuente de dalas OOBe una base de datos.

5. Configurar el origen de datos OOBe recién creado. fijando los valores requeridos para las opciones disponibles mostradas en la ventana de diálogo de Opciones avanzadas. Entre otros valores. podemos fijar el usuario y la conlrasei\a necesarios para iniciar una sesión con nuestra base de datos.

6.

Hacer uso de las runciones proporcionadas por PHP para la conectividad con ruentes de dalas OOBC.

En nuestro caso el código desarrollado para la versión de la Agenda que utiliza MySQL es totalmente váljdo. S610 debcriamos cambiar las llamadas a las runciones nativas de MySQL por sus correspondientes llamadas OOSe. La

390 PIIP, A TRA

va DE EJEMPLOS

CI RA-MA

siguiente tabla muestra las funciones ODBC equivalentes a las funciones nativas de MySQL que hemos utilizado a lo largo deJ capítulo:

La siguiente tabla muestra las correspondencias entre las funciones de

SQLile y OOBe:

,

()
(

A modo de ejemplo se muestra el script encargado de realizar la conexión con la base de datos y mostrar un listado con todos los registros:
<>moL>

....."
c~lT.L1>Tr.bajendo con OD8C</71TL!> <STYLE> TAlIUf, p, A (tont: 14px ·~ce·) P (fOftt: 12px "VeJ:dflna°; color: red:) "sm.E>

<JHIIAIl> <IIOD'J>

..,...,...,
<R2>TJ:~jendo

eon ODBC</H2>

<table boJ:der-°¡" cellpa<5ding."2"> <tr b;color-°yellow"> <th>Ncebre<Jtb>

cth>Corteo-e</th> cth>Tlf Pijoc/th>
cth~Tlf

Móvl1</th>

C/t1;>

f04 •

fI

fM

conecto a la base de detos aObI;i_~t (-Aa 'e-. --.....~.. -_ _ola_"),

11 coftAtruyo la coneulta
$.ql • • S!LEC'r .. PROM l<ILaven4a';
~

1I ejecuto l. consulta • odblulolHbll. f.eQl."
" recorJ:o al r •• ultado

~l.[odbc_C~_~I.r..)

CAPfnn.oll:8ASESDEDATOS 391

$nQlabr.
$eon"_

• odbo_ren1&Ct-.

• odbcr_re.-1t.C'n.. $t.1Cfijo • odtIoc_nlNllt. (.~. $t.lf,..llOYll • 0IIba...--l1t ( t - .

",, .,
lI,

1) :

.-ebo • .. tr~ <td"'Sac.bre</t4>
~t4>$coneoe</td>

,

ctd>$tlf-fijo</td> .. td>$tlf~il .. ftd> C/tt:"'·1

1/ ci.r~o La CQnexion con l. ba•• de datos odbcr.o1oHeHlldI I
"/table~

.c'CEN'I'ER> </BODY> </HTML>

El resultado se muestra en la siguiente imagen:

Trabajando COD OOSC

I •

.
'

.

11.6.2 Instalación de OOBe en Linux
Para instalar soporte ODBC en Linux, podemos instalamos el gestor iOOBC (hup:llwww,iQdbc.org). que es un gestor Open Source mantenido por OpenLink Software (http://www.openlinksw.com). Para compilar PHP con iODBC Driver Manager como un módulo compartido de Apache, realizamos los siguientes pasos:
1.

Bajamos el paquete desde la página bttp:llwww.iodbc.ocglopliodbc.htm. AlU buscamos el paquete correspondiente a Linux glibc2.1 (Intel) (lo que se

392

PIIP.s A TRAVéJ DE EJEMPLOS

CI RA·MA

corresponde con el fichero 13kozzzz. taz). No es necesario bajarse el Generic Installation Script). 2. Como el usuario root. descomprimimos el fichero que acabamos de obtener (y que 10 hemos saJvado en el directorio / tmp) debajo del directorio ¡ uar / l ocal:
', el! lusr/local . Lar atvf Itmp/13kozzzz.taz 1

'"

3. Tenemos que volver a reconfigurar. recompilar y reinstalar nuestro distribución de PHP para que incluya el soporte iODBC (consultar el caprtulo de instalación): A) En la Unea de configuración de PHP (comando ./configure) añadimos la opción --wi th-iodbc "' /usr Ilocal/odbcsdk. B) Compilamos # make. C) Instalamos #make install. 4. Por último. parJ que el servidor Apache encuentre las librerías de ¡ODBC. hay que indicarle dónde se encuentran; por tanto, hay que modificar el fichero de arranque de Apache y en la Línea donde ponía:

,
tiene que poner ahora:
LD_LIBRARY_PATH-/uar/local/odbesdk/lib \ luer/local / apache/bin/epacheetl atart

"

,,:

CAPíTULO 12

PHPYXML

PHP 5 proporciona varias extensiones del lenguaje (módulos de software) que permiten implementar analizadores gramaticales de documentos XML. Estos analizadores. también conocidos como procesadores o parsers XML, permilen a las aplicaciones el acceso a la estructura y al contenido de este tipo de documentos. Haciendo uso del conjunto de funciones proporcionadas por PHP. podemos definir ~·cripl.s que interpreten nuestros documentos XML. Este capítulo no pretende ser un resumen exhaustivo de estas tecnologías, '\implemente muestra una aproximación a las mismns presentando ejemplos lipo con los (re.. procesadores de XML principales que presenta PHP 5: SimpleXML. SAX (Simple APllor XML) y DOM (Document Object Model).

12.1 INTRODUCCIÓN A XML
A pesar de que el objetivo de este capCtulo no es explicar en prorundidad la composici6n y runcionalidad del lenguaje XML. conviene hacer una breve introducci6n a él. para que los que se acercan por primera vez a este lenguaje entiendan la naturaleza de las runciones proporcionadas por PHP para el tratamiento de este Lipo de documentos.

J94

PIIP oS A TRA

vas DE EJEMPLOS

ORA·MA

12.1.1 ¿Qué es XML?
XML es el acrónimo de eXtensible Markup I.onguag~, es decir, "Lenguaje de Marcas Extendido". Es un estándar desarrollado por el consorcio de la "World Wide Web" (W3C) que define un meta-lenguaje basado en marcas, que nos permite crear lenguajes para estructurar información, es decir. para describir la información que manejan. También describe parciaJmente el comportamieDlo de los programas de computador que pueden procesar los documentos XML. XML está siendo ampliamente utilizado para el intercambio de documentos entre entornos heterogéneos puesto que define un formato independiente de la pllltu[onnu y dd lenguaje uuLiJ'ados. Esto explica d gran auge que está teniendo su utilización como base del intercambio de información en la Red.
NOTA: P8~ obtener mé, Informacl6n sobre XML '1lecnologl •• Iflnea, te puede teculTlr I II dirección

12.1.2 Estructura de un documento XML
Los documentos XML se componen de etiquetas de marcado y de contenido. Cuenta con diferentes etiquetas de marcado: elementos, referencias a entidades. comentarios. secciones CDATA, instrucciones de procesamiento, notaciones y definiciones de tipo de documento. • Elementos (elements): son las etiquetas principaJes de la arquitectura, pues son las encargadas de estrucrurar el documento XML. La mayona están destinadas a contener datos u otros elementos, identificando e informando de la naturaleza del contenido que encierran. Son las diferentes piezas de información en las que podemos dividir un documento. Normalmente constan de etiquetas de apertura y cierre aunque también pueden estar configurados como una única etiqueta vacCa. Pueden contener en su etiqueta de apertura atributos para aumentar la semántica del elemento. Comentarios (comments): pe.nniten la inserción de comentarios dentro de un documento XML, pero sin formar parte del contenido del mismo. Comienzan con la cadena "<! --~ Y terminan con la cadena "-->". Secciones CDATA (CDATA sections): son usadas para enmascarar bloques de texto que contengan caracteres que de otro modo serian reconocidos como marcas. Comienzan con la cadena "<1 [CDATA (" y terminan con la cadena" J ] >".

=

-

o M-MA

CAPtruLO t2; PHP Y XML 395

Instrucciones de procesamiento (processillg irwructiOIlS o Pl's):
permiten a los documentos incluir instrucciones para las aplicaciones encargadas de procesarlos. No fonnnn pane del conterudo lextuaJ del documento pero deben ser pasadas a las aplicaciones encargadas del procesamiento.

e

Referencias a entidades (enriry references): las entidades son las
unidades de texto de las que se compone todo documento. Pueden ir desde un solo carácter hasta todo un documento completo. También se utilizan para hacer referencia a caracteres especiales que de alto modo serian considerados como marcado.

Notaciones (notations): básicamente, identifican mediante un nombre XML a una aplicación auxiliar capaz de procesar cierto tipo de datos y que podrá ser utilizada por el procesador XML o la aplicación encargada de procesar el documento. Las notaciones también se utilizan para realizar negociación de contenidos_

Definiciones de tipo de documento (DTD - Documel/t Type Dejinition): proporcionan un mecanismo para definir reglas que nos
permiten describir restricciones en la estructura lógica de los documentos XML. Un documento de XML es válido si tiene asociada una declaración de tipo de documento y es confonne con las restricciones que en ella se expresan, También nos penniten especificar las entidades a utilizar dentro del documento.

El siguiente documento XML muestra cada uno de los componenles básicos mencionados:
<?x=J version-'l.0· encodinq.'ISO-8859-1·?> <1-- Ej-.plo I;h fiCMI:'O XML --;Jo <IDOCTYPE not. . , <I~ notas (alumno ', cOMentario.?I;Jo <I"""'N'T alUJlfto (_trieula. naaitte, ap"1l1do •• ~rl •• practLc.. ,"
~IILIMZNT ~t~icula ~'PCDATA)~

< I ELDIENT nolllbre

~

'PCnATA)"

<nOta••• Lgnst~r •• ·'SSOO;·;Jo

,.

.IBLBKSNT apellidos ('PCDATA)~ <tELItMI!NT teoria ~tPCOATA)" ~!BLIN2NT practica. !'PC~TAI~ < IBLDIIIf1' coetezttario. (.PCtIATAJ" cIA~ not. . . . ignatura CDATA 'SSOO"> <)IMTITY SSOO ·Si.t.... QperaLiYOa'~ <1art'1'M' l~UPIC SY8"r'DI ·logoupa,.bap" ~TA ctlOfATtON i~en SYSTEH ·lector ....·,.

u.ao-"

qlu.no"
cmatricul.~xOS03<I

. . trieul8>

~~e>tD6ac/naaitte~

, ___________-"<~~lii49.!~8U.no

OUtl'rr.x<'~li~>

.196 PIIP S A TRAV~ DE EJEMPLOS

e RA·M¡..

<teoria>8</teoria> <practicaa>9<Jpracticas> <falulllno> .alumno,", ~ . . tricula>x050~</BBtricula> <nonbre>Violeta</nQSbre> <apellidoa>Ouro Gutiérrex<'apellidQe_
<teor¡B>~.5</teorla>

<practicas>;< 'practica.> <'alumno> <coe.ncario.><1 {CDATA{Coftvocatoria extraordinaria "'comentarios> </not •• >

~

cJunio>JJ_

Los elementos que foman el cuerpo del documento:
<nota.
a.i~.tura~'&SSOO;

,> <alumno> <motriculB>x0503</matriculB>
<nombr~>In'$</nombre>

<.pellidos>SUeno Gutiérre~<I.~llido.> <taoria>8</teoria> <practicaa>9</practic.s> ':/alulllllo> <al\.llllno>
<~tricula>x0504</matricul.>
<no~>Violeta<fn~r.>

<epellidos>Duro Gutiérre~</aP811idos> <teoria>4.5</taoria>
<pr.ct~ca.>7</practicaB>

<¡all.Dflo> .COUleI1ta.rios> <IICOATA!Convoeatoria extraordinaria 4e
.. /1:'~UlrI"",>
<Jnotu~

<Juni~JJ>

Los comentarios:

1<1-.

BJ!ílíí?Jo

o.

fichero XKL -->

Las secciones COATA. podemos observar cómo la etiqueta <Junio> no se interprelu, no se considera un elemento, por formar pune de la sección:
I
(1

tCOATA[Convocatoria extraordinaria de <Junio>}l>

Las instrucciones de procesamiento, en este cnr.o la PI obligatoria que indica que el documento es XML y utiliza una codificación ISO-8859 - 1:
I<?xal v.r.lon-'l.O· ancoding.'ISO-8859-l"1>

Las declaraciones de OTO (en este caso interno). que establecen las reglas de validez del documento:
~

lDúC"T"iPE

notas! <!EL!MENT Dota. (alumno', <!8LEKENT

~oment.rio.1'>

c18LEHENT .l~Q (.at~ieula, n~r., clELEMENT . . tricula f.PCDATA»
C18L.EMEtfT'
n~. (.PCOATAI> apellidos (_PCDA.TA/>

a~llido ••

teoria. practicasJ>

e RA-MA

CAl'fTuLO 12, Pll" Y XML 397

<!E~tMENT teori~ ,JPCDATA» <I!LD!ENT practlc•• ¡'PCDA.TA» <!ELEMENT coment~rloa {'PCDATAJ> <!A.1TLIST notas asignatura COATA 'SSOO"> ~ltNTITY ssoo ·Si.t..a3 Oparativo.'. <!rNt"ITY lQgOUPtl SYSTEK "lOll~.bqI· NOATA • 'NOTATION lJllIlgan BYS'I"D'J "lector.exe"'

i_~>

1>

La declaración de la... entidades, dentro de la declaración del OTO (una interna y atril externa):
~!BNTtTY

8100 ·Si.temas

<I!NTITY l.ovoO" SYSTD!

Oper4t~vos"> ·logouplll.~·

NPATA iNglen>

El uso de las entidades dentro del documenlo:
"
[

:"

,,'"

. ""

Las notaciones, declaradas dentro del OTO. En este caso se indica que los datos de Lipo imagen deben ser procesados por el programa lector. exe:

f

. -'JNO'rA'l'ION illWlgen. $YSTD!

·lect.or.Qxe·~

i

12.2 XML EN PBP
La relación entre PHP y XML comienza en PHP 3, pues eSI3 versión (en la 3.0.6) ya contaba con una extensión para SAX soportada por la librería expat de James Ciad:. Las extensiones para SimpleXML y para el DOM soportadas por la librería libxm12 (la librería de XML de GNOME) tuvieron que esperar hasta la versión 4. De este modo, PHP 4 incorpomba tres modos diferentes de trabajar con los documentos XML, si bien, la extensión más utilizada fue la de SAX (incluida por defecto en la ver.>ión Win32 de PHP 4) porque SimpleXML y DOM siempre fueron extensiones experimentales. es decir. propensas a cambios y modificacion~ sin previo avi'io. lo que hizo que los desarrolladores no las usaran ampliamente.
NOTA: Para obtener ma. InloflTl8Ción sobre libxm12 ... puede reeunir a ta dlreoaoo htlp:/t,yww l\m1lOftorgl Más mfoI1llIK:!6n sobre exp.t, en la dlreccloo :1 1/ x

La extensión SimpleXML proporcionaba un conjunto sencillo de herramientas que permitía convertir un documento XML en un objeto con el que poder trabajar. El problema principal de esta extensión. además de su carácter experimental, era el reducido conjunto de posibilidades que ponía a disposición del progmmador. La extensión paro SAX proporcionaba un procesador XML orientado a eventos. El trabajo con SAX era relativamente sencillo. consistía en

dejando el resto para otras extensiones como SAX y DOM. .file(fichero): convierte el documento XML almacenado en el fichero en un objeto de clase simplexrnl_element que contiene los datos almacenados en el documento. en PHP 5 se han reescrito completamente las funcionalidades de XML.\1PLOS O RA· MA recorrer linealmente todo el documento XML llamando a funciones. un documento XML se convierte en una estructura de datos sobre la que podemos trabajar haciendo uso de las colecciones de arrays y de objetos que la componen. Es una buena herramienta para realizar un primer contacto caD XML. haciendo uso de la librería libxm12. 12. El principal inconveniente que presentaba SAX es que no nos proveía de una forma de validar el documemo respecto a una OTO. especificadas por el programador. permitía validar un documento respecto a una oro. ante ciertos eventos nonualmente asociados a la apertura y cierre de etiquetas o a la aparición de determinados componentes. SimpleXML nos proporciona un conjunto sencillo de herramientas para trabajar con documentos XML. además de su carácter eltperimental.3 SIMPLEXML Tal 'Y como hemos dicho... Las funciones proporcionadas para realizar estas operaciones son las siguientes: o simplexrnl_load. Sin embargo. Y que no pennitía modificar el documento con el que se estaba trabajando. principalmente por la naturaleza del trabajo con objetos en PHP 4. El problema principal de esta elttensión. La nueva elttensión de) OOM sigue completamente el estándar publicado por el W3C y además las nuevas extensiones de SimpleXML y OOM tienen interfaces para compartir infonuación. puesto que implementa las funcionalidades más comunes de XML.398 Pl-IP S A TRA vlts DE EJE. para dar soporte tanto a SimpleXML y DOM como a SAX. era que hacía uso de funciones no presentes en el estándar y que no podía dar algunas de las prestaciones especificadas en el OOM.. • La elttensión DOM de PHP proporcionaba un procesador XML completo. que transformaba el documento XML en una estructura de árbol que seguía de forma aproltimada el modelo de objetos de documento del W3C. El documento XMl deberá estar bien fonnado. A lravés de SimpleXML.

ar en los ejemplos: ~?~ ~not.. En un navegador nuestro documento seria visualizado de \0 siguieme forma: I En el apartado 12.qu.>Rodriqo</n~> <.> <teoria>4. El siguiente código nos muestra el documento XML (nocas.O RA-M" CAPh'uLO 12: PUP y XML 399 a simplexml_load.5«teorla> <praetlc&s>7</practlcaa> </alUlnno> e/notas..> <ap.scring (cadenaj: convierte la cadena XML en un objeto de clase s i mplexnL. xml) que vamos a utiliz. La cadena XML deberá estar bien formada.O· encoding-'ISO-8859-1'?~ •• i9n.tu~. .<3> <alumno> ~trieula>xOS04</~trlcula> <nambr.> <prDctiCIlB>4._element que contiene los dalOS almacenados en dicha cadena.ro ~t~tia>g~¡t~ria> ~practlcas>7</practieas> ~/al~o> Gutl'r{ez</apellldo8> ~alwnno> ~tricula>xD5D3</matricula> <nombre>In~~</nanbr8> <apallidoa>Sueno Guti'rre:<fapalli~os> <t~rie>8</teoria> <praetleas>g</practieas> </IIIU/llJl.llidos>Buano Outlérre¡</apellido$> <t~ri. a simplexrnl_imporc_dom (nodol : conviene el noda l de un documento DOM en un objeto de clase simplexml_element que representa a dicho nodo..."l.>5</t8prf.5 se explica qué es un nodo DOM.D vareioo.S<1practicDs> e/alumno> <alullll'U)'"' <eatricul.>xOS02<I~tricul.~·SSOO·~ <matricu14~x0501~/matricu:a' calUll\l'lO> <nombr.>Dario</nombr.> <nombr.>Violeta</~re> <apellldos>Duro Gutiérr.z<'~llldo.~111do8>V.

. )C0501 [nombre] Darlo lapellido$] Bueno Outl. l _ t Obj.S • _ l .. •• ... <_.• " - • . •• ~8Irt . "'> )COS03 8\leno Guti4rrez ._-..'Illidos) [teoria] ¡practicas1 ._'$::-' ~ . .. ... < _ _ ...I·h . <_....lI <'-"~ --.'rre~ 111 .-' n..-/..-> ._<-...._l~_.lIl "'<. < .._l~_el~ . {teorial [practica$1 .... ~-. .... Vaquero GutUrr ez 7 '" 13' • ÜJII1..... -..*""""....<""""""'~ ..._' Desde el punto de vista de SimpleXML obtendríamos la sigu iente estructura de dalOS: ...-1... ...rt..<I. "'IJOI1_......... .·· r"'-~ ..da1 [practiea. -.. __.l. ~. ._ t ~". ~ (_> 4. >.... ._--. (... . ...~~ _ _o " <.. ....u".. ' _ _ <1 "'~>_... 7·. ... [lIIOtric. •• •• 4. ...-._>to.... [tltO.~ _ . .uIo> "'_ ~/. x0502 [(lotabr-e 1 Rodrigoo [ap... ."...trl<.._l~ .-> ~-¡.</rII_..I".. .. •....*"".. "'II<>~ .400 PHP' A TRAro DE EJEMPLOS O RA·MA <_ _ ·I.._~ ~ ~ .. 1 _ t Objact (lMtricula] [nombre] ¡apellido_] ........ ...:ulal ..~._>....' > ....m.P'"O<I.... •• [01 .o--.l_ ~ecc Il114tricula] .¡_.. . .._...' .··ISO-.... > (-~ -...' ~~ .. "'./aI""""» "~"""I_-:' <"".l~ ¡aluaao] ......-"" ... ...

nter> " </body:o<Jhtlrll' 2 XPATII es una tccnología asociada a XML que pennile realizar búsquedas en los documentos. 1 "/pr.'). S (practic•• ' _> . cada uno de los cuales tiene las propiedades matricula. teoria y practicas de tipo cadena.></td>~/tr><ft4ble> <fc. un objeto de la clase simplexml_element que contiene una única propiedad llamada alumno. . .xrnl".. ¡~d~ center:>o <h2>Trabajando con SimpleXML</hJ> <teble> <tr> .. Q asXML (): a attributes (). td><pre> c. que es un a.. 1 Es decir. La interfaz simplexml_element proporciona los siguientes métodos: devuelve una cadena XMI.. apellidos. .CI RAMA CAPtnJLO 12: PHP 'f XML 401 I~triculal _> x0504 lno. bien formada a partir del elemento SimpleXML actual. a children () : devuelve los nodos hijos del elemento SimpleXML actual.ay compuesto de cuatro objetos de la clase simplexml_element. visualiza la estructura de datos explicada anteriormente: ~t1t)e~~4b4j.ndo con Si~leXML</title> ...) I else ( die! 'No se enc:uentl. devuelve los atributos del elemento SimpleXML actual.xml')) I $nota..brel _> Violeta lapellidosl -> Duro Gutlfrrez [teori41 _> •.4 el fichero 'notall._1' ) I prlnt . Además.iIl'l)1_1_1eoad_tile ( ' nota. r ($nota.?php 1t Iflle_exisU('notlUJ. nombre.. Q xpath(caminol: nos permite aplicar m~todos de búsqueda basados en XPath 1 sobre los nodos hijos del elemento SimpleXML actuaL El siguiente ejemplo muesb'a cómo abrir un documento XML y transformarlo con SimpleXML.

.. plOul_... .>'.... echo ·<td.e1_[O]->....·....7 _. /t... <"" ...]-.e1_(OJ-'..orbl -> ~ [prKt1c..t.e1_rO]-~t1aaa..t.. taou.. . '·notas_JI!ftl'11 ( exi t ( •No $11 enC'Utmtx:• •1 flchllX:o "nota•. .~ '. htllll... t~lo:u1.taot. Aodri<. 'c/td»'.taot_-~l_[OJ-~..IIIJl..·l' cellpadding... . >e1_[. ecne ' . echo '<td>'...~ . :. br> "1php i f (rtUe_llxist .-1_1 . IprK1:u:.. . ._1 -> Dtot10 (ai>"lh_l _> It.lo (.Ilplu.'C·.' . ..-11~. 1 (1] _~ 8~..1 _~ ...... " "'/c. • </td. td>'. II ) .l__ ¡_Vlt CbjKt [.-nol -> MUY . hl~reb4jando con Si~laxNL</hl> ...&b . echo ·<td.). [01 -~ . <body> ~itle>T~&baj~ con SiaplexKL</title..402 PHP!i A TRAV~ DE EJEMPLOS ORA-MA El resultado se muesb'a en la siguiente imagen: T .~. El siguiente código nos mucslrn una fonna sencilla de recuperar los datos del primero de los alumnos almacenndos en el documento XML: .. table ct1:" c1php " bord. OI/h..~ 7 Para recuperar la información simplemente hay que recorrer la eslructura hasta llegar al dato deseado.r'" Quu.~_ ....ow!a. ..t (l>j~ [d.....~11~1 .. 'i.·c/td> . "'/tr><lt. '''/t4>'..OS01 [_1>..bl..-:......nter> c/bociy>- OI/ht. 'c/td>'.<b cc~tllr> . :.. ¡ ...'1 echo '<td>'. IOS02 llICab •• 1 ..... xml" •. vaqP4rO OUtl •••• . • • • i..Jondo con SlmpleXML .5 .. ple_l_~l...taoe.-1..l_nt ObjKt [aatc!cula¡ ...Jl1.

l')' foreach I'DOt .xml' 1) ( exit('No se encuentra el fichero I border~·~· ·nota.td>'.XML</h2><bt> <'php .ORA-MA CAPmn. '</t~ ..AO[Ol a8 $prop _> $.":op.(·DOt ••• x.D 12: PHP Y XML 403 El resultado se muestra en la siguiente imagen: Trabajando con SimpleXML 'xQ501 Daio BumoGuliimz 15 '4.bIljan~o coa UDI¡)l. ->alu. '. echo '</tr>'.5 J El siguiente código nos muestra una formo equivalente de recuperar la misma información: ht. Lf !Ifile_exiata\'nbtal.·c. </tsbla> " r- cJCClter" c/OOdy> 'Ib"ll> El resuhado es el que se muestra en la siguiente imagen: . ._~l·"' 1I <tebl.-l_l~~il.'.> <body.·4"" 'DOta. eoho 'ctd>' .. <"pllp eellpadding. $va. . <oente~ "h2>Tr." ~> <hlNd> <tltle>Trabaj.lor.n~o <¡~> con SimpleXML<Jtctl.. • • ~l.lo~) ( echO '<tr>' ¡ echo '<tI! bg'color""yellow'>'.

'<ftd-' echo <td>· .a.. echo <td>'.l~-> ~r.O iIIh .> al~ 11_ .:.. .. .. ••lu. 'oCI td>' I echo <td>' .. $.br~ 1f ) h !lf~lQ_exl.Io".( 'notas.•.lo~ ."·4·" ?php . till .11... ) ?. $aluaao->practic. border.lu.no~• • • t.-l_ load ...t.XML</t~tl.-.a. "l" ~ellpaddl.ao •• '..lu.ClIk xfI501 • .a1umJ. $Y... $...tear¡.?pbp SlI.ach ($DOt. .-1_10a4 .no->~llido. 'V t4» .. e/ t abla> . $. ..pl.luaao) ( ficho '<tr> ¡ acho '<td>'.~leXMI.no->t. .QOt•• . <td>' ..l'· <tillbl..fil.l~ ) echo '<tr> fora«eh .> </head> <body> <b2)oTTabajando cm . .pl. prwt¡ ~ <:bi"'ru J 45 e_ Para recuperar la in fo rmaci6n de todos los alumnos del documento tendríamos que mod ifi car el cód igo anterior tal y como se muestra en el siguiente ejemplo: <hUI] -:head> <tltle~Tr4baj~ndo con S~pl.404 r HP ~ A TRA vts DE EJEMPLOS • RA-MA • Trabajando con SimpleXML --.> Un bucle equivaJente al anterior seria el siguiente: iphp 'DOta• • • t.xal 1I exit( No •• encuentrill el f cherc. C·not.n. e td> ) .('not •• foreac~ _ .ori.a1·. <Itd~ echo <td>' .lIDDQ->_trieul. I . . . /eenter> </body:> </htJfll. ->. thecho </tr>'.. . lor I t echo . xa1'11 fo~.. o.c "1l. f1l.

000UOI DorIo .O~03 'tof-.O RA·MA CAPtruLO 12: PIW y XML 405 echo '</tr>'.<br" c?php lf (:file_ohta¡'noUoa...r. [dU02 R.~ndQ con SimpleXML</t~tle~ c/h<Md.->attributaa(J " • •• tributo . .> 1 ~nota8 ~ aill1p18mfll_.ti ... .1o"d_file ( 'notaa.> ~ho 1 'aaionatura • .xml'JJ { exi ti' No all IIneuentr~ 111 fichero 4 not ••• XlIll' . que recuperaría lodos sus atribulOs o bien acceder al atributo deseado como si se tratase de un componente de un array asociativo.o'04 : Violel.o con S~1exKL</h2. I "" 9 r.> $valor ) ". 1 -- -- " La siguiente imagen mueslTa el resultado de ejecutar cualquiera de los ejemplos anteriores: • • Trabajando con Simplcx'ML . el resullado obtenido es el mismo por cualquiera de los dos métodos: . . •"'" Para recuperar cualquiera de los atributos presentes en un elemento contamos con dos posibilidades: hacer uso del método attributes () . El siguiente ejemplo nos lo muestra de forma práctica: <htllll> <n_do. J ." Sumo G. <title>Traba.~80 B<-o. $a..ra' 1 ..m~z j 4j VIIqUft"O ruikrtz 9 7 ¡. disponible en los objetos de tipo simplexml_element.valor ..• '<br> ' J Como se puede observar en la siguiente imagen.otaa ['aai~cu. . '"<Or>': <?php c/center> </~Y> </h~ . <body> '<C*'Iter> <b2>Trabajand.' • • . Duro OUllIrnol .. .cno $atributo .. lClfIl ' J I foreach( $noca..

. .·:... • " .. al'): !oreachef-n •• ->..... I re) ( acho "<td>".·) . .•• .'n " e.... . ctabl. .. El siguiente ejemplo nos muestra su utilización: <htllll> <head. El resultado se observa en la siguiente imagen: ..' </t<S>"¡ </tr></tab1e> < Icen ter:> </bo4y:> </html> El paráme(ro •l/nombre ' pasado al mé(odo xpa th () indica que se debe buscar de rorma recursiva desde la raíz del documento la aparición de todos los elememos cuya etiqueta tenga el valor nombre..<tr> $l'lOta. . -"8SOO" . tal y como ya hemos comentado... con SiDI>leXML<r/hl:. ~lexa1_1oa~!nef 'nct...4()6 PHP 5 A TRA ~ DE EJEMPLOS ORA·MA Trabajando ron SlmpleXML ..<br:.. border-"l" eellpaddin~.JQÜ')) ( exit e 'NO • • •neueatra el fiche%o "DOUII •. <~>Tr~:lando . if Ilhle_ovcbUC'ftOtbS. . .·..''SSOO'' El uso de XPath para realizar consuhas en un documento XML nos lo proporciona.n('fln . el método xpa th () presente en los objetos eimplexrnl_element.. .. xal".> <tiele>trebajando con </hM4>o S~leXML</tltle> <bodp <cllnter:.

$~alUllll'lO. ..t/e8$'~·. '<~. $nota_final_. .·floatvallfal.tvell . ecbo '<'1'0 ALIGN.lpx¡ c:ell·p"4rUng:2px.<ITD><TD~Pr'etic.no.l11a' ><'lD>'</'l'D>.cfQ>Lbt..'D>·.aclft>' r echo 'c~Noar. •• ul (~ekground-oolorleyanl text-. (bac~·colorlyeUow...) " ecbo '<ISftLK>c/HlAD>" .D: $not•• _teori •• O..ctic•••• flo.II/2.SPAH.cITD>' I echo '~Teor!.O RA·MA cAPfnn.eoria</TD>'..a).lt<.no_ lfloatv.o 12.1Iii ' .lign1ceat.U1tJ{ .$not __ fin.l')) { ~ ~lIo • sl .a-practicaa_O¡ $not•• _finalea_O: fore.. echo ·c~'a1~·>~11~<ITD>·1 ecbo 'c'l'O ALIGN-'centu'>fal_>t....-1U.-o-~to.1 '. ... h XJC.ul'><"l'D COUPAN-'.e-Pr. ... border...c'1'D>lIatr'ÍC\ll.<~'. $n\IIILalUllnoa-O¡ $~aprobados. echo 'cTR ~'-.taula</TO>·1 $not.al_._teoria •• floatval(ta1.uter·>ta1 _ _ ~.~l.UoalJl_o:>o511 $n~._tiIlal_alu. $not..ao-~toe.~a++1 1- ) ___ ~_< _______ ~ __ ~ .brec/T!):><T[bo. .'Ol. TABLa (tc:mtfUpx Y«n1ane.l. $nota. .·c~t.'.. . .cI'rD>'·. PHP Y XML 401 T .'3'>you.o->~.40 de note.'>Al\llllnOC/'l'tl>'.¡ echo echo echo "<STYLB echo' echo' '<HSAD>c'1'l~abajaadcl eon ~'t..lUllJ1o.'a.XI!I.cb(~·>&1_ !lB W_J ( eoho ·c'l'D>'a1_. printf¡"cTD ALIQN.e<{TO.)'.lu..ao->~1a11 $not.1.llta1.c/TO"·1 echo ·cTD>'al~·~t. ·""¡ echo ·<TR>cTO>$n~.. .. .-.~.)'.Apellidoll.r'.c/Ttl></'l'R>'. echo '<TABLtt:>-' I echo '<TR CLASS.'c.. echo '<aooY><CUlib.r. ~o '<ro C01. ~ando eoo SlmpleXML El siguiente ejemplo nos muestra el uso conjunto de las funcionalidades proporcionadas por SimpleXML para obtener un listado completo de las notas de 10$ alumnos junto con infonnación estadística: <?php lf (fil __ ex1sts¡'I1oue.luanol: if¡$DOu._fioal.<rrl'l'LD'.a t"ot"I. .</'l'D><'1'D>PinAlcl~ITR»·.a+_$not.

'''r . "'.eho "</TD></TR>c/TABL8>"1 aeho 'cP>cB>Nota: </B>~robodos eL " printf f' 'al. ( axitf 'No se eneuantT~ el tichero "not.. ~io..c/P>c/CENT8R>c/BOOY>~/KTKL>'¡ ) e18. un documento XML y no en su hasta su final infonnando a la .8.2f'.4 SAX A pesar de que los analizadores basados en SAX no son capaces de validar documentOs XML. '" 12.~.. 4011 PlIP'ATRAvtsOEI!JEMPLOS ~ "cTK ~cTD ~LASS. Procesa el documento desde su inicio eventos.probodoe' $n\lll... .2f'. tlIt'-" .lu.1 ¡ ~. fS~alumnoe . Es. su rapidez y pequeño tamaño los hacen especialmente adecuados para ser utilizados en la Red..' "100 I . printff"Ol. ~~ .1unnO. echo '.·' ¡ ."1ntf {·'01.<D!r> ..> El resultado se obselVa en la siguiente imagen: '._finalea/$n~1~oalJ . . . Listado de notas (8800) ~ # -.no. "../Sn' __al sebo "c/TD><'t"D>": priDtf(·'01.f.= .. 0[' • ($nUlll..#. con SAX se de eventos.l\Dm(l. ~ >.. por lanto.. ecbo '<t'D>'. -.)~/~~. es decir.s._ • . SAX proporciona analizadores basados en visualiza el documento XML como un conjunto analizador centr. _ • !l' • .$noe.. . " • • . $not.ldo en los datos presentes en el estructura.Praetiu.2('.xal".'~rillB'>·¡ ~LASS~'B~u1' echo ~bo COLSPAN_'4'>": eoria¡$~... puesto que no tienen en cuenta los posibles DTD's asociados con estos documentos.~ .I ·V~1ore...:-..$notas ecbo "</TD>cTD>'¡ pl..

• eRA-M .ion (analizador.. CAPlnsLO 12.tr las opciones básicas de funcionamiento del analizador.. en caso de no proporcionarse se utilizará por defecto la ISQ-88591...n'!lzar en Iele~to. .:Z.. ." SAX: XML_OPTION_CASE_FOLOING XML OPTION TARGET ENCOOING 1''''''' " del documento XML. Las funciones proporcionadas por PHP para lrabajar con analizadores de tipo SAX se pueden agrupar según sus funcionalidades. 6 UN o xml-.os asignados al analizador proporcionado.. separador): crea un analizador de XML con soporte para espacios de nombres y devuelve un valor de tipo enterO que identifica al analizador créado. NOTA: Para utilizar esta función sin problema.. valor): permite fijar las opciones básicas de funcionamiento del analizador. ) por medio de la llamada a funciones definidas por el propio desarrollador.. I ... '" . para la creación y manejo b:'isico de analizadores tenemos las funciones: o xml.~. opción. o xml-P3rser_creaee_nstcodificaci6n. La siguiente tabla muestra las opciones bá"icas de los analizadore. opción): permite recuper. en caso de no proporcionarse se utilizará por defecto la ISO-8859-1... Asr.00'''' . PllPY XMI. 111 :Z... 409 aplicación que lo Ul>a de los eventos que va encontrando (tales como las et'iquclas de apertura y cierre de cada elemento.n invocados a lo largo del análisis tenemos las funciones: .')... El parámetro opcional codificación nos permite indicar la codificación de caracteres a utilizar. necesarlo tener IOIWIeda verIi60 de libXl&lllgua1 o superior. " "" .parser_get_opt. También se puede indicar el separador 11 utilizar (por defecto '.do 1..parser_create(codificaciónl: crea un analizador de XML y devuelve UD valor de tipo entero que idenlifica al analizador creado. a xml-parser_set_option(analizador.J)arser_free(analizador): libera los recuro. El parámetro opcional codificación nos permite indicar la codificación de caracteres a utilizar. las instrucciones de proc~amiento encontradas . '" o xml.. Para la definición de los diferentes manejadores o gestores de eventos que serJ.

Dicha función deberá aceptar seis parámetros: el analizador para el que ha sido definida. . el identificador de sistema (systemId) y el identificador público (publicId) de la entidad. función): asigna al analizador proporcionado la función encargada de gestionar las instrucciones de procesamiento encontradas al analizar el documento XML. xrnl_set-processing_instruction_handler (analizador. f_apertura.adas (entidades elttemas con una declaración NDATA) encontradas al analizar el documento XML. f_cierrel: asigna aJ analizador proporcionado las funciones encargadas de manejar las etiquetas de apertura (Capertura) y cierre (Ccierre) asociadas a cada elemento del documento XML. función): asigna al analizador proporcionado la función encargada de gestionar las referencias a entidades no anali7. los nombres de las entidades que se abren para el análisis de esta entidad. Dicha función deberá aceptar tres parámetros: el analizador para el que ha sido definida. y un array asociativo donde se pasan los atributos en caso de que existan. Dicha función deberá aceptar cinco parámetros: el analizador para el que ha sido definida.F • . o xml_set_external_entity_ref-pandler (analizador. funci6n): asigna al analizador proporcionado la función encargada de gestionar los datos de caracteres encontrados al analizar el documento XML. Dicha función deberá aceptar dos parámetros: el analizador para el que ha sido definida y los datos de carácter como una cadena. Por su parte. función): asigna al analizador proporcionado la función encargada de gestionar las referencias a entidades eltternas encontradas al analizar el documento XML. Se deben definir funciones diferenciadas para las etiquetas de apertura y cierre. o xml_set_unparse~entity_decl_handler (analizador. la base para resolver las referencias. el identificador público (PublicId) y el nombre de la notación de la entidad. como parámetros el analizador y el nombre del elemento. la función Ccierre sólo tendrá. La función Capertura deberá aceptar tres parámetros: el analizador para el que ha sido definida. los nombres de las entidades que se abren para el análisis de esta entidad. el identificador de sistema (systemId).10 PHP S A TItA va DE EJEMPLOS e xml_set_element_handlerlanalizador. Q a xrnl_IiIQt_character_datB_handler (analizador. la base para resolver las referencias. el objetivo de la PI y los datos de la PI. el nombre del elemento para el que se llama a la función.

Esta función produce una estructura semejante. xml_error_string (código): devuelve una cadena con una descripción textual del CÓdigo de error proporcionado. o FALSE si no se encontró ninguna descripción asociada a dicho códi go. componentes. función): asigna al analizador proporcionado una función encargada de gestionar aqueUos componentes del documento XML para los que no exista un manejador espedfico.. sirve para indicar si ésta será la última porción de dalas a procesar (los bloques de información a analizar tienen un tamaño máximo de 4. PlIP Y XML 411 o xml_set_notatio~decl~andler (analizador.. el nombre de la nOlación. Ambos Drrays hay que pasarlos por referencia.J'llllndler (analizador. Para recuperar inronnación de análisis raLlidos '1 controlar los posibles errores que se produzcan cuenta con las funciones: o xml_get_error_code(analizador): obtiene el código de error que se ha producido en el analizador proporcionado. [J . el identificador de sistema (aystentId) y el identificador público (publicId) de la declaración de notación. datos. o xml-parse_into_scruct (analizador. Dicha función deberá aceplar cinco panimelrOS: el analizador para el que ha sido definida.parse (analizador.ORA·M'" CAPrn. El parámetro opcional final.096 by/es). final): esta función comienza a realizar el análisis del documento utilizando el anali zador '1 la cadena de datos proporcionados. Dicha función deberá aceptar dos parámel1OS: el analizador pum el que ha sido definida y una cadena con los datos. se haceD Llamadas a los gestores paro los eventos configurados tantas veces como sea necesario.. Para llevar a cabo el análisis del documento tenemos las dos funciones siguientes: o xml. pero no igual. o xml_set_default. función): asigna al analizador proporcionado la función encargada de gestionar las declaraciones de notación encontradas al analizar el documenlo XML. datos.o 12. índices): hace que el analizador procese los dacos proporcionados creando dos estructuras de tipo Drray que contienen los componentes enconundos '1 los índices a dichos componentes (opcional). a la obtenida mediante SimpleXML. Devuelve TRUE si el análisis se realiza con éxito. Cuando el documento XML es analizado. o si se hace referencia a un analizador no válido.rt. la base para resolver las referencias. FALSE si no tiene éxito.

- .
412
PllP~ATRAVEsDEEIEMPLOS

O RA-MA

a xml_get_current_line_nurnber(analizador): devuelve la línea actual del buffer de datos en la que se encuentra realizando el análisis el analizador proporcionado. o FALSE en cualquier otro caso_ o xml-.Q'et_current_column_number (analizador): devuelve la columna de la línea actual del buffer de datos en la que se encuentra realizando el análisis el analizador proporcionado, o FALSE en cualquier otro caso. o xml-get_current_byte_indexlanalizadorl: devuelve el índice del byte actual del buffer de datos en la que se encuentra realizando el an{il;~i~ el RnR1 i zador proporcionado. o FALSE en cualquier otro caso. Por último. PHP proporciona dos funciones que permiten modificar la codificación de caracteres con los que está lrabnjando nuestro .malitador SAX: Cl utfB_encode lcadena): proporcionada a UTF·8. codifica

1,

cadena

1$0-8859-1

o utfB_decode 1cadena ): codifica la cadena UTF·8 proporcionada a ISO-8859-1.
NOTA~

t.. extensJ6n XML de PHP soporta el conjul1to de ~ern Urucode • Ifavft de les codiflcadonel US-ASCII. 150-8859-1 y UTp·1I. t.. c::c:)(ldic8ClOn trtT-16 1"10
_di aoportada

La sintaxis de las funciones anteriores y su utilidad dentro del proceso de

análisis de documentos XML se mueslrlUl con el siguiente conjunto de ejemplos en los que poco a poco. se van ampliando sus usos básicos para dar respuesta a soluciones más complejas. En este primer ejemplo se crea un analizador SAX básico que nos avisa (genem un evento) de la aparición de las etiquetas de inicio y cierre de cada elemento. al igual que de la aparición de las secciones con datos de tipo texto (c1/arclcler data) que contienen la información del documento:
<?

Ildatos XML B Bnal1~ar $datos ·<"l\llMO;>" .
"~tricula> xOS01</matr1cula>'.

'<nombre>~rio</n~re>".

-<apellidoa>Bueno Gutierret</apell1d~a>·, "<teoria>S</teor1l1>' '<practicBa>4 S</praceiclIs>"_ '«"1uIlll"l0>', IlmenejadQr•• functlon inlcio_el..ento(Sparser,S.t1queta.SBtributo.¡j ~bo' .lenento I <B>~lt;$etiqu.t"9t~~/B><8R>·:

G RAMA
CAPf11.¡ LO 12: PIlP Y XML. 413
)
f~ction fi~ela.ento($parser.$etiqu.t.){

1

.eho·
)
f~

elelll8tlto

<8>41t;/S.tiqueta4gt,< B>.,¡:BJ!:>-

tion dato, (Sparser.Sdato)( echo • datos: <B>Sdato< fB><BlL>' •

)

ler P.U(
$pars.r •
~...,Pars.r
~-P&rs.r_cre.t.(),

_optlon($pars.r. XHL_OPT7a. _CA8Z_, FOLDx.Q, O), •• t ..optlonUpars.r, XHL_ OP'l'lON _ 811ttJ>_ WHln. 1), a.l-p,rs.r_ ,.t_optlQn('pars.r. XHL_OPTZOU TAaQ&T_KMOOnxNO. "Z80~"S'·l"11
~~r,.r _ •• t

1I 2' pliSO

. .1 _•• t . • l . . .nt~1.r($par •• r. "inlcio . • l . . .nto", "fin . l. . . nto"JI
. .1 •• toh,r.ct.r_d.t.~l.r{$par •• r.·4ato."JI

1

«html>

,<helld,.

<title>Tr~j.ndo

con SAX<Jtitl&>

</hNd::.
« center>
«h2>Tr~jllndO

con SAX</h2></center><pr.>

<'php
3.r ""SO H 1 : ~..»&rs.(tparaer.$dato •• true) ' ( echo '<.pan atyle.'color,reé; feClt: bold 18p~ Ve.loSal... ::.' echo °Error XML i~, ~get _ erTOr codee$par.srl ,· echo ••• ~ _ .rror_.triDg(~~t _ .rror _ eods(,par •• r)). o'<BR>"¡ echo linH '. DIl.gst_C\lrr8At_ liDe_ nuMer(tpar • .r); • ':olUll'll'"l'· , .-J..-SI.,, _ ourr_I:_OOl _ _ ......."'t.pa..o••"') ,
..,- ) </span>" I

</pre>
</body> </htllol>

"

Co mo podemos observar en el código, la forma de operar con este tipo de anali zadores es muy senci lla. En un primer paso se crea el analizador y se le fijan las opciones básicas de funcionamiento. Posterionnente. se le asignan los manejadore'> de los componentes que queremos controlar y sus correspondientes funciones asociadas. Por último, se reaHza el análisis. En nuestro ejemplo, en este último paso, también se lleva a cabo el control de errores. El resultado de ejecutar el script se visualiza en la siguiente imagen:

414 PfIP S A TRA vts DE EJEMPLOS O RA·MA

---_ . _.... ._.,...... ... _ .. . ,. --.'-". ._ .....'-oO~ oO~

...

~_

.

.,

<~-~

• ,

,...

_.~

•••

••• .,__ t. ..... '. • •• .,_ .,_.
el_...

o O n _ _

........ • "-'"" • ., • .......... • • ....
./

• • .~-~ • ,

.....

-~

~~

• .,..........> •

r

En caso de que los datos a analizar estuvieran mal formados, habrlamos obtenido el error correspondiente. Por ejemplo, si hubi~ramos intentado analizar los siguientes dalOS en los que se abre una etiqueta cuyo nombre no coincide con su eliquela de cierre correspondiente:

(§<14t.oa

JO

·_<aatricula.:>xOS01< 'lIatricula>_';

.:.::...:..:..--.

I

El resultado hubiera sido el mostrado por la siguiente imagen:

• •

.'-.'__ -"-0:.
""oo ..,..
.~

Tnbajando con SA.'X

• 'w, •

El siguiente ejemplo muestra un uso más avanzado de las funciones proporcionadas por SAX para manejar documentos XML. El scripl visualiza el

., olvel de enid.miento
/1

documento XML analizado mOSlrando de forma diferenciada cada uno de sus componentes:
4e le etiqueta

$nivel"1; $ceabier_lineesfelae:
I ~nto dJC ~to •

XML a analizar ·pn,¡eba.xml",

CRA·MA

CAPfTuLOI2: PHPYXML 415

11 lMJlejadores function inicio_el~nto(S~rser,$etiquets,$atributos)1 global $nivel, Scambiar_linGa;

echo '<P STYL¡;;"'padding- hlf t : ",$n!vel " lO,'px; '>¡.lt;"; echo "<SPAN ela99~'etq'>$etiqueta"; "hile (liBt ISa.tributo. Svalorl • e a ch ISatdbutol' I I echo" <SPAN clasB~'atr'>$a tribu to."Sv41or<IS PAN>\··;
)

echo '</SPAN>&gt;";
Scambiar_linea~ f alse;

$nivel .... ; function fi"-eleme n toIS~ rBer,$etiqueta){ global Snive l, $cambie r_linea ¡ $nivel--; i f l $cambiar _linea) echo '<P STYLE~'padding- l eft",$nivel · 20, ' pX¡ ' >"¡ echo '&lt:I<SPAN clas$D ' etq'>$e t i quete</SPAN>&gt¡</P>'; Scembiar_l i nea=true : function datOB{$p arser,$deto) ( echo '<SPAN class"'val'>Sdato<ISPAN> ' ; tunction resto_info($paraer,SdatOB) ( echo '<I>$datos</I><BR> ' ;
)

,.
<htra.l> <head> <meta http-equivg ' content- type ' content_'text/hteU; '> <title>Tr~j4ndo can SAX</title> <Btyle type~'text/csa'> ,etq (color:blue¡) .str (color:green¡) ,vel {color:red¡} .err (color:red; font' bold llpx Ver dana;) code (tont ; 11px Ver dena¡ l i ne-height:Opx¡ col or:blue¡) </atyle> <(heed> <bo(1)'> <cente!;"> <h2>Trabaj~c1o con $AX</hl></center> o<br><ccde> <?php /1 ler paso
r • xa1~r •• r_c~t. ( ), xal.,.PU' •• r _ •• t _ QPtiCN1 ($par.u, xal.~ •• r _ •• t _ gptiCN1C$per •• r, xal.,.PU' •• r _ •• t _gptionC$par.u,

.par..

»IL_OP'l'l:c:...CAP:~roLD:mII,

~OP'l'l:a-_ ~._. . t~,

O), 1),

»IL_OP'l'l:oa_~~_~,

·X80•••

".l-} ,

11 2" paso
xal._ •• t_.l...nt~.r(~ • .r, -laJcio_.l...oto.,.fia_.l...ato.), xal._ •• t_char.ct.r_4at.~.r($par • .r,'4ato.·), xal. __ .t_~f.ult_~.r { .par.er,·r..to_info-I,

I/ler paeo

416

PHP 5 A TRA vts DE ElEMPLOS

O RA-MA

iff'f!le_exist.!$docueantoll( dial'NO se puede encontrar el lfl'ISfp _
whilel~~e

ticher~'·$docu.ento\·

')1

ifopentScloc~to. ~uede

"r'I))1

dial'No se

Leer el fichero\'Sdocumento\',')

• fr.-4l'fp. _O,a»i if!I x.!-Parse¡$parser, ,dat•• Leof(,fPll )( echo -"canter"' .. ' P<Jn 'las; 'ur''''j ec;:ho 'Error XKI. ¡', -.l--'l'et, error .. c:oa.Uparser) : '¡ eeh( ·'", x.l _error strlaglx.l_ vet . error. codel'parssr)) ,"<SR>" echo Unea ·, x.l .. vet , currellt l1De nWlbsrUpareer) echo " col\,lllU\lI ',~ __ get _current _col _ IIWIberUparser) I echo' ---</span>"¡Center>' break;

)

fclOllel$fp) ;
~-p&rser_ free($parserl,

"

<Icod.e>
</bo4y>

c/htllll>

El resultado se puede visualizar en la siguiente imagen:

...-

- ..
-

._. -

_ _ ---" . __ .. -, _ ' --' -.-._.--_> .....
....

.'

• .

TMlbajando coa SAX

.........;.;..,

.....

,

,

,_...
=

....-

..

En caso de que no queramos utilizar el sistema de eventos proporcionado por SAX, podemos recurrir a recuperar la infommción en estructuras de arrays hllciendo uso de la función xml..,.parse_into_struct (), Para el mismo documento XML (prueba, xrnl) del ejemplo anterior los (Irrays definidos serían:
Array de índices
Muyl

a1,,",01
I

I J_tricula)

11' ,

lO. ., o

..

Ar'Cay

.•
.,
Array

CI RA-M"

CAPITuLO 12: PIIP Y XMl.

417

(OJ
ncabrlll

.. 1
ArToy

-,

(O] _, 2
idos)

o..

..
-,

Array
l

(OJ
)

¡doto.-Per.onolea] .. " Arroy

101 111
l [dir.ccionl
(

. .., ,•

101
[provincia]
(

1

..

-,

Al:l:ay

5
Array
6

-,
-, -, -,

IOJ
[poblacion]
(

Arl:ay
7

(O]

Si nos fijamos. la estructuro está compuesta por un arra)' asociativo (cada entrada corresponde a un elemento) compuesto a su vez por arra)'J' que indican la posición relativa de los elementos respecto al array de componentes, Por su parte la estructura del array de contenidos sería:
Array I
D)

Array (lag] .. > alumno [ty¡Mt1 .. > open

[ levell _, 1

I1J

-,

Array ¡ugJ .. " matric\,IllI [ty¡Mt] "" complete

[level] 2 [valueJ lo> x0502

.,

121

-,

Array I tag] .. " nombre Itype) .. > cocnplete

Ilevel] 2 Ivalue) _> Rodrigo

-,

III

-,
(

Ar,,"y

418

PIIP!lATRAvtsOEEJEMPLOS

ClRA-MA

¡.al." Array

,
,

(tagl _> apellidos (typeJ _> complete (levell . , 2 (value] _> Vaquero Gutierrez

(taq1 . , doIt~J)erlon.ales (type) 1'> open
Ile~11

_> :2

[SI _> Array

[tag) _, direccion [type] .> c~lste

Uevet}
I

.>

3
~,

[ettributsa)

Array

[tipo]

(n\lll\) __ ,

.>

9

calle

[valus] _, Amapola

[61 .;. Array
[tag] .> provincia (typeJ ., c~lete [l"vell . , 1 :value] .> Ma~id

,

(7J .,. Array

[ta91 ., poblacion Itype] ., c~lete [level] . , 3 [attributeal . , Array

,

[valusJ .. , Madrid

181 ., Array
lteg] z> dataa-P8raonalea [type] "'> cloa. (hval] 1'> 2
[9J -,
ArTay

{tag] _, alUlNlo [type] .> clase [lavel] .. > 1

ORA·MA

CAPrruLO 12: PIW V XMl. 419

Es decir, un array en el que cada fndice corresponde con un elemento del documento. Cada entrada es, a su vez. un array asociativo con las enlradas tag (nombre de la etiqueta), type (tipo de etiqueta, aperturd -open-, cierre -close- o completa -complete-), level (n.ivel de anidamiento) y attributes (array asociativo con los atributos de la etiqueta si éstos existen). Además, en el caso de que la etiqueta sea de tipo completa aparece la entrada value (valor textual de la etiqueta),
El siguiente código obtiene los mismos resultados que el ejemplo anterior, pero esta vez trabajando con las estructuras recuperadas con la llamada xml-parse_into_struct():

<,
If 4ocumento XML • ~n~lizar seocumento ~ ·prueba.xml',

Illoe un documento y lo almacena en un array funct lon leer,.docUI!Ient o ($4ocu",""nt:)) (
iftlf11~exiBtB($doeumentoll

diat'No 00 puede encontrar el fichero\"Sdocumento\'.'I, ift! tStp • itopenl$docuneDto, "r'll) di.I'No o. puede leer el flcharo\"Sdoc~to\' "'¡ raturn freadtstp. 4096)1 Illerpa.o S~ro.r • ~~rBer_craat.t); xml-iMlfller_lIet_optlcmtSpanar, XMt.,..OPTION_CASiLPOLOlNO, 01; Kml~~ •• ~~a.t~option(Spara.r. ~OPTION_SRIP_WHtTH. 11,
xml~rear.Bat_opt1on(SpdrBor, ~OPTION_TARGET_ENCODING.

'1$0·8859,1') I

1/2 0 paso $data • l . . r...docW\lento ($dOC'\lU'loVltol: if I ! ~,.p&r" ., l¡¡to~.tX'IICt (Spar&lIr . fdAta. te S lI~ho "<p claaB.·llrr'~·) echo 'Brror XML ('. XII'll,.,get_IIrror_CQdeISparaell . "1 I "¡ echo ·",xml_lIr~r.Btrin9tXll'll-get_.rTDr_codlll$perPerl), •. <BR>", echo' . - - linea •• xm.l_get.Cll.rrent_line.numbllr t Sparaerl ; echo '. colW1'll4 '. XInl-get.current_column_nl....~r C$paner) • . .. <'p>' I

_toe., )(

)

xml,..P4rBer _free($pareer);

,>

-<htmb
~~tA htrp_~)¡v~'rn"tp"t.typA' rnntent. ' tMxt/hrml , .• <tlrlll>Trabajando con SAX</t1tle> <Btylll typ~·t.xt/ceB·> .• tq tcolor,dorkblulI;) .•t, tcolor:qreen, I .val lcolor,rltd¡l .lIrr tcolor,red¡ lext-aliqn,center¡ line-heiqht12~¡ ¡ c{>(l.. 'tont: 12px Ver(iana; i1nll-helqhtlDpx; ,:olor'blulI¡} <I.tyle:o
</hN4~

<body>

-<h2.Trabdjando con SAX</h2></oenter>

420 PII P 5 A TRA vts DE EJE.\ol PLOS

ORA-MA

<:br><cQde>
.>php

for(,i_O, ,i<:eouatl'ea.pon.ata.), t1++)( $nlvf"l .. te: c_.nta.Uill'1_l')· 20r ech,o '<P 'WYLE"paddlnQ-lf"ft¡',$nival, '1.))1: "'''lt "1 echo " <SPAN cla s •• 'etQ''''· :if( $c~Dt •• I'iJI·type'J "e:10B~') echo ',', echo 'ei $~QaQta.(,ill·t.IIJ'l : if (array_~_exi.t.('.ttributa.'. ,e~anta.l,il») while 1~1.t ¡Sat r ibuto. $valor) • aaeh " e~ta.(,il(·.ttributa.'J ). echo • <$P~ cla••• ·.tr " .tr1~to , Sv. ~ >t<J SPAH>\ "
}
if($c~t •• {'iJ

(·type·J •• ·c~lata·)( echo '''gt;<$PAN cl ••• Y'val'>' ,o~Qt •• ('11 echo "<:ISPAN~"lt:" "c:o.poQ.nta.[,11 ['t.g'l ,"

('v.l~a'l

,>
<!cocle>
</body,..

</html'

Como podemos observar en la siguiente imagen. el resuhado obtenido es idéntico al del ejemplo anlerior:

_.
........ ,0>.

.

....

-,
.,
11 val'iables
$Datrlcula~ t ray()
Snombre~ar ray{):

-,
'1"'

~.... _ _ _ ,
,~~

.-

~,....,.--",","

--.>. . . . .""

~-

--,,,.
.~

=

También podemos crear nuestras propias estructuras partiendo de un analizador SAX bási co. El siguiente ejemplo nos muestra un script que analiza un documento XML y recupera su información en un conjunto de arrays que posterionnente se utilizarán para generar el listado completo de alumnos:

'apellido._a rrayl),

Steoriagarrayll:
$pl'.etiea8~aTray{l¡
$.l~ento_aetual

_ ••

Saalqn.tuT4" " ¡

e RA·MA

CAPITUlO 12: PIIP Y XML

421

ti 10

~nto

XML a

anali~ar

'd4c~eo
I

·notas.~·

_n.ja<!o1-••

funceioa LaJeio _.l..-ntoC.par•• r ••• tiqg.t •••• tributo.)( glObal '.l..anto . • ctual.$ •• ignatvr., if l $.tiqu.t.···not. . ·) $•• ignat~$.tributo.( · •• ignat~.'], ,.1_lIto.. • etual_$.tiqu.t.,
I
fUl

t

In

tin_.l ....ento($pars81. ,etiqueta) (

I
t~otiOD

4ato."para.r.ea.to)( global $.l..anto_ .etu.l.$. .tricul •• $no.br.,,~llido •• 'taori •• $pr.otio.a,

I
11 ler pa.o

$p.r •• ", • .-l....,P.r •• r ._or_t. C), -.l....P&r•• r •• t _ OS)tioll($p¡Lr'~' XHL_OH.10N._CAft POId):r.o;, D), .-l-»er•• r . •• t _option($par•• r, XNL_oPr.1ON . ~~~ aMeOOXMO, ·.18O-115t-l"), .-l...,P&r.ar..•• t _option{$par•• r, lDIL_OPl'.ION . map _"'tITII. 1),
11 2" palIO
~_

•• t _.l-..t_~l.r C$par.ar, • iDicio.. al_bto", • fin al_lito"), .-l_. .t_ohar.otar _4at.~.r{$par •• r,"4atos"),

" 10· paso function IInIIlizar_docwmento($parser, documento)1 if{lfile_eXl.ts($documento)I ( di.I'No a. puede encontrar el fiebero\·$doc-.nt.) • ")
I if(ll$fp. 'topen($dOCUftento, -r') )Ie die' 'No ,,, puede le--~r el !ten.re
~dOCUll\tl!lto\'"1

I
whUa($data fread($fp, 4096' Ji
lf(I ~-PBZ •• ('~ar.

$dat., f.ofelfp)) I

acho

'<p clas,

'err'>':

echo 'Error XML (·, -.l~.t_.rror ,codee$pars.r) '1 "¡ .cho "", ~_error_strln,,(xal.-'J.t_ .rro>: _.ood. Upars.>:) ) , • "SR>", echo linea " ~--9.t _ eurrant ._ U. _ _n~r(,parsarl:

.cho
echo
break,
)

columna
'--"/p>";

·,~_".t_curr.llt_colu.n

nw.barC'par•• r) ¡

fclo.e($(pl; xal.-»&rs.r _fr . . C$parsarll
11 lar paao
an.li~ar_doc~nto($pareer,$doeumentol¡

echo
~ho

"<KTKL><~·;

"<meta

aoho

http-equiv~'content-type' CQntent_ • .xt/ht~ "<TITL~Trabajando ccn XKL .. /TITLE></H&\l»",

'>"

echo "<BODY>"CENTE.It><H2>ListacSo de notas

$a.1onatura! -< !IiZ.- I

422

PHP 5 A TRAVÉS DE EJEMPLOS

o RA·MA

Kho "<TABLE STYL&wo'font:lfop:K Verdllna;

8OItDI!It-':l' CJ1.LIo\COJ:lOo

"',

KM "<TR 8GCQLOR_ ' CY&D' ALIGN_' center' ~<TD CQLSPAN-' fo ,.A.l.-,o.c/'fl>", echo '<rO COLSPAH- ' )' ~t •• </'t'D>< ITR> " ; echo "<TR BC)('(X!IlR_'~llow',.c~t</~<TD>oMa.tr.. l.C1Jt.lcul.c 'ftb."
hQ

"<TD>Ro.bre</'J'D:>c1'D>.lUdo• .c/~·,

$nUlll..aprobedo•• O/
$nu.L.l~.·countf "'t~ l/
for($i.OI,i<$n~l~o.:$i·.I(

echo echo echo
~h..

"cTR><~·,$i.l, '<f~"1

·<'t'D>", ,,,~lGW1a[tll . '<J~ ' ; '<TO~·. tUOMbee(t11 .·<fTD>·:

. ..TD.. " •• ~11Gu.ctl1 . '< ¡TtI.. • ¡ echo "<TD ALIGN~'cent e r '> t~l.[tll </~' 1 .cho '<TD ALI CN-'cen ter'> tpraatlo,,[,ll </TD>"/
~_!1D&l.'ll.(tt~1.['11.,pr~10.'['11./3,

printf('<TD ALIGN.'cen t.r '>'O l "2fcfTD> · " ~_!laaie."'J J, if IS not8._finale.[$i]>5J $n~.probad08"¡

echo "<TR 8OCOLOR-"cyan' ALIGN_'center'>'; echo '<TU COLSPAN-" 4 ' >V.lore • .edio. (Sn~.luano• • 1u.no.I.c/~': echo "<TO 8OCOLOR .. "yel1ow'> " ;
printf(·'Ol"2f",.rr.y_.U.(Steorl.J/$n~.lumno.);

echo '</'11>', echo "<TD BaCOLOR_'yellow'>"1 rintf("\Ol,2f·,.rr.y_8um[Spr.ctlc •• I/Sn~.1~o.'
echo '</TI»'I

fiCho '<TO BOCOLOlt.'yotllow' >'1
rlntf{"\Ol,2f·,.rr.y_.~(Snot&._finale81/SnumLaluano.l¡

echo ''lITO>' J echo "</TR></TABLE>"¡ echo "<P><B>Nota: </B>Aprobado8 el '; prlntf(·\Ol.Of", (Sn~ap~obado./Sn~al~08)
echo
"</P></CENTER></~</HTML>",

· lOOJ,

En el código se parte de ci nco arrays vacíos que hacen referencia a los cinco tipos de datos que se almacenan de cada alumno, Estos arrays se van rell enando, dentro del manejador de los dalaS de tipo carácter, con los datos según van apareciendo (se uti li za una variable de variable para referenciar a los arrays), El resultado de ejecutar el scripllo podemos observar en la siguiente imagen:

e

RA-MA

CAPmJl.O 12: PHI' Y XMl. 42.\

-_ _,..._ ..... -. --1 '- __ _ •.... _ __ . _ _

...

.

.,-

Listado de noto (SSOO)
T .................

• __

,....,....~

r , ¡;oiOi"'" fm - ... ~u
~to ~-.u

1.00$01 o.... i ~ .í' <#9>¡;';;;;;;~

¡¡;;:.¡,;,o -.....

,
t
11

•s
1

"

1

'" '"

12.5DOM
El DOM. Documellt Object Modelo modelo de objetos de documento, se originó como una especificación que pennitiera a los scriplS Javascript y a los programas Java ser portables entre los diferentes navegadores Web. Podemos considerar, por tanto, aJ HTML dinámico o DHTML como su antedecesor. Pero ha evolucionado hasta convertirse en una interfaz estándar para la programación de aplicaciones (API) orientadas a trabajar con documentos HTML y documentos XML bien formados. El DOM define la estructura lógica de los documentos y el modo en que pueden ser accedidos y manipulados. De este modo. los programadores pueden definir documentos. navegar a través de su estructuro y añadir, modificar o eliminar sus componentes y/o contenidos. Este modelo puede ser utilizado en una gran variedad de entornos y aplicaciones. pues es independiente de la plataforma y del lenguaje de desarrollo. A través del DOM cuaJquier documento HTML o XML bien formado puede verse como una estructura de tipo arborescente, en la que cada nodo del árbol representa a un componente del documento. Además. cada elemento se modela utilizundo objetos (de ahí el nombre de modelo de objetos). es decir, los nodos del árbol que representan al documento no hacen referencia a estructuras de datos sino a objetos que tienen métodos y propiedades. Como modelo de objetos el DOM identifica:

• las interfaces y los objetos usados para representar y manipular un
documento.


ta semántica de esas interfaces y objetos, incluyendo sus ambutos y comportamiento. las relaciones y colaboraciones entre esas interfaces y objetos_

424

PIIP S A TRAVI1$ DE EJEMPLOS

CI RA-MA

12.5.1 Intérfacés dél DOM
Tal como hemos indicado anteriormente, el DOM representa los documentos como una jerarquía de distintos tipos de nOOos. Tooo documento tendrá un nooo raíz. diferentes nodos hijos y lo que se denomina oodos hoja o nodos finales (aquellos que no tienen nooos hijos).

La

muestra los tipos de nodos que maneja el DOM:

En esta sección se muestran algunas de las interfaces más importantes del DOM, si bien éste cuenta con un juego mucho más amplio.

I
.

NOTA: Para obt8f'lef mal lI'IformIIciórl sobre OOM Y tecooIogias afino, .. puede: NC:Wl'ir a 111 dncd6n htIDJ.IINwtt w3 omfIRIOOM-!.tY!I-3=Cg! .

I .

12.5.2 Inlérfaz node
En general a cada tipo de nooo le va a corresponder un tipo de objeto y un tipo de interfaz específica, sin embargo, existe una interfaz primaria, la interfaz nade que es implementada por la mayor parte de los componentes del DOM.

a attributes: colección de nodos (interfaz NamedNodeMap) que contiene los atribUlaS del nodo actual. a baseURI: URJ de la base absoluta del nodo actual o null si no está definido. o childNodes: lista de nodos (ioterfaz nodeList) hijos del nodo actual. o firstChild: el primero de los nodos hijos del nodo actual.

o RA-MA

CAP!111LO 12: PIIP Y XML 423

o lastChild: último de los nodos hijos del noclo actual. o localName: pane local del nombre cualificado del nodo actuaL
Q

namespaceURI: URJ del espacio de nombres utilizado por el nodo actual.

Q

nextSibling: nodo inmediatamente siguiente al nodo actual. si no existe devuelve nul!. o nodeName: nombre del nodo actual. o nodeType: tipo del nodo actuaL

o nodeValue: valor del nodo actual, dependerá del lipo de nocla. La siguiente tabla muestra cómo varían los valores de nodeNarne. nodeType y nodevalue en función del tipo de nodo:

]
f,

TEXTJ«)DE

CDAT",-SECTtONJ«)DE

o ownerDocument: documenlo (i nterfaz Document) asociado al nodo uctuul. o parentNode: nodo padre del nodo actual: si no existe. devuelve nul!o a prefix: prefij o del espacio de nombres utiliz.1do por el nodo actual; si no está definido. devuelve nul!o previousSibling: nodo inmediatamente anterior al nodo actual; si no existe. devuelve nul!.
Q


426 PHP S A TRA vEs DE EJEMPLOS

o textContent: contenido de texto del nodo actual y todos sus descendientes.

o appendChild(nodo}: ornade el nodo proporcionado al final de la lista de hijos del nodo actual. Si el nuevo hijo ya existe en dicha !isla. primero se elimina.
o cloneNode{clonar_hijos): devuelve una copia del nodo aclUaI. Si clonar_hijos es true, también se clona el subárbol bajo el nodo actual. o compareDocumentPosition(nodo): compara el nodo pasado como parámetro con el nodo actual teniendo en cuenta su orden dentro del documento.

o getFeature (realización, versión): devuelve el objeto que implementa la API que contiene la realización con la versión especificada.
a getUserData (clave): devuelve el objeto asociado a la clave indicada dentro del nodo actual (ver setUserData ( ).
a hasAttributes (): devuelve true, si el nodo actual, de tipo elemento.

tiene atributos. [] hasChildNodes (): devuelve true, si el nodo actual tiene nodos hijos. [] insertBefore(nodo_ins, nodo_ref): inserta el nodo_ins antes del nodo_ref. Si este último nodo no existe, nodo_iDs se insertacl al final de la lista de nodos hijos del nodo actual. Si nodo_ins es de tipo IX)CUMEN'CFRAGMENT_NODE. todos sus nodos hijos serán insertados en el orden en que aparecen. Si nodo_ins eJliste actualmente en el subárbol del nodo actual, primero es eliminado.
[J

isDefaultNamespace lespacio_de...J1ombres): comprueba si espacio_de_nombres proporcionado es el utilizado por defecto.

el

[J

isEqualNode (nodo): comprueba si el nodo pasado como parámetro es igual al nodo actual.

[] isSupported (realizaci6n, versi6n) : comprueba si la implementación del DOM incluye la realizaci6n con la versión solicitada y si el nodo acrualla soporta.

Además. o documentElement: proporciona un acceso directo al nodo miz del árbol que representa al documento. a normalize (): une todos los nodos de texto adyacentes (inlerfaz Text) del nodo actual. 12. El resto de los diferentes tipos de nodos no pueden ex. o removeChild(nodo): elimina el nodo hijo pasado como parámetro de la lisIa de nodos hijos del nodo actual. o lookupPrefix(espacio_de_nombrea): busca los prefijos asociados al espacio_de-Ilombres dado comenzando por el nodo actual.5. Se puede indicar el manejador asociado a la clave. se eHminará cualquier asociación ellistente con la clave dada (ver getUserData (».ORA·MA CAPIl1. asociado con el documento actual. en un solo nodo por cada bloque de texto.ist3. Devuelve el nodo hijo eliminado. nodo_viejo): reemplaza el nodo hijo nodo_viejo con un nodo_nuevo. o replaceChildlnodo_nuevQ. Si el objeto pasado es nUll . PHP Y XML 427 Cl lookupNamespacesURI (prefijo): busca los espacios de nombres asociados al prefijo proporcionado comenzando por el nodo actual. manejador): asocia a un objeto del nodo actual una clave. todos sus nodos hijos serán insertados en el orden en que aparecen.o 12. Extiende la interfaz node. o config: objeto con la configuración actual del documento.3 Interfaz Document La interfaz Document representa al documento XML o HTML completo. al elemento principal (document e/eme/u) del documento actual. a setUserData(clave. tipo del documento.lI.istir fuera del contelllO de un documento.! poder crear los diferentes tipos de nodos. D actualEncoding: codificación actual del documento o null en caso de que ésta no ex. esta interfaz contiene los métodos necesarios par. Si el nodo_nuevo es de tipo DOCUMENT_FRAGMENT_NODE. . Conceptualmente es el nodo raíz del árbol que representa al documento. objeto. D doctype: OTO. En caso de que no exista devuelve null.

será eliminado primero de su lista de nodos hijos. el version: valor del atribulo version de la declaración xml. o createAttributeNS (espacio_de_nombres. Si el nodo tiene padre. o standalone: valor del atributo standalone de la declaración xml. o implementation: objeto con la implementación actual del DOM que está siendo utilizada. a strictErrorChecking: indica si se ruerza o no la validación de errores. Attr) con el nombre dado. . o createDocumentFragment (): crea un nodo de tipo fragmento de documento (interfaz DocumentFragment) vacío. nombre): crea un nuevo nodo de tipo atributo (interfaz Attr) con el nombre dado y calificado con el espacio_de_nombres proporcionado. Esta nueva instancia deberá ser asignada a un elemento (interfaz Element) utilizando el método setAttributeNode ().428 PHP. con la versión del documento o null en caso de que éste no exista. O nu11 en caso de que éste no exista. a createCorrunent (cadena): crea un nodo de tipo comentario (interfaz Corrunent) con el valor especificado en la cadena proporcionada. a encoding: valor del atributo encoding de la declaración xml. o adoptNode(nodo): cambia la propiedad ownerDocument del nodo proporcionado y de todos sus nodos hijos. con la codificación del documento o null en caso de que éste no exista. o createAt tribute (nombre): crea un nuevo nodo de lipo atributo (interfaz. o createCDATASection(cadena): crea un nodo de tipo sección CDATA (interfaz CDATASection) con el valor especificado en la cadena proporcionada. en otro caso null.5 A 11tA V~ DE EJEMPLOS o documentURl: localización del documento si existe.

:J IJ createEnt. h¡tce referencia a toda:) las etiquetas..1O adyacentes (inleltaz Text) dd dncumenlo acrual en un solo nodo por cada bloqul' de lexto renameNode (noocI espacio de.. mportNode Inodo. H . getElement 3yld (identificador 1: devuelve el elemento (interfa1E.. El valor e.e RA-MA CAPITul.. nombre): crea un nodo de tipo elemento (interfaz Element) con el nombre dado y calificado con el espacio_de_nombres proporcionado.ttyReference (nombre) crea un nodo de tipo referencia enLidad (interfaz entityReference) n la entidad indicada por nombre. IJ createProcessinglnstruct~ontdestino. Si este elemento no e:Wlle.O 12: PIIP "1 XML 42'J IJ createElement (nombre): crea un nodo de Lipo elemento (inlerf:u Element) cuyo atnbuto nodeName es nombre. importar _h~ )8) importa un nodo desde airo documento. El valor espcctnl ....r.. brea U ...ementsByTagNameNS ¡espacio de nombres nombre: Jevuelve una lista de nodos (interiaz nodeList) con lo~ elementos cu)'o nomhre de euquela coincIda con el nombre local y espacio_de_nombres proporcIOnado. Si importar _h~ jos es true. ement) cuyo atribulo ID coincide con el identificador proporcionado.. ~ o getEl. nombre): rcnomhra el noda dado enn el nombre calificado por el eapacio_de.. devuelve nu. J getElementsByTagNameCnornbra devuelve una lista de nodolo (Interfaz nodeLutl con lo~ elementos cuyo nombre de etiqueta coincida con el nombre proporcionado. no~res. J . :J narrnalizeDocument (): une todos los nodos de tex.. creand{l una copia del nodo OriginaL El nodo devuelto no tiene padre. o createTextNode (cadena): crea un nodo de lipo texto (interfaz Text) cuyo valor es la cadena dada..U. datos): crea un nodo de tipo instrucción de procesamiento (interfaz I:'rocessinglnstruct!on) con el destino y los datos proporcionados. SI!' Imponarán todos los hijos del nodo seleccIonado. createElementNStespacio_de_nombres.. pecial ~ hace n::fen::ncia a todas las eLiquelilS..

nombre): devuelve el valor del atributo especificado por el nombre local y espacio_de_nombres proporcionados o la cadena vacra en caso de que no esté especificado su valor o getAttributeNode (nombre): devuelve el nodo asociado al atributo cuyo nombre coincide con el proporcionado (interfaz Attr). a getElementsByTagName (nombre): devuelve una li sta de nodos (interfaz nodeList) con los elementos cuyo nombre de etiqueta coincida con el nombre proporcionado. Extiende interfaz node. nombre de la etiqueta." hace referencia a todas las etiquetas.AttributeNS (espacio_de_nombres. El valor es[X. cada uno de los componentes delimitados por etiquetas de apertura y cierre o etiquetas vacías. S610 se pueden renombrar los nodos de lipo ELEMENT. a getAttributeNodeNS (espacio_de_nombres. 15ROPIEDADES: CJ CJ SChemaTypelnfo: tipo de información asociada con el elemento. o get. ~ETODOS: o getAttribute (nombre): devuelve el valor del atributo cuyo nombre coincide con el proporcionado o la cadena vada en caso de que no esté especificado su valor.-NODE o ATTRIBUTE_NQDE 12. es decir. devuelve una lisla de nodos (interfaz nodeList) con los elementos cuyo nombre de etiqueta coincida con el nombre local y espacio_deJlombres proporcionados. . nombre): o getElementsByTagNameNS (espacio_de_nombres.5.H hace referencia a todas las etiquetas.'Cial ". El valor especial ".4 Inleñaz E/emen! La interfaz Element representa a los elementos básicos que configuran los documentos XML o HTML. nombre): devuelve el nodo asociado al atributo especificado por el nombre local y espacio_de_nombres proporcionados (interfaz Attr).4]0 ""P ~ A TRAV~ DE EJEMPLOS proporcionado. tagName: nombre del elemento.

devuelve true si el elemento presenta un mribulo con el nombre local y espacio_de_nombres proporcionados O dicho atribula tiene asociado un valor por defecto en el OTO asociado. nombre): eliminu el alributQ que coincide con el nombre local y espacio_de_nombres proporcionados. Si actualmente existe un nodo atribulO con igual valor en el atributo nodeName. a setAttributeNode (nodo): crea un nuevo nodo ele tipo atribUlO (interfaz Attr). simplemente modifica su valor con el valor proporcionado. . se creará de fonna automática un nuevo atributo con dicho valor. se creará de forma automática un nuevo nodo atributo con dicho valor. valor): crea un nuevo a(ributo con el nombre local y espacio_deJlombres proporcionados. es reemplazado. Si este atribUlO tiene un valor por defecto asignado en el OTO asociado. ~tributol: a removeAttribute (nombre): elimina el atributo que coincide con el nombre proporcionado. Si este atributo tiene un valor por defecto asignado en el OTO asociado. simplemente modificll su valor con el valor proporcionado. a removeAttributeNode (nodo): elimina el atributo correspondiente al nodo proporcionado. o setAttribute (nombre. nombre. a hasAttributeNS(espacio_de_nombres. Si aclUalmcnte exi!J. Si actualmente existe un atributo con dicho nombre local dentro del mismo espacio de nombres. o removeAttributeNS (espacio_de_nombres.CI RA-MA CAPITULO 12: PHP \ XML 4_'1 a hasAttribute (nombre): devuelve true si el elemento presenta un atributo cuyo nombre coincide con el proporcionado O dicho atributo tiene llSOCiudo un valor por defectQ en el OTO asociado. valor): crea un nuevo atributo con el nombre y valor proporcionados. se creará de fonna aulom6¡icu un nuevo atributo con dicho valor. Si este alributo liene un valor por defccto asignado en el OTD asociado. Si actualmente existe un nodo atributo con el mismo nombre local y espacio de nombres.te un atribUlO con dicho nombre. es reemplazado. a setAttributeNS (espacio_de_nombres. a setAttributeNodeNS(nodo): crea un nuevo nodo de tipo atribUlO (interfaz Attr).

que el atributo especificado por el nombre proporcionado es de tipo ID. [J o setIdAttributeNS(espacio_de_nombres. que el atributo especificado en el nodo proporcionado es de tipo ID.omiene. previouSSiblJ. nombre. esID): indica. los a rributo~ heredados parentNode. 12. U schemaTypeInfo: tipo de inrormación asociada con el atrit'luto actual speci fied: toma el valor trua cuando al atributo se le ha asignado explfcitamente un valor en la IDstancia del documento aetual.5 Interfaz Attr La interfaz Attr representa un ambulo dentro Je un objeto de tipo Element. si el parámetro esID vale true. esID): indica. el elemento podrá ser recuperado posteriormente haciendo uso del método getElementsById (1 presente en el documento (interfaz. esID) indica.432 PUP 5 A TRAVas DE IDEMPLOS setIdAttribute (nombre. Document) que lo contiene. o name: nombre del atributo actual a ownerElement: nodo asociado al elemento (interfaz Element) en el cual está presente el atributo actual. [J . el elemento podrá ser recuperado posteriormente haciendo uso del método getElementsById () presente en t:l documento (inlerraL Document) que lo (. si el parámetro es ID vale true. el elemento podrá ser recuperado posteriormente haciendo uso del método qetElemenesById( 1 presente en el documento (interfaz Docurnent) que lo contiene. ~ino que los considera como propiedades de los elementos. que el atributo ~pecificado por el nombre local y espacio_de_nombres proporcionados es de tipo ID. Si el valor especificado en el atributo es único. Extiende la Interfaz node. vale true. Generalmente los valores permitidos para el atributo estarán definidos dentro de un OTO. Por ello. [J setIdAttributeNode(nodo.5. Si el valor especificado en el atributo es único.ng y nextSibLng tienen el valor null en los objetos de tipo "ter. pero como los atnbutas no llenen actualmente nodos hijos. el DOM no los considera como parte del árbol del documento. Si el valor especificado en el atributo es único. si el parámetro esID.

\.e RA·MA CAPITuLO 12: PHPY x. o length: número de caracteres. o target: destino de la instrucción de procesamiento. PROPIEDADES. o data: contenido de la instrucción de procesamiento.tL O) o value: valor del ambuto..Deta{cadena): ai'\ade la cadena proporcionada al final de los datos de tipo carácter del nodo. 16 bits (se uti1i7. 12. unidades de codificación UTF-t6). Extiende la interfaz node. ~ DOS: o islO ( ): devuelve true si el atributo actual es de tipo ID. Los caracteres y las referencias a entidades generales son reemplazadas por sus correspondiemes valores.5. pROPIEDADES D data: los datos de tipo carácter presentes en el nodo que implementa esta interfaz. Representa a la propiedad target definida en XML 12. . node añadiendo un conjunto de atributos y ~todos para facilitar el manejo de datos de tipo carácter. No existen en el DOM objetos directamente definidos a partir de esta interfaz.a ~~ODOS a append. es extendida a su vez por otros componentes del DOM. El DOM no pone limites a la cantidad de datos que <¡e pueden almacenar en un nodo de este tipo.6 Inteñaz Processinglnstruction La inlcrflU Processlnglnscructlon repre~cllla u lilli ill~lrucdum:~ de procesamiento ulilizadas en XML como medio para mantener información específica del procesador dentro del texto del documento.7 Interfaz characterData Extiende la ¡nterfal.5.

PROPIEDADES. el número de caraCleres fijados por cuenta a partir de la posición indicada por desplazamiento. cuenta): ex trae. cadena): reemplaza. es posible crear nodos de texto adyacentes para representar los contenidos de un elemento sin la necesidad de la utilización de marcado. cuenta): elimina. de los datos de tipo carácter del nodo. El contenido se concatena en base al orden de aparición dentro del documento. a los datos de tipo carácter del nodo. IX~TODOS o iSWhitespacelnElementConcent (): devue lve true si el nodo de texto contiene espacios en blanco dentro del contenido del elemento.5.8 Interfaz Text Extiende la interfaz. o splicText (posición): divide el nodo de te'lto actual. cadena): añade. a wholeText: contiene el texto asociado al nodo de texto y a todos los nodos de texto adyacentes al mismo en caso de que existan. en los datos de tipo carácter del nodo. en dos nuevQ<¡ nodos adyacentes que permanecerán como hermanos dentro del árbol del documento. de los datos de tipo carácter de l nodo.4"1 I'IIP ~ A TRAVa DE EJEMPLOS e RA·MA o deleteData(desplazamiento. el número de caracteres fijados por cuenta a partir de la posición indicada por desplazamiento por la C'i'li!pnR ele caraclere'l rrnJlOrcinnada. el nú mero de CUfUcteres fijados por cuenta a partir de la posición indicada por desplazamiento. el 12. o replaceWholeText (cadena): reemplaza el contenido actual del nodo de texto por la cadena proporcionada. Aunque lo habitual es que sólo exista un nodo de tipo Text por cada bloque de texto. substringData(desplazamiento. characterData y representa el contenido textual de un elemento (interfaz Element) o de un atribulO (interfaz Attr). la cadena proporcionada a partir de la posición indicada por desplazamiento. por la posición indicada. cuenta. . o replaceData (desplazamiento. o insertData (desplazamiento.

. todos los caracteres comprendidos entre las cadenas" <! --" y " --> .11 Interfaz Entity Extiende la inte rfaz nade y representa a una e nt idad conocida dentro del documento XML. PROPIEDADES e actualEncoding: codificación actual de la entidad. Modela a la entidad.9 Interfaz CDATASection Extiende la interfaz. en este caso. en caso de que ésta sea una entidad externa.. o notationName: nombre de la notación para la entidad. no existirán nodos de tipo referencia a entidad (interfaz EntityReference) dentro del árbol del documento. o systemld: identificador de sistema asociado a la entidad en caso de que esté especificado o null en OITO caso. Text y representa a las secciones CDAT A utilizadas para enmascarar bloques de texto que contiene caracteres especiales que de otro modo pueden ser considerados como pane del marcado.• N. a publicld: idcnlificador público asociado a la e ntidad en caso de que esté cspeciricado o null en Olro caso.10 Interfaz Comment Extiende la intenaz characterData y representa el contenido de un comentario. en caso de que ésta sea una entidad sin procesar. o version: número de versión de la entidad. . es decir. en caso de que ésta sea una entidad externa. l5 12. 12.O 12: PIlI" XML . no a su declaración.. en caso de que ésla sea una entidad externa. Los nodos de tipo entidad no tienen padre.A-MA CAPfn¡1..'iO. o encoding: codificación presente en la declaf"'Jción de la entidad. El procesador XML puede optar por expandir completamente todas las entidades antes de definir el modelo de estructura DOM. 12. o null en otro Ca. o nu11 en otro caso.5.5. o nu11 en otro caso. o null en Otro caso.5.

5 A TRAVEs DE EJEMPLOS 12. declamdas en el OTO. Cada elemento de la colección implementa la interfaz Notation. o publicld~ identificador público del subconjunto externo (OTO externo). No contiene entidades de parámetro. o name: nombre del OTO. Cada elemento de la colección implementa la interfaz Entl.5.436 PUP. 12.12 Interfaz EntityReference Extiende la interfaz node y se utiliza para enlidades dentro del árbol del documento. internas y externas. a interna1Subset: cadena que representa el subconjunto interno (OTO intemo) o nu11 en otro ca'io. repre~entnr las referencias a 12. Extiende la interfaz node.5.14 Interfaz DocumenlType Extiende la interfaz node y se utiliza para acceder a la'i entidades definida. Las notaciones son utilizadas en las declaraciones del fonnalO de entidades sin procesar y de los destinos en las instrucciones de procesamiento.o de que esté especificado o null en otro caso.ty. PROPIEDADES.5. el systemld: identificador de sistema asociado a la notación en caso de que esté especificado o null en otro caso. o entities: colección de las entidade'i generaleli.13 Interfaz Nolalion Esta interfaz representa una notación declarada dentro de un OTO. .!. PROPIEDADES: a publicld: identificador público de la notación en ca<. o notations: colección de las notaciones declaradas en el OTO. para un documento.

12. /. devuelve nu11.Incoos. U item(posici6nl: devuelve el nodo con la posición indicada dentro de la lista.5.wciado al subconjunto externo (oro externo).e RA·MA CAPtruLO 12: PIIP Y XML 4. También pueden '\er accedidos en base a un índice ordinal.5.5. PROPIEDADES: o length: númerO de nodos de la colección. o getNamedltem(nombre): devuelve el nodo cuyo nombre coincide con el proporcionado o null si no encuenlnl el nodo en la colección. 12. sin defimr o restringir c6mo debe implementarse dicha colección. . Si la posición indicada es mayor que el número de nodos en la liSta.15 Interfaz DocumentFragment Extiende la interfaz node y se utiliza para representar una porción del árbol asociado a un documento. sin un orden en particular. 12.16 Interfaz nodeList Proporciona una abstracción de una colección ordenada de nodos. a los que se puede acceder por su nombre. METODOS. ROPIEDADES o lenght: número de nodos de la lista. El primer nodo de la lista Liene la posición O. Puede considerarse como una versión "mínima" de los objetos de lipo documento (interfaz Document).17 Interfaz NamedNodeMap Proporciona una colección de nodos.U o systemId: identificador de sistema a.

es reemplazado. Tal y como hemos visto en la descripción de la interfaz Docflll/€1It del esttindar DOM. [J [] setNamedItem(nodo): añade a la colección el nodo proporcionado. esta clase cuenta con los siguicntes métodos: a load(fichero): carga el contenido del fichero XML en el objeto de tipo documento DOM . o removeNamedItem(nombre): elimina de la colccción el nodo cuyo nombre coincide con el proporcionado.5. 12. para que la gestión de almacenamiento/carga de ficheros hacia o desde el documento sea sencilla. El fichero XML debe estar bien formado. podremos invocar todos sus métodos y usar todas sus propiedades. Si la posición indicada es mayor que el número de nodos en la lisia. n partir de ella. La cadenaXML debe C!>lar bien fonnada. nombre): elimina de [:1 colección el nodo cuyo nombre local y espacio_de_nombres coinciden con los proporcionados.5ATRAV~DEEJEMPLOS [J getNamedlternNS (espacio_de_nombres. nombre): devuelve el nodo cuyo nombre local y espacio_deJlombres coinciden con los proporcionados o null si no encuentra el nodo en la colección. . removeNamedIternNS (espacio_de_nombres. a setNamedIternNS (nodo): añade a la colección el nodo proporcionado haciendo uso de su nombre local (atributo localNarne) y espacio de nombres (alributo namespacesURI). Si aCLUalmente existe en la colección un nodo con el mismo nombre local y espacio de nombres. a loadXML(cadenaXML): carga la cadenaxML en el objeto de tipo documento DOM . El primer nodo de la lista tiene la posición O.438 PltP. Además.18 Ejemplos usando DOM A través de los siguientes ejemplos vamos a ver cómo t:rabajar desde PHP con el DOM y la estructura arborescente que impone a los documentos. o item(posiciónl: devuelve el nodo con la posición indicada dentro de la colección. Si actualmente existe en la colección un nodo con el mismo nombre. es reemplazado. los objetos que derivan de ella representan a un documento XML o HTML completo. devuelve nul!. En PHP la clase que implementa esta interfaz es la clase DOMDocument y.

El resultado se muestra en la siguiente imagen: . e saveXML t [nodo]): crea una cadena XML con la inronnación contenida en el objeto de lipo documento DOM. En el primero de los ejemplos simplemente creamos un nuevo objeto de tipo DOMDocumetl'.. Demro de las propiedades añadidas cabe destacar preserveWhi teSpace utilizada pum indicar si los espacios en blanco no significativos de un documento XML o HTML se deben o no tener en cuenta. Puede indicarse el nodo del documento DOM a partir del cual generar la cadena. t::I saveHTMLFile(fichero): con la o saveWI'ML (): crea una cadena HTML con la información contenida en el objeto de tipo documento DOM . crea un fichero HTML inrormación contenida en el objeto de tipo documento DOM. .eh.. e save (fichero): crea un fichero XML con la inrormación contenida en el objeto de tipo documento DOM.CAf'tIVLO I::!:: PIIP Y XML 439 e loadHTMLFile (fichero): carga el contenido del fichero HTML en el objeto de tipo documento DOM.~to tUI '~to~>l0..aenll_)(¡Ql . a loadHTML (cadenaHTML): carga la cadenaHTML en el objeto de tipo documento DOM.(). utilizamos el conslnLctor domOocurnent ( ) para crear el nuevo objeto de tipo documento DOM (DOMDocl/lllelll).a.4(·DOt.-l·)1 Selld.' • _ «=-==" .. tcaden. xml: <7php . " Como podemos observar en el código.. que utilizamos para cargar 'i visualizar el documento XML notas. La cadenaHTML no tiene que estar bien ronnada.xel. El fichero HTML no tiene que estar bien rormado.~to-> ••-sx¡.

o->D04..~ ' u)" enoodlng..4lumno> <mab1o:. <table bord :..DO->ehi14BoOe_ S8 to-to.. .tr> Kt.Outiirno.el. <centor .._ ..ulll > <nombro> Inb </nombn!.XIZI1" l ~nt( ) ¡ ).x18t.xml' J) exit('f'lo Sil encuentra el fiche r o 'notaa. .SOEEJEMPLQS ORA-Mil.. .o . xoS01 </matr1culil> "1'lOmbro!> D. alu..ato • ... ~j&nd~ ~Ihe&d> J:)Cft< title:> <body.Ot."umno: .teorIa > 4. . > ..~­ <....l. .' . <h2>TrabajandO con OOH</h2><br> <?php ir I !fil~.->rir. a1u.~ En el o. _ ~. -10 10a...ao l ~ .4 ( ' lI.'ye1...t '4oclCML • _ 'not~o.-. (/tloo<Ia> <prtOClI<:Q>.~!'Ib> <beona~ 5 </tIIOfla> <pnct1GU> 4~ ': lPatICaot > </atumno' .1' ).! . <II''''lIlcto. ': / epellldc. alua:a..lOItldoll> <· t flOO1ll> 9 <~> <pIlICl:IaIS >7 ":/PflI~> </lIlumno> • <n lumno> <m~trlculn >x0503 </mlltr\l:.. .&r.Io .'> tDot.44{) PIIP5A11tAV¡. ct:d b¡c:olCir..er.. • ·practJ¡cM'> 7 <'f~> . .·... .y¡·!'. r.OoeJCllL..I.t'o <lnombn!> <apdlodoto> a ..Outli. lumno> < mIItrkli18> x0501 <ImatncuLa :> <nornM > Rodrigo </ooml>l.. <'ron! - --.. ~e11P4~jng~·..> (loorIiI.>Ooc:ImeDUll~t I $prt.ow">· • f4.. ·.' ISO'88S9 J' 7" <1'IOboJ~tlJllI-'SSOO' - ~.. -.tCbi14¡ toresen l 'prt.> ...<alumno> (matncu'" :>X0504 <Imab"ltula >~'nornbo-.5 </teDrt&.:»<1tpellld!»> Vaquero Gutlirru :¡a.bI -:/nombre> <_IIIda8>.e l '4oeXMl. ~Ol: <tltl. '4oeSML->pre •• ~Wbit. /ellimno> . . ... ~... ~/. ~:1> .. --/pr~dk:.no Gutiirra.·1' dpllp . ..'>Vlof.ao • 'DQta..8pae.igu ienle ejemplo se recuperan los dalaS del primero de los alumnos contenidos en el fichero anterior.

h:' -. en la variable $primer_alumno. xml·.·).t08..va1_. lo que hemos hecho ha sido recorrer desde el primer hijo del nodo raíz todos los nodos que cuelgan de él.ORA·MA CAPtruLO 12: PHP Y X. x...preaerveMbite8pace_falae. Si lo vemos desde el punto de vista del documento DOM. . " «(lentar:> </body.. .• ter ~ <?php if I! f Ue_ex:i.!t~t. . obtenemos el nodo del que cuelgan todos los datos del primero de los alumnos. 0:( -1>10 ae er'l'::. thlt(li." <cenIcer'. El resultado se puede observar en la sigUIente imagen: • • Trabajando con DOM 1=:: Maria :lpftii*1 ~~0ItI&nl: ¡.. de los que se van obteniendo tanto el nombre del nodo (nodeNarne) como su valor (nodevalue). -c/btlnl> Como observamos del scripl la variable $notas contiene el nodo raíz del documeoto XML. • Para recuperar los datos de todos los alumnos deberfamos modificar el scriPI de la siguiente manera: . echo '<ttn"j ) </tabl .a\O '<td." <hlllad> ..al~»... 'c/td..> t<loc:JCM! • __ d ... ..JaIl I i ex. .• (·I:I~UIiI. en la variable $datos_alumno. A partir de este último c:e recuperan sus nodos hijos...... de este modo al recuperar su primer hijo..:<body> !XlM·.l.:·IlI'.dt eo>n DON. t<loc:XNL-.1. <~>Tr4b. .L 441 . title:>Trl!.s.'.bajolnc!o con .aem re! e: t':'c!\ern ·Il\)t ..\. 1 I ..l'I¡ ..1.load¡'DOt.. htlnl.at .Dc "t(lj $docZKL-.

. <bod... El siguiente ejemplo nos lo muestra de forma práctica: ctitl""Trabdjando con DOM</title ..y:.... a. .ibnz Butoo 0tIli&rn j 4.ao.r" <h2>~Abaj.l~o) 1 echo ee.-hero 1.1lJ!ll·. fal .. echo . </helld.. ( 'notas. <?php ..·"chi1dMo6ea. . I. .-I echo <td. $DOta.j 7 9 Roa-!so VItqDn'O GobftTu 9 lIOSO] .~Nh1te8p&ce . loreac'. .-~txl~t. ...4>rnt 4j 7 • Para recuperar cualqujera de los atributos presenles en un elemento contamos con dos posibilidades: hacer uso de la propiedad attributes disponible en los objetos de lipo nodo (interfaz nade) que recuperarla lodos sus atributos como una colección de nodos o bien acceder al atributo deseado mediante el método getAttribute ().p 'liata alu... t. ' . 'l'Jeene"r> C¡body.al_·. IIOJIN Violeta Duro GuI...cb.. $. .ee tU '&atoa al...~Ul_t.10 110$02 BlIeoo o. lOT~' '1IOt . c. ...c:ent.442 f'11P..ndo con DOH</h2 .' 'No ae encuent. '''oe%NL->pr.r.5ATRAV~DEEJEMf'LOS ORA·MA e?ph....html..t t I f 11ft_ftxi8t. '''ocXKL->l0a4('DOe ••. <br . ~toa_ala. xal'). </table.DO·"~Valua. '< td. . xml ') I ex.... .il&lod.TII el fl.. El resultado se observa en la siguiente imagen: <l' Trabajando con OOM xOSOI 0... 4$11a~_al~.. .. n_ ~t(). '4ocnrr ·.~ ... . . • DOta•• $4oeDU... ·::l~t"8.

text </h.~a. 1.atributo->~ .trl~to-.WbltaSpaca. fore. </tr.h~l!bar •• taUTP <tltle>Tlraba)ando "On DOMo( ritle:.-equiv.' t(l. ."SSOO" . <hl>TlraDa ando c)n OOM<¡hi><br> ~?php if t'fill_"xht$('notas...na. '3S00~ • "." l " cellpadding~·4" cellspllcing.~h(.-)gatzl~nt.bra. ) I e 'lO '<tc!-' . ?php 'not .'No Sil IIIncuentI'a el fichltI'o 'notlls xal".. .¡table <1 ¡:cnter~ -'>O< < htRlI> El resullndo se muestra en la siguiente imagen: .N"'(·Do..1'111' Y XML 44) fore.cho .• Trabnjando con 00\1 .mo por cualquiera de los dos métodos: ./ $(!OOXXL->¡o&4( 'not••• JatJ.e RA·MA CAPtruLO 12.". .> • El siguiente ejemplo muestra cómo obtener sólo ciertos elementos de nuestro documento. $. Como se puede observar en la siguiente imagen..' :ODtent type' 4flr::ent. 'ISooXXt • 1'1• • (!~nt()1 '(!oQXNL->praa.i¡Ml:l.') / ~tabl~ border. $400XNL-)doc~tzl~ntl 'noDbr• • • 'nota. isnllUrl. ' ~> .d" <>ody> <C~tllt'1' B .XlI\l'J) ( IIX t . $nc.. .. <InlIta ht~. ->attr!but •• as 'atributo ) . "4 '><tr.bra·J.fala. en nuestro caso c6mo recuperar los nombres de los alumnos: <. .n .rv. as $nombr. .bra->nodavalua.chl 'not. ~ • .. el resultado obtenido es el mil.' .Y&1u. .

ilu"\I1 . fOI.el dQlIIl)o~nt ¡ f4oeXML~>p~ 'doc%ML->loa4(·AOt.....Dt.tAttrlbGte"..' "< A8I • ho .¡a_O l -- "U . "' . echo • .-TR>c'l'l»$nunLII1IJlnno8</Tl» forellchl$.~tQa-:>noc1aVaJ..not •• ·.pra ti¡. ~. t floatval¡$aluano->eb!ldNoda. t eor¡".. l l~ f'iMle ••• S pr r. ~) ande cm • who ~b< ..)->nQ&aV..:"..NL= ~. $notes_.·>lt. • .ll~~finAl ••• O¡ '.lls..Sp.l I" .tt ". ¡ (l ~'*. "... .nt¡ e:'ho ·cH'rML·otHEA{'·eche -<lWtll h~tp·ttqlliv"· cm ha • <'f 1':': J::''J'.>< TI< . . lOf 1 ad:> de nQt"e .~l·J¡ ."I..algnatQ~e·) .l.ll :111 •• 1\llMO ($m.gN.:.._t.m..u..) Al.lual¡ nota J)ractl.j p:ro Na)p+ J .A. $no 11 f $~f.".l. el ejemplo del listado de notas completo: c1php 'dooDlto .444 PHI' j A TRAvés DE EJEMPLOS CRA-MA Trabajando con DO'\1 El siguiente ejemplo nos muestra cómo resolver.:xc' .< 141'~ . itwll • $ ) f can~' ~:> lJ _Alu '01 f :\ f iU alUlllJK. Snot.rEJ. .a. haciendo uso de los métodos proporcionados por el DOM.- . . 1 lb • '" " "" Jo • oc ="" TD>' e en l~ 1" ro ~ liJ">ltal r. .lu...lumno->ohildNOd •• as $4atoa) 'tchQ . I·~~·I. ¡.prollCtl<:"..4ocXML->docun.c •• f.<1 ..lue¡f a.ctlca.a.~hl.-'11: eym Kho .a. $nOt4. TP>" .. '" " T' ~n~' lb! :lo. >< .Wbit.>t t' ".<lr Oc" ) e SPAIiJ. ' ~~. QOta_t :>Q1-la $nO all .Teor SnWII. 3 e trrn.. .t&l~ntaayT... "<'I":'-...not•• ·>g. .noa • .o-:>C:hilc1No4ea-:>it_C l) ·DOdaV.. .·tex '" . f .Pc._O¡ tnot.l~. 'aluanol ( $nulII_ . "' ". . _ () ••erv..m 1 f $nC'ta.. ) $nota _tote la " floatval'S. ..->g.lua.nota. " ech ~h » !IX~A.: 1'0'. . ceotJY>"l$!1f'ER~cH:' ..!r\0· +.

&1_ . 1" ' . $docXMLorigan->load1 'nQta • . . · lOO): " El resultado se observa en la siguiente imagen : • Listado d.C RA-MA CAPITULO 12: .~·). alumDO" ).. (J .( ' _ l _ t .iag ..In>~u ' .rlb1lt.~ fU'.. '11tO-"!5J-l".alumnOll aLumnoal</'l'D>': echo "<1'D BCCOLDRa'yellaw'>'1 pttntf('\Ol. ••• ill...Aeet..' 11. ..2t · . - .>. .../S~1~o.. .nt8 ByTagNAII1e I · fore&Ch(Sli.t __alumnoa .J. </B>Aprobadoa al .dl~I·.l echo '\</f></CENTER></BODY></HTKL>'.. aa $un_alumnal f zwt.aC-II='t a-. '~llow·> ' : pr lntt (·'l01.. ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡..i".IJ echo "</Te>". no'" (5800) . t:l j.SnQt8. Sli..11 echo "</TI» ' ..t.Gr.to.ao-.\!11t\oa) I echo • (/'l'D>': echo "<ITR></TABLE>'¡ echo '<P><B>Nota./ printf(·\Ol.aoo~.. . ill . 2r-.ello ". ~~ :r~=.'cante r '> " .c. 751 El siguiente ejemplo nos mueslra cómo generar un nuevo documento XML a partir de los dalos contenidos en otro documento: <?php $docXMLorigan .. $docXMLorigen->pr e sarveWhitaSpace~ f8 18.¡ IO'SOI . ISn~apro~do8/Sn~..>111' Y XML 44~ echo "<TR 9GCOLOR~'cyan' ALIGN. - ¡ .~.iDCI • Il.at.!Do->allcod.. Snot8s_ f ina lQ/$nuIlL8 l\. t40cDlLor~->éIoc' t.lw.~u '" f.dl~I· •• igIM.~"c~t....! ' ~-.. ptintt(·\Ol. ~l')J ."".. 1 Ü'1 '. . SdocXH Lor igen->documentS l ~t­ ~et!1 .~ _r..0l_ ~t. • ro.non.t..• .7S.at..O. !D. new dOIl1Document{l. aUOnc.l_· I ' .no.2f·..Ot'. echo '<1'0 COLSfAN'" 4' >Valo r as lI1edioa ($nUlll. if4ocnaod•• t. tdoaD'!A_t.~ • .:1'0 BGCOLOR.l~-l>p~uUNt._¡~~.-pr8ctic8...At.~a_alumno6 . eeho • <'1'0 BGCOLOJI"'yellOW' >' . .Snotaa_teoria/Sn~alUdno.

..-. 1«1>/.trieulaTXT ."."" '" .'.le! : Sn·..~. 1:..trt~. l.> </oIIul'lVlO> - <.(.practica • floatvall $un.. .> </"UI'IVlO> . .t....5 .DOt...lltne<."I.-~appendChildl$DO~TXT)' talUBDO->appaodCbildC"'trlcvl..> Por último.¡..446 Pll PSA TRAVa OE EJEM PLOS O RA· MA ~trtcul ....alwmo-~childNodtl. .>nodeValuel .. ."..... Como podemos observar en el scriPI el nuevo documento cuenta con un elemento raíz denominado asignatura y un nodo alumno....H'> K050-'k/m.lu. 'alumQO->...S9-1· • nom!-~. .Pract. •• 1g->appanCChi141$.._1]) ·.Q> <nOIU 4 _15<~.l. ..r..t. •• -. unaetl$docXMLd. $docx. .oot...l.~.. _·n ol_<.>nodeVII11..t .. • o-._ .. CO)-~no4eValv.¡iOumno> • <-.DOt.ta_ f inal_a lUlllflo" f $nota_teoria. 7 .> <rnot. el siguiente ejemplo nos muestra cómo recuperar todo un documento XML sin conocer a priori su contenido: ..~dCbild($oot..•• 111 :.iclll '. t4OcKMLd •• tiDO ... . ..tiDO-~~r.->~n4Cbi14( .Iumna> <II'I. ...eor ia floatva 1 ($W1_alwnno->ehl dNud..ntl~ .I"C uI. > <<IOI. _ ' 1 .·11 'DOta.~ ..... . pr I nt $docXMLdeatlno-~ellveXML(1 I '~nlet ( $docXMLorig-enl .¡otur..t~ieul. .<'""JI'WII ..­ ~lt..> '. $ oota.~ 8 . que contiene a su vez un nodo matricu la y un nodo nota (con la nota fi nal). ~not"_ $~ •• tiDO-~ora. 1 1 " ~·I50-..Lde..S</rIQI.uti nol ... JK)~ . El resultado se mueSlrn en la siguienle imagen : lt.> 8 </""t.>er.... e~l . .. .. '1.->: tell'l (4! -.. <~!nculu .l~-~Cbil~..nol' $dooXKLda.'..>".. ""'*' ~ *" .T%Tl' .. por cada nodo alumno presente en el documento original..<..tna.. OS 01 ~tnc:o.I> "OS02 </lNIlIlC .5 </now> <1</esogn. $~~.U> cnoW> .""'.Ium~o> <m..tino-~.trieul.....".ppan4Childt$ •• 1gl.• l~).:l. <""'"' .o> -cm... .at {"aot.tneuln K0503 </1'n1t.ataEl. .~~ ( t~....tiDO-~er.

RA-MA CAl>fruLO 12_ I'HPY XML ~ 7 tun :ti "" l..hijo .. l$:Uv.l él: ( ~jo .jo->b.. forellc::h ($lIlributOIl liS $lItribut.lcboux.. ) ) echo '&....' Se-Spll.c •• f.(.rset-UTF.o) f echo ' '. .> El resultado se muestra en la siguiente imagen: . tt ¡ " 'r e I :DC*..() ) ( $atributos ..o->_ . if ( ~r~r~bo~('IIIOdODOMLbijo) l( echo Saspllciado¡ 'a01 . '. h1jo->aaa..ap.e). ..~ 'I. l>'Lb1jo->~. bJ. bijo-.lItr_repeat(""lÚ»p. echo -. ~ XK1..dlNt:•• ..t~c:: ~ia1~A.I .~ oo_ ~QL~-NODEI elseif ( $esECique-tll " 1.t.>DOde'J'rpe .l... <"""'> OlEAn> <~eta http'equivz'cont~nt-type' content.u.. if ('JIOdootW_bJ.l· 211.·'.. h1jo->at.. 'OOcZML->pr••• ~t:.lll. 'ad. 'ar4ol1> .. t40eXML->l0a4(·~" .val_ i.. .NOD!) echo trio! • . _ bljo->ar~.a=~'r ) $nodoOOH.8'> <TITLE>Trllbajllndo con XML</TITLe> <(HeAD> <80OY> <CENTER><H2>Trabajando con DQH</Hl></CENTaR> _PRE> <?php ~ia1rArtlolDtW(""""'XMI·) I <!PRIt> </OODY> </H'l'ML> .'-otW->firstCbl14 1 ( $eIlE' U:¡Ue-tll .. O. ' • ."".l •• .. if " "QdoDQMbijo->"uCbUGod•• O ) I $nivel •• .'.bljo I f tt t 'III0A0DtWbijo.jo->no'se·_ . ... I. ) return $eaEtiquetllJ ) '4ocXXL ...lIIOdooa.DOdo.._11UM'.... . ' . .il.rÜlUt..o-> . ( .c-.rÜlUt.1bU .!I." wh...t. •• t. echo sespee' tlcIo.a.ttrÜlUU."""""""M $nl.'text/html¡ en..j" • 'In<bt>·. DeW 1on=c 'nt..~. . .t at...

>~</teo~l...~/.ctlc •• >l</p..~ uh_no> .··1 ».. Trabajando con 00\1 <""tu Ulg:n. <no..l\mll'» <.ct.pell~>OU'o Gutl'rr. <U..> <noabre>v....D)D4<Jaatr1cul.oria>4.ll/111no> <aatricul'~K0503<I .aCtlC"> </.otie> <pr.o> (/nous> • .> <nc:ab <e> 1nu <1 nOll br e> <ApoI111dol>Buano Gut 1'.e•• ) •.b.l&> <pr'~lc•• )l<lpr.cul.len> </&1oano> ~..pell~~.tr.bre> <.olata</n""b ...BueQO Gutl'rre.<I.c~b.··.pellldOll>Va<¡uero GUu6nu<!. ~~/pr.p. .> <toot">9<!t. ...>.l\lJlno> ..t~~.·"*."o> <dUlUlo> <aat<lcula>. eI'poIl Lid"".>:*.cal> </al-.~111~> <r.Q~~~/ •• tricula> ~~cabra~~drlqo</no..~ <prlKt .pell1~> ~teorl.S</t"". .tllll1".~1<OU1<¡ .> ~. t rlcul.448 P/lP!i A TRAVEs DE EJEMPLOS e RA-MA l '..OrU) B</t""< la> <pta<:tl~>'</pract1eaB~ </al . tu<:Ul.tr ."t.e>DarlO<inoabre> <.>O>II _ _ .

CAPíTULO 13 EJEMPLO DE APLICACIÓN: WEBMAIL Como aplicación práctica en la que poder ver las posibilidades de PHP. etc. Eudora. OUllook. Se trata de un cliente de correo electrónico que nos permita manipular los mensajes de nuestra cuenta de correo a través de un navegador Web. un cybercafé. ya que este cliente no los ejecuta por el simple hecho de posicionamos encima de un mensaje. Vistas las ventajas de este lipo de servicio. Esto significa que podremos leer el correo desde cualquier sitio (casa de un amigo. nntes de abordar el desarrollo e implementación de la aplicación. elc. vbs.rabajo. pues basta con cualquier navegador (programa ubicuo donde los haya. elc. ya que es prácticamente imprescindible para el acceso a Internel). lo siguienle que necesilamos es conocer los requisitos que ha de cumplir.) sin que los mensajes se descarguen en el ordenador desde donde accedemos.) en el ordenador donde queramos revisar el correo. Pegasus. vamos a implementar una aplicación muy usada actualmente. qué funcionalidades debe proporcionar nuestro servicio webmaj/: . a Existe menos probabilidad de contngio de virus tipo aplicaciones eml. I o No es necesario disponer de un cliente de correo específico (NelSCape Messenger. es decir. Las ventajas que este lipo de servicio ofrece son: o Los mensajes están siempre almacenados en el servidor. el r..

Adjuntar ficheros a un mensaje para su envío. asunto. tamaño o recha de recepción. Responder al remitente de un mensaje. Seleccionar mensajes para ser eliminados o movidos a aira carpeta. Reenviar un mensaje a otro usuario. 13. Mover mensajes de una carpeta a cualquiera de las otras dos. Listado de mensajes.450 I'lfP!jATRAVtsOEElEMPLOS e RA-MA o o o Poder conectarse a servidores IMAp 1• Disponer de tres carpetas: Entrada. AlgtmaS de las implementaciones más comunes de este protocolo son los programas sendmail y postfJX. el cual sólo se usa para enviar correo. 1 No conrwldir con el protocolo de correo SMTP (Simple Moil Tramfer Prolacoll.1 ESTRUCTURA GENERAL De las especificaciones anleriorcs se desprende que necesitaremos al menos los siguientes programas: o Q Entrada al webmail. Enviados y PQfHI~ra. Los mensajes no leídos aparecen resaltados en negrita. IndicaciÓn del número de ficheros adjuntos por mensaje. Borrar mensajes. . Responder a todos los destinatarios de un mensaje. Ordenar las cabeceras de los mensajes por remitente. o o a o o o o o o o o Visualizar los mensajes. Guardar en disco los ficheros adjuntos de un menc¡aje recibido.

. WM_USR: o o o Contiene el nombre del usuario (Iogi.. Las variables que usaremos en la aplicaci6n son: el WM: Hace de centinela para comprobar que se ha enlrndo en la aplicaci6n.o. opciones de ordenaci6n de los mensajes. Componer mensajes. de esta forma. y dado que necesitamos guardar ciertOS datos del usuario (nombre. estos datos han de ser guardados en variables de sesión. lograremos que se comporten corno variables glob(lle.~ para todos los scripls. WM_SRV_lMAP: Servidor lMAP donde el usuario tiene su correo. . Tamaño máximo de fichero para adjuntar. a [J 13.) durante todo el tiempo que esté dentro de la aplicaci6n. pues. WM_SENTlDO: Ordenaci6n ascendente o descendente de las cabeceras. Q Wl"-NUM_FICH~UNTOS: WM_TAM_FICH_ADJUNTOS: U a U ~CUOTA: Espacio máximo en disco asignado al usuario. elc.1. Salir de la aplicaci6n. Número máximo de licheros a adjuntar.1 Variables de sesión Dado que el protocolo H1TP por el cual se comunican cliente y servidor Web no guarda estado de ninguna cnnexifln previa. WM_CLAVE: Palabra dave del usuario (passU"ord). ti Q WM_CAMPO_ORD: Campo por el que se est:1n ordenando las cabecera. ~BUZON_ACTUAL: Buzón O carpeta que está siendo revisada por el usuario. clave.el RA·MA CAPflULO 13: EJEMPLO DE APLICACiÓN: WUJMAlI 4:'11 a Ver un mensaje.).

tanto la última carpeta visualizada como las preferencias de ordenaci6n sí que deber(an guardarse para que en la siguiente conexión el usuario tuviera la configuraci6n que dej6 al salir.1. Si no estuviera registrada dicha variable. Por esta razón. En particular. Por tanto. el seguimiento. 13.'a a ejecutar la aplicación webmail. en el que se almacena el usuario y su clave en variables de sesión. disponemos de una variable donde almacenar la máquina donde se encuentra el servidor IMAP: WM". por tanto. número máximo de ficheros a adjuntar. . se redirige al navegador a la página inicial de la aplicación: session_startj) ¡ if (lse9sion_is_registered(WM)) header(~Location: index. existe un riesgo potencial para la seguridad del servidor. Para evitar que se entre en la aplicación sin haber proporcionado el nombre de usuario y clave correctas.~tarlin almacenados en c/tlro en un fichero físico.php")¡ Hay que resaltar que en este esquema de variables globales..5 A TRAVIts DE EJEMPLOS e RA-MA o WM_DIR_BUZONES: Directorio en el servidor donde se guardan las carpetas. ya que estos valores e. del ejemplo de aplicación no hemos usado una base de datos en la que se almacenen las particularidades de cada usuario: espacio máximo de disco del que se puede disponer.2 Botonera Vamos a proporcionar en cada página de la aplicación una botonera en la que eSlarán todas las operaciones que pueda realizar el usuario (ver pantalla en la página siguiente).SRV_lMAP. etc.4. esto es. ini) debe estar protegido con los permisos adecuados para evitar poner en grave peligro la seguridad del sistema. el directorio donde se guardan estos ficheros (dctcnninado en el fichero de configuración php. en todos los programas se pregunta por la elÚstencia de una variable sesión (WM) introducida para el caso. preferencias de ordenaci6n de los mensajes. para este ejemplo. Para no aumentar la complejidad y. tamaño máximo de éstos.52 PIIP. aquélla donde se . La máquina servidora de correo no tiene por qu6 ser la misma que aquélla donde se ejecuta el servidor Web.

.~. $f_arial. . images/llISg_reply ."... // Sbotonera(2J='O'. 'ilMges/llISg_new. &n 1 . Por ello.d. // Sbotones=array (array(href..o "nnl. 'Redactar' array('javascript:reenvia{l)'."... 10dDt """'..o Il.. el botón de eliminar un mensaje no estará activo cuando se esté escribiendo un mensaje para su envfo o cuando se esté en la pantalla donde aparecen las cabeceras de los mensajes... . ~" I nI •. .. . 1/ $botonera(41="O'.php' . ..".hlp:f~__ eD. EJEMPLO DE APUCACIÓ:-'¡ WFHMAlL 45~ ... .."..o RA ·MA CAPITuLo IJ. ha l· . La función al completo: function pinta_boton~ra($valore9~tone9) global $i_arial. array ('WDLCOIJIPOner . todos los scripts que generen la mencionada cabecera inicializarán el array con los valores convenienles a cada caso.. "imaqes/checkmail. Por ejemplo: Sbotonera=array(). . $botonera(O)m-l·..php· .qi!'j.... por ejemplo... 1I Sbotonera[lJ:-l'. ...18:>:lUl/l J . t.n. Sboeones_array ( array ("W!lLver_cabs .. ~ WebMail 11 k:I\IoI'lOl • d ___ ~p ..gif').".goi f') . estos botones estarán aClivados según tengan sentido o no. o { imagen) 'lIctuali'%ar' . // ~ctualizar Redactar Responder Responder Todos Reenviar Eliminar Logout pinta_botonera($botonera).. . // Sbotonera(3)s'O'. E_ •• Ahora bien.67. // $botonera[SJ:"O". 11 Sbotonera{61=·1".... loJOId JI) ..o. leyenda.. ~ . ~ . Se ha previsto una función pint~botonera () que imprimirá dicha botonera con los valores que se le pasen como par1metro.. Ir eo-I_ \IIIiIriM . 'Responder'.

"Reenviar". 11> . $i-<count($valores-Potonesl. "Responder Todos". ) Simagen.gif"l.Bubmit().. array("~selecs.f_selec_buzon. "Eliminar". tor (Si~l. J."<img src= \" ($botones rSi J ¡ 21 1 \" al t=-\ • {Sbotones [Si J r11 } \ • border. $f_ref="</font>".454 PIIP 5 A TRAVf. ) echo '«tr></table>'¡ echo '«center>'. "ünages/mS9_delete. $celda='<td bgcolor:\'jFF~BAD\'>$i_arial' $fin_celda:'Sf_arial</td>' echo '<c.gif").giP) ._ref="</a>' . J el se ( Si_ref= "<font color=\"tcCCCCC\">". $f. "images/ms9_forward·9if"}. "imagesJlogout.s DE EJEMPLOS e RA·MA array("javascript:reenviaI2)'.nter~'¡ echo • -<table><tr>' . array("javascript:reenvial))".php'. ' >".php" . echo 'S celda -<form name='f_selec_bu%on' method='get' -<1mg src='images/checkmail. echo "\nSceldaSi_ref$lmagen{$botonea(Sijll]>$f_ref</td>'. } el se { $i ref="-<a bref=\" {Sbotones{$il rO]}\'>'. "iroages/msg_reply. $i+~l { 1f($valores_botones[Si]1 ( if(Svalores_botones[Si]lol) { Si ref='<a href=\'{Sbotones[SiJ [O]}?Svalores_botones[$il\">". echo "-<option value=\"\">Actualizar</option> -<option value~\"Entrada\">Entrada-</option> -<option value=Enviados>Enviados-</option> <aption value=Papelera>Papelera</option> </select> </td> </forfll> " .no>· . •• array ('WlJLsalida .gif'> action~'~ver_caba ' > -<select name=s-puzon onChange='document.

232 o superior. 1 Si instalamos un servidor Web con las librer!as SSL Véase bUD jl/wW\\. En Sistemas U·i:< será necesario descargarse esta blbli~eca de la dirección 00. Biblioteca de funciones de lMAP (Jllfemet Message Access Protocol) paraP~.P~~l. a.. .9rg..t"/8poo l /matl/un_uar.t"/. EJEMI'I. está fuera del alcance de este capflu lo. ) Estas funciones también se pueden usar para atacar a servidores POI' y NNTP. 111& tres carpetu menci0Ntd8a. v~.edulimapl y proceder a su instnlación.0.3 Software necesario en el servidor El sofn~'are necesario para la implementación de e>ta aplicación es: o Servidor Web: Apache versión 1.ORA-M" CAPtrul.t"/¡pool/mail/un_u.1.hmglon.modssl.<¡.ra 13.r.cnc .orgl y hup:llwww. por talllo.apache·ssl .Envi~do. Enviados..t". las carpeta& de correo H almacenan en el directorio /V~.usr.. conseguimos una separación entre la programación y el interfaz: si queremos modificar el aspecto. o [] Partimos de la existencia de las tres carpetas que hay por usuario (Entrada.IIMAIL 455 13....3. se COfT&SPOOden con los fic:he«Ie 'v~r Ispool/mai l/un. De esta forma.. PHP 4. Portanto. Jva.6 o superior. nos basta con modificar el fichero HTML. La creación y borrado de tales carpetas es un asunto que estaría dentro de la administración del servidor de correo y. podremos leer el correo de fonna totalmente segura a salvo de miradru indiscrctas cn la red. NOTA: En UIlIJ dl&tribuci6n RedHat Linux.O DE APL. para la cuentll UD_U.2 ENTRADA AL CORREO La enlrada a la aplicación la hemos separado en dos ficheros: un fichero HTML donde está definido el aspecto de la página de entrnda y el propio programa de entrada al II'cbmail que comprueba que los datos introducidos en el fonnulario son correctos. Papelera). '/Op.LCACLÓ:-l: WF. (Secllre Socket Layer).poollmail.O L).

El contenido del fichero HTML responsable de la apariencia de la figura anterior es el siguiente: <ht.. ) </script> </head> <body> <center> <lmg align.pas6word. la página HTML contiene unas líneas de código JavaScript que verifican..'left' src='images{MAIL.CIP'><img align~'right' 8rc. que los campos de usuario y clave del formulario no están vacíos.. ) lf ( {ldocument.fEntrada. antes de enviar la página con los datos del formulario nI servidor.. para evitar conexiones fallidas al servidor de correo y esperas inútiles al usuario.valua' alert ('No ha rellenado el campo de la clava") return false..fEntrada.'imagesiMAIL... ) return true.value) alert('NO ha rellenado el campo de usuario'JI return false.' .". Por ejemplo...rnl> <head> <title> Entrada al Correo <ttltle> <acript lanquagea'javascript'> function catnpOs_ok (l ... lf ( l!document.. O'~I ..'"" Jl"! 1 " r:: Correo .-1---- Esta separación entre aspecto y programa nos permite implementar código JavaScript que realice pequeñas comprobaciones de manera más cómoda....login..'fEntrada· action*'Lndex. "01' l. a."> <table border~'O'> ...php' method~'poat' onaubmita'return campos_ok()....~ PUP j A TItA vts DE EJEMPLOS O RA·MA """' '.CIP'><hl>Correo</hl> <form name. . c. ".

i f (!$subnlltl I ) requlre ·~entrada. para accuo controlado .. por último.entrAda..... Si así lo fuesen..O 13: EJI!MPI.esaion_regiater("WM")¡ _.$lo..'center'> <input type-'Bubmit' name..html"... se crea la sesión y sus variables.SpaslIWOrd» ( require "wm.'tr> <tr> <td width='SO'>Usuario:<. el scripl PHP de entrada imenta realizar una primera conexión. El código del programa de entrada seria: <. ) else I aesaion_starttl1 .Itd~ <td~<1nput type~'text' name_'login' ></td> <Itr> <tr> <td width_'SO·>Clave:<ttd> <td><input type='password' namea'pa88WQrd' ></ed> <ttr> <tr> <td bgcolor='..f..<td bgcolor="fffbad' colspan... se almacenan en éstas los valores oporrunos y. elBe I $serv_lmap='localhoet:143': ií (!$kJc • ¡iIMP_openC"\($serv_imap}".C RA ·MA CAP!nll..... align...(.. se redirige al navegador a la página que muestra las cabeceras de los mensajes con la !fnea: " " Si la conexión no puede realizarse.O DE AI'UCACIÓN: WEBMAlL 0157 <tl"> . con el servidor lMAP para que valide el nombre del usuario y la clave introducidas.html·.'center'> <font size='+l'><b>Entrada al Correo</b></font> <. vía la función imap_open ().'eubmit' value. echo "<br><br><hJ>·· ERROR: login incorrecto</bJ>"....fffbad' colepan='2' align..in....Itd> <.' Entrar! ' > </td> </tr> </table> </form> Por su parte.' 2 . se emite un mensaje de error y se vuelve a la pantalla inicial..

.. $WM_BUZON-ACTUAL ~ 'Entrada'. ---------­ ...ver_cabs.HAX~PICH~S. 1> .e8.MA1CTAl'LPICfLAOJUN'1'O _ 4S760¡ 1/ redirijo a la pagina de cabeceras header("Location: WfII. redirigir al navegador a la página de entrada a la aplicación. php es: // inicializo la sesion session_start (): // elimino todas las variables de eeslon session_unset () : ~ession_descroy()..... .X_TAM. 1 ...r session_register ("WM_CAMPO_ORD") . ' pos_de' ¡ $~SENTIOO ~ 'O': $WM_CUOTA _ 5242880: /1 5Mb (5 • 1024 • 1024) • Ivar/spoolimai 1 $WM. $WM_CAMPO_ORD .. TRUE¡ $WlC5RV_IMAP . por último. <1 1/ destruyo la sesion // redirijo a la pagina de entrada header("Location: index . l " 13.... éste es el progmma más sencillo de todos los que componen la aplicación.W>! $WM. $W"CDI~BUZONES 11 $WM__. session_registerC"WM_BUZON_ACTUAL". 6.$login: • $password¡ '" $serv_ irnap.FICH.es8ion_regiater("~CLAVE·J ..AruUN'I'O·.php . EllexlQ del script WIlLsalida..ion_register(·~USR· ' l ~ .USR $~CWWE . destruir la sesión y.. aession_register ("WM_SBNTlOO") ¡ ae •• 10n_register("WM_CUOTA"). 8ession_reqisterC"~SRV_lMAP"). se •• ion_regi8ter("WMLDI~B020NES· I 8es8ion_register(·~~_PICH~S"1 1I •• sion_register ·WM.php·)..)tI..."SS 1'llPSATRAVÉSDEEJEMPLOS CRA-MA . Las acciones que realiza son eliminar las variables de sesión..3 SALIDA DEL SISTEMA Como no podía ser de otra forma.

..'./l~(lllOII .=RA-MA CAPfl1J1..istencia de estas variables y actualizamos las correspondientes variables de sesión. el total de espacio en disco ocupado y el tanto por ciento que esto representa sobre la cuota de disco asignada. .1 Opciones de ordenación y cambio de carpeta Dado que se pennite al usuario visualizar la lista de mensajes ordenada según distintos criterios..UO. .sentido y/o wnLcampo_ord...ver_cabs.0 13: EJEMP1.._ ~~~~~~~ t ..'r...........=r:'i"'t"Y1a\t". para cada mensaje. ~i1óWHII _ lroOolIiIt(tSlt) 13. . . d. if (lBsetl$~campo_ord)1 $WM. este scrip' puede ser llamado con las nuevas opciones de ordenación al pinchar el usuario en los iconos dispuestos en la cabecera de la liSla de mensajes. el número de mensajes no leídos. . Por esta razón. se muestra información suplementaria...... .... ~~~ l .. . . _.. aquellos mensajes que no han sido leídos se muestran en negrita. y la fecha.... Los en laces de las fl echas de ordenación Il allllill al propio scrip' wtlL.. el asunto.._ . al principio del scripl.4. se muestra el remitente.. si tiene ficheros adjuntos. ... Además. . comprobamos la ex. I r .. 459 13.O-IOI ¡jo.4 REVISIÓN DE LOS MENSAJES EN LAS CARPETAS En esta pantalla.r:'1.."1.BMAIl.. . 1 r -.. ....":'" [>o¡.... _ ) e .. el tamaño del mensaje.. " WebMl'lil <1:1 .. .. php con los valores adecuados en los parámelros wtlL.. como el número total de mensajes en la carpeta actual. ~ . .CAHPO ORD=$wtlLcampo ord: . . . Adicionalmente a las cabeceras de los mensajes. if {iseet($wm_buzon_4ctual)) $~BUZON-ACTUAL=$~buzon_actual: if lisaet($wmLsentido)) $\<lH_SENTlOO=$wm_sentido.. r .0 DE APUCAOÓK Wl:..

Sfilas[Sfila_i) Sfilas[$fila_iJ >from [O 1->host. es decir.. Los mensajes no pueden empezar a imprimirse en el navegador sin más: han de guardarse en una estructura que permita su ordenación antes de ser lransmitidos al cliente. luego. la fecha. llsort($filas. = dime_n~adjuntos($estruc}. = dame_epoch($cab_aux->date). repinta~fecha($cab_aux~>date).. [$pos_del~ $cab_aux->from[O]->mailbox. usamos la función PHP usort (l. cada mensaje. Pam hacer efectiva la ordenación..460 PHP S A TRAVEs DE EJEMPLOS ORA-MA Lo mismo ocurre si queremos revisar los mensajes de una carpeta distinta a la actual: se llama al script con el parámetro wm. el asunto. el número de adjuntos. sfilas[$fila_i!($pos-pos_e"-buzon) w ·$n~sg·. contamos con un array numérico que tendrá un elemento por mensaje y a su vez cada elemento."¡". "orden~or·l i pint8_tabla($filas). Enviados O Papelera. if (Scab_aux->date) { $filas(Sfila_i) [$pos_fechaj= 1 el se { 1 Sfilas[$fila_iJISpos_es_nuevol = es_ms9-nuevo(Scab_aux). la cual nos permite definir una función propia de ordenación La función definida para ordenar los mensajes en función del campo y el sentido requeridos es la siguiente: function ordena-por($a. son guardados en su correspondiente variable de sesión. si es nuevo. Para ello. almacenará otro array donde guardará el remitente.buzon_actual asignado con cualquiera de los valores Entrada. $b) { global $posiciones. Sfilas(Sfila_il[Spos_asunto~ a array(). el epoch.$cab_aux= $cab_aux->Subject. que. $WM_SENTlDO¡ $posicion • $posiciones[SWM_CAMPO_ORDJi . y la posición original en el buzón. ~ $filas[Sfila_il [Spos_tamJ Sfilas[$fila_iJ[$pos_adjs] Sfilas{Sfila_i) [$pos_epoch) dime_tam_total~g_bytes($estruc)... $~CAMPO_ORD. el tamaño.

selectedlnd~~ alert(-Debe seleccionar Mover o Ellminac-)J return. if Illsta.valus.paroMl8{) ( if ) (document. •• Ol { function sul::mit_con.checked) lista +~ document.checked) li8t8~document.f_cabs.O 13: EJEMPLO DE APLICACiÓN: WEBMIt.1ength > 01 { lista • ·~~gs=· + lista..·.msg. ) 13-4. return ($aa < $bb) ? $si : $no.. detaul t: for (var i • O: i < max: i++) { if (document.-·.-1.· ) ) llsta a llata. strtoupper($b[$posicion])..Jll&Os. ) $aa • atrtoupper($a($poslcion]). (llsta./L 461 if t$WH_SENTlDO $sl . .m8g. ~ = 1) { else ( $s1 .msg(iJ . $bb..sLaOperac.langth ) 11). $no.va.f_cab8.lue) t var lista.o RA-MA CAPITul.value breaK.fOperacs.2 Selección de mensajes para ser borrados o movidos Este apartarlo está implementado en JavaScripl dado que la imeracción con el usuario se hace en el navegador: o Las operaciones relacionadas con la selección de mensajes para ser movidos o borrados se reaJizan con elementos de fannularlo: casillas clleckbox para marcar aquéllos que deseemos y menús desplegables de tipo selecr para indicar la carpeta destino.f_cabs. var destino="'. -1.1. $no '" 1 . var II'IAX _ parselnt IdOCWlle1lt. caae 1: if (document.f_cabs. f_cabs _total. if ($a8 == $bb) return O.substrlO.msg[i). 8witch(max) { caae O: break.

~ (88ooM) { af (document.php?· + operac. } elBe tf (esNN4) ( with (window.visibi1ity~·show·: ebe ( dncument.va ue: J tf [operac ~B "Mover") r + buz_destino: destino-·&~uzo~destino=· operac3'~operacion~' locat.value. Por el contrario. 81tl~ tecUndllXl .salectedlndex 1) doc~ent.462 I'IIP 5 A TRAV~ DE EJEMPLOS O RA-MA lt (esOOM) { tDdadoeument.fCarpetasJ buz_de8tino~BLaCarpeta[BLaCarpeta.sel~edrndexl va us.fo~.document.rtPdTn~~xJ .getElementByld(·cdestino'l.visibility.document.f quit~n-Puzon_destino() { .cdestino.forms.SLaCarpetafindl.document. value: with (document.~h1de·¡ J ) al se { 1/ e81E4 if (doc~ent. si la operación es Borrar.getElementByldC'cdestino·) . with (window.location=locat¡ ebe ( a1ere ¡'NO ha seleccionado nlnqún lIIansaje') .selectedlndexl .8electedtndex es 1) ( . + operac+destino+lista: window.fOperacS.fCarpetaa.style.viaibilityz·viaible' else document.BLaOperae. ocultamos dicha capa.sLaOperaclsLaOperac selectedIndexl valueJ J elsa « buz . 8LaCarpeta( fCcupetaB.sLaOperac. J ) o Si la operación a realizar con los mensajes se leccionados es Mover hacemos aparecer una capa HTML que alberga un menú desplegable donde poder indicar la carpeta destino de los mensajes.fOperaC8) operac-8LaOperaclsLaOperac. function l.fQperacs) operac.fOperacs.cdestino.cdeatino.·~selecs.all.forms.seleCtedlndex buz_destino:document.forms.de8tino_tCaIlj)l8tlls. IIWCllrpeta.fOperacsI oporae sLaOparaefgLaap.fCarpetas sLaCarpeta.rae 5el.fOperac9.value with (document.visibil¡tye'hidden' alS8 i f (esNN4) { if (doc~ment.sLaOperac.8ty1e.Belectedlndex • 1) { document.

.ocultO.1 •• if {esNN4I I ¡f do~ent .all.enti. } abe { document. libilityw"h~d~n· . va< eaNN4. tl .v.php")...getElementByld! o4e.t($~bu~o~actU4111 ~N~CTUAL~~buzo~actual Jt (haet(S ___ entido)) $WH.~egi8tered(WMll header("Location: index..) .: APUCAnÓN: .cdestino. Idocument. • wm_oentido: asc~ndente • if ·..f .aan. poe_4luntol (ll!délcendeoté 101 {pol_tam.fOperacs..top:Opx.~qu8~sg.U1MMI .xa4 811100M • tdocul!lt!nt.(elativ8. ir lias.viaibility "hidden·.1 "faty18> va. (l..u.eLaOperac ••• lactedtnd*x ..oo_actual: ~c~o_ord: Entrada.-:&mpO_oro¡ <aty1.dol 1" tl ....style.forms.tbi lty "v1aible" els.POo_buzon_deatino (1 { i f tesOOHI l it tdoeument.tyle.vlalbllity: id..m. 1) docum. Papelera ca~.. typ . :AKPO_ORD-$WN. ¡ ¡ El código completo del script wm.Rubroit!!.getBlementByld) ? 1 .SZN'I'loo-s-.ver_cabs.vi. pea_de. dooument.J document .".. ..lay8r.LaOpera~ selecte4lndex lbow"¡ • 1 "ltino. .valuaan-m-gl docurnent.v.style .ta(ttl... php es el siguiente: " •••• • ~.Rlbilit)"l .CAPITuLO 13: EJEMPLO I>E.f docum~nt.la.. "textJC8S"> 'c~atino (position.. e..viaibilityw·viaibl..all.eaaion_i. 1 1 o o O '" tunction ( (docu=ent...ral campo por el QU~ ~e ordenan lal pos_fecha.fOpe(a~ .oculto. Enviadoa.c4IIIpO_ordll Sacript- r.tioo" Ityle. an) ver~g(n~sg) • • (doc~nt.cdestino. • • ~bu. function qulta.nt gatEl~tByld('cdestino" ..

OlIr •• tntldOC\lm. with Idocumant.I!IhA..4ó4 PlIP5ATRAVBsOEEJEMPLOS CI RA-MA l e ir d~t.. 11ata.fC4rpetaaJ bu:_destino-sLaCarpetaTsLaCarpeta.ibl.~ 6ocu.atyle. php?· wlndow.se O: break¡ caae 1: if ldoe~ent.flndJ value with ¡~nt.OClNI ( lnd.• electedlnde~J value¡ ) if lo. ( d?e~t al .lIIBg [i J .sLaC.vieibility.ta.ant.1 •• .t• • ".msg.forma.r<'lt.l • O.·~operacion.~g •• ' • 11at4. length )o (11 r 11.tlno.· loc. ) aln ( buz_de. ¡ < .doc~ent.f_cabe.LaOperac.c. .value+" " liata.'~alee .aelectedlndexl valuer elle if ¡eIlNN4) ( with (wlndow.deatl~.tlno.dOcumBnt.lue.document.• LaCa~petaftCalCpetaa . •. ede$t no.aelectedlndexl value¡ w{th (window.LaOperac[8LaOperae .OperactaLaOperac.~nt. n~..edel!ltino. Ceal.~ac •• 'Mover') ( de.vlll11")' val' lilta_"1 Vllr deatinOoo" ¡ Iwitch!m.daeument.::$ .t'Optll:-acl!I.fCarpeta•.. v_. return: ( var malO:. lt: 1150<:.f_cabs.lengtb·l ) lf t1 ht •.~l.t.tC4rpetas.fCarpetaa .valua.8eleetedlnda~1 .v.. bldder·J ) tunc".t_cabs.e.•LaCa~peta . 11ata.checked) liata • document.seltKtttdlnóex _ do<:: ~.fOperaea) op8~.cheekedl ( l11ta .fOperaca' operac •• L.o1.t1no."LaOpecue.al .J'\ .forma..• LaC4r~t.~1 lit.viaibility.rpeta •• eleetedlndex bul_de.m89t1 .atyle.foraa..value deteultl tor ¡var .e·..7':'I aubllit ~r4IM (1 .ax) c.lOCat¡vn_1OC8t.•• l..fOperacl!I) operac*eLaOperac[. buz_destino) • ~ ~r. alalCtl"o.f_(".~8tino.lubetr{O. 1 f 1e.ctadtn~8xJ .b4 8alecrio~r Mover o EliMinar').msg.ax¡ i++) ( if Ido '\JIIIent.a¡""OpelCac aele-ctedlnda.·&~bu:~deatino·· opar. J . gA..-nt fOperacI. esIE4 ) ( . ope~ae.

_ . . 1/ Reopondor Sbotonera[J]*'O'.') . . . ('poa_QUI'lto'} Spoaiclo1H18 ('pos_tam' ] $poaicioa..feeba. ('poa_<lto' J "2'1 • 3' ¡ '4' : '5' 1 Sposicion. 8ubject. . 1/ Reenviar $botonara[5Je'O'¡ 11 Eliminar Sbotonara{6J.n..DtlLBUZONE:. 1. EJEMPLO DE APUCACIÓN: WE8MAlL 465 al~rt('NO h. '/ necaaito informacion adicional a cada tila: al epoch par" pOder ordenar por techa si ea nuevo el menaaje para poa4rlo en la po.aje' I I l if /SWM_BUZON-YoCTUAL. S.ginto ISbu~onll '~.. 2..ieion del mensaje en al bu~on ¡ • Sfl1as¡$ij_array(from.nyo.adjwnto•• apoeh.·O·. 6. seleceionado ningUn m. </font></b></center>'f if f$infoJru~on->NaI8ga $lnto~zon '" imap~ilbo~.. lRI1 SMLBUZOtCAC'nIAL'.·.-ACTtJAL '" 'Entrad.to' •.a¡'poa_adja'] $poaietones {'pos_epocb'] $poaieioa•• [·pos_fecha'] SpOsid '6' l • 'poa_esJl\1ll'Vo' • • • • • • • '0'. /J ReSponder Todos Sbotonera(41e'O'.). 1/ Actuali~ar Sbotonera¡lJ~'l'¡ 11 Redaotar $botono~ft[2J. '1' ¡ '2' J • J' I '4' I • S'.f.'l'¡ 11 LOgout echo '<br><eenter><b> <fone faee~'ar!al aarrow' color_oranga> SWM_aUZOR~: $lnfojbuzon->Nmaqs manaajea.tam. 01 ( return 01 S1_caba • /' i~p-he4der8{Sbuzon). 'S!iOLusa". iflis_anayISl_cabsJ I ( . Sbotonera=array{)¡ Sbotonera[OJ*'!'. .. •. php')¡ '$~ript·): pinta_ea"'ceraJ¡tlal ('MenBilllja.. • 6' .1:O ocurre WI al inielo _ _ ion J $W!LBUZON. ~_oeupMIo"'y_quota f' SWH. 3.4:1 RA·MA CAf>fTuLO 13.nu~o • poslel • $filas¡Sl]=array(O. ) ineluda(·.../~eabeeer5 I! e. . 71 ¡ Sposieionell • array 111 SpOlI_de $pos_asunto Spos_t_ Spos_adjlil $pos_epoch $poa_feeha $pOB_eSJ1Uevo • • • • • • • '0'1 "1" ¡ S~ieiona. $info_buzon->Unread no leido..

. $f1 .aWPIt-p~rtSbul:otI. "t" $cab.b.rny( O. $no..c~ntol .. . Spodclonaal$WM....po .. t($ _e.".fecha...ap iat. $fl1. l ... ~ in *J.. SillaalSf1 a_iJ • array(). • ral)inta ... l. .JI"II. I 1 . . 1. S~SENTlOOI Spodcion . el !Qrm> . ( $al.Bubj.g_nu.PO:. )¡ 1map_laat. tunet!.. 1.a.. . l.. SfilallSfila_iJ (Spos_epoohJ • dama_BpochtSell.lX..!1a(Sfi •.~ ) I Seab . \I~rt: plnt~ ¡UI. g..~I't'orll .djunto.$!Nl'IDO •• 11 ( $al..la.l$ •• trucl. Sf11 •• ¡Sfl¿a_il {Spos_del~Seab_aux->tr~IOI :>N1ilb.' . 1 1 . holt 'fila.:>n o:.. ( 1. . $~CAMPO_ORD. • • n'."dats) ( ! $Ulas I S fila. _chl$].. ) Spoa. $f1.ü box faUad.vc I$cab_aux) $fi 4aU f i .. (O J ..Scab_llux :>Subja(:t...111 $poa_fachal 81a. .466 PIIP 5 A TRAVts DEEJEMPLQS el RA-MA ••• Sf la ••aX'rayO Sf la_i.lI{$t1la. ~input n~a'f_oculto' .lJl\8<J byta.l¡*..ll • .rClilB_iJ {Cpoo_.tchBtrueture(S~l:on. heha ($cab_llUX: datal I I . .($f ·orcl<l1WLJ)Or*).·~qu~ag·> . U.CAMPO_ORDlr S t t $\101. $no. 1 2.ad uPt08..('I .-buzon'.b_aux->datal . $b) { globel $polieionea.-I$o.a JI srila_~I •• t't'ay(fr~.llaa¡ Uila_i 1 tSpoB_tam] • dims_tal!Ltotll.'Hlx :> rt'o.-den...1 $~ . 4 p • ~UI SHl. (Sallt :'uc] Stilaa¡Sf11a-iJ {Spos_adjal • ~ima_n~. o<ho cfor.Cl. i++. $va¡ . :lf ($oab_aux. .~. 6. • . ~l..epocb.~ wbll. ++$nJI'S9) $~) ~o $ •• true·~p f. 1' $l)Oa_eaJlueYC\J .ction~'~lnfo~g· ~tbod ga tvpp-'hidrlen' nome.

4dJal . Sf_oegr_'c/b> ) .a < ".._en_bu1'onJ .PO. echo • oIcenter> ¡ oCtabla BORPERaO CeLLPÁDDING-Z pinta_fila_operacion.riaU$ ..e RA-MA CAPfTULO IJ: EJEMPl.Stl$tl [Spo.'cJf~nt>'· Scol_fitas .'.. <lont fillce.ansaje n ba Ildo vilto • f t$"t \ $i I I Spos_ea_DuevO] It ¡Si ¡{$pos_el_ nuevo . $pol_tUl.O DI! APUCAClÓN' WF.. '. fFFFF'P'P" $loo_col _fUas .0.. SpoS_e8_nuev~.1-t~'$L«.'uial narrow' Ih 1 $ Ilriill12. $t (Si J [$poa_asunto 1*POfLur1 (St ¡ Si J [spo • .bb) ? Sl1 1 Snol I function pint __ t.cion!1 ..o i f (ISt!Si) l$pQ$_asuntol1 d. • .I.oCcountl$tl $lnd 001-fi1as++ $inCI Si++) ( eol filas'_2. '<tP'.. fech4 $t[$1 tSpoa_fechal"Si_8rial _ ...'gre-n"· f t> $i_neqr.. <¡lobal $~_de. ( 8tU~lrSpo __es-"uev" "'oCf lt col~'rerj' lize 1" ! r "19 . Spol_ ad • $pol.POI_el bolJ' 1. tone 01 . $J.1 pinta_-abe<:era_tabla 11 CEL~SPACINo·a '1 "r 1$1"."ff "ceqr$f font' flChero._•• unto¡_Si_arial._Ulas (l J ..Ptl9r 8t . arrayl).J=pon_ud{$tlS1J¡$po~. .__ tlllll $t "1 $po.nja: $~_recha.dJuntos t I$U$illSpos.J\egr(St{U 1$ de 1St neol$r 'ont11 a..1 . h Spoa_VOI_~~OI $ Arilll. rfluan S. • . $tlSi) [Spolu1ellt $t S11l$pc .Sl-"89r. $pos_atl\lflto. ~sunto St(Sill$po. .bla Se "lobal $inlo_bu~OI'" "lobal $MLBUZORJC1'OAL..oel"'U_arial$i.. haJ $l.negra" t> It $illSpos_d. $nar.d1. .negr·. 1 '" compruebo 11 este . Scol_tlla6(a).8MAlL 467 $ • Itrtoupper' Sb[Spol1. 2>' $. .font I tamanyo $.dl ._•• unt~ f.neqr $~"neqr $f_f~ntl t $i ISpo. $t[Sil [Spo. a.untol~'&nb&p¡' ) e18. t. ( Se[$ J !$poe_a.... ·bgcolor . .·oC!ont facea'Brial narrow' liz~... Sbbl return o. lont.. 1r 1$..¡nt.-L9~uluL~'~~FBAD·¡ Scol.

$e ale.. ..e x I ...fi las 1$ind.J¡ $PQl++} ( . $t Sil $pos_adja ) fIcha a".glf .t8lfl) ( $un~ga-l049S761 $utU.enter>" II ..pga lQ voy a uaar para el -ec~rrilh pe el h. /t):>· ¡ el ho '</table> <input type_'hidden' name~tOtal~&gs va .ight><font aize"'l>" ($i. U"ar._ Sinfo ~u." I a~ ~t $a d..anyo-O. "b" alaa if ($u"-tam ~ $un~al jf retUI""n r'lund !$un_tam I $un_llleQ"a. > • > <1 fonft> < . Son: 1 { .. .col.. aOj_ < ~ sre_\"imageaJattacb-ant. ($tl$i] i$PQ6_adjaJJ fich adj~~" $img. • "<tr Scol.StlSlj {$poa-PQs_en-puzonJI' ></tdlO -ctdlO{$t {Sil ($poB_es.tr->parts)'( raturn w)unt ($se >parts) ·11.. t tal. 1: !lll\. ) el. ($t (U 1 ! ....ver.totalJIIS~tea t$ "'r) Ita..._ .ll '</~ont_Jtd> .U1ctIon dl-.. ~. . alt_ "$a1 J he~ght~\' 1\' wid~._del }</td> tdlO {$t r$i 1 [Spos3suntoJ ) <1 td> <td align_right>$el_tarnSf_fQnt</td> :td>$img_adj</td> <td al1gn=right>($t(SiJ [Spos ..po.468 PIIP...S._" I >SIxl. -1024¡ !$u"-t~ ~ 100) raturn '$un_tam'.' 15 .1. 11 ..cript .. 1) 'K' ( fl. ~'h) anb8p.nuevoJ 1< td> <ed.'M' J alae ret~rn roun~ ($un_tam I $~k. $PQe"caunt($etr~~rt..tr·>partal ( lf (la_array(S.a $i ad:.." .td> put type_' 'ched:box~" 1\0IIII\8_ "IU"Q' valu..fec:halJ</td> .... . •• funetioll dizna_t/llll!$u"-.. 1Sn. fi 1_1 > <td all9l"_. jave..5 A TRAVÉS DE EJEMPLOS CI RA·MA r 1$ Ui ($poa_adja' > al~. I pon_url($n_lIIIJg. f ($atr->partsf ( lt 11a_arrayl$atr->partsl I for (S~_~.' r tunetlon ~_~adjun~)a(Sstrl :If IS....

. t i_stampl I t=es~[OJ~·Bn. " {$array.anyo S. Teturn round($tll!lW'lQ241. . fecha [ .. SlI'Ieles ¡ 81·' Sep' ¡ $lIIelel [91 _' Oet' : $lIIe..aJ . $str_fecha) ¡ Shorax~explode(':'~ $fechax[411.ea[11.'MeT' 'S .0 fecha: O 1 2 3 4 $!echax~explo~e¡· ."r s _••.. .xplode(·l".. $¡._facha[2] . ·OC:t ")_9.i..' Ago' ..Saubestr' >bytes. Sfeocha.lans.·Jan·J_O.·Aug·¡_" s.facba'"~lode'o f$elema.' ..\~. ·Jun·J.J'\¡l ' J $_. 1:Z Mar 200111:2814:1 +!1¡\. $fechax[lj..J. $anyo-.IOtal " uao la funcioa 11 im¡r. Sel~_fechaf4J): return 'Sal_s_fech. l.ubllu I SelltlllJL.ca'J ...tamp. nO funciona ~otr~t&Dante con l~p_open.tJ ) . fIn de dame_epoch!$atT_tech4) f'Jl1(:t1on ( Gu. fecha (Sel.S.1suar io.l~_horallJI·.uot. $lechax[3JI: ~..: Sme.nfoO ti! porqu. Die'. $horaK[lj..!i: $llIeIes.. EI:Iviadol' 1 " $tam.1. $horax[ll.o RA·MA CAPiTULO 1).{·$dir/$u~t~o·' " $tamufilesiz."k t". S:llesal:·ApT'¡_l¡ $lae-ae..W.c~[' tm. rs . WEBMAIt.ocupado"'y~otl:'ll$di" [ileai~.cha) S_e.. ~j mktime($norax{OJ.ay 11 . $_Iel i 11:.J .· Hay' . fecl\a[' tlll..rsposl/ St~~~... _f.. 11 e.tr·>part.$mese... tlI'UIIday' 1 J I ($ne••• [$bn::. [" l.'-MaY'¡.uarlo. S_.aflJ 'S.l)j $anyo_r1900 ~ Satt8y_facha[ '~eat' 11 ...ella [ 't. (l¡. J)/$anyo (($actay_f. >bytaa .. taturo $tamanyú/ ) f~ion h4~•.ea [.lO '-' NOV' . (. retu~ 1..II"Feb°)"¡.$ _ 1 ' "M4r' I_¡t. "Sep' Jdh $1M'se.._ 'Jun': $!118••• [61.·Abr'. . . "$dir l$I... (ll.~f~lesi~a("$dlr/$usufttio. 469 ~eubeatr*$. 20001 i f ($anyodOI { Sanyo _ ·OSanyo· ¡ Sfeeha . f..'I$me.~otaLOJ :$.p__ ilb0D!a9.¡.. $ _ _ -ar>. .. {-NOV" 1_lO 1 (-l!leS8e]·o.Jl1. $. Di coo l_p_reopenll $t~·filesi~.. returr.f """ha ( J 1.1 .c' J _11.($~tc' •• Sun_au)...o' j) l'..rQund{($tUl' QO.P«P81..llurll:m' . ) funetion ~~:h($at. blase$l14).l de da fecMl Mon. tunctlon repinta_fech. $artay_taeha_localtimeISe1_time. $mes •• ($fachax[211.lJlc...hout')) : I$array ...'Peb·:$me. . EJIOMt>LO DE APLICACiÓN. $el"'~ra . l). ) alae Stllll\llnyo_Satr .

"') { scho '<option value~'Env1ados'>Enviado8<foption> <option value='PapeLera'~P4peler4</option>': elseif ($~~UZON~CTUAL . " ) : echo <Iselect> </span. "Enviados') { echo '<opeion valua='Entrada'>Entrada</opcion> <aptian valueR'Papelera'>Papele~a</OPtion>'.·j4v.pelel'a') ¡ echo "<optian value~'Bntr. bgcolo~R'tFFFBAD'> $i_a~ial. el bueno: • </span> • <ftd> • <.> </td> </form> "¡ /1 el orden de cierre de span.'8L4Ope~sc' onChange. td y form no es caprichoso: ..470 PI IP 5 A TRAvts DE EJEMPLOS GRA-MA function es~sg~uevo($struct/ ~et~ { ($struct->Unseen _a 'U" I1 ( $st~uct->Recent . <td colspan='4 ' valign~'top'> <form name2'fQperacs' method....'post' acti~~'kk'> ¡ $.i_~:dal) <salect name. para 1I no generar una celda muy 'altA'. 11 Ademas. else { die ('~' BRROR en el buzon . . . $f_~~ial../fortll> . "N'): function global echo' <t~ pint~fil~_ope~aciones(/ $~BUZON~CTUAL.ctual .ec~lpt:Quita-POn-buz~de8tiDo() ' > <OPtinn valuea'-l '>Qp~racion</option> <aption value='Mover'>Hover</option> <option valuaR'Eliminar'>Eliminar~/option> </saleet> <b>Menssjas Seleccs</b>$f_srlal <Ita> </fot'1D>" : echo • <td colapsn:'l' valignc'top'> <span id2'cdestino'> <torro name~'fCsrpetas' action='java8cript:void(O/' methcd.. si pongo el form antes que el td no aparece el salece ¡.d~'>Entrada</option> <aption value='Bnvi.. ...do8'>Envlados<!option>'. •• 'P.. e18eif ($W)CBUZOlLACTUAl.JIUZOlCACTUAL ..'post'> {$i_arial}<b> a la carpets</b>$f_arial <8slect name='sLaCarpeta'~': 1 f ($W!LBUZOICACTUAL "'= • Entrada' 1I $WK.

l.li9n~left><font b...uH}IA ~ p s t_O ee~ '<th 41i~. l>iInbcp¡c pi t ._ l>6.9i f echo ·~th alignalefc>ctont Stiro_abajo Stitulo faca*\'vfl~dan4\' color~whlt.:m() " .· ~ethQ4r·q.ute e val~e-'8jeeu~r :> ee .. ") $lGlJJUZ(lN~AI lAl" 'poe Cle·)._celd..oocer.. </t. o: Ith> ~to .l~$buzon&~campc_or4-$campo $t1u-"bajO"$inl_tira '&WllLBElntl& ~l\'_lag rd'.t· aetion ~.'... n 'av••er pt voidlOI onelick_ 1av..::lth faee_\'verdana\' c:"olor_whlta ..'buttOo· aet.sc ip .• ·~buzo"--actu..>'¡ St iro_uriba"$ini_tira . ·CI._eon. 1 $tira_arriba. echo e tr>'.glf bordflr*O>cr.l&t. pinta_celda_colLfledlU_ordllJ1. sJ:'c iaagee/up.. celda.iz.RA MA CAPtTUlO 13: EJEMPLO 08 APLlCACIÓto.JZIlrl ~AL 'pos___ eunt ~ 1 plnt .\1AI/ 47 1 • ~. ~_aUz..h:>"¡ J f Un dEl pint.nb8".a...b..'f_8u~t_cper.con_flechas_ordan..left <font tac•• 'vwrdan4 • ~ r whit .--. eita.f1ecruas_ordElnaeion( 'De' t. ~ fin plnta_ .>e' plnt. I runet Ion piot4-._ubla I l I glON1 G~WN_AC"l'UAL.< i. '''\OIlII_8entido_O\' >< ill'l\l erc:_i..1 .. celcs.leo •• php' <tr bgcolor_\'Snaranja\'> <to align-left><font fac •• \'verd¿na\' color_whit..c.abecera_tablal! $inl_tlr •• ·&n~p. ba $1IIlBtnotLACTUAlo 'pos ep.flElchae_~rden4e onC'P ..nWp~.c._ordElnacion " .lze.< t >.-\'verdAna\' color-wnit •• 1~.e' <input <4> fOnD • t~.e.ini_tira . _ ze 1>&nbep¡0:/th:> cto align_left:><font fac.: WfH.nwlO'ae 40 border·O>c/~:>· I . Soaranjal echo '~fo~ nama~·f_c.~flG<:ha.adon('AduntO· $ML.. href * "~ver_cab.

..I ..jIIII2MA ..!: ....:.. y es desde esta página desde donde se llama al programa de componer mensajes. elc. _ . _ .para type:hidden name=~concopia type=hidden name~asunto value"" $Wl'lLQUe . "'...wm_QUe_nug typp~hidden name::.. asunto y texto)..._~ "'-Wlto. todos estos datos se envían en variables de formulario tipo hidden al programa de composición de mensajes.""".. Además... .472 I'IIP' A TRAV~ DE EJEMPLOS O RA·MA 13. "''''''... Feoha' '~(l13111 ) '..$i L=::r'~. ......yp••hídd...w~-""'l_dlWoW OIl_ .Cc:.. ~ ~ ~..Jnensa j e el número del mensaje a visualizar.... o...--_.11 ___ U_ID u. el tamaño.IIPOller_oper> typc'''hidden name::..:> value~'$el_cc '> value..'$el_subject"> .. . .... sino que se muestran en el pie de la página indicando el nombre..m..."I . _l1li_ "'....al¡· '> values'$el_de > value'" $el_t". La carpeta de donde extraerlo está almacenada en la variable de sesión WM.. ........ en esta pantalla sí que están activos los botones de responder y reenviar el mensaje que está siendo visualizado.. para ahorrar conexiones al servidor IMAP.. ".. ~· D_ _ t .~de type:zhidden name=loIm..~ WebMail "I""-....".. -.CTUAL... . !l d _ ~FIiIIpw. puesto que el programa de visualización de mensajes ha extraído ya la información de él (remitente. <ÍJ:2¡)ut <" input <input <input <input <input t.. destinatarios..004.......1 Lógicamente.%On""f'1 0l1li .:b. "'.... ... el tipo de codificación usado para su almacenamiento en el buzón. .....5 LECTURA DE UN MENSAJE El programa encargado de revisar el contenido de los mensaJes recibe en la variable WllLque.. • .... Los ficheros adjuntos no se visualizan en el mensaje.BUZQNJI...n n&me-MD..._t_ ....

1 <input type=hidden <input type=hidden 1) . ses8ion_start() ."'wm_operacion=Eliminar· . 11 Reenviar $perams.C RA-MA CAPfTULO IJ: EJEMPLO 013 APLICACIÓN: WE. 11 Responder $botonera[J].. pues el objeto date devuelto por i map_neader (1 estaba vado.. ·.ph~")..f_reenviar. $el_Bcript"'O <acript lan9uage='javascript > function reenviataccionl document. /1 Redactar $botonera[2)="l'. $par~./~cabecera.~componer 0~r. curiosamente.value-4r ion: document. $botonera[O]="l'. i map_ fet c hbody (1 no proporciona las cabeceras (envelope) donde está la fecha e imap_fetc h_overview ( 1 tampoco da la fecha. 1/ Actualizar $botonera[l]~"l". A continuación mOSlramos el código completo del script que nos mueSlra un mensaje: <.php.php • parame entrada: WlI\. ."l'.. $~que~89 de $~BUZON~CTUAL'. ($total_8djs- Por último. f_reenviar. . • llamado desde: ~ver_cabs. wv in!' maq.8MAlL 47. > name~texto namea~nUMLadjs value='$txt'> value-'" . Logout . I • header('~ation index. se debe comentar que. } <Iscript> pinta_cabecera_html("Mensaje Ni '$el_script') ) $botonera~array(). ha sido del objeto udate devuelto por imap_header ( l de donde hemos podido extraerla. ha sido complicado extraer la fecha de los mensajes aii. Finalmente..Q\leJllensaje fnumero~ include(·.php·). if I 1séssion_is_reqistered (WM) 1 $amarillo=' tfffbad' ..'~gs~$~que~s9'. 11 Responder Todos $botoneraI41~'1'.adidos a un buzón mediante imap_append () . submit f 1 . $botonera(S}g'$params") 1 1 Eliminar Sbotonera(7)cO¡"I .

ntf "s¡\s' $el_de{O ->ma!lbox.php'). $el_to s " .atá la fecha.spr. . • ClJando es un mensaje anyadido con imap_appe1'l. ) . $i<count($cab_aux->cc). • include!·. ). $e1_cc. • Tiene que ser con el objeto 'udate' . • • body{Oj: cabecera completa del mensaje • parametera (no~l): attribute: C~ET valla: U ASCII l.p_f.uel~ ten~r ATTACHMENT o rNLINE (Pnviarlo deAd~ netBcape) • .. no obtengo la ~de fechar el o objeto 'd5te' devuelto por imap_header esta vacio. 00 da el envelope Id . tampoco da la fecha.a 'sits'.d o i~p_fetchbodyISbuzon. $cab_aux->cc[$i) >hOBt). Sel_de./~lib_imap. Sbu~on~dame_canal('SWM_BUZON-ACTUAL') : • tmprimo la cAbecera S. valual n~e deL Hchero value: nombre del • parameters de cada parte : attribute: NAME. cadena de sepa..474 PIlP5ATRAVÉSDEEJEMPLOS .. Si •• ) $e~ to_aprlntf("s 's8\s'. fichero • diApoAlti~n . Sel_to. f~r ($i_O.a 8859-1. $1++)( Sel_cca8printf(". $cab_aux->cc{$tl >ma11box..racion • dparametera de cada parte: attribute: FILElVY(E..l_de-Scab_aux->fro. tor ($1-0. $c:ab_aux->to[$il->mailbox $cab_aux->to{$i >hoat). num~g.tch_overview. • io:aa. Sel_deJO] >hoatl. } Sel_cc_" . Siccountl$cab_aux->tol. etc • parameters (~ltipart): attribute: BOUNOARY valu.

" ~ithout the HEX code of a Character. 11 1 use the regular QUot~rintable_decode instead.. " de la pagina de imap_QPrint: 'I'his funetion lIeem8 to have a 009. " echo ' <form namecf_reenviar action... 473 ..•. $estructura=imap_fetehatruoture($buzon. ) "TEXT/HTKL")... . /1 la parte 1.. $~que_msg) ¡ 11 Cuerpo del Mensaje . else ..."RA-MA CAPIl1JLO I J: OEMPLO DE APLICACiÓN: I4E8MAII...• _ .•..php) else ..php' me~='poat'> <table width=lOO\> <tr><td bgeolor~\'$amarillo\"> Mag Número: <b>$~que~g</b><br> <table> <tr><th align=right><tt>De:</tt></th><~d~$el_de<br></td></tr> <tr><tb align.. lf (strtolowerISestructura->subtype) •• "html") $txt .. ..l.. I ¡no es parte del modulo imap) ... when the 11 quoted-printable string containa a ".br></ td-"< I tr> <tr><th alion=right><tt>Aaunto:</th><td></t~$el~ubjectebr></td></tr> <tr><th align_rioht><tt>Fecha:</Ch><td>c/tt>$la_fechaebr>c/td></tr> <{table>' . ) if ($estructur4->parts{OJ->subtype __ "ALTERNATIVE") $parte~g=l. if ($estructura) ( echo "c/td></tr> <tr><td>" .2 suele eatar en html (ver pr_dbody.dame-PQreionISbuzon.•••. i f ¡$txt' { echo $txt: ) Swm_qu~O.._ ce<1 tt>....••...·WULeo~er.right><tt>A:</th><td></tt>$el_to</tt><br></td></tr> <tr><th align_r ight><tt>CC: < I th><td></tt>$el..

$m~=Stipo~ime. echo '<td>$no~fich_adj</td>".. BtrtolawerIS.• "</a>·.• ·&~que-Parte"'$po8\">': $baja_fich.rc_imagea/download.ubeatr·>8ubtype): if ($subestr->encoding) { $codif~$subestr->encoding¡ $la3odif"" ( • _$lib_codifs [$codifJ .<1'6 PHP 5 A TRAVÉS DE EIEMPI. $baj~fich. echo "<td>$baj~fich</td>'.:. ') • .php?·.te-" (que esta en parametersl if (is_4rrayl$subestr->parametera)) ( 11 nombre del fichero adjunto >valueJ.qif border=O>": $baja_fich . .) ( $sUbestr=$estructura'>parta{Spoa): Iluso 'parameters' en lugar de 'dparameters' porque la funcion attach Ilque uso no &Bigna el E lename"'" y 1.. ¡ 11 el es HULTIPART lf ($estructur4->partsl ( if (is_array(Sestructura->partsll ( echo "</td></tr> <tr><td bQcolor_\'Samarillo\'> <tt><b>picheros Adjuntos</b></tt><br> <table>' .4r. $baja_ficha"<a href=\"~b&jar_fichero.·I·._'<img . ) else snom_fich-adj~'(sin titulo)'~ lf ($subestr->type) Stipo~imecSlib_tipos[Ssube8tr c >typel .OS O RA-MA > 7' ) 1 Sl. echo "<td align=right>"_ dame_kaa($aubestr->bytes) "k<Jtd>". quoted._'~Que~9=$~que~8g": $baj~fich . Stotal_adjs_count($8structura_>parts)¡ for ($~OS=li $pos<$total_adjB ¡ $pos+.../1 cortadas las 11':1e4' $txtc: n12br(imap_qprint($txtl 1 ¡ echo $txt~ echo • <br> .n embargo.printable_decol1e me dé . D. else $tipoJflimet"text· . ) el se $la_codif~'~nbsp¡'. echo "<tr><td>$poa.</td>·.

$n~n8aje.~ . • Rutinas tI d4lOe-POrcion () Bolo se llama en el caso en ~e el :aenaaje $ b ht-'1l1 puro function dame-porcion($bu~on.~im •• $estr • ("lse. echo "<input type~hjdden name=~djSpo8 value~·Sn~fich_a. $que-P4rte). $text. lf{$e8tr-~encodinq =~ 3) ( return imap_base64($textl. 477 echo "<td>$mime</td>". echo "<ttr>". echo • <input type=hidden ~input type-hidden <input type~hidden <input type=nidden <input type=hidden <input type_hidden <input type=hidden <input type~hidden "> naJ!le~WllLcomponer. if[$e8tr-~encoding ~= 4) ( return imap_qprintl$texti. • 1MIlp_cloae(Sbuzon) .'$al_cc ' > valu.'~~que~g'> name~~de va. ) ela. } .. H¡$estr) if } (1 ( if($tipo~ime == dime_tipo~irne($e8tr») $que.JCACIÓN WE..C RA-MA CAPtruLO 1): EJEMPLO DBAPI.. imap_fetchbody{$buzon. } 1 echo "</table>".. ) eh.!!!". ) ebe { return $text.BMAlI ._opar> name~quo~g value. ($total_adjs-lJ <tfom>"..l.ch~ ""ERROR: no me ha devuelto ninguna •• tri. .' $el_de'> value~'$el_to'> name=wrnLP8ra name=wrnLconcopia name:wrnL8sunto name=~texto value.----­ echo "<td>$la_codif</td>". Snum~naaje. } $n~en8aje). { .parte) { $qué-parte = '1'. $que-PArte • false) r if(!$estr) ( $estr _ imap_fetchatructure($buzon.dj·>·.~'$el_8ubject'> value~'$txt'> narne=wmLnum_adjs v81uea'".lue.ctura. Stipo.

Se1ems·imap~e_header_decodel$str). "0'l'BBR"): ifl$estr->subtype) ( return $primary.. $mesee[9] • 'Oct' . $me"8[3] • • 'Jul' .8['1) 'Nov' . $array_feeha=localtime(Se1_t!mestamp. ) ) ) return false..Si++) Satr_ok.. "IMACE" . "MULTIPART". $sub_estruet) • 8achl$estr->parte) i f ($que.J!lime_type[(intl $estr->type] • '" >subtype. ) function parsea_iso_8859{$strl ( Satr_ok. return • $str_ok" ¡ ) ( $mesea(O] • 'Abr' ... • $meses{4] 'May' .:'{$e1ema!$iJ->text}". for($i=O. ) function dime_tipo_mime(&$eatr) { $pritnary.. $anyo%1900 + $array_fechat'~ear'li • • 'Ene' : $meses[1] • 'Feb' ¡ $meses[2J • 'Mar . { whi1e Ilist ($indiee. $mesEls[6] 'Ago' : $meses[8] • 'Sep' . 1).. ) '* { $data = dame-PQrcion($buzon.parte 1 ( $prefijo = $que-P4rte . $meses[S] • 'JUn'.. $tipo~. $n~ensaje. Sme..478 PHP5ATRAVÉSDEEJEMPLOS } ) ifl$estr->type == 1J mu1tipart -. Sprefijo _ ($indice + 1) II if($dataJ ( return $data.min· 1 » "¡ . $fecha~'{Sarray_fecha['~y'll/{$meses[$array_fecha['~'Jl}/$a nyo ({Sarray_fecha( • tnLbour' ] ) : ($array_feeha [ 'tm.e_type "APPLICATION" • = arrayl "TEXT'. ) _ S•• tr- return "TEXT/PLAIN".Si<countl$e1ema). "AUDIO'. . '. '... "MESSAGE". $meses[lO] $meses[ll] • 'Die' .Jllinl. . "VIDEO'.

.CI RA· MA CAPfwLO D: P.urn $fecha.· Wf. break.que..).'lS descargas de ficheros adjuntos ocurren desde la pantalla de revisión de mensajes.JEMPLODI:: AI'UCAClÓr-..6 DESCARGAS DE FICHEROS ADJlJNTOS J.. La carpeta está indicada "implícitamente" en la variable de sesión wr·CBUZQN-ACTUAL. func~ioD daMe_kas ¡$tamanyo) ( ound ¡$tamanyo J return ) 10241 7' 13. Usamos la funci6n imap_fetchbody () para extraer seleclivamente panes de un mensaje y. La llamada n este ~'Cripl siempre tendrá la fomm: I~bajar fichero?~que~sg=x&~que-parte=Y Donde se indica cuál de los ficheros adjuntos (v) hay que extraer del mensaje x..parte+ 1) ) . si queremos sacar el adjunto número "D".RMA/I.queJUS9. $wm. qllored prilltable. break. case 3. case 4: . donde éstos aparecen al pie. Además. habrá que incrementar en uno el parámelrO que indica el adjunto a extraer: I$datos imap fetchbody ($buzon. puesto que los ficheros adjuntos <¡e almacenan en la carpela con una determinada codificaci6n (base64.imap_base64($datos). lIme devuelve un quoted-printable break. (Swnt. dado que el primer "adjunto" del mensaje es el cuerpo de él.. etc. hay que averiguar con cuál de ellas lo está para efecruarle su correspondiente descodificaci6n antes de transferir el contenido al cliente: switch($subestr->encoding) ( case 1/I$datos = imap_8bit($datos). case 2$datos = imap_Bbit(imap_qprint($datosl). 4711 ret. $datos ..

..php?wr!Lque_PlS9:11U:wt!I..w:ript es: <? session_start(l.comlsupoortlkblanicJesl0279/6/67. '0281 / 1i 19. 11 uso 'parameters' en lugar de 'dparameters' porque la tune! on a t tach Ilque uso no asigna el filenarne: l . lf (lsession_is_registered{WM» header{"Location: index.com'suOOOrt/kblan¡cle:.ASP .Lype: appl!ccI Lion/oc teL ~Ii tream.5 de Internet Explorer no realiza adecuadamenle las descargas de los ficheros adjuntos. que.~adel (' Conten L.. $~que~glJ Ssubestr=Sestructura->parts[$~que-P8rtel." • ej de llamada: saCB_attach.ASr b!lp ~ :supoon. default: ) Por último. Y si name'" I (que esta en parametersl if (is_array($subestr->parametersl) ". Microsoft recomienda aplicar los parches correspondienles en: bllp://supoon.djunto II nombre del fichero ~ La versión 5.php").php·). se envían al navegador las cabeceras apropiadas del protocolo H1TP": header("Content-Disposition: attachment¡ filename=\"$no~fich_adj\~").micfQSOft. ~ imap_qprint($datos).480 PIIP ~ A TRAVe. para provocar que el navegador guarde el fichero adjunto en lugar de intentar visualizarlo. name=\'$nornLfich_adj\·'): El list:ldo completo de este . .. ]-1I. DE EJEMPLOS $datos break.parte-3 lnclude("wm_lib_imap. $bu%on=dame_canal(·$WM_BUZON-ACTUAL")¡ "' $eatructura=imap_fetchstrucCure($buzon.microsoft.

case 4! $datos = imap_qprint{$datosl. break. $mime=$tipo~ime. EJEMPLO OB APUCACIO!'ll WI:. imap_close($buzon}. $~que.C RA· MA CAPtruLO 13. / / OJO!.~g. break. else $tipo_mime:"text". strtolower($subestr~>subtypel. case 3: $datos ~ imap_base64($datos). hay que sumar 1 a la parte que S8 quiera wtn_que-parte+l $datos 2 imap_fetchbody($buzon. header("Content-Disposition: attachment¡ filename~\·$no~fic~adj\··)¡ header{"Content-type: application/octet8tream¡name=\"$no~fic~adj\").~/·. ($~_que-parte+ll)i 8witch($subestr->encodingl ( case 1: II$datos : imap_8bit($datos)¡ 11 me devuelve un quoted-printable break: case 2: $datos = imap_8bit(imap_qprinl ($datoaIIJ break. default: ) echo Sdatos.'8MAfL 481 $nom_fich_adj=$aubestr->parameter8(Ol~>value~ else $nomLfich_adj~'SINTlTULO~. ?> . if ($subestr->typel $tipo-mime:$lib_tipos[$subestr->type].

-WO'&tiIIdiW) -w I ~ I E.::l.. además.. . se usará el mismo script para todas estas acciones.. ..xt¡m ln "... 1 . ...r.REEN~ Todas las acciones que suponen la redacción de un mensaje...." . comparten la misma pantalla: por lo tanto. 1 1 E~_ ú. necesitará un parámetro o variable que le indique qué . PllP 5 A TRAVts DI! EJEMPLOS O RA-MA 13. ·1 Por otra parte... fI*doo \liii01 .~ I~ ""_"'_""""".. la operación de responder necesita extraer el texto del mensaje a responder. t!odo ..-. . RESPONDER.7 COMPOSICIÓN DE MENSAJES: ENVIAR.. . prefijar el campo "Asunto" rSllbjeclJ con la cadena Re:)... puesto que cada una de ellas liene sus propias peculiaridades que se manifiestan en un comportamiento diferente (por ejemplo.. 1 1 E. incorporarlo al mensaje a enviar y.. este scripr necesitará saber cuál es la acción a realizar. respol/der o rUllviar..aml/W I I I -1 .. _lB>'OlbOfIW~ I r o:.. " ._"" 1. .... el/\'iar.. -1 . Otp .. 1 ".... esto es..1 ..".. WebMail ~ o " "'E~~W ..482....... insertarle el carácter ">" al principio de cada Unea..

"lmag:..acript :raanvia(l}"..\IAlI -IH. •• !'"'Q_ul".wm_componer_oper. responder a todos los destinatarios que aparecen en el mensaje. -Reapondar Todoa".giP y ahora lo que necesitamos es consuuir la función JavaScript ceenvia () par.~s/msg_forward. "images/checkmail.gif') . ar ray {'wtlLselecs .php·.value_acclon¡ document.componer_oper y los valores que puede lomar son: o o a a O: 1: 2: 3: redactar un mensaje nuevo. -R.apendar-. arrayl"jav••cript:raanvia(3)". "Red4ctac" .php· enctype~"multipart/form-data'> ¡ .RAMA CAPITULO 13: EJE. Esta variable es Wl1L.submit().::¡llC·.l que llame al script Wlll_componer.gif"). responder a un mensaje. array("jav.\1f'LO DE AI'UCACtÓr-.ver_cabs. php·. array ('WflLcomponer . 'lmages/msg_new. "images/msg_reply. acray{"javaacript:raanvia(l)". php con el parámetro adecuado: $el_script:' <script language='javascript'> function reenvia(accion) ( document.php· • E: im:o. les asociamos los valores correspondientes en la función pinta_botonera (): $botoner.gif") .php' .. "Actualizar' ..salida. y reenviar un mensaje recibido a otra dirección Dado que las llamadas a este programa se hacen de~de los botones situados al principio de cada pantalla.f_reenviar. -R••nviar".php·. method='post'>'¡ Los ficheros adjuntos que el usuario quiera enviar se suben (lIpload) al servidor gracias a las líneas: echo fona n&ne= "W!lLfoCllLred4ctar" method= 'post· a~ticna"~enviar.gif").glf· array (·WIll. 'images/ms9_ceply. "imagesJms~del~te. Oi f") . 'array ( array ('wm.f_reenviar. reenviar o responder.· I'IW. </script> echo "<fona n8me~f_reenviar action='~componer.1 operación realizar: componer un mensaje nuevo.

acript •• function . 1 (remitente).php __ in lo 1!'sg al rellenar los botones de redactar r •• ponder.. Como observamos de la figura anterior.php para responder o reenviar.484 I'IIPSATRAVÉSOEEJEMPLOS Cl KA· MA echo '<lnpuc type . cómo se codifican los dalos del fonnulario al ser enviados al servidor y.TJ>JoLFICH.2») ~ 111 ser llamado desde ~ineo.MAX..nvia() . una característica ¡¡nadida es que los mensajes enviados.8cript_' <8cript lanquaqe='javascript'> var WMJW<. vi.r_oper • (1. WIlLtexto.saio~start(! . s. por una parte. 2 (a " todoa) • ~que~g: numero de mensaje (solo necesario cuando ~compon... que PHP usa para poner un Umite (el valor WM~TAM_FICfCADJUNTO) de tamai'io máximo de fichero al ser subido a1 servidor.mBg. una variable oculta de nombre WM...ADJUNTO':>' En las que se indica.. etc " " __ cabeceras . ~concopia...NUM_FICH...."MlJl... este ~ la envio. 'hidden' name·'MAX_FrL~SIZE' v .. por defecto... por otra.. regisceredCWM!) header('Locatlon: index. todos • • Ll4tMdo desde etc Rutina~ que necesit.FILE_SIZE. if (Iseaaion_h..a • Wtfuiaroe_cAnal (1 " • parametros que nacepit.JNTo •• "' $el..MAX. responder . no se copian a la carpeta Enviados: se ha de indicar expresamente esta acción. responder. • $el ..a: ~comDOner_oper: O/yacio (redaccar).. hiddens los datos de wm-para. El código completo de este programa es: <.. lu~' $WM."l\llJUNT'OS=$WK~FICH.php~)1 'o • • UsadQ paral redAc1ar..

value: ) function limpia_campas_foral) I with (document..v&lueJ (l=l.··..submit!1 ) el se ( alert(\'Debe rellenar el ) ) c~o "Para"\') function cancela!) var str..~adj·+i+·.f.value. switch case o: ($~componer_operl $msg_cab~·Redactar [ Mensaje'.i<=WK_~FI~ADJUNTOS¡i.~texto.php·' document_location=str¡ ) function incluye_texto!) ( with (document_~fo~redactar) ~texto.value. $~qu.wmLadj_oculto·+1+·.O RA-MA CAPf'n¡LO 13: BJEMPLO DE APLICACIÓN: WEBMAlL 485 if ( for {document.value=·"¡ ~texto.value=··.valuem··.J)l1Xa. case 1: $ms9_cab="Responder Mensaje NI $~BUZON~TUAL'.~fo~redactar. if l~adj4) ~adj. ) document.+J { vl~·document_~fo~redact&r.~fo~redactar."·: iE (wm_adj5) wmLadj5. de BUZÓD break.value="·1 if I~adjll ~adjl...~ra.~g break.. str "' ·wm.valuem"·1 if C~adj2) ~adj2.~fo~redactar. value="' ¡ ~concopia.ver_cabs. if (wm_adj3) wm_adj3.value. ~fo~redactar. .value· v2=·document.value +3 ~texto_e8condido.~fo~redactar) ( WUl. wmLasunto. ) ) Eunction limpia_campa_texto!) { do~t .··. •• ) </acript>' : lncludeC·..value=""¡ iE (wtlLcsdj6¡ WtrLadj6../wm..php·) .cabeceras.valu .value· v3:<v2+""'"+vl eval (v3).. ~concopi~ciega. .value=··.

0S ORA.. $~asunto·¡ $WDLbot~incluir_texto~'·: . J Swm_a8unto. [5]_' • .!:lue=\· Incluir Originl. Scac . oper .. OIllP~:ler.. $botonera[2¡.~texto. I SdI. $wm.. $col"fil4S [O]."bQ:color"'*FFFBAD" : Scol.. S~texto· ereg_replace("<br />".P4 ca a$WIlLde : S~concopia~"'.'·.eoq>oner_oper ..texto) Swm_48untom"FW: $WlD... "."Re: S~asunto'. &.O. break' $msg~~4ba·Componer· $botonera·array() $botonera[Oj."l"..texto)..! i..·$~de $wm-para'.."\n". texto • ereg_replace (' Scar" .P4ra...\'incluye_texto()\"". ereg_replace (' Scar".incluir.."1".gt I " $wm.. Sboton_incluir_texto ='<input type~\'button\' onclick.." O) { elaeit C$wm...}. f (SWIIL ~OftI)Oner oper .."·] : /1 Actualizar 11 /1 $botonera[4¡~"': 11 $botonera... l: d~·4Ult $-.MA case ~ ~_ca~~Responder a Todos Mensaje N' N~ $~que~ g de ~zón $~BUZON-ACTUAL" bcetlk: ca'. 1/ $botonera[6J..CTUAL· . $wrn. $ind. '" 1 U ($WIlL.. .·· . ( alse ( $wmLPara..486 PHP~ATRAVÉSDEEJEMP1.. 1/ 1I Redactar Responder Responder Todos Reenviar Eliminar Logout p!ntá_botonera(Sbotonera)... Sbotcn. Scar..l as (1]_ "bgcolor=*FFFFFF" .~g de Buzón $W!oLBUZON.' vl.-l".g_ca~~Reenviar Mensaje $wm que..COllPOneC3lper ::: 1 { SW'1n. '&gt...col filas. $WlTLtexto). texto.. $wm.!:l \ ">&nbap" . '.."·/ $botonera[3J. $~~Onc)pi4_Cleo4. ". $botonera[l).

$quB. . ( Stotal_adjs~count($estructura->partBI. Ssubesrr=Sestructura->parts[Spos" (is~rray(Ssubestr->dparametera) dal ¡charo $nDaLfich_adj ) alee Ssubestr->dpar~etar810 ~value.par4.. imap_fetchstructure ($df. 487 Swm. J pinta.Slib_tipos[Ssubestr >type1 e1ae $tipo~ime=-textO.ime. sOl ( J. $que_buzon. .. if ($eatructura->parts) ( 1f (is_array(Sestructura->parts» for if adjunto ($po8~1.plantl'la_redactar $wm. °k'): J J ) return Sinfo_adjs... 11 fin de dame_fichs_adjs() function dame_fulano{$array_obj. $WlfLasunto.. Scuantos) ( Satr a ·" .. Spos<$total_adja .:opi _ciega.nclude_ooce (O .obj!Ol >host..Sarray. on. $que_maQ")..'" "1") ( ir t$array_obj[O]->mailbox) { Sstr"'$array_obj{O ->mailbox. oncop aso. Rutinas function dame_fichs_adjs($que_usr. $mime"Stipo-ft. . _buzon./wm_lib_imap .. 'o ~ o. strtolower ($subeatr->8ubt. roundt$suDestr >bytes/1024) . Spos+.f ich_adj="SINTI'lVLO".¡pe) . $wm_texto.$i+tl ( . Sinfo_adjs!Spos] • arraY("$ncm_lich_adj'.. if ($cuantos . SWIIL ~on~opl •• $WIIl.botan inclu r ex 01. SnOlll.php·) : Sdf_bu:zon • dame_canal ($qua_buzonlr $eatructure.ORA-MA CAPtruLO 13: I:JEMPLO OC APLICACIÓN: lI'E8MMI. i f (Ssubestr->type) $tipo~me. "/'. el se tor ( ($i~O....Si<count($array_obj). imap_close ($dfJ>uzon) .¡ ( ( n~.."g"...

cc. global $WH.• </textarea> _______________-" .60 n4me value. Swm_n~adjB. echo 'ctr bgcolors"FFFBAD' <td>CC:</td> ctd><input type.$un_asunto..'text' size=60 n4me. $Uh. ' SWMJ'iAX.'hidden' name-'HAX_FILE_SIZE valua .'wm-enviar. $~componer_oper.texto .MAX_NUM]ICI-LADJtMI'OS. $WM_HUZON~CTUAL.."PFF8AD'~ <td>Texto:<!td> <td><textaraa cola_60 rowa-1D nam.l'1AX.. .. t'AJoLFICH .-'· Sarray Jbj ._text..·' >~/td> </tr> <tr bgcolor='iFFFBAD' valign .. <td><input type. ' .. $un.FtCH.· '></td> </te> 'we~asunto' <tr bgcolor..Pcc..' wm.488 PBP S A TRAVts DE F.. Sun . i rltturn ltl'im(Sstr) ) function pinta-pLantilla_redact4l..' text valuea ' ". 'top'> <td>Asunto:</td> <td><lnput type"'text' size..ADJUNTO' > <center> <t.AOJUNTQ. $un_asunto. $WM. concopia <tr bgcolor.o $b..php' enctypes'multlpart/form-data'> <input type.'p08C' 4ction.. ($un. -:"AH.ir ."FFFBAD' valiqn= tOp'..'~concopia_ciega' value .S~to. $ul\.d. "· J Suna_dir.."FFFBAD' Yalign'" top'~ <cd>Para :</td> <td><input type.. O CELLPADDING=l CI!:LLSPACINQ_l> <tr bgcolor.60 name_' WII\... to.$un_cc.$u~cc..·tex! siza=S8 name. SWM_QU8_msg¡ echo '~form narne~'wm_form_redactar' methQd..··.Sarray_obj Si ->mailbox.~ar4 value""".e..able BORDER .texto· > •...·· > </td> </tr> <td>BCC:~/td> Yalign~'top'> size. incluir_texto) ..·'> <Jtd> <Jtr>" ..~· Satr ) ".JEMPLOS e RA·MA Suna.$i] >ho8t: =' Sun4_dir'.

nput type=' hidden' natlle= 'Id!\.Cancelar onclirk·'~4nce14(1 '> < td></tr>". I que 'S9.campo textol)e texto'~ "nbsp¡ <input type="button' onclick. e lecked> <u~{$adjs{$iJ lO} }</u> ({Sadjs(Sil t l ) ) </td> </tr>" : ) els8 $resto_adj8=SWM~NUM_FICH~Sj for (Si-l: Si<z$resto_adjs.O RA MA CAPITuLO l~: EJEMPLO DE APL. <input type='button' value_ envIal &nbsp. 489 <l. echo "$b_ineluir_texto'.. or ick_'envial)'> <input type='ootton' value.+) I echo'<tr bgcolor='tPFFBAD'> <td~Adjunt4r. echo '<tr bgcolora"PFFBAD'><td colspan~2~ <!ont Iace:'arial narrow' size.-l~ (<input type= .left . for ($i_1.. all¡n.'~copi4r_envi4dos' Copiar en 'Enviados') &nbsp. echo '<input value~'borr4 type~'button' onclick=" impia. checkbox' value-'SI' name. Si++) / eeho'<tr bgcolor='fPFPBAO'> <td>Adjuntar:</td> <td> <input type='checkbox' namea' wmLadj_ck$i."~ </td~ <Irr~ <tr bgcolo~ 4FFFBAO'> <td colspan=2 align-'center "nbsp.dido va ue. textc _es-')t!.ICACIÓN lI'EIJMAIl.'~ad1S1 value.furm()' value-'oorJ:ar todo· '" </td> </tr~'.'~ adjl > . <input type:'file name." limpia_cftmpos..e $un_texto. Si. $i<:S~~adjs.«td> <td.

·~4djSl·. SCnombre U_tipo . t4manyo • • (LFILESI $ficbj [ 'aize' J 1 • . Los ficheros adjunlos que se suben al servidor para ser enviados se recuperan grocias al array LFILES de PHP. esto es. aloja a otro array asociativo con las claves name. respectivamente. tiene un nombre temporol aleatorio: por lo tanto.able. .'..'~4d 1 > <itr. Este array es bidimensional.. Resaltamos que el fichero que se ha Silbido al servidor. de fonna que en la primera columna se encuenU'a el nombre del fichero y ésta. a su vez. php para que haga efectiva la entrega del mensaje redactado al MTA (Mail Trllllsfer Agen!) y que éste lo retransmita al destinatario. se genera el siguienlc bucle que trutará cada uno de los ficheros adjuntos: fQr I$i=l: ( Sfich.) if (ia_upload~file($_FILES[Sfichl[·tmp_~')I) • • (S_FILES[Sfich) [ 'nama' Il • . el nombre del fichero temporal donde está guardado y el tamaño.ar!) 13. ) .. tmp. Para evitar este efecto no deseado..o. desde donde se llama al script WlTLenvil!lr. físicamente. adjuntamos este último y. por supuesto. php desde donde se pulsa el botón de enviar mensaje. $f_n~tmp • " ($_FILES{$fich] ['tmp_name'j)') $f. < I form> : f ":1 de Plnt4"'plannl14_redAct.8 ENVIAR MENSAJES Es desde la página generada por WlTLcomponer. creamos un enlace duro (hard lil/k) del fichero temporol (en Unix no ocupa disco). ) </t. Por esta razón. borramos estoS ficheros en el servidor: .490 I'IIP 5 A TRAm DE EJEMPLOS CRA·MA <input ) t~'hidden' </te. ' {LFILES [Sfichj (' type' J )' . r-ho ..!> name= ~4dJ_ocu tosl' v41ue. el tipo. type. si se adjunta sin más. que conlienen el nombre del fichero.Jlame y size. el nombre que tomará será el creado de forma ocasional. $i<~SWM_~NUM_FICH~S ¡ $i*..

. WEBMML 491 Sf_temp.umtnlD ¡. lo más importante...O RA-MA CAPiTULO 1): ElEMPl. para el siguiente mensaje: MI@!!5§MMiI.!.J~ruCTAM. Sf_temp}. envleJ I CI!Inc. qué ficheros adjuntos han sido enviados y cuáles no por exceder el tamaño máximo permitido (definido en WM.ICA..PI. $msg->fattach{$f_temp. Dac...! ~ ~1I\Or -1 -1 _1 -El====~"-~-~ .itjla'''fi' . Ir Ere/endoo I. t . por ejemplo. t- .. xSI_nombre-. ~oqr.r.CIÓr'...... '/tmp/'.. Modo! ~ http1L~~ WebMal1 l ¡~l .ll!i Exammar .@oo~~~=="~---------------------IJ I J\I. t ' ) \ bOrflllexto I I bO"flrtodo (r CqlIIr W\ 'ErMadof) '4I'áf F\formlllo dor.:va f'5\formll\!.Q DE A. $el_tipo): unlink($f_temp).. unlink($f-pom_tmp): Para finalizar... ~ ~~~.$f-pombre. se muestra una pantalla de resumen donde se indica a quién se ha enviado el mensaje.. I.e eftVio 111 totwatO • WlU IIn Qoa I'cioe' . el asunto y. Así.FICH_ADJUNTO). // fichero real 11nk($f_no~tmp..I1~ lcbo!tO..!¡¡'¡.i!!fflHI¡¡a¡¡.I:MlnlenIElQi.

. una vez terminado de componer el mensaje.phpbuilder. Su uso es muy simple: tras la creación de un ejemplar de objeto MIME_IMi1 : Smag • new MlME_mail($el_from. I . ••••• _ .. ¡. se envía con el método: I$mag->sen~mail()...'" 1_n.du Para el envío de mensajes hemos usado una clase escrita por Kartic Krishnamun.upm.1rI AOJUnIos NO EfI\I~dos por Excedor 01 Umlte • (1) IIIr"*o.. .4SuntO· • ·Swm_texto· .ul.4\12 f'IIP!5 A TRAVés DE EJEMPLOS Cl RA·MA Se generaría la siguiente pantaHa: . ~"n __ .lo.php3 ...... .. .eoneopia\ nBcc: SwmLconeopia_ciega"). .._ . . . Se le pueden adjuntar cuantos ficheros queramos con el método: Y. ..' .• Web """'-FI~h. hupJI\1twv..nevcolwnnslkanic20000807. $wm-Para • • Swtr\.In. • 121 forrr. I_ .-.fO' l' EJJAdo Menu" • .. . ~..hy~ que implementa el envfo de mensajes que incorporan ficheros adjuntos. ·Ce: $wtr\..

include ".. ·Enviados')./~ime. dame_canal('Enviados')¡ $no~fich-bu~_enviado8&dame_fichero_buzon($WM_USR. ima~_close($buz_enviados). inelude¡". if Ilsessio~is_registered(WM)) header' "Loeation: index.·\fML 49~ Hay que examinar si el usuario.class·. " FrQm: $e1_from\n" 'TO: $~a\n" 'Ce: $~eoneopia\n· 'Sce: $~eoneopia_eiega\n' 'Subj~ct. /1 para volver automáticamente: 11 $scripta"<META HTTP-EQUIV=\"Refresh\" CONTENT-\"lO¡ URL~~ver_cabs.C RA·MA CAPiTULO ll: EJEMPLO DI' API./wm_cabeceras. if (! illlap_append ($buz_enviados.·. ) El texto completo del script WDLenviar.php·).dos "'''' 'SI') { $buz_enviados • ~cana1('Enviado5")1 $no~fic::h-bu~_enviados=dame_fiehero_bu%OD'$~USR. en la pantalla anterior. inelude •. /\oIII'I_lib_imap.php"). 'Enviados').". echo "¡Copiado el mensaje en la carpeta 'Enviados')<br>". hacemos uso de la función imap_ append (): I~f ($~c::opiar_envi". ha marcado la opción de copiar el mensaje a enviar en la carpeta de Enviados. "From: $el_frolll\n" 'To: $WI1LPBra\n" "Ce: $~concopia\n" "Bcc: $~eoncopia_eiega'n" "SUbject: $~asunto\n\n" • $WllLtexto\n \n' "\n" .-texto\n\n" • \n" )) diel···· ERROR al anadir a Enviados: '. ·\t$~SRV_lKAP}$nom_fieh_buz_enviado. php es: <1 session_start(). $~asunto\n\n· "SloIlD. ·\($WMLSRV_IMAP)$n~fich~buz_eoviado. if I !imap_appendl$buz_enviados. En su caso.lCACIÓS· WEB. 'SI") $buz_enviado8.php\·>·.php·: if ($wm_coplar_enviados { ~.imap_last_error()).

S_FILE::: Sfioh} • t:r!pJ14!"'8 .OJUNTO) I /1 aqui no llega porque no se enVla nada sobre e' • 'her) vor~ $msg . i f (prel1. • J. <li:> (Si) <b:>$f_nombre< lb>" . <\5>' SWM JSR. • SwrlLtexto'.emayor de <u. no hago la copia/enlace tome el nombre del fichero t::fr'\poral de php . if 'tlf¡). ...'iI_adj <b>S~ara</b><br> Smsg adjunto•• ··: .from.". el Be Sel_tipo Sf_tipo. for (Si{ I $i<w$~~FICH_~S ~i+~ $i eh.manyo .•.¡.ea nue. type Sel _tipo • 'OCTET'.\1rLOS ORA·MA dl«!1 (.. Sf_cipo}) 1I obtenl1o el content. print 'S{i_arialJ<br>Enviado Mensaje a Asunto: <b>S~aBunto</b><br>·¡ $~. $WM--. Sdlr_usulIrio). $1IIB'iI . new MlME.".~A)CTAM..FICHJ.'arial narraw'>". SCteasp). .._. .RRQlI: al atladir a Enviadc s: • iwlp_ ast ma~ -r)r 1) ) e ~.Sf_nombre. $dominl0! noden&'ll8' $el fr)lll _ sprlntf( \. 11 fichero rea Unk{$f MDLtmp.' • pu~o )currir que e~ fichero ya ex ~ta y lUe ad 4 no .¡i"..LESISfich} ~ize ': ic_upJ ~adad_hle(LFILES[Shchll l} .tro .adjSi·. • SWllL4SuntO·.e ha envi"do por .'"' NO .no_env ados~". 'Cc: $~concopia\nBcc: $wm ~on 'OPl _ciega') $i_arial.e ~ba%_enviados/¡ echj l 'Icopi~ e zeneaje en la carpeta 'Fnviadoa )<br • $do/DJ . name • "(LFlLES[$fich}['nAme Pi t~po • '{$_FILES!$!ich) 'type' ": Sf J1OI!L t IP • '...S~T~ICH_ADJUNTO</u. un4flle e) ¡ $di JlIlJario-"$M(. • SE tamanyo • • S_F. $~ara .o.JlIal ($e1 . SE_temp.'<font face. .. '/~J'. $f $f lI~re echo ".'ti O _ p 1x. USRi'.494 PIU' 5 A TRAVts DE BJE.."Wft\.match('!/x\-.: $f_t~anyo bytee</h3'"'" l if ($Cta.eh3>'·· AV so: el fichero <u>Sf_nombre' J.adjuntos ..

POs + 1. strIen ($Wl. action~·~ver_cab8.o' J: i f ¡$nOZl\.nl "lk I$f _nOIlLtmp).enviados c/u ">'. $i++ I $poa "" strpos($W\. 'SCnombre". str) 1 : " .no_enviados) eche.pos " $pos. peine <form method='get" </foon>' .. ' \. EJf. $ult. "Ficheros Adjuntos NO Enviado$ por Exceder el Lú:: te: I cul> Smso_adj_no .st-r..MPLO DE APUCACIÓ~_ \n:BMAlL 41)~ • solución: crear un directorio baj usuario y alH ~ con el nombre del • crear el enlace • ..ocultoJ I $ma~_adj_no_enviado5 ..str.~·~li~($l) eh>' \ \ .. -------. unl nkl$f _te:ap) ¡ J. . ) e18e I $fich_oculto~·\Sno~oculto=\S~ad ocuJ.'.1es· /' ..-oC'ult.-----...s9->fat:tachtSCterop.. RA-MA CAPiTULO 13.tipc): $:o. '<lb>': ) $m80'>gen~il(): if ($msq_adjuntos) I echo "<hr>Fichero9 Adjuntos Enviados: cubo $1D8~Ladjuntos </ul>. if ($pos 1_ false} $ult.W'baB~mame{$nOlI'Loculto).--. rat :rn aubstr ($un ..to$ aval j "$fich.: ) i C$mao_odj ..php· <input type=Bubmit value="Volver a LiSta Kena4. Si}. Sel. Rutinas '/ tunction wbdsename($un_strl I for{SiaO¡ $i < atrlen($un_str)..

si la carpeta actual es Papelera y la operación que se quiere realizar es la de borrar./wm_cabeceras. entonces los mensajes se borran de rorma definiúva.··. Hay que tener en cuenta que la runción imap_delete () no borra físicamente los mensajes. pero. $bo~onera.php. • . sino que los deja marcados para ser borrados. se comprueba que ambas carpetas (origen y destino) no sean la misma (aspecto que se garantiza en WJTLver_cabs). a Operación Mover: Si hay que mover mensajes de una carpeta a otra.msgs. /1 Actualizar $botonera[l¡. // Eliminar $botonera[6¡_")". Parametro8: wm-buzon_destino (si es mover) • ~98: que tiene una lista de numeroa de menaajes ~operacion (Mover/Eliminar). 1/ Responder $botonera(3J.. $botonera(O¡. a Operación Borrar: Si la carpeta aema] es Entrada O Enviados..array{) . " • • llamAdo de./ lnclude(o.. 11 Reenviar $botoneraIS]_'o.php") ¡ pint __ cabecera_html(O$~operacion maga seleccionados'. Se borrarán físicamente de la carpela siempre que a imap_delete () le pasemos como parámetro CL_EXPUNGE o llamemos a la función imap_expunge ( ) .··..\1f'LOS O RA-MA 13. 1/ Responder Todos $botoneraI4J.e..4% PUP ~ A TRA va DE EJE.aio~8_registered(WH») headerC-Location: index.selecs_php) que ejecuta las operaciones de mover o borrar mensajes es: Besaion_atart() : if (!.o" 1/ Redactar $botonera(2J. El código completo del scripl (wm. ").9 BORRAR O MOVER MENSAJES Este script recibe la variable wtn_operacion donde se indica la operación a realizar con la lista de mensajes que hay contenida en wm.··. 1/ Logout . /.php"l. los mensajes se mueven ala carpeta Papelera.o.de ~ver_cab8.

S!ich.(Sbuzon.php').. } } alaa ( echo '<h2>Movidos desde S~BUZON-ACTUAL a $wm-puzon_deatino": $buzon=dame_canal('$WM_BUZON-ACTUAL") ¡ Sfich_destinocdame_ficbero-puzon(S~USR.ra'.aS de un menaaJe I } diel···· ERROR. /1 otra comprobacion es que los numeras de mensaje pasados sean reales 11 habria que hacer una conexion previa y ver cuantoa mags hay en el buzon if ( include(·. NINGON mensaje para procesar '1: aortl$wm lista nuroLmensajes. ~m. $buzon"dMle_canal¡"SW)CBUZON_ACTUAL') $flch-Papelera:darne_flchero_buzonIS~USR.JIISga): 1/ coq:¡robar que origen y destino no ea el miamo if ($~operacion ~= 'Mover' ~.map_fMilJllove ($buzon. I ) echo '<h2>Hovido l s 11 Papelera '.liBta_nUllt.cloae($buzonl...I"ERROR: al borrar: '..= "Papelera') echo '<h2>80rrado(s) de Papel. SWM_BUZON_A~AL •• $~buzon_deBtinol die •••• B:RROR: NO se puede mover un menea'. $lista .. imap_lllat_arrorll I lmap_expunge (Sbuzonl . SORT~RIC)i $liatA-victimas=implode{·.Slista_víctimas.·.. Slist«-victimasl 1I di.JhMl'l. 1 dial "ERROR: al mover a la papelera: '... $buzon E d4De_canal('SWMLBUZON_ACTUAL O ) ..O DI~ "1'1 K' ACI Ó:-O IIII1M1I1 ·" ' 7 pint __botoneral$botonera): $wm. echo' el / loa ?> mensa~e'B: S~sgs</h2>': ../~lib_imap. dent-r":l del milUllO buzón') ¡ } I 11 comprobar que al lIIertOS hay if (etrlen ($wm_msgsl ==0) JII.st. imap_expunqe(Sbuzon)¡ i~p.$!leh-papelera) 'Papelera'). 'Swrn_buzon_destino'): i.destino) . imap_cloae($buzonl ¡ ea..errorl).~ Cl ItA -MA CAPITuLO 13: E.l!lensajes a explade l'.ap_m.S~lista_n~ensaje8).. im. i1nap_close ($bu20n) .·. imap_expunge (Sbuzon) .ap_delet.ai~move($buzon. imap_ll!. I$~operacion m~ 'Eliminar') if ( ¡$~BUZON-ACTUAL.victimas. $WDI.

. .oe4r 1I'l!W!!1'2 • ll. .AP ÉNDICE A EJEMPLO DE USO DE FUNCIONES DE FICHEROS: AGENDA Como ejemplo de aplicación de las funciones relacionadas con los ficheros.. ... .'i.... . • . . La entrada a la aplicación está centralizada en una página HTM L (a!il_opers . .. . . . • H+w""'lt • '-*... Age nda • J. borrar y listar todas las entruda. . alguien cambia su dirección de correo). " . html ) que nos muestra el acceso a las operaciones comentadas anteriormente: __o . vamos a implementar una pequeña agenda electrónica que almacenará dalas tales como el nombre. la dirección de correo y los números de teléfono fijo y móvil.. modificar dalas cltistentes (por ejemplo. ~ ~_ .. Con esta agenda \eremos capaces de aiiadir nuevos contactos. ... bu'tCar..c--b • IogI4f1'MOt .. .

estos listados se generarán en las siguientes ocasiones: al pedir un listado completo de la agenda. modificaríamos convenientemente este array. cuando necesitemos seleccionar un registro para modilicarlo o borrarlo y.500 P1IP S A TRAVI!s DE f:JEMPLQS C RA-MA A. Dado que la aplicación es muy sencilla y las operaciones están bien delimitadas.l DISEÑO DE LA APLICACIÓN La implementación de la agenda se bará usando un fichero de texto donde iremos almacenando las entradas a la agenda. correo-e. el carácter que usaremos como separador de campo (SEP_CAMPO) y el carácter que usaremos como separador de registro (SEP_REG) que va a ser un cambio de línea. cada línea del fichero será un registro. Veamos tres ejemplos: . definimos un arra)' con todos ellos ($datos). radio o casilla de verilicación) y el texto que aparecerá en el botón Utilil. En concreto.. Los registros de la agenda los haremos coincidir con Hneas. En este fichero común se definen constantes con el nombre del fichero que nos servirá como base de datos (FICH_BO). como. También se definirá la función pinta_listado (l que será útil para sacar por pantalla un lisIado de registros. es decir. una entrada de la base de datos. teléfonos) a través de un carácter delimitador. Por tanto. el tipo de elemento que aparecerá en la primera columna de la tabla (número. por ejemplo. Para hacer la agenda lo más flexible posible. a la hora de imprimir los registros que coinciden con los datos de una búsqueda. en lo que a número de campos se refiere. cada uno de estos programas tiene que ponerse de acuerdo en una serie de dalas comunes. Sin embargo. usaremos un fichero externo que será incorporado O imporl:ldo por todos los programas y que contendrá las definiciones y rUlinas que vayan a ser usadas por todos ellos. el nombre y la ruta del fichero que hará las veces de ba. Los parámetros pasados serán las líneas que van a ser listadas.ado paro. Los valores de los elementos del array son cadenas de caracteres que los hacemos coincidir con los identificadores de los elementos del formulario. Dentro de cada registro distinguiremos los distintos campos (nombre. finalmente. ejecutar la operación. Si en algún momento hiciera falta cambiar algún elemento del formulario."e de datos. el diseño uunbién lo es: cada operJción citada será tratada de manera independiente mediante un programa específico.

.... 104 . . emplearíamos la siguiente senlencia: ..e RA ·MA APÉNDICE A: EJEMPLO DE USO DE FUNCIONES DI! ACIIEROS: AGEI\DA SO l Para generar un lisiado con checkboxes. 'r'."' 2233355569999999 abraham abc@masaUacom pl'lpeillo pep@harelc:om pepe 66TISS9g pepe365@aqul!lllSmocom 1234455 6663333 Para generar un listado con elementos de formulario radio. finalmente... Agenda: Selección de Entradas a Borrar r r r r teje cbah@IIIan!smo c:om 246· ':·. .4 8604: .. 8 "Iil 13 .. ~om 66778899 r pepe pcp!l36S@aquanun:lq. 'seleccione un regucro'l Agenda : Selección de entrada para modificar i teje ehrl@alhmwootm 246a024 ~ZQ84 r r .¡. para generar un listado simple que enumere las líneas a mostrar.. 1l1be1« .._= ". . emplearíamos la siguiente Unea: pinta l11ilado($linea. ..tQll1 2233355569999999 pepeillo pep@ham.. . emplearlamos la siguienle línea: Agoondd S"""cco6n de f .com 1234455 6663333 Y.. br-aluun abe@nuu......n.¡•• 1 .11...

.M 8642016 ~JJ:'~~ 6~ 2. _ &rray' '._dato.-o.)'lt. .vi. tlf_fijo' tpo. .L' . . break¡ ~etaultl SelemLfo~'"¡ I .on p1nt.REQ· ·'tI": dee loe I ·c~lor-l·. .lue·'$cont_lineas'> ~/td>' ~ase . .a.' v. Iit~po_el __ fQna. corr. nbsp¡.)4455 f" "'j'CQ 6"n33 66"ttB899 El li stado completo del script (a9_datoS.a·<t4> cinput type. br-eak. "Iceecec"' I defi. . . . .braltut abc@maslll.. .i<count!Sdato. lb 3...eyer.lin .. "lightblue-). d"fin.".. . '1 Ir:IUIII4~icol Scolor••_fUa. tQtll 2<i680. $i"') Spo~to. ~a .PPf'. '.C·SBP.'el~form.. ..'" 4Iot· I daUneC"SEP_CAKPO· ..':'s agel...·<th al~gn-r~9bt bgeolor-'vhite'>$cont_lin . . ~h>·.. . • I .'radiC" name. "heck~x' o 'n' " hghtblUlrt .<Stotal~ineas) ~witeh($tipo_el~form){ e ••• 'c' I 6ele~form.tadoISline<'ls. inc) que se encarga de implementar esta función junto con la defi nición de las constantes comunes indicadas an terionnente es el siguiente: $dlato.502 P"P .arrayl 'nOIll[)J..·~td> <input type_'checkbox' name_'victiMa$cQnt_llnea... "d4t. $:. ..'.tIe l·c{'lor-2". tbdO*ww> 'acD 1. break: ~ 'r'. pepd6~ tOlll 12. Sel~tona.. .. ...-arraye) tor e$J.ct 1/ l' ( I. . C $1DdLcol_Cll&s_Ol $total_lineall_countISlineae' $cCl:lt_linaall_O: eebo 'ctable"'"¡ whlle l$eont_linea. .'. podr6 tener Iradiol.li. l-Si· de! ~:wI·FICK.... r. $j.a. . . Agenda: Listado de entradas en la agenda o. p~. .. . rUI.. 'n'... w¡...·$datoe($i ·tU . . A TRA vts DE ElEM PLOS O RA·MA 'I'~'" >' '"'d.BD".aut-itl $11ne4>1 •• un 4r-ray de t891etroll $llpo_a18llLfona..d. " Itd...' v<'llue.'victb"..

l.uavo contBcto</title> ctd"'Correo~. Stlf_fijo.._ '1138\"2: edl(¡ "ctr b¡color-' Scolores_U lBsl Sioo_col_f 11a. text ..ello 0< tr.. eize_'l~'> </tr> <tro> ~ r.php' ~thodm'gat '> r.do> . <title>Agen4a: .'~q__ umal... Scorreo.ct~Jh3> <torm ection.i~ •• 'tO' ~.cinput typez't. <J..:col. t <1 tr> .."tlf~il·> .reión <Iha.2 INSERCIÓN DE NUEVOS REGISTROS Esta operación la solvcntamos con una página HTML (4Q_surtal.. name..t 113S.table border 'o'> <er> <td>Nol!Ibrel <td><input t ypa. ht"': ' <h. . .>-" ¡ $l:ontlineas'''¡ ) 1f latrlenl$leyend4 __ ubalitll _h" ''''''r> <ttr>' .php) que tomará estos datos para lli macenarlos en el correspondiente lichero: El listado siguiente generará la página HTML: ...' stnt:l.tch" . 'nombre .1 type. lnpu~ typec'cext' aize_'lO' ~'tlt_f~jo':o­ ct~input -:JtT" oo:tr:o<td>Teléfono ~vil. StlfJDovil1 . arho "cttabla>'¡ ?> A.' text . ..</cd> <cd~Stlt_f1joc/td> ctd>$tlf~viJ</td>" . $~nd.CI ItA MA API1ND ICE A: ElEMPLO DE USO DE FUNCIONES DE FICHEROS. html).:body:' <h)~Ag~: inaerción de nuevo cQnt. y con un script (49_sumal .. desde donde se introducen 105 datos de un nuevo conLaCto..'correoe aize~'2S'> oo:/tr:o<tr:octd>T. ~.. explodeIUP_('AHPO.na..fono fijo: <td>. <td. AGENDA SO. I lhtl'nombre.t"ol.. .] '>. S~i~a81$cont_11nea81)¡ ~ho "SelemLtorm'¡ ·<th~Snorabrec/th> ctd~Scorreo.

504 PIIP'I\TRI\V~OEruEMPLOS eRA·MA ca "br'" «bt bt.. ... lO o Agr:nda: btserd6n dr: nuevo contacto Nombu Correo·e pudan@e. los registros nuevos siempre se a... pasados los cOlltrofes. para prevenir que la base de dalaS se corrompa.i\aden al final del fichero (lo abrimos con la opción '·a").·ao qpel •. php ~Vol~r a la Agenda</a~ <body El resultado de visualizar esta página es el s. evitamos que el carácter usado como delimitador de campos (SEP _CAMPOS) pueda estar contenido en algún elemento del formulario (esta comprobaci6n la hacemos en la funci6n construye_reg (). La segunda verificaci6n consiste en evitar entradas duplicadas. recorremos el fichero entero paru contrastar el campo nombre inlroducido en la página HTML con todos los campos que almacenan el nombre de todos los registros (función ests_repe (). <ho .d> <l>o<1y> titla"'aumal.php<ftitle> </bead~ . Por esta raz6n.guiente: .tg!iI I~. esto es. ~~ "'-1 V21rn! lA A¡mda El programa que invoca la página anterior antes de insertar el registro hace un par de comprobaciones básicas: la primera es que. El listado completo de este script lo mostramos a continuaci6n: .h.~.rrobocom Te1KODo 5JO p3301H~ Te~(oao mó't'iI. hltlr/~ 1 ¡ . ya por último. que no haya dos entradas con el mismo nombre. Y.

exit.1 ? .-. Sn~ ~_nombre(Sun_regiatroJ '" explode(SEP_CAMPO.hlBtory.che o<h3>Registro anyadidot ) :~)</h3>.. •. en 'Svalor" . echo '<br><br><a bref.1tl Atrás</a>'.$11neaa[$ilJ I if !$ca.backl)·>~ltl. ERROR: NO •• ti penrdt:ido el caracter . ) $e~oa ~ exp1oda(SEP_CAKPO. o.. ..ro aeparo el registro en 11 sus campos y compruebo ~ DO c010c14e el ~re $linea8 c file(FICR-»D). return Bubatrl$reg. APBwICE A: [!JEMPLO DE USO DE FUNCIONES DE ACHEROS: .1ae $reg . whi1e ($i<$total_reg$J .trOI) if (eBta_repe{$el-Dombrell echo '<h2>" BRRQR el nonb~ 'Sel_nombre' ya •• ti repetido</h2>'¡ ehe ( anya6e_reg($registro) ¡ . .. .P_CAHPO • 'Svalor': ) . 'Sreq'): fc1ose($df) : function .dame_nocbre($regi.-REG: $df~fopen(YICH_aD. fputa($df." SF. $total_regs~count($lineel): $i_O.poa¡O] . funetion eata_repe!$u~n~re) 11 para todoa loo regiatr~ 4el f1ch.'" SEP.·· : foreach !$_GET oliO $va10rJ f i f (stratrl$valor.\GENDA 505 tunccion conatTUYft_reg() $reg. SU_CAMPO.. ) function anyade_req!Sreg) 'a') 01:' die(···· ERROR al abrir la 80'1.$un~egiBtro)¡ 1:'8turn $nomIOJ: ) $reqistro~conatruye~() $el_no~re : .lJ.'javascript. SEP_CAKPOJI ( echo . $reg . $\lD_no-bl:'el return tCUBl $1++: I:'eturn falae.

fOnll aet!on.e/haad:· <body> -=hl>Ag.-_.S06 PHP 5 A TRA v6 DE EJEMPLOS ~bt':.in todos los regi'i:tros que coinciden con el patrón introducido.. .·ag'. <input type-'text' "br>"b~ naae.r _ cinput .le:.> "br.'get':' Nombra.genda</ao. que llevará a cabo la operaci6n mostrando los resultados obtenidos.t..-¡fonll:' tyPe.busc.¡ y .php· IDtIthod.c¡ueda de reqiatro-. Las pesquisas las haremos sobre el campo del nombre. La página HTML primera donde inlroducimos la cadena a buscar es: < ~..·.Volver a 1" .g_oper •. ..3 BUSCAR UN REGISTRO En las especificaciones iniciales comentamos que nuestra agenda sería capaz de hacer búsquedas.'---. de manera que.gendal Búsqueda de regiatros</title> . t..·su~t' valu •• ' buaear! '> ~ bt'. . ".t.. _Aaenda: If_• B(asqu~.'a~. ~.it. dada una cadena.nda.h2> .~~r. El procedimiento que empleamos para resolver Ia. php).. php·~volvet' a la Aqenda<fa> A. Esta página invocará a un programa PHP (a9_buscar. La siguiente imagen nos muestra el resultado de visuaJizar la página anterior: . se mostrar. Mostramos una página HTML (ag_busca. htrnl) en la que se le solici ta al usuario la introducci6n del nombre a buscar.> q href"'40'_""".o¡ búsquedas es similar al utilizado en la anterior operación.ra php·:. t . ht'af. al que le pasará la cadena a buscar. . Ihí.t I!\' . (\(! "'iIstl'OI ...

~h .> •• htet"av_opets...$linea.Ac.. ) 1f I$tct_exito* > O) ( -eh Oc.eRA-MA AP~NDJCEA: EJEMPLO DE USO Dl F\Jt>:ClONES DI. . ( '-hl:.. ch'l\ . $tOt_ exito•• OI whlle ¡h4tQul_rega) { Scampoa . $tOt_exite.c'~:' regletro/. loo regi8ttO~ del fich.eho "ch4:>Cadena de búsqueda: <U>$so-bu8ca</u></h4.ra todo. 'art_enecnttadoa[$tot_exlt08I·S1inealt$~J : $tutJ!xi U'e •• . fun~ .body.d ~~~l.• .nQl!lbrel .o. .php'>Volver a 14 Aqenda<!~> Suponiendo que partimos de los siguientes registros: . l' title>< head~ h2> lQn axiatel$un.os. I'IClII_ROS. ·\GENO. . ..de ~ ·al1_ .• ·- 'l .. 1nc· \ .jateto. exisce. Si·. $arr_encontrados_atrayl) . .nd4. b.che "NO •• ha encontrado ninguna eoincid8ncie : cbr~·. exp~odelS!P~AHPO.. . plnta_:"iatadot$arr_enc-ontra(!. $1IIe_bulca $_ClET ¡ . p.' ~ll) t.J~ aepcr~ el reglatro en sua C&r'p08 co~ruebo que no coinei4a al nQlnbte $llneao-fileIFICH_BO)¡ $eotal _roga·CQunt ($llneau): $i_O.:l • 1Iul' encont~~ .nda: búsqt'ed4 de r\!QUtr-oa· 1nl" i.t$il). $catllPOf.$se_busca).r.\ 507 El programa que hace la búsqueda es: . Bu~~ ~ regi8t~o8< ... 1 ( IpregJlla. a_buoca.tchl"l$ul\Jlombre/ i".~AQ.. .(" 1..

¡.4 MODIFICACIÓN DE UN REGISTRO Esta operación es algo más compleja en términos de número de scripts imervinientcs......... OlIO que muestre los datos del usuario en un formulario pura poder ser modificados (agJT\odiCplantilla. php).... l... ~_ .- A..JllodiLselec. necesi tamos tres: uno que muestre al usuario una lista de lodos los registros para que decida cuál elegir (a9. _ . Selecci6n de registro para modifie4car</hl> . J:!.php) y el que por fin reáliza los cambios en el fichero (agJT\odi ficar.""". Éste es el primero de ellos y su resultado: -<htrlll> -<h.._ Agenda: Listado de entradas en la agenda o.. ""-1...>Iio -.t .c......lde \..:m di(-! " ... . obtendremos: ......_. ~"--tl)• • inc' ) 1 . _.. .:o 24t~~. 'elección de registro para noditicacar< <fh. .CS> <body> tltla~ <hl>Agenda._..SOS PIIP 5 A TRAVts DE EJEMPl.. _ ........?p>p ioch.... V ..laMm......." 'm1' Si buscamos por la cadena pepe.. .... php). Agenda: búsqueda de registros . I _ _ 660n] y_..OS .3"... '"..._ l .. ..... ~ . ...... • tk'8."" ~11~ 12"34-4~ l .. En total. l' f¡ 'Mm' eo ___ • \lI&oI'...-01 .d» <tltle>Agen1a.._1.. 01..tn' SH". .

Seout.l$dl): Sront++.e RA ·MA AP~ND I CE A: EJEMPLO DB USO DE FUNCIONES DE FICHEROS: AGENDA 509 'cOflt_l1ne. Agenda: Selecci6n de regislro para modificar ~ 1bAb.: modifleaei6n aa req1Bt r o</h2> <?php include("ao_dato8.fg. r . * <la! Il .." '.~ z._ U3-t-is.. ($cont<a$el~idoJ ( Sreg-fgat.o_oper •. .lll> <ba.a abe. 66üJ3) El script que entra en acción en segundo lugar y su resullado es: <ht.. I "r"). ..ntlll •. C«II ~ .cho ·<to~ .inc·) { ¡ function dame_reo_numl$elegidol $df_fopen ("teR_BD.. .....lta.ctlon~·ag~it-pl..9at pinta_U.yl S4f.t. lcIoaal $df I ratutA $rlt9~ ..J~$r~. th d..ur. . ~$reg.tadot$line.l1DeU. .J555~" r . .d> <tltla>Aganda: ~od1fie.et$dfl¡ .•• f$eon~ 11nea.-c:ho • ¡fora>' ~~I " cbr:> <a href_'. php':>Volver • la Aqendac/a. $coat·OI whU.eión de reg1stro</tltle> </naad> cbody> <hl>Agend. .· I fclo.. g Slllle•• ·. L' "on . php' . . seleccione un r~1a1 '"0 ..fQ~QtrlCft-BD "r'jI wbil.23:.l$af .

<te> <td>te16fono móvil "'td:uinpl.ata bor-~u' 1" 'h4.1e ~o:h4 .ul'" </t~> ~'><input type_'. e/'r:r> > <..ov .r'vlc:tllll&') ) d.'nuXI ficlI!' </table> </fonn> <br> ~ href... $nomb El'> . php'>volver 11 la Agend4< '11> . NO ha aelec: 'ionado ningún 1I9latto p. . • ..!$po8_da~~a[ nombre'JI .·ao~odificar.'text siUl_ 10' D&Jnaa tltJAOV 1 valua..510 Pl II> 5 A TRAV~ DEE1E.\tPLQS U Ih •• S.. • $campoa [SPOs_datoll r ' correo.lt <! t~... • SCampo..t'~ type_'hidden' bordara O'> name~'victi~ificllclon' valusa $victlma'. ~thod%O..") $n~te $('or.ce'"....php' <linp~t ~tabl.'$tlf..ltr> <tl'> <ltdo colap. < ctd>tel'fono fijo: ctd><input typa_'text' aiz •• '10' nenea'tlt .utmlt' vlIlue.fijo' valu•• 'S lf ' i j <> .-.. <U <t(S>NOI!t>re: "'t~iTlput tYPfl·'~ext· sile·')5· nlllMa'nO'1lbre' YoIIl Je. <1 tr> ct(S>Oir~ci6n ctd><t~t de correo-e: type_'text sit •• 'ZS' asma_ cor-eoe ~lu •• 'Gc r ..' J Ir Stit_tijo • $campo.c.~. .CSpos_datosi'tl!_fijo'lJ t_iIIOvl JI $tlfJl'lOVil • $carnpQsl$pos_dlltoar t echo • ctorm action.'lIg_op.

antes de hacer efectiva la modificación..·· ¡ I importante que $datos .tr($_C~{$dato81$ilj. lDe registros del fiehero separo JI .ml <be~d> tle>Agenda' Modificación da .••• nootDr 1dH'_ 6Ju ~ ll4455 ~n) .correo-e p. $l<count($datoa).a $un_nomPre) r. hay que comprobar que no se introduce el carácter que usamos como delimitador de campos y que el nombre no está siendo usado ya: <ht.ir . e?php 1ncl~(·a~datos.. "" .$l~neaa¡.11nea.\ ~ 11 Agenda: modificación de registro Dno:DÓCI d.ste ordenaao tor tU-O.. Si.datoa n" global $datos.\1PLO DE USO DE FUNCIONES OI! FICHEROS: AGEND.iJJ I ($campa. $1+<-.._file(FICH_80l/ Stotal regs_count($line. EJE.[$illl '.)65a .turn true.t __ E"epeIS~nombre) ( II pan" todo.1 1lOIIbr.· $campos • explode(SEP_CAMPO. $Wl_reQ. 1 'hea <body> eb2>Agenial Modifieación de entE"adase h2 .r • SI!:P "AMPO • '(-GEtL$d4to. eL whUe tSi<$tQtlll.ine·) function e.tOI . S!P~PO)1 echo ••• ERROlI:: NO esrá penLitido el ce.regs) 1 . function conatruye_reg() 1 definido en 'aQ' ..pi..~) { if (.e RA·MA API!NDlCE A..~a el e(l'is ro cloIIIpOa y cOItp%118bo que no c )ineide .s.tr... . ltrada Al igual que en el programa que inserta regislros. return false.

10 primero que hay que hacer para borrar un registro es saber cuál..lt..~ pepe~~com 2-46802~ 164208~ 2233355569mm ~ r . Por tanto. JI.\Ul1 'un. php) nos mostrará.. ~tr'._rlpeISel_no=brell echo ·chl~·· BaROa el nombre $el_no. Agenda<I.ctar ret.~~ coro abnh.conetru~_reg() I for (Si_O/$i<count($regl¡ .. ¡Ul)... 12)4455 666:13l) .> o:br:a <a hret. lodas las Uneas de la agenda junio con casillas de verificación (checkbo:ces) para que seleccionemos lodos los registros que queramos: Agenda: Selección de Entradas a Borrar r r t!!le .php'>Volver 4 l."9-o. Sal onbr•• $ OB"l'('t!OIIIbre'] !f rl.perl.c1on $df_fope:nffICICSD.• 6!P_CAKPO SEP_IU!DI $_CBTr~~osl$1111 • • ~trl$unLreg. fclon($dfl ¡ .11. .$1++) fwrite¡$(If. -l>").. $r...S BORRADO DE UN REGISTRO Evidentemente. m@m. El primero (a!iLborra_selec..boekll exit.. ¡ $rlg.brl ya •• tA u•• db</hl~·1 ~.l) I ear.> A. el .<">· echo '<br><br><4 href_ ja~Bcript:hi8tory.• Sl2 PIIPS A TRAVts DE EJEMPLOS ORA·MA )... para esta operación necesitaremos dos programas.._file(PlCK-SO¡ ¡ $rlgl[$_OEt( ·v1ctima~odiflc.peiUa p epOarQ....nlluom p.t.ltt.. 'xit $~r-v Sun_reg .

J-$valo~. ( jnelud.tado ($1 inaa8_bd..80.'g. .</title> <fhead~ cebody .. ¡ I fclQIe($df) ¡ echo '<torm ._ftleIPICH_801: $de.. El segundo programa (aQ_borrar . 'e'. por último..r<Jtltl.ction..l_victima.. <hIN"" . AGENDA 5 [J . ) echo "<hJ .. ht:nl.php' ~tbod.·O· eellspacinq.reay($i.q~to •. ") ¡ for ($i. count($li't __ victi. tOp«1 '''ICH_RO.s DE FICI~EROS. ' . $lln... lee el fichero entero sobre otro array ($reqs) y....php). Número de registros a borearj cY~".g_borr~.-Hna.ta_vietLma.tttl.('so_datoa.ebo • <rabIe bo~. Borr.cci6n de Entndoall a BolTar<lh2> . <br> <& hret_'ag_oper •• php. ".t·.<J.t.."</u></h3 ..body.OI$1<count($reg~J:$i •• ) ~f Ilin_..($df)) $lin••4_bdISeont_line•• ]_$reg: Scont... el que hace efectivo el borrado de los registros.1 C RA ·MA A~OICE A: EJEMPLO DE USO DE FUNCIONF.... $total_victimaa. Seotal_v!ctlmaB++.fopen lPICK.·¡ pinta_li... inc·)¡ $eont~ltfl .[$tot.t'.fg.S. echo '</fonll>'/ .. la Agena. 'r'): ($r~..eh ($_GET •• $clave_>$valor) ( Sli. 8o~rsr entrsdas</h2> <?php includ. <ht. Slista_victi~. sigue la siguiente esl.. borrar I ' ) .~A9..gend¡a: sel. confecciona un array cuyos elementos son los números de línea/registro que van a ser borrados (Slista_victimas): luego.lrll ~ ch••d> <titl._bd-array() .""" whll..Volver .n~1 .inc·). <h2>Agenda... 1f l$total_victimas > O) t $reg.O¡ foee... recorre este array entero para aplicarles la función in_array () y ver así qué !fneas han de eliminarse... Selección ~.-) .>AQenda: 8o~~sr entrsda.OI .. fdf.ralegia: primero. Entr~ .~ <1bae4> ch2>A.)) .'.

ca ref.··J~Sregl felose t $dt) : pint8_1istadoCSkk. 'n'. wbil. $cont_lln. .>AQ'endal Listado de entradas en :a agend"c/tit1e> cJhead . C$reg_fgets!$dfl I $kkr6cont_linea."s-O I $kk_arrayO. Su contenido es: "huü> <h.!o~ ~r IPICH_BD.1ecc10 ado ninlllin rellistro para bol"rar tc h4: cbr. iSd! . 'r'l di. "1 ¡ " <br>o ca hret_'. ine' ) . echo "ch4>NO ha 8.o_opera.'···· aRROR al abrir la BD'I. eh. $ag81$illl .php'>Vo!var a la Aqenda</a> A. 'body> eh2"Agendal Listado de entradas en la agendac/b2> "php 1ne1ude f °aCl_datoa. php) leemos (Odas las leneas/registros del fichero y las insenamos en un array que posteriormente pasaremos como argumento a la función pinta_listado() para que las imprima.t..ad> et1tl.6 LISTADO DE TODOS LOS REGISTROS En este programa (ag_listado.. tclo.·ft9_~r8.php'>Volver a la Agenda</a> El resultado c¡e muestra en la sigujente imagen: . $d.'14 PHI" 1\ TRAVEs DE EJEMPLOS =RA-MA fWl" teC$df.

echo " <1..::':-':?4 :::t4::::JSf l .lnttSlineas). AGENDA 515 . inc") .:bt JlIIIIrr./. O~ ¡~ JoIOIIt_ jf ft. pepe pepe365@aquull1Smo. Hoaie ~ I'\. . . Total de l~ reglBtrQ8</t!tla~ </hed4> <h2>TQtal d.php'>Volver ~ la Agenda. '</u>'. puesto que cada Unea de nuestro fichero constituye un registro: 10 único que hay que hacer es leer el fichero entero sobre un array con la función file II e imprimir el total de elementos del arra)": <~tml> <h.~AQen4a. t*P-/~~~ Agenda: Listado de entradas en la agenda O. agenda.1>'. teje chlrh@tlhrrutme.~. abraham abc@masahcom 2233355569999999 1.d~ <body> <tltl. registros ea <Í'php incll.lde( "a~Ldato •. ?> </h2> <br> <& hretH'ag_QPerB.. Sline••• tilatFICR_BD1.com 24'-.7 TOTAL DE REGISTROS Éste es el script (a9_total.> El resultado de su ejecución sería..MA N'tND ICE A.com 1234455 ~633'3 Votv!:r a la Agenda A. cOl. EJEM PLO DE USO DE FUNCID~ES DE l1CllliROS.ORA. php) ml1~ sencillo de lodos.

516 PIIP 5 ATRAV~DI3EJEMPLOS e RA -MA .." .¡". "q""u.....i .011" U Bu""... Jul. . IllI. J. 101 .'1 . r...-I:l Total de registros en la agenda: J Volver 1 I1 Aaend. IJI 11/0)11'.." d..n AIJ'" .

B. en Hneas del estilo: nombre_de_directiva:valor Los valores pueden ser. pues también se ignoran. En este fichero usaremos el carácter . en las máquinas Windows. se deberé desactivar esta directiva para poder usar las etiquetas <?xml y 1>. se basa. en los directorios e: \ windows o e: \ winnt. El formato de este fichero es muy sencillo. en el caso de máquinas U*ix suele encontrarse en el directorio l usr / local / lib o bajo l ete y. Si se desea utlhzar PHP Junto con XML. Dependiendo de la instalación.APÉNDICE B FICHERO DE CONFIGURACIÓN PHP.l DIRECTIVAS GENERALES asp_tags::Off Además de las usuales etiquetas <?php y 1>. la fiabilidad y estabilidad del intérprete PHP. permite el uso de las etiquetas tipo ASP <% y %>. o bien booleanos (en cuyo caso los valores que podrán tomar sernn true/on/yes/l o falsa/off Ino/O). short_open_tag=On Permite o no las etiquetas <? y ?> para abrir y cerrar PHP. ini determina el comportamiento. como inicio de comenlario y podremos usar las marcas de sección del tipo [un~seccion). . la seguridad.INI El fichero de configuración php. o cadenas de caracteres que habrán de encerrarse entre comillas dobles.

archivos. register_91obalS:Off Implica que se puede acceder a las variables EGPCS (Environment. PHP enlonces Ignorarla las variables de enlomo. etc. las cookies y las variables de servidor y. B. SI le asignáramos.). Si.2 ERRORES display_errors:Off Determina que los errores producidos en la ejecución de un script se muestren en pantalla como parte de la salida generada HTML. barras invertidas (\) y los valores NULL son automáticamente prefijados con una barra invertida. será el registro de eventos . GET. POST. además. El valor por defecto para esta directiva es EGPCS. register_argc_argv:Off Con esta directiva se declaran (o no) las 'variables argv y argc (las que dan información sobre las variables del método GET). variables_arder: Establece el orden en que se evalúan las variables EGPCS (Environment. los errores se envfan al registro de errores del sistema: en U*IX los recogerá el demonio syslogd y. la comilla sendlla es marcada con otra comilla sencilla en lugar de la barra invertida. rnagic_Quotes_runtime:Off Se activa el prefijado con la barra inversa de los caracteres anteriores para los datos generados a partir de cualquier fuente externa (bases de datos. POST. PG. por ejemplo. Cookie. Si asignamos el valor especial syslog'. además. Server) como variables globales . sobrescribirla las variables recibidas mediante POST con las recibidas mediante GET que tuvieran el mismo nombre. GET. Cookie. precision-12 Número de dlgitos significativos mostrados en números de coma flotante. magic_QUotes_sybase llene asignado el valor 00. Si no se usan. es preferible deshabílitarlas en aras del rendimiento. en Windows NTI2000lXP. comillas dobles ("). error_logEspecifica el fichero donde se registrarán los errores generados por los scripts.518 PIlP5ATRAVEsOEEJEMPLOS C RA-MA magic_QUotes_gpc:On Activa la conversión automática de las comillas para las operaciones GPC (Get /Post/Cookie): todas las comillas simples {'l. Server).

. es en tiempo de ejecución avisos en tiempo de ejt. El valor que recibe esta directiva se conforma con las siguientes constantes: Constante E. si queremos mostrar solamente los errores.rerrores grnves de compilación E COMPILE WARNING avisos de errores de compilación E USER ERROR mensajes de error generados por el usuario E USE~WARNING mensajes de aviso generados por el usuario E_US~NOTICE osuano mensajes de ad.-NOTICE E_CORE_ERROR E_CORE_WARNING E Significado IOdos los errores y avisos mures gra. o http://unsi tio. En el nuevo fomato de los errores se puede pinchar en ellos para ser reconducido a una página donde se describa dicho error. de usar unn variable directamente sin haber sido previamente inicializada) errores grnves que oculTen en el nrranque de PHP avisos que ocwren en el arranque de PIIP COMPILE ERROR ..'Cueión errores de compilación advenencias en tiempo de ejecución (suelen provenir de errores scmúmicos del tipo..ALL E ERROR E WARNING E_PAR5E E. por ejemplo. En esta directiva se indica el lugar donde podemos conseguir esta Información (el nombre debe acabar con el carácter "1"). Valores válidos pueden ser: lmanuall en caso de tengamos una copia de él en dicho directorio. las advertencias: html_errore=Off Incluye (o no) etiquetas HTML en los mensajes de error.enencia generados por el As!. si es que estuviera en dicho URL .CRA-MA APÉNDICE S: FlCJIERO DECO:-OrlÚURACIÓN PIIPJNI 5111 error_reporting= Indica el nivel de detalle de errores que queremos obtener. docref_root= El nuevo formato de errores contiene una referencia a una página que describe el error cometido. com/rnanual/es/. escribiremos: y para mostrar todos los errores excepto.

. open_basedlrSi se Indica un nombre de directorio (acabado en "r. en el track.520 PIIP 5 A TRAVÉS DE FJEMPLOS ORA-MA docref_ext= Indica la extensión de los ficheros. El valor introducido debe comenzar con el carácter" • " (por ejemplo. Se puede especificar una lista de directorios: Se separan con el carácter ~:..error8=Off SI esté habilitada .. Por defecto. /dirl/dir2/).. 8. éste se ejecutará al final de cada script tal como si se hubiese ejecutado un include( ) de él. éste se ejecutará antes de cada scnpt tal como si se hubiese ejecutado un include () de él. esta directiva no tiene efecto.3 FICHEROS doc_root"Directorio ralz" de PHP en el servidor. Esta directiva s610 se usa si tiene un valor asignado . El valor por defecto para esta directiva es •.'. se permite abrir cualquier fichero .. entonces un script sólo podrá abrir aquellos ficheros que estén en su mismo directorio.path:: Esta directiva se comporta de manera similar a la variable de entorno PATH de Unix o Windows: especifica una lista de directorios en los que las funciones require(). no se sirven archivos fuera de este directorio.path() buscan los archivos.". log_errors=Off Indica 51 los errores generados por los scripts deben ser registrados registro del servidor (esta opción es dependiente del servidor). SI el script acaba con exi t ( ) . include() y fopeILwith... auto_appen~file= Si se indica un nombre de fichero. excepto en Windows que hay que usar un '. Si PHP está configurado en safe mode. .• (sólo el directorio actual).. por ejemplo. auto-prepen~file- SI se indica un nombre de fIChero.. . el último mensaje de error lo almacenará en la variable global $php_errorrnsg. los scripts PHP sólo podrán abrir ficheros que estén bajo dicho directorio. excepto en Windows que hay que usar un N. Si se indica el valor ":. html). Los distintos directorios se separan con el carácter ":". include...

upload_tmp_dir'" En esta directiva se especificará el directorio temporal donde se almacenarán los archivos que se suban (upload) desde el cliente al servidor. este valor debe ser mayor que upload. Esta directiva afecta a la subida de ficheros: para cargar ficheros grandes. B. publicJ¡tml) donde están los SCripts PHP.JfIAX_size.lNI ~21 allow_url_fopen=On Esta directiva es la responsable de que se puedan abrir ficheros remotos (con formato URL).JM. la directiva memory_limit también afecta a esta operación. user_dir: Nombre del directorio que está debajo del directorio de conexión (o casa) del usuario (por ejemplo. Lógicamente. upload~~filesize=2M Tamano máximo que puede tener un fichero subido al servidor. este directorio debe tener permiso de escritura para el usuario bajo el que se ejecute PHP. memory_limit=8M Establece la cantidad maxima de memoria que un scnpt puede usar.'JDlCE B: FICHERO DE CONFIGURACiÓN PHP. file_uploads=On Si se permite o no la subIda de ficheros al seMdor. post_ma~size=8M Establece el tamano máximo de los datos que pueden enviarse vla POST. Además. implicit_flush=Off Si está activada. . por lo que debe ser mayor que past.4 RECURSOS ma~execution_time=30 Establece el tiempo máximo (en segundos) que un script puede estar ejecutándose. se envlan directamente sin almacenarse en un buffer. print o texto HTML). Sólo es recomendable su uso si se necesita depurar un script dado que puede repercutir negativamente en el rendimiento del servidor.X_filesize. los datos generados como salida (funciones echo.CRA-MA APt.

6 EXTENSIONES DINÁMJCAS enabIe_dI=On Sólo aplicable a PHP como módulo de Apache .em () y el resto de funciones que ejecutan programas del sistema no ejecutarán programas que no estén en dicho directorio directorio.J!lode_gid=Off Si se asigna On. Se emplea para permitir la ejecución de PHP sólo en determinados directorios o servidores virtuales (poniendo engine off en el lugar adecuado en el fichero httpd. la 'unción syst. safe~ode_include_dir= Las comprobaciones de UID/GJD se obvian cuando se Incluyen rtCheros que están a partir de este directorio. se evita la ejecudón de PHP). sino la del GID.S SEGURIDAD engine=On S610 tiene efecto cuando se usa PHP como módulo de Apache. disable_functions= Se impedirá la ejecución de las funciones que aparezcan Irstadas (separadas por comas) en esta directiva. Esta directiva es independiente del modo seguro. extension= Indica qué extensiones dinámIcas debe cargar el PHP cuando arranca. safe. safe~ode_exec_dir= Si PHP se ullllza en modo seguro.conE. 8. . al abrir un fichero no se hace la comprobación del UID (activado por defecto en modo seguro). no se puede usar dl() . extension_di r = Directorio donde se encuentran las extensiones que se pueden cargar de manera dinámica. safe.J!lode=Off Activa el modo seguro. Permite la carga dinámica de extensiones PHP mediante la fundón dI () En modo seguro.522 PIII>5 A TRAV~ DE EJEMPLOS C RA ·MA 8.

save_handl er=files Especifica el nombre del controlador empleado para gestionar la información relativa a las sesiones.save-P8th=/ tmp Argumentos pasados al controlador de almacenamiento. Debe contener caracteres alfanuméricos. session.serialize_handler=php Controlador utilizado para guardar y restaurar los datos. . El valor 1 indica que está activado. session. en porcentaje . narne=PHPSESSID Nombre de la sesiÓn que se usa como nombre de la cookie. El valor Osignifica 'hasta que se cierra el navegador' session.use_cookies=l Indica si el módulo puede usar cooJ</8S para guardar el sesdon id en el lado del cliente. session.cookie_domain= Dominio para el cual es válida la cookie. gc~lifetime=1440 ~basura~ Indica el número de segundos tras los cuales los datos se considerarán como y serán eliminados por el proceso de recolección de basura. session.gc-pr obability=l Especifica . IIR. entonces aqul indicaremos el directorio donde se crean los ficheros de las sesiones.\ CIÓN PH".cookie_lifetime=O Especifica la duraciÓn de la cookle en segundos que se manda al navegador. seseion .cookie-path=/ Camino para el cual es válida la 000k16 .auto_start=O EspecifICa si el módulo de las sesión inicia una sesión automáticamente al hacer la petición (el valor O indica que está desactivado).AP~ O ICli 8 F1CHEROOF CO"l H(.7 SESIONES session. session. ses8ion . la probabilidad de que se inicie el proceso de recoteción de basura (garbage col/actian) en cada Inicialización de una sesiO n. Si se ha especificado files. seseion.INI ~21 I B. session.

input=sr c.. Idev/r andom o Idev/urandom. url_rewrieer. Nombre DNS o dirección IP del servidor de correo saliente que PHP deberá usar para enviar correo con la función mai l (l . . en tropy _ f i le. disponibles en muchos sistemas Unix. esto es. la página desde la que hemos llegado a la actual. refer er _check= El valor que se asigne a esta directiva se comprobará en cada HTIP Referer. f arm=f akeentry" Especifica qué etiquetas HTML serán reescritas para Incluir el Identificador de sesión 51 su inclusión transparente está activada .use_tr ans_sid=O Automatiza la incorporación del IdentifICador de sesión en todas las petickJnes. HTIP_REFERER debe contener la cadena aqul indicada para ser considerado válido. session.j 24 PIIP j A TRAVru. DE EJEMPLOS e RA·MA session .ar ea=href . I NOTA: $610 pi. El valor O indica desactivado. Activar esta directiva puede ser peligroso puesto que alguien con una sesión activada puede enviar a otra persona un URLs que contenga un identifICador de seslón activo.tags:"a=hr ef. session. WII""IdoWs.fr ame=src.c ache_limi ter=nocache Especifica el método de control de la caché a usar en las páginas de la sesión .cache_expire=180 Especifica .ent ropy_ file= Establece la ruta a un recurso extemo (normalmente un archivo) que se usará como fuente adidonal de entropla en el proceso de creación de session id's.entropy_l ength=16 Especifica el número de bytes que serán leidos del archivo indicado en aessian.8 CORREO ELECTRÓNICO SMTP .'. en minutos. 8.. No tiene efecto para el limitadar nacache. la caducidad o tiempo de vida de las páginas de la sesión Que se encuentran en la caché. por ejemplo. session. Puede tomar los valores: none I nocache I priva te I pr i v ate_no_expi r e I publico sessian. session .

default-POrt= Número de puerto TCP al que se Inlentaré establecer la conexión con el servidor MySQL medianle la función mysql_connect (). usriningunsitio. lusr/lib/sendrnail o Ivar I qmail/binl sendmai l. I NOTA: Sólo para Urnx. B. mysql. por IUpueltO. mysql. NOTA: No el acon$ejeble usar esta directiva pue. mysql. Tiene posibles valores: lus r lsbin/sendmail. I NOTA: S6/0parll WIndows.default_host: Servidor por defecto cuando no se especifICa ninguno en mysql_open (). com).max_links.d6faultJl8SSworrJj. incluyendo las persistentes (-1 signifICa indefinidas). que tengan permiso da lectura en PHF' INI rnysql.mAX-persistent:-1 Número máximo de conexiones (-1 significa indefinidas). de todo. Ruta del demonio de correo SMTP.1o que cualquier uluarlo con acceso PHP puede ver dicha clave 11mplem&nte ejecutando: echo cf9_f18Lv8r("mysql. sendmail-PAth .9MySQL mysql. La dirección del remitente (campo De:) que apareceré en los mensajes envaados desde PHP (por ejemplo.allow-persistent.default_user: Nombre de usuario por defecto para las conexiones al de base de dalas si no se especifica otro. mysql. MySOL persistentes por proceso mysql.C RA· MA A~NDICE B: FICllhRO DE CONfiGU RACiÓN PIIPINI SlS sendmail from. ademb.default-password: Clave por defecto para las conexiones al servidor de base de datos si no se especifica airo. No funciona en modo seguro. aquellos uauano. .-l Número máximo de conexiones MySOL por proceso.On Permitir conexiones MySOL persistentes. No funciona en modo seguro.

scale . B. o Numero de dlgltos decimales de precisión para todas las funciones de bcmath.default_socket: Nombre por defecto del socket usado en conexiones locales al servidor MySOL.default_db: Fuentes de datos OOBC a utílizar si no odbc_connect() oenodbc-pconnect().l1 MA TEMA TlCABC bcmath . uodbc .MA mysQl.defaultlrl : 4096 Tamano máximo de caracteres que devuelve de un campo (por ejemplo.~er8istent=-1 o en Numero máximo de conexiones persistentes de significa indefinidas)..IO ODBC uodbc. .allow-persistent:On Indica si se permiten o no conexiones persistentes de OOBC.default_user: Nombre de usuario si no se eSpecifica uno en odbc_connect () o en odbc-pconnect() . odbc. B. uodbc.'26 PHP' A TRA vts DE EJEMPlOS O RA. B. ¡nduyendo las persistentes (-1 significa indefinidas).12 DIRECTIVAS RELACIONADAS CON LOS NAVEGADORES browscap'" Nombre del archivo que contiene la descripción de las capacidades de los distintos navegadores.mAX_links--l El número máximo de conexiones OOSC por proceso. default-pw= Clave para usar si no se especifica una en odbc_connect () odbc-pconnect(). oose por proceso (-1 uodbc. uodbc. de tipo TEXT). se eSpecifica una en uodbc.

SClU"sor . mya<.ql_tablen~(cur. myeql_ liat_ tabl •• (nombre_bd. myaql_ liet_dba(d•• cr_ conexion) Devuelve en un cursor todas las bases de datos que están disponibles en el servidor. po. my.ql_ •• l. uar.nueYO_enlace[. 4e.uar.ll_11st_tables e • a'illlmda·.ieion) A partir del cursor devuelto por rnysql_list_tables () devuelve el nombre de las tablas.clave[.~.cr_co~xiOD) Selecciona un base de dalos y la deja como activa. while CUila· D:lYlilql_fetc:h_rgw!$eur.opcal]) Establece una conexión con el servidor MySQL Devuelve un descriptor de conexión con el Que habrá Que realizar las subsecuentes operaciones con el servidor.Or) I { pr!nt ·tebl~: $fil~(Ol<br>'1 ~. . d •• cr_conexion) Devuelve un cursor con las tablas que hay en una base de datos.. apea]) Establece una conexión persistente con el servidor MySQL myaql_clo •• {d••cr_conexion} Cierra la conexión MySQL.ct_db(nombr.APÉNDICEC RESUMEN DE FUNCIONES DE MySQL myaql_connectC •• rvldor.ql-pconn.or. ~. $dbdl. clave [.ct( •• rvi4or.

enda'. ~aql_create_db(nombr... ' 28 PHP S A TRA ru DE EJEMPLOS $curaor • myaq l_liat_t a b las( ' agenda ' ): tor (Si.. ) ~aql_.acr_ conexion) Envla y ejecuta una consulla SOL en la base de datos Indicada como parámetro . O: Si < mysql_n~ r oWB($cu r .rrno(deacr_conaxion) Devuelve el numero del mensaje de error ocurrido en la ultima operación SOL... sin pasar por ninguna memoria interna intermedia (buffer).enda·.cr_ conaxion) Borra una base de datos completa en el servidor.or ). mysql_field. 4 ) echo "tabla:' • myaql_t ablename (Scurllor..at_ fiel411 (' a.na-l$chIPQs. d. ~aql_db_query(nombre_bd..._bd. deacr_ conexion) Crea una base de dalas en el servidor MySOL. ) t echo 'campo($i): " ...yaql_ query(conaulta_ aql.br. III}'sql_field..-pu. '<br>' ¡ ~aql_Iiat_ ti. $dbd¡ I tor ISi • O. nombre_ tabla.len 1). ~aql_4rop_db(nombre_bd. Esta información habrá de ser recorrida con cualquiera de las funciones mysql_field_flags ( ). ._a.ql_ U. La operación que no puede realizarse sobre e( cursor devuelto por esta función es rnySQl_nurtLrows () ..-Pd. $campos • lQ'a...d_query(conaulta (deacr_ conexion r. myaql_unbutter.t ype(). el resultado lo devuelve directamente. -adoJ) Envia y ejecuta una consulta SOL en la base de datos activa..lds(na.. de. ~ql_inaert_id(d •• cr_ conaxion) Devuelve el valor que obtiene una columna de tipo AUTO_INCREMENT en la ultima operación INSERT. lo cual redunda en una mayor rapidez y ahorro de memoria. t . deacr_ conaxion r. rnysql_field_name () y rnysql_fiel d. ~aql_error(deacr_conaxion) Oevuetve el mensaje de error ocurrido en la ultima operación SOL. $1). deacr_ conexion) Devuelve un cursor con información sobre los campos de la tabla indicada. A diferencia de rnysql_query ( ). $i. $1 < mysql_nUDLfi e l<1s($campos¡ ¡ $1 . conaulta_ aql..v.. modo]]) Envia y ejecuta una consulta SQL en la base de datos activa . 'l. $11 -"br > ' ..

echo "$un_obj->nombre - myaql_ fetch_ row(cur8or) Obtiene una fila del cursor y la devuelve en forma de erray numérico.(deacr_conexion) Devuelve el número de filas de un cursor. se obtiene el campo especificado mediante la posición numérica . ( !$un_cbj~~Y8ql_fetch_object!$C~1".ql_nua_ field. $.orl) $~obj->eorreo. from la_aq. n~fil •• campo) A partir del cursor. whil.ql_n~row. (de. ~8ql_reault(cur. el tipo . nW!Lcampo) Obtiene de un cursor la información relativa a una columna para devolverla como un objeto con información tal como el nombre de la columna.or~ql_queryl"Select • 11 obtenqo el cuarto ~ de Sc~.~.ql_ fetch_Object(cur8or) Obtiene del cursor una fila y la devuelve en forma de objeto. devuelve un erray numérico que contiene las longitudes de cada campo de la última fila extralda por mysQl_fetclLrow().or [.ql_.ql_fetch_a88oc(cur8orl Extrae del cursor una fila en forma de un errayasociatlvo.or. el nombre o el formato de puntos: nombre_tabla.elect • trom l __aqen4a". $dbdl. tercera fila 2.ffected_rowa(de. nombre_campo $eur.n~·. ~. JJ. my.ql. etc. Sdbdl. 1. $C\it'IJOl"zmy~l_query ($aql. my.ql_ fetch_ array(curaor) Extrae del cursor una fila en forma de un erray que puede ser indistintamente referenci~do de forma numérica ylo asociativa (con nombres de campos).O RA-MA Á~D1CE C. my8ql_ fetch_le~{curaor) A partir de un cursor.<br>·.cr_conexion) Devuelve el número de filas que se han visto involucradas o afectadas por la út!Jma operación SQL. my.ql_reaulttScuraor. y de la fila indicada. RESUMEN DE FUNCIONES DE MySQL S29 ~. nombre de la tabla a la que pertenece .".cr_conexion) Devuelve el número de campos de un cursor. ~. my8ql_ fetc~field(cur. .

ld-pam.ql_ti.ql_db_na. ~. auto_increment. w. enum. '<br"'j "be "tOlll4t\o ~o co. D~fil.(cur. S1 ililt~_~1iI $i • o. numLcampo) A partir de un cursor y una Indicación del campo dentro de aquél.or. $cont • ~liIql_num-row"lSlililte_~) o( .ql_fi. el resultado de cualquier operación Sal hecha con mysql_query ( ) ).or.elect • from la_agenda'. bIoh. $cursor • mys<¡l __ q .or. ".y.. primary_key. O).(cur. multiple_key. zerofill. binary..ql_fi.ql_4ata_ ••• k{cur. ~.or.l~tabl. "~br>'r ~.a(cur. IIIYsQl_flelcCnllllleC$cursor. DuaLCampo) A partir de un cursor y una indicación del campo dentro de aqUél. num_campo) Devuelve el nombre del campo especificado en un resultado. obtiene los nags asociados al campo_ los valores que se podrán obtener son: not_null. n~c~) Mueve el puntero del cursor a la posición del campo especificado.ql_ti. $dIXU. 1'. ~.D(cur. $curlilor • II'IYl'ql_query(-.ld_ ••• k(cur.l~flag.ql_ttel4-~entScurlilor. L .hUe ($i $oont. timestamp. n~campo) A partir de un cursor y una indicación del campo dentro de aquél. devuelve el nombre de la labia donde estil el campo especificado.or) libera la memoria ocupada por el cursor (t1picamente.ql_fr ••_r••ult(cur. til "<c:r>'. Ol. ry(·$elect • fr01fl l~_egtmda·. $dlXl)1 'e_no ter C~I·.or.(cur.or. "<br. 11. ~ql_db~f$li. ~. Un ejemplo que imprime el nombre de todas las bases de datos existentes en nuestro servidor: mylilql_Hlilt_dhlil! $dbd f ..: echo 'sequndo C~!np(l.530 PHP 5 A TRA vts DE EJEMPLOS ~..ta_db •. { echo Si •• . '<br"'¡ ~ho ~. fila) Devuelve el nombre de una base de datos a partir del cursor devuelto por mysql_list_dbs ().ql_fi.. unsigned.ld_l. ~. obtiene el tamano de éste.Jl&l'le l $cur"r.) Mueve el puntero dentro del cursor a la fila indicada.or. unique_key.mpo:·. ecDo 'pri_r eAft!I)O: 1IIY5Ql_Ueld.". mysql_fiel<Lleni$cureor.

l4. < 'tipo ~l_fi.acr_ con...de.. n~c-._uaer(u.ype Snombre .. ~aql~et_boat _info(deacr_conexion) A partir de un descriptor de conexIón al servidor. o local. remota .·· tiene ".ql _g. vla sockets de Unix).• I ~. Sflaq~ o ~G1_t1.nt_encoding(de. Sti.ba.t.... Sil.orl : $Ubb echO" '"..el RA-MA APIlNDICEC: RESUMLN DE f-USCIONLS DEMySQL ~~I ~.cr_conexion))) Cambia el usuario activo para la conex)6n actual.ql_cbang. devuelve el tipo de conexión establecida (por ejemplo.S~carnpoa." regietroa <br>". Sil! echo Snotnbre.$tabla. y "... .po) A partir de un cursor y una indicación del campo dentro de aquéL devuelve el tipo del campo especifICado. MYBQl_q." <br>' .ld_type(cur. (Scur8or. tiene los siquientee campoe:<BR>"¡ $1 ." eaepo. $if¡ tSCUrlor.e_ dato. '1 ".14.. ($J < SnumLcaropoal ($cunor.. vla TCP/IP.xion) Devuelve la versión del servidor MySQL._ .$!lAqS.¡. -cho "ad~'a.t_client _info() Devuelve la versión de MySQL.r- Scar8Qt I : (Scur.r8or. El siguiente código nos muestra un ejemplo combinado de las dos últimas funciones: .. myaql_ get-proto_ info(d•• cr_conexion) Devuelve el número de versión del protocolo de conexión. [. Si) i Stam lQ'aq1 _ U.14_fl. ~. DI while .Srege.po.". $1 •.1l lScu..ql_cli. " de tipo·. clav.cr_conexion) Devuelve información de la última consulta SOL. .ery(-SLLECT • P'ROM • ~1JI'IIIILf1al4ll 1 ~l--. .' de tUlatla y nAq. myaql_get _ aerver_ info(d.or.r.ql_ fi.14. ~.1.cr_conexion) Devuelve el nombre del conjunto de caracteres (chaf8cter sel) activo para esta conexión. St_. myaql_ info(de. [.lQ'aq1_ 11.

. .~. ni "_"). comillas de una cadena de caracteres anteponiendo el carácter de barra invertida (\). QYaql_ eacape_ atring(cadena_ caractere.532 PIIP 5 A TItA vas DE EJEMPLOS C RA·MA myaql_ r.) Enmascara las comillas de una cadena de caracteres anteponiendo el carácter de barra invertida (\).al_ .acape_ atring(cadena_ caracterea) Enmascara los caracteres especiales de una cadena de caracteres teniendo en cuenta el conjunto de caracteres activo (nota: no se enmascaran los caracteres .

11.(DOMException) on . utilizadas en el capítulo dedicado a XML. • 12. 1I raile.. canet un.NODI!: ·" · " · " · " ·" · " ·" o " • 1. .APÉNDICE D INTERFACES DOM.ettinq 1I rai8el(OOHExcept1on! on retrieval . DOnar unligned... En este anexo se muestran las defi niciones en IDC de l¡¡s interrace. NOTA: Para obtener mh IrtforrMción tobrI!I OOM Y lecnoIogl . I .1MENT_ TYPE. r . D.NODE CDAT~SECT ION_NOOE !l~ITY_REFeRENCE_NOOZ 1/ Nod"Type conlt unlioned ahort I::o~t \lnlliqned shor t.donly attr1bute DONString attribute OOMString nodel'OaIM I n~Value. el W3C optó por definir las inlerfaces de DOM uliljzando el JOL (Inrerfau Deftllition LaIl8I1ag~) definido por el OMG (Object Managenu!IIt Grollp).. 0ClCtlKENTJ"l'tAGKEN'T JfOOIt NO'rATIONJ«)OE • 10. I .t unaiqnéd ~Mt Ul'UIigned COMe urwlc¡ned.1 direa::i6n hUR-'twq w3 orP'TRIDOM=l"'f"t=íH1n . afina....ionad ahore conat unaign8Ó ahort conat unligned 8hor~ conlt unlioned short !:K'l"ITY~OOE PRQCESSINQ_1NSTRUCTI~DZ conlt un. short short abort ahart abort COHKDlI'JKlCE 00C'tlMENT_NO02 00C'I.. . DEFINICIONES EN IDL Para poder proporcionar una especificación independiente del lenguaje. PI*M recumr • \.l0ned abort conat UllIIigned c:cm.1 Interface Node interf~ce Node ( ELEHENT_NOOB AT'I'Rr8IJ't'E_NODE TCXT..

.but.1N~: lnt~o~ucad in OOM Level 2.¡ ).x:ception) .in Nade n. boolun in DOMStr\ng vereion). Node lneertBefore. p. _ "".c:9Child{in Nocla I'\<IIIwChild..n DOH lAVel l: .igned ehort r . rnt~cad In DOM Lev..in OOH Level ]: Noda r~l.uChildNodee{) I \110 N"".an ha. OOMString textContent.. Ox20: / lntroduced in DOH lAvel ).:y attcibute Nod.r.rentNoda.PEClFIC . DOMString baa. " Intro4uce4 In DOM Level 2readOnly attribute DOMString lIltroduc:e4 ~ lXlM Level 2' att: lb~t. 11 Docu~ntPoattion ~ •• ttlDg .hort ahort Ihort aho~t OOCUMENT_POSITION_DI5CO~~O • OxOl: OOCUMENT_POSITION_PRECF.t~l:.f'OSITION_IMPLDiENTATION.oduced in OOM Level 3: .ho~t rah_(OOHE.. ..e No4<t r ..ition(in NO~ oth.sameNode in Noóe ot~""r ~ '~ ' _ _ _ _ _ _ _ _ _ _ _ _--' . rllllldcmly IIIIttribut.d~JY attrlbute Nade readoQly attribute NanedNodeMap 1' Hodifilld in OOH!AVel ~. Nocle Noda bQol . chU&lodea. ModUied cloneNodelin boal •• n deepl OOM Level 2. 534 PUP.doa.~y atulbute NodeLht r . ~ompareOOcumentPo.~y attribute Nade r ..::I . ." . firnChild¡ lalltChild¡ previousSi~~ingl nextSibUnC!'! attributalll ownerDoe'. • . . 1/ r. r. I void IauwJe.sSupported in DOMStr. . (DOkaxcaption) : 11 Moditied in OOM Level ).ent I Modif:. 11 Modj hlld .i ••• (DGK&xe~tio~1 Oh •• tt~ng rai ••• ¡DOKExceptionl en ratrl.ng feature.chi~~ in NodEl . DOMString loc. . )1 I Introdu~ed in OOM ~vel ).r) \U\5ignod .nt:r.DING OxO:ol: DOCUMENT_POSITION_FOLLOWINQ • OX04: DOCUMENT_POSITION_CONTAtNS • Ox08¡ OOCUMENT_POSITION_tS_CONTAINED • OlC1O~ DOCUMENT. I r. nCll"ll". nodf!'Type .5 1\ lltAVts DE EJEMPLOS • readonly attrlbute un.. bool.t!RI.. i.:y atu:i.lize' .tgnad un.. conlt conlt conlt conat CQnlt conlt undgnad un8igned un.but.igned unltgnad unlignad ahort flhort .dor. DVMStl:ln~ preful I ral ••• JOKZxrept~onl lntro4uced ln ~ ~1 2 readonly attribut..n I I removeChild{in Node oldChild) raiaee¡OOMExCeption)¡ appendChild(in Node newChildl rai'es(DOKExceptionl I h. .e<! in DOM lAYel ).Att~ibute.va • .docly attributa ~ r •• dclt. in Node oldChild) rai.efChUcl) raisea(OOKExceptionl.-nt reaaonly ettributa bocu.

ln" tagnilll'l8).u . .bute El~nt El.~t '('.e fei.ti .Node(in OOKString !atoal.-.-reateCQA'l'A.2 Interface Document ntertace Oocunent Noda ( 1/ Hodified in DOM Level )readonly attribute DocurnantType doctypel dcc~tEl."1 )..ac8UJlIl: J loo)n¡pNulespaceuRIl1n :JOIIS.r.IDOKExcept o~ Att: EntltyReferan a N'odeLiat Node ereateAttributelin DOMString na.on). OOKlmplemen~tion l~l~nt. 1I lntro.fucad 1n DON Level 2: DOMString . .'. getPeat~relin DOMSt~..¡t ¡ cm I . attr. P:'oc••• ing:t.ndlerl¡ 11 UúMU •• ruata tntroduced in OOM Level 3: getuaerData(ln OOM5trlng keyl ¡ J.tI [l(ltCt r in.~l .t. argl boohan Introduced U'I OOH Level J.ctual~ .. 10C'..strlng ~apaceup. ~t.(DOMExcapt. 1/ lnt~oduc~ ~ DOH Level ): uDefalllu:-.'tIg veraiOn!..lltledNane¡ Attr rei.' in DOMSt.atruetion createPl"oce•• 1ng:::.nt ~tFr.t~.. 11 Introduce4 in DON Leval ': lmportNode ¡ in Nooe iJrIporUdNoda.. cre. 0...alN"ode I in No.. attribute OOMStl'i1!V . IntrodaceCI in tIClM Level 3: :XlMU•• r:)llta setOa.. ..ap.nt readonly r~donly at~ribut. DClCtI1nQ' d.t C'lo\TASeCt lo' createElem.std~ JJmlString lOQkupPreHx(in n_1MceUlnJ. ¡OOHl:xc. DO!'! tx' ng tflroet .rDat.t.II(r. in DOMUserDota data. ung pr. in OOMString q~.1Il~11 NodaLhl 1I El~nt 1 Introduced "atElement.- . lX»'.ta¡ r.. I r.peceHn boolean I Introduced in DOH Le. i. in boolean daep) rai. Bl~ant ¡ creeteElementNS(in DOMString nemaapeceURl.. in U.AP~l\1)ICE o: INll!RFACES 001'01. eruteC_t I in DONStr ng 4I.erOat.(h:L OOMString IntrocNc:ed in DCI4 Lovel .. ..ae¡OOM('J(ception) /1 lntroducad in DOM Level 2.~tl"ra~t 1 cnuateText.. r.a. • ..ByTa~Stln Introducad in OOM Lavel 2: get21~t8yldlin DOHString alemanttd' _ _ _ _ _ _ _ _ _ _ __ in OCio! Level 3...i .~ 0".H.ntCin DOHString t. ru "t!aR I .seeLml .. CIC'~S'rlllg na.. ••a¡DOHExcaptlon)¡ getElllllllentlilByTiI<¡¡NOIIIalin DOK!. .n~l..1 ¡ iaEqu.r n.ring k_V.~g f .-. ..e.-.apaceURT. iDC"Jbcee.. ture ion OOMSt.! .'IlIDL 535 - I! Int:O<1ucid"1n EJCIII L~vel 3: DOt'.xl C.. in DOM$tr1ng quillifiedNama) Iaiae8(DOMException)/ 11 Introducad in OOM Level 2: createAttributeN3(in OOMStrln<¡¡ na.r. createEntityRefarence1in OOHStr: ':g n_¡ ra. DEFINICIONES E.~.7!rexc.

reac10nly "ttrlbu'" DOMString OOK5t d. Inri )C!I.".1 on . . in DOMStTlng loe_IN. q.lName' raises\COMException) . .. in DOM5tring qusllfledName¡ rai. POH LeVel 2: getAttributeN~~Slin OOMStTinq ~paceURl. n:x»Otxc:ep 100. voi~ nortMll:r.ttribute boolean Btri~tErrorch. in ~ttT "nr " JntTQdueed in ... in OOM5trlng nameapac:eURl. ' tei. getAttributeNStin OOHStrinq n.t21~entsByTaqNametin OOKStrtnq name) I OOM Level 2.""''':lt : Hooe { t.e.ntrQdueed in DON Level J: ettribute boQle~ 1/ :ntroduoed in OOK Leve1 ). OOH ¡. . removeAttributeNSCin DOMStrinq nameapeeeURl. 11 Tntrortuced in OOM Level l: Nada renameNode(in Nade n.etAttributeNooBlq(in Atcr new . attrib04te OOHString docUlllentUJU...evel 2.3 Interface Element "'terf .a. removeAttTibuteNodetin Attr oldAttrl ra1sea¡DOMExceptlonJ. t~ >..eOocu¡nent () .~tOOM!xceptionl .• S36 PIIP!i A "RAV& DE EJEMPLOS eU-MA 1/ IntrOdUced in OOM Level 3: ~ttribut. 0 . .l:'il 1I :nt~oduced in DOM Level J: . :)Uta lXlHString VB1:aion: 1/ . COK t.nq getAttr-ibute (in DOM$trinq ~I.. . ¡-:. in DOH3tring valuel raisel(DOKEkcept. vold aetAttribute(ln OClHStrinq n. letAttribut~(in Attr new~ttrl rai. encoding/ Btandalone: at· r..._-. .."')c!uced In OOH Level 3. 1/ lntroducttd in DOH Level J.. . .Ic:t!d In OOH Leve1 3/ Nod. ftxMbreptionJ. In OOHStrinq loc.(DOHExceptionJ I ). i .onl: removeAttributeli~ DOMStTing ~) raiael{~eeptlonl J Attr Attr Attr qetAttributeNoda(in OOIIStrinq ~I. ln OOM5trinq local~1 rei.c:klngl JI lnt.t~ceptionl .e. setAttributeNS\in OOMString nameapaceURI. OOMString .gN~. lnt~duced . COK LeYel 2: .8.evel 2. in DOMString qualifiedName. adoptNode(in Nade acuree) 1/ 1/ lntrod~ed in OOH Leval 3: re. in DOMString value) raisea\COHException) .rton!y attribute DUH~onflgur5tl0n config.mespaceVRI."' -_ _ _ _ _ _ _ _ __ NodeLiIt " Introduced in OOMStri n l1 l' lntroduced in vold " Introduced ln void .

.S f •• valuo!: ..s!OOKF.8!DOKtxceptionJ¡ 1/ Introduced in DOM r. rai8...) :n .n 11 Introdue~ ~v. in OOHStc1nlJ l~alNaDle' rai ••• f:)()Mg"eeptlonl.e..l 21 ha. void in OOMStrinq localNsme.donly attrlbute El . --------------1/ lntroduoed in OOM Lev.ttrl~tl DOHString data: 11 1 rei.illelllXlMEXcl!'ptlonl. ~tllo: 11 ra1ael\OOHException) on aetting 0..TYPelnfo¡ [ntcaducad void 1/ ~n DOM Leve1 ).adonly attribute Typelnfo 1I Introduce<! in 00" ~vel 31 bool. DU1NICIO~ES EN IDL $37 --------------r. nt 11 Introduced in DOK Level 3: r.ttribute Typelnfo schea. void irt boolean iata.1DOMExceptivnl ~ r_trieva1 .ettin9 rai.1 2: NodeLlst getElem~nt8ByTa9N~NSlin DOHStrtn~ ~. speci U e<.:/ uia8slDOMaxcept1onl en .. boolean in DOHStrinO lo<alNam. - APOOICE D: INTERFACES DOM.vel 31 eetldAttributeNQde(in Attr ldAttr.ingln8tr~ction readonly aetribute DOHStrin~ attribute DOMStrlng Node { t4:t::get. 100M~e~tion} ' .ttribute DOMString /1 tntroduced in OOM LeVel <1: re.5 Interface Processinglnstruction intetiaCI Proce8.l~ DOMString ~J I in DOH Level 2.an ialdf): . 11 Introduc~ in DOM Level )1 readonly ..ributetlSlin OOMString naJao!"P<IceORI.ttribute DOMS~ring readonly attribut. J I Introduced in OOM boole..i8.ls\DOHaxcepelon) on . M8Att.6 Interface characterOata interfoce CharacterData : Nodo . boolean .xception)¡ 0. setIdAttributelin OOMStrino ~ • • n bool~ ¡eIdl 11 Introduced in OOH LeVel JI setldAttributeNSlin OOHStrinq namespaeeORI.etttno 0..Attribut.4 Interface Attr interface Attr . in boohan hId) rais. Node ( readonly .paceURI.

In DOMString 4rq.tI:inq wholeTe)lt.ptlon) ..l0 Interface Entity int.8 Interface CDATASection I:~t~rfac. 'rext Cha.(DOHEX~.lced in OOM Level ).donly ottribute DOMString readonly ottribute DOHString raodonly attribute DOMStrinq Introdl.<. in COK Lavel 3. r.9 Interface Commnet charocter~ta T .j] 'hi • i k'" - D. D..eDatalin unalgned long of!•• t in unalgned long count) rei ••• (DOMExcaption) . ~1d .tin unaigned long off ••t.. in unaigned long count) rata": OOMlbtc:eptlOllI .alDOHBxcept:l..lnHl~ntCont. .eeoat. r~l.nttl . Introduced.rhea Entity Nade ( r .ppen<!Oatahn DOKStrmg arg¡ raia. D.11.h..laHllXIKException) .on) .MPLOS r - r.(DOHEliK:aptlon) .• 538 PH P .iC)T1ed long count I in C(»L~tring IIrg) rBl~~. IX»IStr i.ada~~y .. I . ~1d del..y. bochan i.1 D. publ1eId . . .7 Interface Text interface 1'ut. in un.(in unaigned long otf •• t.u.(in lengt. in•• reDat. 11 Intro4uced in DOH Level ): ~t replacewholeTextlln OOHStrlQg eontentl rai ••• ¡DOMException) .ttrlb~te unalQ1led 10119 ~trinqo.vel 31 readonly attribute DQM.ec.t. COATASecuon Text { 8'= =5 'SRX'= o' .5 A TRA V~ DE EJE.Qg ~1d ~1d unaiqtled long otf. 11 Introduced in DON t.racterData ( 3plitTe~ttin unaigned tong off •• t) rai. attrlbu.e.whitespac.tUlld¡ nota t ionNolM1 attribute DOMString IntrodUC'ed in DOM Level 3: I ottributa OOMStrLng ln"roduced 1n DOM Level 3.te :)OHString encoding¡ I I .

:e N . NQde ¡ I 0. . ln DQMStrinq localName) r.• O llA-MIl API!NDICF.veName<!ItemN:Jlln IXlKString l'I.. setN&lIIedIte&'llN$' in Node ar9' raiaes(OOMEXeeptiO'll' .paeeURX. r"8donl'l attrihl¡tt> unsigned lOIlól lenQeh. Nod . nQcations.tl 0. .' .~.« Level Nod.11 Interface EntityReference • 0 . :¡aJf\f. ln oc.12 Interface Nolation lnt. antitias.16 Interface NamedNodeMap nt .1 2.i~nad lon~ indexl ¡ readonly 4ttribute un&igned long length¡ JI lntroduced in DOM Lev._fin unsi.tFr.e. INTERFACES OOM.ed. r f <lC' . . roadonly attrtbute OOHGtr!ng re.I.nte~lSubs.nt .. DEFINICIONES E" IDL 51'} 0.dNoc..~.. it.eB'DOKEXc~tior. " 0.tion ~e~danly • :: Nade ( attributa OOKSt~inq readonly attributa DOKStrinq publ1ctd.rr~c~ ~ot. lono index) ..1 I 11 Introdu~ed ln COK Level 2. . !ly8temld.d in DOH Level 2: r. r ••donly attributa OOMString lntrodue. Nade getN~ttamNS!in DOMStrinq nameapaeeVRI. N. D.15 Interface nodeList lnterl ~. l.rn.eHap I getNal!l8dlteD\lin OQMStnD9 naJM!) . in IXlMStrlng localN4!lleI relsesfOOHExeectloo.14 Interface DocumentFragment Intarfaco Docu~er.13 Interface OocumentType interfaca Ooc~entType : Nodo ( n<Ulle .donly attributa NamedNodeMap r ••donly attribute N~edNodeM49 1I Introduced in DOM Leval 21 raadonly attribute OOMStrinq 1/ Introducad in DOM Lavel 2. r. . 1I .~don'Y attribute OOHStrlng ayatemld.lDOMExc~ion) ¡ removeNamodltem{ln OOMString namel rtliseslDOMgxceptionl ¡ Node itemlln un. 0.JdeLillt No'. Int ro'iueed. Node Node SetNamedltem¡ in Noda tlrq) rai.i..

283. lO!!. 490 S_SERVER. _doneO. JO.283 _S ERVF. 347 _allO. 209 l.112 -Jd{)." • .. 332. 215 _COO KIES. 30 _ENV.el. 306 SIITll'_COOKIE_VARS.27. 283..62 ..298 $H1TP _SESS IONS_ VARS.IcIO. 211 . 244 --=t().. 218 _ .. 21S -"'1h"TII00-..72 _POST. JI ( I :. _destIl. • . lOS SUll).71 . 288 :. lOS.t. 217 S_SESSION.31 _SESSION....31 _flo«l..4$ _GEl'. 220 ". • ÍNDICE ALFABÉTICO S $_COOKlE.208 IASqDESCI.219 _oonttnICI.30 _PlLES.. '. 1..phps.. . 212 .. 2Z1 • . 218 _. 298 SJ:¡W. .23 -Jet.72 _. 288 _REQUEST. JO....R. 243..>'. 213 _~().

~1ITTP.419 closeth/'.ITII)'~. 424 eIuIdrm(). 401 . 0526 mnul!zadomlln.1)4 .S21 ALTER TABLE. 424 Ccnv un r!dlml.. In &IT1Iy_rounl_~al\lC$.. 234 c!(lSeS.. 272 apllChc_n:.:hn¡.9 &IT1Iy_mer¡e. 427.hea. 1)4 .lcJ.mI)'Jhcc.. 2.buio rroechod. 428 ALLOW_URLYOPEN.l2J dlCctdatc().SEC110N.I. 282 ambuto IICIlOO. 526 block. 117 COI. Dunbk}.. 130 chawn. IS7 .uile.401 chkCOC1fi" 16 c!unod. n 14. ]2) 183 amy_5hrft. 281 atnbuto enny¡K. 181 unly_vaJ\iC$..unbutes. 74 tUlina.ooptNock.().270 cadena de COnSUll1 (query llrina).l79 amy_\u\sluft.. 1 U ACtO fAIOmK". U. 90 broWseB!>-. 283 camBae R'lUm.. 166 ASP.5oeCucncialc5. 320 appcndChl1d(rIOdo}. IU . XVI asp_lap><Off." 19.326 eluk!Nodea.166 chunk_liphl. 424 banath.. J81 111'501'1..37 ason. 424 ~18J .porIJeJ¡eKdel'1(). 394 COMMENT.. 328. 162 COATAWC:IKIN. 387 . \64. .. 1.prcpmd.NODE.dera().>.. 277 amyt). 326 chop. '17 ASP'T_TAGS..'f'IC.odJ¡Whes. 181 arny_n:~I. 181 &mi)' JIIIJh. 74.111 CL.5. "8 atr'll).41 catch.268 ComenWKJ&.. )61 actuaJEntc.]5! Abm un fM:l!cro. 162 llITIy_WIolt...116 un)'l a50CrlllYOf. 338 'SllCintlvo. 2SO dlpp.8 BotTar un R'glSII'O.426 clotc. CllAR. ). ISO • A uo_'WC tw. 30.520 AUTOINCREMENT.329 elone..321 columnas. JO.5.. \8\ .maLJtuJes.-. 272 e C!!Che·Control. ]94 CDATA. mullldllTlelUlionald.104.178 1IIn)'_$phce.pMl. 'l. 17 1If¡C.ay_ke)'. 341 dKbr.58 Ámblto.. 326 chr.• ~4 • PIIP ~ A TRAVIls DE EJEMPLOS ORA-MA -... ¡'l.433 alu.5eURI.. 424 "tnbulQ().Jik.Kale -O.rny.497 clase abslnK:11l.NODE.14' 1ltI'lI)'...34] AVG.141 ChTOOl.NODE. "9 • B_ de cWD5 R'1Iaonala..401 atnbuto accepc-cl\and..173 . 174 vray -pop. 212 clooeNode. ConsiSl~" 1JoIaIed.245 IU"IV. 2005 c!ass_Hisls. 282 w.204 chus y ncw. '" lITI)'$ no l!eCucncl. ]2. 43' addc$lahs. In. ]53 AdnumllnKlor de OODC... 338. ]]7 tt.243 dearslatcachc. 8' BsocimlivOll. 148 l1/'l1I)'.23 a$XMl.EXPUNGE.520 auto. 424 " -" """""".. J93 ~pllC~_re<jIJe$I. "1 Arra)'lcsclhua. 1'7.. 281 A1TRLBUTE.426 appcndDall. 259 dlectdm.IYJ IRat. 277 case.

395 EJú. 49 di¡k_IOlaI. 50.WARNING. 48 roru. 250.. 5(U 19 E_COMPlLE. 519 E..ERROR.518 do.mcm Ob. 522 dislUra:~ -'" c:ondlCM)Q.. 342 Mver OOBC. 148 cionype. 434 dm~. 213 OEFAULT. 395 endJ¡wllch.. 360 cop)'. 277 DOCUMENT_TYPP.COM~WARNING.m """"""'" "" 395 .44 OUC.. 519 E.Ekment. cocodlnl..NOTICE.. 297 C""/aC.71 de ltpo de documento.428 documc:tIlf!Jemcnl. 426 ~1cfc.429 currenl. 298 cmpl)'.ition.424 Conversión de IIpm... 151 Delelt.429 ~cEnmyRcfertrn. 424 OOCUMBNT_ROOT.342 De<:hu.519 cmou:CDATAScooon..438 doublc.... 394 clcmentJ. 161 coc:ho. 74.. 428 creatcAIInbu1cNS. 76 endwhtle.. 388 oro.\se de dasQ5. 66 Conc:xlÓn oon el confi" 421 aeuor. lBS DECIMAL. 33.. 519 E_USEJLNonCE. SO.90 Docu. 159 o tlal •• 433 dmeO.I9fIC\". 436 enur)' ~fc:n:_ DEI.USER.269 dclctt:Oala.ción de Vanlble5.428 autc. l44 createAlU'lbute.320 counl().. JZO Creación de cooties.ón de 1..328 dltllame.424 OOCUMENT_NOOE. !9 doc.NODIl424 I!lemenloa. 298 Corucnt·En<:od in l·21O Conlenl-~ngth..419 dlr. 71. ]29 dl!llNeJunctJor\J. JJO dL5pLay_nn:D..E'rn FROM..421 documcnlOll XMl. 269 C~.270 c:onllnue.L.. 519 cach. 48 dcfined.s de ~8uridAd. 42B.lCtion...42B OOM. 110. 423 DOMOocumenl.v. 522 cocap~ul. 435 159 cndfor. 397.WARNlNG. 18..oo de .519 E.root. 28 Declaración. 429 creatcProc:eA. 429 E_CORILERROR.519 E.I CREATETASU... 519 E. 341.81 cndif.. 144 CreKióa de ~ JO.1.JS8 counLchar¡. 30.1 ORA MA fHOICE AlJ'ASrnco ~~ oompan:OocumentPoi. 141 eR.19 Consulta de COfllcOldof. 394 documenlURI..SI9 Comantcs. tabla.ERR0R.ERRCR. SO. 519 E_USER..48 Definic~ coo. 39 COOKIES EN PI/P..ción..57 COUNT.. 343 definc. 520 docn:CUI.lt\I(tor. 50.c.illk. 428 crulcComnw:nL 428 autd)ocumc:ntfuJlDm!O.210 ConMantel predefinidas.I nc.260 dale. l3ll 329 Conn«l.COflE.522 Enten:ll.394 EliminacIón de cooklcl.296 Copl. 186 enHblc_dJ. 423 Oocumc:nt Type Ddirution.NOnr./'iODE. b. 270. 519 EJARSE. 89 en1Jl1K'.. 3M OOCUMEN'T_FRAGMENT.. J9H. 342 ELEMENT-.427 c:onstruclOR$. no ~fJOOl.24. 270 Coment-T)'pe. 114 crealeEkmentNS.l4O ere. "29 cruteTutNodo:'.. 295 cookit'll.ect Model.519 E_WARNING. 388 OSN de SIIIema.. 2...lnsl1l. JI enlllta..

47 ¡mmktUI'"lC:. 281 fOfTl'&ll.430 getAltnbuICNS. 3D JC'dm().2(1 p.61 Elpresiooet.243 IdAttribulc.. 269 header('l. 27S..' " 197 función.. ))2 fuoc . filas.)(j1 mtlr_~Iq.-van..~.php·). 048 Func:_ para . 429 cctElemmuByTqName.243 Ilcl_clas.430 ·cl(). 429. 296 Ucqx:loncs. .nDf C11 php.an-'>b 198 Func>onea. 243 ¡d. 186 funOone$!k lMAP (Imrmet MeMqe Aa:eM Ptococon.430 gMllnblueNodc.318 m.. 25] eltcnslon.2AS C. 311...328 final.. 196 fUnctlOCl.92.amecll\emCnombn:). 326 fi lcpennI. JI9 ~SQL.. 424 ENUM. 222 EII:r\I(tura de l..e. l lamci&.318 . 319 (rud..1Ils.ocallon indCJ. 4S1 beMkrO. 252 GROUP BY.4'26 hasClukINodes. etWlCO&. 245 ~~IOII.ICUlfJ. 18S. 197 func_nunl..252 seuype. SI cKtcn<h.347 Hcad.22$ G GATEWAY_INTERFACE. 3 1. 311 f¡cle (deJcnplOf)..• 546 PlIPSATRAvltsoEEJEMPl... 269.08 ~(day. 3l' 1'ade:r.252 FtOAT.31 f\c1l. 233 f¡I'$/ChIId. 191 el'l'oOOl_ 511 SI9 &entura en WI rlChcro. '21 filuhmc.l·4) m'OI'. 424 nOltI.dAlmbutcNock. 431 huAllnOOleNS.. 33 aafeature.. Oc: UftllI. 426 IJob&I. .341 fann de 1ITML. 283 fpuillw. 281 FQnnul. ncr.. 2.328 filc¡roup..342 nOlllvY I. 318 fpvu.522 cllcn~\on_dir .\2'7 fi~tne. 326 file5ltc. 120 fiko .. \86 rwrite. 326 fifo. 430 getEkmcnuByTqNllIfIC:NS. 199 FuocM:lne5 .. 2. 429.NS.52 ¡nutrftime.193 grndalc.o func~arp..311 fK'hctol.. fc<lf. 397 Funciona m:uni\'H. . 319 file_v~ 333.318 f_018 fKCk. 43 1 IwAuribulel.4lO ....243 ¡cLdeclllrctCcl. JI9 uplode. . 430 filectu!le.4S2 ropen.77 GCI. ~'26 filanodc •. 328 snc.77 fon:ach. 224 ~lmaI.43 IdUsaOata.IIbIa.193 GLOBALS. '29S FonmllariDfC11IITMl. '276.JllUCflu:tan.lptl. ni file:.243 gCL_c lasl_methodl.437 guNamedllanNS. 311 '¡elJ$. 98.45S Func_ pan COIUWlta.OS el RA -MA EN1TrY _NODE. 282 geLdass.318 ~O " fclor. 2$9 getda!e.no OCUll(1f. J 17 f¡cls. 424 ENJTTY _REFEREl'CE_NODE..31S for.321 rnEJemau8yld. 347 11 hWldJcr. 320 filctypc. 210 hasAnribvlc.522 FALSE.ioo. COOKIES. ISI HAVING. ¡l8 eJ!pre. 328 filc_CJ. 426 buII..ll FORElGN.

278 hnpd.JUdabk. JI ¡merlu C"tI:IrackrData.45 11_c:xcclltuble. 239 lmplK1Ctlush .arruc:nw. .. 413. 66 i. 437 Intafu NOUItion. 28lI nrrp_"OST. 434 IOstanceof.\1ap. 451 mtpkmcnUlllOft. 1 68 L )9'. 437 !ensilaje: XMl.328 1I_lonl.519 hlmlentlbes. 479 llMf1_headcr().431 Itc:m. 138 unponNode. 435 i'.. 278 IfTTP_POST_FlLES.l83 IIIclude.278 Irnl'_Ef'lV_ VARS.. . JB 426 iJ_1fI'fI1elb1e (.32O il_reÜ.l. 493 I""p_dclc~).433 lSO-3859-l.218 trrTP _ACCEPT_CflARSET.1lI.¡IDI'QlFtqmeIll. 3.amy. 238 IIIUrlu Atlr.• CI RA-MA INOlCE ALfABtnco S47 ltunI_cmlI"I. 435 Interfu Enlll)'Re(ere~ 436 Intafu NlmrdNodt. 30. 433. 393 leve!.-'nICil:!". JO IITIP_ENCODING. 436 Interfaz timpluml_element. 426 inwtOal1. CDATAScction. 140 htm.... 436 lruñu E1emenL 4)(1 InlCrfu Emn)'. 47 II_aml)'.A.12 1. 4)4 inIml<l. JO. 424 ItIIcrlu nodl'l. 159 kl'3Ol1. 3'7 Inac:nar TeI¡5IroS. 427 Inlc'rlu.56. 17 i.lSl. llEqualNodc:. JO.426 idD. 283.319 il_fi le.)41 Indice. 278 1ITTl'_SERVElLVARS.SS ION_ VANoS. 30 IrrrP_GET_ VARS. 46 iI..68 If.cheir.-'nt. 37 Indicc" 37 In fomlBción SOBRE fiche ros.44 laSupporICd. 491 unap_expunae(). 401 Inlafu Te~t. 316 Includo:. 435 Interfu [)oc:wnr.342 IOICI"·31 Intmaca del OOM.520 INDEX.521 I1Itpklde. 419 Lf. 438 K key. 433 Interfaz Commmt. 3. )97 bne 320 reed. DocI. tNT..Jink. clse. 4 5 If .8. 319 In noD D._nummc. 104 mcludc-J'Blh. 413 unap_open().56 msen8cfore."'IOUAGE. 320 isDc!auhN~. 31 9 IS_double. Ir.Ilrin. 244 11ISIJ1IC("10ne5 de proces. 396 IUd.45 IfcomplClo.4' 1'_OO)«t.. 432 In~u. 278 H1TP_AC'Ca'TJ.31 I IT1'1'_St:. 326 INSERT INTO. 437 InlCrfu node.. 4'17 Im'JUecdlbody(). 7Q Imap_appendC). 283.42. 428 II1tplemellt5.elp-=elnElementContenl. na un"_CONNEC110N. 288 IrrrP_REFERER. 426 isWhI1.. JI 1rrIl'_POST_VARS.46 ¡"_u~file. I lastChild.5 Lc:aUI1l dcIde un fIChero. 317 lenllh. 243. 473..04 Itc:m(poIiclÓll). 437 Intcrfu DocumentTypc.. 97 lncl\lde_Of'ICe.3M hb~ml2.45 i..46 i~_dir. 429 ln.palh. [40 H1TP_ACCEPT.cnnf.46 IrrrP_USER_AGENT.278 UTTP_COOKlES_VARS..3)8 I-nodos. 424 IntmlCeS._bool.ISublcl.l5pectak:han.436 lnl~. 433 LAM P. J 19 ¡.

521 mysqUllblen.aIJow_pcrsislenl.-OOles().. -'21 NOTNULL343 Not. SJI mysqUnsert_'(\.521 mcnuja JlTt'P..aciooes.p • 148 PIIP 5 A TRAV~ DE EJEMPLOS CRA-MA lfroel de: c6d'JO.ql. <JI m)'MIl_creJlle_db..338 mu_c~cculJon. 5J 1 mYIOljI. 320. S27 my.439 ~1-.. 19..331 memoria cldll!.529 mY"IUield_fl.il().. 42... 432.529 mysqUctcnJIC!d. 529 m)'''IIJe«:tuuw.. 529 my¡ql. 528 mysqUuutl». 210..cnaot.173 mo~c_upk*k<UHc.tml'. 234 mfl:06o6.5 nodeName.339 m)iCll_do~.J'us word. 429 ns myllll.qJ_cUent_cncodm..52S mysqJ.339 mysqUclm_db.. S2S mY5CjI .528 m)'sql_emtO. .l-"l mysql_conn«t.¡cchosunfo.~9 IoadlrrMLFik.425 nadcValoc:.425 Nombndo de: VUlabl«. 425 I'o(Idt.19.S21 mY5ql_unlluffc:f'c<Cqoery. 53 J my¡¡.528 1odfTML.!&OS mtcodo ~pW1(). 528 IIIY"'ICdrop_db.421 IWJI'lBIlIUJJOtUmc'1\I. 530 mY5qUield_len. S31 my.42S IIClt\' 159 lIC~tS!bhn¡.. 2«1 lI\kurnc:.:¡U:han¡C_uK'l'. 521 MYSQl.¡e1_t1ienUnro.. 530 mY5C!Ulcld_lypt. m)'lq!JecdL_soc.ll'Ca de "empo (IJmcstamp). 529 mY"IUeioeLdb().ume.ldJa"ocUnfo.qI_ODI\MIC1(I.352 253 MIN..ro\'''5.. 32 1 nl. 352 mysqCqL>C:l')'. ni mYIqUnfo(dcscr.dcra~h-J)Ol1 •.5lS mY"lLdtrauh hosl. 3~8 oormahu..SSOC. 352..().du.. 161 LatIIIIodt repsuot. 529 OIy:sqI~urn. 530 m)'sql_db_q~. 221 Manl"jo de dl~1ori()5.352 MYSQL. no 111I8It_quoteJ-Itx:.derault_user. 25 Unk. ))8 my¡¡. S28 mysqC~. 29 lJormahurl. 395 • . 3JJ M)'SQL. 425 Ios-mon..mu.525 mysql.ql. 528 mysqCemlI'(). S27 mysqUiJ&JIl:kb. 521 m.518 In.528 m)'sqUlalaJ«k.52S mYIIIJ_. 530 mysqL.528 • N IUlme.dcfguh. 269. 358 ModJflC. n6 mysqJ.529 mylOIjUelctLobjed. J:! luc.. 528 mysqU'5l.~ .33l mulupanlform-dala. 339 mysqUIJ&_UIblc$.Jile--"u. 5. 529 427 lookupPn:fix..3S2 my. 253 Modlf1Cal' una 1abI.crver_lnfo(de5cr. 19. 332.5JO mY5qUlcld_IW!'Ie. SJO mysqUlcld_tlble..dcfauluockcl.520 lookupN~URl_ m)'lqC~Jlnn&o 532 mY"lLre\C~MTI)'.penllilenl.U!nk~.52S my¡¡.421 Imm.Typ:-..531 mysql-1et_...n8 . 524 manejador.. 340. 340 IIl)"qLm'Of.:¡LdolcO. 347 Iood. 529 m)'5qUecdUeIll1M.m.pconn«t.10 ID)'sqLdb_namt.530 my5qUleld.. 1ocaIName. 436 namesJlllCcURI.SOTII.CetCIflCJlnn&o 532 my¡qlJ"9ult. J39.t.3D mkllme(). 521 m)'lql_query(). 268 mtcodo ~tnbuu-...ffeClecUowl().53 1 mY5C!1. 406 ~...)eCk. mysqCnllm_fidd..S I 8 InIl"ic_quOlc_J\lllllme. 329 mernory_Itnut. S3 1 mY5C!UIftJe$uh.". 249 MAX. (dc:al:U:OOUiOII).2()4 InICI'lXU1IC. l40 mYiCI1 _affectccCrows...529 MYSQL-".3" ml..

204 COBe en unu. 282.ción de rcllllrOS.49 PHP3.clchr.iru. _. 229 owlltrDoc:umenl. 4:\6 php_~. 54 ~ de Complf1lClÓfl.ll. XIV PHP_AUTllyw. .5. 439 prev. 2711 PHP~UTH_USER.2 PUP. 183 RDBMS ('Rellllonll DaI. II PHP. 4JS notMions. 239 ITI poi.• CRA-MA fNDICE ALFABtnco 549 NOTA110N. 269. 228 ptotocolo de coneo SMTP (Simple M. de los operadores. 34 1. . 278 Pl"nrusot. 43.v1d&. 269 Ordcn. 39.59 POST. 424 f'roccUIIl&Jnttn. 227. 54 Opendorde e}CCUC1Ón. 331 pmI_mu. j l. XI.4l) prop~ 39. 214. 386 open.277 (luOIemeta.5. 191 Panimeuus por valor. 57 OpcndorcsAn~51 Sl8 prefil.. 11\JlNCtK)M. 63 con fichero. 159 pnwiousSibhng.aba$e Mana¡emenl S. 62 PllP. 278. 191 PIlr1hnelrOli por referencia.214 pnvll&e..'" phP_UfCI\. 52 ~ de cadt:nu..29.l64 aRDER BY. 352 ordmar.-li~c:. 196 Nl1mmx en coma flotante. 432 p publidd..3 28 Recorm. 72 0pI101l$.42A ncKallOnNune.520 opcndir.:Ircs.425 PRIMARY KEY. lS5 phpmfo().. 318 • PHP_AUTH_TYPE.ll1lle. 261 pnlCOCOIo KITP. 279 recQrT'e1. 232 QUERY_STRING. 270 PTec~nd. 228 proct:Ifdores. 181 pt:lKionel.4096. JJ3 PHPIFI. 56 Opcl'llllor« de Incremenlo '/ DccrcmenlO. 2n MIP_VERSION. 61 Opcndor pan la omiUOn de mmsajcl de nnx'.390 Open DamBose COlICCllvny.521 odbc_rreeflsultO.425 parsen XMI.l. 269 Q Par'meuus por Ik:feclo. 204 ptotcetcd. 49 mimcro variable de panlmeuus. 347 proceain.9 o 31 obJC'05. 396 PI' .IIO pnntf. 54 • Opcradon:$ lógicos. 29 phplnfo.15 7 Recorridos. 390 ob~I. 191 paren!.JCtion. 267. .419 opcn_baSC(hr. 42j ownerEkmen!. ISS . 526 odbc_cloK().321 (}pI::~ Prasma.un fichero. 337 re. 60 (}per8IiI. 27&. 19.334 ptlbl~214 O\'cmdlng.dd"ultlrl ... 134 plU"CnlNodc.62 PlIP_OS. 321 rcadfilc:.390 polimorfismo. 1.34) pnm.325 php.450 ProlocokI de Transfnmcll de Hipet1elU06. y DUEÑOS EN UNlX. 390 odbdJetch_rowO. 279 R range.. 393 PATICTRANSLATED./5tem). 39. odbc_c:onnectO..5.INI. 62 Operad!es a nivel de bll. 436 Pul. ]8. J I !i opcntdor de concatenación. 318 ~!ltlI: .425 pre5Ct'YeWhileSpace.390 odbc_do{). Ij7.JiELP. 391 odIx. Opetacbt!$ de AAIII3ción.]~ f'ROCESSINCUNSTRUcnON_NODE. J9S polu.N00E. 18.II Tnonsfer ProtocoI). 33 NUu.INI. J93 ~ilion. PI.

¡c_maxlireume. 43 I • } SAPI.!l24 sobrecarp.4)1 ~1"c(). JI3. 395 ~II!11n'_UJC_ar¡v.. S24 setldAllnbutc:....342 SM11'.522 scuiOllJlaftC):.. 313. 312.399 slIIlplu. 427 SHQRT_OPEN_TAO. 52<1 ~lOn.from. 438 5CtNamcdllemNS.SOFTWARE SERVEILSOFTWARE. 524 1e$51Q1\.. 312.. 19. 3 1J. 359 Sm. 277 SERVER_SIONAruRE. )10 sesslon_destrOyO.02 5CtNasrxdllcm.how_source.43 ~I Usc rDft l~ .. 278 R[Marn.!l2J ItMIOIICache_CKplrt:. 29. 278 ~1DO\I~Annbule. 52] Jessloo.323 SCSSloo. mlc:fimclÓll.rCIUllc.J.312.ve.. ] 1]. 277 SERVEILPORT.308 _16< Mm..S24 I relWne.4S2 5eUl0ll_1l11l\'8Isl.coollcJ. 3 10 ~5>OII_~oookle~.OMIN.. 13.312 size. !l22 safc.•ECT. I !l8 SMALUNT.scrialmdwldkr. ) 1O.lIJ. J 12.paramt().4J2 $elldAUribulcNS.c..ENAME. 18. 310 session_id(). 22. 5ei5101\. IJO leUM)lu... 523 :518 298. 195 rcwuid.438 SETIERS &. 394 SEEK. 5D 5eSIIOO. 29. 523 ~name.218 Se<:dl)fl9 CDATA.. 429 replaceOllld. llJ. 30. J03 JeHIOII •• LI'O_SW1. 430. JOB 5e5S1011_1lnJet().cookie_domain.347 &cndrruul.319 selAnribllle. 43 1 reltJOVeAnnbulCNS.O I ICtAllribuu:NodeNS. !l2~ SERVIlRJ.2.wUlnn¡(cadenro). l 64 .modCellcc_dlt. OElTERS.5 A TRI.3 1 0 K:SSIOnJWt{). SU RSsIOn..entropy_kn&th.277 REQUEST_URI..3 10 session. 5 18 RtMOTE.408 setAnribulC. 107 reK1.probablhry. 21S senype. 312. 3 1] sewloMnlropyJjIc. 271 ItNldorellMAP. "34 repIICCWhoIeTcxl.4J2 setldAnnbutc:Nock. 398 SlmpIUmJ..9 SimpleXML.JrnporLdornInodo). W RMlOllJlame().J*h. 398 simpluml.Nodt.. 318 St!8L1ritbd en mysql. 3..Jllvc-"andlcr.'23 K$SIOII.NAME. ~25 ICrnlm. 159 R:turn. 312. 4S8 session_eocode{). J 13.FiIe.45O ldiones ni php.. 09 Mvdrt'Ml. JO.tiI-PII1h. 399 sioo"LlIO_Sl..t:a"heJlmIlCl'". 52] 5Csslon. 304.. J 12. J12 RUioo. 310. 4S8 s safe_mode. 304.POfI:T. 523 stSSlOn. 2 18 sort.. 523 RSliIOlUllHi-J*ih. 30!1 1eSSI000000tIMtt. 524 RSlilon_cache_up.N1 ~291 ItbtI1lllTypclnfo. vts DE EJEMPLOS CRA-MA . 229. 391.ult_only_cooItia.¡et_cooklt..522 safe_lDI)de.. 332 $I~. SI? s. SEEK_CUR y SEEK.) 10 session_ellcode(dbto. se5Slon.mUo.J91.523 ~f~_~k.09 S~.re5. 232 Rercl'el'lelU a cnlldades.522 safe_modc.. 438 R[OISTE~OLOBAl. )04 sessio'Us_rt:Il5kred.\lIIe_CIXlkiet. 102.u~_tnmJJid. 218 SCRIPT. 427 n:placeo.JC...END.SIIT.¡id. 313..cooku"J«:uK'.ll.eI'(.9 save. 421 removcNamWllCm. JO. 19. 4S8 SIIT. 438 R:~amcdhcmNS.J\DOR.431 removeCluld.Uilc(fichcro). 523 X$llOI\.278 SERVEILNAME.Jnel\ldl:_dlf.434 REQUEST_METIlOD. 218 SERVEILPROTOCOL.09 \avdITML.343 $CLfilc_burrerO. 43 1 $etAllnbu!eNS.pllth.398.] 18 rewinddll".323 I11'IIhr..278 !'equin:o 1 06 rcqulre_orl(:c.• '''' PUP.). 43 1 rel'MVeAllnbul~ode. 432 SCRIPT_F1l. 218 SERVEIl.S. 1.l20 renameNodoe.cool..

222. liS stn.343 TINYNT.trin¡. 364 :sqhle_lul_trror.. 321 Nahc. 114 $U1Wc:a5eCmp. 168 Iqh1e_ehan¡es. 169 unwt. 62.426 tIvow.C RA-MA lNOICEAU'ABtnCO '51 • lp«iflCd.2S3 ItnCtErr'ofOleocking.ICOftItnt.. J64 aqlJlc_nUIT\..J43 TIMESTAMP.73 .2s. tqlJte.366 "Iht'_MC_p"'_.mp. 113 _229 ~111 • j SQL (Stnx:U¡nd Quny~).. • ___ . 134 1U'lSU'.ftpcaL. 363 5qlnt_m'OI'Jl1ln¡... 134 ttnpduha.lt.. 368 sqlite_fclclLalTl. 136 JtnOIowu.. 122 ltmrnIp. m.4)O tar¡et. 362. 130 TRUf!.ase<:nlp. 118 smpn. 366 SQLITE_NUM.PAO_RIGHT.IJ ] r. 362. 36l Jqluc.2!iO TIME. ]42 strJCplact. ]JI STR. 194.270 tnm. 320 Tncc. I U . 432 Jp~t. J6J SQtJTE.i.364 sqliudicld_naffiC.363 fKllltc_fcLcILSlring. no JIIbW. 428 11n"" 31. IIJ\()1.364 sqll1ejlu_more... 133 strtr.142 WTpoa.Ippcr.. 120 $trchr. ~20 Tf&II. 137 iphlTe. 366 iqh~_qucry.342 tipo mululfnca. 121._qucry.424 lCJ.1I5 Mm:v.yslemld.erron. 435. 122 ~l'UIcmp. 341 . 25 tmpJl. 171 ucfi. 362.ftwllw.UNIr_toont. 367 sqlncJICJ.. 24~ Iry/clIlch.JlOPCn. J62.361 S(JT'Chr. 133 uUort. 124 wbttnn8D. 234 Subir Ikhoerol. 362. IIrtOCUTle.)4 IU'lpcslashu. ]29 lut.. J64 5qhle_open. tahlu. 133 UClll-ordJ.225 Iwitcll. 363 SQLITEOATABASE. 03 t~~320 J62 sqhte.. 428 5l_().245 Iype.. 119 Itrftimc.223 Nr. 363 SQUTE.116 strien. 338 419 tqNamc.t.434 luperelasc. 362 "I11~ m. 363 Iqhte_bul)'_umeout.. 131 STR_ PAD_BO'Ili. 121 TEXT I BLOB..lftL 362.363 sqhLt_fCLch_$inglc.fet'-l!ncodinl..367 tqhU"_IIdCmcoddllnaJ)'. 119 Ilntr... 419 U lIUOft..131 STR_PAO_LEFf. 365 iqhtt_1Jdf_decode_binary.... 436... ]20 IlI'Clipn. J64 Jq1ue_cum:nL. 128 suval.364 ¡qhte_clo6c. 4~ tpriMf.362 ¡qllt~_coIullVl. so try.pad.24S umc.ta. 47 JIIbcla5e.l23 !. .J'DWS. 437 T Iq..tr. 126 Itn. 363 ¡¡qluc_num_lidds.l26 UNIQUE.Sorn...8lTle..lrflplaee. 332 1OIM:h. 342 TEXTjlODE. 36'il ltandalonc.ASSoc.269 nck.367 tqlt\e'_unbutra-rd_quuy.366 Iqhte_hbcncod!nI·367 5qhlcJih~ersH)n. 338 SQUt~. 332.

OK.19J VIri.. 428....itl\lCtO.IIdor........lllli. opcidn).. O_URR. 42 J...1mtparser_cn:ftle(codificaci6n).411 aml .. J)2 UPLOADJiRIUNLSIZE.&eU':ulTenUnlC_numbcr... 333..411 • .naUz. 435 VI'" 270 .NOJU.ERR..oor).t..518 z Zcnd. 449 526 uocb:.oer...penIMenI_I. lB ...33O xml.412 lJJ UPLOADJiRR.. 521 uploaIUmr_dir. 188.... 409 xmJ. 394 WIIIUlII..nown.410 xptlb(eamanol.unUd_notaIlofUkcChandk:I-.n~_~. 19J Vllf\llbiel prederuudas.ult_db.. n6 ~dcrau1t..p&l'K't"~op'lon(ana. 31 J u~ulir . "1 Unhnk. 419 xmJ-parseJnloJI!\JCI.pll'$ejnto ... 86 wbokTul.!ocJ. 410 .lCLoption(anaJiudor..on.. 35. opción. 401 y vanabIa: ..cter_drota. XIV vmion.. 261 url_rt:wrilcr..proceulllJ-lnltNCUonJwdIa-. 193 VlrillbksklcakscsdtK:a¡. 409 Xml...)landler...5 UPLOAD.192 uodbullow~.JIW.dcr8UI~UlCt".460 u.bylt_Inde. 4 16. 341. .oc.. 521 uploadl.&et-curret\l_coIulTIILnumber. 333. JUUl. 304..412 xml-PlII'Ser_crcftIC_n${codilicaciÓn. 409 xml-p1lI'5t:f'Jr«(. kIaIes. w WlC.hik.410 v n1ue...emJf.b1el.ftfJandler. .411 ...419.. 412 xml ..C.411 . WHERE.~_~_e~k~. 28.l et3\1rren1..321 Wlkowlllype. )()8 UNSET. 3JJ upIO"CINIK_filcsl1...21O Webnlall.r·()MCSlZE..J21 u!lOl10.ITIU.44. 410 JomL5eLdefauIUandkr. v-." LI un1-P"'loC.342 vanables de -on.409 xmCtd-char.ltrU\I. 414 i x 526 uodbI. 412 unJ.bk:I de vmablcs.extemaJ_enuty. 332. 269.. 526 U'PDATE labia. 3)1.mu_hnkP-1.lll.. J9J v. 409 URL o 1.}'ARnAL.1 32 UPLOAD~RR. 29 van. 411 xml.J56 VARCHAR.. 526 \ICXIIe.O .4)J VALUES. • • uru.I69 ulf8_deo:odc...410 Joml_td_~enuly_ded~.mI_iel.1obUea.. 30.. parser.E..320 untel()).mI_Id. 451 V.JludoT UnlfOl'TTle de Recursos.-bles. )32 lIPt. 526 uocb:.¡et_m'OI'"_code. separador).

You're Reading a Free Preview

Descarga