You are on page 1of 449

Contenido en un vistazo

Introduccin................................................................. 1
Parte 1:desarrollar una aplicacin Web con
Base de datos usando PHP y MySQL ............................. 7
Captulo 1: Introduccin a PHP y MySQL .................................................................. 9
Captulo 2: Preparar su ambiente de tra b a jo.......................................................... 21
Captulo 3: Desarrollar una aplicacin Web con base de datos ............................. 37

Parte 11: La base de datos MySQL ...............................65


Captulo 4: Construccin de la base de datos .........................................................67
Captulo 5: Cmo proteger los datos ...................................................................... 93

Parte 111:PH P ................................................ 115


Captulo 6: PHP General......................................................................................... 117
Captulo 7: Bloques de construccin PHP paraprogram as................................... 147
Captulo 8: Datos entran, datos s a le n .................................................................... 191
Captulo 9: Mover informacin de una pgina Web a o t r a ....................................259

Parte IV: Aplicaciones ............................................. 281


Captulo 10: Unirlo todo ........................................................................................ 283
Captulo 11: Construir un catlogo en ln e a .......................................................... 295
Captulo 12: Construir un sitio Web exclusivo para miembros ............................ 333

Parte V: Los diez m s ....................................... 361


Captulo 13: Diez cosas que querr hacer usando funciones PHP .....................363
Captulo 14: Diez descuidos frecuentes en P H P .................................................... 371

Parte VI: Apndices ....................311


Apndice A: Instalacin de MySQL ....................................................................... 379
Apndice B: Instalacin de PHP ............................................................................ 395
Apndice C: Instalacin y configuracin de Apache ............................................ 409

Indice ..................................................................... 621


Tabla de Contenidos
Introduccin................................................................. 1
Sobre este libro ........................................................................................ 1
Convenciones utilizadas en este lib r o ......................................................2
Lo que no necesita leer ............................................................................ 3
Suposiciones ingenuas .............................................................................3
Cmo est organizado este lib ro .............................................................. 4
Parte I: Desarrollar una aplicacin Web con Base de
Datos usando PHP y M yS Q L........................................................ 4
Parte II: Base de datos M yS Q L ........................................................ 4
Parte III: PHP ................................................................................... 4
Parte IV: A p licacion es..................................................................... 4
Parte V: Los diez m s ...................................................................... 5
Parte VI: A p n d ices......................................................................... 5
Iconos usados en este libro ..................................................................... 5
Y ahora adonde ir? ...........................................................:..................... 6

Parte 1: Desarrollar una aplicacin Web con


Base de Datos usando PHP y MySQL ............................. 7

Captulo 1: Introduccin a PHP y MySQL ...................................................... 9


Qu es una aplicacin Web con bases de d a to s ? ................................. 10
La base de d a to s ............................................................................ 11
La aplicacin: Mover datos desde y hacia la base de d a to s 12
MySQL, mi base de d a to s ........................................................................13
Ventajas de M yS Q L.........................................................................13
Cmo funciona MySQL .................................................................. 14
Comunicacin con el servidor MySQL ..........................................15
PHP, un movilizador de d a to s ................................................................. 15
Ventajas de P H P ............................................................................. 16
Cmo funciona PHP .......................................................................17
MySQL y PHP, la pareja perfecta .............................................................18
Ventajas de esta rela cin ............................................................... 18
Cmo funcionan juntos MySQL y P H P .................. u r~ ........................... 19
Mantenerse al da con los cambios en PHP y MySQL ............................19

Captulo 2: Preparar su am biente de t r a b a jo ............................................. 21


Las herramientas necesarias..................................................................21
Encontrar un lugar para trabajar ........................................................... 22
Un sitio web de la com paa......................................................... 22
Una compaa de hospedaje de sitios w e b ................................... 24
PHP Y MySQL Para Dummies, 2da Edicin

Montar y manejar su propio sitio web ........................................ 27


Probando, probando, 1, 2, 3................................................................... 32
Someter PHP a p ru e b a ................................................................. 32
Someter MySQL a p ru eb a .............................................................33

Captulo 3: D esarrollar una ap licaci n W eb con base de datos 37


Planear su aplicacin Web con base de datos ..................................... 37
Identificar lo que espera de la aplicacin ................................... 38
Tome en cuenta a los usuarios .................................................... 40
Hacer que el sitio sea fcil de usar ..............................................41
Dejar espacio para expansiones.................................................. 42
E scrbalo.......................................................................................42
Presentamos los dos ejemplos creados para este lib ro ....................... 42
Cosas para v e n d e r ............................ 43
Slo para Miembros .....................................................................43
Disear la base de datos .......................................................................44
Escoger los datos .........................................................................44
Organizar los datos ......................................................................46
Disear las bases de datos de los ejem p los...........................................51
Proceso del diseo del Catlogo de mascotas................................. 51
Proceso del diseo del rea Slo para miembros ....................... 53
Tipos de datos ...................................................................................... 56
Datos de caracteres......................................................................56
Datos num ricos.......................................................................... 57
Datos de fecha y hora ..................................................................57
Datos de enumeracin..................................................................58
Nombres de los tipos de datos en MySQL .................................. 58
E scrbalo...................................................................................... 59
Un vistazo a los diseos de las bases de datos de los ejemplos ..........59
Tablas de la base de datos de Cosas para vender ...................... 60
Tablas para la base de datos Slo para miembros ..................... 61
Desarrollar la aplicacin ...................................................................... 62
Construir la base de datos .......................................................... 62
Escribir los programas ................................................................63

Parte U: La base de datos MySQL...............................65

Captulo 4: Construccin de la base de datos ......................................... 67


Cmo comunicarse con MySQL ........................................................... 67
Construir consultas en SQL ........................................................ 68
Enviar consultas en S Q L ....................................................................... 69
Construir una base de d a to s .................................................................75
Crear una base de datos nueva ................................................... 75
Cmo borrar una base de d a to s .................................................. 76
Cmo agregar tablas a una base de datos .................................. 76
Cmo cambiar la estructura de la base de d a to s ........................ 78
M over datos hacia dentro y hacia fuera de una base de datos ........... 79
_____________________________________ Tabla de Contenidos ffj
Agregar informacin ..................................................................... 80
Cmo recuperar inform acin........................................................ 83
Cmo combinar informacin de tablas .........................................89
Cmo actualizar informacin......................................................... 93
Cmo eliminar informacin .......................................................... 94

Captulo 5: Cmo proteger los datos ............................................................. 95


Controlar el acceso a sus datos ............................................................. 95
Comprender los nombres de las cuentas y los hostnames ..........96
Aprender ms sobre contraseas ................................................. 98
Echemos un vistazo a los permisos .............................................. 99
Cmo configurar cuentas MySQL .........................................................100
Identificar las cuentas existen tes................................................ 102
Cmo agregar cuentas nuevas y cambiar permisos ................... 102
Cmo agregar y cambiar contraseas .........................................104
Eliminar permisos ....................................................................... 104
Eliminar cuentas........................................................................... 105
Respaldar sus d a to s .............................................................................. 105
Restaurar sus datos .............................................................................. 108
Cmo reparar tablas .................................................................... 108
Cmo restaurar de una copia de resp ald o..................................110

Parte 1:P H P ................................ 115


Captulo 6: PHP General ................................................................................. 117
Agregar una seccin PHP a una pgina HTML ....................................... 117
Escribir enunciados P H P .......................................................................120
Usar variables P H P ................................................................................ 123
Dar un nombre a una variable ..................................................... 123
Crear y asignar valores a las variables ........................................ 124
Lidiar con avisos ....................................................................... ..125
Usar constantes PHP ............................................................................ 126
Trabajar con nmeros .......................................................................... 127
Trabajar con cadenas de caracteres .................................................... 129
Cadenas entre comillas sencillas versus cadenas
entre comillas dobles ............................................................... 130
Juntar cadenas............................................................................. 132
Trabajar con fechas y horas ................................................................. 132
Formatear una fecha ....................................................................133
Almacenar una marca de tiempo en una variab le....................... 134
Usar fechas con M yS Q L ............................................................... 136
Comparar v a lo re s ..................................................................................136
Hacer comparaciones sim p les.....................................................137
Hacer coincidir cadenas de caracteres con patrones .................139
Unir comparaciones con and/or/xor ....................................................143
Agregar comentarios a su programa ....................................................145
PHP Y MySQL Para Dummies, 2da Edicin

Captulo 7: Bloques de construccin PHP para program as ............. 147


Enunciados simples tiles ................................................................... 148
Usar enunciados echo .................................................................149
Usar enunciados de asignacin...................................................152
Usar enunciados de increm ento..................................................153
Usar e x it ....................................................................................... 154
Usar llamados a funciones .......................................................... 154
Usar arreglos PHP ................................................................................ 155
Cmo crear arreglos.................................................................... 155
Cmo visualizar a rre g lo s.............................................................157
Cmo quitar valores de los a rre g lo s ........................................... 157
Cmo ordenar a rre g lo ................................................................. 158
Cmo obtener valores de un arreglo .......................................... 160
Cmo moverse por un a rre g lo .................................................... 162
Arreglos multidimensionales ...................................................... 164
Enunciados condicionales tiles.......................................................... 167
Usar enunciados i f .......................................................................168
Usar enunciados switch ..............................................................171
Usar c ic lo s ............................................................................................ 172
Usar ciclos f o r ............................................................................. 173
Usar ciclos while .........................................................................176
Usar ciclos d o..w h ile................................................................... 178
Ciclos infinitos ............................................................................ 179
Escapar de un ciclo ..................................................................... 181
Usar funciones......................................................................................183
Usar variables en funciones........................................................185
Cmo pasar valores entre una funcin y el programa principal .....186
Usar funciones incorporadas...................................................... 190

Captulo 8: Datos entran, datos salen ........................................................191


Funciones de PHP/MySQL.................................................................... 192
Hacer una conexin ............................................................................. 193
Conectarse al servidor MySQL ................................................... 194
Seleccionar la base de datos c o rre c ta ........................................ 197
Enviar consultas SQL................................................................... 198
Extraer informacin de una base de d a to s .......................................... 199
Enviar una consulta SELECT....................................................... 199
Extraer y usar los d a to s .............................................................. 200
Usar funciones para extraer d a to s ............................................. 207
Obtener informacin del usuario.........................................................211
Usar formularios H T M L .............................................................. 212
Hacer que los formularios sean dinm icos................................ 217
Usar la informacin del form u lario.............................................230
Revisar la informacin ................................................................ 233
Dar a los usuarios la oportunidad de escoger, con
mltiples botones de envo ..................................................... 242
Insertar informacin en una base de datos ..........................................244
Preparar los d a to s .......................................................................244
Tabla de Contenidos

Agregar informacin n u e v a .........................................................247


Actualizar informacin existente ............................................... 251
Poner la informacin en archivos ........................................................254
Usar un formulario para subir el a rc h iv o ................................... 254
Procesar el archivo cargado ....................................................... 255
Unir todo ..................................................................................... 256

C aptulo 9: M over inform acin de una pgina W eb a otra ................. 259


M over a su usuario de una pgina a o t r a ............................................. 259
M over informacin de una pgina a o t r a ............................................. 263
Agregar informacin al URL.......................................................... 264
Almacenar informacin mediante coo k ies.................................. 269
Pasar informacin con formularios H T M L .................................. 271
Usar sesiones PHP ................................................................................ 272
Cmo funcionan las sesiones PH P............................................... 272
Abrir sesiones................ 273
Usar variables de sesin P H P .......................................................273
Sesiones sin cookies ....................................................................276
Hacer privadas las sesion es........................................................ 278
Cerrar sesiones PHP ................................................................... 279

Parte 1(J: Aplicaciones ..............................................281

C aptulo 10: Unirlo todo ................................................................................... 283


Organizar la aplicacin.......................................................................... 283
Organizarse en el nivel de la ap licacin...................................... 284
Organizarse en el nivel del program a..........................................284
Mantenerlo en p r iv a d o ......................................................................... 290
Asegure la seguridad del PC ....................................................... 291
No deje que el servidor web muestre los nombres de archivos 292
Oculte las cosas............................................................................ 292
No confe en la informacin de los usuarios............................... 293
Use un servidor web seguro ....................................................... 293
Completar su documentacin .............................................................. 294

C aptulo 11: Construir un catlogo en lnea ........................................... 295


Disear la aplicacin ............................................................................ 295
Mostrar mascotas a los c lien tes..................................................296
Agregar mascotas al c a t lo g o ......................................................297
Construir la base de d a to s ................................................................... 297
Construir la tabla M a sco ta .......................................................... 298
Construir la tabla Tipodem ascota...............................................301
Construir la tabla C o lo r ...............................................................302
Agregar datos a la base de datos ................................................304
Disear la apariencia............................................................................305
Mostrar mascotas a los clien tes..................................................305
Agregar mascotas al catlogo...................................................... 309
PHP Y MySQL Para Dummies, 2da Edicin

Escribir los programas .........................................................................312


Mostrar mascotas a los c lie n te s................................................. 312
Agregar mascotas al catlogo...................................................... 318

Captulo 12: Construir un sitio W eb exclusivo para miembros . . . .333


Disear la aplicacin............................................................................ 334
Construir la base de d a to s ...................................................................335
Construir la tabla Miembros .......................................................335
Construir la tabla Entrada.......................................................... 338
Agregar datos a la base de datos ............................................... 339
Disear la apariencia ........................................................................... 339
Pgina inicial de la tien d a........................................................... 340
Pgina de reg istro....................................................................... 340
Pgina de bienvenida a los miembros nuevos................................ 343
Seccin Exclusivo para Miembros ............................................. 344
Escribir los programas ........................................................................ 344
Escribir Pgina inicial de la tienda de mascotas ................................. 345
Escribir L o g in ..............................................................................346
Escribir Nuevomiembro ............................................................. 357
Escribir la seccin Exclusivo para M iembros................................ 359
Planear para c r e c e r ..............................................................................360

Parte V: Los diez ms ............................................. 301


Captulo 13: Diez cosas que querr hacer usando funciones PHP . . . .363
Comuniqese con MySQL ....................................................................363
Enve un mensaje electrn ico.............................................................. 364
Use sesiones PHP .................................................................................366
Detenga su program a........................................................................... 366
Maneje arreglos ................................................................................... 366
Revise en busca de variables............................................................... 367
Formatee v a lo re s ..................................................................................367
Compare cadenas con patrones ................................................. 368
Averige sobre las cadenas ................................................................. 369
Cambie las maysculas o minsculas de las cadenas ........................369

Captulo 14: Diez descuidos frecuentes en PHP ....................................371


Faltan puntos y c o m a s................................................................ 371
No hay suficientes signos de igual ............................................. 372
Nombres de variables mal e s c rito s ............................................ 372
Faltan signos de d la r ................................................................. 372
Comillas revo ltosas.....................................................................373
Output invisible .......................................................................... 373
Arreglos num erados.................................................................... 374
Incluir enunciados PHP .............................................................. 375
Parejas faltantes ..........................................................................375
Parntesis y corchetes con fu sos................................................ 376
Tabla de Contenidos xrii
Parte Vh Apndices.....................................................377

Apndice A: Instalacin de MySQL ......................................................379


En Windows ..........................................................................................379
Descargar e instalar M yS Q L ........................................................ 380
Iniciar el servidor M ySQ L.................................................. 381
Configurar el servidor para que se inicie cuando se inicie el PC 383
En Linux/Unix ...................................................... 384
Usar RPM (slo para Linux)......................... ............................... 384
Desde archivos binarios ............................................................. 386
Desde archivos fuente ................................................................ 389
En Mac .... 391
Configurar M yS Q L .............................. 393

Apndice B: Instalacin de P H P ..............................................................395


Instalar PHP en Unix/Linux/Mac con A p a c h e .......................................395
En Unix/Linux...............................................................................395
En Mac OS X ..................................................................................398
Opciones de instalacin...................................................................... .401
Configurar Apache para P H P ............. 402
En W in dow s............................................ 403
Configurar su servidor web para P H P ................................................. 405
Configurar A p ach e....................................................................... 405
Configurar IIS ....... 406
Configurar PHP ................................................................................. ...,407

Apndice C: Instalacin y configuracin de Apache ....................... 409


Seleccionar una versin de A p a ch e..................................................... 409
Instalar Apache .... 410
En Linux/Unix................................................... .......410
En W in d o w s ........................ 414
En Mac .......................................................... 418
Configurar Apache ...............................................................................419
Cambiar configuraciones ........................................................... 419
Cambiar la ubicacin de su espacio w e b .................................... 420
Cambiar el nmero del p u erto ...............................................420

Indice..................... 4 2 /
Introduccin
4}

#<^ienvenidos al emocionante mundo de las aplicaciones con bases de da-


para la Web. Este libro brinda las tcnicas bsicas para crear cual
quier aplicacin con bases de datos para uso en la Web, pero definitivamente
le recomiendo que empiece con una que sea bastante simple. En este libro de
sarrollo dos ejemplos de aplicaciones, ambas escogidas para representar dos
tipos de aplicaciones frecuentemente encontrados en la Web: catlogos de
productos, y sitios restringidos a miembros o clientes que requieren que el
usuario se suscriba y se registre por medio de una contrasea. Las aplicacio
nes de ejemplo son lo suficientemente complicadas, requieren ms de un pro
grama y usan un gran de variedad de datos y de tcnicas de manipulacin de
datos. A la vez son lo suficientemente simples de entender y de adaptar a una
variedad de sitios web. Despus de dominar las aplicaciones simples, podr
ampliar el diseo bsico para incluir toda la funcionalidad que pueda imaginar.

Sobre este libro


Considere este libro com o su gua amigable para crear aplicaciones con ba
ses de datos para la Web. Este libro est diseado como texto de referencia,
no como un tutor, de modo que no tiene que leerlo de principio a fin, a me
nos que as lo desee. Puede empezar a leer en cualquier punto del libro, en el
Captulo 1, en el Captulo 9, dondequiera. He dividido la tarea de crear una
aplicacin con bases de datos para la Web en porciones manejables de infor
macin, as que revise la tabla de contenidos y localice el tema que le intere
sa. Si necesita conocer informacin de otro captulo para entender el captulo
que est leyendo, yo har referencia al nmero del captulo.

Estos son algunos ejemplos de los temas que comento en este libro:

| u0 Construir y usar una base de datos MySQL

| u0 Cmo agregar PHP a archivos de HTML

u0 Usar las caractersticas del lenguaje PHP


u0 Usar formularios de HTML para obtener informacin de los usuarios

| u0 Mostrar informacin de una base de datos en una pgina web

1 v0 Almacenar informacin en una base de datos


PHP y MySQL Para Dummies, 2a Edicin

Contenciones utilizadas en este libro


Este libro incluye muchos ejemplos de instrucciones de programacin en PHP,
instrucciones de MySQL o cdigo HTML. En este libro tales instrucciones se
muestran en un tipo diferente de letra que se ve como la lnea siguiente:

Una instruccin de programacin en PHP

Adems, a veces se incluyen dentro del texto de un prrafo trocitos o trmi


nos clave de PHP, MySQL y HTML. Cuando sucede, el texto especial en el p
rrafo tambin aparece en el tipo de letra mostrado, diferente del tipo de letra
usado en el prrafo. Por ejemplo, este texto es un ejemplo de una instruc
cin de PHP que muestra el texto exacto dentro del texto del prrafo.

En los ejemplos, a menudo ver algunas palabras en letra cursiva. Las pala
bras en cursiva son tipos generales que deben ser reemplazados con los
nombres apropiados especficamente a sus datos. Por ejemplo, cuando vea
un ejemplo como el siguiente

SELECT campol, campo2 FROM nombredetabla

sabr que c a m p o l , campo2 y nombredetabl a, dado que estn en cursiva,


deben reemplazarse con nombres reales. Cuando use estas instrucciones en
un programa, posiblemente lo har de la siguiente manera:

SELECT nombre, edad FROM Cliente

Adems, podra ver tres puntos (...) despus de una lista en una lnea de
ejemplo. No es necesario digitar los tres puntos. Los tres puntos solo signifi
can que puede tener tantos elementos en la lista com o desee. Por ejemplo,
cuando vea la lnea siguiente

SELECT c a m p o l ,c a m p o 2 .... FROM nombredetabla

no necesita incluir los tres puntos en las instrucciones. Los tres puntos solo
significan que su lista de campos puede ser mayor de dos. Significa que pue
de continuar con c a m p o 3 , campo4 y as sucesivamente. Por ejemplo, su ins
truccin podra ser

SELECT nombre, edad, estatura, tal 1adelzapato FROM Cliente

De vez en cuando tambin ver algunas cosas en negrita. Pngales atencin


porque indican algo que quiero destacar o algo que debe digitar.
Introduccin

Lo que no necesita leer


Alguna informacin en este libro est marcada como Cosas tcnicas con un
icono a la izquierda. A veces encontrar estos temas tcnicos en un recuadro:
Considere esto com o informacin que no necesita leer para crear una aplica
cin con bases de datos para la Web. Esta informacin adicional puede conte
ner detalles ms exhaustivos o, a veces, describe tcnicas que requieren de
ms conocimiento tcnico para ser ejecutadas. Algunos lectores podran estar
interesados en la informacin o los mtodos tcnicos adicionales, pero sinta
se en libertad de ignorarlos si no los encuentra interesantes ni tiles.

Suposiciones ingenuas
Para poder escribir un libro ms especfico en vez de una enciclopedia, he
asumido algunas cosas sobre usted, el lector. Asumo que conoce HTML y que
ha creado sitios web con HTML. Por lo tanto, aunque uso HTML en muchos
ejemplos, no explico HTML. Si no tiene conocimientos sobre HTML, encontra
r este libro ms difcil de usar. Le sugiero que lea un libro sobre H T M L - tal
como HTML 4 For Dummies, 4ta Edicin, por Ed Tittel y Natanya Pitts, o
HTML 4 For Dummies Quick Reference, 2a Edicin, por Deborah S. Ray y Eric
J. Ray (publicados por Wiley Publishing, Inc.) y que, antes de empezar este
libro, construya algunas pginas web como prctica. Le ser particularmente
til tener algn conocimiento sobre formularios y tablas en HTML. Sin embar
go, si es usted una persona impaciente, no le dir que es imposible seguir
adelante sin saber algo sobre HTML. Quiz sea capaz de absorber lo suficien
te sobre HTML de este libro para crear su propio sitio web. Si decide conti
nuar sin saber HTML, le sugiero que tenga un libro sobre HTML a la mano
para que le ayude cuando necesite averiguar algo sobre HTML que no expli
quemos en este libro.

Si va a seguir adelante sin ninguna experiencia sobre pginas web, tal vez des
conozca algunos conceptos bsicos necesarios. Debe saber cmo crear y guar
dar archivos de solo texto con un editor como Notepad, o cmo guardar el
archivo com o solo texto desde su procesador de palabras (y no en el formato
del procesador de palabras). Tambin debe saber dnde colocar los archivos
de texto que contienen el cdigo (HTML o PHP) de sus pginas web de modo
que las pginas estn a la disposicin de todos los usuarios con acceso a su si
tio Web, y debe saber cmo mover los archivos al lugar apropiado.

No necesita saber cmo disear o crear bases de datos ni cmo programar.


Toda la informacin que necesita saber sobre las bases de datos y la progra
macin se incluye en este libro.
PHP y MySQL Para Dummies, 2a Edicin

Cmo est organizado este libro


Este libro se divide en seis partes, con varios captulos en cada parte. El conte
nido va desde una introduccin a PHP y MySQL, pasando por la instalacin, la
creacin y el uso de bases de datos, hasta cmo escribir programas con PHP.

Parte 1: Desarrollar una aplicacin Web


con Base de Datos usando PHP MySQL
Esta parte brinda un resumen sobre el uso de PHP y MySQL en la creacin de
aplicaciones con bases de datos para la Web. Describe las ventajas de PHP,
de MySQL y del uso conjunto de ambos. Averiguar cmo empezar, incluyen
do lo que necesita, cmo conseguir PHP y MySQL y cmo someter su softwa
re a prueba. Luego aprender sobre el proceso de desarrollar la aplicacin.

Parte 11: Base de datos MySQL


Esta parte explica los detalles sobre cmo trabajar con las bases de datos
MySQL. Aprender cmo crear una base de datos, cmo cambiar una base de
datos y cmo mover datos hacia adentro y afuera de una base de datos.

Parte 111: PHP


Esta parte proporciona los detalles sobre cmo escribir programas en PHP
que le permitan a sus pginas web insertar informacin nueva, actualizar in
formacin existente o eliminar informacin de una base de datos MySQL.
Aprender cm o usar las caractersticas de PHP que se utilizan para la inte
raccin con las bases de datos y el procesamiento de formularios.

Parte IV: Aplicaciones


La Parte IV describe las aplicaciones con bases de datos para la Web como
un todo. Aprender cmo organizar los programas PHP en una aplicacin fun
cional que interacte con la base de datos. Se brindan, describen y explican
dos ejemplos completos de aplicaciones.
Introduccin

Parte V: Los diez ms


Esta parte presenta algunas listas tiles de cosas importantes que se deben
hacer y que no se deben hacer al desarrollar una aplicacin con bases de da
tos para la Web.

Parte l/l: Apndices


Esta parte le proporciona las instrucciones para instalar PHP y MySQL a aque
llos que necesitan instalar el software por s mismos. El Apndice C comenta la
instalacin y el uso de los servidores web, tales com o Apache e 1IS, para aque
llos que necesitan instalar y administrar el servidor web por s mismos.

Iconos usados en este tibro


Los consejos presentan informacin adicional para un propsito especfico.
Los consejos le ahorran tiempo y esfuerzo, as que vale la pena revisarlos.

Siempre debe leer las advertencias. Las advertencias enfatizan acciones que
debe realizar o que debe evitar para prevenir consecuencias desastrosas.

Este icono seala informacin y procedimientos que son ms tcnicos que


fkSPEc

otras secciones del libro. Esta informacin puede ser interesante y til, pero
no necesita entenderla para usar la informacin en este libro.

La funcin de este icono es ser algo as como una notita adhesiva: resalta in
formacin que vale la pena memorizar.
PHP y MySQL Para Dummies, 2a Edicin

l\l ahora adonde r7


Este libro est organizado en el orden en el que deben hacerse las cosas. Si
es usted un verdadero novato, probablemente deber empezar con la Parte I,
la cual describe cmo iniciar el proceso, incluyendo cm o disear las partes
de su aplicacin y cmo van a interactuar estas partes. Cuando implemente
su aplicacin, debe crear primero la base de datos MySQL, por lo cual co
mento MySQL antes que PHP. Despus de haber entendido los detalles de
MySQL y PHP, deber unirlos en una aplicacin completa, lo cual describo en
la Parte IV. Si ya est familiarizado con cualquiera de las partes de este libro,
puede ir directamente a la parte que necesita. Por ejemplo, si est familiariza
do con el diseo de bases de datos, puede ir directamente a la Parte II, donde
se describe cm o implementar el diseo en MySQL. Y si ya conoce MySQL
bien, puede leer slo la informacin sobre PHP en la Parte III.
Parte I
Desarrollar una
aplicacin Web
con Base de Datos
usando PHP y
MySQL
La 5a Ola Por Rich Tennant

"Mira, /ya he buscado "cadveres de bellezas


reanimadas" (res veces y no he encontrado nada/"
En esta parte . . .
n esta parte, presento un panoram a. D escribo PHP y

f MySQL, cm o funciona cada uno de ellos y cm o fun


cionan juntos para con vertir su aplicacin Web con base
de d atos en una realidad. D espus de describir sus herra
m ientas, le m uestro cm o configurar su am biente de tra
bajo. Le p resento las op cion es que hay para ten er acceso
a PHP y MySQL y sealo qu bu scar en cada am biente.

D espus de d escrib ir su s herram ientas y sus op cion es pa


ra d esarrollar su am biente, le brindo un panoram a del
p ro ceso de desarrollo. Hablo so bre planeacin, diseo y
co n stru cci n de la aplicacin.
Captulo 1

Introduccin a PHP y MySQL


En este captulo
Averiguar qu es una aplicacin Web con bases de datos
i* Echar un vistazo a PHP
% Descubrir cmo funciona MySQL
Averiguar cmo funcionan juntos PHP y MySQL
t * it a> f * * # m # # # # # * # * # # # # # & m * # * * e* # * * o

s que tiene que disear un sitio web interactivo. Tal vez su jefe acaba
W de ponerlo a cargo del catlogo de productos en lnea de la compaa. 0
quiz desea desarrollar su propio negocio en la Web. O su hermana desea
vender sus cuadros en lnea. O se ofreci com o voluntario para montar un si
tio web exclusivo para los miembros de la asociacin de acrbatas de su cir
co. Cualquiera que sea el motivo, habr notado que la aplicacin necesita
almacenar informacin (por ejemplo, informacin sobre productos, informa
cin sobre cuadros, contraseas de los miembros), y por lo tanto requiere de
una base de datos. Tambin habr notado que la aplicacin debe interactuar
dinmicamente con el usuario; por ejemplo, el usuario selecciona un produc
to que desea ver o dgita informacin sobre su membresa. Este tipo de sitio
web es una aplicacin Web con base de datos.

Asumo que anteriormente ha creado pginas web estticas usando HTML


(HyperText Markup Language), pero crear un sitio web interactivo es un reto
nuevo, al igual que disear una base de datos. Tal vez le pregunt a tres gu
rs de la informtica conocidos suyos qu debe hacer, y probablemente ellos
le dijeron muchas cosas que no entendi. Pero en medio de la jerga tcnica,
seguramente habr escuchado las palabras "rpido" y "fcil" y "gratis" men
cionadas en las mismas oraciones que PHP y MySQL. Ahora desea saber ms
sobre cmo usar PHP y MySQL para desarrollar el sitio web que necesita.

PHP y MySQL trabajan muy bien juntos; es una sociedad dinmica. En este cap
tulo, aprender sobre las ventajas de cada uno, cmo funciona cada uno y cmo
funcionan juntos para producir una aplicacin Web con bases de datos.
Parte I: Desarrollar una aplicacin Web con Base de Datos usando PHP y MySQL

(Qu es una aplicacin Web


con bases de datos7
Una aplicacin es un programa o un grupo de programas diseados para ser usa
dos por un usuario final (por ejemplo clientes, miembros, acrbatas circenses,
etc.). Si el usuario final interacta con la aplicacin por medio de un explorador
web, la aplicacin es una aplicacin para uso en la Web o simplemente una apli
cacin web. Si la aplicacin web requiere de almacenamiento de informacin a
largo plazo, por medio de una base de datos, entonces es una aplicacin Web
con base de datos. Este libro le brinda la informacin que necesita para desarro
llar una aplicacin Web con base de datos a la cual se pueda tener acceso usan
do exploradores web como Internet Explorer y Netscape.

Una aplicacin Web con base de datos est diseada para ayudarle al usuario a
realizar una tarea. Puede ser una aplicacin simple que muestre informacin
en la ventana del explorador (por ejemplo, muestra ofertas de trabajo actuales
cuando el usuario selecciona el ttulo de un puesto) o puede ser un programa
complicado con funcionalidad extendida (por ejemplo, la solicitud para orde
nar un libro en Amazon.com o la solicitud para pujar en eBay).

De modo no sorprendente, una aplicacin Web con base de datos consta de


una base de datos y una aplicacin slo dos partes:

| v * Base de datos: La base de datos es la memoria de largo plazo de su apli


cacin con base de datos para la Web. La aplicacin no puede cumplir
su propsito sin la base de datos. No obstante, por s misma la base de
datos no es suficiente.
ff
Aplicacin: La parte de la aplicacin es el programa o grupo de progra
mas que realiza las tareas. Los programas crean la presentacin visual
que el usuario ve en la ventana del explorador; hacen que la aplicacin
| sea interactiva al aceptar y procesar la informacin que el usuario digita
en la ventana del explorador; almacenan informacin en la base de datos
y extraen informacin de la base de datos. (La base de datos es intil a
menos que se puedan insertar y extraer datos de ella.)

Las pginas web que usted ha creado anteriormente solo con HTML son estticas,
lo cual significa que el usuario no puede interactuar con la pgina. Todos los usua
rios ven la misma pgina web. Por otro lado, las pginas web dinmicas permiten
al usuario interactuar con la pgina. Diferentes usuarios podran ver pginas web
diferentes. Por ejemplo, un usuario que est viendo el catlogo en lnea de los pro
ductos de una tienda de muebles escoge ver informacin sobre sofs, mientras
que otro usuario tal vez escoja ver informacin sobre mesitas para caf. Para crear
pginas web dinmicas, usted debe usar otro lenguaje adems del HTML.

Un lenguaje ampliamente usado para crear pginas web dinmicas es JavaScript.


JavaScript es til para varios propsitos, tales como pasadas del ^ (por ejemplo
Captulo 1: Introduccin a PHP y MySQL

para resaltar un botn de navegacin cuando el usuario mueve el puntero del -ft
sobre l) o aceptar y validar informacin que los usuarios digitan en un formulario
web. Sin embargo, no es til para interactuar con una base de datos. No debe usar
se JavaScript para mover la informacin del formulario web a la base de datos. Por
el contrario, PHP es un lenguaje particularmente muy bien adaptado para interac
tuar con bases de datos. PHP puede aceptar y validar la informacin que los usua
rios digitan en un formulario web y tambin puede mover la informacin a una
base de datos. Los programas en este libro estn escritos con PHP.

La base de datos
El corazn de una aplicacin con base de datos para la Web es la base de da
tos, la cual es la memoria a largo plazo (ojal ms eficiente que mi memoria a
largo plazo) que almacena la informacin de la aplicacin. Una base de datos
es un gabinete archivador electrnico que almacena informacin de una forma
ordenada, de modo que uno pueda encontrarla cuando la necesita. Despus de
todo, guardar informacin sera intil si no se pudiera encontrar. Una base de
datos puede ser pequea, con una estructura simple por ejemplo, una base
de datos que contenga los ttulos y los nombres de los autores de todos los li
bros que usted posea. Pero una base de datos tambin puede ser enorme, con
una estructura extremadamente compleja tal como la base de datos que
Amazon.com debe tener para guardar toda su informacin.

La informacin almacenada en las bases de datos viene en muchas variedades. El


catlogo en lnea de una compaa requiere de una base de datos para guardar in
formacin sobre todos los productos de la compaa. Un sitio web con membre-
sa requiere de una base de datos para guardar informacin sobre los miembros.
Un sitio web sobre empleos requiere de una base de datos (o tal vez de dos bases
de datos) para almacenar la informacin sobre las ofertas de empleo e informa
cin sobre los currculum de los solicitantes. La informacin que usted planea al
macenar quiz es similar a la informacin que hay guardada en miles de sitios
web de Internet, o quiz sea informacin nica a su aplicacin.

Tcnicamente, el trmino base de datos se refiere al archivo o grupo de archi


vos que contiene los datos reales. Se tiene acceso a los datos por medio de un
conjunto de programas llamados SABD (Sistema dminitrador de Bases de Da
tos o Database Management System). Casi todos los SABO actuales son Rela
cinales), en los cuales los datos se organizan y almacenan en un conjunto de
tablas relacionadas.

En este libro, usamos MySQL porque es un SABD especialmente apropiado


para uso en sitios web. MySQL y sus ventajas se discuten en la seccin
"MySQL, Mi base de datos" ms adelante en este captulo. Puede aprender c
mo organizar y disear una base de datos MySQL en el Captulo 3.
Parte I: Desarrollar una aplicacin Web con Base de Datos usando PHP y MySQL

Listas de discusin electrnicas


Es posible encontrar muy buen soporte tcnico en nico. El nm ero de usuarios de softw are suscri
las listas de discusin electr n icas. Estas listas tos a listas vara de un cen te n ar a varios miles.
son grupos de personas que discuten tem as es M u ch o s tien e n am plia experiencia con el soft
pecficos por medio del co rreo electrnico . Se w a re . A m enudo los desarrolladores, programa-
pueden encontrar listas electrnicas para casi to dores y personal de soporte tcnico del
dos los tem as en los que se pueda pensar: la lote pro veed o r del s o ftw a re estn en la lista. Cual
ra, filosofa antigua, cocina, los B eatles, razas de quiera que sea su pregunta o problem a, alguien
perros, poltica, etc. La discusin se realiza por en la lista probablem ente conoce la respuesta o
m edio del correo electrnico. El adm inistrador de la solucin. No es probable que usted sea la pri
la lista m antiene una lista de distribucin de direc m era persona en h a b e r experim entado un pro
ciones electrnicas para los que quieran unirse a blem a. Cuando plantea una pregunta en una lista
la discusin. Cuando enva un m ensaje a la lista de e lectr n ica, la respuesta generalm ente ap are
discusin, su m ensaje es enviado a toda la lista ce en su casillero en unos pocos minutos. A de
para que todos lo vean. Por ende, la discusin es ms, la m ayora de las listas m antiene un archivo
un esfuerzo grupal y cualquiera puede responder de discusiones anteriores para que usted pueda
a cualquier m ensaje que le interese. b u sc ar res p u estas a problem as especficos.
Cuando es nuevo en el uso de cualquier softw a
Las listas de discusin electrnicas tienen el apo
re, puede averig u ar m ucho sim plem ente unin
yo de varios patrocinadores. C ualquier individuo
dose a las listas de discusin para ese software
u organizacin puede activar una lista. La mayora
y leyendo los m ensajes durante algunos das.
de los proveedores de softw are tiene una o ms
listas dedicadas a su softw are. Las universidades Por supuesto, PHP y M ySQ L tienen listas de dis
tie n e n lista para las asign aturas acadm icas. cusin electr n icas. De hecho, cada uno tiene
A dem s, algunos sitios w e b com o Yahoo! Groups varias listas de discusin sobre tem as espec
y Tpica administran listas de discusin. Los usua ficos, por ejem plo bases de datos y PHP. Puede
rios pueden cre ar una lista nueva o unirse a una enco ntrar los nom bres de las listas electrnicas
lista existente por medro de la aplicacin w eb. e instrucciones sobre cmo unirse a ellas en los
sitios w e b de PHP y M ySQ L respectivam ente.
Las listas electrnicas relacio n ad as con so ftw a
re son com o la cueva del teso ro del soporte t c

La aplicacin: Moerdatos de
{/ hacia la base de datos
Para que la base de datos sea til, usted debe poder introducirle y extraerle datos.
Los programas son sus herramientas para lograrlo, pues interactan con la base de
datos para almacenar y recuperar datos. Un programa se conecta a la base de datos
y hace una solicitud: "Tome estos datos y almacnelos en el lugar especfico". Otro
programa hace esta solicitud: "Encuentre los datos especificados y trigamelos".
Los programas de aplicacin que interactan con la base de datos corren cuando el
usuario interacta con la pgina web. Por ejemplo, cuando el usuario hace clic en el
botn enviar despus de completar un formulario en la web, un programa procesa
la informacin en el formulario y la guarda en una base de datos.
Captulo 1: Introduccin a PHP y MySQL

MySQL, mi basede datos


MySQL es un SABD relacional rpido y fcil de usar utilizado para bases de datos en
muchos sitios web. Desde el principio, la velocidad fue el atributo ms importante
para los desarrolladores. En aras de la velocidad, tomaron la decisin de ofrecer me
nos caractersticas que sus principales competidores (por ejemplo, Oracle y Syba
se). Sin embargo, aunque MySQL tiene menos caractersticas que sus competidores
comerciales, tiene todas las caractersticas necesarias para la gran mayora de desa
rrolladores de bases de datos. Es ms fcil de instalar y usar que sus competidores
comerciales, y la diferencia en el precio favorece muchsimo a MySQL.

MySQL es desarrollado, mercadeado y mantenido por MySQL AB, que es una


empresa sueca. La compaa ofrece dos tipos de licencias:

u * Software de fuente abierta: MySQL est disponible por medio de una


GNIJ GPL (General Public License/Licencia Pblica General) sin ningn
costo. Cualquiera que cumpla los requisitos para una GPL puede usar el
| software gratuitamente. Si est usando MySQL com o base de datos en
un sitio web (el tema de este libro), puede usar MySQL gratuitamente,
I incluso si est ganando dinero con su sitio web.
?
I u * Licencia comercial: MySQL est disponible con una licencia comercial para
| aquellos que prefieren esta alternativa a la GPL. Si un desarroliador desea
I usar MySQL como parte de un nuevo producto de software y desea vender
el nuevo producto en vez de ponerlo a disposicin bajo la GPL, el desarrolla-
1 dor debe comprar una licencia comercial. El costo es muy razonable.

Encontrar soporte tcnico para MySQL no es difcil. Puede unirse a una de


varias listas de discusin electrnicas que se ofrecen en el sitio web de
MySQL: w w w .mysql .com. Incluso puede buscar en los archivos de la lista
electrnica, los cuales contienen una gran base de conocimientos con pre
guntas y respuestas sobre MySQL. Si se siente ms cm odo obteniendo so
porte comercial, MySQL AB ofrece contratos de soporte tcnico con cinco
niveles de soporte, que oscilan desde soporte directo por correo electrnico
hasta soporte telefnico, con cinco niveles de precios.

Ventajas de MySQL
MySQL es una base de datos popular entre los desarrolladores Web. Su velo
cidad y pequeo tamao la hacen ideal para un sitio Web. Smele a eso el he
cho de ser de cdigo abierto, o sea gratis, y tiene all la razn de su
popularidad. Este es un informe minucioso de algunas de sus ventajas:

1 Es rpido. La meta principal de los desarrolladores de MySQL fue la ve


locidad. En consecuencia, el software fue diseado desde el principio
1 con la velocidad en mente.
Parte I: Desarrollar una aplicacin Web con Base de Datos usando PHP y MySQL

I / Es barato. MySQL es gratis bajo la licencia GPL de cdigo abierto, y el


costo de una licencia comercial es muy razonable.
Es fcil de usar. Puede construir una base de datos MySQL e interaetuar
con ella usando unas cuantas instrucciones simples en el lenguaje SQL, el
cual es el lenguaje estndar para comunicarse con los SABD relacional.
Consulte el Captulo 4 para conocer toda la verdad sobre el lenguaje SQL.

Funciona en muchos sistemas operativos. MySQL. funciona en una gran varie


dad de sistemas operativos Windows, Linux, Mac OS, la mayora de las varie
dades de Unix (incluyendo Solaris, AIX y DEC Unix), FreeBSD, OS/2, Irixyotros.

Amplio soporte tcnico. Una base de usuarios grande brinda soporte


gratuito por medio de listas electrnicas. Los desarrolladores de MySQL
tambin participan en las listas electrnicas. Tambin puede comprar
soporte tcnico a MySQL AB por un precio mdico.

Es seguro. El flexible sistema de autorizacin de MySQL permite algunos


o todos los privilegios de la base de datos (por ejemplo, privilegios para
crear una base de datos o borrar datos) a usuarios especficos o grupos
de usuarios. Las contraseas se encriptan.

^ Soporta bases de datos grandes. MySQL maneja bases de datos de hasta


50 millones de filas o ms. El lmite predefinido para el tamao de archivo
de una tabla es de 4GB, pero se puede aumentar (si su sistema operativo lo
puede manejar) hasta un lmite de 8 millones de terabytes (TB), en teora.
f v 0 Se puede personalizar. La licencia GPL de cdigo abierto permite a los
programadores modificar el software MySQL para adaptarlo a sus am
bientes especficos.

Cmo funciona MySQL


El software de MySQL consta del servidor MySQL, varios programas utili
tarios que ayudan en la administracin de la base de datos MySQL y algn
software de apoyo que necesita el servidor MySQL (usted no debe preocu
parse por nada de esto ahora). El corazn del sistema es el servidor MySQL.

El servidor MySQL es el administrador del sistema de base de datos. Maneja


todas las instrucciones de su base de datos. Por ejemplo, si desea crear una
nueva base de datos, usted debe enviar un mensaje al servidor MySQL que
diga "cree una base de datos nueva y llmela datosnuevos". Entonces el ser
vidor MySQL crea un subdirectorio dentro de su directorio de datos, nombra
el nuevo subdirectorio nuevosdatos y pone los archivos necesarios con el
formato requerido en el subdirectorio nuevosdatos. Del mismo modo, para
aadir datos a esa base de datos, usted enva un mensaje al servidor MySQL
dndole los datos y dicindole dnde quiere que aada los datos. Aprender
cmo escribir y enviar mensajes a MySQL en la Parte II de este libro.
Captulo 1: Introduccin a PHP y MySQL

El servidor MySQL debe estar funcionando y esperando rdenes antes de que


usted pueda transmitirle instrucciones. El servidor MySQL generalmente se
configura para que inicie cuando inicia el PC y para que contine funcionan
do todo el tiempo. Esta es la configuracin usual para un sitio web. Sin em
bargo, no es necesario configurarlo para que inicie cuando inicia el PC. Si es
necesario, puede iniciarlo manualmente en el momento en que desee ingre
sar a la base de datos. Cuando est funcionando, el servidor MySQL constan
temente busca mensajes con instrucciones sobre lo que debe hacer.

Comunicacin con el servidor MySOL


Toda su interaccin con la base de datos se hace mediante mensajes envia
dos al servidor MySQL. Puede enviar mensajes al servidor MySQL de varias
maneras, pero este libro se concentra en el envo de mensajes por medio de
PHP. El software PHP tiene instrucciones especficas usadas para enviar ins
trucciones al servidor MySQL.

El servidor MySQL debe ser capaz de entender las instrucciones que recibe. Se
comunica con l usando SQL (Structured Query Language / Lenguaje Estructu
rado de Consulta), que es el lenguaje estndar que entienden muchos SABD. El
servidor MySQL entiende SQL. PHP no entiende SQL, pero no necesita hacerlo:
PHP establece una conexin con el servidor MySQL y enva el mensaje en SQL
por medio de dicha conexin. El servidor MySQL interpreta el mensaje en SQL
y sigue las instrucciones. El servidor MySQL enva un mensaje de vuelta, indi
cando su estado y lo que hizo (o reportando un error si no pudo entender o se
guir las instrucciones). Para conocer todos los detalles sobre cmo escribir y
enviar mensajes en SQL a MySQL, consulte la Parte II de este libro.

PHP, un moditizador de datos


PHP, un lenguaje de programacin diseado especficamente para ser usado
en la Web, es su herramienta para crear pginas web dinmicas. Como es rico
en caractersticas que facilitan el diseo y la programacin web, PHP se usa
en ms de 13 millones de dominios (segn la encuesta de Netcraft en
www. php .net/usage.php). Su popularidad contina creciendo, lo cual signi
fica que debe estar cumpliendo muy bien con su funcin.

PHP significa PHP: HyperText Preprocessor/Preprocesador de Hipertexto.


Cuando Rasmus Lerdorf empez a desarrollarlo, se llamaba Personal Home
Page tools/Herramientas para una Pgina de Inicio Personal. Cuando se desa
rroll a un lenguaje completo, el nombre se le cambi para que estuviera ms
a tono con su funcionalidad expandida.
Parte I: Desarrollar una aplicacin Web con Base de Datos usando PHP y MySQL

La sintaxis del lenguaje PHP es parecida a la sintaxis de C, as que si tiene ex


periencia con C, se sentir cm odo usando PHP. PHP es incluso ms simple
que C porque no usa algunos de los conceptos ms difciles de C. PHP tampo
co incluye las capacidades de programacin de bajo nivel de C porque PHP
est diseado para programar sitios web y no necesita esas capacidades.

La habilidad de PHP para interactuar con bases de datos es particularmente fuer


te. PHP puede trabajar con prcticamente todas las bases de datos de las cuales
haya escuchado hablar (y algunas de las que nunca ha odo nada). PHP maneja la
conexin con la base de datos y la comunicacin con ella. Usted no necesita cono
cer los detalles tcnicos para conectarse a una base de datos o para intercambiar
mensajes con ella. Slo debe decirle a PHP el nombre de la base de datos y dnde
est, y PHP se encarga de los detalles. Se conecta a la base de datos, pasa sus ins
trucciones a la base de datos y le trae de vuelta la respuesta de la base de datos.

Hay soporte tcnico disponible para PHP. Puede unirse a una de varias listas de dis
cusin electrnicas que se ofrecen en el sitio web de PHP (www .php.net), incluyen
do una lista de bases de datos y PHP. Adems, hay una interfaz hacia las listas de
discusin en news.php.net, desde donde puede navegar o buscar en los mensajes.

Ventajas de PHP
La popularidad de PHP est aumentando rpidamente debido a sus mltiples
ventajas:

v * Es rpido. Como est empotrado en cdigo HTML, el tiempo de respues


ta es muy corto.
v * Es barato gratis, de hecho. PHP es prueba de que los almuerzos gra
tis s existen y de que es posible recibir ms de lo que se ha pagado.
u * Es fcil de usar. PHP contiene muchas caractersticas y funciones espe
I ciales necesarias para crear pginas web dinmicas. El lenguaje PHP es
t diseado para incluirse con facilidad en archivos en HTML.
v* Funciona en muchos sistemas operativos. Funciona en una gran varie
dad de sistemas operativos: Windows, Linux, Mac OS y la mayora de las
variedades de Unix.
1
u * Amplio soporte tcnico. Una gran base de usuarios brinda soporte gra
tuito por medio de las listas de discusin electrnicas.

| Es seguro. El usuario no ve el cdigo PHP.

v * Est diseado para mantener bases de datos. La funcionalidad de PHP


fue diseada para interactuar con bases de datos especficas. Le libera
de la necesidad de conocer los detalles tcnicos requeridos para comu
nicarse con una base de datos.
I > Se puede personalizar. La licencia de cdigo abierto les permite a los
programadores modificar el software PHP y agregarle o modificar carac
tersticas necesarias para adaptarse a sus ambientes especficos.
Captulo 1: Introduccin a PHP y MySQL

Cmo funciona PHP


PHP es un lenguaje de programacin empotrado cuando se usa en pginas
web. Esto quiere decir que el cdigo PHP est empotrado en cdigo HTML.
Usted usa etiquetas de HTML para encapsular el lenguaje PHP que empotra
en su archivo HTML, del mismo modo en que usara otras etiquetas de
HTML. Puede crear y editar pginas web que contengan PHP del mismo mo
do en que se crean y editan las pginas HTML comunes.

El software PHP funciona en conjunto con el servidor web. El servidor web es el


software que entrega las pginas web al mundo. Cuando digita un URL en su ex
plorador web, est enviando un mensaje al servidor web en ese URL en el cual le
pide que le enve un archivo en HTML. El servidor web responde enviando el ar
chivo solicitado. Su explorador lee el archivo HTML y muestra la pgina web.
Tambin le pide a un servidor web que le enve un archivo cada vez que hace clic
en un vnculo en una pgina web. Adems, el servidor web procesa un archivo
cuando usted hace clic en el botn para enviar un formulario en una pgina web.

Cuando est instalado PHP, el servidor web se configura para esperar ciertas
extensiones de archivo que contienen instrucciones en lenguaje PHP. A menu
do la extensin es.php o . phtml, pero se puede usar cualquier extensin.
Cuando el servidor web recibe una solicitud de un archivo con la extensin
designada, enva las instrucciones HTML sin modificacin, pero las instruc
ciones PHP las procesa el software PHP antes de enviarlas al solicitante.

Cuando se procesan las instrucciones PHP, el servidor web slo enva el resul
tado al explorador Web. Las instrucciones en el lenguaje PHP no se incluyen en
el resultado que se enva al explorador, as que el cdigo PHP es seguro y trans
parente para el usuario. Por ejemplo, en esta simple instruccin en PHP:

<?php echo "<p>Ho1a Mundo": ?>

<?php es la etiqueta de apertura PHP y ?> es la etiqueta de cierre, echo es


una instruccin en PHP que le dice a PHP que muestre el texto seguido a con
tinuacin. El software PHP procesa la instruccin PHP y el resultado es este:

<p>Hola Mundo

que es un instruccin comn en HTML. Esta instruccin en HTML se entrega al ex


plorador del usuario. El explorador interpreta la oracin como cdigo HTML y
muestra una pgina web con un prrafo: Hola Mundo. La instruccin PHP no se en
trega al explorador, de modo que el usuario nunca ve ninguna instruccin en PHP.

PHP y el servidor web deben trabajar muy unidos. PHP no est integrado a
todos los servidores web, pero trabaja con muchos de los servidores web
ms populares. PHP fue desarrollado como un proyecto de la Fundacin de
Software Apache; en consecuencia, trabaja mejor con Apache. PHP tambin
funciona con Microsoft 1IS/PWS, iPlanet (anteriormente conocido como
Netscape Enterprise Server) y otros.
Parte I: Desarrollar una aplicacin Web con Base de Datos usando PHP y MySQL

Aunque PHP funciona con varios servidores web, funciona mejor con Apache. Si
puede seleccionar o influir en la seleccin del servidor web usado en su organiza
cin, elija Apache. Por s mismo, Apache es una buena eleccin. Es gratis, de
cdigo abierto, estable y popular. Actualmente sustenta a ms del 60 por ciento de
todos los sitios web, segn la encuesta de servidores web e n w w w .n etcraft.c om.
Funciona con Windows, Linux, Mac OS y la mayora de las variedades de Unix.

MySQL y PHP, (a pareja perfecta


MySQL y PHP frecuentemente se usan juntos. A menudo se les llama el do
dinmico. MySQL brinda la parte de la base de datos y PHP brinda la parte de
la aplicacin en su aplicacin con bases de datos para la Web.

Ventajas de esta relacin


Como pareja, MySQL y PHP tienen varias ventajas:

lf Son gratis. En cuanto a lo rentable, es difcil ganarle a gratis.

> Estn diseados para la Web. Ambos fueron diseados especficamente


para usarse en sitios web. Ambos tienen un conjunto de caractersticas
dedicadas a crear sitios web dinmicos.
v * Son fciles de usar. Ambos fueron diseados para montar sitios web r
pidamente.
v * Son rpidos. Ambos fueron diseados pensando en la velocidad como
meta principal. Juntos brindan una de las maneras ms rpidas de entre
gar pginas web dinmicas a los usuarios.

u * Se comunican bien entre si. PHP incluye caractersticas especficas pa


ra comunicarse con MySQL. No necesita conocer los detalles tcnicos;
djele ese trabajo a PHP.
i
Ambos cuentan con una amplia base de soporte. Ambos tienen bases
de usuarios amplias. Como generalmente se usan como pareja, a menu
do tienen la misma base de usuarios. Hay muchas personas dispuestas a
ayudarle, incluyendo a los miembros de las listas de discusin electrni
cas con experiencia en el uso de MySQL y PHP juntos.

v * Se pueden personalizar. Ambos son de cdigo abierto, lo cual le permi


te a los programadores modificar el software de PHP y MySQL para
adaptarlos a sus ambientes particulares.
Captulo 1: Introduccin a PHP y MySQL

Cmo funcionan juntos MySOL y PHP


PHP brinda la parte de la aplicacin, y MySQL proporciona la parte de la base de
datos de una aplicacin con base de datos para la Web. Se usa el lenguaje PHP
para escribir los programas que realizan las tareas de la aplicacin. PHP es lo su
ficientemente flexible para realizar todas las tareas que requiera su aplicacin.
Se puede usar para tareas simples (como mostrar una pgina web) o para tareas
complicadas (tales como aceptar y verificar datos digitados por un usuario en
un formulario en HTML). Una de las tareas que su aplicacin debe realizar es in
troducir informacin en la base de datos, y extraerla; y PHP incluye caractersti
cas especficas para usar al escribir programas que deban mover informacin
hacia dentro y hacia afuera de una base de datos de MySQL.

Las instrucciones PHP se empotran en sus archivos HTML con etiquetas de PHP.
Cuando las tareas que debe realizar la aplicacin requieren almacenar o recupe
rar datos, usted usa instrucciones PHP especficamente diseadas para interac-
tuar con la base de datos MySQL. Se usa una instruccin PHP para conectarse a
la base de datos correcta, dicindole a PHP dnde est localizada la base de da
tos, su nombre y la contrasea necesaria para conectarse a ella. La base de datos
no necesita estar en la misma mquina que su sitio web; PHP puede comunicarse
con una base de datos a travs de una red. Se usa otra instruccin PHP para en
viar indicaciones a MySQL. Se enva un mensaje en SQL a travs de la conexin
dndole instrucciones a MySQL sobre la tarea que usted desea que se realice.
MySQL devuelve un mensaje de estado que muestra si ha realizado la tarea exito
samente. Si hubo un problema, devuelve un mensaje de error. Si su mensaje en
SQL pidi recuperar algunos datos, MySQL enva los datos que solicit y PHP los
almacena en una ubicacin temporal donde estarn a su disposicin.

Luego usted debe usar una o ms instrucciones PHP para completar la tarea de la
aplicacin. Por ejemplo, puede usar instrucciones PHP para mostrar los datos que
recuper. 0 puede usar instrucciones PHP para mostrar un mensaje de estado en el
explorador, informndole al usuario, por ejemplo, que los datos fueron guardados.

Dado que es un SABD relacional, MySQL puede guardar informacin muy com
pleja. Como lenguaje de programacin, PHP puede realizar manipulaciones de
datos muy complejas, ya sean datos que deben modificarse antes de ser guar
dados en la base de datos, o datos recuperados de una base de datos que de
ben modificarse antes de ser mostrados o usados para otra tarea. Juntos, PHP
y MySQL pueden usarse para crear una aplicacin con base de datos para la
Web con un propsito muy complejo y sofisticado.

Mantenerse al da con tos


cambios en PHP y MySQL
PHP y MySQL son software de fuente abierta. Si usted solo ha usado software de los
mayores desarrolladores de software tales como Microsoft, Macromedia o Adobe
Parte I: Desarrollar una aplicacin Web con Base de Datos usando PHP y MySQL

se dar cuenta de que el software de cdigo abierto es una especie totalmente di


ferente. Es desarrollado por grupos de programadores que escriben el cdigo en su
tiempo libre, por diversin y sin costo alguno. No hay oficinas corporativas.

El software de cdigo abierto cambia con frecuencia, en lugar de una o dos veces
al ao, como hace el software comercial. Cambia cuando sus desabolladores sien
ten que est listo para hacerlo. Tambin cambia rpidamente como respuesta a
problemas. Cuando se encuentra un problema serio por ejemplo, una grieta en
la seguridad en unos cuantos das aparece una versin nueva que resuelve el
problema. Eso s, no recibir panfletos llamativos ni ver coloridos anuncios en re
vistas durante un ao antes del lanzamiento de una nueva versin. Por eso, si 110
hace un esfuerzo por mantenerse informado, podra perderse el lanzamiento de
una versin nueva o desconocer un problema serio con su versin actual.

Visite regularmente los sitios web de PHP y MySQL. Debe conocer la informa
cin que se publica ah. nase a las listas de correo, que a menudo tienen mu
cho trfico. Mientras empieza a conocer PHP y MySQL, la gran cantidad de
mensajes electrnicos en las listas de discusin le traern informacin valiosa
a su casillero de correo electrnico; puede aprender mucho leyendo esos men
sajes. Muy pronto estar en capacidad de ayudar a otros con base en su propia
experiencia. Por lo menos suscrbase a lista de correo de avisos, que solo en
va mensajes electrnicos ocasionalmente. All se anuncian los problemas im
portantes y las versiones nuevas. El mensaje electrnico que recibe de la lista
de avisos contiene informacin que debe saber. Ahora mismo, antes de que se
le olvide, entre en los sitios web de PHP y MySQL e inscrbase en una lista o
d o s e n www.php.net/mailing-lists.php y lists.mysql.com.

Debe estar al tanto de algunos cambios significativos respecto de versiones


anteriores de PHP, pues aplicaciones que funcionan bien en versiones ante
riores podran tener problemas al correr en una versin ms nueva, y vice
versa. Los siguientes son algunos cambios que debe conocer:

| v0 Versin 5.0.0: Aadi soporte para MySQL 4.1. No incluye automtica


mente soporte para MySQL 4.0; debe incluirse por medio de una opcin
cuando se instala PHP. Cambi el nombre del archivo del intrprete de
PHP usado con un servidor web de.php a .php cgi .

| u * Versin 4.3.1: Arregl un problema de seguridad en la versin 4.3.0. No es


aconsejable continuar corriendo sitios web con la versin 4.3.0 o anteriores.
I
1 Versin 4.2.0: Cambi la configuracin predeterminada de
regi ster_gl obal s a Of f. Es posible que aplicaciones que corran con
versiones anteriores dependan de que regi ster_gl obal s est configu
rado en On y podran dejar de funcionar con la nueva configuracin. Lo
mejor es cambiar el cdigo de la aplicacin para que corra con regi s
ter_gl obal s configurado en Off.

Versin 4.1.0: Introdujo las matrices superglobales. Las aplicaciones


escritas con las superglobales (com o lo describo en el Captulo 6) no
funcionarn en versiones anteriores. Antes de 4.1.0, debe usar las matri
ces al estilo antiguo, por ejemplo $HTTP_POST_VARS.
Captulo 2

Preparar su ambiente de trabajo


En este captulo
* Tener acceso a PHP y MySQL mediante los sitios web de su compaa y de empresas de
hospedaje de sitios web
i Construir su propio sitio web empezando desde cero
Poner a prueba a PHP y MySQL

u primera tarea, tras haberse decidido a usar PHP y MySQL, es tener ac

S ceso a ellos. Quiz a usted le est esperando, listo con todas las herra
mientas que necesita, un ambiente de trabajo ya montado para el desarrollo
de aplicaciones para la web. En caso contrario, ser parte de su trabajo que
usted mismo prepare este ambiente de trabajo. Tal vez su trabajo sea crear
un sitio web completamente nuevo. En este captulo describo las herramien
tas que necesita y cmo tener acceso a ellas.

Las herramientas necesarias


Para montar su sitio web dinmico, necesita tener acceso a las tres herra
mientas de software siguientes:

i v * Un s ervid or web: El software que lleva sus pginas web al mundo


| MySQL: El SABD relaciona! (Sistema Administrador de Base de Datos Re-
| lacional/Relational DataBase Management System) que almacenar la in-
| formacin de su aplicacin con base de datos para la Web

( v* PHP: El lenguaje de programacin que usar para escribir los programas


I que brindan la funcionalidad dinmica a su sitio web

Describo estas tres herramientas detalladamente en el Captulo 1.


Parte I: Desarrollar una aplicacin Web con Base de Datos usando PHP y MySQL

Encontrar un tugar para trabajar


Para crear sus pginas web dinmicas, necesita tener acceso a un sitio web
que proporcione sus tres herramientas de software (vea la seccin anteror).
Todos los sitios web incluyen un servidor web, pero no todos los sitios web
proporcionan MySQL y PHP. Estos son los ambientes ms comunes en los
cuales puede desarrollar su sitio web:

Un sitio web montado por una compaa en su propio PC: La compa


a generalmente el departamento de TI (Tecnologa de informacin)
| de la compaa instala y administra el software del sitio web. Su tra
bajo, para los propsitos de este libro, es programar el sitio web, ya sea
como empleado de la compaa o como contratista.
,V
i* Un sitio web hospedado por una compaa de hospedaje web: El sitio
web se localiza en el PC de la compaa de hospedaje web. La compaa
de hospedaje instala y mantiene el software del sitio web y proporciona
espacio de su PC para que usted instale los archivos de HTML (HyperText
Markup Language/Lenguaje de Marcado de Hipertexto) de un sitio web.

Un sitio web que an no existe: Usted planea instalar y mantener el


software del sitio web por s mismo. Podra ser un sitio web de su pro
piedad que est construyendo en su propio PC, o podra ser un sitio web
que est instalando para un cliente en el PC del cliente.

Cunto necesita entender sobre la administracin y operacin del software


del sitio web depende del tipo de acceso al sitio que usted tenga. En las pr
ximas secciones, describo estos ambientes con mayor detalle y explico cmo
tener acceso a PHP y MySQL.

Un sitio u/eb de la compaa


Cuando la compaa se encarga de manejar el sitio web, usted no necesita en
tender la instalacin y la administracin del software del sitio. La compaa
es responsable de la operacin del sitio web. En la mayora de los casos, el si
tio web ya existe y su trabajo es agregar algo, modificar o redisear ese sitio
web ya existente. En unos cuantos casos, la compaa podra estar instalando
su primer sitio web, y su trabajo es disear el sitio. Cualquiera sea su caso,
su responsabilidad es escribir e instalar los archivos de HTML para el sitio
web. Usted no es responsable de la operacin del sitio.

Usted tiene acceso al software del sitio web mediante el departamento de TI de la


compaa. El nombre de este departamento puede variar en diferentes empresas,
pero su funcin es la misma: mantiene los PCs de la empresa funcionando y al da.

Si PHP y/o MySQL no estn disponibles en el sitio web de la compaa, TI ne


cesita instalarlos y ponerlos a su disposicin. PHP y MySQL tienen muchas
Captulo 2: Preparar su ambiente de trabajo

opciones, pero TI tal vez no entienda cul es la mejor opcin, e incluso po


dra configurar algunas opciones de un modo inapropiado para sus propsi
tos. Si necesita cambiar las opciones de PHP o MySQL, debe solicitar a TI que
haga el cambio; usted no podr hacer el cambio por s mismo. Por ejemplo,
PHP debe estar instalado de modo que soporte MySQL, as que si PHP no se
est comunicando correctamente con MySQL, TI probablemente tendr que
reinstalar PHP con el soporte para MySQL habilitado.

Para que el mundo pueda ver las pginas web de la compaa, los archivos de
HTML deben estar en un lugar especfico del PC. El servidor web que lleva las
pginas web al mundo espera encontrar los archivos de HTML en un directorio
especfico. El departamento de TI debe darle acceso al directorio donde deben
instalarse los archivos de HTML. En la mayora de los casos, usted desarrolla
r y probar sus pginas web en una ubicacin de prueba y luego transferir
los archivos completos a su hogar permanente. Dependiendo del acceso que le
d TI, usted podr copiar los archivos desde el lugar de prueba hasta el lugar
permanente, o bien tendr que transferirlos por medio de FTP (Protocolo de
Transferencia de Archivos/File Transfer Protocol), que es un mtodo para co
piar un archivo desde un PC a otro en una red). En algunos casos, por razones
de seguridad, los encargados de TI no le darn acceso a la ubicacin perma
nente y preferirn instalar los archivos en esa ubicacin ellos mismos.

Para poder usar las herramientas de software para la Web y crear su sitio
web dinmico, usted necesita que TI le d la siguiente informacin:

v* La ubicacin de las pginas web: Debe saber dnde poner los archivos de
| las pginas web. TI debe darle el nombre y la ubicacin del directorio donde
l, se deben instalar los archivos. Adems, debe saber cmo instalar los archi
vos: copiarlos, enviarlos por FTP, o usando otros mtodos. Tai vez necesite
una identificacin de usuario y una contrasea para instalar los archivos.

? v0 El nombre predeterminado del archivo: Cuando los usuarios apuntan sus


exploradores hacia un URL, un archivo ser enviado hacia ellos. El servidor
web est configurado para enviar un archivo con un nombre especfico cuan-
I do el URL seala un directorio. El archivo que se enva automticamente es el
k archivo predeterminado. A menudo el archivo predeterminado se llama
index.htm o index.html, pero a veces se usan otros nombres como
i defaul t .htm. Pregunte a TI cmo debe nombrar el archivo predeterminado.
v* Una cuenta MySQL: El acceso a las bases de datos MySQL se controla
por medio de un sistema de nombres de cuentas y contraseas. TI confi
gurar una cuenta MySQL para usted con los permisos apropiados y
tambin le dar el nombre de la cuenta MySQL y su contrasea. (En el
' Captulo 5 explico con detalle las cuentas MySQL.)

i* La ubicacin de las bases de datos MySQL: Las bases de datos


f: MySQL no tienen que estar ubicadas en el mismo PC que el .sitio web.
| Si las bases de datos MySQL se ubican en un PC diferente al del sitio
I web, usted necesita saber el nombre del anfitrin (por ejemplo,
I t h o r . companyname. com) donde se encuentran las bases de datos.
Parte I: Desarrollar una aplicacin Web con Base de Datos usando PHP y MySQL

u * La extensin del archivo PHP: Cuando se instala PHP, al servidor web


se le indica que debe esperar instrucciones de PHP en archivos con ex
tensiones especficas. Con frecuencia, las extensiones usadas son .php
o. phtml, pero se pueden usar otras extensiones. Las instrucciones PHP
en los archivos que no tienen la extensin correcta no sern procesadas.
Pregunte a TI cul extensin debe usar para sus programas PHP.

Frecuentemente tendr que interactuar con los encargados de TI, conforme surjan
nuevas necesidades. Por ejemplo, tal vez necesite cambiar opciones, tal vez nece
site informacin que le ayude a interpretar un mensaje de error, o tal vez necesite
reportar un problema con el software del sitio web. Por eso tener una buena rela
cin con ellos har su vida ms fcil. Acostumbre llevarles galletitas y donas.

Una compaa de hospedaje de sitios uleh


Una compaa de hospedaje de sitios web le brinda todo lo que necesita para
montar un sitio web, incluyendo espacio en sus PCs y todo el software del si
tio. Solo debe crear los archivos para sus pginas web y pasarlos a la ubica
cin especificada por la compaa de hospedaje.

Millones y millones de compaas ofrecen servicios de hospedaje en la Web.


La mayora cobra una tarifa mensual (generalmente muy pequea), e incluso
hay algunas gratuitas. (La mayora, pero no todas, de las gratuitas tienen co
mo requisito que usted publique anuncios). Generalmente, la tarifa mensual
vara dependiendo de los recursos brindados para su sitio web. Por ejemplo,
un sitio web con 2MB de espacio en disco para los archivos de su pgina web
costara menos que un sitio con 10MB de espacio en disco.

Cuando busque un lugar para hospedar su sitio web, asegrese de que la


compaa de hospedaje ofrezca lo siguiente:

I v * PHP y MySQL: No todas las compaas brindan estas herramientas, 'ral vez
tenga que pagar ms por un sitio con acceso a PHP y MySQL; algunas veces
| tendr que pagar una cuota adicional por usar bases de datos MySQL.
p
| Una versin reciente de PHP: A veces no se ofrecen las versiones ms
recientes de PHP. Ni siquiera debe considerar un sitio web que slo ten
ga acceso a PHP 3. Necesita PHP 4 por lo menos. Preferiblemente debe-
I ra tener acceso a PHP 5.

Al elegir una compaa de hospedaje debe tomar en cuenta estas otras consi
deraciones:

| Confiabilidad: Necesita una compaa de hospedaje en la cual pueda


| confiar: una que no vaya a quebrar repentinamente y desaparecer maa-
| na, y una que no use PCs antiguos sostenidos con chicle y alambre para
8 embalar, de esos que pasan ms tiempo cados que en servicio.
Captulo 2: Preparar su ambiente de trabajo

Velocidad: Las pginas web que se descargan lentamente son un problema,


fc porque los usuarios se ponen impacientes y se van a otra parte. Las pginas
lentas pueden ser el resultado de una compaa de hospedaje que empez su
negocio con escasos recursos y que carece de equipo de buena calidad o
quiz la compaa de hospedaje sea tan exitosa que su equipo est sobrecar
gado por clientes nuevos. De cualquier modo, las compaas de hospedaje
que despliegan las pginas web muy lentamente son inaceptables.

Soporte tcnico: Algunas compaas de hospedaje no tienen a nadie dispo


nible para responder preguntas o resolver problemas. El soporte tcnico a
menudo se brinda slo por correo electrnico, lo cual puede ser aceptable
si el tiempo de respuesta es corto. A veces es aconsejable probar la calidad
i del soporte tcnico de la compaa llamando al nmero de soporte o pro
bando su tiempo de respuesta envindoles un correo electrnico.

i> El nombre del dominio: Cada sitio web tiene un nombre de dominio que los
exploradores web usan para encontrar el sitio en la Web, Cada nombre de do
minio se registra con el pago de una pequea tarifa anual, de modo que solo un
sitio pueda usarlo. Algunas compaas de hospedaje le permiten usar un nom
bre de dominio que usted ha registrado independientemente de la compaa
de hospedaje; algunas le ayudan a registrar y usar un nombre de dominio nue-
| vo; y algunas requieren que usted use un nombre de dominio definido por
I ellas. Por ejemplo, suponga que su nombre es Lola Diseadora y desea que su
sitio web se llame LolaDiseadora. Algunas compaas de hospedaje le permi
te tirn llamar a su sitio web Lo 1amaestra . com, pero algunas requerirn que su
| sitiosellame Lol amuestra. empresa . com, o empresa.com/~Lolamuestra
| o algo parecido. En general, su sitio web se ver ms profesional si usted usa su
| propio nombre de dominio.
| v* Respaldos: Los respaldos son copias de los archivos de sus pginas web y de
su base de datos que estn almacenados en caso de que sus archivos o base
i' de datos se pierdan o se daen. Debe asegurarse de que la compaa haga co~
| pias de respaldo de su aplicacin con frecuencia y rutinariamente. Tambin
g debe averiguar cunto tardarn en colocar los respaldos en su lugar para res-
| taurar el funcionamiento normal de su sitio web despus de un problema.

| Caractersticas: Seleccione las caractersticas con base en el propsito


| de su sitio web. Generalmente las compaa de hospedaje agrupan las
1 caractersticas en planes, y ms caractersticas = costos mayores. Algu-
I as caractersticas que debe tomar en cuenta son:
| Espacio en disco: Cuntos MB/GB de espacio en disco requerir
| su sitio web? Los archivos de medios, tales como grficos o archi-
g vos de msica pueden ser bastante grandes.

| Transferencia de datos: Algunas compaas de hospedaje cobran


| por enviar pginas web a los usuarios. Si espera tener mucho tr-
| fico en su sitio, ser importante considerar este costo.
I Direcciones electrnicas: Muchas compaas de hospedaje le brindan
I una cantidad de direcciones electrnicas para su sitio web. Por ejemplo,
Parte I: Desarrollar una aplicacin Web con Base de Datos usando PHP y MySQL

si su sitio es Lol a mu es t ra. com, usted podra permitirles a los usuarios


que le enven mensajes electrnicos a y o@Lol amuest ra .com.

Software: Las compaas de hospedaje ofrecen una buena varie


dad de software para el desarrollo de aplicaciones para la Web.
PHP y MySQL son el software que comento en este libro. Algunas
compaas de hospedaje podran ofrecer otras bases de datos y al
gunas podran ofrecer otras herramientas de desarrollo tales como
extensiones de FrontPage, software para carritos de compras y va
lidacin de tarjetas de crdito.

Estadsticas: A menudo es posible obtener estadsticas relaciona


das con el trfico en su sitio web, por ejemplo el nmero de usua
rios, la hora de acceso, el acceso por pgina web, etctera.

Nombres de dominio
Cada sitio w e b n ecesita una direccin nica en nombre de dominio en la W eb. Primero, pruebe
la W e b . Esa d irec ci n nica que usan los PCs su nombre de dominio potencial para averiguar
para lo ca lizar un sitio w e b es la d ireccin IP, la si est disponible. Si lo est, regstrelo bajo su
cual es un arreglo de cuatro nm eros entre 0 y nombre o el nom bre de su com paa, pagando la
255, s e p a ra d o s por puntos; por ejem p lo, tarifa correspondiente. El nom bre ser suyo y lo
172.17.204.2 o 192.163.2.33. podr usar; nadie ms podr usarlo. La tarifa es
tnd ar para registrar un nom bre de dominio es
Como las direcciones 1P constan de nm eros y
$35 por ao. No se debe p ag a r nunca ms, pero
puntos, no son fciles de recordar. A fortu nada
a menudo hay gangas.
m ente, la mayora de las direcciones IP tienen un
nombre asociado que es mucho m sfcil de recor M uchos sitios w e b ofrecen la capacidad de re
dar, tal como amazon.com, www.irs.gov o gistrar un nom bre de dominio, incluyendo los si
mi empresa.com. Un nombre que sea la direc tios w e b de m uchas com paas de hospedaje.
cin de un sitio w eb es un nombre de dominio. Un Una bsqueda en Google (www.google.com)
dom inio puede ser un PC o muchos PCs interco- de registro de nombre de dominio da como resul
nectados. Cuando un dominio se refiere a varios tado ms de 3 millones de aciertos. Busque para
PCs, cada PC en el dominio puede ten er su propio asegurarse de encontrar el precio ms bajo. A de
nom bre. Un nom bre que incluya el nom bre de un ms, m uchos sitios w e b le perm iten digitar un
PC individual,tal como thor .mi empresa.com, nombre de dominio para saber quin lo registr.
identifica un subdominio. Estos sitios w e b hacen una bsqueda de bases
de datos de nom bres de dominio usando una he
C ada nom bre de dom inio debe se r nico para
rramienta llam ada w hois (quin es). Una bsque
que pueda servir como direccin. Por lo tanto, un
da en Google de nom bre de dominio w hois
sistem a de registro de nom bres de dominio ga
resulta en 770,000 aciertos. Un par de lugares
rantiza que no haya dos ubicaciones que usen el
donde puede ir para h acer una bsqueda whois
mismo nom bre de dominio. Cualquiera puede re
son A llwhois.com (www. a 11 who is .com) y Bet-
gistrar un nom bre de dominio siem pre y cuando
terW hois.com (www.betterwhoi s icom).
el nom bre est libre. Usted puede reg istrar un
Captulo 2: Preparar su ambiente de trabajo

Una desventaja de hospedar su sitio en una compaa de hospedaje comer


cial es que usted no tendr control sobre el ambiente de desarrollo. La com
paa de hospedaje de sitios web brinda el ambiente que funciona mejor para
ella, probablemente un ambiente configurado para que el mantenimiento sea
sencillo, de bajo costo y con un mnimo de retiro de clientes. La mayor parte
de su ambiente lo configura la compaa y usted no lo puede cambiar. Solo
puede rogarle a la compaa que lo cambie. La compaa no estar anuente a
cambiar la configuracin por temor a que un cambio pueda causar proble
mas en el sistema de la compaa o a otros clientes.

El acceso a las bases de datos MySQL se controla por medio de un sistema de


cuentas y contraseas que debe mantenerse manualmente, lo cual causa tra
bajo adicional para la compaa de hospedaje. Por esta razn, muchas compa
as de hospedaje no ofrecen MySQL o cobran extra por l. Adems, PHP tiene
un milln de opciones que puede configurarse, desconfigurarse o recibir ml
tiples valores. La compaa de hospedaje decide las opciones de configuracin
con base en sus necesidades, lo cual puede ser o no ideal para sus propsitos.

Es bastante difcil investigar las compaas de hospedaje de sitios web par


tiendo desde un nico punto una bsqueda en Google.com de hospedaje
de sitios web resulta en ms de 6 millones de aciertos. La mejor manera de
investigar compaas de hospedaje es pidindole recomendaciones a las per
sonas que han tenido experiencia con esas compaas. Las personas que han
usado una compaa de hospedaje pueden advertirle si el servicio es lento o
si los PCs se caen a menudo. Despus de recopilar unos cuantos nombres de
compaas de hospedaje de clientes satisfechos, puede delimitar la lista a la
que mejor se adapte a sus propsitos y sea ms rentable.

Montar y manejar su propio sitio vOeb


Si est iniciando un sitio web desde cero, necesitar comprender muy bien el
software del sitio. Tiene que tomar varias decisiones relacionadas con el
hardware y el software. Tiene que instalar un servidor web, PHP y MySQL, as
com o mantener, administrar y actualizar el sistema usted mismo. Tomar esta
ruta requiere de ms trabajo y ms conocimiento. La ventaja es que tiene el
control total sobre su ambiente de desarrollo de aplicaciones web.

Estos son los pasos generales que le conducirn a su sitio web dinmico (en
las secciones siguientes explico estos pasos con ms detalle):

1. Prepare el PC.

2. Instale el servidor web.

3. Instale MySQL.

4. Instale PHP.
Parte I: Desarrollar una aplicacin Web con Base de Datos usando PHP y MySQL

Si est empezando desde cero, con nada ms que un espacio vaco donde co
locar el PC, empiece en el Paso 1. Si ya tiene un PC en funcionamiento, pero
no tiene software de desarrollo web, empiece en el Paso 2. O si ya tiene un si
tio web pero no tiene PHP ni MySQL instalados, empiece en el Paso 3.

Preparar et PC
Su primera decisin es escoger cul plataforma de hardware y cul sistema
operativo usar. En la mayora de los casos, escoger un PC con Linux o Win
dows como sistema operativo. Estas son algunas ventajas y desventajas de
estos sistemas operativos:

| u0 Linux: Linux es de fuente abierta, as que es gratis. Tambin tiene ventajas


para ser usado como servidor web: corre por largos perodos de tiempo sin
necesidad de ser reiniciado; y Apache, el servidor web ms popular, funciona
mejor con Linux que con Windows. Correr Linux en un PC es la opcin de me
nor costo. La desventaja es que para muchas personas Linux es ms difcil de
instalar, configurar, administrar e instalarle software que Windows.

1 v* Windows: A diferencia de Linux, Windows no es gratis. Sin embargo, las


ventajas son que la mayora de personas cree que Windows es ms fcil
de usar y, com o es ampliamente utilizado, muchas personas le pueden
I ayudar si tiene problemas.

Asumir que comprar un PC con el sistema operativo y el software instala


dos, listos para usar. Es ms fcil encontrar un PC que venga con Windows
instalado, pero s se consiguen PCs con Linux instalado. Por ejemplo, actual
mente Dell, IBM y Hewlett-Packard ofrecen PCs con Linux instalado.

Si est construyendo su propio hardware, necesita ms informacin de la que le


puedo brindar en el breve espacio de este libro. Si tiene el hardware y planea insta
lar el sistema operativo, Windows es ms fcil de instalar, pero Linux se est hacien
do cada da ms fcil. Puede instalar Linux desde un CD, como Windows, pero a
menudo debe proporcionar informacin o tomar decisiones que requieren de un co
nocimiento ms profundo de su sistema. Si usted ya sabe cmo realizar las tareas de
administracin del sistema en Windows o en Linux (tal como instalar software y ha
cer respaldos), la solucin ms rpida es usar el sistema operativo que ya conoce.

Si va a usar PHP y MySQL debe considerar seriamente usar Linux. PHP es un


proyecto de la Apache Software Foundation, as que corre mejor con el servi
dor de Apache. Y Apache corre mejor en Linux que en Windows. Por lo tanto,
si el PC ser usado principalmente para correr un sitio web con aplicaciones
con bases de datos, Linux es perfectamente adecuado para sus propsitos.

Hay otras soluciones adems de un PC con Windows o Linux, pero son menos
populares:


u0 Con base en Unix: Hay otros sistemas operativos gratuitos basados en Unix
disponibles para PCs, tales como FreeBSD (algunos personas lo prefieren a
Linux) o una versin de Solaris que Sun permite descargar gratuitamente.
Captulo 2: Preparar su ambiente de trabajo

I Mac: Los equipos Mac pueden usarse como servidores web. Los Mac ms
I nuevos vienen con PHP instalado. Instalar PHP y MySQL en Mac OS X es
bastante simple. Sin embargo, hay menos usuarios de Mac, as que ser dif
cil encontrar ayuda cuando la necesite. Un buen sitio es www .phpmac.com.

Cmo instalar el seridor Web


Despus de configurar el PC debe decidir cul servidor web instalar. La res
puesta casi siempre es Apache. Apache ofrece las siguientes ventajas:

| v0 Es gratis. Hace falta decir algo ms?

u * Corre en una gran variedad de sistemas operativos. Apache corre en


Windows, Linux, Mac OS, FreeBSD y la mayora de las variedades de Unix.

| /> Es popular. Aproximadamente el 60 por ciento de los sitios web en


Internet usan Apache, segn encuestas en www.netcraft.com/survey y
www.securi tyspace. com/s_survey/data/. Esto no sera as si no funciona
ra bien. Adems, esto significa que un gran nmero de usuarios podr ayudarlo.

| Es confiable. Una vez que Apache est instalado y funcionando, funcio


nar el tiempo que lo haga su PC. Es muy raro tener problemas de emer-
I gencia con Apache.
A
I Se puede personalizar. La licencia de fuente abierta permite a los pro
gramadores modificar el software de Apache, agregando o modificando
mdulos para adaptarlo a los ambientes especficos.
; W Es seguro. Existe software gratuito disponible que convierte a Apache
en un servidor SSL (Capa de Sockets/Terminal segura). La seguridad es
1 esencial si va a usar el sitio para comercio electrnico.

Apache se instala automticamente al instalar la mayora de las versiones de Li


nux. Los Macs ms recientes traen Apache instalado. Para la mayora de las va
riedades de Unix, hay que descargar el cdigo fuente de Apache y compilarlo
uno mismo, aunque hay disponibles algunos binarios (programas ya compila
dos para sistemas operativos especficos). Para Windows, usted necesita insta
lar un archivo binario, preferiblemente en Windows NT/2000/XP, aunque Apache
tambin corre en Windows 95/98/Me. Al momento de escribir esto, Apache
1.3.28 y 2.0.47 son actualmente las versiones estables. (Ms informacin sobre
las versiones de Apache est disponible en el Apndice C.) Consulte el sitio web
de Apache (httpd.apache.org) para mayor informacin, descargar software,
documentacin e instrucciones de instalacin para diversos sistemas operati
vos. El sitio brinda amplia documentacin, constantemente mejorada.

Hay otros servidores web disponibles. Microsoft ofrece US (Internet Informa


tion Server / Servidor de informacin de Internet), el cual es el segundo servi
dor web ms popular en Internet, usado en aproximadamente el 27 por
ciento de los sitios web. Sun ofrece iPlanet (anteriormente Netscape Enterpri
se Server) que sirve a menos de un 5 por ciento de Internet. Hay otros servi
dores web disponibles, pero sus bases de usuarios son an ms pequeas.
Parte I: Desarrollar una aplicacin Web con Base de Datos usando PHP y MySQL

Cmo instalar MySQL


Despus de configurar el PC e instalar el servidor web, est listo para instalar
MySQL. Debe instalar MySQL antes de instalar PHP, pues debe brindar la ruta
al software de MySQL al instalar PHP.

Pero antes de instalar MySQL, asegrese de que realmente necesita instalar


lo. Quiz ya est corriendo en su PC, o quiz est instalado pero no est co
rriendo. Muchas versiones de Linux, por ejemplo, instalan automticamente
MySQL. Esta es la manera de verificar si MySQL ya est corriendo en su PC:

v * Linux/Unix/Mac: En la lnea de comandos, digite lo siguiente:



ps -ax

El resultado ser una lista de programas. Algunos sistemas operativos


(generalmente variedades de Unix) tienen opciones diferentes para el
comando ps. Si el comando anterior no produce una lista de programas
que estn corriendo, digite man ps para ver cules opciones debe usar.

En la lista de programas que aparece, busque uno llamado mysql d .

u * Windows: Si MySQL est corriendo, deber verlo en su bandeja de siste


ma en la parte inferior de su pantalla, posiblemente como un semforo
con una luz verde. Si no puede encontrar este icono lo ms probable es
que no est corriendo.

Pero MySQL puede estar instalado aunque no est corriendo, quiz no ha ac


tivado. Esta es la manera de revisar si MySQL est instalado en su PC:

Linux/Unix/Mac: Digite lo siguiente


fi nd / ame "mysql*"
f
Si aparece un directorio llamado mysql, MySQL ya ha sido instalado.

Windows: Busque el programa llamado WinMySQLadmin que, entre


otras funciones, inicia y detiene a MySQL. Probablemente lo encontrar
en el men Inicio (escoja StartOPrograms). Si no, bsquelo en un direc
torio MySQL, que probablemente ser c:\mysql\bin.

Si MySQL est instalado pero no se ha activado, esto es lo que debe hacer pa


ra activarlo:

v 0 Linux/Unix/Mac:
I 1. Cmbiese al directorio mysql /bin.

Este es el directorio que habr encontrado al verificar si MySQL es


taba instalado.

2. Digite safe_mysqld &.

Cuando este comando termina, aparece el prompt.


Captulo 2: Preparar su ambiente de trabajo

3. Verifique que el servidor MySQL se haya activado digitando ps -ax.

En la lista de programas que aparece, busque uno llamado mysql d.

u * Windows:
ij
1. Inicie el programa Wi nMySQLadmi n.
I
Si no lo puede encontrar en el men, navegue hacia el programa,
que probablemente estar en c : \mysql \bi n\wi nmysql admin. e
xe y haga doble clic en l.
%
2 . Haga clic derecho en la ventana WinMySQLadmin.

Aparecer un submen.

3. Seleccione el elemento del men para su sistema operativo: Win


9x o Win NT (que incluye Win 2000 y XP).
ir
4. Haga clic en Start the Server.

Si MySQLno est instalado en su PC, debe descargarlo de w w w .mysql . com e


instalarlo. El sitio web brinda toda la informacin y el software que necesita.
(Econtrar instrucciones de instalacin detalladas en el Apndice A.)

Cmo instalar PHP


Despus de instalar MySQL, est listo para instalar PHP. Como mencion ante
riormente, debe instalar MySQL antes de instalar PHP porque necesita brindar
la ruta al software de MySQL cuando instala PHP. PHP no podr comunicarse
con MySQL si al instalarse no se compila con soporte para MySQL.

Antes de instalar PHP, verifique si ya est instalado. Algunas versiones de Li


nux y Mac, por ejemplo, instalan automticamente PHP. Para ver si PHP est
instalado, busque en su disco cualquier archivo de PHP:

f > Linux/Unix/Mac: Digite lo siguiente:


f i n d / -ame "php*"
(
I Windows: Use la opcin Find (escoja StarK>Find) para buscar php*.

Si encuentra archivos de PHP, PHP ya est instalado, y quiz no necesite reins


talarlo. Es posible que incluso si instal MySQL usted mismo despus de insta
lar PHP, lo haya instalado en el lugar donde PHP espera que est. Pero mejor
prevenir que lamentar: lleve a cabo la prueba que describo en la seccin si
guiente para ver si MySQL y PHP estn funcionando juntos correctamente.

Si no encuentra ningn archivo PHP, PHP no est instalado. Para instalar PHP, de
be tener acceso al servidor web de su sitio. Por ejemplo, cuando instala PHP con
Apache, debe editar el archivo de configuracin de Apache. Toda la informacin
y el software que necesita los encontrar en el sitio web de PHP (www .php.net).
En el Apndice B encontrar instrucciones detalladas para su instalacin.
Parte I: Desarrollar una aplicacin Web con Base de Datos usando PHP y MySQL

Probando, probando, 1, 2, 3
Suponga que cree que PHP y MySQL estn disponibles para ser usados, por
alguna de las razones siguientes:

' > El departamento de TI de su compaa o de la compaa de su cliente le


dio toda la informacin que usted solicit y le dijeron que todo est listo
para continuar.

is* La compaa de hospedaje de sitios web le dio toda la informacin que


usted necesita y le dijo que todo est listo para continuar.

S Sigui todas las instrucciones e instal PHP y MySQL usted mismo.

Ahora debe hacer algunas pruebas para asegurarse de que PHP y MySQL es
tn funcionando correctamente.

Someter PHP a prueba


Para comprobar si PHP est instalado y funcionando, siga estos pasos:

1. Encuentre el directorio en el cual deben guardarse sus programas de PHP.


Este directorio y los subdirectorios dentro de l son su espacio web. Apa
che llama a este directorio el Documento Raz. El espacio web predetermi
nado de Apache es htdocs en el directorio donde Apache est instalado.
En HS es I netpub\wwwroot. En Linux podra ser / va r/www/html. El es
pacio web se puede determinar en un directorio diferente configurando el
servidor web (consulte el Apndice C). Si est usando una compaa de
hospedaje de sitios, el personal le suministrar el nombre del directorio.

2. Cree el siguiente archivo en alguna parte de su espacio web con el


nombre t e s t . php.
<html>
<head>
<title> Prueba PHP</title>
</head>
<body>
<p>Esto es una linea HTML
<P>
<? php
echo "Esto es una linea PHP";
ph p i n f o f );
?>
sea </body></html>

El archivo debe guardarse en su espacio web para que el servidor web


pueda encontrarlo.
Captulo 2: Preparar su ambiente de trabajo

3. Dirija su explorador al archivo test.php creado en el Paso 1. Es decir,


digite el nombre de su servidor web (www.mifinaempresa.com) en la
ventana de direccin del explorador.
Si su servidor web, PHP y el archivo t e s t . p h p estn en el mismo PC en
el que est haciendo la prueba, puede digitar localhost/test.php.

Para que el archivo sea procesado por PHP, usted debe tener acceso al
archivo mediante el servidor web, y no escogiendo Filed Open desde el
men de su explorador web.

Deber ver lo siguiente en el explorador web:


Esto es una linea HTML
Esto es una linea PHP

Debajo de estas lneas debera ver una gran tabla que muestra toda la in
formacin asociada con PHP en su sistema. Muestra la informacin PHP,
la ruta y los nombres de archivos, los valores de las variables y el estado
de algunas opciones. La tabla la produce la lnea phpi n f o ( ) en las ins
trucciones de la prueba. Siempre que tenga una pregunta sobre la confi
guracin de PHP, puede usar la instruccin phpi n f o ( ) para mostrar
esta tabla y revisar las configuraciones.

4. Verifique los valores PHP de los valores que necesita.

Por ejemplo, necesita que el soporte para MySQL est habilitado. Al re


correr la lista, encuentre la seccin dedicada a MySQL y asegrese de
que el soporte para MySQL est On .
5. Si es necesario cambie los valores.
Si no tiene acceso administrativo a PHP, debe pedirle al administrador
que cambie cualquier valor que deba ser cambiado. Usted mismo podr
cambiar los valores si fue usted quien instal PHP y/o tiene acceso admi
nistrativo a PHP. (En el Apndice B discuto cmo cambiar la configura
cin de PHP.)

Someter MySQL a prueba


Si ya sabe que PHP est corriendo bien, pruebe si tiene acceso a MySQL
usando PHP. Solo siga estos pasos:

1. Cree el siguiente archivo en alguna parte de su espacio web con el


nombre mysql_up.php.

Puede descargar el archivo de mi sitio web en j a n e t . val a d e . com.


Parte I: Desarrollar una aplicacin Web con Base de Datos usando PHP y MySQL

Chtml>
C h e a d X t i t i e>Test MySQL</titie></head>
<body>
<J-- mysql_up.php -->
<?php
$host="hostname" *
$user="m y s q l a c c o u n t " ;
$password=Mmysqlpassword*i

mysq l_ co nn ec t($ h o s t ,$ u s e r ,$password);


$sql="show status";
$result = m y s q l _ qu er y( $sq l);
if ($result == 0)
echo "<b>Error , mysql_errno(). "
. m y s q l _ e r r o r (). "</b> ;
el se

?>
<{-- Table that displays the results - >
<table border="l">
< t r X t d X b > V a r i abl e_name</b></td><td><b>Val ue</b>
</tdX/tr>
<?php
for ($ i - 0; $i < mysql_num,rows($result); $i++) {
echo " < T R > " ;
SrovCarray = mysql_fetch_row($result);
for ($j = 0; $j < mysql_num_fields($result); $j++)
{
echo "<TD> . $rowarray[$j]. "</td>":
}
echo "</tr>";
}
?>
</table>
<?php } ?>
C/bodyX/htm! >

2. Las lneas 6, 7 y 8 del programa deben cambiarse. Estas lneas son


$host="h o s t " ;
$user="mysqlaccount";
$password="mysqlpassword ;

Cambie Lastame" por el nombre del PC donde est instalado MySQL,


por ejemplo d a t a b a s e h o s t .mi compai a .c o m . Si la base de datos
MySQL est en el mismo PC que su sitio web, puede usar local host co
mo el nombre del anfitrin.

Cambie rnysql accountname y mysql password a los valores apropia


dos. (Comento las cuentas y las contraseas de MySQL en el Captulo 5).
Si su cuenta MySQL no requiere contrasea, no digite nada entre las co
millas, como sigue:
Captulo 2: Preparar su ambiente de trabajo

$p as sword="";

3. Dirija su explorador a mysql up.php.


Debera ver una tabla con una larga lista de nombres y valores de varia
bles. No querr ver un mensaje de error o un mensaje de advertencia.
No se preocupe por el contenido de la tabla. Lo nico importante es que
aparezca la tabla, para as saber que su conexin a MySQL est funcio
nando correctamente.

Si no aparece ningn mensaje de error o de advertencia, MySQL est


funcionando bien. Si ve un mensaje de error o de advertencia, debe co
rregir el problema que est provocando el mensaje.

Los mensajes de error y advertencia generalmente son muy claros. El siguien


te es un mensaje de error comn.

MySQL Connection Failed: Access denied for user:


'u s e r 7 3 @l oc al hos t' (Using password: YES)

Lo que este mensaje quiere decir es que MySQL no acept el nmero de su


cuenta MySQL o su contrasea MySQL. Note que el mensaje dice YES para
Using password, pero por razones de seguridad no muestra la contrasea
que usted digit. Si intent con una contrasea en blanco, el mensaje dira NO.

Si recibe un mensaje de error, vuelva a revisar el nmero de su cuenta y su


contrasea. Recuerde que este es su nmero de cuenta MySQL, y no su n
mero de cuenta para registrarse en el PC. Si no se puede conectarse con el
nmero de cuenta y contrasea que tiene, deber contactar al departamento
TI o a la compaa de hospedaje que le dio su nmero de cuenta. (Consulte el
Captulo 5 para una discusin ms exhaustiva sobre las cuentas y las contra
seas de MySQL.)
Captulo 3

Desarrollar una aplicacin Web


con base de datos
V S> !$ * # * * * * * * * 0 0 S * 0 0 0 * V

w este captulo
Planear su aplicacin
Seleccionar y organizar sus datos
& Disear su base de datos
$**- Resumen de la construccin de su base de datos
I Resumen de la escritura de los programas para su aplicacin

t 1 esarrollar una aplicacin con base de datos para la Web no se reduce a al-
^ m a c e n a r informacin en bases de datos MySQL y digitar programas en
PHP. El desarrollo debe empezar con el planeamiento. Construir las partes de
la aplicacin se hace despus del planeamiento. Los pasos del desarrollo son:

1. Desarrollar un plan, enumerando las tareas que su aplicacin debe


realizar.

2. Disear la base de datos necesaria para las tareas de su aplicacin.

3. Construir la base de datos MySQL, con base en el diseo de la base de datos.

4. Escribir los programas con PHP que realizarn las tareas de la aplicacin.

En este captulo comento detalladamente estos pasos.

Planear su aplicacin Web con


base de datos
Antes de poner un dedo en el teclado para escribir un programa en PHP, debe
planear su aplicacin. Este es probablemente el paso ms importante en el
desarrollo de su aplicacin. Es muy doloroso descubrir, especialmente justo
despus de haber terminado el ltimo programa para su aplicacin, que dej
Parte I: Desarrollar una aplicacin Web con Base de Datos usando PHP y MySQL

algo por fuera y que tendr que empezar de nuevo desde el principio. Tam
bin ser difcil para su PC (y para sus pies) si usted se libera de sus frustra
ciones patendolo por toda la habitacin!

Un buen planeamiento evita esos dolorosos retrocesos. Adems, le ayuda a


concentrarse en las funciones propias de su aplicacin, lo cual evitar que us
ted escriba partes de la aplicacin que hagan cosas realmente llamativas pero
que no tengan ningn propsito real en la aplicacin terminada. Y si ms de
una persona est trabajando en su aplicacin, el planeamiento garantiza que al
final todas las partes encajen.

Identificar lo que espera de la aplicacin


El primer paso de la fase de planeamiento es identificar exactamente por qu
est desarrollando su aplicacin y qu espera de ella. Por ejemplo, su prop
sito principal podra ser:

v* Recopilar los nombres y las direcciones de los usuarios de modo que


pueda crear una lista de clientes.

v0 Darle a los usuarios informacin sobre sus productos, como en un cat


logo para clientes.
i u0 Vender productos en lnea.
u0 Brindar soporte tcnico a personas que ya poseen sus productos.

Despus de haber identificado claramente el propsito general de su aplica


cin, haga una lista de lo que exactamente espera que haga la aplicacin. Por
ejemplo, si su meta es desarrollar una base de datos con los nombres y las di
recciones de sus clientes para propsitos de mercadeo, la lista de tareas re
queridas de la aplicacin es bastante corta:

f, u0 Brindar un formulario para que lo llenen los clientes.

u0 Almacenar la informacin de los clientes en una base de datos.

Si su meta es vender productos en lnea, la lista es un poco ms larga:

i01 Brindar a los clientes informacin sobre sus productos.


u0 Motivar al cliente para que compre el producto.
v0 Proporcionar una manera para que el cliente ordene el producto en lnea.
Proporcionar un mtodo para que el cliente pague por el producto en lnea.

f v0 Validar el pago de modo que sepa que realmente va a recibir el dinero.


| i0 Enviar el pedido a la persona responsable de alistar y enviar el producto
I al cliente.
Captulo 3: Desarrollar una aplicacin Web con base de datos

En este punto del proceso de planeamiento, las tareas que desea que su apli
cacin realice son todava bastante generales. Puede cumplir cada una de es
tas tareas de muchas maneras diferentes. Ahora debe examinar las tareas de
cerca y detallar con exactitud cmo las cumplir la aplicacin. Por ejemplo,
si su meta es vender productos en lnea, podra ampliar la lista anterior as:

v* Brindar a los clientes inform acin sobre sus productos.


Mostrar una lista de las categoras de productos. Cada categora es
un vnculo.
Cuando el cliente hace clic en el vnculo de una categora, aparece la
lista de productos de esa categora. El nombre de cada producto es
un enlace.
Cuando un cliente hace clic en el vnculo de un producto, aparece
la descripcin del producto.
M otivar al cliente para que compre el producto.
Presentar descripciones de los productos muy bien escritas y que
. comuniquen sus cualidades obviamente superiores.
Usar fotos que favorezcan a sus productos.
Hacer que estn disponibles en lnea folletos a color sobre los productos.
p Ofrecer descuentos por cantidad.
is* Proporcionar una manera para que el cliente ordene el producto en lnea.
Incluir un botn en el que los clientes puedan hacer clic para indi-
i car su intencin de comprar el producto.
i Incluir un formulario que recopile la informacin necesaria sobre el
producto que el cliente est ordenando, tal como su tamao, color, etc.

Calcular y mostrar el costo total de todos los artculos en el pedido.

Calcular y mostrar los costos de envo.

Calcular y mostrar el impuesto de ventas.

I Incluir formularios para que los clientes digiten sus direcciones de


| envo y de cobro.

| is0 Proporcionar un mtodo para que el diente pague por el producto en lnea.
Incluir un botn en el que los clientes puedan hacer clic para pagar
con una tarjeta de crdito.

Mostrar un formulario que recoja la informacin de la tarjeta de


crdito de los clientes.

V Validar el pago de m odo que sepa que realmente va a recibir el dinero.


El m todo usual es enviar la informacin de la tarjeta de crdito del
i cliente a un servicio de procesamiento de tarjetas de crdito.
^ Enviar el pedido a la persona responsable de alistar y enviar el pro
ducto al cliente.
Parte I: Desarrollar una aplicacin Web con Base de Datos usando PHP y MySQL

Bastar con enviar la informacin del pedido por correo electrnico al


departamento de envo.

En este punto usted ya debe tener una idea bastante clara de lo que desea de su
aplicacin con base de datos. Sin embargo, esto no significa que si 's metas no pue
den cambiar. (De hecho, sus metas probablemente cambiarn mientras desarrolla
su aplicacin y descubre posibilidades nuevas). Al inicio del proyecto empiece
con un plan tan completo como le sea posible, de esa manera se mantendr con
centrado y evitar topar con callejones sin salida o desviarse de la meta original.

Tome en cuenta a tos usuarios


Identificar lo que usted espera que haga su aplicacin con base de datos para
la Web es solo un aspecto del planeamiento. Tambin debe tomar en cuenta lo
que sus usuarios querrn de ella. Por ejemplo, digamos que su meta es recopi
lar una lista con los nombres y las direcciones de sus clientes para propsitos
de mercadeo. Estarn dispuestos sus clientes a entregar esa informacin?

Su aplicacin tiene que cumplir un propsito para los usuarios al igual que para
usted. Si no es as la ignorarn. Antes, por ejemplo, de que los usuarios estn dis
puestos a darle sus nombres y direcciones, necesitan percibir que al darle esa in
formacin se beneficiarn de alguna manera. Estos son ejemplos de por qu
estaran dispuestos los usuarios a registrar sus nombres y direcciones en su sitio:

| v * Para recibir un boletn: Para que lo consideren valioso, el boletn debe cu


brir la industria relacionada con sus productos. Debe ofrecer noticias y ten
dencias, y no slo servir como espacio de mercadeo para sus productos.

| v * Para participar en una rifa con un buen premio: Quin va a rechazar


la oportunidad de ganar unas vacaciones con todos los gastos pagados
a Hawai, o una camioneta familiar completamente nueva?

Para recibir descuentos especiales: Por ejemplo, peridicamente podra


ofrecerles a sus clientes descuentos especiales por correo electrnico.
sj
1 i> Para ser notificado sobre productos nuevos o mejoras en los produc
tos, tan pronto estn disponibles: Por ejemplo, a los clientes les podra
interesar que se les notifique cuando haya actualizaciones de software
listas para descargar.
i
| v * Para tener acceso a informacin valiosa: Por ejemplo, debe registrarse en el
sitio web de The New York Times para tener acceso a sus artculos en lnea.

Agregue, a continuacin, las tareas desde la perspectiva de los clientes a la lis


ta de tareas que usted quiere que la aplicacin realice. Por ejemplo, suponga
que ya identific esta lista de tareas necesarias para montar en lnea una tien
da de ventas al detalle:

| v* Brindar un formulario para que lo llenen los clientes.

v* Almacenar la informacin de los clientes en una base de datos.


Captulo 3: Desarrollar una aplicacin Web con base de datos

Si toma en cuenta el punto de vista del cliente, la lista se ampla un poco:

1 v0 Presentar una descripcin de las ventajas que tendrn los clientes si se


registran en el sitio.

| V Brindar un foimulario para que lo llenen los clientes.

1 u0 Agregar las direcciones electrnicas de los clientes a la lista de distribu-


cin del boletn.

I ^ Almacenar la informacin de los clientes en una base de datos.

Si su lista incluye las tareas que usted desea y las tareas que sus usuarios de
sean, tiene un plan para una aplicacin web que valdr la pena desarrollar, y
que desde el punto de vista de sus usuarios valdr la pena usar.

Hacer que et sitio sea fcil de usar


Adems de planear lo que su aplicacin web va a hacer, debe considerar cmo lo
va a hacer. Hacer que su aplicacin sea fcil de usar es importante: sus clientes no
comprarn sus productos si no los pueden encontrar. Y si los clientes no encuen
tran la informacin que necesitan en un tiempo relativamente corto, buscarn en
otro lugar. En la Web, los clientes siempre pueden irse fcilmente para otro lugar.

Hacer su aplicacin fcil de usar es ingeniera de usabilidad. La usabilidad en


la Web incluye cosas como:

1 i0 ' Navegacin: Para el usuario debe ser inmediatamente obvio qu hay en


I su sitio y dnde est localizado.
i
0 0 Grficos: Los grficos hacen que su sitio sea atractivo, pero los archivos
de grficos pueden ser muy lentos de mostrar.

u0 Acceso: Algunas decisiones sobre el diseo pueden hacer que su aplica


cin sea o no accesible a los usuarios con discapacidades tales como
problemas visuales.
v0 Exploradores: Diferentes exploradores web (incluso versiones diferentes del
mismo explorador) pueden mostrar el mismo archivo de HTML (Lenguaje de
Marcado de Hipertexto/HyperText Markup Language) en forma diferente.

La usabilidad en la Web es un tema amplio e importante, aunque entrar en ms deta


lles sobre este tema est ms all del alcance de este libro. Pero no tema, puede en
contrar mucha informacin til sobre la usabilidad en la Web lo adivin en la
Web. Asegrese de revisar los sitios web de los expertos en usabilidad Jakob Nielsen
(www.use i t .com)y Jarod Spool (http://worl d .std.com/~ui eweb/). Vincent
Flanders tambin tiene un sitio divertido lleno de informacin til sobre el diseo
Web en WebPagesThatSuck.com. Hay libros sobre el tema que tambin pueden
ayudarle, tal como Web Design For Dummies de Lisa Lopuck (Wiley Publishing, Inc.).
Parte I: Desarrollar una aplicacin Web con Base de Datos usando PHP y MySQL

Dejar espacio para expansiones


Algo indudable sobre su aplicacin web es que cambiar con el tiempo. Con
el paso del tiempo podran ocurrrsele nuevas funciones para ella, o simple
mente desear cambiarle algo. O tal vez el software para sitios web mejore de
modo que su aplicacin podra hacer cosas que no poda hacer cuando la
mont por primera vez. Cualquiera que sea la razn, su sito web cambiar.
Cuando planea su aplicacin, debe tener presentes los cambios futuros.

Puede disear su aplicacin en pasos, tomando en cuenta los cambios planeados.


Puede desarrollar un plan en el cual construya una aplicacin hoy que cumpla con
sus ms inmediatas necesidades y ponerla a disposicin tan pronto como est
lista. Su plan puede incluir agregar funciones a la aplicacin tan pronto como
pueda desarrollarlas. Por ejemplo, puede construir un catlogo de productos y
publicarlo en su sitio web apenas est listo. En ese momento puede empezar a tra
bajar en la funcin para hacer pedidos en lnea, la cul agregar cuando est lista.

No necesariamente podr predecir todas las funciones que desear tener en su apli
cacin en el futuro. Por ejemplo, podra disear su sitio web de viajes con secciones
para todos los posibles destinos actuales, pero el futuro podra sorprenderle.
Viajes a Marte? A Alpha Centauro? A un universo alterno? Planee su aplicacin
con la flexibilidad necesaria para poder agregarle funcionalidad en el futuro.

Escrbalo
Escriba su plan. A menudo me va a escuchar diciendo esto. Hablo desde la
dolorosa experiencia de no escribir el plan. Mientras lo desarrolla, su plan es
lo ms importante en su mente y est totalmente claro. Pero en unas cuantas
semanas se sorprender al descubrir que se ha nublado absolutamente,
mientras su atencin se ocupaba de asuntos ms urgentes. 0 dentro de un
ao querr hacer algunos cambios en la aplicacin y no recordar exacta
mente cmo la dise. 0 est trabajando con un socio para desarrollar una
aplicacin y descubre que su socio malentendi su explicacin verbal y
desarroll funciones para la aplicacin que no concuerdan con su plan.
Puede evitar todos estos tipos de problemas si lo escribe todo.

Presentamos los dos ejemplos


creados para este libro
En las dos secciones siguientes presento los dos ejemplos de aplicacin con
bases de datos para la Web que he creado para este libro. Me refiero a estos
dos ejemplos a lo largo de todo el libro para demostrar aspectos sobre el
diseo y desarrollo de aplicaciones.
Captulo 3: Desarrollar una aplicacin Web con base de datos

Cosas para Vender


El primer ejemplo es un catlogo de productos en lnea. Usted es el dueo de una
tienda de mascotas y desea que su catlogo brinde a los clientes informacin sobre
las mascotas que tiene a la venta. Vender mascotas en lnea no es viable, pero an
as usted est considerando la idea de permitir a los clientes "reservar" mascotas en
lnea, es decir, antes de que vengan a la tienda a comprarlas. Actualmente la aplica
cin simplemente es un catlogo en lnea. Los clientes pueden revisar el catlogo en
lnea y luego ir a la tienda a comprar la mascota. La informacin sobre todas las mas
cotas se almacena en una base de datos y los clientes pueden buscar en la base de
datos la informacin sobre mascotas especficas o tipos de mascotas.

Este es su plan para esta aplicacin:

v * Permitirles a los clientes seleccionar sobre cul mascota desean ver


t informacin.
* Ofrezca dos mtodos de seleccin:

Seleccionar de una lista de vnculos: Mostrar una lista de vnculos


que son categoras de mascotas (por ejemplo, perros, gatos, dino
saurios, etc.). Cuando el cliente hace clic en el vnculo de la catego
ra, aparece una lista de mascotas. Cada mascota en la lista es un
vnculo hacia una descripcin de la mascota.

Digitar los trminos de la bsqueda: Mostrar un formulario de bsque


da en el cual los clientes puedan digitar palabras que describen el tipo de
mascota que estn buscando. La aplicacin busca en la base de datos las
palabras que coinciden y muestra la informacin sobre las mascotas que
concuerdan con las palabras de la bsqueda. Por ejemplo, un cliente
puede digitar gato para ver una lista de todos los gatos disponibles. Cada
gato en la lista es un vnculo hacia la descripcin de ese gato.
I
| v * Mostrar una descripcin de la mascota cuando el cliente hace clic en
| el vnculo.

I La descripcin est guardada en una base de datos.

Slo para Miembros


El segundo ejemplo de una aplicacin con base de datos para la Web se rela
ciona con el ejemplo anterior de la tienda de mascotas. Adems del catlogo
en lnea, tambin quiere poner una seccin en el sitio web de su tienda de
mascotas que sea slo para miembros. Para entrar en esta rea del sitio los
clientes deben primero inscribirse, proporcionando sus nombres y direccio
nes. En esta seccin "Slo para miembros", los clientes pueden ordenar ali
mento para mascotas con descuento, averiguar sobre mascotas que han
pedido pero que todava no han llegado, y tambin tener acceso a artculos
con noticias e informacin sobre mascotas y el cuidado de las mascotas.
Parte I: Desarrollar una aplicacin Web con Base de Datos usando PHP y MySQL

Este es su plan para esta aplicacin:

, is Mostar una descripcin sobre la informacin y las caractersticas es


peciales que estn disponibles en la seccin Slo para miembros.

| ^ Incluir un rea donde los clientes puedan inscribirse a la seccin Slo


t para miembros.

| Incluir un vnculo hacia el rea de inscripcin.


i
Mostrar un formulario en el rea de inscripcin en el cual los
clientes puedan digitar la informacin para inscribirse.

El formulario debe incluir espacio para el nombre de registro del


| usuario y una contrasea, as como cualquier otra informacin que
| desee recopilar.
Validar la informacin que el usuario digit.

Por ejemplo, verifique que el cdigo postal tenga la longitud correc-


| ta, que la direccin electrnica est en el formato correcto, etc.
I
Almacenar la informacin en la base de datos.

| u * Incluir una seccin para que ingresen los clientes que ya se han regis
trado en la seccin Slo para miembros.

Mostrar un formulario de entrada que pida al cliente su nombre


de usuario y la contrasea.
Comparar la contrasea y el nombre de usuario digitados por el dien
te con los nombres de usuario y las contraseas en la base* de datos.

Si no se encuentra uno que concuerde, mostrar un mensaje de error.


Mostrar la pgina Slo para miembros si el cliente se registra exito
samente.

Disear la base de datos


Despus de haber determinado con exactitud qu har su aplicacin con base de
datos para la Web (consulte el inicio de este captulo si todava no lo ha hecho), ya
est listo para disear la base de datos que guardar la informacin que necesita
la aplicacin. Disear la base de datos incluye identificar los datos que necesita y
organizar los datos en la forma requerida por el software de la base de datos.

Escoger los datos


Primero tiene que identificar cul informacin debe estar en su base de da
tos. Con base en la lista de tareas que desea que la aplicacin realice, deter
mine cul informacin necesita para completar cada una de esas tareas.
Captulo 3: Desarrollar una aplicacin Web con base de datos

Estos son algunos ejemplos:

Un catlogo en lnea necesita una base de datos que contenga informa-


| cin sobre los productos.
Una aplicacin para hacer oedidos en lnea necesita una base de datos
que pueda guardar la informacin sobre el cliente y la informacin sobre
| los pedidos.

I Un sitio web de viajes necesita una base de datos con informacin sobre
destinos, reservaciones, tarifas, horarios, etctera.

En muchos casos, su aplicacin incluir una tarea que recopile informacin de los
usuarios. Tendr que balancear su necesidad de recopilar toda la informacin po
tencialmente til en la que pueda pensar, contra la renuencia de sus usuarios a dar
informacin personal as como su deseo de evitar formularios en los que habra
que invertir mucho tiempo para poder contestarlos. Una manera es pedir informa
cin opcional. Hay usuarios a quienes no les importar digitarla, pero los usuarios
que no estn de acuerdo podrn dejar los campos en blanco. Otra posibilidad es
ofrecer un incentivo: mientras ms largo sea el formulario ms atractivo debe ser el
incentivo que necesitar para motivar a los usuarios a llenar el formulario. Un usua
rio podra estar dispuesto a llenar un formulario muy corto para participar en una
rifa que ofrezca como premio dos tiquetes para un estreno cinematogrfico. Pero si
el formulario es largo y complicado, el precio debe ser ms valioso, tal como un via
je gratis a California que incluya un tour a un estudio de cine en Hollywood.

En la aplicacin del primer ejemplo, sus clientes recorren el catlogo en lnea


buscando informacin sobre las mascotas que tal vez quisieran comprar. A
usted le conviene que los clientes vean informacin que los motive a com
prar la mascota. La informacin que debiera estar disponible en la base de
datos para ser vista por los clientes es:

| El nombre de la mascota

I Por ejemplo poodle, unicornio y as sucesivamente

| Una descripcin de la mascota

| Una foto de la mascota

El costo de la mascota

En la aplicacin del segundo ejemplo, la seccin Slo para miembros, le con


viene guardar informacin sobre los miembros inscritos. La informacin que
debiera guardar en la base de datos es:

| u* El nombre del miembro


%
| v* La direccin del miembro

, El nmero telefnico del miembro

| El nmero de fax del miembro

I La direccin electrnica del miembro


Parte I: Desarrollar una aplicacin Web con Base de Datos usando PHP y MySQL

Trnese tiempo para desarrollar una lista completa de la informacin que necesita
guardar en su base de datos. Aunque puede cambiar y agregar informacin a su
base de datos despus de haberla desarrollado, es ms fcil incluir la informacin
desde el principio. Adems, si aade informacin a la base de datos posteriormen
te despus de que est en uso los primeros usuarios en la base de datos ten
drn su informacin incompleta. Por ejemplo, si en un momento dado cambia su
formulario y empieza a preguntar la edad del usuario, no tendr la edad de las per
sonas que llenaron el formulario antes y que todava estn en la base de datos.

Organizar (os datos


MySQL es un SABD relacional (Sistema Administrativo de Base de Datos), lo
cual significa que los datos se organizan en tablas. (Consulte el Captulo 1 para
mayor informacin sobre MySQL.) Usted puede establecer relaciones entre las
tablas en la base de datos.

Organizar datos en tablas


Las tablas de un SABD relacional se organizan como cualesquiera otras tablas
que usted ya conoce, es decir, en filas y columnas, como se muestra en la Fi
gura 3-1. Un campo es el lugar en el cual se cruzan una fila y una columna par
ticulares, es decir, una celda individual.

Colum na 1 C olum na 2 C olum na 3 Colum na 4

Fila 1

Fila 2

Fila 3 M-- Campo

Figura 3-1:
Fila 4
Los datos en
M ySQ L se
organizan Fila 5
en tablas.

Cada tabla se concentra en un objeto (una cosa) sobre el cual se desea


guardar informacin. Estos son algunos ejemplos de objetos:

| > Clientes
I u0 Productos

u0 Compaas
Captulo 3: Desarrollar una aplicacin Web con base de datos

V* Animales
jy'i
Ciudades

Salas
!|i
V* Libros
PCs
>.
Formas
Si
I Documentos

Proyectos
;V

Semanas

Se debe crear una tabla para cada objeto. El nombre de la tabla debe identifi
car claramente los objetos que contiene con una palabra o un trmino descrip
tivos. El nombre debe ser una cadena de caracteres sin espacios. El nombre de
la tabla puede contener letras, nmeros, lneas de subrayado (_ ) o signos de
dlares ($). Se acostumbra nombrar la tabla en singular. As, un nombre para
una tabla de clientes podra ser C1 i ente, y una tabla con los pedidos de los
clientes se podra llamar Pedi dodel C1 i ente. El uso de maysculas y mins
culas es significativo en Linux/Unix pero no en Windows: PedidodelCliente y
pedidodelcliente son lo mismo para Windows, pero no para Linux o Unix.

En la jerga de las bases de datos, un objeto es una entidad, y una entidad tiene atri
butos. En la tabla, cada fila representa una entidad, y las columnas contienen los
atributos de cada entidad. Por ejemplo, en una tabla de clientes cada fila contiene
informacin sobre un nico cliente. Algunos de los atributos en las columnas po
dran ser nombre, apellido, nmero telefnico, edad y otros datos por el estilo.

Estos son los pasos a seguir para organizar sus datos en tablas:

1. Nombre su base de datos.

Asigne un nombre a la base de datos de su aplicacin. Por ejemplo, una


base de datos que contenga informacin sobre las familias en un vecin
dario podra llamarse Di rectori oFami lias.

2. Identifique los objetos.

Revise la lista de informacin que desea guardar en la base de datos. (Si todava
no la ha hecho, consulte la seccin "Escoger los datos" anteriormente en este
captulo). Analice su lista e identifique los objetos. Por ejemplo, posiblemente
la base de datos Di rectori oFami 1 ia s necesitara almacenar lo siguiente:

Nombre de cada miembro de la familia

Direccin de la casa

Nmero telefnico

Edad de cada miembro de la familia

El cereal que cada miembro de la familia prefiere para desayunar


Parte I: Desarrollar una aplicacin Web con Base de Datos usando PHP y MySQL

Cuando analice esta lista cuidadosamente, se dar cuenta de que est al


macenando informacin sobre dos objetos: la familia y los miembros de
la familia. O sea, la direccin y el nmero telefnico son para la familia
en general, pero el nombre, la edad y el cereal favorito son para miem
bros individuales de la familia.
3. Defina y nombre una tabla para cada objeto.
Por ejemplo, la base de datos Di r e c t o r i oFami l i a s necesita una tabla
llamada F a mi l i a y una tabla llamada Mi embrodel a Fami 1 i a
4. Identifique los atributos de cada objeto.
Analice su lista de informacin e identifique los atributos que necesita guar
dar sobre cada objeto. Desglose la informacin a guardar en las partes ms
pequeas posibles, dentro de lo razonable. Por ejemplo, cuando guarde el
nombre de una persona en una tabla, puede desglosar el nombre en nom
bre y apellido. Hacer esto le permitir ordenar los datos por apellido, lo
cual sera ms difcil de hacer si el nombre y el apellido estuvieran guarda
dos juntos. De hecho, podra desglosar el nombre en nombre, segundo
nombre, primer y segundo apellido, aunque no son muchas las aplicacio
nes que necesitan usar el segundo nombre en forma separada.
5. Defina y nombre las columnas para cada uno de los atributos que
identific en el Paso 4.
D a cada columna un nombre que identifique claramente la informacin
que hay en esa columna. Los nombres de las columnas deben ser de una
sola palabra, sin espacios. Por ejemplo, podra nombrar columnas as:
nombre y apellido o primer_nombre y apellido.
Algunas palabras estn reservadas para el uso especfico de MySQL o SQL y no
se pueden usar como nombres de columnas. Estas palabras se usan en instruc
ciones SQL o estn reservadas para uso futuro. Por ejemplo ADD, AL L, AND,
CREATE, DROP, GROUP, ORDER, RETURN, SELECT, SET, TABLE, USE,
WH ERE y muchas, muchas ms no se pueden usar como nombres de columnas.
Para ver la lista completa de palabras reservadas, consulte el manual en lnea
de MySQL en www.mysql.com/doc/en/Reserved_words.html .
6. Identifique la clave primaria.

Cada fila en una tabla necesita un identificador nico. En una misma tabla
no puede haber dos filas exactamente iguales. Cuando disee su tabla, de
cida cul columna tiene el identificador nico, llamado llave primaria. La
llave primaria puede estar conformada por la combinacin de ms de una
columna. En muchos casos, los atributos de sus objetos no tendrn un
identificador nico. Por ejemplo, una tabla de clientes podra no tener un
identificador nico porque dos clientes pueden tener el mismo nombre.
Cuando no hay una columna de identificador nico, debe agregar una co
lumna especficamente para que sea la llave primaria. Frecuentemente,
una columna con una secuencia numrica se usa para este propsito. Por
ejemplo, en la Figura 3-2 la clave primaria es el campo el i ente_i d por
que cada cliente tiene un nmero de identificacin nico.
Captulo 3: Desarrollar una aplicacin Web con base de datos

c lie n te jd nombre apellido telefono

27895 John Smith 555-5555

44555 Joe Lpez 555-5553

23695 Judy Chang 555-5552

27822 Jubal Tudor 555-5556


Figura 3-2:
Un ejemplo
de la tabla 29844 Joan Smythe 555-5559
C1i e n t e .

7. Defina los valores predeterminados.

Puede definir los valores predeterminados que MySQL asignar a los cam
pos cuando no se digiten datos en ellos. No es imprescindible tener valo
res predeterminados, pero a menudo es til. Por ejemplo, si su aplicacin
guarda direcciones que incluyen el pas, puede especificar EEUU como
predeterminado. Si el usuario no digita ningn pas, se usar EEUU.

8. Identifique columnas con datos obligatorios.

Puede definir columnas a las que no se les permitir estar vacas (tambin
llamadas NULL). Por ejemplo, la columna que contiene su clave primaria no
puede estar vaca. Eso significa que MySQL no va a crear la fila si no se guar
da ningn valor en la columna. El valor puede ser un espacio en blanco o
una cadena vaca (por ejem plo,""), pero debe guardarse algn valor en la
columna. Puede determinar que otras columnas, adems de la que conten
ga la clave primaria, indiquen que hay un error cuando estn vacas.

Las bases de datos bien diseadas guardan cada trozo de informacin en un


solo lugar. Guardarlo en ms de un lugar es ineficiente y crea problemas si
hay que cambiar la informacin. Si cambia la informacin en un lugar pero ol
vida cambiarla en el otro lugar, su base de datos tendr serios problemas.

Si descubre que est guardando los mismos datos en varias filas, probablemente
necesitar reorganizar sus tablas. Por ejemplo, suponga que est guardando da
tos sobre libros, incluyendo la direccin de la casa editorial. Cuando digita los da
tos, descubre que est digitando la direccin de la misma editorial en muchas
filas. Un modo ms eficiente de almacenar estos datos sera guardar la informa
cin sobre los libros en una tabla y la informacin sobre la editorial del libro en
una tabla aparte. Puede definir dos tablas: Libro y Editor i al. En la tabla Libro,
tendr las columnas ti tul o . autor, fecha_pub y precio. Enlatabla Edi to-
rial tendr columnas tales com o nombre, Di reccionCal 1e , ciudad,etc.
Parte I: Desarrollar una aplicacin Web con Base de Datos usando PHP y MySQL

Cmo crear relaciones entre tablas


Hay tablas en las bases de datos que se relacionan entre s. Con mucha frecuen
cia, una fila en una tabla estar relacionada con varias filas en otra tabla. Se nece
sita una columna para conectar las filas relacionadas en tablas diferentes. En
muchos casos, habr que incluir una columna en una tabla para guardar los da
tos que concuerden con los datos en la columna de llave primaria de otra tabla.

Un tipo de aplicacin comn que necesita una base de datos con dos tablas re
lacionadas es una aplicacin para pedidos de clientes. Por ejemplo, una tabla
contiene la informacin sobre el cliente, tal como nombre, direccin, telfono,
etc. Cada cliente puede tener de cero a muchos pedidos. Puede guardar la in
formacin sobre sus pedidos en la tabla con la informacin del cliente, pero
tendra que crearse una fila completamente nueva cada vez que el cliente hi
ciera un pedido, y cada fila nueva tendra que contener toda la informacin del
cliente. Sera mucho ms eficiente guardar los pedidos en una tabla aparte. La
tabla Pedidos tendra una columna que contenga la clave primaria de una fila
en la tabla C1 i ente, de modo que el pedido se relacione con la fila correcta en
la tabla C1 i ente. La relacin se muestra en las tablas de las Figuras 3-2 y 3-3.

La tabla C1 i ente en este ejemplo luce como en la Figura 3-2 (consulte la sec
cin anterior). Observe el identificador nico (el iente__i d) para cada cliente.

La tabla Ped do relacionada se muestra en la Figura 3-3. Observe que tiene la


misma columna el i ente_i d que aparece en la tabla C1 iente. De este mo
do, la informacin del pedido en la tabla Ped do se conecta con el nombre y
nmero telefnico del cliente con el que se relaciona en la tabla C1 iente.

En este ejemplo, las columnas que relacionan la tabla C1 i ente y la tabla Pe


di do tienen el mismo nombre. Podran tener nombres diferentes siempre y
cuando los datos en las columnas fueran los mismos.

Num orden cliente id n u m jte m costo

87-222 27895 cat-3 200.00

87-223 27895 cat-4 225.00

87-224 44555 horse-1 550.00

87-225 44555 dog-27 210.00


Figura 3-3:
Un ejemplo
de la tabla 87-226 27895 bird-1 50.00
Pedido.
_________________ Captulo 3: Desarrollar una aplicacin Web con base de datos

Disear (as bases de datos de los ejemplos


En las dos secciones siguientes, diseo las dos bases de datos para los dos
ejemplos de aplicaciones usados en este libro.

Proceso del diseo del Catlogo de mascotas


Suponga que quiere mostrar la siguiente lista de informacin cuando los
clientes busquen en su catlogo de mascotas:

u * El nombre de la mascota

Por ejemplo, poodle, unicornio y as sucesivamente,

lina descripcin de la mascota

u * Una foto de la mascota

El costo de la mascota

En el plan del Catlogo de mascotas, aparece una lista de categoras de masco


tas. Esto implica que cada mascota debe clasificarse en una categora de mas
cotas y que la categora de mascotas debe almacenarse en la base de datos.

Se debe disear la base de datos CatalogodeMascotas siguiendo los pasos presen


tados en la seccin "Organizar los datos en tablas", anteriormente en este captulo:

1. Nombre su base de datos.


La base de datos para el Catlogo de mascotas se llama Catalogode
Mascotas.

2. Identifique los objetos.

La lista de la informacin es:


El nombre de la mascota (por ejemplo, poodle, unicornio, y as su
cesivamente.)

Una descripcin de la mascota

Una foto de la mascota

El costo de la mascota

La categora de la mascota

Toda esta informacin es sobre mascotas, as que el nico objeto para


esta lista es Mascota .

3. Defina y nombre una tabla para cada objeto.

La aplicacin para el Catlogo de mascotas necesita una tabla llamada


Mascota.
Parte I: Desarrollar una aplicacin Web con Base de Datos usando PHP y MySQL

4. Identifique los atributos de cada objeto.


Ahora debe considerar la informacin en detalle:

El nombre de la mascota: Un solo atributo; por ejemplo poodle,


unicornio y as sucesivamente. Sin embargo, es muy posible que su
tienda de mascotas tenga ms de un poodle a la venta al mismo
tiempo. Por lo tanto, su tabla necesita un identificador nico que
sirva com o clave primaria.

El nmero de identificacin de la mascota: Un nmero secuencial


asignado a cada mascota cuando se aade a la tabla. Este nmero
es la clave primaria.

La descripcin de la mascota: Dos atributos: la descripcin escrita


de la mascota tal como aparecera en el catlogo impreso y el color
de la mascota.
La foto de la mascota: El nombre de la ruta hacia un archivo grfi
co que contenga una hermosa foto de la mascota.
El costo de la mascota: La cantidad en efectivo que la tienda pide
por la mascota.

La categora de la mascota: Dos atributos: el nombre de la catego


ra a la que pertenece la mascota por ejemplo perro, caballo,
dragn y una descripcin de la categora.

Sera ineficiente incluir dos tipos de informacin en la tabla Ma scota:


La informacin de la categora incluye una descripcin de la catego
ra. Como cada categora puede incluir varias mascotas, incluir la des
cripcin de la categora en la tabla Mascota dara como resultado que
la misma descripcin aparezca en varias filas. Es ms eficiente definir
la Categora de la mascota como un objeto con su propia tabla.

Si la mascota viene en varios colores, toda la informacin de la mas


cota se repetira en una fila aparte para cada color. Es ms eficiente
definir Color de la mascota como un objeto con su propia tabla.

Las tablas agregadas se llaman Ti podeMascota y Col ordel aMascota .


5. Defina y nombre las columnas.
La tabla Mascota tiene una fila para cada mascota. Las columnas de la
tabla Mascota son

Idm ascota: Un nmero secuencial nico asignado a cada mascota.

Nombremascota : Nombre de la mascota.

Ti pomas cota: El nombre de la categora. Esta es la columna que


conecta la mascota con la fila correcta en la tabla Ti podeMascota.

Descri p c i o n m a s c o t a: La descripcin de la mascota.

P r e c io : El precio de la mascota.

Pi x : El nombre del archivo grfico que contiene una foto de la mascota.


Captulo 3: Desarrollar una aplicacin Web con base de datos

La tabla Ti podeMascota tiene una fila para cada categora de mascotas.


Tiene las siguientes columnas:
Ti pomascota : El nombre de la categora de un tipo de mascota.
Esta es la clave primaria para esta tabla. Observe que la tabla Mas
cota tiene una columna con el mismo nombre. Esta columna vin
cula esta tabla con la tabla Mascota .

Descri pe i on ti p o : La descripcin del tipo de mascota.

La tabla Col ordel aMascota tiene una fila para cada color de mascota.
Tiene las siguientes columnas:

Nombremascota : El nombre de la mascota. Esta es la columna


que conecta la fila de color con la fila correcta en la tabla Mascota.

Col ormascota : El color de la mascota.

6. Identifique la clave primaria.


La clave primaria de la tabla Mascota es Idmascota.

La clave primaria de la tabla Ti podeMascota es Ti pomascota.

La clave primaria de la tabla Col ordel aMascota es Nombremascota


y Col ormascota juntas.

7. Defina los valores predeterminados.

No se definen valores predeterminados para ninguna de las tablas.

8. Identifique las columnas con datos obligatorios.

A las siguientes columnas no se les permitir nunca estar vacas:


Idmascota

Nombremascota

Colormascota

Ti pomascota

Estas son las columnas con claves primarias. No debe permitirse que ha
ya una fila sin estos valores en las tablas.

Proceso del diseo del


rea Slo para miembros
Suponga que ha creado la siguiente lista de informacin que desea guardar cuan
do los clientes se registren en la seccin Slo para miembros de su sitio web:

| Nombre del miembro

i V Direccin del miembro

I v* Nmero telefnico del miembro


Parte I: Desarrollar una aplicacin Web con Base de Datos usando PHP y MySQL

| 00 Nmero de fax del miembro

u0 Direccin electrnica del miembro

Adems, tambin le convendra guardar la fecha en que un miembro se inscri


be y rastrear la frecuencia con la que cada miembro entra a la seccin Slo
para miembros.

Disee la base de datos Slo para miembros siguiendo los pasos presentados
en la seccin "Organizar los datos en tablas", anteriormente en este captulo:

1. Nombre su base de datos.

La base de datos para la seccin Slo para miembros se llama D irecto


r i odeMi em bros.

2. Identifique los objetos.

La lista de informacin es

Nombre del miembro


Direccin del miembro

Nmero telefnico del miembro

Nmero de fax del miembro

Direccin electrnica del miembro

Fecha de inscripcin del miembro

Entradas del miembro


Toda esta informacin pertenece a los miembros, as que el nico objeto
para esta lista es mi emb r o .

3. Defina y nombre una tabla para cada objeto.

La base de datos Di r e c t o r i odeMi embros necesita una tabla llamada


Mi embro.

4. Identifique los atributos de cada objeto.

Fjese detalladamente en la lista de informacin:

Nombre del miembro: Dos atributos: nombre y apellido.


Direccin del miembro: Cuatro atributos: direccin fsica, ciudad, esta
do y cdigo postal. Como actualmente usted solo tiene tiendas de mas
cotas en Estados Unidos, puede asumir que la direccin del miembro es
una direccin en el formato de direcciones postales de Estados Unidos.

Nmero telefnico del miembro: Un atributo.

Nmero de fax del miembro: Un atributo.

Direccin electrnica del miembro: Un atributo.

Fecha de inscripcin del miembro: Un atributo.


Captulo 3: Desarrollar una aplicacin Web con base de datos

Varias piezas de informacin se relacionan con las entradas del miembro


en el rea especial:

El ingreso en la seccin Slo para miembros requiere de un nom


bre de registro y una contrasea. Estos dos temes deben estar al
macenados en la base de datos.

La forma ms fcil de rastrear las entradas de los miembros es al


macenando la fecha y la hora en que el usuario entr en la seccin
Slo para miembros.

Como cada miembro puede tener muchas entradas, habr que almace
nar muchas fechas y horas de entrada. Por lo tanto, en lugar de definir el
tiempo de entrada como un atributo del miembro, defina la entrada co
mo un objeto relacionado con el miembro, pero con su propia tabla.

La tabla agregada se llama Entrada. El atributo de un objeto de entrada


es su tiempo de entrada (el tiempo incluye la fecha).

. Defina y nombre las columnas.

La tabla Mi embro tiene una fila para cada miembro. Las columnas para
la tabla Mi embro son:

Nombreentrada

Cada nombre debe ser nico. Los programas en la aplicacin deben ase
gurarse de que no haya dos nombres de entrada iguales.

Clave

Fechadecreaci on

Nombre
A p e l 1 ido

Calle

Ci udad

Estado

Codi goPostal

ema i 1

Telefono
Fax

La tabla Entrada tiene una fila para cada entrada: o sea, cada vez que un miem
bro entra en la seccin Slo para miembros. Tiene las columnas siguientes:

Nombreentrada: El nombre de registro del miembro que entr. Esta


es la columna que vincula esta tabla con la tabla Mi embro. Este es un
valor nico en la tabla Mi embro pero no es un valor nico en esta tabla.

Ti empoentrada : La fecha y hora de entrada.


Parte I: Desarrollar una aplicacin Web con Base de Datos usando PHP y MySQL

6. Identifique la clave primaria.

La clave primaria para la tabla Mi e mbro es Nombreentrada.

La clave primaria para la tabla Entrada es Nombreentrada y


Tiempo_entrada juntos.

7. Defina los valores predeterminados.

No hay valores predeterminados para ninguna de las tablas.

8. Identifique las columnas con datos obligatorios.

Las siguientes columnas nunca deben estar vacas:

Nombreentrada

Contrasea

Tiempoentrada
Estas columnas son las columnas con la clave primaria. En las tablas
nunca debe permitirse que haya una ila sin estos valores.

Tipos de datos
MySQL almacena informacin en formatos diferentes con base en el tipo de
informacin que usted le dice a MySQL que debe esperar. MySQL permite que
tipos diferentes de datos se usen de maneras diferentes. Los tipos principales
de datos son datos de caracteres, numricos y de fecha/hora.

Datos de caracteres
Los datos ms comunes son los datos de caracteres, es decir, datos que se guar
dan en cadenas de caracteres y que solo se pueden manipular en cadenas. La ma
yor parte de la informacin que guardar ser de este tipo, por ejemplo datos
como el nombre del cliente, su direccin, nmero telefnico, descripcin de la
mascota, etc. Los datos de caracteres se pueden mover e imprimir. Dos cadenas
de caracteres se pueden poner juntas (concatenadas); se puede seleccionar una
subcadena de una cadena ms larga, y una cadena se puede sustituir por otra.

Los datos de caracteres se pueden almacenar en un formato de longitud fija o


un formato de longitud variable.

> Formato de longitud fija: En este formato, MySQL reserva un espacio fi

I
jo para los datos. Si los datos son ms largos que el largo fijado, solo se
guardarn los caracteres que quepan en ese largo, y el resto de los ca
racteres no se guardar. Si la cadena es ms corta que la longitud fijada,
el espacio extra se deja vaco y se desperdicia.
Captulo 3: Desarrollar una aplicacin Web con base de datos

u * Formato de longitud variable: En este formato, MySQL guarda la cadena


en un campo que tiene la misma longitud que la cadena. An as debe es
pecificar la longitud para la cadena, pero si la cadena es ms corta que la
longitud especificada, MySQL usa el espacio requerido en lugar de dejar
el espacio extra vaco. Si la cadena es ms larga que el espacio especifica
do, los caracteres extra no se almacenan.

Si la longitud de una cadena de caracteres vara muy poco, use el formato de lon
gitud fija. Por ejemplo, una longitud de 10 funciona para todos los cdigos posta
les, incluyendo los que tienen el nmero postal+4. Si el cdigo postal no incluye
el nmero postal+4, solo quedarn cinco espacios vacos. Sin embargo, si su ca
dena de caracteres puede variar ms que unos cuantos caracteres, use el forma
to de longitud variable para ahorrar espacio. Por ejemplo, la descripcin de la
mascota podra ser Murcilago pequeo o podra ocupar varias lneas. As que
sera mejor guardar esta descripcin en un formato de longitud variable.

Datos numricos
Otro tipo comn de datos son los numricos, es decir, datos que se guardan
como nmeros. Los nmeros decimales (por ejemplo 10.5, 2.34567,23456.7) se
pueden guardar as como los nmeros enteros (por ejemplo, 1, 2, 248). Cuando
los datos se guardan numricamente, se pueden usar en operaciones numri
cas tales como suma, resta, elevar al cuadrado, etc. Sin embargo, si los datos
no van a usarse en operaciones numricas es mejor guardarlos com o cadenas
de caracteres, porque el programador los usar como cadenas de caracteres.
No har falta ninguna conversin. Por ejemplo, probablemente no tendr que
sumar los dgitos en los nmeros telefnicos de los usuarios, as que el nmero
telefnico debiera guardarse como una cadena de caracteres.

MySQL guarda nmeros positivos y negativos, pero usted puede pedirle a


MySQL que guarde solo nmeros positivos. Si sus datos no van a ser negati
vos, guarde los datos unsi gned (sin signo, es decir, sin usar los signos + o
antes del nmero). La poblacin de una ciudad, por ejemplo, o el nmero
de pginas en un documento nunca sern un nmero negativo.

Datos de fecha y hora


Un tercer tipo comn de datos son los de fecha y hora. Los datos guardados
com o fecha se pueden mostrar en diversos formatos de fecha. Tambin se
pueden usar para determinar el lapso de tiempo entre dos fechas o dos ho
ras, o entre una fecha u hora especficas y alguna fecha y hora arbitrarias.
Parte I: Desarrollar una aplicacin Web con Base de Datos usando PHP y MySQL

Datos de enumeracin
Algunas veces los datos solo pueden tener un nmero limitado de valores.
Por ejemplo, una columna podra tener como nicos valores posibles s i y
no. MySQL ofrece un tipo de datos llamados de enumeracin para usar con
este tipo de datos. Usted le indica a MySQL cules valores pueden guardarse
en la columna (por ejemplo s i , no), y MySQL no guardar ningn otro valor.

Nombres de (os tipos de datos en MySOL


Cuando usted crea una base de datos debe decirle a MySQL, usando los nombres
especficos de MySQL para los tipos de datos, cules tipos de datos debe esperar
en una columna en particular. La Tabla 3-1 muestra los tipos de datos en MySQL
usados con ms frecuencia en las aplicaciones con bases de datos para la Web.

Tabla 3-1 Tipos de datos en MySQL


Tipos de datos en MySQL Descripcin

C H A R (1e n g t h ) Cadena de c a ra c te re s de longitud fija.

VARCHAR(1e n g t h ) C adena de c a ra c te re s de longitud variable. La


cadena m s larga que se puede guardar es
i ength, que debe estar entre 1 y 255.

TEXT Cadena de c a ra c te re s de longitud variable con


una longitud m xim a de 64KB de texto.

IN T (1ength ) Nmero entero cuyo rango va d e 2147483648 a


+2147483647. El nmero que se puede mostrar est
limitado por 1ength. Por ejem plo,si 1ength es4,
solo los nmeros de 999 a 9999 se podrn mos
trar, aunque los nmeros ms altos se guardarn.

INT(1e n g t h ) UNSIGNED N m ero entero cuyo rango va de 0 a


4 2 9 4 9 6 7 2 9 5 . 1 ength es el tam ao del nmero
que se podr m ostrar. Por ejem plo, si 1ength
es 4 solo se m ostrarn los nm eros hasta 9999,
aunque los nm eros m s altos se guardarn.

DECIMALC1ength,dec) N m ero decim al en el cual 1 ength es el nm e


ro de c a ra c te re s que se usarn para m ostrar el
nm ero, incluyendo el punto de los decim ales,
los signos y expo nentes, y dec es el nm ero m
ximo de decim ales perm itidos. Por ejem plo,
12.34 tien e length de 5 y dec de 2.
Captulo 3: Desarrollar una aplicacin Web con base de datos

Tipos de datos en MySQL Descripcin (continuacin)

DATE Valor de la fe c h a con ao, m es y da. M u estra


el valor como A A A A -M M -D D (por ejemplo,
2001-04-03).

TIME Valor de la hora con hora, minutos y segundos.


M u estra la hora com o H H :M M :S S .

DATETIME La fech a y hora g u ard ad as juntas. A p a re c e


como A A A A -M M -D D H H :M M :S S .

ENUM ("va 11","va 12"... . ) Slo pueden guardarse los valores en la lista. En la
lista se puede incluir un mxim o de 65535 valores.

MySQL perm ite muchos otros tipos de datos, pero se necesitan con me
nos frecuencia. Para una descripcin de todos los tipos de datos dispo
nibles, consulte la docum entacin sobre MySQL en:
w w w . m y s q l .c o m / d o c / C / o / C o l u m n _ t y p e s .h t m l .

Escrbalo
Insisto en mi usual necedad: Escrbalo. Probablemente usted pas bastante tiempo
tomando decisiones de diseo para su base de datos. En este punto, las decisiones
estn fijadas con firmeza en su mente. No cree que pueda olvidarlas. Sin embargo,
suponga que de pronto surge una crisis y tiene que dejar de lado este proyecto du
rante dos meses. Tendra que analizar sus datos y tomar todas las decisiones de di
seo nuevamente. Eso, claro, puede evitarlo si escribe sus decisiones ahora mismo.

Documente la organizacin de las tablas, los nombres de las columnas y to


das las dems decisiones de diseo. Una buena idea de formato es hacerlo en
un documento que describa cada tabla en el formato de tabla, con una fila pa
ra cada columna y una columna para cada decisin de diseo. Por ejemplo,
sus columnas seran nombre de la columna, tipo de datos y descripcin.

Un Vistazo a los diseos de tas


bases de datos de tos ejemplos
Esta seccin contiene los diseos de las bases de datos de los dos ejemplos
de aplicacin con bases de datos para la Web.
Parte I: Desarrollar una aplicacin Web con Base de Datos usando PHP y MySQL

Tablas de (a base de datos


de Cosas para Vender
El diseo de la base de datos para la aplicacin del Catlogo de mascotas incluye
tres tablas: M a s c o t a , Ti podeMascota y Colordel aMascota. Las Tablas 3-2
hasta 3-4 muestran la organizacin de estas tablas. La definicin de la tabla no es
inalterable; MySQL le permite cambiar las tablas con mucha facilidad. Por ejem
plo, si fija el tipo de datos para una variable en CHAR( 2 0 ) y se da cuenta de que
no es lo suficientemente larga, fcilmente podr cambiar el tipo de dato.

El diseo de la base de datos es como sigue:

Nombre de la base de datos: CatalogodeMascotas

Tabla 3-2 Tabla 1 de la Base de datos: M ascota


Nombre de la variable Tipo Descripcin

Idmascota IN T (5) N m ero secuencial para la mascota


(llave prim aria )

Nombremascota CHAR(25) N om bre de la m ascota

T i pomascota CHAR(15) C ategora de la m ascota

Descri pci on VARCHARC 255) D escripcin de la m ascota


mascota

preci o DECIMALC 9,2) Precio de la m ascota

pi X C H A R (15) N om bre de la ruta hacia el archivo gr


fico que contiene la foto de la mascota.

Tabla 3-3 Tabla 2 de la Base de datos: TipodeM ascota


Nombre de la variable Tipo Descripcin

Ti pomascota CHAR(15) N om bre de la categ ora de la mascota


(llave prim aria )

Descri pci on VA RC HA R ( 255) D escripcin de


mascota la categ ora
Captulo 3: Desarrollar una aplicacin Web con base de datos

Tabla 3-4 Tabla 3 de la Base de datos: ColordelaM ascota


Nombre de la variable Tipo Descripcin

Nombremascota CHAR(25) N om bre de la m ascota


(llave prim aria 1)

Colormascota C H A R (15) Nombre del color (llave primaria 2)

Tablas para la base de datos Slo para


miembros
El diseo de la base de datos para la aplicacin de Slo para miembros inclu
ye dos tablas, llamadas Mi em br o y Entrada. Las Tablas 3-5 y 3-6 documen
tan la organizacin de estas tablas. La definicin de las tablas no est fijada
de modo inalterable; MySQL le permite cambiar las tablas con facilidad. Si fija
el tipo de datos para una variable en C HAR ( 25) y se da cuenta de que no es
lo suficientemente larga, es fcil cambiar el tipo de datos.

El diseo de la base de datos es el siguiente:

Nombre de la base de datos: DirectoriodeMiembros

Tabla 3-5 Tabla 1 de la Base de datos: M iem bro


Nombre de la Tipo Descripcin
variable

Nombre V ARCHA R (20 ) N om bre para entrar esp ec ificad o por el


entrada usuario (llave p rim a ria )

Clave CHAR(255) C ontrasea especificada por el usuario

Fecha DATE Fecha en que el miembro se inscribi y


creaci on registr su cuenta

A p e l 1 ido VARCHA R (50) A pellido del miembro

Nombre VARCHAR(40) N om bre del miembro

Calle V ARCHA R (50 ) D ireccin fsica del miem bro

Ciudad VARCHAR(50) Ciudad del miembro

Estado C H A R (2 ) Estado del miem bro

Codi go CHAR(IO) Cdigo postal del m iem bro


postal
Parte I: Desarrollar una aplicacin Web con Base de Datos usando PHP y MySQL

Nombre de la Tipo Descripcin (Continuacin)


variable

emai 1 VARCHAR(50) D ireccin e le c tr n ic a del m iem bro

Telefono C H AR (15) N m ero telef nico del m iem bi o

Fax C H A R (15 ) N m ero de fax del m iem bro

Tabla 3-6 Tabla 2 de la Base de datos: Entrada


Nombre de la Tipo Descripcin
variable

Nombre CHAR(20) N om bre para entrar especificado por el


entrada usuario (llave prim aria 1)

Ti empo DATETIME Fecha y hora de en trad a (llave primaria 2)


entrada

Desarrollar la aplicacin
Despus de haber creado el plan enumerando las tareas que su aplicacin de
be realizar y de haber desarrollado el diseo de la base de datos, ya est listo
para crear su aplicacin. Primero debe construir la base de datos; luego es
cribir los programas en PHP. Est a muy pocos momentos de tener trabajan
do una aplicacin con base de datos para la Web. Bueno, quiz estoy
exagerando un poco, pero ciertamente est progresando.

Construir la base de datos


Construir la base de datos significa convertir la base de datos diseada en el
papel a una base de datos que funcione. Construir la base de datos es algo in
dependiente de los programas PHP que su aplicacin usar para interactuar
con la base de datos. Se puede tener acceso a la base de datos usando len
guajes de programacin diferentes de PHP, por ejemplo Perl, C o Java. La ba
se de datos guarda los datos de manera independiente.

Debe construir la base de datos antes de escribir los programas en PHP. Los progra
mas en PHP se escriben para insertar y extraer los datos de la base de datos, as que
no podr desarrollarlos ni probarlos hasta que la base de datos est disponible.
Captulo 3: Desarrollar una aplicacin Web con base de datos

El diseo de la base de datos nombra y define las tablas que constituyen la


base de datos. Para construir la base de datos, usted debe comunicarse con
MySQL mediante el lenguaje SQL. Le dice a MySQL que cree la base de datos
y que le agregue tablas. Le dice a MySQL cmo organizar las tablas de datos y
qu formato usar para guardar los datos. Las instrucciones detalladas sobre
cm o construir la base de datos se brindan en el Captulo 4.

Escribir tos programas


Sus programas realizan las tareas necesarias de su aplicacin con base de da
tos para la Web. Crean lo que se muestra al usuario en la ventana del navega
dor. Hacen que su aplicacin sea interactiva, pues aceptan y procesan la
informacin digitada por el usuario en la ventana del navegador. Almacenan
informacin en la base de datos y extraen informacin de la base de datos. La
base de datos es intil a menos que puede insertarle y extraerle datos.

El plan desarrollado (tal como indiqu en las secciones anteriores de este ca


ptulo) esquematiza los programas que debe escribir. Generalmente cada ta
rea del plan requerir de un programa. Si su plan dice que su aplicacin
mostrar un formulario, usted necesita un programa para mostrar el formula
rio. Si su plan dice que su aplicacin guardar los datos de un formulario, ne
cesita un programa que obtenga los datos del formulario y los ponga en la
base de datos.

El lenguaje PHP fue desarrollado especficamente para escribir aplicaciones


web interactivas. Incluye la funcionalidad necesaria para hacer que la escritu
ra de los programas sea lo menos dolorosa posible. Tiene mtodos que se in
cluyeron en el lenguaje especficamente para tomar datos de formularios.
Tiene mtodos para poner los datos en las bases de datos MySQL, y tiene m
todos para extraer datos de una base de datos MySQL. En la Parte 111 de este
libro explico detalladamente las instrucciones necesarias para escribir pro
gramas con PHP.
Parte IJ
La base de datos
MySQL

La 5a Ola Por Rich Tennant

"Ruesra polnica de respuesta aufornafiiada anfe una


prdida de da^os en (oda la compaa es notificar a la
gerencia, respaldar los daos etfisfeneS y vender el gO%
de mis acciones de la compaa".
En estaparte . . .

sta parte le brinda los detalles relacionados con el


trabajo con una base de datos MySQL. Aprender c
mo usar SQL para comunicarse con MySQL. Adems, des
cubrir cmo crear una base de datos, cmo cambiarla y
cmo extraer e insertar datos en una base de datos.
Captulo 4

Construccin de la base de datos


En este captulo
Usar SQL para hacer solicitudes a MySQL
Crear una base de datos nueva
Agregar informacin a una base de datos existente
Consultar la informacin en una base de datos existente
Eliminar informacin de una base de datos existente
, -i * t- b * # * $ m * e 0 9 a* m * > * * * < * a a<

m le s p u s de terminar el diseo de su base de datos (consulte el Captulo 3


^ s i an no lo ha hecho), estar listo para convertirlo en una base de datos
funcional. En este captulo aprender cmo construir una base de datos con
base en su diseo, y cm o mover datos hacia dentro y hacia fuera de ella.

El diseo le asigna un nombre a la base de datos y define las tablas que la confor
man. Para poder construir la base de datos debe comunicarle a MySQL el nom
bre de la base de datos y la estructura de las tablas. Posteriormente deber
comunicarse con MySQL para agregar datos a la base de datos (o solicitarle in
formacin). El lenguaje usado para comunicarse con MySQL es SQL. En este cap
tulo, explico cmo crear consultas en SQL y cmo usarlas para construir bases
de datos nuevas, as como para interactuar con bases de datos ya existentes.

Cmo comunicarse con MySOL


El servidor MySQL es el administrador de su base de datos:

1 Crea bases de datos nuevas.


fe

i <> Sabe dnde estn guardadas las bases de datos.

Guarda y recupera informacin guiado por las solicitudes (consultas)


que recibe.
Parte II: La base de datos MySQL

Para hacer una solicitud que MySQL pueda entender, se deben construir con
sultas en SQL y enviarlas al servidor MySQL. (Para una descripcin ms deta
llada del servidor MySQL, consulte el Captulo 1). Las dos secciones siguientes
puntualizan cmo hacerlo.

Construir consultas en SQL


SQL (Structured Query Language/Lenguaje de consulta estructurado) es el
lenguaje informtico usado para comunicarse con MySQL. SQL es prctica
mente ingls; est hecho principalmente de palabras en ingls, colocadas jun
tas en cadenas de palabras muy parecidas a oraciones en ingls. En general
(afortunadamente) no es necesario comprender ningn lenguaje tcnico mis
terioso para escribir consultas SQL que funcionen.

La primera palabra de una consulta es su nombre, el cual es una palabra de


accin (un verb o) que le dice a MySQL qu quiere hacer usted. Las consultas
que discuto en este captulo son CREATE , DROP, ALTER, SHOW, INSERT,
LOAD, SELECT, URDATE y DELETE. Este vocabulario bsico basta para
crear bases de datos en sitios web, e interactuar con ellas.

Al nombre de la consulta le siguen palabras y frases algunas obligatorias y


otras opcionales que le dicen a MySQL cmo realizar la accin. Por ejem
plo, siempre debe indicarle a MySQL qu debe crear, y siempre debe decirle
en cul tabla insertar datos o en cul seleccionar datos.

La siguiente es una consulta SQL tpica. Como puede ver, usa palabras en ingls:

SELECT apellido FROM Miembro

Esta consulta recupera todos los apellidos guardados en la tabla llamada


Mi embro. Por supuesto, consultas ms complicadas (com o la siguiente) se
parecen menos al ingls:

SELECT apellido, nombre FROM Miembro WHERE estado="CA" AND

ciudad="Fresno" ORDER BY apellido

Esta consulta recupera todos los apellidos y nombres de los miembros que
viven en Fresno y los coloca en orden alfabtico por el apellido. Esta consulta
se parece menos al ingls pero todava es bastante clara.

Los siguientes son algunos puntos generales que se deben recordar cuando
se construye una consulta SQL, como se ilustr en el ejemplo anterior:

| v* Maysculas: En este libro, pongo las palabras del lenguaje SQL complet
is mente en maysculas; los elementos de informacin variable (como los
Captulo 4: Construccin de la base de datos

nombres de las columnas) usualmente reciben etiquetas que estn en su


mayor parte o totalmente en minsculas. Lo hice as para que le fuera ms
fcil leer los ejemplos, no porque MySQL necesite este formato. No importa
si las palabras en SQL estn en mayscula o minsc ula; para MySQL s e 1e c t
es iguala SE LECT y f romes iguala FROM. Por otro lado, si su sistema opera
tivo es Unix o Linux s es importante si los nombres de las tablas, los nom
bres de las columnas y cualquier otra informacin variable est en
mayscula o minscula. Cuando se usa Unix o Linux, para MySQL los nom
bres de las columnas deben coincidir con exactitud, de modo que la mays
cula o minscula de los nombres de las columnas tiene que estar correcta:
apellido no es igual a Apellido. No obstante, Windows no es tan quisquilloso
como Unix y Linux; desde su perspectiva, apellido y Apellido son iguales.

Espacios: Las palabras en SQL tienen que separarse por uno o ms espa
cios. No importa cuntos espacios use; es lo mismo usar 20 espacios o
solo 1. SQL tampoco pone ninguna atencin al final de la lnea. En SQL
usted puede empezar una nueva lnea en cualquier punto de la instruc
cin, o escribir toda la instruccin en una sola lnea.

v * Comillas: Observe que en la consulta anterior CA y Fresno estn encerra


das en comillas dobles ("). CA y Fresno son series de caracteres llamadas
cadenas de texto o cadenas de caracteres. (Explico detalladamente las ca
denas ms adelante en este captulo.) En el ejemplo, le est pidiendo a
MySQL que compare las cadenas de texto en la consulta SQL con las cade
nas de texto almacenadas en la base de datos. Las cadenas de texto se en
cierran entre comillas. Cuando compara nmeros (enteros, por ejemplo)
almacenados en columnas numricas, no hace falta encerrar los nmeros
entre comillas. (En el Captulo 3 explico los tipos de datos que pueden al
macenarse en una base de datos MySQL).

Enriar consultas en SQL


Este libro es sobre PHP y MySQL como pareja. Por lo tanto, no describir la
multitud de formas en que pueden enviarse consultas SQL a MySQL, muchas
de las cuales no tienen nada que ver con PHP. En su lugar, proporciono un
programa PHP simple que usted puede usar para ejecutar consultas en SQL.
(Para conocer los detalles sobre PHP y cm o escribir programas en PHP, con
sulte la Parte III de este libro).

El program a m y s q l _ s e n d . p h p tiene una funcin simple: ejecutar consul


tas y m ostrar los resultados. Digite el program a en el directorio donde
est desarrollando su aplicacin w eb (o descrguelo desde mi sitio web
en j ane t. va la d e. co m ), cam bie la inform acin en las lneas 9 19, y
luego dirija su exp lorad or hacia el programa. La Lista 4-1 muestra el
programa.
Parte II: La base de datos MySQL__________________________________________

L is ta 4-1: P ro g ra m a P H P para en viar c o n s u lta s en S Q L a M ySQL


<!-- Program: m y sq l _ s e n d .php

Desc: PHP program that sends an SQL query to the

MySQL server and displays the results.

< ht m 1>

C h e a d X t i t i e > S Q L Query Sender</titie></head>

<body>

<?php

$ ho st= "h os tn ame ";

$user=" mysqlaccountname

$password= "m ysq lp as sw or d";

/* Section that executes query */

i f ( @ $ _ G E T [ 'f o r m ] == "yes")

my sq l_ co n ne c t( $h o st ,$ u s e r ,$pa ssword);
m y sq l_ s e1ect_db($_P0ST['data base']);
Squery = stripSlashes($_ P0 ST [ 'q u e r y ']);
$result = my sq l_query($query);
echo "Database Selected: < b > {$ _P0 ST ['d a t a b a s e ']}< / b X b r >
Query: < b > $ q u e r y < / b X h 3 > R e s u l t s < / h 3 X h r > " ;
i f ($ result == 0)
echo "<b>Error " .mysql_errno().": " ,mysql_error().
"</b> ;
elseif (@mysql_num_rows(Sr esult) == 0)
echo("<b>Query completed. No results returned.
< / b X b r > " );
else
I
echo "<table border='l'>
<thead>
<tr>";
for($i = 0;$ i < mysql_num_fields($result);$i++)
{
echo "<th>".mysql_field_name($result,$i).
< / t h > ";
Captulo 4: Construccin de la base de datos

echo " </tr>


</thead>
<tbody>";
for ($i = 0; $i < mysql_num_rows($result); $i++)
'
echo "<tr>";
$row = m y sq l_ fe tc h_ row ($ re su lt );
for($j = 0; $j<my sql_num_.fi el ds ($ r es u lt ):$j++)
{
echo("<td>" . $row[$j] . "</td>"):
}
echo " </t r>K ;
}
echo "</tbody>
</table>":
} //end el se
echo "
<hr><br>
<form acti o n = \ " {$ _ S E R V E R [ P H P_ S EL F']}\" m e t h o d = \ P0ST\>
<input t y p e = ' h i d d e n ' n a m e = query' value='$query >
X i n p u t t y p e = 'h i d d e n ' n a m e = 'd at a b a s e '
va lu e = { $ _ P 0 S T [ 'd a t a b a s e ]}>
<input t y p e = s u b m i t n a m e = \ queryButton\"
va lu e= \ HNew Query\">
<input t y p e = ' su bm i t' name=\"queryButton\"
value=\"Edit Query\">
< / fo rm > ";
un se t ($ f or m) :
exitO:
} // endif forrn=yes

/* Section that requests user input of query */


@ $qu er y= st ri pSl as he s( $ PO ST[ 'q ue ry ']);
if ( @ $_ P0 ST ['q u e r y B u t t o n '] != "Edit Query")
{
$query = " " O
}
?>

<form action="<?php echo $ _ S E R V E R [ 'PH P_ SE LF '] ?>?form=yes"


method="P0ST">
<table>
<tr>
<td al ign=right><b>Type in database n a m e < / b X / t d >
< t d X i n p u t type="text" name="database"
value=<?php echo @$_P0ST['database'] ?> X / t d >
</tr>
<tr>
<td align="right" val ign="top">
<b>Type in SQL q u e r y < / b X / t d >
< t d X t e x t a r e a name="query" cols = "60"
r o w s = " 1 0 " X ? p h p echo $query ? X / t e x t a r e a >
</td>
Parte II: La base de datos MySQL

</tr>
<tr>
<td colspan="2" al i g n= "c e nt e r " X i n p u t t.ype="submi t
val ue="Submi t Q u e r y " X / t d >
</tr>
</table>
</form>
</bodyX/html >

Debe cambiar las lneas 9, 10 y 11 del programa antes de poder usarlo. Estas
lneas son

$h os t= "h os tn ame ;
$ us e r= " my sql acc ou nt na me ";
$ pa s sw o rd ="m ysq lp as sw or d";

Cambie hostname al nombre del P C donde M y S Q L est instalado: por ejem


plo, servi dorbasedatos .mi empresa .com. Si la base de ditos M y S Q L est
instalada en el mismo PC que su sito web, puede usar 1 o c a 1h o s t como el
hostname.

Cambie mysql accountname y mysql password al nombre de lacu en tayde


la contrasea que le dio el administrador de MySQL para que tuviera acceso
a su base de datos MySQL. Si instal MySQL usted mismo, una cuenta nom
brada ro o t sin contrasea se instala automticamente. A veces se instala una
cuenta con nombre de cuenta y de contrasea en blanco. Puede usar la cuen
ta root o la cuenta en blanco, pero es mucho mejor si instala una cuenta pa
ra uso especfico de su aplicacin web. (M e ocupo detalladamente de las
cuentas y las contraseas MySQL en el Captulo 5.)

Una cuenta llamada r o o t sin ninguna contrasea no es segura. Debe asignar


le una contrasea lo ms pronto posible. Una cuenta con el nombre de cuen
ta y el de contrasea en blanco es todava menos segura. Cualquiera podra
tener acceso a su base de datos sin necesidad de saber el nombre de la cuen
ta ni la contrasea. Si existe, debe borrar esta cuenta (consulte el Captulo 5).

Si su cuenta MySQL no requiere de una contrasea, no digite nada entre las


comillas dobles, as:

$ p as sw or d= "";

Despus de digitar en m y s q l _ s e n d .php los nombres correctos de hostname,


de la cuenta y de la contrasea, estos son los pasos generales que debe se
guir para ejecutar una consulta SQL:

1. Dirija su explorador a mysql.. send .php.


Ver la pgina web mostrada en la Figura 4-1.

2. Digite la consulta SQL en el recuadro de texto grande.


Captulo 4: Construccin de la base de datos

3 S O L Q u e ry S e n d e r M ic ro s o ft In te rn e t E x p lo re r

T| ^Go'ffnta

Typeidatabasenane
TypeinSQLquery ~3

Figura 4-1:
Pgina w e b
de consulta
SQL
producida
por
mysql_send.php

3. Si la consulta lo requiere, digite el nombre de la base de datos en el


primer recuadro de texto.

Explico los detalles de cm o escribir consultas especficas en SQL en las


siguientes secciones de este captulo.
4. Haga clic en el botn Submit Query.

La consulta se ejecuta y aparece una pgina que muestra los resultados.


Si su consulta tena un error, aparecer un mensaje de error.

Puede probar el programa my sq l_ send.php digitando esta consulta de prue


ba en el Paso 2 de los pasos anteriores:

SHOW DATABASE

En esta consulta no es necesario digitar el nombre de una base de datos, as


que puede saltarse el Paso 3. Cuando hace clic en el botn Submit query en el
Paso 4, aparecer una lista de las bases de datos existentes. En la mayora de
los casos, ver una base de datos llamada Test, que automticamente se ins
tala cuando se instala MySQL. Adems, probablemente ver una base de datos
llamada m y s q l, que MySQL usa para almacenar la informacin que necesita,
tal com o los nombres de las cuentas, las contraseas y los permisos. Incluso si
no hay bases de datos existentes, su consulta SQL se ejecutar correctamente.
Si ocurre un problema, aparecer un mensaje de error. Los mensajes de error
de MySQL son habitualmente muy tiles para encontrar el problema.
Parte II: La base de datos MySQL

Una forma ms rpida de enviar consultas en SQL


al servidor MySQL
C uando se instala M ySQ L, un program a sim ple basado en texto llam ado mysql (o a veces monitor
te rm in a l o m onitor) tam b in se instala. Los program as que se com unican con servidores se llaman
s o ftw a re cliente; com o se com u nica con el servidor M ySQL, este program a es un cliente. Cuando
digita las solicitudes en SQL en este cliente, la respuesta es devuelta al cliente y ap arece en pan
ta lla . El program a m onitor p ued e en viar consultas a travs de una red; no tien e que estar corrien
do en la m quina donde est alm a c e n a d a la base de datos.

Para en via r consultas en SQL a M yS Q L usando el cliente mysql, siga estos pasos:

1. Localice el clien te mysql.

De m anera p red e te rm in a d a, el program a cliente mysql se instala en el subdirectorio bin, den


tro del directorio donde se instal M ySQ L. En Unix/Linux el directorio predeterm inado es / u s r -
/local /mysql/bin o /usr/local /bin. En W in d o w s el directorio predeterm inado es
c : \mysql \ b i n. Sin em b a rg o , el cliente puede haber sido instalado en un directorio diferen
te. 0 , si usted no es el adm inistrad or de M ySQ L, posiblem ente no teng a acceso al cliente mysql.
Si no sabe dnde est instalado M yS Q L o no puede correr el cliente, pdale al adm inistradorque
ponga el cliente en algn lugar donde lo pueda correr o que le d una copia para poner en su PC.

2. In icie el cliente.

En Unix/Linux, digite la ruta y el archivo (por ejem plo /us r / 1oca 1/mysql/bin/ mysql ). En
W in d o w s , abra una ven ta n a de com ando y luego digite el nom bre de la ruta y del archivo (por
ejem plo c :\m y sq l\ b in \m y sq l.exe). Oprima Enter despus de digitar el nombre de la ru
ta y del archivo, a m enos que est usando los parm etros m ostrados en el Paso 3.

3. Si est iniciando el clien te m y s q l para entrar en una base de datos en otra parte de la red,
use los siguientes parm etros despus del comando m y s q l:
-h host: host es el n o m b re de la m quina donde se ubica MySQL.

-u user: user es el nom bre de su cuenta MySQL.

-p: Este parm etro le pide la contrasea de su cuenta MySQ L.

Por ejem plo, si est en el d irecto rio donde se ubica el cliente my sq 1, el com ando se vera as:

mysql -h mysqlhost.mycompany.com -u root -p

Oprim a Enter d esp us de d ig itar el com ando.

4. D igite su contrasea cuando le sea pedida.


El c liente mysql se inicia y usted ver algo parecido a esto:

Welcome to the MySQL monitor. Commands end with ; or \g.


Your MySQL connection id is 459 to server versin: 4.0.13
Type help:' or '\ h * for help. Type '\ c * to clear the buffer.
my sq l >

( continuacin )
Captulo 4: Construccin de la base de datos

(contina)

5. S eleccione la base de datos que desea usar.

En la lnea de com ando mysql, digite lo siguiente:

use databasename
Use el nom bre de la base de datos que desea consultar.

6. En la lnea de comando mysql, digite su consulta SQL, seguida de un punto y com a (;), y lue
go presione la te cla Enter.

El cliente mysql continuar solicitndole inform acin y no e je c u ta ra la consulta hasta que


usted digite un punto y com a. La respuesta a la consulta a p a re c e r en pantalla.

7. Para salir del cliente mysql, digite qui t en la lnea de com ando y oprim a la te c la Enter.

Construir una base de datos


Una base de datos tiene dos partes: una estructura que guarda los datos y los
datos mismos. En las siguientes secciones explico cm o crear la estructura
de la base de datos. Primero se crea una base de datos vaca, sin ninguna es
tructura, y luego se le agregan las tablas.

Las consultas SQL usadas para trabajar con la estructura de la base de datos
sonCREATE, ALTER, DROP y SHOW. Para usar estas consultas debe tener una
cuenta MySQL con permiso para crear, alterar y botar bases de datos y tablas.
Consulte en el Captulo 5 mayor informacin sobre las cuentas MySQL.

Crear una base de datos nueOa


Para crear una base de datos nueva y vaca, use la siguiente consulta SQL:

CREATE DATABASE nombrebasededatos

donde nombrebasededatos es el nombre que usted le da a la base de datos.


Por ejemplo, estas dos consultas en SQL crean las bases de datos de los
ejemplos usados en este libro:

CREATE DATABASE Cata!ogodeMascotas


CREATE DATABASE DirectoriodeMiembros

Algunas compaas de hospedaje de sitios web no le permitirn crear bases de


datos nuevas. Le darn una base de datos para que la use con MySQL, y solo
podr crear tablas en esta base de datos. Puede tratar de solicitar otra base de
datos, pero necesitar una muy buena razn. A MySQL y PHP no les importa
Parte II: La base de datos MySQL

que todas sus tablas estn en una sola base de datos, en lugar de organizadas
en varias bases de datos con nombres significativos. Solo para los humanos es
ms fcil seguirle la pista a los proyectos cuando estn organizados.

Para comprobar por usted mismo que la base de datos fue verdaderamente
creada, use esta consulta SQL:

SHOW DATABASES

Despus de crear una base de datos vaca, puede agregarle tablas. (Ms ade
lante en este captulo describo cmo agregar tablas a una base de datos).

Cmo horrar una base de datos


Puede borrar cualquier base de datos con esta consulta SQL:

DROP DATABASE nombrebasededatos

Use DROP cuidadosamente, pues es irreversible. Despus de que una base de


datos se borra, se perdi para siempre. Y todos los datos que estaban en ella
tambin se pierden.

Cmo agregar tablas a una base de datos


Puede agregar tablas a cualquier base de datos, ya sea a una base de datos nueva y
vaca creada recientemente, o a una base de datos existente que ya tenga tablas y
datos en ella. Se usa la consulta CREATE para agregar tablas a la base de datos.

En los ejemplos de diseo de bases de datos que introduje en el Captulo 3, la


base de datos catal ogosdemascotas est diseada con tres tablas: Masco
ta, TipodeMascota y Colordel aMascota. La base de datos Di rectorio-
deMi embros est diseada con dos tablas: Mi embro y Entrada. Como las
tablas se crean en una base de datos, debe indicar el nombre de la base de
datos donde desea crear la tabla. O sea, cuando use el formulario mostrado
en la Figura 4-1, debe digitar el nombre de la base de datos en el campo supe
rior. Si no lo hace ver el mensaje de error No Database Selected.

La consulta para agregar una tabla empieza con

CREATE TABLE nombredetabla

Luego sigue una lista de nombres de columnas con sus definiciones. La infor
macin de cada columna se separa de la informacin de la siguiente columna
mediante una coma. La lista completa debe encerrarse entre parntesis. Cada
nombre de columna debe seguirse de su tipo de datos (explico los tipos de da
tos detalladamente en el Captulo 3) y cualquier otra definicin requerida. Es
tas son algunas definiciones que puede usar:
Captulo 4: Construccin de la base de datos

| NOT N U L L : Esta columna debe tener un valor; no puede estar vaca.

| DEFAULT valu: Si no se indica ningn otro valor, este valor se almace-


| na en la columna cuando se crea la fila.

v* AUTCLINCREMENT: Use esta definicin para crear un nmero secuencial.


Conforme se agregan filas, el valor de esta columna aumentar en un n
mero entero desde la ltima fila que se agreg. Puede pasar por alto el
nmero automtico asignndole un valor especfico a la columna.
8
UNSIGNED: Use esta definicin para indicar que los valores en este cam-
1 po numrico nunca sern nmeros negativos.

El ltimo elemento en una consulta CREATE TABLE indica cul columna o com
binacin de columnas es el identificador nico para la fila, es decir, la clave pri
maria. Cada fila de una tabla debe tener un campo o una combinacin de
campos diferente para cada fila. Dos filas no pueden tener la misma clave pri
maria. Si intenta agregar una fila con la misma clave primaria que una fila ya
existente en la tabla, obtendr un mensaje de error y la fila no se agregar. El
diseo de la base de datos identifica la clave primaria (tal como describo en el
Captulo 3). Debe especificar la clave primaria usando el siguiente formato:

CREATE TABLE Miembro (


loginName VARCHARC20) NOT NULL PRIMARY K E Y ,
createDate DATE NOT NULL):
PRIMARY K\(nombre_columna)

El nombreco 1umna se encierra entre parntesis. Si est usando una combinacin


de columnas como clave primaria, incluya todos los nombres de columnas, sepa
rados por comas. Por ejemplo, podra designar la clave primaria para la tabla En -
t rada en la base de datos Di rector iodeMi embros usando la siguiente consulta:

PRIMARY KEY (Nombre_entrada., Ti e m po _ e n t r a d a )

La Lista 4-2 muestra la consulta CREATE TABLE usada para crear la tabla Mi em
bro de la base de datos Di rectori odeMi embros. Si quisiera, podra digitar
esa consulta en una sola lnea. A MySQL no le importa cuntas lneas use. Sin
embargo, el formato mostrado en la Lista 4-2 es ms fcil de leer. Este formato
amigable a los humanos tambin le ayuda a detectar errores de digitacin.

L is ta 4-2: C o n s u lta S Q L p a ra c re a r u n a ta b la
CREATE TABLE Miembro (
Nombreentrada VARCHAR(20) NOT NULL,
Fechacreaci on DATE NOT NULL,
clave CH AR ( 255) NOT NULL,
A p e l 1 i do VARCHARC 50),
Nombre VARCHARC 40),
cal 1 e V A R C HA R(50),
ciudad VARCHARC 50),
estado C H A R (2),
codi gopostal CHAR(10),
Parte II: La base de datos MySQL

email VARCHAR(50),
telefono CHAR(15),
fax CH AR (15),
PRIMARY K E Y (1oginName) )

Observe que la lista de los nombres de las columnas en la Lista 4-2 est ence
rrada entre parntesis (uno en la primera lnea y otro en la ltima lnea) y
que hay una coma despus de la definicin de cada columna.

Recuerde que, como indiqu en el Captulo 3, no debe usar ninguna palabra


reservada por MySQL en los nombres de las columnas. Si lo hace, MySQL le
dar un mensaje de error parecido a este:

You have art e r r o r i n y o u r SQL s y n t a x n e a r ' o r d e r v a r ( 2 0 ) ) ' at l i n e 1

Observe que este mensaje muestra la definicin de la columna que a SQL no


le gust y la lnea donde encontr la definicin ofensiva. Sin embargo, el men
saje no dice mucho sobre cul es el problema. El error in your SQL syn
tax (error en la sintaxis de SQL) al cual se refiere es haber usado la palabra
order, reservada por MySQL, como nombre de una columna.

Despus de crear una tabla puede solicitar verla, revisar su estructura o eliminarla.

| is Para ver las tablas agregadas a una base de datos, use esta consulta SQL:
1 SHOW TABLES

v * Tambin puede ver la estructura de una tabla con esta consulta:


SHOW COLUMNS FROM nombre_tabla

v * Puede eliminar cualquier tabla con esta consulta:


DROP TABLE nombre_tabla

Use DROP cuidadosamente, pues es irreversible. Despus de borrar una


tabla, se pierde para siempre. Y todos los datos que estaban en ella tam
bin se pierden.

Cmo cambiar (a estructura


de la base de datos
Su base de datos no est escrita en piedra. Puede cambiar el nombre de la tabla
usando la consulta ALTER; tambin puede agregar, eliminar o renombrar una co
lumna, o cambiar el tipo de datos y cualquier otro atributo de la columna.

El formato bsico de esta consulta es ALTER TABLE nombretabla, seguido


por los cambios especficos que est solicitando. La Tabla 4-1 muestra los
cambios que es posible hacer.
Captulo 4: Construccin de la base de datos

Tabla 4-1 Cambios que se pueden hacer con la consulta ALTER


Cambio Descripcin

ADD nombre columna A grega una colum na; def i ni ci on incluye el


defi ni cion tipo de datos y definiciones opcionales

ALTER nombre_columna Elimina el valor predeterm inado de una


SET DEFAULT valor colum na

ALTER nombre, co Umna Elimina el valor predeterm inado de una


DROP DEFAULT colum na

CHANGE d e f i n i c i n Cam bia la definicin de una colum na y


nombre columna renom bra la colum na; def ini ci on incluye
nuevo_nombre_columna el tipo de datos y definiciones opcio nales

DROP nombre_columna B orra una colum na, incluyendo los datos que
contenga. Los datos no se pueden recuperar.

MODIFY nombre columna Cam bia la definicin de una colum na;


defi ni ci on def i ni ci on incluye el tipo de datos y
definiciones opcionales.

RENAME R enom bra una tabla


nue vo_nombre__co 1umna

Cambiar una base de datos no es nada raro. Hay muchas razones por las cua
les podra querer cambiar algo en su base de datos. Por ejemplo, suponga que
defini la columna Apel 1 ido con VARCHAR(20) en la tabla Mi embro de la ba
se de datos Di rectori odeMi embros. En ese momento, 20 caracteres parecie
ron suficientes para un apellido. Pero acaba de recibir un memorando
anunciando que el nuevo CEO es John Schwartzheimer-Losertman, Ay! MySQL
truncar su nombre dejando solo las primeras 20 letras, un nombre poco-me-
nos-que-deseable para su nuevo jefe. As que debe hacer ms ancha su colum
na, y pronto. Enve esta consulta para cambiar la columna en un segundo:

ALTER TABLE Member MODIFY Apellido VARCHAR(50)

MoUer datos hacia dentro y


hacia fuera de una base de datos
Una base de datos vaca es como un frasco de galletas vaco: algo muy poco
atractivo. Y sondear una base de datos vaca no es ms interesante o fructfe
ro que sondear un frasco de galletas vaco. Una base de datos solo es til en
relacin con la informacin que guarda.
Parte II: La base de datos MySQL

Una base de datos debe ser capaz de recibir informacin para almacenar y de
entregar informacin cuando se le pide. Por ejemplo, la base de datos Di rec -
tori odeMi embros debe ser capaz de recibir la informacin de los miembros,
y tambin debe ser capaz de entregar la informacin que guarda cuando se le
solicita. Por ejemplo, si desea averiguar la direccin de un miembro en parti
cular, la base de datos debe entregarle esta informacin apenas se la pida.

Su base de datos MySQL responde a cuatro tipos de solicitudes:

v0 Agregar informacin: Agregar una fila a una tabla.

v0 Actualizar informacin: Cambiar informacin en una fila existente. Esto in


cluye agregar datos a un campo en blanco dentro de una fila ya existente.

u0 Recuperar informacin: Buscar datos. Este tipo de solicitud no elimina


los datos de la base de datos.

u0 Eliminar informacin: Borrar datos de la base de datos.

A veces sus preguntas requerirn informacin de ms de una tabla. Por ejem


plo, la pregunta "Cunto cuesta un dragn verde?" requiere informacin de
la tabla Mascota y de la tabla Color. Fcilmente puede hacer esta pregunta
en una sola consulta SELECT, combinando las tablas.

En las secciones siguientes comento cmo recibir y entregar informacin, y


tambin cmo combinar tablas.

Agregar informacin
Todas las bases de datos necesitan datos. Una posibilidad es que usted quie
ra agregar datos a su base de datos para que los usuarios puedan verla, por
ejemplo en el Catlogo de Mascotas que introduje en el Captulo 3. Otra posi
bilidad es crear una base de datos vaca para que los usuarios pongan datos
en ella, haciendo que la informacin slo est disponible para usted, como en
el ejemplo del Directorio de Miembros. En cualquiera de estos escenarios hay
que agregar datos a la base de datos.

Si sus datos estn todava en papel usted puede digitarlos directamente en una ba
se de datos MySQL, una fila a la vez, usando consultas SQL. Sin embargo, si tiene
muchos datos, este proceso podra hacerse muy tedioso y tomara mucho tiempo
digitar la informacin. Suponga que debe agregar a su base de datos informacin
sobre 1,000 productos. Asumiendo que digite a la velocidad de la luz y que pueda
digitar una fila por minuto, seran 16 horas de digitar rpidamente o de editar
rpidamente, en todo caso. Se puede hacer, pero no es divertido. Por otra parte,
suponga que tiene que incluir a los 5,000 miembros de una organizacin en una ba
se de datos y que toma cinco minutos digitar la informacin de cada uno. Esto to
mara ms de 400 horas de digitacin, quin tiempo para eso!
Captulo 4: Construccin de la base de datos

Si tiene que digitar grandes cantidades de datos, considere algunas alternativas. A


veces es una buena opcin escanear los datos. O quiz necesite suplicar por ayuda,
0 pedirla prestada o contratarla. En muchos casos ser ms rpido digitar los datos
en un gran archivo de texto que digitar fila por fila en consultas individuales de SQL.

La consulta LOAD de SQL puede leer datos de un archivo grande de texto (o in


cluso de un archivo de texto pequeo). 0 sea, si sus datos ya estn en un archi
vo de PC, puede trabajar con ese archivo; no tiene que digitar todos los datos
de nuevo. Incluso si los datos estn en un archivo cuyo formato no es de texto
(por ejemplo en un archivo de Excel, Access u Oracle), usualmente es posible
convertir el archivo a un gran archivo de texto que luego puede ser ledo por
su base de datos MySQL. Si los datos todava no estn en un archivo de PC y
hay mucha informacin, probablemente ser ms rpido digitar los datos en el
PC en un gran archivo de texto y transferirlo a MySQL com o segundo paso.

La mayora de los archivos de texto pueden ser ledos por MySQL, pero algunos for
matos son ms fciles de leer que otros. Si est planeando digitar los datos en un
gran archivo de texto, lea la seccin "Cmo agregar una enorme cantidad de datos"
para averiguar cul es el mejor formato para su archivo de texto. Por supuesto que
si los datos ya estn en su PC tendr que trabajar con el archivo tal como est.

Cmo agregar una fila a (a Vez


La consulta INSERT se usa para agregar una fila a una base de datos. Esta
consulta le dice a MySQL en cul tabla agregar la fila y cules son los valores
para los campos en la fila. La forma general de la consulta es

INSER INTO nombre_tabla (nombre_coliimna, nombre_columna nombrecolumna)


VALUES ( v a l o r , v a l o r v a lo r )

Las siguientes reglas se aplican a la consulta INSERT:

u * Los valores deben enumerarse en el mismo orden en que se enume-


1 ran los nombres de las columnas. El primer valor en la lista de valores
se inserta en la columna que se nombra primero en la lista de columnas;
el segundo valor en la lista de valores se inserta en la columna que se
nombra de segunda en la lista de columnas y as sucesivamente.

v * Se permite una lista de columnas parcial. No tiene que enumerar todas


las columnas. Las columnas que no se enumeran recibirn su valor prede
terminado o, si no tienen un valor predeterminado, se dejarn en blanco.
p

V No es obligatorio usar una lista de columnas. Si est digitando valores


para todas las columnas, no necesita la lista de columnas del todo. Si no
se enumeran columnas, MySQL buscar valores para todas las colum
nas, en el orden en el que aparecen en la tabla.
%
| La lista de columnas y la lista de valores debe ser de la misma longi
tud. Si la lista de columnas es ms larga o ms corta que la lista de valo
res, recibir un mensaje de error como este: Col umn count doesn't
match valu count.
Parte II: La base de datos MySQL

La siguiente consulta INSERT agrega una fila a la tabla Mi embro:

INSER INTO Miembro ( N o m b r e e n t r a d a . F e c h a c r e a c i o n , c l a v e , A p e l l i d o ,


c a l 1e , c i u d a d , e s t a d o , c o d i g o _ p o s t a l , e m a i l .telefone . f a x )
VALUES ( " b i g g u y , 2 0 0 1 - D e c - 2 , s e c r e t , " S m i t h " ,
1234 Happy S t V L a s Vegas'1, " N V " , 8 8 8 88 " ,
" g smi th@GSmi thCompany. com" , " ( 5 5 5 ) 5 5 5 - 5 5 5 5 " . " )

Observe que Nombre no aparece en la lista de los nombres de columnas. No


se digita ningn valor en el campo Nombre. Si Nombre se define como NT
NULL , MySQL no lo permitira, pero como Nombre no est definido como NOT
NUIL , no hay problema. Adems, si la definicin para Nombre incluye un va
lor predeterminado, se le asignara ese valor predeterminado, pero como no
es as, el campo se deja vaco. Observe que el valor almacenado para f ax es
una cadena vaca; a MySQL no le molestan las cadenas vacas.

Para ver los datos que digit y asegurarse de que los digit correctamente, use una
consulta SQL que recupere los datos de la base de datos. Describo estas consultas
detalladamente en "Cmo recuperar informacin" ms adelante en este captulo. En
resumen, la siguiente consulta recupera todos los datos en la tabla Mi embro:

SELECT * FROM Miembro

Cmo agregar una enorme cantidad de datos


Si tiene que agregar una gran cantidad de datos que ya estn en un archivo
de PC, puede transferir los datos del archivo existente a su base de datos
MySQL. La consulta SQL que lee los datos de un archivo de texto es LOAD. La
consulta LOAD requiere que especifique la base de datos.

Como los datos en una base de datos estn organizados en filas y columnas, el
archivo de texto ledo debe indicar dnde empiezan y terminan los datos para
cada columna y dnde termina la fila. Para indicar columnas, un carcter espe
cfico separa los datos de cada columna. Como valor predeterminado, MySQL
busca un carcter de tabulacin para separar los campos. Sin embargo, si la ta
bulacin no funciona para su archivo de datos, puede escoger un carcter dife
rente para separar los campos y decirle a MySQL, en la consulta, que un
carcter diferente del de tabulacin separa los campos. Tambin como valor
predeterminado, se espera que el final de una lnea sea el final de una fila, aun
que puede escoger un carcter especfico para indicar el final de una lnea si es
necesario. Un archivo de datos para la tabla Mascota se ve as:

U n i c o m i o<TAB)ca bal 1 o<TAB>cuerno en e sp i r a l < T a b > 5 0 0 0 . 0 0 < T a t / p i x / u n i c or n . j pg


P e g a s o <T A B > c a b a l l o <T A B > al a d o < T a b > 8 0 0 0 . 0 0 <T a b> / p i x / p e ga s u s . j p g
Leon<TAB>gat o<TAB)grande; mel ena en
cuello<Tab>2000.00<Tab>/pix/lion.jpg

Un archivo de datos con fabuladores entre los campos es un archivo delimi


tado por tabuladores. Otro formato comn es un archivo delimitado por co
mas, donde las comas separan los campos. Si sus datos estn en otro
formato de archivo, debe convertirlo a un archivo delimitado.
Captulo 4: Construccin de la base de datos

Para convertir datos de otro formato de archivo a un archivo delimitado, con


sulte el manual del software correspondiente o hable con un experto local
que entienda el formato actual de los datos. Muchos programas, como Excel,
Access u Oracle, le permiten ordenar los datos en un archivo delimitado. En
un archivo de texto, tal vez pueda convertirlo al formato delimitado usando
la funcin de buscar y reemplazar de un editor o procesador de palabras. Si
tiene un archivo verdaderamente problemtico, quiz necesite buscar la ayu
da de un experto o de un programador.

La forma bsica de una consulta LOAD es

LOAD DATA INFILE "n cmbr ear chivodat os" INTO TABLE nombrejtabla

Esta forma bsica puede ir seguida de frases opcionales si desea cambiar al


gunos de los delimitadores predeterminados. Las opciones son

FIELOS TERMINATED BY ' c a r c t e r '


FIELDS ENCLOSED BY ' c a r c t e r '
LINES TERMINATED BY ' c a r c t e r '

Suponga que tiene el archivo de datos para la tabla Mascota, mostrada ante
riormente en esta seccin, pero los campos estn separados por comas y no
por el tabulador. El nombre del archivo de datos es mascotas .dat, y est lo
calizado en el mismo directorio que la base de datos. La consulta SQL para
leer los datos en la tabla es

LOAD DATA INFILE "mascotas,dat" INTO TABLE Mascota


FIELDS TERMINATED BY ,'

Para poder usar la consulta LOAD DATA IN FI L E, la cuenta MySQL debe tener
el privilegio FILE en el anfitrin del servidor. En el Captulo 5 comento los
privilegios de las cuentas MySQL.

Para ver los datos que carg, y asegurarse de que estn correctos, use una
consulta SQL que recupere los datos de la base de datos. En la seccin si
guiente describo detalladamente estos tipos de consultas. En resumen, use la
siguiente consulta para ver y revisar todos los datos de la tabla:

SELECT * FROM Mascota

Cmo recuperar informacin


El nico propsito de guardar informacin es tenerla a disposicin cuando se
necesite. Una base de datos vive para responder preguntas. Cules masco
tas estn a la venta? Quines son los miembros? Cuntos miembros viven
en Arkansas? Hay un lagarto a la venta? Cunto cuesta un dragn? Cul es
el nmero telefnico de Goliath Smith? Y as sucesivamente. Se usa la consul
ta SELECT para hacerle preguntas a la base de datos.
Parte II: La base de datos MySQL

La siguiente consulta INSERT agrega una fila a la tabla Mi embro:

INSER INTO Miembro ( N o m b r e e n t r a d a . F e c h a c r e a c i o n , c l a v e , A p e l l i d o ,


cal 1e , c i u d a d , e s t a d o , c o d i g o _ p o s t a l . e m a i l . t e l e f o n e , fax)
VALUES ( " b i g g u y " , " 2 0 0 1 - D e c - 2 , " s e c r e t V'Smit h " ,
"1234 Happy S t V ' L a s V e g a s " , " N V " , " 8 8 8 8 8 " ,
"gsmi th@GSn t hC o m p a ny . c o m" , " ( 555) 5 5 5 - 5 5 5 5 " , " " )

Observe que Nombre no aparece en la lista de los nombres de columnas. No


se digita ningn valor en el campo Nombre. Si Nombre se define como NOT
NULL , MySQL no lo permitira, pero como Nombre no est definido como NOT
NULL , no hay problema. Adems, si la definicin para Nombre incluye un va
lor predeterminado, se le asignara ese valor predeterminado, pero como no
es as, el campo se deja vaco. Observe que el valor almacenado para fax es
una cadena vaca; a MySQL no le molestan las cadenas vacas.

Para ver los datos que digit y asegurarse de que los digit correctamente, use una
consulta SQL que recupere los datos de la base de datos. Describo estas consultas
detalladamente en "Cmo recuperar informacin ms adelante en este captulo. En
resumen, la siguiente consulta recupera todos los datos en la tabla M i e m b r o :

SELECT * FROM Miembro

Cmo agregar una enorme cantidad de datos


Si tiene que agregar una gran cantidad de datos que ya estn en un archivo
de PC, puede transferir los datos del archivo existente a su base de datos
MySQL. La consulta SQL que lee los datos de un archivo de texto es LOAD. La
consulta LOAD requiere que especifique la base de datos.

Como los datos en una base de datos estn organizados en filas y columnas, el
archivo de texto ledo debe indicar dnde empiezan y terminan los datos para
cada columna y dnde termina la fila. Para indicar columnas, un carcter espe
cfico separa los datos de cada columna. Como valor predeterminado, MySQL
busca un carcter de tabulacin para separar los campos. Sin embargo, si la ta
bulacin no funciona para su archivo de datos, puede escoger un carcter dife
rente para separar los campos y decirle a MySQL, en la consulta, que un
carcter diferente del de tabulacin separa los campos. Tambin como valor
predeterminado, se espera que el final de una lnea sea el final de una fila, aun
que puede escoger un carcter especfico para indicar el final de una lnea si es
necesario. Un archivo de datos para la tabla Mascota se ve as:

Un i c o r n i o<TAB>cabal lo<TAB>cuerno en e s p i r a l < T a b > 5 0 0 0 . 0 0 < T a b > / p i x / u n i c o r n . j p g


P eg a s o <T A B > c a b a l l o < T A B > a l a d o < T a b> 8 0 0 0 . 0 0 < Ta b > / p i x / p e g a s u s .j p g
Leon<TAB>gato<TAB>grande;melena en
cuello<Tab>2000.00<Tab>/pix/lion.jpg

Un archivo de datos con fabuladores entre los campos es un archivo delimi


tado por fabuladores. Otro formato comn es un archivo delimitado por co
mas, donde las comas separan los campos. Si sus datos estn en otro
formato de archivo, debe convertirlo a un archivo delimitado.
Captulo 4: Construccin de la base de datos

Para convertir datos de otro formato de archivo a un archivo delimitado, con


sulte el manual del software correspondiente o hable con un experto local
que entienda el formato actual de los datos. Muchos programas, como Excel,
Access u Oracle, le permiten ordenar los datos en un archivo delimitado. En
un archivo de texto, tal vez pueda convertirlo al formato delimitado usando
la funcin de buscar y reemplazar de un editor o procesador de palabras. Si
tiene un archivo verdaderamente problemtico, quiz necesite buscar la ayu
da de un experto o de un programador.

La forma bsica de una consulta LOAD es

LOAD DATA INFILE "nomb rea rch iv od at os " INTO TABLE nombre_tabla

Esta forma bsica puede ir seguida de frases opcionales si desea cambiar al


gunos de los delimitadores predeterminados. Las opciones son

FIELDS TERHINATED BY ' c a r c t e r '


FIELDS ENCLOSED BY ' c a r c t e r '
LINES TERMINATED BY ' c a r c t e r

Suponga que tiene el archivo de datos para la tabla Mascota, mostrada ante
riormente en esta seccin, pero los campos estn separados por comas y no
por el tabulador. El nombre del archivo de datos es mascotas.dat,y est lo
calizado en el mismo directorio que la base de datos. La consulta SQL para
leer los datos en la tabla es

LOAD DATA INFILE " m a s co ta s.dat" INTO TABLE Mascota


FIELOS TERMINATED BY ','

Para poder usar la consulta LOAD DATA INFI LE, la cuenta MySQL debe tener
el privilegio FI LE en el anfitrin del servidor. En el Captulo 5 comento los
privilegios de las cuentas MySQL.

Para ver los datos que carg, y asegurarse de que estn correctos, use una
consulta SQL que recupere los datos de la base de datos. En la seccin si
guiente describo detalladamente estos tipos de consultas. En resumen, use la
siguiente consulta para ver y revisar todos los datos de la tabla:

SELECT * FROM Mascota

Cmo recuperar informacin


El nico propsito de guardar informacin es tenerla a disposicin cuando se
necesite. Una base de datos vive para responder preguntas. Cules masco
tas estn a la venta? Quines son los miembros? Cuntos miembros viven
en Arkansas? Hay un lagarto a la venta? Cunto cuesta un dragn? Cul es
el nmero telefnico de Goliath Smith? Y as sucesivamente. Se usa la consul
ta SELECT para hacerle preguntas a la base de datos.
Parte II: La base de datos MySQL

La consulta SELECT ms simple y bsica es

SELECT * FROM nombre_tabla

E;>ta consulta recupera toda la informacin de la tabla. El asterisco (* ) es un


comodn que significa todas las columnas.

La consulta SELECT puede ser mucho ms selectiva. Las palabras y frases en


SQL en la consulta SELECT pueden sealar exactamente la informacin nece
saria para responder su pregunta. Puede especificar cul informacin desea,
cmo desea que se organice y cul es la fuente de informacin:

| v * Puede solicitar nicamente la informacin (las columnas) que necesi


ta para responder su pregunta. Por ejemplo, puede solicitar solo el
nombre y los apellidos para crear una lista de miembros.

% Puede solicitar la informacin en algn orden en particular. Por ejein-


| po, puede solicitar que la informacin se clasifique en orden alfabtico.
L v * Puede solicitar informacin de objetos seleccionados (las filas) en su
tabla. (En el Captulo 3 explico qu son los objetos en las bases de da-
| tos). Por ejemplo, puede solicitar el nombre y el apellido solo de aque-
L los miembros cuyas direcciones estn en Florida.

Cmo recuperar informacin especfica


Para recuperar informacin especfica, enumere las columnas que contienen
la informacin que desea. Por ejemplo:

SELECT nombre_columna, nombre_columna, nombre__columna, . . .


FROM nombre__tabla

Esta consulta recupera los valores de todas las filas para las columnas indica
das. Por ejemplo, la siguiente consulta recupera todos los nombres y apelli
dos almacenados en la tabla Miembro:

SELECT Ap el1 i d o ,Nombre FROM Miembro

Puede realizar operaciones matemticas con las columnas cuando las selecciona.
Por ejemplo, puede usar la siguiente consulta SELECT para sumar dos columnas:

SELECT coll+col2 FROM nombre_tabla

O puede usar la siguiente consulta:

SELECT p r ec io ,p re ci o*l.08 FROM Mascota

El resultado es el precio y el precio con el impuesto de ventas del 8 por ciento


sumado. Puede cambiar el nombre de una columna cuando la selecciona, as:

SELECT p r e c i o ,p r ec i o* l.08 AS precioConImpuesto FROM Mascota


Captulo 4: Construccin de la base de datos

La clusula AS le dice a MySQL que le d el nombre preci oConImpuesto a la


segunda columna recuperada. As, la consulta recupera dos columnas de da
tos: p r e c i o y p r e c i o C o n l m p u e s t o .

En algunos casos usted no desear ver los valores en una columna, pero s
saber algo sobre la columna. Por ejemplo, tal vez quiere saber el valor ms
bajo en la columna o el valor ms alto en la columna. La Tabla 4-2 enumera
parte de la informacin disponible sobre las columnas.

Tabla 4-2 Inform acin que se puede seleccionar


Formato SQL Descripcin de la informacin

AVG Indica el prom edio de todos los valores en


(nombrecolumna) nombrecolumna

COUNT Indica el nmero de filas en las cuales nombrecol umna


(nombrecolumna) no est en blanco.

MAX Indica el valor m s alto en nombrecol umna


( nombreco1umna)

MI N Indica el valor m s bajo en nombrecol umna


( nombrecolumna)

SUM Indica la suma de todos los valores en nombrecol umna


( nombrecolumna)

Por ejemplo, la consulta para averiguar el precio ms alto en la tabla Mascota es

SELECT MAX(precio) FROM Mascota

Las palabras de SQL como MAX ( ) y SUM ( ) son funciones. SQL ofrece muchas
otras funciones adems de las que aparecen en la Tabla 4-2. Algunas funciones,
como las de la Tabla 4-2, brindan informacin sobre una columna. Otras fun
ciones cambian cada valor seleccionado. Por ejemplo, S Q RT ( ) indica la raz
cuadrada de cada valor en la columna, y D A Y N AM E ( ) indica el nombre del da de
la semana para cada valor en la columna fecha, en lugar de la fecha verdadera
almacenada en la columna. Hay ms de 100 funciones que pueden usarse en las
consultas SELECT. Para conocer las descripciones de todas las funciones, vea la
documentacin de MySQLen www .mysql .com/documentation.

Cmo recuperar datos en un orden especifico


Tal vez quiera recuperar los datos en algn orden en particular. Por ejemplo,
en la tabla Mi embro, tal vez quiera que los miembros sean organizados en or
den alfabtico por apellido. O, en la tabla Mascota, tal vez quiera que las
mascotas sean agrupadas por tipo de mascota.
Parte II: La base de datos MySQL

En la consulta SELECT , ORDER BY y GROUP BY afectan el orden en que los


datos se presentan:

MORDER BY : Para ordenar informacin, use la frase


ORDER BY nombre columna

Los datos son organizados por nombrecol umna en orden ascendente.


Por ejemplo, si el nombrecol umna es Apel 1 ido, los datos se presenta
rn en orden alfabtico ordenados por el apellido.
Puede organizarlos en orden descendente agregando la palabra DESC an
tes del nombre de la columna. Por ejemplo:
SELECT * FROM Miembro ORDER BY DESC Apellido

GROUP BY : Para agrupar informacin, use la siguiente frase:


GROUP BY nombrecolumna

Las filas que tienen el mismo valor de nornbre_co 1 umna se agrupan jun
tas. Por ejemplo, use esta consulta para agrupar las filas que tienen un
mismo valor de Ti podeMascota:
SELECT * FROM Mascota GROUP BY TipodeMascota

Puede usar GROUP BY y ORDER BY en una misma consulta.

Cmo recuperar datos de una fuente especfica


Lo ms usual es que no quiera toda la informacin de una tabla. Solo quiere in
formacin de objetos especficos de una base de datos: o sea, las filas. Hay tres
palabras SQL usadas habitualmente para especificar la fuente de la informacin:

v* WHE R E: Le permite solicitar informacin de objetos de una base de datos con


ciertas caractersticas. Por ejemplo, puede solicitar los nombres de los miem
bros que viven en California, o puede pedir slo las mascotas que sean gatos.

LI MI T: Le permite limitar el nmero de filas de las cuales se extraer la


informacin. Por ejemplo, puede solicitar toda la informacin de las pri
meras tres filas en la tabla.

DISTINCT: Le permite solicitar informacin de solo una fila de filas idnticas.


Por ejemplo, en la tabla Entrada puede solicitar el Nombre, entrada, pero es
pecificar no duplicar nombres, delimitando as la respuesta a un registro para
cada miembro. Esto respondera a la pregunta "Ha entrado el miembro alguna
vez?", en lugar de la pregunta "Cuntas veces ha entrado el miembro?"

La clusula WHERE de la consulta SELECT le permite hacer selecciones bastan


tes complicadas. Por ejemplo, suponga que su jefe le pide una lista de todos
los miembros cuyos apellidos empiezan con B, que viven en Santa Brbara y
que tienen un 8 en su nmero telefnico o de fax. Estoy seguro de que hay
muchos usos para ese tipo de lista. Puede complacer a su jefe y obtener esta
lista con la consulta SELECT, usando la clusula WHERE.
Captulo 4: Construccin de la base de datos

El formato bsico de la clusula WHERE es

WHERE expresin A N Dj 0 R expresin A N D [OR expresin ...

expresin especifica un valor que debe compararse con los valores guarda
dos en la base de datos. Solo se seleccionan las filas que contengan informa
cin que concuerde con la expresin. Puede usar tantas expresiones como
necesite, cada una separada por AND u OR. Cuando usa AND, las dos expre
siones conectadas por AND (es decir, tanto la expresin que est antes de
AND como la expresin que est despus de AND) deben concordar para
seleccionar la fila. Cuando se usa OR, slo una de las expresiones conectadas
por OR debe concordar para seleccionar esa fila.

Algunas expresiones comunes se muestran en la Tabla 4-3.

Tabla 4-3 Expresiones de la clusula WHERE


Expresin Ejemplo Resultado

columna = valor codi gopostal = Slo selecciona las filas


"12345" donde 12345 est alm a c e
nado en la colum na lla
m ada cdigo_postal

columna > valor codi gopostal Slo selecciona las filas


> "50000" donde el cdigo postal es
50001 o m ayor

columna >= valor codi gopostal Slo seleccio n a las filas


>= "50000" donde el cdigo postal es
50000 o m ayor

columna < valor codi gopostal Slo seleccio n a las filas


< "50000" donde el cdigo postal es
49999 o m enor

columna <= valor codi gopostal Slo selecciona las filas


<= "50000" donde el cdigo postal es
50000 o m enor

columna BETWEEN codi gopostal Slo selecciona las


val or AND valor2 BETWEEN "20000" filas donde el cdigo
AND "30000" postal es mayor a 19999
pero menor a 30001

columna IN (valorl codigopostal Slo selecciona las


val o r 2 ,...) IN("90001", filas donde el cdigo
"30044") postal es 90001 o 30044
Parte II: La base de datos MySQL

Expresin Ejemplo Resultado (continuacin)

columna NOT IN codi gopostal Slo seleccio n a las filas


(vaI o r ,val or2 ,...) NOT IN donde el cdigo postal
("90001", es cu alq u ier cdigo
"30044") postal con excep cin de
90001 o 30044

columna LIKE valor codi gopostal Selecciona todas las


valor puede contene LIKE "9%" filas donde el cdigo
re comodn % (que postal empieza con 9
con c u erd a con cu alq u ier
c a d e n a )y _ (q u e
c oncuerda con
cu a lq u ie r c a r c te r)

columna NOT LIKE zip NOT LIKE S eleccio n a las filas


valor - valor puede "9%" donde el cdigo postal
co n te n er el com odn % no em pieza con 9
(que con c u erd a con
cualq u ier c ad en a) y
_ (q u e concuerda
con cu a lq u ie r c a r c te r)

Puede combinar cualesquiera de las expresiones de la Tabla 4-3 con AND y


OR. En algunos casos deber usar parntesis para aclarar los criterios de se
leccin. Por ejemplo, puede usar la siguiente consulta para responder la ur
gente necesidad de su jefe por encontrar todas las personas en el Directorio
de Miembros cuyos nombres empiecen con B, que vivan en Santa Brbara y
que tengan un 8 en su nmero telefnico o de fax:

SELECT Apelli d o ,Nombre FROM Miembro


WHERE Apellido LIKE " B r
AND ciudad = "Santa Barbara"
AND (telefono LIKE "%8%" OR fax LIKE "%8%")

Observe los parntesis en la ltima lnea. Sin ellos no obtendr los resultados que
le pidi su jefe. Sin los parntesis, cada conector se procesara en orden del pri
mero al ltimo, lo que dara como resultado una lista que incluira todos los
miembros cuyos nombres empiezan con B y que viven en Santa Brbara y cuyos
nmeros telefnicos tienen un 8 en ellos, y todos los miembros cuyo nmero de
fax tiene un 8 en ellos independientemente de si viven o no en Santa Brbara e in
dependientemente de si su nombre empieza o no con B. Cuando se procesara el
ltimo OR, se seleccionaran los miembros cuyas caractersticas concordaran con
la expresin antes de 0 R o la expresin despus de 0 R. La expresin antes de 0 R
se conecta con las experiencias previas por los AN D previos y por ello no es inde
pendiente, pero la expresin despus de OR s es independiente, lo cual resultara
en la seleccin de todos los miembros con un 8 en su nmero de fax.
Captulo 4: Construccin de la base de datos

LIMIT especifica cuntas filas se pueden recuperar. La forma para LIMIT es

LIMIT numeroinicio.numerofi 1 as

La primera fila que desea recuperar es numeroi ni ci o, y el nmero de filas


que desea recuperar es numerof i las. Si numeroi ni ci o no se especifica, se
asume que es 1. Para seleccionar slo los tres primeros miembros que viven
en Texas, use esta consulta:

SELECT * FROM Miembro WHERE estado="TX" LIMIT 3

Algunas consultas SELECT encontrarn registros idnticos, pero en este ejem


plo usted slo quiere ver uno no todos de los registros idnticos. Para
evitar que la consulta recupere todos los registros idnticos, agregue la pala
bra DISTINCT inmediatamente despus de SELECT.

Cmo combinar informacin de tablas


En las secciones anteriores de este captulo, asum que toda la informacin
estaba en una sola tabla. Sin embargo, usted podra querer combinar infor
macin de tablas diferentes. Fcilmente puede hacerlo en una sola consulta.

Se pueden usar dos palabras en una consulta SELECT para combinar infor
macin de dos o ms tablas:

UNI ON : Se recuperan filas de una o ms tablas y se almacenan juntas, una


despus de la otra, en un solo resultado. Por ejemplo, si su consulta seleccio
n 6 filas de una tabla y 5 filas de otra tabla, el resultado contendr 11 filas.

J0 1N : Las tablas se combinan una junto a la otra y la informacin se re


cupera de ambas tablas.

UNION
Se usa UNION para combinar los resultados de dos o ms consultas de selec
cin. Los resultados de cada consulta se aaden al conjunto de resultados se
guidos de los resultados de la consulta anterior. El formato de la consulta
UN ION es el siguiente:

SELECT consulta UNION ALL SELECT consulta ...

Puede combinar tantas consultas SELECT como necesite. Una consulta SE


LECT puede incluir cualquier formato SELECT vlido, incluyendo clusulas
W H E R E , clusulas LIMIT, etc. Las reglas para las consultas son

| Todas las consultas SELECT deben seleccionar el mismo nmero de columnas.

| Las columnas seleccionadas en las consultas deben contener el mismo


I tipo de datos.
Parte II: La base de datos MySQL

Expresin Ejemplo Resultado (continuacin)

columna NOT IN codi gopostal Slo seleccio n a las filas


( v a 1 o r 1, v a 1o r 2 ,...) NOT IN donde el cdigo postal
(" 9 0 0 0 1 " , es cualq u ier cdigo
"30044") postal con excep ci n de
90001 o 30044

columna LIKE valor codi gopostal Selecciona todas las -


valor puede contene LIKE "9% filas donde el cdigo
r el comodn % (que postal empieza con 9
c o n c u e rd a con cualquier
c a d e n a )y _ (q u e
c o n c u e rd a con
c u a lq u ie r c a r c te r)

columna NOT LIKE zip NOT LIKE S eleccio n a las filas


valor - valor puede "97o" donde el cdigo postal
c o n ten er el com odn % no em pieza con 9
(que co n c u erd a con
cu a lq u ie r c a d e n a ) y
_ (q u e c oncuerda
con cu a lq u ier ca r c te r)

Puede combinar cualesquiera de las expresiones de la Tabla 4-3 con AND y


OR. En algunos casos deber usar parntesis para aclarar los criterios de se
leccin. Por ejemplo, puede usar la siguiente consulta para responder la ur
gente necesidad de su jefe por encontrar todas las personas en el Directorio
de Miembros cuyos nombres empiecen con B, que vivan en Santa Brbara y
que tengan un 8 en su nmero telefnico o de fax:

SELECT A p e l1 i d o , N o m b re FROH M ie m b r o
WHERE A p e l l i d o L IK E "B%"
AND c iu d a d = " S a n ta B a r b a r a "
AND (te le fo n o L IK E "%8%" OR f a x L IK E "%8%")

Observe los parntesis en la ltima lnea. Sin ellos no obtendr los resultados que
le pidi su jefe. Sin los parntesis, cada conector se procesara en orden del pri
mero al ltimo, lo que dara como resultado una lista que incluira todos los
miembros cuyos nombres empiezan con B y que viven en Santa Brbara y cuyos
nmeros telefnicos tienen un 8 en ellos, y todos los miembros cuyo nmero de
fax tiene un 8 en ellos independientemente de si viven o no en Santa Brbara e in
dependientemente de si su nombre empieza o no con B. Cuando se procesara el
ltimo OR, se seleccionaran los miembros cuyas caractersticas concordaran con
la expresin antes de OR o la expresin despus de OR. La expresin antes de OR
se conecta con las experiencias previas por los AND previos y por ello no es inde
pendiente, pero la expresin despus de OR s es independiente, lo cual resultara
en la seleccin de todos los miembros con un 8 en su nmero de fax.
Captulo 4: Construccin de la base de datos

LIMIT especifica cuntas filas se pueden recuperar. La forma para LIMIT es

LIMIT numeroi nici o,numerofi las

La primera fila que desea recuperar es numeroi ni si o, y el nmero de filas


que desea recuperar es numerof i las. Si numeroi ni ci o no se especifica, se
asume que es 1. Para seleccionar slo los tres primeros miembros que viven
en Texas, use esta consulta:

SELECT * FROM Miembro WHERE estado="TX" LIMIT 3

Algunas consultas SELECT encontrarn registros idnticos, pero en este ejem


plo usted slo quiere ver uno no todos de los registros idnticos. Para
evitar que la consulta recupere todos los registros idnticos, agregue la pala
bra DISTINCT inmediatamente despus de SELECT.

Cmo combinar informacin de tablas


En las secciones anteriores de este captulo, asum que toda la informacin
estaba en una sola tabla. Sin embargo, usted podra querer combinar infor
macin de tablas diferentes. Fcilmente puede hacerlo en una sola consulta.

Se pueden usar dos palabras en una consulta SELECT para combinar infor
macin de dos o ms tablas:

k* UN10 N: Se recuperan filas de una o ms tablas y se almacenan juntas, una


despus de la otra, en un solo resultado. Por ejemplo, si su consulta seleccio
n 6 filas de una tabla y 5 filas de otra tabla, el resultado contendr 11 filas.

is* J 0 1N : Las tablas se combinan una junto a la otra y la informacin se re


cupera de ambas tablas.

UNION
Se usa UNION para combinar los resultados de dos o ms consultas de selec
cin. Los resultados de cada consulta se aaden al conjunto de resultados se
guidos de los resultados de la consulta anterior. El formato de la consulta
UNION es el siguiente:

SELECT consulta UNION ALL SELECT consulta ...

Puede combinar tantas consultas SELECT como necesite. Una consulta SE


LECT puede incluir cualquier formato SELECT vlido, incluyendo clusulas
WHERE , clusulas LIMIT, etc. Las reglas para las consultas son

u* Todas las consultas SELECT deben seleccionar el mismo nmero de columnas.


iif
8 v* Las columnas seleccionadas en las consultas deben contener el mismo
tipo de datos.
Parte II: La base de datos MySQL

El conjunto de resultados contendr todas las filas de la primera consulta se


guidas de todas las filas de la segunda consulta y as sucesivamente. Los
nombres de las columnas usados en el conjunto de resultados son los nom
bres de las columnas de la primera consulta SELECT.

El arreglo de consultas SELECT puede seleccionar diferentes columnas de la


misma tabla, pero no son comunes las situaciones en las que desea una tabla
nueva con una columna en una tabla seguida por otra columna de la misma
tabla. Es mucho ms probable que necesite combinar columnas de tablas di
ferentes. Por ejemplo, tal vez tenga una tabla de miembros que han renuncia
do al club y una tabla aparte de miembros activos. Puede obtener una lista
de todos los miembros, activos e inactivos, con la siguiente consulta:

SELECT A p e l 1 i d o ,Nombre FROM Miembro UNION ALL


SELECT ap el1 i d o ,nombre FROM MiembroAntiguo

El resultado de esta consulta es el apellido y el nombre de todos los miem


bros activos seguidos de los apellidos y nombres de todos los miembros que
han renunciado.

Dependiendo de cmo organiz sus datos, podra tener nombres repetidos.


Por ejemplo, tal vez un miembro renunci y su nombre est en la tabla M iem
broAnti guo; pero se volvi a inscribir, as que su nombre se agreg a la tabla
Mi embro. Si no quiere duplicados, no incluya la palabra ALL. Si no se incluye
ALL las lneas repetidas no se agregarn a los resultados.

Puede usar ORDER BY con cada consulta SELECT, com o coment en la sec
cin anterior, o puede usar ORDER BYcon una consulta UNION para ordenar
todas las filas en el conjunto de resultados. Si desea que ORDER BY se aplique
a todo el conjunto de resultados, y no slo a la consulta a la que sigue, use un
parntesis, como se indica a continuacin:

(SELECT Apellido FROM Miembro UNION ALL


SELECT Apellido FROM MiembroAntiguo] ORDER BY Apellido

La instruccin U N10 N se introdujo en MySQL 4.0. No est disponible en MySQL 3.

Join
Combinar tablas una junta a otra se llama join o conjuncin. Las tablas se combinan
mediante la coincidencia de datos en una columna: la columna que tienen en co
mn. La tabla de resultados combinada producida por una conjuncin contiene to
das las columnas de ambas tablas. Por ejemplo, si una tabla tiene dos columnas
(Idmiembro y estatura), y la segunda tabla tiene dos columnas (Idm iembro y
peso), una conjuncin da como resultado una tabla con cuatro columnas: Idm iem
bro (de la primera tabla), estatura , Idmi embro (de la segunda tabla) y peso.

Hay dos tipos comunes de conjuncin: una conjuncin interna y una conjuncin
externa. La diferencia entre una conjuncin interna y una conjuncin externa es el
nmero de filas incluidas en la tabla de resultados. La tabla de resultados produci-
Captulo 4: Construccin de la base de datos

da por una conjuncin interna slo contiene las filas que existan en ambas tablas.
La tabla combinada producida por una conjuncin externa contiene todas las filas
que existan en una tabla con blancos en las columnas de las filas que no existen
en la segunda tabla. Por ejemplo, si t a b 1a 1 contiene una fila para Joe y una fila pa
ra Sally, y la t a b1a2 contiene slo una fila para Sally, una conj uncin interna con
tendra solo una fila: la fila para Sally. Sin embargo, una conjuncin externa
contendra dos filas una fila para Joe y una fila para Sally aunque la fila para
Joe tendra un campo en blanco en peso.

La tabla de resultados de la conjuncin externa contiene todas las filas de una ta


bla. Si cualquiera de las filas de esa tabla no existe en la segunda tabla, las colum
nas de la segunda tabla estarn vacas. Por supuesto, los contenidos de la tabla
de resultados los determina cul tabla contribuye con todas sus filas, lo cual re
quiere que la segunda tabla coincida con ellas. Dos tipos de conjuncin externa
controlan cul tabla determina las filas y cul coincide con ella: una LE FT JOIN
(conjuncin izquierda) y una RIGHT JOIN (conjuncin derecha).

Se usan diferentes consultas SELECT para una conjuncin interna y los dos ti
pos de conjuncin externa. La siguiente consulta es una conjuncin interna:

SELECT 1istanombrecolumna FROM t a b l a l , t abl a2


WHERE t a b l a l . col 2 = t a b l a 2 . col 2

Y estas consultas son conjunciones externas:

SELECT 1 istanombrecolumna FROM tablal LEFT JOIN t a b 1 a2


ON tablal.coll=tabl

SELECT 1 istanombrecolumna FROM tablal RIGHT JOIN tabla2


ON t a bl al . co ll = ta bl a 2.col2

En las tres consultas, t a b l a l y tabl a 2 son las tablas a unir. Se pueden unir ms
de dos tablas. En ambas consultas, col 1 y col 2 son los nombres de las colum
nas que se asocian para unir las tablas. Las tablas se asocian con base en los da
tos en estas columnas. Estas dos columnas pueden tener el mismo nombre o
nombres diferentes. Las dos columnas deben contener el mismo tipo de datos.

Como ejemplo de las conjunciones interna y externa, considere un breve for


mulario del Catlogo de Mascotas. Una tabla es Mascota, en la cual las dos
columnas NombreMascota y Ti poMascota guardan los siguientes datos:

N o m b re M a s c o ta T i p o M a s c o ta

Uni cornio Cabal 1 o


Pegaso Caballo
Len Gato

La segunda tabla es Color, en la cual las dos columnas NombreMascota y


ColorMascota guardan los siguientes datos:
Parte II: La base de datos MySQL

N o m b re M a s c o ta C o lo r M a s c o t a

Uni corni o blanco


Un icornio plateado
Pez Dorado

Suponga que necesita hacer una pregunta que requiere informacin de am


bas tablas. Si hace una conjuncin interna con la siguiente consulta:

SELECT * FROM M a s c o t a ,Color WHERE M a s c o t a .NombreMascota = Co-


1or.NombreMascota

obtendr la siguiente tabla de resultados con cuatro columnas: NombreMas


cota (de Mascota), TipoMascota, NombreMascota (de Color) y Co
1o r M a s c o t a .

N o m b re M a s c o ta T ip o M a s c o t a N o m b re M a s c o ta C o lo r M a s c o ta

Unicornio Caballo Unicornio blanco


Unicornio Caballo Unicornio plateado

Observe que solo Unicornio aparece en la tabla de resultados, porque solo U n i


cornio estaba en las dos tablas originales antes de la conjuncin. Por otra parte,
suponga que hace una conjuncin externa izquierda con la siguiente consulta:

SELECT * FROM Mascota LEFT JOIN Color


ON P e t .NombreMa sc ot a=C ol or.NombreMascota

Se obtiene la siguiente tabla de resultados, con las mismas cuatro columnas


NombreMascota (de Mascota), TipoMascota, NombreMascota (de
Color) y C o l o r M a s c o t a pero con filas diferentes:

N o m b re M a s c o ta T ip o M a s c o t a N o m b re M a s c o ta C o l o r M a s c o ta

Uni corni o Cabal!o Uni corni o blanco


Uni corni o Cabal 1 o Uni corni o plateado
Pegaso Cabal 1 o <NULL> <NULL>
Len Gato <NULL> <NULL>

Esta tabla tiene cuatro filas. Tiene las dos primeras filas que la conjuncin in
terna, pero tiene dos filas adicionales filas que estn a la izquierda en la ta
bla Ti poMascota pero no en la tabla Col or. Observe que las columnas de la
tabla Color estn en blanco en las dos ltimas filas.

Y, en tercer lugar, suponga que hace una conjuncin externa derecha con la
siguiente consulta:

SELECT * FROM Mascota RIGHT JOIN Color


ON P e t .NombreMascota=Color.NombreMascota
Captulo 4: Construccin de la base de datos

Obtendr la siguiente tabla de resultados, con las mismas cuatro columnas


pero filas diferentes:

N o m b re M a s c o ta T ip o M a s c o t a N o m b re M a s c o ta C o lo r M a s c o ta

Uni corni o Caballo Unicornio blanco


Un icorni o Caballo Unicornio plateado
<NULL> <NULL> Pez dorado

Observe que estos resultados contienen todas las filas de la tabla Col or a la
derecha, pero no de la tabla Mascota. Observe los espacios en blanco en las
columnas de la tabla Mascota, la cual tiene una fila para Pez.

Las conjunciones de las que he hablado hasta ahora encuentran entradas


coincidentes en las tablas. A veces es til averiguar cules filas en una tabla
no tienen entradas coincidentes en otra tabla. Por ejemplo, suponga que de
sea saber quin no ha entrado nunca en la seccin Solo para miembros. Co
mo tiene una tabla con el nombre de entrada del miembro y otra tabla con las
fechas en las que entran los usuarios, puede hacer aquella pregunta usando
las dos tablas. Hacer una conjuncin y ver todas las concordancias para tra
tar de ver quin falta sera imposible si hay un gran nmero de usuarios en la
tabla. Sin embargo, puede averiguar cules nombres de entrada no tienen en
tradas registradas en la tabla de entrada haciendo la siguiente consulta:

SELECT Nombreentrada FROM Miembro LEFT JOIN Entrada


ON Miembr o. No mb ree nt ra da =E nt rad a.Nombreentrada
WHERE E n t r a d a ;Nombreentrada IS NULL

Esta consulta le dar una lista de todos los nombres de entrada en Mi embro
que no estn en la tabla Entrada.

Como actualizar informacin


Cambiar informacin en una fila existente es actualizar la informacin. Por
ejemplo, tal vez necesite cambiar la direccin de un miembro porque se mu
d, o tal vez tenga que agregar un nmero de fax que un miembro dej en
blanco cuando inicialmente digit la informacin.

La consulta U P DAT E es muy directa:

URDATE nombretabla SET c o lu m na =v a l o r , c o l u m n a = v a l o r ,...


WHERE c l a u s u l a

En la clusula SET usted enumera las columnas que deben actualizarse y los
valores nuevos que deben insertarse. Enumere todas las columnas que quiera
cambiar en una sola consulta. Sin una clusula W H E R E, los valores de las colum-
Parte II: La base de datos MySQL

as se cambiarn en todas las filas. Pero con la clusula WHERE puede especifi
car cules filas actualizar. Por ejemplo, use esta consulta para actualizar una
direccin en la tabla Mi e m b r o :

PDATE Miembro SET calle="3333 Giant S t ,


telefono ="555-555-5555"
WHERE Nombreentr ad a=" bi gg uy"

Cmo eliminar informacin


Mantenga la informacin en su base de datos al da borrando la informacin
obsoleta. Puede eliminar una fila de una tabla usando la consulta DE LETE :

DELETE FROM nombretabla WHERE clausula

Tenga muchsimo cuidado al usar DELETE. Si usa una consulta DELETE sin
una clusula WHERE, borrar todos los datos en la tabla. Repito: todos los da
tos. Una vez ms: todos los datos. Los datos no se podrn recuperar. Esta
funcin de la consulta DELETE est justo al inicio de mi lista no-intente-esto
-en-su-casa.

Puede borrar una columna de una tabla usando la consulta ALTER:

ALTER TABLE nombretabla DROP nombrecolumna

O, por supuesto, puede eliminar toda la tabla y empezar de nuevo con:

DROP TABLE nombretabla

DROP DATABASE nombrebasededatos


Captulo 5

Cmo proteger los datos


En este capitulo
Comprender la seguridad de los datos en MySQL
y Agregar nuevas cuentas MySQL
Modificar cuentas existentes
Cambiar contraseas
Hacer respaldos
* Reparar datos
8 Restaurar datos

c
^ ^ u s datos son esenciales en su aplicacin con base de datos para la Web. Alma
cenar y/o presentar datos son las actividades principales de su aplicacin web.
Usted ha invertido una considerable cantidad de tiempo desarrollando su base de
datos, la cual contiene informacin importante digitada por usted o por sus usua
rios. Por lo tanto, debe protegerla. En este captulo le muestro cmo hacerlo.

Controlar el acceso a sus datos


Usted controlar el acceso a la informacin en su base de datos. Debe decidir
quin puede ver los datos y quin puede cambiarlos. Imagine lo que sucede
ra si sus competidores pudieran cambiar la informacin de su catlogo de
productos en lnea o copiar su lista de clientes. Muy pronto lo dejaran fuera
del negocio. Es obvio que necesita resguardar sus datos.

MySQL brinda un sistema de seguridad para proteger sus datos. Nadie puede
tener acceso a su base de datos sin una cuenta. Todas las cuentas MySQL tie
nen los siguientes atributos:

V Un nombre
v0 Un hostname: la mquina desde la cual puede la cuenta tener acceso al
/ servidor MySQL
' v0 Una contrasea

*" Un conjunto de permisos


96 Parte II: La base de datos MySQL

Para tener acceso a sus datos, una persona debe usar un nombre de cuenta
vlido y conocer la contrasea asociada con esa cuenta. Adems, esa per
sona debe conectarse desde un PC autorizada a conectarse con su base de
datos mediante esa cuenta especfica.

Despus de que al usuario se le otorga el acceso a la base de datos, lo que esa


persona haga con los datos depende de los permisos que se hayan establecido
para esa cuenta. A cada cuenta se le permite o se le prohbe realizar operaciones
en su base de datos, tales como SELECT , DELETE, INSERT, CREATE, DROP,
etc. Las configuraciones que especifican qu puede hacer una cuenta se llaman
privilegios o permisos. Puede configurar una cuenta con todos los permisos, sin
ningn permiso o con cualquier rango entre esos extremos. Por ejemplo, para
un catlogo en lnea de productos, a usted le conviene que los clientes puedan
ver la informacin en el catlogo pero que no puedan cambiarla.

Cuando un usuario intenta conectarse a MySQL y ejecutar una consulta,


MySQL controla el acceso a los datos en dos etapas:

1. Verificacin de la conexin: MySQL verifica la validez del nombre de la


cuenta y de la contrasea y verifica que la conexin provenga de un host
autorizado a conectarse al servidor MySQL usando la cuenta en
cuestin. Si todo est en orden, MySQL acepta la conexin.
2. Verificacin de la solicitud: Despus de que MySQL acepta la conexin,
verifica si la cuenta tiene los permisos necesarios para ejecutar la con
sulta especificada. Si es as, MySQL ejecuta la consulta.

Cualquier consulta enviada a MySQL puede fallar porque la conexin es rechazada


en el primer paso, o porque la consulta no es permitida en el segundo paso. En estos
casos aparecer un mensaje de error que ayuda a identificar la fuente del problema.

En las siguientes secciones describo ms detalladamente las cuentas y los


permisos.

Comprender (os nombres de


(as cuentas y tos hostnames
Juntos, el nombre de la cuenta y el hostname (el nombre del PC autorizado a
conectarse con la base de datos) identifican una cuenta nica. Pueden existir
dos cuentas con el mismo nombre de cuenta pero con hostnames diferentes,
y pueden tener contraseas y permisos diferentes. Sin embargo, no puede ha
ber dos cuentas con el mismo nombre y el mismo hostname.

El servidor MySQL aceptar conexiones de una cuenta MySQL slo cuando se


conecte desde el hostname. Cuando se prepara una consulta GRANT o REVO
KE (las describo ms adelante en este captulo), se identifica la cuenta
MySQL usando tanto el nombre de la cuenta como el hostname, en el siguien
te formato: nombrecuenta@hostname (por ejemplo, root@l ocal host).
Captulo 5: Cmo proteger los datos

El nombre de la cuenta MySQL no tiene ninguna relacin con el nombre de


usuario en Unix/Linux o Windows (tambin llamado a veces nombre de entra
da). Si est usando una cuenta MySQL administrativa llamada root, esta no
se relaciona con el nombre de entrada rot en Unix/Linux. Cambiar el nom
bre de entrada de MySQL no afecta de ninguna manera el nombre de entrada
de Unix/Linux o Windows, y viceversa.

Los hostnames y los nombres de las cuentas MySQL se definen como sigue:

Un nombre de cuenta puede tener hasta 16 caracteres de longitud.


: Puede usar caracteres especiales en los nombres de las cuentas, por
ejemplo espacios o un guiones 0 . Sin embargo, no puede usar comodi
nes en el nombre de la cuenta.

| u0 CJnnombre de cuenta puede estar en blanco. Si existe una cuenta en MySQL


| con el nombre en blanco, cualquier nombre de cuenta ser vlido para esa
| cuenta. Un usuario podra usar cualquier nombre de cuenta para conectarse
con su base de datos, esto si el usuario se conecta desde un hostname al que
se le permite conectarse a la cuenta con el nombre en blanco y si usa la contra-
S sea correcta, de ser necesaria. Puede usar una cuenta con el nombre en blan
co si quiere permitir que usuarios annimos se conecten con la base de datos.
t El hostname puede ser un nombre o una direccin IP. Por ejemplo,
puede ser un nombre como thor .mycompany . com , o una direccin 1P
(protocolo de Internet) como 192.163.2.33. La mquina en la cual est
| instalado el servidor MySQL es localhost.

|! v0 Pueden usarse comodines en el hostname. Puede usar el signo de por-


| centaje (%) como comodn; % funciona para cualquier hostname. Si agre-
| ga una cuenta para ge o rge@%, alguien que use el nombre de cuenta
s george puede conectarse al servidor MySQL desde cualquier PC.
u0 El hostname puede estar en blanco. Un hostname en blanco equivale a
? usar % para el hostname.

Es posible configurar una cuenta con el nombre de la cuenta en blanco y con el


hostname en blanco. Una cuenta tal permitira a cualquier persona conectarse
con el servidor MySQL usando cualquier nombre de cuenta desde cualquier PC.
Una cuenta con el nombre de cuenta en blanco y un signo de porcentaje (% ) en el
hostname funcionara del mismo modo. No es muy probable que quiera tener tal
tipo de cuenta. A veces esta cuenta se instala cuando se instala MySQL, pero en
esos casos no se le da ningn privilegio, de modo que no podr hacer nada.

*S0KM/ Cuando MySQL es instalado, automticamente instala una cuenta con todos
los privilegios: root@localhost. Esta cuenta se instala sin contrasea. Cual
quiera que est conectado al PC donde est instalado MySQL tiene acceso a
MySQL y puede hacer cualquier cosa con l usando el nombre de cuenta root.
(Obviamente, r oot es un nombre de cuenta muy conocido, as que esta cuenta
no es muy segura. Si usted es el administrador de MySQL, agrguele inmediata
mente una contrasea a esta cuenta).
Parte II: La base de datos MySQL

En algunos sistemas operativos se instalan automticamente otras cuentas, ade


ms de root@l ocal host. En Windows, por ejemplo, una cuenta llamada root@%
podra instalarse sin contrasea de proteccin. Esta cuenta root con todos los
privilegios puede ser usada por cualquier persona desde cualquier mquina. De
be eliminar esta cuenta inmediatamente, o al menos asignarle una contrasea.

Aprender ms sobre contraseas


A cada cuenta se le asigna una contrasea. Si a una cuenta no se le asigna nin
guna, la contrasea estar en blanco, y eso significa que no requerir de con
trasea para usarse. MySQL no impone lmites a la longitud de una contrasea,
pero a veces algn otro software en su sistema limitar la longitud a ocho ca
racteres. Si es as, los caracteres despus del octavo sern eliminados.

Como seguridad adicional, MySQL encripta las contraseas antes de almace


narlas. Eso significa que las contraseas no se almacenan en los caracteres
reconocibles en los cuales se digitaron. Esta medida de seguridad garantiza
que nadie pueda ver y conocer las contraseas almacenadas.

Desafortunadamente, algunas malas personas tratarn de tener acceso a sus da


tos adivinando cul es su contrasea. Usan un software que trata de conectarse
usando rpida y sucesivamente diferentes contraseas, una prctica llamada des
ciframiento (cracking). A continuacin presento algunas recomendaciones para
escoger una contrasea que sea tan difcil de descifrar como sea posible:

v0 Use de seis a ocho caracteres.


Incluya uno o ms de cada uno de los siguientes: letras en mayscula, le
tras en minscula, nmeros y signos de puntuacin.

v0 No use el nombre de su cuenta ni ninguna variacin del nombre de su cuenta.


u0 No incluye ninguna palabra que est en un diccionario.
. v0 No incluya un nombre.

v0 No use un nmero telefnico ni una fecha.

Una buena contrasea es difcil de adivinar, no incluye palabras de ningn dic


cionario (incluyendo diccionarios en otras lenguas) y es fcil de recordar. Si es
muy difcil de recordar tendra que escribirla, lo cual contradice el propsito
de usar una contrasea. Una manera de crear una buena contrasea es usar
los primeros caracteres de una de sus frases favoritas. Por ejemplo, podra
usar la frase "Todos para uno! Uno para todos!" para hacer esta contrasea:

iTpu!ipt!

Esta contrasea no incluye nmeros, pero puede arreglar eso usando el n


mero 4 en vez de la letra p. Entonces la contrasea sera:
Captulo 5: Cmo proteger los datos

T4u!U4t!

O podra usar el nmero 1 en vez de la letra u para representar la palabra


uno. Entonces la contrasea sera

T41!141!

Esta contrasea es definitivamente difcil de adivinar. Otra forma de incorpo


rar nmeros en su contrasea es sustituyendo 1 (uno) por 1(ele) o sustituir 0
(cero) por la letra o.

Echemos un Vistazo a los permisos


Los permisos de las cuentas los usa MySQL para especificar quin puede hacer
qu. Cualquier persona que use una cuenta vlida puede conectarse al servidor
MySQL, pero slo podr hacer las cosas aprobadas por los permisos asignados
a esa cuenta. Por ejemplo, es posible configurar una cuenta para que los usua
rios puedan seleccionar datos, pero no insertar ni actualizar datos.

Se puede asignar permisos a bases de datos, tablas o columnas especficas.


Por ejemplo, se puede configurar una cuenta que permita al usuario seleccio
nar datos de todas las tablas en la base de datos, pero que le permita insertar
datos slo en una tabla y actualizar datos slo en una columna de una tabla
en particular.

Los permisos se conceden usando la consulta GRANT y se deniegan usando la


consulta REVOKE. Las consultas GRANT o REVOKE deben enviarse usando una
cuenta que tenga permiso para ejecutar instrucciones GRANT o REVOKE en la
base de datos. Si trata de enviar una consulta GRANT o una consulta REVOKE
usando una cuenta que no tenga permiso para hacerlo, obtendr un mensaje
de error. Por ejemplo, si trata de conceder un permiso para usar un comando
de seleccin y enva la consulta usando una cuenta que no tiene permiso pa
ra conceder permisos, posiblemente ver el siguiente mensaje:

grant command denied

Los permisos se pueden otorgar y remover individualmente o todos a la vez.


La Tabla 5-1 enumera algunos de los permisos que puede asignar o revocar.

Tabla 5-1 Permisos para cuentas MySQL


Permiso Descripcin

ALL Todos los permisos

ALTER Puede alterar la estructura de las tablas


Parte II: La base de datos M ySQ L___________________

Permiso Descripcin (continuacin)

CREATE Puede cre a r bases de datos o tab la s nuevas

DELETE Puede borrar filas en las tab la s

DROP Puede borrar bases de datos o tablas

FILE Puede leer y escribir archivos en el servidor

GRANT Puede cam b iar los perm isos en una cuenta M ySQL

INSER Puede insertar filas nuevas en las tablas

SELECT Puede leer datos de las tablas

SHUTDOWN Puede ap ag ar el servidor M ySQ L

UPDATE Puede cam b iar datos en una tabla

USAGE No tiene ningn perm iso

$m ,
Otorgar ALL no es una buena idea porque incluye permisos para operaciones
administrativas, tales como apagar el servidor MySQL. No es probable que
quiera que cualquiera adems de usted tenga tales privilegios.

Cmo configurar cuentas MySOL


Al crear una cuenta nueva se especifica la contrasea, el nombre de los PCs
que pueden tener acceso a la base de datos usando esta cuenta, y los permi
sos; pero en cualquier momento puede cambiar estas configuraciones. Toda la
informacin de la cuenta se almacena en una base de datos llamada my s q 1,
creada automticamente al instalar MySQL. Para agregar una cuenta nueva o
cambiar informacin sobre cualquier cuenta, debe usar una cuenta que tenga
los permisos apropiados en la base de datos my s q 1.

Necesita por lo menos una cuenta para tener acceso al servidor MySQL. Cuando
se instala, MySQL automticamente configura algunas cuentas, incluyendo una
cuenta con todos los permisos, llamada root. Si tiene acceso a MySQL por me
dio del sitio web de su compaa o de una compaa de hospedaje de sitios web,
el administrador MySQL de la compaa debe darle la cuenta; la cuenta proba
blemente no se llamar root y es posible que no tenga todos los permisos.

En lo que resta de esta seccin, describo cm o agregar y borrar cuentas y c


mo cambiar las contraseas y los permisos de las cuentas. Si recibi su cuenta
del departamento T I de su compaa o de la compaa de hospedaje de sitios
Captulo 5: Cmo proteger los datos
AC/V/c
^SPEC>

La base de datos de seguridad de MySQL


Cuando es instalado, MySQL autom ticam ente INSERT, designer puede insertar datos en to
crea una base de datos llamada mysql. Toda la das las bases de datos. Si una fila en la tabla
informacin usada para proteger sus datos se db muestra N bajo INSERT para la cuenta de
guarda en esta base de datos, incluyendo los signer en la base de datos CatlogodeMas-
nombres de las cuentas, los hostnames, las cotas, la tabla user anula ese valor y
contraseas y los permisos. designer podr insertar datos en la base de
datos CatalogodeMascotas.
Los permisos stim a cenan en columnas. El forma
to de cada nombre de columna es pe rmi ssi on- v ' Tabla h o s t : Esta tabla controla el a cc e
_pri v, donde permission es cualquiera de los so a una base de datos dependiendo del
permisos mostrados en la Tabla 5-1. Por ejemplo, la host. La tabla host opera con la tabla db. Si
columna que contiene los permisos ALTER se lla una fila en la tabla db tiene el cam po host
ma al ter_pri v. El valor en cada columna de vaco, MySQL verifica la tabla host para ver
permiso es Y o N, lo cual significa s (yes) o no. De si la tabla db tiene ah una fila. De esta m a
este modo, por ejemplo en la tabla de usuarios nera, usted puede permitir el acceso a db
(descrita en la lista siguiente), habra una fila para desde algunos hosts pero no de otros. Por
una cuenta y una columna para a 11 e r_p r i v. Si ejemplo, suponga que tiene dos bases de
el campo de una cuenta bajo a lte r_p r i v con datos: dbl y db2. La base de datos dbl tie
tiene Y, la cuenta se puede usar para ejecutar con ne informacin muy delicada, y quiere que
sultas ALTER. S alter_pri v contiene N, la slo ciertas personas la vean. La base de
cuenta no tiene permiso para ejecutar consultas datos db2 tiene informacin que quiere que
ALTER. todos vean. Si tiene una fila en la tabla db
para dbl con el campo host en blanco, pue
La base de datos mysql guarda permisos en las
de tener dos filas para dbl en la tabla host.
cinco tablas siguientes:
Una fila puede concedertodos los permisos
^ T a b la user: Esta tabla alm acena los per a los usuarios que se conecten desde un
misos que aplican a todas las bases de da host especfico, mientras que la otra fila
tos y todas las tablas. Contiene una fila para puede denegarles privilegios a los usuarios
cada cuenta vlida con el nombre del usua que se conecten desde cualquier otro host.
rio, el hostname y la contrasea. El servidor
u* Tabla t a b l e s _ p r i v : Esta tabla alm ace
M ySL rechazar cualquier conexin pro
na permisos aplicados a tablas especficas.
veniente de una cuenta que no exista en es
ta tabla u* Tabla col umns_pri v : Esta tabla alm a
cena permisos aplicados a columnas espe
T a b la db: Esta tabla almacena permisos
cficas.
que aplican a una base de datos en particu
lar. Contiene una fila para la base de datos, Usted puede ver y cam biar las tablas d ire cta
que da permisos a un nombre de cuenta y mente en mysql si est usando una cuenta con
hostname. La cuenta debe existir en la tabla los permisos necesarios. Puede usar consultas
user para que se le pueda conceder permi SQL tales como SELECT, INSERT, UPDATE y
sos. Los permisos concedidos en la tabla otras. Si tiene acceso a MySQL por medio de
user anulan los permisos asignados en esta empleador, un cliente o una compaa de hos
tabla. Por ejemplo, si la tabla user tiene una pedaje de sitios web, es poco probable que le
fila para la cuenta designer con privilegios den una cuenta con los permisos necesarios.
102 Parte II: La base de datos MySQL

web, podra recibir un error cuando trate de enviar alguna de las consultas
GRANT o REVOKE antes descritas. Si su cuenta tiene restricciones para ejecu
tar alguna de las consultas que necesite hacer, debe solicitar una cuenta con
ms permisos o pedirle al administrador MySQL que agregue una cuenta nue
va o que haga los cambios que usted requiera.

Identificar (as cuentas existentes


Para averiguar cules cuentas existen para su base de datos, necesita una
cuenta que tenga los permisos necesarios. Trate de ejecutar la siguiente con
sulta en la base de datos llamada mysql :

SELECT * FROM user

Debiera obtener una lista de todas las cuentas. Sin embargo, si tiene acceso a
MySQL por medio de su compaa o de una compaa de hospedaje de sitios
web, probablemente usted no tiene los permisos necesarios. En ese caso,
probablemente recibir un mensaje de error como este:

No Database Selected

Este mensaje significa que su cuenta no tiene permiso para seleccionar la base de
datos my sq 1.0 quiz recibir un mensaje de error que diga que no tiene permiso
para usar SELECT. Aunque este mensaje es molesto, en algn sentido es bueno,
pues muestra que la compaa tiene buenas medidas de seguridad. No obstante,
en otro sentido es malo pues usted no podr ver cules privilegios tiene su cuen
ta. Deber preguntarle al administrador de MySQL o averiguarlo usted mismo in
tentando consultas diferentes y viendo si se le permite ejecutarlas o no.

Cmo agregar cuentas


nueas g cambiar permisos
La forma preferida para tener acceso a MySQL desde PHP es configurando una
cuenta especficamente para este propsito, slo con los permisos imprescindi
bles. En esta seccin, describo cmo agregar cuentas nuevas y cmo cambiar
permisos. Si su cuenta se la dio el departamento TI de su compaa o una compa
a de hospedaje de sitios web, tal vez no tenga los permisos necesarios para
crear una cuenta nueva. Si no los tiene, no podr agregar una cuenta ejecutando
la consulta G RA N T, y tendr que solicitar una segunda cuenta para usarla con PHP.

Si necesita solicitar una segunda cuenta, obtenga una cuenta con permiso
restringido (si es posible), pues su aplicacin web ser ms segura si la cuen
ta usada en sus programas PHP no tiene ms privilegios de los necesarios.
Captulo 5: Cmo proteger los datos

La consulta GRANT se usa para configurar cuentas nuevas, para cambiar con
traseas o para agregar permisos a cuentas ya existentes. Si la cuenta ya exis
te, la consulta GRANT cambia la contrasea o agrega permisos. Si la cuenta
an no existe, la consulta GRANT agrega una cuenta nueva.

Este es el formato generai para una consulta GRANT:

GRANT p er mi so (columnas) ON nombretabla


TO nombrecuenta@hostname IDENTIFIED BY 'clave'

Puede usar esta consulta GRANT para crear una cuenta nueva o para cambiar
una cuenta existente. Debe llenar la informacin siguiente:

; v* p er mi so ( c o l u m n a s ) : Debe indicar por lo menos un permiso. Puede li


mitar cada permiso a una o ms columnas indicando el nombre de la co
lumna en parntesis despus del permiso. Si no aparece el nombre de la
columna, el permiso se concede a todas las columnas en la(s) tabla(s).
Puede indicar tantos permisos/columnas como necesite, separados por
comas. Los permisos posibles se indican en la Tabla 5-1. Por ejemplo,
una consulta GRANT podra empezar as:
| GRANT select (Apel1 ido, No mb re ), update,
insert (fechanacimiento) ...

A i00 nombretabl a : Indica sobre cul(es) tabla(s) se concede el permiso. Se


* requiere por lo menos de una tabla. Puede indicar varias tablas, sepa
ra rndolas por comas. Los valores posibles para nombretabl a son

. nombretabl a : Toda la tabla llamada nombretabl a en la base de datos


actual. Puede usar un asterisco (* ) para indicar todas las tablas en la ba
se de datos actual. Si usa un asterisco y no selecciona una base de datos,
el privilegio se conceder a todas las tablas en todas las bases de datos.
nombrebasedatos .nombre . t abl a : Toda la tabla llamada nombreta
bl aen nombrebasedatos. Si desea indicar todas, puede usar un asteris
co (* ) Para e* nombre de la base de datos o el nombre de la tabla. Usar
'*. * concede el permiso a todas las tablas en todas las bases de datos.

t i00 nombrecuenta@hostname : Si la cuenta ya existe, recibe los permisos


indicados. Si la cuenta no existe, se aade. La cuenta se identifica con el
" nombrecuenta y hostname com o pareja. Si una cuenta existe con el
nombre de cuenta especificado pero un hostname diferente, la cuenta
existente no se cambia, sino que se crea una nueva.

i00 e l ave: Es la contrasea que agrega o cambia. No es obligatorio usar


- una contrasea. Si no quiere agregar ni cambiar una contrasea para es
ta cuenta, no incluya la frase IDENTI FI ED BY ' c l a v e ' .

La consulta GRANT para agregar una nueva cuenta para usar en los programas
PHP para la base de datos Cata! ogodeMascotas podra ser

GRANT select ON CatalogodeMascotas.* TO phpuser@localhost


IDENTIFIED BY A 4 1!1 4 a !'
Parte II: La base de datos M ySQ L__________________________________

Cmo agregar g cambiar contraseas


Puede agregar o cambiar contraseas usando la consulta GRANT. Puede in
cluir como requisito una contrasea cuando agrega una cuenta nueva, tal co
mo describ en la seccin anterior. Si una cuenta ya existe, puede cambiar su
contrasea usando la siguiente consulta GRANT:

GRANT permiso ON * TO nombrecuenta@hostname


IDENTIFIED BY 'clave'

Debe llenar la informacin siguiente:

v0 p e r r r i s o : Debe indicar por lo menos un permiso en una consulta GRANT.


Si el permiso ya ha sido concedido, no cambia.

nombrecuenta@hostname : Si la cuenta ya existe, recibe el permiso y la


contrasea indicados. Si la cuenta no existe, la cuenta se agrega. La
cuenta se identifica con el nombrecuenta y el hostame como pareja.
Si una cuenta existe con el nombre de cuenta especificado pero con un
hostname diferente, la cuenta no cambia, sino que se crea una nueva.
e l a v e : La contrasea en la consulta GRANT reemplaza la contrasea
existente. Si suministra una contrasea vaca usando
IDENTIFIED BY '

la contrasea existente se reemplaza con un blanco, dejando la cuenta


sin contrasea. Consulte la seccin "Aprender ms sobre contraseas",
anteriormente en este captulo, para leer algunos consejos sobre cmo
I escoger una buena contrasea.

Eliminar permisos
Para revocar permisos use la consulta R E V O K E . El formato general es

REVOKE pe rmi so ( columnas) ON nombretabla


FROM nombrecuenta@hostname

Debe llenar la informacin siguiente:

per mi so ( co l umna s ) : Debe indicar por lo menos un permiso. Puede re


vocar cada permiso de una o ms columnas indicando el nombre de la co-
lumna entre parntesis despus del permiso. Si no se indica el nombre de
la columna, el permiso se revocar de todas las columnas en la(s) ta-
I bla(s). Puede indicar tantos permisos/columnas como necesite, separn-
| dolos por comas. Los permisos posibles se enumeran en la Tabla 5-1. Por
I ejemplo, una consulta REVOKE podra empezar as:
I REVOKE select (Nombre,Apellido), pdate, nsert (fechaacimiento) ...
Captulo 5: Cmo proteger los datos

v0 nombretab 1a : Indica a cules tablas se les est revocando el permiso,


r Se debe indicar al menos una tabla. Puede enumerar varias tablas, sepa
rndolas por comas. Los valores posibles para nombretabl a son

nombretabl a : Toda la tabla llamada nombretabl a en la basededa-


tos actual. Puede usar un asterisco (* ) para indicar todas las tablas. Si
usa un asterisco cuando no ha seleccionado la base de datos actual, el
privilegio se revocar de todas las tablas en todas las bases de datos.

| nombrebasedatos . nombret abla: Toda la tabla llamada nom


bretabla en nombrebasedatos. Si desea indicar todas, puede
usar un asterisco ( * ) para el nombre de la base de datos o para el
nombre de la tabla. Usar *.* revoca el permiso en todas las tablas
en todas las bases de datos.

' v0 nombrecuenta@hostname : La cuenta se identifica con el nombrecuen -


ta y el hostname com o pareja. Si una cuenta existe con el nombre de
cuenta especificado pero un hostname diferente, la consulta RE VOKE fa
llar y usted recibir un mensaje de error.

Eliminar cuentas
Generalmente no es necesario eliminar una cuenta. Si cre una cuenta con
permisos que no desea que tenga, slo cambie los permisos. Si no quiere
usar una cuenta elimine todos los permisos, de modo que con esa cuenta no
se pueda hacer nada. Para eliminar todos los permisos de una cuenta, use
una consulta RE VOKE con la siguiente sintaxis:

REVOKE a 11 ON *.* FROM nombrecuenta@hostname

Para realmente poder eliminar una cuenta, necesita una cuenta con los permi
sos necesarios en la base de datos my s q 1. Necesita usar una consulta D E L ET E
en la tabla del usuario en la base de datos mysq l. Si desea ms informacin so
bre la estructura de la base de datos de seguridad mysql, consulte el recuadro
"La base de datos de seguridad de MySQL", unas pginas atrs en este captu
lo. Tenga cuidado al usar una consulta D E L ET E, pues con el formato incorrecto
podra eliminar la cuenta equivocada o incluso todas las cuentas. Lea los co
mentarios sobre el comando D E L ET E al final del Captulo 4.

Respaldar sus datos


Usted debe tener por lo menos una copia de su valiosa base de datos. Los de
sastres no son frecuentes, pero s ocurren. El PC donde est almacenada su
base de datos puede fallar y perder sus datos, el archivo puede corromperse,
el edificio puede quemarse, etctera. Las copias de respaldo de su base de
datos previenen la prdida de datos en tales desastres.
106 Parte II: La base de datos MySQL

Al menos debe tener una copia de respaldo de su base de datos, almacenada


en un lugar aparte, y no en el mismo lugar en el que est la copia que est usan
do actualmente. Tener ms de una copia tal vez unas tres es generalmen
te una buena idea.

: v0 Almacene una copia en una ubicacin fcilmente accesible, incluso po


dra ser en el mismo PC, para reemplazar rpidamente una base de da-
?; tos en uso que se haya daado.
I v0 Almacene una segunda copia en otro PC; le ser til en caso de que el PC
falle y la primera copia de respaldo no est disponible.
|i v0 Almacene una tercera copia en un lugar fsico completamente diferente,
pues existe la remota posibilidad de que el edificio verdaderamente se
queme. Esta tercera copia no ser necesaria si la segunda copia de res
paldo se almacena va red en un PC ubicado en otro lugar fsico.

Si no tiene acceso a un PC fuera del sitio donde pueda respaldar su base


de datos, copie su respaldo en un medio porttil, tal com o una cinta o
un CD y gurdelo fuera del sitio. Ciertas compaas almacenarn sus res
paldos en sus oficinas a cambio de una mensualidad, o simplemente
puede poner el respaldo en su bolsillo y llevrselo a casa.

Si usa MySQL en el PC de otra persona, tal como el PC de su jefe o de una compa


a de hospedaje de sitios web, las personas que le proporcionan acceso son res
ponsables de los respaldos. Deben contar con procedimientos automticos para
hacer respaldos de su base de datos. Cuando evala compaas de hospedaje de
sitios web, una buena pregunta que no debe olvidar hacer es cules son sus pro
cedimientos de respaldo. Lo que le interesa saber es con cunta frecuencia hacen
copias de respaldo y dnde las guardan. Si cree que sus datos no estn seguros,
solicite que se hagan cambios o adiciones a los procedimientos de respaldo.

Si es el administrador de MySQL, usted es el responsable de hacer los respal


dos. MySQL brinda un programa llamado mysql dump que puede usar para ha
cer las copias de respaldo; mysql dump crea un archivo de texto con todas las
instrucciones SQL necesarias para recrear toda su base de datos. El archivo
contiendas instrucciones CREATE para cada tabla y las instrucciones INSERT
para cada fila de datos en las tablas. Puede restaurar su base de datos ejecu
tando el conjunto de instrucciones MySQL. Puede restaurarla en su ubicacin
actual o, de ser necesario, puede restaurarla en otro PC.

Siga estos pasos para hacer una copia de respaldo de su base de datos en Li
nux/Unix/Mac:

1. Cmbiese al subdirectorio bin en el directorio donde est instalado MySQL.

Por ejemplo, digite cd /usr/local/mysql/bin.

2. Digite lo siguiente:
mysqldump -~user=nombrecuenta --password=c/aye
nombrebascdtos >ruta/nombrearchi vorcspa Icio
Captulo 5: Cmo proteger los datos

donde

nombrecuenta es el nombre de la cuenta MySQL que est usando


para respaldar la base de datos.

c l a v e es la contrasea de la cuenta.

nombrebasedatos es el nombre de la base de datos que desea


respaldar.

r ut a/ no mb rea rc hi vor espal do es la ruta al directorio donde de


sea almacenar los respaldos y el nombre del archivo en el que se
almacenar el resultado SQL.

La cuenta que use tiene que tener permiso para seleccionar. Si la cuenta no re
quiere de una contrasea, puede dejar de lado toda la opcin de contrasea.

Puede digitar el comando en una lnea, sin presionar Enter. O puede digitar una
barra inversa (\), presionar Enter y luego continuar el comando en otra lnea.

Por ejemplo, para respaldar la base de datos Cata 1 ogodeMascotas, el


comando podra ser
mysqldump --user=root --password=bigsecret
Ca ta logodeMascotas \
>/usr/l ocal/mysql/backups/RespaldoCatalogodeMascotas
N o t a : La cuenta Linux/Unix con la que est registrado tiene que tener
permiso para guardar archivos en el directorio de respaldo.

Para hacer una copia de respaldo de su base de datos en Windows, siga estos
pasos:

1. Abra una ventana de comando.

Por ejemplo, escoja StartC>ProgramsOMS-DOS.

2. Cmbiese al subdirectorio bin en el directorio donde est instalado


MySQL.
Por ejemplo, digite cd c:\mysql\bin.

3. Digite lo siguiente:
mysqldump.exe --user=nomb:r ecuenta --password=contrasea
nombrebasedatos > r u t a \nombrearchivorespaIdo

donde
nombrecuenta es el nombre de la cuenta MySQL que est usando
para respaldar la base de datos.
contrasea es la contrasea de la cuenta.

nombrebasedatos es el nombre de la base de datos que desea respaldar.


ruta\nombrearchi v or esp lad o es la ruta al directorio donde de
sea almacenar los respaldos y el nombre del archivo en que se al
macenar el resultado SQL.
Parte II: La base de datos MySQL

La cuenta que use necesita tener permiso para seleccionar. Si la cuenta


no requiere de una contrasea, puede dejar de lado toda la opcin de
contrasea.

Debe digitar el comando mysql dump en una sola lnea sin oprimir Enter.

Por ejemplo, para respaldar la base de datos Catal ogodeMascotas, el


comando podra ser
mysqldump.exe --user=root CatalogodeMascotas
> RespaldoCatalogodeMascotas

Los respaldos deben hacerse en un horario predeterminado, por lo menos


una vez al da. Si su base de datos cambia frecuentemente, sera mejor respal
darla ms a menudo. Por ejemplo, podra ser conveniente respaldar el direc
torio de respaldos cada hora y respaldar todo en otro PC una vez al da.

Restaurar sus datos


En algn punto una de las tablas de su base de datos podra daarse y dejar
de funcionar. Es inusual, pero sucede. Un problema de hardware, por ejem
plo, o que el PC se apague inesperadamente, puede causar que las tablas se
corrompan. Algunas veces una anomala en los datos que confunda a MySQL
puede corromper las tablas. En algunos casos, una tabla corrompida puede
hacer que su servidor MySQL deje de funcionar.

Este es un tpico mensaje de error que indica que una tabla se ha corrompido:

ncorrect key file for table: 'n o m b re t ab la '.

En algunos casos es posible reparar la(s) tabla(s) de datos corrompidas usando


un utilitario de reparacin incluido con MySQL. Si el utilitario de reparacin no
logra restaurar la(s) tabla(s) corrompida(s) a su funcionamiento normal, no to
do est perdido; tambin puede reemplazar la(s) tabla(s) corrompidas con los
datos almacenados en una copia de respaldo. En algunos casos la base de datos
se podra perder completamente. Por ejemplo, si el PC donde reside su base de
datos deja de funcionar y no se puede arreglar, su base de datos actual se perde
r, pero sus datos no se perdern para siempre; puede reemplazar el PC daado
con un PC nuevo y restaurar su base de datos con la copia de respaldo.

Cmo reparar tablas


A menudo es posible arreglar una base de datos daada. MySQL provee un utilitario
llamado my i s ame h k para reparar tablas. Si est usando MySQL en el PC de su em
pleador o en el de su cliente, o a travs de una compaa de hospedaje de sitios web,
debe contactar al administrador de MySQL para que corra my i s ame h k por usted.
Captulo 5: Cmo proteger los datos

Si usted es el administrador de MySQL, puede correr myi samchk usted mis


mo. Para usar myi samchk en Linux/Unix/Mac, siga estos pasos:

1. Cmbiese al subdirectorio bin en el directorio donde est instalado MySQL.


Por ejemplo, digite cd /usr/local/mysql/bin.

2. Detenga el servidor MySQL digitando esta consulta:


mysqladmin -u nombrecuenta -p shutdown
donde -u nombrecuenta especifica el nombre de la cuenta que usar
para conectarse a MySQL.
La cuenta debe tener permiso para apagar. Si la cuenta no requiere de una
contrasea, deje de lado - p. Si incluye p, se le pedir su contrasea.
3. Digite lo siguiente:
myisamchk -r ruta/nombrebasedatos/nombretabla.MYI

Incluya la ruta com pleta a su directorio de datos, seguida por el nombre


de la base de datos, el nombre de la tabla y .MYI. Puede usar un asteris
co ( * ) como comodn. Por ejemplo, para reparar todas las tablas en la
base de datos Catal ogodeMascotas , podra digitar
myisamchk - r . ./data/CatalogodeMascotas/*.MYI

La opcin -r es la opcin para recuperar. Despus de digitar la instruccin


ver como resultado, en la pantalla, cules tablas se estn revisando.

4. Arranque el servidor MySQL digitando lo siguiente:


mysqladmin -u nombrecuenta -p start

Para usar myi samchk en Windows, siga estos pasos:

1. Abra una ventana de comando.


Por ejemplo, escoja StartOProgramsOMS-DOS.
2. Cmbiese al subdirectorio bin en el directorio donde est instalado MySQL.

Por ejemplo, digite cd c:\mysql\bin.

3. Detenga el servidor MySQL digitando


mysqladmin -u nombrecuenta -p shutdown

donde nombrecuenta es el nombre de una cuenta con permiso para apa


gar. Si la cuenta no requiere de una contrasea, deje por fuera -p. Si in
cluye -p se le pedir su contrasea.

4. Digite lo siguiente:
myisamchk -r ruta/nombrebasedatos/nombretabla.MYI

Incluya la ruta completa a su directorio de datos, seguida del nombre de la


base de datos, el nombre de la tabla y .MY I. Puede usar un asterisco (* ) como
comodn. La opcin -r es la opcin para recuperar. Por ejemplo, para reparar
todas las tablas en la base de datos CatalogodeMascotas, pod ra digitar
Parte (I: La base de datos MySQL

myisamchk -r..\data\CatalogodeMascotas\*.MYI

Despus de digitar esta instruccin ver como resultado, en la pantalla,


cules tablas se estn revisando. Espere a que my i samchk termine.

5. Arranque su servidor MySQL digitando lo siguiente;


mysqladmin -u nombrecuenta -p start
Si despus de correr este comando su tabla todava no funciona, pruebe
a correr el utilitario myisamchk nuevamente usando la opcin -o en lu
gar de la opcin -r. La opcin -o es un proceso de reparacin ms anti
guo y mucho ms lento que la opcin -r, pero maneja algunos casos que
la opcin -r no puede manejar.

Cmo restaurar de una copia de respaldo


Si despus de reparar sus datos no se reactiva el funcionamiento normal de su ba
se de datos, o si su base de datos no est disponible del todo, como en el caso de
un fallo del PC, puede reemplazar la(s) tabla(s) de su base de datos actual con la
base de datos almacenada en la copia de respaldo. La copia de respaldo contiene
una "fotografa" de los datos tal como estaban en el momento en que se hizo la co
pia. Los cambios hechos a la base de datos desde que se hizo la copia de respaldo
no estarn incluidos; usted deber recrear esos cambios manualmente.

De nuevo, si su acceso a MySQL es por medio del departamento TI o de una


compaa de hospedaje de sitios web, debe pedir al administrador de MySQL
que restaure su base de datos con la copia de respaldo. Si usted es el admi
nistrador de MySQL puede restaurarla usted mismo.

Tal como describ en el Captulo 4, se construye una base de datos creando la


base de datos y luego agregndole tablas. El respaldo que usted crea con el
utilitario mysql dump es un archivo que contiene todas las instrucciones SQL
necesarias para reconstruir todas las tablas, pero no contiene las instruccio
nes necesarias para crear la base de datos.

Quiz su base de datos no exista del todo, o quiz exista con una o ms ta
blas daadas. Puede restaurar toda la base de datos o una tabla individual.
Siga estos pasos para restaurar una sola tabla:

1. Si la tabla existe, borre la tabla con la siguiente consulta SQL:


DROP TABLE nombretabla

donde nombretabla es la tabla que desea borrar.

2. Dirija su explorador hacia mysql_send.php.

Consulte en el Captulo 4 una descripcin de my s q 1_s e nd.p h p .


Captulo 5: Cmo proteger los datos

3. Copie la consulta CREATE para la tabla desde el archivo de respaldo


al formulario en la ventana del explorador.

Por ejemplo, escoja Editd>Copy y EditOPaste.

4. Digite el nombre de la base de datos en la cual est restaurando la tabla.

El formulario muestra dnde debe digitar el nombre de la base de datos.

5. Haga clic en Submit.


Una nueva pgina web muestra los resultados de la consulta.

6. Haga clic en New Query.


7. Copie una consulta INSERT para la tabla desde el archivo de respaldo
al formulario en la ventana del explorador.

Por ejemplo, escoja EditOCopy y EditOPaste.

8. Digite el nombre de la base de datos en la cual est restaurando la tabla.

El formulario muestra dnde debe digitar el nombre de la base de datos.

9. Haga clic en Submit.


Una nueva pgina web muestra los resultados de la consulta.

10. Haga clic en New Query.

11. Repita los Pasos 7 10 hasta que todas las consultas INSERT del ar
chivo de respaldo hayan sido enviadas.

Si sus consultas INSER para la tabla son tantas que si se enviaran una a una no se
terminara nunca o si simplemente hay demasiadas tablas puede enviar to
das las consultas en el archivo de respaldo de una sola vez siguiendo estos pasos:

1. Si alguna de las tablas en el archivo de respaldo existe, brrela con la


siguiente consulta SQL:
DROP TABLE nombretabla
donde nombretabl a es la tabla que desea borrar.

2. Cmbiese al subdirectorio bin en el directorio donde est instalado MySQL

En Linux/Unix/Mac:
Digite el comando cd para cambiar al directorio correcto (por
ejemplo, digite cd /usr/local/mysql/bin).

En Windows:
a. Abra una venta de comando.

Por ejemplo, escoja StartC Programs't Accessories'vCommand Prompt.

b. Digite un comando cd para cambiarse al directorio correcto (por


ejemplo, digite cd c:\mysql\bin).

3. Digite el comando que enva las consultas SQL en el archivo de respaldo.


Parte II: La base de datos MySQL

En Linux/Unix/Mac:
Digite
mysql -u n ombr ecuent a -p nombrebasedat os < r u t a / n o m b r e a r c h i v o r e s p a l d o

donde nombrecuenta es una cuenta con permiso para crear. Si la


cuenta no requiere de contrasea, deje por fuera la -p. Si usa la-p se le
pedir su contrasea, nombrebasedatos es la base de datos existente
en la cual quiere crear todas las tablas. Use la ruta y el nombre del ar
chivo completos para el archivo de respaldo. Por ejemplo, un coman
do para restaurar la base de datos CatalogodeMascotas podra ser
mysql - u r o o t -p C a t a l o g o de M a sc ot as < / u s r / a r c h i v o s r s p a l d o / C a t a l o g o d e -
Mascotas.bak

En Windows:
Digite
mysql -u n ombr ecuent a -p nombrebasedat os < r u t a \ n o m b r e r e s p a l d o

donde nombrecuenta es una cuenta con permiso para crear. Si la


cuenta no requiere de contrasea, deje por fuera la -p. Si usa la -p se le
pedir la contrasea, nombrebasedatos es la base de datos existente
donde desea construir todas las tablas. Use la ruta y el nombre del ar
chivo completos para el archivo de respaldo. Por ejemplo, un coman
do para restaurar la base de datos CatalogodeMascotas podra ser
mysql -u r o o t - p Cat al ogodeMascotas < c : \ m y s q l \ b a k \ C a t a l o g o d e M a s c o t a s . b a k

Las tablas podran tardar un poco en restaurarse. Espere que el coman


do termine. Si ocurre algn problema aparecer un mensaje de error. Si
no hay problemas no ver ningn mensaje. Cuando el comando termina,
aparece la lnea de comando.

Para restaurar slo tablas seleccionadas del archivo de respaldo, prepare un


archivo que contenga nicamente las consultas para las tablas seleccionadas
que desea restaurar. Luego siga los Pasos 1 3 de la lista anterior. En el paso
3 digite el nombre de la ruta o el nombre del archivo con el subconjunto de
consultas que desea en sustitucin de todo el archivo de respaldo.

Si la base de datos no existe del todo, debe crearla antes de usar las consul
tas en el archivo de respaldo para reconstruir todas las tablas. Para restaurar
la base de datos cuando no hay queda nada de ella, use los pasos siguientes:

1. Agregue las siguientes dos lneas a la parte superior del archivo de


respaldo:
CREATE DATABASE nombrebasedatos;
use nombrebasedatos;
Captulo 5: Cmo proteger los datos

donde nombrebasedatos es el nombre de la base de datos que desea


restaurar. Por ejemplo, los comandos para la base de datos Catal o g o
deMascotas son

CREATE DATABASE Ca ta lo go de Ma s co t as ;
use Ca ta lo g od e Ma sc o ta s;

Nota: Asegrese de aadir un punto y coma (;) al final de cada lnea.


2. Cmbiese al subdirectorio bin en el directorio donde est instalado MySQL.
En Linux/Unix/Mac:
Digite un comando cd para cambiarse al directorio correcto (por
ejemplo, digite cd /usr/local/mysql/bin).
En Windows:
a. Abra una ventana de comando.

Por ejemplo, escoja StartOProgramsOAccessoriesOCommand Prompt.

b. Digite un comando cd para cambiarse al directorio correcto (por


ejemplo, digite cd c:\mysql\bin).

3. Digite el comando que enva las consultas SQL en el archivo de respaldo.


En Linux/Unix/Mac:
Digite esto:
mysql -u nombrecuenta -p < ruta/nombrearchivorespaldo

donde nombrecuenta es una cuenta con permiso para crear. Si la


cuenta no requiere de una contrasea, deje por fuera la -p. Si usa la
-p se le pedir la contrasea. Use la ruta y el nombre del archivo
completos para el archivo de respaldo. Por ejemplo, un comando
para restaurar la base de datos podra ser
mysql -u root -p < /usr/archivosrespaldo/CatalogodeMascotas.bak

En Windows:
Digite esto:
mysql -u nombrecuenta -p < ruta\nombrearchi ve respaldo

donde nombrecuenta es una cuenta con permiso para crear. Si la


cuenta no requiere de contrasea, deje por fuera la -p. Si usa la -p
se le pedir la contrasea. Use la ruta y el nombre del archivo com
pletos para el archivo de respaldo. Por ejemplo, un comando para
restaurar la base de datos Catal ogodeMascotas podra ser
mysql -u root -p < c:\mysql\bak\CatalogodeMascotas.bak
Parte II: La base de datos MySQL

Las tablas podran tardar un poco en restaurarse. Espere que el coman


do termine. Si ocurre algn problema aparecer un mensaje de error. Si
no hay problemas no ver ningn mensaje. Cuando el comando haya ter
minado, aparecer la lnea de comando.

Si ha seguido estos pasos, su base de datos estar restaurada con todos los
datos que contena en el momento en que se hizo la copia de respaldo. Si los
datos cambiaron despus de que se hizo la copia, los cambios se habrn per
dido. Por ejemplo, si se agregaron ms datos despus de que se hizo la copia
de respaldo, los datos nuevos no pueden restaurarse. Si sabe cules cambios
se hicieron, inclyalos manualmente en la base de datos restaurada.
Parte III
PHP
La 5 a Ola Por Rich Tennant

Su .base de das ya no se puede reparar, pero anfes de


darle nuestra recomendacin de respaldo, djeme hacerle
una pregunta. Cunas fichas cree gue cabran en las
paredes de su sala de cmputo?
En esta pa rte.. .
n esta parte, aprender cmo usar PHP para su apli

f cacin con base de datos para la Web. Estos son algu


nos de los temas que se describen:

* Cmo agregar PHP a archivos HTML

u* Las caractersticas de PHP que son tiles para cons


truir una aplicacin con base de datos para la Web
is* Cmo usar las caractersticas de PHP
| v* Cmo usar formularios para recopilar informacin
de los usuarios

1 v* Cmo mostrar informacin de una base de datos


en una pgina web

v* Cmo almacenar datos en una base de datos


I v* Cmo mover informacin de una pgina web a otra

Aprender todo lo que necesita saber para escribir los


programas PHP que usted necesita.
Captulo 6

PHP General
En este captulo
Agregar secciones PHP a los archivos HTML
Escribir enunciados PHP
Usar variables PHP
p- Comparar valores en las variables PHP
Documentar sus programas

m os programas son la parte de aplicacin de su aplicacin con base de da-


h m tos para la Web. Los programas realizan las tareas. Crean y muestran las
pginas web, aceptan y procesan la informacin que envan los usuarios, al
macenan la informacin en la base de datos, extraen la informacin de la ba
se de datos y llevan a cabo todas las dems tareas necesarias.

PHP, el lenguaje que usted usa para escribir sus programas, es un lenguaje de
scripting diseado especficamente para usarse en la Web. Es su herramienta
para crear pginas web dinmicas. Tiene caractersticas diseadas para ayu
darle a programar las tareas que necesitan las aplicaciones web dinmicas.

En este captulo, describo las reglas generales para escribir programas PHP, re
glas que aplican a todos los enunciados PHP. Piense en estas reglas como las re
glas generales de gramtica y puntuacin. En los captulos restantes de la Parte
III, usted aprender sobre caractersticas y enunciados especficos de PHP y so
bre cmo escribir programas PHP para cumplir con tareas especficas.

Agregar una seccin PHP


a una pgina HTML
PHP es un socio de HTML (Lenguaje de Marcado de Hipertexto: HyperText Mar-
kup Language, en ingls) que expande sus capacidades. Le permite a un programa
HTML hacer cosas que no puede hacer por s mismo. Por ejemplo, los programas
en HTML pueden mostrar pginas web, y el HTML tiene caractersticas que le per
miten a usted formatear dichas pginas web. El HTML tambin le da la posibilidad
Cmo el servidor web procesa archivos PHP
C uando un explorador es conducido h acia un a r 2. El servid o r w e b contina en m odo H TM L
chivo H T M L re g u la r con una e x te n s i n . html h asta to p a rse con una etiq u e ta PHP de
o.htm, el servidor w e b enva el archivo, tal y c o ap ertu ra (<?php).
mo est, al explorador. ste procesa el archivo y
3. Al to p arse con una etiqueta PHP de apertu
m uestra la pgina w e b descrita por las etiqu etas
ra, el servidor w e b cam bia al m odo PHP. A
H T M L e n el archivo. Cuando un b u scad o res con
esto se le llam a a veces escapar de HTML
ducido h acia un archivo PHP (con una extensin
El servidor w e b luego asum e que todos los
.php), el servid o r w e b busca las se c c io n e s en
en un ciados son enun ciados PHP y ejecuta
PHP en el archivo y las procesa, en lu g ar de sim
los enunciados PHP. Si hay output, ste es
plem ente enviar el archivo ta l y como est al ex
enviado por el servidor al explorador.
plorador. Los pasos que el s ervid o rw eb usa para
procesar un archivo PHP son los siguientes: 4. El servidorw eb contina en el modo PHP has
ta topar con una etiqueta PH P de cierre (? > ) .
1. El servidor w e b em pieza a e s c a n e a r el a r
chivo en modo H TM L. A sum e que los e n u n 5. Cuando el servidor w e b encu entra una eti
ciado s e stn ep H T M L y los enva al qu eta PHP de c ie rre , reg resa al modo
e xp lo rad o r sin procesar. H T M L . C ontina e s c a n e a n d o y el ciclo se
rep ite desde el Paso 1.

de desplegar grficos en sus pginas web y reproducir archivos de msica. Pero el


HTML solo no le permite interactuar con la persona que visualiza la pgina Web.

El HTML es casi interactivo. O sea, los formularios en HTML permiten a los


usuarios digitar la informacin que la pgina web est diseada para recopi
lar; sin embargo, usted no puede tener acceso a esa informacin sin usar un
lenguaje diferente a HTML. PHP procesa la informacin de los formularios sin
necesidad de un programa aparte, y da espacio para realizar otras tareas in
teractivas tambin.

Las etiquetas HTML se usan para incorporar los enunciados en lenguaje PHP
a los programas HTML. El archivo del programa tiene una extensin.php. El
administrador PHP puede definir otras extensiones, tales c o m o . phtml ,.php4
o.php5, aunque.php es la ms comn. Entonces, en este libro, yo asumir que
la extensin.php es para los programas PHP. Los enunciados en lenguaje PHP
se encierran en etiquetas PHP con la siguiente forma:

<?php ?>
c,eo r
A veces se puede usar una versin ms corta de las etiquetas PHP. Puede in-
tentar usar <? and ?> sin el php. Si las etiquetas cortas estn activadas, pue-
de ahorrarse algo de digitacin.
Captulo 6: PHP General

PHP procesa todos los enunciados entre las dos etiquetas PHP. Una vez que la
seccin PHP se ha procesado, se descarta. O bien, si los enunciados PHP pro
ducen output, la seccin PHP es reemplazada por dicho output. El explorador
no ve la seccin PHP; slo su output, si lo hay. Para ms informacin sobre es
te proceso, revise el cuadro: "Cmo el servidor web procesa archivos PHP".

Como ejemplo, voy a empezar con un programa que despliega iHol a , Mundo! en la
ventana del explorador. (Es una especie de tradicin: el primer programa que se es
cribe en cualquier lenguaje es el programa Hola, Mundo! Tal vez usted haya escrito
un programa Hola, Mundo! la primera vez que aprendi HTML.) La Lista 6-1 muestra
un programa HTML que despliega Hola, Mundo! en la ventana del buscador.

L ista 6-1: P ro g ra m a H ola, M und o! en H T M L


<html>
C h e a d X t i t i e > H o l a , Mundo P r o g r am < /t it l eX /h e ad >
<body>
< p> iH o l a , Mundo!
</body>
< / ht ml>

Si dirige su explorador hacia este programa HTML, ver una pgina web que dice

iHola , M u n d o ! !

en la ventana del explorador.

La Lista 6-2 muestra un programa PHP que hace exactamente lo mismo:


muestra Hola, Mundo! en la ventana del buscador.

L is ta 6-2: P ro g ra m a H ola, M und o! en PH P


<h tm l >
< h e a d X t i t i e > H o l a , Mundo P r og r a m < / t i t i e X / h e a d >
<body>
<? php
echo "<p>Hola, Mundo!"
?>
</body>
</html>

Si dirige su explorador hacia este programa, muestra exactamente la misma


pgina web que el programa HTML en la Lista 6-1.

N o v e a el archivo directam ente con su explorador. Es decir, no escoja


FileO O penO B rowse en el men de su explorador para navegar hasta el
arch ivo y hacer clic en l. Debe dirigirse hacia el archivo digitando su
URL, com o lo describo en el Captulo 2. Si ve el cd igo PHP aparecer en la
ventana del buscador en lugar del output esperado, es probable que us
ted no se haya dirigido hacia el archivo usando su URL.
120 Parte III: PHP

En este programa PHP, la seccin PHP es

< ? php
echo "<p>Hola, Mundo!"
?>

Las etiquetas PHP encierran slo un enunciado: un enunciado echo. El enun


ciado echo es un enunciado PHP que usar con mucha frecuencia. Simple
mente produce como output el texto entre comillas dobles.

No hay ninguna regla que diga que usted debe digitar el PHP en lneas separa
das. Se podra incluir perfectamente el PHP en el archivo en una sola lnea,
como sigue:

<?php echo "<p>iHola, Mundo!" ?>

Cuando la seccin PHP se procesa, se reemplaza con el output. En este caso,


el output es

< p >i Ho l a, Mundo!

Si reemplaza la seccin PHP en la Lista 6-2 con el output anterior, el programa


ahora luce exactamente igual que el programa HTML en la Lista 6-1. Si dirige su
explorador a cualquiera de los dos programas, ver la misma pgina web. Si
usted observa el cdigo fuente que el explorador ve (en el explorador, escoja
VerOCdigo Fuente), ver el mismo cdigo fuente para ambos programas.

Escribir enunciados PHP


La seccin PHP que usted agrega a su archivo HTML consta de un arreglo de
enunciados PHP. Cada enunciado PHP es una instruccin para que PHP haga
algo. En el programa Hola, Mundo! mostrado en la Lista 6-2, la seccin PHP
contiene slo un enunciado PHP simple. El enunciado echo ordena a PHP a
mostrar como output el texto entre comillas dobles.

Los enunciados PHP terminan con un punto y coma (;). PHP no nota los espa
cios en blanco ni los finales de lneas. Contina leyendo un enunciado hasta
topar con un punto y coma o la etiqueta PHP de cierre, sin importar cuntas
lneas abarque el enunciado. Omitir el punto y coma es un error comn, el
cual da como resultado un mensaje de error que se ve as:

Parse error: expecting or ' * ;'' in /helio.php on line 6

Observe que el mensaje de error le indica el nmero de la lnea donde se en


contr con problemas. Esta informacin le ayuda a localizar el error en su
programa. Este mensaje de error probablemente significa que se omiti el
punto y coma al final de la lnea 5.
Captulo 6: PHP General

Le recomiendo escribir sus programas PHP con un editor que enumere las l
neas. Si su editor no le permite especificar a cul lnea usted desea ir, tendr
que contar las lneas manualmente desde la parte superior del archivo cada
vez que reciba un mensaje de error. Hallar muchos editores que sirven para
editar PHP en phpeditors.1inuxbackup.co.uk.

A veces, un grupo de enunciados se combina para formar un bloque. Un blo


que se encierra entre llaves ( { } ).Un bloque de enunciados se ejecuta en con
junto. Un uso comn para los bloques es en un bloque condicional, en el cual
los enunciados se ejecutan slo cuando ciertas condiciones son verdaderas.
Por ejemplo, usted quizs quiera que su programa haga lo siguiente:

if (el cielo esta a z u l )


{
poner correa a dragn;
sacar a dragn a pasear por el parque;

Estos enunciados se encierran entre llaves para garantizar que se ejecuten


com o bloque. Si el cielo est azul, tanto poner la correa a dragn como
sacar a dragn a pasear por el parque se ejecutarn. Si el cielo no es
t azul, ninguno de los enunciados se ejecutar (ni la correa, ni la caminata).

Los enunciados PHP que usan bloques, tales como los enunciados if (los cua
les explico en el Captulo 7), son enunciados complejos. PHP lee el enunciado
com plejo en su totalidad, sin detenerse en el primer punto y coma que en
cuentre. PHP sabe que probablemente se topar con uno o ms bloques, y
busca la llave de cierre del ltimo bloque en los enunciados complejos. Ob
serve que hay un punto y coma antes de la llave final. Este punto y coma es
obligatorio, pero no hace falta un punto y coma despus de la llave final.

Si usted quisiera, podra escribir toda la seccin PHP en una sola lnea larga,
siempre y cuando separara los enunciados con puntos y comas y encerrara los
bloques entre llaves. Sin embargo, un programa escrito as sera imposible de
leer. Por ende, usted debera poner los enunciados en lneas separadas, excep
to en aquellas ocasiones cuando haya enunciados realmente cortos.

Observe que los enunciados dentro de los bloques estn sangrados. La sangra
no es necesaria para PHP. Se usa estrictamente para facilitar la lectura. Usted de
bera usar sangras en los enunciados de un bloque, para que los lectores del
script puedan saber ms fcilmente dnde empieza y dnde termina un bloque.

En general, a PHP no le importa si las palabras claves del enunciado estn en ma


ysculas o minsculas. Echo, echo, ECHO y eCHo son todos iguales para PHP.
Parte III: PHP

Mensajes de error y advertencias


PHP trrta de ser de ayuda cuando surgen pro Una razn comn por la cual podra recibir
blem as. Proporciona mensajes de error y ad un aviso es si est haciendo eco de varia
vertencias como sigue: bles que no existen. He aqu un ejemplo de
lo que usted podra ver en ese caso:
v0 M e n s a je de error: Usted recibe este m en
saje cuando el programa tiene un problema Notice: Undefined variable: age
que no lo deja correr. El mensaje contiene in testing.php on line 9
tanta inform acin como sea posible, para Observe que todos los tipos de mensajes indi
as ayudarle a identificar el problem a. Un can el nombre del archivo que est causando
mensaje de error comn es problemas y el nmero de la lnea donde se en
Parse error: parse error in contr el problema.
c:\catalog\test.php on line 6
PHPtiene varios tipos de mensajes de errory ad
Con frecuencia, usted recibe este mensaje vertencia. El tipo que se enva depende del nivel
de error porque ha olvidado un punto y co de mensajes de error al cual se haya configura
ma, un parntesis o una llave. do PHP. Es importante vertodos los mensajes de
error, pero tal vez usted no quiera ver todas las
v0 M en saje de advertencia: Usted recibe este
advertenciasy avisos. A menudo el nico proble
m ensaje cuando el programa ve un proble
ma con un aviso es el desagradable mensaje; el
ma que no es lo suficientem ente serio co
cdigo hace exactam ente lo que usted desea
mo para evitar im pedir que el program a
que haga. 0 bien, tal vez prefiera ver los avisos
corra. Los mensajes de advertencia no sig
durante el desarrollo pero no una vez que la apli
nifican que el programa no puede ejecutar
cacin est siendo usada por los clientes.
se; el program a contina corriendo. M s
bien, los m ensajes de advertencia le indi Para cam biar el nivel de mensajes de error, de
can que PHP cree que probablem ente ha manera que su sitio w e b muestre ms o menos
ya algo malo. Usted debera identificar el mensajes, usted debe ser el administrador PHP.
origen de la advertencia y luego decidir si Edite el archivo php.ini en su sistema. Contiene
necesita arreglarlo. Generalm ente, es as. una seccin que explica los niveles de m ensa
jes de error y cmo configurarlos. Cambie la l
v * Aviso: Usted recibe un aviso cuando PHP
nea que establece su nivel de m ensajes de
ve una condicin que podra ser un error o
error y luego guarde el archivo php. i ni edi
que podra estar perfectam ente bien. Los
tado. N o ta : Probablemente tendr que reiniciar
avisos, como las advertencias, no causan
su servidor w eb antes de que los cambios en el
que el scriptdeje de correr. Los avisos tie
archivo de configuracin de PHP surtan efecto.
nen menor probabilidad de indicar proble
mas serios que las advertencias. Los avisos Si usted no es el administrador PHP de su sistema
slo le dicen que usted est haciendo algo y no tiene acceso a ph p .i n i, puede agregar un
inusual y es m ejor revisar nuevam ente lo enunciado a cualquier programa que establezca el
que est haciendo para asegurarse de que nivel de reporte de mensajes slo para ese progra
realm ente lo quiere hacer. ma. Para fijar el nivel de mensajes de error, agre
gue el siguiente enunciado al inicio del programa:
Captulo 6: PHP General

e r ro r_ r ep or t in g( O PT IO N S) ; Para ver todos los errores pero no los avisos,


use lo siguiente:
0 P T I ONS es un cdigo que le dice a PHP qu
nivel de reporte de errores usar. Para ver todos error_reporting(E_ALL & ~E_N0TICE);
los errores, use lo siguiente:
OPTIONS puede ser cualquiera de los cdigos
error__reporti n g ( E _ A L L ) ; descritos en el archivo p h p . i n i .

Usar Variables PHP


Las variables son recipientes usados para guardar informacin. Una variable
tiene un nombre y, en la variable, se almacena informacin. Por ejemplo, us
ted podra nombrar una variable Sedad y almacenar el nmero 12 en ella.
Despus de almacenar informacin en una variable, se puede usar posterior
mente en el programa. Uno de los usos ms comunes para las variables es
guardar la informacin que un usuario dgita en un formulario.

Dar un nombre a una Variable


Al poner nombres a las variables, recuerde las siguientes reglas:

u* Todos los nombres de variables llevan el signo de dlar ($) delante de


ellas. Esto le dice a PHP que es el nombre de una variable.

Los nombres de variables pueden ser de cualquier longitud.

u* Los nombres de variables pueden incluir letras, nmeros y rayas nicamente.


Los nombres de variables deben empezar con una letra o una raya. No
pueden empezar con un nmero.

Las letras maysculas y las minsculas no son equivalentes. Por ejem


plo, Snombre y $ Nombre no son la misma variable. Si usted almacena
informacin en Snombre, no puede tener acceso a esa informacin usan
do el nombre de variable SNombre.

Al denominar variables, use nombres que indiquen claramente qu informa


cin est en la variable. Usar nombres de variables como $v a r 1, $var2, $A
o $B no contribuye con la claridad del programa. Aunque a PHP no le impor
ta qu nombre usted escoja para la variable y no se confundir, la gente que
trate de seguir el programa tendr muchos problemas recordando cules va
riables guardan cul informacin. Nombres de variables como $nombre ,
Sedad y STotal del pedi do son ms descriptivas y tiles.
m Parte III: P H P _______________________________ ___________________________

Crear y asignar datares a tas Variables


Las variables pueden guardar nmeros o cadenas de caracteres. Para almacenar
informacin en variables, simplemente se usa un signo de igual (=). Por ejemplo,
los cuatro siguientes enunciados PHP asignan informacin a variables:

Sedad = 12;
Sprecio = 2 . 5 5 ;
Snumero=-2;
Snombre = "Goliat Perez";

Observe que la cadena de caracteres est encerrada entre comillas, no as los


nmeros. Los detalles sobre cmo usar nmeros y caracteres se describen
ms adelante en este captulo. (Consulte: "Trabajar con nmeros" y "Trabajar
con cadenas de caracteres".)

Ahora, usted puede usar cualquiera de estos nombres de variables en un


enunciado echo para ver el valor en esa variable. Por ejemplo, is usa el si
guiente enunciado PHP en una seccin PHP:

echo $edad;

el resultado es 12. Si incluye la siguiente lnea en un archivo HTML:

<p>Su edad es <?php echo Sedad ?>.

el resultado en la pgina web es

Su edad es 12.

Cada vez que ponga informacin en una variable que no exista antes, usted
crea esa variable. Por ejemplo, suponga que usa el siguiente enunciado PHP:

Snombre = "Jorge ;

Si este enunciado representa la primera vez que usted menciona la variable


Snombre, este enunciado crea la variable y la establece en "Jorge". Si tiene
una configuracin previa del enunciado Snombre en "Mari a", este enuncia
do cambia el valor de Snombre a "Jorge".

Tambin puede eliminar informacin de una variable. Por ejemplo, el siguien


te enunciado quita informacin de la variable Sedad:

Sedad = "";

La variable Sedad existe pero no contiene ningn valor. Eso no quiere decir
que Sedad se establezca en 0 porque cero es un valor. Significa que Sedad no
almacena ninguna informacin.
Captulo 6: PHP General

Usted puede ir ms all y destruir la variable usando este enunciado:

unset(Sedad);

Una vez que se haya ejecutado este enunciado, la variable Sedad dejar de existir.

Una variable guarda su informacin para todo el programa, no slo para una
sola seccin PHP. Si una variable se establece en " s i " al inicio de un archivo,
seguir guardando " s i " al final de la pgina. Por ejemplo, suponga que su ar
chivo tiene los siguientes enunciados:

<p> iH o l a , Mundo!
<?php
Sedad = 15:
Snombre = " Jai me ";
?>
<br>IHola otra vez, Mundo!<br>
<? php
echo Snombre:
?>

El enunciado echo en la segunda seccin PHP mostrar Jai me. La pgina web
resultante de estos enunciados es

illola, Mundo!
Hola otra vez, Mundo! '
Jaime *

Lidiar con aOisos


Si usa un enunciado que incluya una variable que no exista, probablemente
recibir un aviso. Depender del nivel de mensajes de error al cual est confi
gurado PHP. Recuerde que los avisos no son lo mismo que los mensajes de
error; su aparicin no significa que el programa no puede correr: el programa
contina corriendo. Los avisos slo le dicen que est haciendo algo fuera de
lo comn y debe revisarlo para asegurarse de que lo que est haciendo es
realmente lo que quiere hacer. (Vea el cuadro: "Mensajes de error y adverten
cias".) Por ejemplo, suponga que usted usa los siguientes enunciados:

unset($edad);
echo Sedad:
Sedad? = Sedad;

Podra ver dos avisos: uno para el segundo enunciado y uno para el tercero.
Los avisos se vern as:

Notice: Undefined variable: edad in testing.php on U n e 9


126 Parte III: PHP

Suponga que usted definitivamente quiere usar estos enunciados. El progra


ma funciona exactamente como desea que lo haga. Los nicos problemas son
los molestos avisos. Puede evitar la aparicin de avisos en un programa in
sertando el signo de arroba (@ ) en el punto donde el aviso se emitira. Por
ejemplo, puede evadir los avisos generados por los enunciados anteriores, si
cambia los enunciados como sigue:

u n s e t( $e d ad );
echo @$edad;
$edad2 = @$edad;

Si usted es el administrador PHP, puede cambiar el nivel de mensajes de error pa


ra que los avisos no aparezcan. Para ver los detalles sobre cmo hacerlo, consul
te el cuadro: "Mensajes de error y advertencias, en otra parte de este captulo.

Usar constantes PHP


Las constantes PHP son muy parecidas a las variables. A las constantes se les
da un nombre, y se almacena un valor en ellas. Sin embargo, las constantes
son constantes; es decir, el programa no puede cambiarlas. Una vez que us
ted establece un valor para una constante, permanece igual. Si us una cons
tante para la edad y la fij en 29, no se puede variar. No sera maravilloso
tener 29 aos para siempre?

Las constantes se usan cuando se utiliza informacin en varios lugares en el


programa, y no cambia durante el programa. Es til establecer una constante
para el valor al inicio del programa y usarla a travs de todo el programa. Al
crear una constante en lugar de una variable, usted se asegura de que no se
cambiar accidentalmente. Al asignarle un nombre, usted sabr instantnea
mente de qu informacin se trata. Y, al establecer una constante una vez al
inicio del programa (en vez de usar el valor a lo largo del programa), usted
puede cambiar el valor en un lugar si necesita cambiarse, en lugar de perse
guirlo por varios lugares en el programa para cambiarlo.

Por ejemplo, usted podra establecer una constante que sea el nombre de la
compaa y una constante para la direccin de la compaa, y usarlas donde
sea que las necesite. Luego, si la compaa se traslada, usted podra simple
mente cambiar el valor en la direccin de la compaa al inicio del programa,
y no hara falta hallar todos los lugares en su programa que hicieron eco de la
direccin de la compaa para cambiarla.

Las constantes se establecen usando el enunciado d e f i n e . El formato es

defi n e ( " n o m b r e d ec o ns t a nt e " , " v a l o r d e c o n s t a n t e " ) ;


Captulo 6: PHP General

Por ejemplo, para fijar una constante con el nombre de la empresa, use el si
guiente enunciado:

define("EMPRESA"."Tienda de mascotas A B C " );

Ahora, use la constante en su programa cada vez que necesite el nombre de


su compaa:

echo E m p r e s a ;

Cuando se hace un eco de una constante, no puede encerrarla entre comillas.


Si lo hace, har eco del nombre de la constante, y no del valor. Se puede ha
cer un eco de una constante sin nada, como se muestra en el ejemplo ante
rior, o encerrndola entre parntesis.

Los nombres de constantes pueden ser los mismos que se usan para las varia
bles, aunque los nombres de constantes no empiezan con el signo de dlar ($).
Por convencin, las constantes reciben nombres escritos en maysculas, para
poder ver fcilmente que son constantes. Sin embargo, a PHP realmente no le
importa cm o se denomina la constante. Usted puede almacenar una cadena o
un nmero en ella. El enunciado siguiente est perfectamente bien para PHP:

define ("EDAD",29);

Eso s, no espere que la Madre Naturaleza le crea.

Trabajar con nmeros


PHP le permite realizar operaciones aritmticas con nmeros. Las operacio
nes aritmticas se indican mediante dos nmeros y un operador aritmtico.
Por ejemplo, un operador es el signo ms (+), de modo que usted puede indi
car una operacin matemtica as:

1 + 2

Tambin puede llevar a cabo operaciones matemticas con variables que


contengan nmeros, como sigue:

$nl = 1:
$n2 = 2;
$sum = $nl + $ n 2 ;

La Tabla 6-1 muestra los operadores aritmticos que puede usar.


126 Parte III: PHP

Suponga que usted definitivamente quiere usar estos enunciados. El progra


ma funciona exactamente como desea que lo haga. Los nicos problemas son
los molestos avisos. Puede evitar la aparicin de avisos en un programa in
sertando el signo de arroba (@ ) en el punto donde el aviso se emitira. Por
ejemplo, puede evadir los avisos generados por los enunciados anteriores, si
cambia los enunciados como sigue:

u ns et( $e da d);
echo @$edad;
$edad2 = @ $ e d a d ;

Si usted es el administrador PHP, puede cambiar el nivel de mensajes de error pa


ra que los avisos no aparezcan. Para ver los detalles sobre cmo hacerlo, consul
te el cuadro: "Mensajes de error y advertencias", en otra parte de este captulo.

Usar constantes PHP


Las constantes PHP son muy parecidas a las variables. A las constantes se les
da un nombre, y se almacena un valor en ellas. Sin embargo, las constantes
son constantes; es decir, el programa no puede cambiarlas. Una vez que us
ted establece un valor para una constante, permanece igual. Si us una cons
tante para la edad y la fij en 29, no se puede variar. No sera maravilloso
tener 29 aos para siempre?

Las constantes se usan cuando se utiliza informacin en varios lugares en el


programa, y no cambia durante el programa. Es til establecer una constante
para el valor al inicio del programa y usarla a travs de todo el programa. Al
crear una constante en lugar de una variable, usted se asegura de que no se
cambiar accidentalmente. Al asignarle un nombre, usted sabr instantnea
mente de qu informacin se trata. Y, al establecer una constante una vez al
inicio del programa (en vez de usar el valor a lo largo del programa), usted
puede cambiar el valor en un lugar si necesita cambiarse, en lugar de perse
guirlo por varios lugares en el programa para cambiarlo.

Por ejemplo, usted podra establecer una constante que sea el nombre de la
compaa y una constante para la direccin de la compaa, y usarlas donde
sea que las necesite. Luego, si la compaa se traslada, usted podra simple
mente cambiar el valor en la direccin de la compaa al inicio del programa,
y no hara falta hallar todos los lugares en su programa que hicieron eco de la
direccin de la compaa para cambiarla.

Las constantes se establecen usando el enunciado def i ne. El formato es

de fin e{ '' nomb re dec ons tante , v a l o r d e c o n s t a n t e " );


Captulo 6: PHP General

Por ejemplo, para fijar una constante con el nombre de la empresa, use el si
guiente enunciado:

d ef i ne ( "E MP R ES A" ,"Tienda de mascotas ABC"):

Ahora, use la constante en su programa cada vez que necesite el nombre de


su compaa:

echo Empresa:

Cuando se hace un eco de una constante, no puede encerrarla entre comillas.


Si lo hace, har eco del nombre de la constante, y no del valor. Se puede ha
cer un eco de una constante sin nada, como se muestra en el ejemplo ante
rior, o encerrndola entre parntesis.

Los nombres de constantes pueden ser los mismos que se usan para las varia
bles, aunque los nombres de constantes no empiezan con el signo de dlar ($).
Por convencin, las constantes reciben nombres escritos en maysculas, para
poder ver fcilmente que son constantes. Sin embargo, a PHP realmente no le
importa cmo se denomina la constante. Usted puede almacenar una cadena o
un nmero en ella. El enunciado siguiente est perfectamente bien para PHP:

define (" ED AD " ,29):

Eso s, no espere que la Madre Naturaleza le crea.

Trabajar con nmeros


PHP le permite realizar operaciones aritmticas con nmeros. Las operacio
nes aritmticas se indican mediante dos nmeros y un operador aritmtico.
Por ejemplo, un operador es el signo ms (+), de modo que usted puede indi
car una operacin matemtica as:

1 + 2

Tambin puede llevar a cabo operaciones matemticas con variables que


contengan nmeros, com o sigue:

$nl 1;
$n2 = 2;
$sum = $nl + $n2;

La Tabla 6-1 muestra los operadores aritmticos que puede usar.


Tabla 6-1 Operadores aritm ticos
Operador Descripcin
+ Suma dos nmeros.

- Resta el segundo nmero del primero.


* Multiplica dos nmeros.

/ Divide el primer nmero entre el segundo.

7o Encuentra el residuo cuando el primer nmero se divide


entre el segundo nmero. Esto se llama mdulo. Por ejem
plo, en $a = 13 70 4, $a est establecido en 1.

Se pueden hacer varias operaciones aritmticas de una sola vez. Por ejemplo,
el siguiente enunciado realiza tres operaciones:

S resu ltad o = 1 + 2 * 4 + 1:

El orden en que se realiza la operacin aritmtica es importante. Usted puede


obtener resultados diferentes, dependiendo de cul operacin se realice pri
mero. PHP multiplica y divide primero, y luego lleva a cabo las sumas y restas.
Si todo lo dems es igual, PHP va de izquierda a derecha. En consecuencia, el
enunciado anterior establece $r e s u 1 1 a d o en 10, en el siguiente orden:

Sresultado = 1 + 2 * 4 + 1 (primero, hace la m u l t i p l i c a c i n )


Sresultado = 1+8 + 1 (luego, hace la primera suma a la i zquier da)
Sresultado = 9 + 1 (despus, hace la suma r es tante)
Sresultado = 10

Usted puede cambiar el orden en el cual se lleva a cabo la operacin usando


parntesis. La operacin aritmtica entre parntesis se realizar primero. Por
ejemplo, puede escribir el enunciado anterior con parntesis, as:

S resu ltad o = (1 + 2) * 4 + 1;

Este enunciado fija $ r e s u l t a d o en 1 3, en el orden siguiente:

Sresultado = (1 + 2) * 4 + 1 (primero, hace la operacin entre parntesis)


Sresultado = 3 * 4 + 1 (luego, hace la m u l t i p l i c a c i n )
Sresultado =12+1 (despus, hace la suma)
Sresultado =13

Como es mejor prevenir que lamentar, es recomendable usar parntesis siem


pre que ms de una respuesta sea posible.

A menudo, los nmeros con los que trabaja son montos en dlares, tales como
precios de productos. Usted quiere que los clientes vean los precios en el formato
apropiado en las pginas web. En otras palabras, los montos en dlares siempre
Captulo 6: PHP General

deberan tener dos espacios decimales. Sin embargo, PHP almacena y despliega
los nmeros en el formato ms eficiente. Si el nmero es 10.00, se despliega como
10. Para poner los nmeros en el formato adecuado para dlares, puede usar
s p r i ntf. El enunciado siguiente formatea un nmero al monto de dlares:

$nuevonombrevariable = sprintf(" % 01 .2 f ", $vi ejonombrevari a b l e ) :

Este enunciado reformatea el nmero en $vi ejonombreva r i abl e y lo alma


cena en el nuevo formato en $nuevonombrevariab 1e. Por ejemplo, los si
guientes enunciados despliegan el dinero en el formato correcto:

$price = 25;
$f_price = s p r i n t f (" % 01 .2 f" ,$ pr ice );
echo $ f _ p ri ce < br > ";

Ver lo siguiente en la pgina web:

25.00

s p r i n t f puede hacer otras cosas adems de formatear los lugares de los de


cimales. Para ms informacin sobre cmo usar sprintf para formatear va
lores, consulte el Captulo 13.

Si desea separar los miles en su nmero mediante comas, puede usar:


number^format. El siguiente enunciado crea un formato en dlares con comas:

$pri ce = 25000;
$f_price = n u mb e r_ for ma t($ pr ic e, 2);
echo "$f_pr ic e< br >";

Ver lo siguiente en la pgina web:

25,000.00

El 2 en el enunciado number_f ormat establece el formato en dos espacios


decimales. Usted puede usar cualquier nmero para obtener cualquier nme
ro de espacios decimales.

Trabajar con cadenas de caracteres


Una cadena de caracteres es un arreglo de caracteres. Los caracteres son letras,
nmeros y signos de puntuacin. Cuando un nmero se usa como carcter, no es
ms que un carcter almacenado, al igual que una letra. No se puede usar en ope
raciones aritmticas. Por ejemplo, un nmero telefnico se almacena como una
cadena de caracteres porque slo necesita almacenarse: no hace falta sumarlo ni
multiplicarlo.
Cuando usted almacena una cadena de caracteres en una variable, le indica a
PHP dnde empieza y dnde termina la cadena usando comillas dobles o sen
cillas. Por ejemplo, los dos siguientes enunciados son iguales:

Sstring = "Hola, Mundo!":


Sstring = 'Hola, Mundo!';

Suponga que desea almacenar una cadena como sigue:

Sstring = 'El restaurante Tom's es b u e n o ;


echo Sstring;

Estos enunciados no funcionarn pues, cuando PHP ve la (comilla sencilla) des


pus de Tom, piensa que este es el final de la cadena y despliega lo siguiente:

El restaurante Tom

Usted debe decirle a PHP que interprete la comilla sencilla ( ) como un apstrofo y
no como el final de una cadena. Puede hacerlo usando una barra inclinada (\) fren
te a la comilla sencilla. La barra inversa le indica a PHP que la comilla sencilla no
tiene ningn significado especial; simplemente es un apstrofo. Esto se llama esca
par del carcter. Use los siguientes enunciados para desplegar toda la cadena:

string = 'El restaurante TonA's es bueno';


echo Sstring;

Asimismo, cuando encierra una cadena entre comillas dobles, tambin debe
usar la barra invertida delante de cualquier comilla doble en la cadena.

Cadenas entre comidas sencidas Versus


cadenas entre comidas dobles
Las cadenas de comillas sencillas y las que tienen comillas dobles se manejan
en formas diferentes. Las cadenas entre comillas sencillas se almacenan lite
ralmente, exceptuando V, que se almacena como un apstrofo. En las cade
nas entre comillas dobles, las variables y algunos caracteres especiales se
evalan antes de almacenar la cadena. Estas son las diferencias ms impor
tantes en el uso de comillas dobles o sencillas al escribir programas:

v* Manejar variables: Si usted encierra una variable entre comillas dobles,


PHP usa el valor de la variable. Sin embargo, si la encierra entre comillas
sencillas, PHP usa el nombre literal de la variable. Por ejemplo, si usa los
enunciados siguientes:
Captulo 6: PHP General

f Sedad = 1 2 ;
| Sresultadol = "Sedad",;
^ Sresultado? = 'Sedad';
echo Sresultadol;
echo "<br>";
echo Sresultado2;

el output es
I 12
I Sedad

Iniciar una lnea nueva; Los caracteres especiales \n le dicen a PHP


g que empiece una nueva lnea. Cuando usa comillas dobles, PHP empieza
| una lnea nueva en \n; pero, con comillas sencillas, \n es una cadena li-
| teral. Por ejemplo, al usar los siguientes enunciados:
Scadenal = "Cadena entre \ncomillas d obl es ;
t Scadena2 = 'Cadena entre \ncomillas sencillas';

g cadena 1 da el siguiente output


Cadena entre
comillas dobles

| y cadena2 da este output


| Cadena entre \ncomi11 as sencillas

| X Insertar un tabulador: Los caracteres especiales \t le dicen a PHP que


8 inserte un tabulador. Cuando se usan comillas dobles, PHP inserta un ta-
| bulador en \t pero, con comilla sencillas, \t es una cadena literal. Por
| ejemplo, cuando se usan los siguientes enunciados:
g $cadenal = "Cadena entre \tcomillas dobles";
fs $cadena2 = 'Cadena entre \tcomillas sencillas';

| c ad e na l d a e l siguiente output
>; Cadena entre comillas dobles
1 y c ad e na 2 da este otro output
| Cadena entre \tcomillas sencillas

Las comillas que encierran la cadena entera determinan el tratamiento de va


riables y caracteres especiales, incluso si hay otro conjunto de comillas den
tro de la cadena. Por ejemplo, vea los enunciados siguientes:

Snumero = 1 0 ;
Scadenal = "Hay 'Snumero' personas en fila.";
$cadena2 = ' Hay Snumero' personas esperando.';
echo S c a d e n a l ,"<br>\n";
echo Scadena2;
132 Parte III: PHP

El output es el siguiente:

Hay '10' personas en fila.


Hay "Inumero" personas esperando.

Juntar cadenas
Usted puede juntar cadenas, mediante un proceso llamado concatenacin, usando
un punto (.). Por ejemplo, puede juntar cadenas con los siguientes enunciados:

$cadenal = 'Hola';
$cadena2 = 'M u n d o ! ';
Sunacadena = S c ad e n a l .S c ad e na 2;
echo $unacadena;

El enunciado echo da el siguiente output

HolaMundo!

Observe que no aparece ningn espacio entre Hol a y Mundo. Esto es porque
no se incluyeron espacios en ninguna de las dos cadenas que se unieron. Us
ted puede agregar un espacio entre las palabras usando el siguiente enuncia
do de concatenacin en lugar del anterior:

Sunacadena = Scadenal." ".$cadena2;

Puede usar.= para agregar caracteres a una cadena existente. Por ejemplo,
puede usar los siguientes enunciados en lugar de los enunciados anteriores:

$unacadena= "Hola";
Sunacadena.= " Mundo!";
echo Sunacadena;

El enunciado echo dar el siguiente output:

Hola Mundo!

Usted tambin puede deshacer cadenas. Puede separarlas en un carcter dado


o buscar una subcadena en una cadena. Puede usar funciones para realizar estas
y otras operaciones en una cadena. Explico estas funciones en el Captulo 7.

Trabajar con fechas y horas


Las fechas y horas pueden ser elementos importantes en una aplicacin con
base de datos para la Web. PHP tiene la capacidad de reconocer fechas y horas
y manejarlas en forma diferente que las cadenas de caracteres simples. Las fe
Captulo 6: PHP General

chas y horas se almacenan en el PC en un formato llamado marca de tiempo.


No obstante, este no es un formato en el cul ni usted ni yo quisiramos ver la
fecha. PHP convierte las fechas de su anotacin en una marca de tiempo que el
PC puede entender, y de la marca de tiempo a un formato que sea familiar a las
personas. PHP maneja las fechas y horas usando funciones incorporadas.

^tcNi^o El formato de marca de tiempo es una Marca de tiempo Unix, el cual es un n-


mero entero que representa el nmero de segundos desde el 1 de enero de
pPec

1970 00:00:00 GMT (Greenwich Mean Tim e) hasta la hora representada por la
marca de tiempo. Este formato facilita el clculo del tiempo entre dos fechas:
slo reste una marca de tiempo de la otra.

Formatear una fecha


La funcin que usar ms a menudo es date.date convierte una fecha u ho
ra del formato de marca de tiempo al formato que usted especifique. El for
mato general es

$mifecha = d ate ( " f o r m a t o " , $ t i m e s t a m p ) ;

$timestamp es una variable con una marca de tiempo almacenada. Usted


guard anteriormente la marca de tiempo en la variable, usando una funcin
PHP que describir posteriormente en esta seccin. Si $t ime s t amp no se in
cluye, la hora actual se obtendr del sistema operativo y se usar. As, usted
puede obtener la fecha de hoy con el siguiente enunciado:

$hoy = d at e(" Y/ d/ m");

Si hoy es 10 de agosto, 2003, este enunciado devuelve

2003/10/08

El formato es una cadena que especifica el formato de la fecha que usted de


sea almacenar en la variable. Por ejemplo, el formato "yy-m-d" da como re
sultado 03-8-10, y "M. d .yyyy" da ago. 10.2003. La Tabla 6-2 indica algunos de
los smbolos que puede usar en la cadena formato. (Para una lista completa
de smbolos, consulte la documentacin en www .php.net.) Las partes de la
fecha se pueden separar con guiones (-), puntos (.), diagonales (f) o espacios

Tabla 6-2 Smbolos para formato de fechas


Smbolo Significado Ejemplo

M M e s en texto , abreviado ene

F M e s en texto , sin ab reviar enero

( contina)
m Parte III: PHP

Tabla 6-2 (continuacin)


Smbolo Significado Ejemplo

m M e s en nm eros precedido por ceros 0 2 ,12

n M e s en nm eros sin cero precedente 1,12

d Da del mes; dos dgitos precedidos por ceros 0 1 ,14

j Da del m es sin el cero precedente 3 ,3 0

1 Da de la sem an a en texto, sin abreviar viernes

D Da de la sem an a en texto, abreviado vie

w Da de la sem an a en nm eros DeO(dom ingo)


a 6 (sbado)

Y Ao en cuatro dgitos 2002

y A o en dos dgitos 02

9 Hora e n tre 0 y 12 sin ceros precedentes 2 ,1 0

G Hora e n tre 0 y 24 sin ceros p recedentes 2 ,1 5

h Hora e n tre 0 y 12 precedida por ceros 01 ,10

H Hora en tre 0 y 24 precedida por ceros 0 0 ,23

i M inuto s 00, 59

s S egundos 00, 59

a am o pm en m insculas a m y jjn

A A M o P M en m aysculas A M , PM

Almacenar una marca


de tiempo en una Variable
Puede asignar una marca de tiempo con la fecha y hora actuales a una varia
ble con los siguientes enunciados:

$hoy = t i m e ( ) ;

Otra forma de almacenar una marca de tiempo actual es mediante el enunciado

$hoy = s t r t o t i m e ( " t o d a y " ) ;


Captulo 6: PHP General

Puede almacenar marcas de tiempo especficas usando strtoti me con va


rias palabras claves y abreviaturas que se parecen mucho al ingles. Por ejem
plo, puede crear una marca de tiempo para enero 15, 2003, as:

SFechaclave = strt ot im ef"january 15 2003"):

strtoti me reconoce las siguientes palabras y abreviaturas:

o* Nombres de meses: Los nombres de los doce meses y sus abreviaturas

v* Das de la semana: Los siete das de la semana y algunas abreviaturas

e > Unidades de tiempo: Ao, mes, quincena, semana, da, hora, minuto, se
gundo, am, pm

s v* Algunas palabras tiles en ingls: ago, now, last, next, this, tomorrow,
f yesterday

| v* Menos y ms: + o r -

| Todos los nmeros

| Las zonas de tiempo: Por ejemplo, gmt (Greenwich Mean Time), pdt
(Pacific Daylight Time) y a kst (Alaska Standard Tim e)

Puede combinar las palabras y abreviaturas de varias maneras. Todos los si


guientes enunciados son vlidos:

$Fechaclave = strtotime("tomorrow"); # maana a esta hora


$i-echac!ave = strtotime"now 24 hour s ); '
SFechaclave = strtotimef"last saturday");
SFechaclave = strtotimet"Bpm + 3 days");
SFechaclave = strtotime("2 weeks ago"): # hace dos semanas exactas
SFechaclave = strtotimef"next year gmt"); #1 de hoy en un ao
SFechaclave = strtotime"this 4an\"); # 4 AM hoy

Si quisiera saber hace cunto tiempo fue SFechaclave, podra restarla de


Shoy. Por ejemplo:

$tiempotranscurrido = Shoy - SFechaclave;

Esto le da el nmero de segundos entre la fecha importante y hoy. O use el


enunciado

$ tiempotranscurrido =(($ hoy - SFecha cl av e)/60)/60

para averiguar el nmero de horas desde esa fecha clave.


136 Parte III: PHP

Usar fechas con MySOL


A menudo, usted desea almacenar una fecha en su base de datos MySQL. Por
ejemplo, tal vez quiera almacenar la fecha en que un cliente hizo un pedido o
la hora en que un miembro ,se conect. MySQL tambin reconoce fechas y ho
ras y las maneja en forma diferente a las cadenas de caracteres simples. No
obstante, MySQL no las maneja igual que PHP. Para usar fechas y horas en su
aplicacin, usted necesita entender tanto cm o PHP maneja las fechas (cosa
que describ en las secciones anteriores) y cmo las maneja MySQL.

Comento los tipos de datos DATE y DATETIME para MySQL en detalle en el


Captulo 3. A continuacin, le presento un resumen:

u* DATE: Las columnas de fechas en MySQL esperan que las fechas tengan el
ao primero, luego el mes y, por ltimo, el da. El ao puede ser yyyy o yy.
El mes puede ser mm o m. El da puede ser dd o d. Las partes de la fecha se
pueden separar con un guin (-), una diagonal (/), un punto (.) o un espacio.

i> DATETIME: Las columnas de horas en MySQL esperan tanto la fecha co


mo la hora. El fecha se formatea como lo describ en la vieta anterior.
La hora aparece despus de la fecha, en el formato h h :m m :s s .

Las fechas y horas deben tener el formato correcto de MySQL para almacenarlas en
su base de datos. Las funciones PHP pueden usarse para formatear. Por ejemplo, us
ted puede formatear la fecha de hoy en el formato MySQL con este enunciado:

$today = d a t e ( " Y - m - d " );

Puede formatear una fecha especfica usando el enunciado

$importantDate = date("Y.m.d",strtotime("Jan 15 2003"));

Luego puede almacenar la fecha formateada en una base de datos con una
consulta SQL como sigue:

UPDATE Miembro SET createDate="$today"

Comparar (/atores
En los programas a menudo se usan enunciados condicionales. Es decir, si al
go es verdadero, su programa hace una cosa pero, si no lo es, su programa
hace algo diferente. He aqu dos ejemplos de enunciados condicionales:

if el usuario es un nio
muestre el catalogo de juguetes
if el usuario no es un nio
muestre el catalogo de equipo electrnico
Captulo 6: PHP General

Para saber cules condiciones existen, el programa debe hacer preguntas. Su


programa luego realiza la tarea con base en las respuestas. Algunas pregun
tas (condiciones) que usted podra querer plantear (y las acciones que po
dra desear que se lleven a cabo) son

. El cliente es un nio? Si es as, despliegue el catlogo de juguetes.

Cul producto tiene ms ventas? Despliegue el ms popular primero.

x v* Digit el cliente la contrasea correcta? Si es as, despligue la pgina


web exclusiva para miembros.

u* El cliente vive en Ohio? Si es as, despliegue el mapa de las tiendas en Ohio.

Para hacer una pregunta en un programa, usted crea un enunciado que com
para valores. El programa prueba el enunciado y determina si el enunciado es
falso o verdadero. Por ejemplo, puede formular las preguntas anteriores as

^ El cliente es menor de 13 aos. Falso o verdadero? Si es verdadero, des-


| pliegue el catlogo de juguetes.
8
| v0 Las ventas del producto 1 son ms altas que las del producto 2. Falso o
| verdadero? Si es verdadero, despliegue el Producto 1 primero; si es fal-
5 so, despliegue el Producto 2 primero.

| V La contrasea del cliente es secreto. Falso o verdadero? Si es verdadero,


| muestre la pgina web exclusiva para miembros.

I v0 El cliente vive en Ohio. Falso o verdadero? Si es verdadero, despliegue


i un mapa con la ubicacin de las tiendas en Ohio.

Las comparaciones pueden ser bastante simples. Por ejemplo, es el primer


valor ms grande que el segundo valor? 0 ms pequeo? O igual? Pero a ve
ces hay que fijarse en las cadenas de caracteres para ver si tienen ciertas ca
ractersticas en lugar de ver sus valores exactos. Por ejemplo, usted podra
querer identificar cadenas que empiecen con S o cadenas que se parezcan a
nmeros telefnicos. Para este tipo de comparaciones, se compara una cade
na con un patrn, cosa que describo en la seccin: "Hacer coincidir cadenas
de caracteres con patrones", ms adelante en este captulo.

Hacer comparaciones simptes


Las comparaciones simples comparan un valor con otro. PHP ofrece varias for
mas de comparar valores. La Tabla 6-3 muestra las comparaciones disponibles.
Tabla 6-3 Valores comparados
Comparacin Descripcin
== Son los dos valores guales?

> Es el prim er valor m ayor que el segundo valor?

>= Es el prim er valor m ayor que o igual al segundo valor?

< Es el prim er valor m enor que el segundo valor?

<= Es el prim er valor m enor que o igual al segundo valor?

!= Son los dos iguales diferentes entre s?

O Son los dos valores diferentes entre s?

Usted puede comparar tanto nmeros como cadenas. Las cadenas se comparan al
fabticamente, y todos los caracteres en maysculas van antes que los caracteres
en minsculas. Por ejemplo, SS viene antes que Sa. Los caracteres que son signos de
puntuacin tambin tienen un orden, y un carcter se puede considerar mayor que
otro. Sin embargo, comparar una coma con un punto no tiene mucho valor prctico.

Las cadenas se coparan con base en su cdigo ASCII (American Standard Code
for Information Interchange). En el conjunto de caracteres ASCII, a cada carcter
se le asigna un cdigo ASCII que corresponde a un nmero decimal entre 0 y 127.
Cuando se comparan cadenas, se comparan con base en este cdigo. Por ejem
plo, el nmero que representa la coma es 44. El punto corresponde al 46. Por lo
tanto, si se compara un punto con una coma, el punto resulta ms grande.

Las comparaciones a menudo se usan para ejecutar enunciados slo bajo cier
tas condiciones. Por ejemplo, en el ejemplo siguiente, el bloque de enunciados
slo se ejecuta cuando la comparacin $tiempo == " 11 uv i a " es cierta:

if ( $tiempo == "lluvia" )
{
sacar sombrilla:
cancelar el paseo;
1

PHP revisa la variable $ t i empo para ver si el clima es igual a " 11 u v i a ". Si es
as, PHP ejecuta los dos enunciados. Si $t i empo no es igual a "lluvia", PHP
no ejecuta los dos enunciados.

El signo de comparacin es dos signos de igual juntos (==). Uno de los errores
ms comunes es usar un slo signo de igual para una comparacin. Un slo
signo de igual pone el valor dentro de la variable. Entonces, un enunciado co
mo if ($ti empo = "11 uvi a " ) establecera $ti empo en 11 uvi a, en lugar de
verificar si el tiempo ya igual a lluvia y, por lo tanto, sera siempre verdadero.
Captulo 6: PHP General

Por ejemplo, aqu hay una solucin al problema de programacin presentado


al comienzo de esta seccin. El problema es

si el usuario es un nio
muestre el catalogo de juguetes
si el usuario no es un nio
muestre el catalogo de equipo electrnico

Para determinar si un cliente es un adulto, usted compara la edad del cliente


con la edad en la cual se considera adulto a un cliente. Debe decidir a qu edad
el cliente dejar de interesarse por los catlogos de juguetes y empezar a inte
resarse ms en los catlogos de equipo electrnico. Suponga que decide que
13 parece ser la edad correcta. Entonces, usted pregunta si el cliente es menor
que 13 aos al comparar la edad del cliente con 13. Si la edad es menor que 13,
muestra el catlogo de juguetes; si la edad es 13 o ms de 13, muestra el catlo
go de equipo electrnico. Estas comparaciones tendran el siguiente formato:

Sedad < 13 ( es l a edad del c l i e n t e menor que 13?)


Sedad >= 13 ( es l a edad del c l i e n t e mayor que o i g u a l a 13?)

Una forma de programar las acciones condicionales es usar los siguientes


enunciados:

si (Sedad < 13)


Sestatus = "menor";
si (Sedad >= 13)
Sestatus = "adulto";

Estos enunciados le indican a PHP que compare la edad del cliente con 13. En
el primer enunciado, si la edad del cliente es menor que 13, el estatus del
cliente se establece en "menor". En el segundo enunciado, si la edad del clien
te es igual a o mayor que 13, el estatus del cliente se fija en "adul to". Luego,
usted muestra el catlogo de juguetes a los clientes cuyo estatus sea menor y
muestra el catlogo de equipo electrnico a aquellos cuyo estatus sea adul
to. Aunque puede escribir estos enunciados si ms eficientemente, los enun
ciados mostrados aqu funcionarn bien. En el Captulo 7 se presenta una
descripcin completa de los enunciados condicionales.

Hacer coincidir cadenas de


caracteres con patrones
A veces, usted necesita comparar cadenas de caracteres para ver si concuer
dan con ciertas caractersticas, y no si concuerdan con valores exactos. Por
ejemplo, podra querer identificar cadenas que empiecen con S o cadenas
que tengan nmeros en ellas. Para este tipo de comparaciones, se comparan
las cadenas con patrones. Estos patrones son expresiones regulares.
no Parte III: PHP

Usted probablemente haya usado algn tipo de coincidencia de patrones en el pa


sado. Por ejemplo, cuando usa un asterisco (* ) como comodn al buscar archivos
(di r s*.doc o Is s * . t x t ) , usted esthaciendo patrones coincidir. As, c * . t x t
es un patrn. Cualquier cadena que empiece con c y que termine con la cade-
na.txt, con cualesquiera caracteres entre la c y.txt, concuerd? con el patrn. Las
cadenascow. txt, c3333. txt y c 3 c 4 . t x t todas coinciden con el patrn. Usar
expresiones regulares es slo una variacin ms complicada de usar comodines.

El uso ms comn para concordar patrones en las pginas web es verificar el input
de un formulario. Si la informacin no tiene sentido, usted seguramente no querr
almacenarla en su base de datos. Por ejemplo, si el usuario dgita un nombre en un
formulario, usted puede chequear si parece un nombre real al comparar patrones.
Ya sabe que un nombre consta principalmente de letras y espacios. Otros caracte
res vlidos podran ser un guin (-) (como en el nombre Smith-Klin) y una comilla
sencilla ( ): por ejemplo, en O'Hara. Usted puede revisar el nombre al establecer un
patrn que sea una cadena slo con letras, espacios, guiones y comillas sencillas, y
luego cotejarlo con el nombre en el patrn. Si el nombre no concuerda (es decir, si
contiene caracteres que no estn en el patrn, tal como nmeros o un signo de pre
gunta (?)) no es un nombre real.

Los patrones consisten en caracteres literales y caracteres especiales. Los ca


racteres literales son caracteres normales, sin ningn otro significado espe
cial. Una c es una c sin ms significado que ser una de las 27 letras del
alfabeto espaol. Los caracteres especiales tienen significados especiales en
el patrn, tal como el asterisco ( * ) cuando se usa como comodn. La Tabla 6-4
muestra los caracteres especiales usados en los patrones.

Tabla 6-4 Caracteres especiales usados en patrones


Carcter Significado Ejemplo Concuerda No
concuerda
A
Inicio de lnea Ac casa mi casa

$ Final de lnea c$ tic stick

Cualquier Cualquier a, 1
carcter slo cadena que
contenga por
lo menos dos
caracteres
? Carcter 1 ea?n lean, len loan
precedente opcional

( ) Agrupa caracteres l(ea)n lean len, In


literales en una
cadena que debe
concordar exactam ente
Captulo 6: PHP General U1
Carcter Significado Ejemplo Concuerda No
concuerda
[ 3 Encierra un conjunto 1 [ea]n len, lan lean, In
de caracteres
literales opcionales

- Representa todos los m[a-c]n man, mbn, mdn, mun,


caracteres entre mcn maan
dos caracteres

+ Uno o ms de puerta Puerta111, puerta,


los elementos [1-3] + puerta131 puerta55
anteriores
Cero o ms de puerta puerta, puerta4,
los elementos [1-3]* puerta31l puerta445
anteriores

{, 1 Los nmeros de a {2 ,5} a a ,a a a a a a, xx3


inicio y final en un
rango de repeticiones

\ El siguiente carcter m\*n m*n men, mean


es literal

< i i ) Un conjunto de (Tom|Tommy) Tom, Tommy Thomas, To


cadenas alternas

Los caracteres literales y especiales se combinan para crear patrones, los


cuales a veces son patrones largos y complicados. Una cadena se compara
con el patrn y, si concuerda, la comparacin es verdadera. A continuacin,
hay algunos ejemplos de patrones con un desglose del patrn y muestras de
cadenas que concuerdan y otros que no concuerdan:

i v* A[ A - Z ] . * Cadenas que empiezan con una letra mayscula


A [ A - Z ] Letra mayscula al inicio de la cadena

. * - Una cadena de caracteres que tiene uno o ms caracteres de


longitud

Cadenas que concuerdan:

Oigmoslo otra vez, Sam

Yo
Cadenas que no concuerdan:

oigmoslo otra vez, Sam

I yo
U2 Parte III: PHP

% u* Querido ( hi j o |hermano) - Dos cadenas alternas


g
Querido - Caracteres literales

( hi jo jhermano) - Hijo o hermano

Cadenas que concuerdan:

Querido hijo

Mi Querido hermano

Cadenas que no concuerdan:

Querido Goliat
hijo
*^r A [ 0 - 9 ] ( 5 } ( V [ 0 - 9 ] { 4 } ) ? $ - Cualquier cdigo postal
A [ 0 - 9 ] (51 - Cualquier cadena de cinco nmeros

\ - literal

[ 0 - 9 ] {4 } - Una cadena de nmeros de cuatro caracteres de longitud

( ) ? - Agrupa las dos ltimas partes del patrn y las hace opcionales

Cadenas que concuerdan:


90001
90002 4323
Cadenas que no concuerdan:
9001

12 4321

^, A .+@.+\.com$ - Cualquier cadena con @ incluida que termine en.com


A. + - Cualquier cadena de uno o ms caracteres al inicio
@ - Una @ (signo de arroba) literal. @ no es un carcter especial

r . + - Cualquier cadena de uno o ms caracteres

\ . - Un punto literal

com$ - Una cadena com literal al final de la cadena.

Cadenas que concuerdan:


maria@suempresa.com
Cadenas que no concuerdan:
maria@suempresa.net
@maria.com

Puede comparar una cadena con un patrn usando e re g. El formato general es

e r e g ( " p a t r n " . cadena) ;


U2 Parte III: PHP

u * Querido ( hi j o |hermano) - Dos cadenas alternas


Querido - Caracteres literales

(hi jo |hermano) - Hijo o hermano

Cadenas que concuerdan:

Querido hijo

Mi Querido hermano

Cadenas que no concuerdan:

Querido Goliat

hijo
j^ a[ 0 ' 9 ] { 5 } ( \ - [ 0 - 9 ] { 4 ) ) ? $ - Cualquier cdigo postal
A[ 0 - 9 ] {5 1 - Cualquier cadena de cinco nmeros

\ - - literal
[ 0 - 9 ] {41 - Una cadena de nmeros de cuatro caracteres de longitud

( ) ? - Agrupa las dos ltimas partes del patrn y las hace opcionales

Cadenas que concuerdan:


90001
90002 4323

Cadenas que no concuerdan:


9001
12 4321

j > A.+@.+\.com$ - Cualquier cadena con @ incluida que termine en.com


A . + - Cualquier cadena de uno o ms caracteres al inicio

@ - Una @ (signo de arroba) literal. @ no es un carcter especial


. + - Cualquier cadena de uno o ms caracteres

\. - Un punto literal
com$ - Una cadena com literal al final de la cadena.

Cadenas que concuerdan:


maria@suempresa.com

Cadenas que no concuerdan:


maria@suempresa.net

@maria.com

Puede comparar una cadena con un patrn usando e r e g. El formato general es

eregpatrn",cadena);
Captulo 6: PHP General

El patrn o la cadena pueden ser literales, como sigue:

e r e g ( "[0-9]*","1234"):

o se puede almacenar en variables, as:

ereg($patron,$cadena);

Para usar e reg para verificar el nombre que un usuario digit en un formula
rio, compare el nombre con un patrn, como sigue:

e reg ("A [A-Za-z' - ]+ $ " ,$nombre)

El patrn en este enunciado hace lo siguiente:

Usa A y $ para indicar el inicio y el final de la cadena. Eso significa que


todos los caracteres en la cadena deben concordar con el patrn.

Encierra todos los caracteres literales permitidos en la cadena entre [ ]. No


se permite ningn otro carcter. Los caracteres permitidos son letras ma
ysculas y minsculas, un apstrofo ('), un espacio en blanco y un guin (-).

Usted puede especificar un rango de caracteres usando un guin dentro de los


corchetes [ ]. Cuando hace eso, como en A -Z arriba, el guin no representa un
carcter literal. Ya que usted quiere incluir un guin como carcter literal per
mitido en su cadena, debe agregar un guin que no est entre otros dos carac
teres. En este caso, el guin se incluye al final de la lista de caracteres literales.
*
( u* Sigue la lista de caracteres literales entre corchetes [ ] con un +. El sig
no de ms significa que la cadena puede contener cualquier nmero de
los caracteres dentro de [ ] pero debe contener al menos un carcter.

U nir comparaciones con and/or/xor


A veces una comparacin es suficiente para verificar una condicin pero, a
menudo, usted debe plantear ms de una pregunta. Por ejemplo, suponga
que su compaa ofrece catlogos para diferentes productos en distintos
idiomas. Usted debe saber cul producto desea ver el cliente y en qu idioma
necesita verlo. Este es el formato general para un arreglo de comparaciones:

c o m p ar a c i n a n d / o r / x o r c omp ar ac i n a n d l o r x o r c omp ar ac i n a n d j o r j x o r . . .

Las comparaciones estn conectadas por medio de una de las tres palabras si
guientes:

8 and: Ambas comparaciones son verdaderas.

or: Una de las comparaciones o ambas comparaciones son verdaderas.

u* xor: Una de las comparaciones es verdadera pero no ambas.


Ub Parte III: PHP

La Tabla 6-5 muestra algunos ejemplos de comparaciones mltiples.

Tabla 6-5 Com paraciones mltiples


Condicin Es cierta si

Soliente = = "Smith" El cliente se apellida Smith o Jones.


or Sel i ente == "Jones"

Sel i ente == "Smi th" El cliente se apellida Sm ith, y el cliente vive


and ScustState =="0R" en Oregn.

Soliente == "Smith" El cliente se apellida Sm ith o el cliente vive


or ScustState == "0R" en Oregn o ambas.

Sel i ente = = "Smi th" El cliente se apellida Sm ith, o el cliente


xor ScustState = = "0R" vive en Oregn pero no am bas.

$cliente!= "Smith" El cliente tien e cu alq uier apellido menos


and ScustAge < 13 Sm ith y tien e m enos de 13 aos de edad.

Usted puede encadenar juntas tantas comparaciones como sea necesario.


Las comparaciones que usan and se prueban primero, seguidas de las com
paraciones que usan xor y, finalmente, se prueban las que usan or. Por ejem
plo, la siguiente es una condicin que incluye tres comparaciones:

Sedad == 200 or.Sedad-== 300 and Snombre == "Goliat"

Si el nombre del cliente es Goliat y tiene 300 aos de edad, este enunciado es
verdadero. El enunciado tambin es verdadero si el cliente tiene 200 aos, in
dependientemente de cul sea su nombre. Esta condicin no es verdadera si
el cliente tiene 300 aos, pero su nombre no es Goliat. Usted obtiene estos re
sultados porque el programa chequea la condicin como sigue:

1. Se compara and. El programa revisa Sedad para ver si es igual a 300, y revisa
Snombre paraversiesigualaG ol i a t. Si ambos concuerdan, la condicin es
verdadera, y el programa no necesita revisar o r. Si slo una o ninguna de las
variables es igual a los valores designados, la prueba contina.

2. Se compara or. El programa revisa Sedad para ver si es igual a 200. Si es


as, la condicin es verdadera. Si no lo es, la condicin es falsa.

Usted puede cambiar el orden en el cual se hacen las comparaciones usando


parntesis. La palabra entre parntesis se evala primero. Por ejemplo, usted
puede reescribir el enunciado anterior con parntesis como sigue:

( Sedad == 200 or Sedad = = 3 0 0 ) and Snombre == "Goliat"

Los parntesis cambian el orden en el cual se revisan las condiciones. Ahora,


o r se verifica primero. Esta condicin es verdadera si el nombre del cliente
Captulo 6: PHP General

es Goliat y tiene 200 o 300 aos. Usted obtiene estos resultados porque el
programa chequea la condicin como sigue:

1. Se compara or. El programa revisa $edad para ver si es igual a 200 o


300. Si ez as, esta parte de la condicin es verdadera. Sin embargo, la
comparacin en el otro lado de and tambin debe ser verdadera, de mo
do que la prueba contina.

2. Se compara and. El programa revisa $nomb re para ver si es igual a Go


liat. Si es as, la condicin es verdadera. Si no lo es, la condicin es falsa.

Use los parntesis libremente, incluso cuando cree que conoce el orden de
las comparaciones. Usar parntesis innecesarios no hace ningn dao, pero
obtener resultados inesperados de las comparaciones s.

Si est familiarizado con otros lenguajes, tal como C, quizs haya usado ||
(para o r ) y && (para and) en lugar de las palabras. Los smbolos j | y && fun
(vspec

cionan PHP tambin. El enunciado $a < $b && $c > $b es tan vlido como
el enunciado $a < $b and $c > $b. El signo II se revisa antes de la pala
bra or, y el signo && se revisa antes de la palabra and .

Agregar comentarios a su programa


Los comentarios son notas que estn insertadas en el programa mismo. Aa
dir a sus programas comentarios que describen su propsito y lo que hacen
es esencial. Es importante para el factor lotera; o sea, si usted se gana la lo
tera y se retira a una vida lujosa en la costa francesa, alguien ms tendr que
terminar la aplicacin. La nueva persona necesita saber qu debe hacer su
programa y cmo lo hace. De hecho, los comentarios lo benefician a usted
tambin. Tal vez deba revisar el programa el prximo ao, cuando los deta
lles estn enterrados profundamente en su mente, debajo de un montn de
proyectos ms recientes.

Use comentarios libremente. PHP los ignora; los comentarios son para los hu
manos. Puede insertar comentarios en su programa en cualquier parte, siem
pre y cuando le diga a PHP que son comentarios. El formato para los
comentarios es

/* texto de comentario
mas texto de comentario */

Sus comentarios pueden ser tan largos o tan cortos como lo necesite. Cuan
do PHP ve el cdigo que indica el inicio de un comentario (/ *), ignora todo
hasta ver el cdigo que indica el final del comentario (*/ ).

El siguiente es un posible formato para los comentarios al inicio de cada programa:


U6 Parte III: PHP

/* nombre: catalog.php
descripcin: Programa que muestra descripciones de p r o
ductos. Las descripciones se almacenan en una base
de datos. Las descripciones de los productos se
seleccionan de la base de datos con base en la c a
tegora que el usuario digita en un formulario,
escrito por: Lola Designer
creado: 2/1/02
modificado: 3/15/02
*/

Usted debera usar comentarios a lo largo del programa para describir lo que
el programa hace. Los comentarios son especialmente importantes cuando
los enunciados del programa son complicados. Use comentarios tal como el
siguiente con frecuencia:

/* Obtenga la informacin de la base de datos */


/* Verifique si el cliente tiene mas de 18 aos de edad */
/* Agregue los cargos por envi al total del pedido */

PHP tambin tiene un formato para comentarios cortos. Usted puede especi
ficar que una sola lnea es un comentario usando el signo de libras (# ) o dos
diagonales (Jf) de la manera siguiente:

# Esta es la linea 1 del comentario


// Esta es la linea 2 del comentario

Tambin puede usar # o // en el centro de una lnea para sealar el inicio de


un comentario. PHP ignorar todo desde el # o // hasta el final de la lnea. Es
to es til para comentar un enunciado en particular, como en el ejemplo si
guiente:

$promedio = $Totalpedido/$nArticulos // compute precio promedio

A veces, usted realmente quiere enfatizar un comentario. El siguiente formato


hace un comentario ms vistoso:

######################################
## Revise bien esta seccin##
######################################

Los comentarios PHP no se incluyen en el cdigo HTML que se enva al explo


rador del usuario. El usuario no ve estos comentarios.

Use los comentarios tan frecuentemente como sea necesario en el script para
hacerlo ms claro. Sin embargo, usar demasiados comentarios es un error.
No comente cada lnea o todo lo que hace en el script. Si su script est muy
lleno de comentarios, los comentarios realmente importantes se perdern en
la maraa. Slo use comentarios para etiquetar las secciones y explicar cdi
gos inusuales o complicados, y no los cdigos que sean obvios.
Captulo 7

Bloques de construccin PHP


para programas
En este captulo
Hacer eco de output en pginas web
Asignar valores a variables
Incrementar variables
Detener programas y escapar de ellos
Crear y usar series
Usar enunciados condicionales
Construir y usar ciclos para enunciados repetidos
Usar funciones

m os programas en PHP son una serie de enunciados en un archivo dotada de


A w u n a extensin que le dice al servidor web que busque las secciones en PHP
del archivo. (La extensin generalmente es.php o . phtml, aunque puede ser cual
quier cosa que el servidor deba esperar, segn como haya sido configurado.) PHP
empieza al inicio del archivo y ejecuta cada enunciado, en orden, conforme los re
cibe. Los enunciados son los bloques de construccin de los programas en PHP.

Los bloques de construccin bsicos son enunciados simples: un solo enun


ciado seguido de un punto y coma. Un programa simple consta de un arreglo
de enunciados simples. Por ejemplo, el programa Hola Mundo descrito en el
Captulo 6 es un programa simple. Sin embargo, los programas que conforman
una aplicacin con base de datos para la Web no son muy sencillos. Son din
micos e interactan tanto con el usuario como con la base de datos. En conse
cuencia, los programas requieren de bloques de construccin ms complejos.

Estas son algunas tareas de programacin comunes que requieren de blo


ques de construccin complejos:

1 v* Almacenar juntos grupos de valores relacionados: A menudo usted tie-


I ne informacin que se relaciona, tal como la descripcin, la foto y el pre-
* ci de un producto o una lista de clientes. Almacenar esta informacin
U8 Parte III: PHP

como un grupo al cual se pueda tener acceso bajo un solo nombre es efi
ciente y til. Esta caracterstica de PHP es un arreglo.

v* Configurar enunciados que se ejecuten slo cuando se cumplan ciertas


condiciones: Los programas deben hacer esto frecuentemente. Por ejem
plo, tal vez usted quiera mostrar un catlogo de juguetes a un nio y un
catlogo de equipo electrnico a un adulto. Este tipo de enunciados es un
enunciado condicional. Los enunciados condicionales PHP son el enun
ciado i f y el enunciado case.

Configurar un bloque de enunciados que se repite: A menudo, usted nece


sita repetir enunciados. Por ejemplo, quizs desee crear una lista de todos
sus clientes. Para hacerlo, podra usar dos enunciados: uno que entresaque
la fila de clientes de su base de datos y otro que almacene el nombre del
cliente en una lista. Tendra que repetir estos dos enunciados para cada fila
en la base de datos de clientes. La caracterstica que le permite hacer esto
es un ciclo. Tres tipos de ciclos son los ciclos f o r , while y do..while.

t> Escribir bloques de enunciados que se pueden usar muchas veces: Muchas
tareas se realizan en ms de una parte de la aplicacin. Por ejemplo, usted tal
vez quiera recuperar informacin sobre los productos de la base de datos y
desplegarla numerosas veces en una aplicacin. Extraer y mostrar la infor
macin podra requerir de varios enunciados. Escribir un bloque de enuncia
dos que despliegue la informacin del producto y usar ese bloque
' repetidamente, es mucho ms eficiente que escribir los enunciados una y
I otra vez, cada vez que necesita mostrar la informacin sobre el producto.
1 PHP le permite volver a usar los bloques de enunciados creando una funcin.

En este captulo, aprender cmo usar los bloques de construccin de programas


PHP. Describo los enunciados simples usados ms frecuentemente y los enunciados
complejos y las variables ms tiles. Usted descubrir cmo armar los bloques de
construccin y para qu se usan. Luego, en el Captulo 8, aprender cmo usar estos
bloques de construccin para trasladar datos dentro y fuera de una base de datos.

Enunciados simples tiles


Un enunciado simple es un enunciado nico seguido de un punto y coma (;).
He aqu algunos enunciados simples que se usan en programas PHP:

1 v0 Enunciado echo: produce output que los exploradores manejan como HTML
' j> Enunciado de asignacin: asigna valores a variables

i Enunciado de incremento: aumenta o disminuye nmeros en las variables


( v* Enunciado ex i t : detiene la ejecucin de su programa

I Llamar funciones: Usa bloques de enunciados almacenados en cualquier


lugar de un programa

Comento estos enunciados simples y cundo usarlos en las siguientes secciones.


Captulo 7: Bloques de construccin PHP para programas

Usar enunciados echo


Los enunciados echo se usan para producir output. El output de un enuncia
do echo se enva al explorador del usuario, el cual maneja el output como
HTML (Lenguaje de Marcado de Hipertexto: HyperText Markup Language).

El formato general de un enunciado echo es

echo o b j e t o s a l i d a , o b j e t o s a l i d a , o b j e t o s a l i d a . . .

donde aplican las reglas siguientes:

El o b j e t o s a l i d a puede ser un nmero, una cadena o una variable.


Una cadena debe estar encerrada entre comillas. La diferencia entre las
comillas dobles y las sencillas se explica en el Captulo 6.

V Indique tantos o b j e t o s a l i d a s como necesite.


Separe cada o b j e t o s a l i d a con una coma.

La Tabla 7-1 muestra algunas enunciados echo y su output. Para los propsitos
de la tabla, suponga que $cadenal est establecida en Hola y$cadena2, en
Mundo!

Tabla 7-1 Enunciados echo


Enunciado echo Output

echo "Hola"; Hol a

echo 123; 123

echo " Hola "."Mundo!": Ho la M un do !

echo Hola Mundo! ; No es vlida; el resultado es un


m ensaje de error

echo "Hola M u n d o !"; Hola Mundo!

echo Hola M u n d o !'; Hola Mundo!

echo Scadenal: Hol a

echo S c a d e n a l ,$ c ad e na 2; HolaMundo!

echo "Scadenal Scadena2 Hola Mundo!

echo "Hola" ,$cadena2; Hola Mundo!

echo "Hola"," ",$cadena2; Hola Mundo!

echo 'Scadenal',"Scadena2": Sc ad en alWorld!


Captulo 7: Bloques de construccin PHP para programas

Tabla 7-2 Etapas de la entrega de la pgina w eb


Enunciado echo Cdigo fuente Despliegue en la pgina
en HTML web

echo "Hola H un do !"; H o l a Mu n d o ! H o l a Mundo!

echo "Hola Mundo!"; H o l a Mu n d o ! Hola MundoiAqui estoy!


echo "Aqui e s t o y ! " ; Aqui e s t o y !

echo "Hola Mundo!\n"; H o l a Mu n d o ! H o l a Mu n d o ! Aqui estoy!


echo "Aqui estoy!"; Aqui estoy

echo "Hola M u nd o! <b r> "; Hola W o r l d ! < b r > H o l a Mundo!


echo "Aqui e s t o y ! ; Aqui e s t o y ! " Aqui e s t o y !

echo "Hol a M u n d o ! < b r > \ n " ; Hola Mundo!<br> H o l a Mundo!


echo "Aqui e s t o y ! " ; Aqui e s t o y ! " Aqui e s t o y !

La Tabla 7-2 resume las diferencias entre las etapas en la creacin de una p
gina web con PHP. Para observar estas diferencias ms de cerca, tome en
cuenta los dos siguientes enunciados echo:

echo "Linea 1";


echo "Linea 2";

Si usted pone estas lneas en un programa, probablemente esperara que la


pgina web mostrara lo siguiente:

Linea Ti :
Linea 2

Sin embargo, este no es el output que obtendr. La pgina web realmente se


vera as:

Linea ILinea 2

Si se fija en el cdigo fuente para la pgina web, ver exactamente lo que se


enva al explorador, que es esto:

Li nea 1Linea 2

Observe que esta la lnea que aparece como output y se enva al explorador
contiene exactamente los caracteres a los cuales usted hizo eco: nada ms, ni
nada menos. Las cadenas de caracteres a las cuales usted hizo eco no conte
nan espacios, de modo que ningn espacio aparece entre las lneas.

Adems, observe que las dos lneas aparecen en la misma lnea. Si desea em
pezar una lnea nueva, debe enviar una seal indicando el inicio de una nueva
lnea. Para sealar que una lnea nueva inicia aqu en PHP, debe hacer eco del
carcter especial \n. Cambie los enunciados echo a lo siguiente:
152 Parte III: PHP

echo "1inea l \ n " ;


echo "linea 2 ;

Ahora obtuvo lo que quera, verdad? Bueno, en realidad, no. Ahora se ve lo


siguiente en la pgina web:

linea 1 linea 2

Si se fija en el cdigo fuente, ver esto:

linea 1
linea 2

Entonces, el carcter \n hizo lo suyo: empez una lnea nueva en el output.


Sin embargo, el HTML muestra el resultado en la pgina web como una lnea.
Si usted desea que el HTML despliegue dos lneas, debe usar una etiqueta, tal
como la etiqueta <br>. Entonces, cambie el carcter PHP especial al final de
la lnea a una etiquete HTML, as:

echo "linea l<br>";


echo "linea 2";

Ahora ver lo que quiere en la pgina web:

linea 1
linea 2

Si se fija en el cdigo fuente para este resultado, ver esto:

linea l<br>linea 2

Use \n libremente. De lo contrario, su cdigo fuente en HTML tendr lneas real


mente largas. Por ejemplo, si h a c e e c h o de un formulario largo, ste podra
consistir en una sola lnea larga en el cdigo fuente, aunque se vea bien en la p
gina web. Use \n para separar el cdigo fuente en HTML en lneas razonables.
Tomarse el tiempo adicional de agregar estas separaciones valdr la pena si de
be resolver algn problema en la pgina web que no luce como usted esperaba.
Es mucho ms fcil examinar el cdigo fuente si no mide un kilmetro de largo.

Usar enunciados de asignacin


Los enunciados de asignacin son enunciados que asignan valores a las variables. El
nombre de la variable se indica a la izquierda del signo de igual; el valor por asignar
a la variable se detalla a la derecha del signo de igual. Este es el formato general:

%nombrevari a b l e = v a l o r ;

El valor puede ser un valor nico o una combinacin de valores, incluyendo los
valores en las variables. Una variable puede guardar nmeros o caracteres pero
Captulo 7: Bloques de construccin PHP para programas

no ambos a la vez. Por lo tanto, un valor no puede ser una combinacin de nme
ros y caracteres. Los siguientes son enunciados de asignacin vlidos:

Snumero = 2 ;
Snumero = 2+1;
Snumero = ( 2 - 1 ) * ( 4 * 5 ) -17;
Snumero2 = Snumero + 3;
Scadena = "Hola Mundo";
Scadena2 = Scadena." Otra vez!";

Si combina nmeros y cadenas en un valor, no obtendr un mensaje de error;


simplemente no obtendr el output esperado. Por ejemplo, los siguientes
enunciados combinan nmeros y cadenas:

Snumero = 2 ;
Scadena = "H ol a";
Scombinado = Snumero + Scadena;
Scombinado2 = S n u m er o.S c a d e n a ;
echo Scombinado;
echo <br>;
echo Scombinado2;

El output de estos enunciados es

2 (Scadena es evaluado como 0)


2Hola (Snumero es evaluado como un carcter)

Usar enunciados de incremento


A menudo una variable se usa como contador. Por ejemplo, suponga que de
sea asegurarse de que todos vean el logotipo de su compaa; por eso, lo
muestra tres veces. Usted establece una variable en 0. Cada vez que desplie
gue el logotipo, agrega 1 a la variable. Cuando e valor de la variable llegue a 3,
usted sabr que es momento de dejar de mostrar el logotipo. Los siguientes
enunciados muestran el uso de un contador:

ScontadorO;
Scontador = Scontador + 1;
echo Scontador;

Estos enunciados daran com o output 1. Puesto que los contadores se usan
tan a menudo, PHP le proporciona atajos. Los siguientes enunciados tienen el
mismo efecto que los enunciados anteriores:

$contador=0;
$contador++;
echo Scontador; ;

Este enunciado echo tambin da como output 1 porque ++ suma 1 al valor ac


tual del Scontador. O bien, puede usar el siguiente enunciado:
7 5 4 Parte III: PHP

$c on ta do r ~-;

Este enunciado resta 1 del valor actual del $contador.

A veces, usted podra querer hacer ui.a operacin aritmtica diferente. Puede
usar cualquiera de los atajos siguientes:

$ co n t a do r + = 2;
$contador-=3;
$contador*=2;
$contador/=3;

Estos enunciados suman 2 al $contador, restan 3 del $contador, multiplican


el contador por 2 y dividen el $contador entre 3, respectivamente.

Usar exit
En ocasiones, usted quiere que el programa deje de ejecutarse, que simplemente
se detenga en algn punto en medio del programa. Por ejemplo, si el programa
encuentra un error, a menudo usted prefiere que se detenga en lugar de continuar
con ms enunciados. El enunciado exit detiene el programa. No se ejecuta ningn
otro enunciado despus del enunciado ex i t. El formato de un enunciado exi t es

exi t("m e n s a je ") ;

mensa je es el mensaje que se despide com o output cuando el programa se


despide. Por ejemplo, podra usar el enunciado

exitC'EI programa esta reti ra nd os e") ;

Tambin puede parar el programa con el enunciado di e, com o sigue:

dieCEl programa esta muriendo");

El enunciado die es igual que el enunciado exi t . di e es solamente otro


nombre para exi t. A veces, es mucho ms divertido decir die.

Usar llamados a (unciones


Las funciones son bloques de enunciados que realizan ciertas tareas especfi
cas. Imagine las funciones com o mini-programas o subprogramas. El bloque de
enunciados se almacena bajo un nombre de funcin, y usted puede ejecutar el
bloque de enunciados en cualquier lugar que desee al llamar a la funcin por
su nombre. (Puede consultar los detalles sobre cmo usar funciones en la sec
cin "Usar funciones", ms adelante en este captulo.)
Captulo 7: Bloques de construccin PHP para programas

Usted puede llamar a una funcin indicando su nombre seguido de parnte


sis, com o sigue:

nombrefuncion() ;

Por ejemplo, podra tener una funcin que extraiga todos Jos nombres de los
clientes que viven en cierto estado de la base de datos y despliegue los nom
bres en una lista en el formato apel 1 i do , nombre. Usted escribe los enun
ciados que llevan a cabo estas tareas y los almacena como una funcin bajo
el nombre consegui rnombres. Luego, cuando usted llama a la funcin, debe
especificar cul estado. Puede usar el siguiente enunciado en cualquier lugar
de su programa para obtener la lista de nombres de clientes que viven en ese
estado en particular, el cual en este caso es California:

consegui r_ no mb r es (*C A ');

El valor entre parntesis se entrega a la funcin para que sta sepa cul esta
do usted est especificando. Esto es pasar el valor. Se puede pasar una lista
de valores.

PHP brinda muchas funciones incorporadas. Por ejemplo, en el Captulo 6,


comento una funcin incorporada llamada unset. Usted puede anular una va
riable llamada Stestvar usando este llamado de funcin:

un se t( $t e st v ar );

Usar arreglos PHP


Los arreglos son variables complejas. Un arreglo almacena un grupo de valores
bajo un nico nombre de variable. Un arreglo es til para almacenar valores rela
cionados. Por ejemplo, usted puede almacenar informacin sobre una camisa
(tal como tamao, color y precio) en un solo arreglo llamado Sinfocamisa. Us
ted puede fcilmente manejar, tener acceso a y modificar la informacin en un
arreglo. Por ejemplo, PHP tiene varios mtodos para clasificar un arreglo.

Las siguientes secciones le dan los detalles sobre los arreglos.

Cmo crear arreglos


La forma ms simple de crear un arreglo es asignar un valor a una variable
con corchetes ([ ]) al final de su nombre. Por ejemplo, suponiendo que usted
no haya usado una referencia para $mascotas anteriormente en el programa,
el enunciado siguiente crea un arreglo llamado Smascotas:

$maseotas[l] = "d ragn" ;


156 Parte III: PHP

En este punto, se ha creado un arreglo llamado $mascotas, la cual tiene slo


un valor: dragn. Luego, use los enunciados siguientes:

$mascotas[2] = "unicornio";
$mascotas[3] = "tigre";

Ahora el arreglo Imascotas contiene tres valores: dragn , unicornio y tigre.

Un arreglo se puede considerar como una lista de parejas de claves y valores.


Para obtener un valor en particular, usted especifica la clave entre corchetes.
En el arreglo anterior, las claves son nmeros: 1, 2 y 3. Sin embargo, tambin
puede usar palabras com o claves. Por ejemplo, los enunciados siguientes
crean un arreglo de capitales estatales:

$ c a p it a! e s[ 'C A '] = "Sacramento";


$ c a p it al e s[ 'T X '] = "Austin";
$c ap it ales['OR'] = "Salem";

Usted puede usar atajos en lugar de escribir enunciados de asignacin sepa


rados para cada nmero. Un atajo usa los siguientes enunciados:

$mascotas[] = "dragn";
$mascotas[] = "unicornio";
$mascotas[] = "tigre";

Cuando usted crea un arreglo usando este atajo, a los valores se les asignan
automticamente claves que son nmeros de serie, empezando con el nme
ro 0. Por ejemplo, el enunciado siguiente

echo " $ ma sc ot as [0 3";

enva el siguiente resultado:

dragn
^HCM/
ft/ ' El primer valor en un arreglo con un ndice numerado es 0, a menos que us-
( j ted deliberadamente lo establezca en un nmero diferente. Un error comn al
J trabajar con series es pensar que el primer nmero es 1, y no 0.

Un atajo mucho mejor an es usar el enunciado siguiente:

$mascotas = array( " d ra g n " ,"unico rn io ","t ig r e" );

Este enunciado crea la misma serie que el atajo anterior. Asigna nmeros co
mo claves, empezando con 0. Usted puede usar un enunciado parecido para
crear series con palabras com o claves. Por ejemplo, el enunciado siguiente
crea el arreglo de capitales estatales:

$capitales array( "CA" => "Sacramento", "TX" => "Austin",


"OR" > "Salem" );
-------------------- Captulo 7: Bloques de construccin PHP para programas

Cmo Visualizar arreglos


Se puede hacer eco del valor de un arreglo as:

echo $c ap itales['T X '];

Si usted incluye el valor del arreglo en un enunciado ec ho ms largo que est


encerrado entre comillas dobles, tal vez deba encerrar el nombre del valor
del arreglo entre llaves, as:

echo "La capital de Texas es {$c ap it ales['TX']} < br >";

Puede ver la estructura y los valores de cualquier serie usando el enunciado


pri nt_r. Para mostrar el arreglo $capi tal es, use el enunciado siguiente:

pri nt_r(Scapital e s );

Este enunciado pri nt_r dar el siguiente output:

Array
(
[CA] => Sacramento
LTX 1 => Austin
[OR] => Salem

Este output muestra la clave y los valores para cada elemento en el arreglo.

El resultado aparecer en la pgina web con HTML, lo cual significa que se des
plegar en una lnea larga. Para ver el resultado en la web en el formato til que
describo aqu, enve etiquetas HTML que indiquen al explorador que muestre
el texto tal como lo recibe, sin cambiarlo, usando los enunciados siguientes:

echo "<pre>";
print.r($capitales);
echo "</pre>";

Cmo quitar Valores de tos arreglos


A veces, usted necesita eliminar completamente un valor de un arreglo. Por
ejemplo, suponga que tiene la siguiente serie:

Smascotas = arra y( "dragn, "unicornio", "tigre",


" l o r a " , "escorpin" );

Esta serie cuenta con cinco valores. Ahora usted decide que ya no desea ven
der escorpiones en su tienda de mascotas, por lo cual usa el enunciado si
guiente para tratar de retirar escorpin del arreglo:
158 Parte III: PHP

$mascotas[4] =

Aunque este enunciado establece $mascotas[4] en una cadena vaca, no lo


remueve del arreglo. Usted todava tiene un arreglo con cinco valores; uno de
los valores es vacol. Para eliminar completamente un elemento del arreglo,
necesita usar destruirlo, como sigue:

unset($mascotas[4]);

Ahora su arreglo slo cuenta con cuatro valores.

Cmo ordenar arreglo


Una de las caractersticas ms tiles de los arreglos es que PHP las puede cla
sificar. PHP almacena originalmente los elementos de un arreglo en el orden
en que usted los crea. Si usted muestra el arreglo entero sin cambiar el or
den, los elementos aparecern en el orden en que fueron creados. A menudo,
usted desea cambiar ese orden. Por ejemplo, tal vez desee mostrar el arreglo
en orden alfabtico por valor o por ciave.

PHP puede distribuir los arreglos de varias formas. Para distribuir un arreglo
que tiene nmeros com o claves, use el enunciado sort como sigue:

sort($mascotas);

Este enunciado clasifica segn los valores y les asigna claves nuevas que son
los nmeros apropiados. Los valores se clasifican por nmeros primero, se
guidos por las maysculas y, finalmente, las minsculas. Por ejemplo, consi
dere el arreglo $mascotas, creado en la seccin anterior:

$mascotas[0] = "dragn";
$mascotas[l] = "unicornio ;
$mascotas[2] = "tigre";

Despus de usar el enunciado sort siguiente

sort($mascotas);

el arreglo se transforma en

$mascotas[0] = "dragn";
$mascotas[l] = "tigre";
$mascotas[2] = "unicornio";
Captulo 7: Bloques de construccin PHP para programas

Si usa sort ( ) para ordenar un arreglo con palabras como claves, las claves
cambiarn a nmeros, y las palabras claves se perdern.

Para distribuir series que tengan palabras como claves, use el enunciado
a s o r t como sigue:

as o r t( $c ap it ale s);

Este enunciado clasifica las capitales por valores, y retiene la clave original
para cada valor en lugar de asignar una clave numrica. Por ejemplo, consi
dere el arreglo de capitales estatales creada en la seccin anterior:

$c ap i t a l e s [ C A ' ] = "Sacramento";
$ c a p i t a l e s [ ' T X ' ] = "Austin";
$c a p it al es ['O R ' ] = "Salem";

Despus del siguiente enunciado de clasificacin

as or t( $c ap it ale s);

el arreglo se convierte en

$ c a p it al es [T X ' ] = "Austin";
$ c a p it al es ['C A ' ] = "Sacramento";
$capi t a l e s L 'O R ' ] = "Salem";

Observe que las claves permanecieron con el valor cuando los elementos fue
ron reordenados. Ahora los elementos estn en orden alfabtico, y la clave
estatal correcta todava est con la capital estatal correspondiente. Si las cla
ves hubieran sido nmeros, los nmeros estaran ahora en un orden diferen
te. Por ejemplo, si el arreglo original fuera

$capitale s [1] = "Sacramento";


$capitales[2] = "Austin";
$capitales[3] = "Salem";

despus de un enunciado as o r t, la nueva serie sera

$capitales[2] = Austin
$capitales[l] = Sacramento
$capitales[3] = Salem

Dudo que usted quiera usar a sort en un arreglo con claves numricas.

Hay varios otros enunciados sort que ordenan de otras formas. La Tabla 7-3
incluye todos los enunciados sort disponibles.
160 Parte III: PHP

Tabla 7-3 M an eras en que se pueden ordenar las series


Enunciado sort Qu hace

s o r t ( $nombr ear r eg o ) O rdena segn valor; asigna nmeros


nuevos com o claves

a s o r t ( Sno mbr e a r r e g l o ) O rdena segn valor; m antiene la


m ism a clave

r s o r t {$Hombrear r e g o) O rdena segn valor en orden inverso;


asigna nm eros nuevos como claves

a rsort( $nombr e ar r egl o ) O rdena segn valor en orden inverso;


m antiene la misma clave

ks or t( $nombr ear r eg o) O rdena segn clave

k r s o r t ( $ nombrearreg o ) O rdena segn clave en orden inverso

u s o r t i $Hombrear r e g o , O rdena segn funcin (vea: "Usar


n o mbr e f u nc i o n) funciones", ms adelan te en este
captulo)

Cmo obtener Calores de un arreglo


Usted puede recuperar cualquier valor individual de un arreglo al acceder a
l directamente. He aqu un ejemplo:

$CAca pita! = $capitales['CA'];


echo SCAcapital ;

El output de estos enunciados es

Sacramento

Si usted usa un elemento que no existe en el arreglo en un enunciado, apare


cer un aviso. (Puede leer sobre los avisos en el Captulo 6.) Por ejemplo, su
ponga que usa el siguiente enunciado:

SCAcapital = S c a p it al es CCAx'];

Si el arreglo Scapi tal es existe pero ningn elemento tiene la clave CAx, ver
el siguiente aviso:

Notice: Undefined index: CAx in d:\testserie.php on line 9


Captulo 7: Bloques de construccin PHP para programas

Recuerde que un aviso no causa que el script se detenga. Los enunciados


despus del aviso continuarn ejecutndose. Pero, como no se ha puesto nin
gn valor a SCAcapi tal, los enunciados echo siguientes reproducirn un es
pacio en blanco. Puede evitar que el aviso aparezca usando el smbolo

@$CAcapital = $c ap itales[C A x'];

Usted puede obtener varios valores de un arreglo simultneamente usando el


enunciado 1 i s t o todos los valores de un arreglo usando el enunciado e x t r a c t.

El enunciado 1 i st obtiene los valores de un arreglo y los pone en variables.


Los siguientes enunciados incluyen un enunciado 1 i st:

Sinfocamisa = arreglo ("grande", "azul", 12.00);


sort ($ infocam s a );
1 ist($primervalor,$segundovalor) = $infocamisa;
echo S p r i m e r v a l o r ,"< br>";
echo Is eg un d o v a l o r ," < br >";

La primera lnea crea el arreglo $infocamisa.La segunda lnea ordena el


arreglo. La tercera establece dos variables llamadas $primervalor y $segun
dovalor y copia los dos primeros valores en Sinfocamisa en las dos varia
bles nuevas, como si usted hubiera usado los dos enunciados

Sprimervalor=$infocamis a C 0];
$segundoval or=$infocamtsa[l];

El tercer valor en $ i nfocami s a no se copia en una variable porque slo hay


dos variables en el enunciado 1 i st. El output de los enunciados echo es

azul
grande

Observe que el resultado est en orden alfabtico, y no en el orden en el cual


los valores fueron introducidos. Est en orden alfabtico porque el arreglo se
orden despus de haberse creado.

Usted puede extraer todos los valores de un arreglo con palabras como cla
ves usando ext ra ct. Cada valor se copia en una variable con un nombre que
se corresponde con la clave. Por ejemplo, los siguientes enunciados obtienen
toda la informacin de Sinfocamisa y hacen eco de ella:

ex tr ac t( Si nf oca mi sa );
echo "su talla es Stalla; su color es Scolor; su precio es
:'f Sp r e c i o " ; :

El output de estos enunciados es

su talla es grande; su color es azul; su precio es 12.00;


162 Parte III: PHP

Cmo moerse por un arreglo


A menudo usted querr hacer algo a cada valor de un arreglo. Tal vez quiera
hacer eco de cada valor, almacenar cada valor en la base de datos o sumarle
seis a cada valor en el arreglo. En jerga tcnica, moverse por todos y cada
uno de los valores de un arreglo se conoce com o iteracin. A veces, tambin
se le llama atravesar. Estas son dos maneras de m overse por un arreglo:

iS Manualmente: Mueva el puntero de un valor del arreglo a otro


u* Usar foreach: Muvase automticamente por el arreglo, desde el inicio
hasta el final, de valor en valor

Moverse manualmente por un arreglo


Usted puede moverse por un arreglo manualmente usando el puntero. Para
hacerlo, piense en el arreglo como una lista. Imagine al puntero sealando un
valor en la lista. El puntero permanece en el valor hasta que usted lo mueva.
Despus de moverlo, se queda ah hasta que lo mueva de nuevo. Puede mo
ver el puntero mediante las siguientes instrucciones:

v* crrente nombrear reg o ): Se refiere al valor que est actualmente deba


jo del puntero; no mueve el puntero
v0 ne xt ( Snombr ear r egl o) : Mueve el puntero hasta el valor que est des
pus del valor actual
v* previ ous($nombrear reg o ) : Mueve el puntero hasta el valor que est an
tes de la ubicacin actual del puntero

** end($nombrearreglo): Mueve el puntero hasta el ltimo valor en el arreglo


V reset Snombrearregl o ) : Mueve el puntero hasta el primer valor en el arreglo

Los siguientes enunciados lo mueven manualmente por un arreglo con las ca


pitales estatales:

Ivalor = current ($capital e s );


echo "$valor<br>";
$valor = next ($capital e s );
echo "$valor<br>";
$valor = next ($capitales);
echo "$valor<br>";

A menos que usted haya movido el puntero anteriormente, ste se ubica en


el primer elemento cuando usted empieza a moverse por el arreglo. Si piensa
que el puntero del arreglo puede haber sido movido anteriormente en el
script o si su output del arreglo parece empezar en alguna parte del centro,
use el enunciado r e s e t antes de em pezara moverse, com o sigue:

reset($capita1es);
Captulo 7: Bloques de construccin PHP para programas

Al usar este mtodo para m overse por un arreglo, usted necesita un enuncia
do de asignacin y un enunciado echo para cada valor en el arreglo: en este
caso, para cada uno de los 50 estados de los Estados Unidos. El output es una
lista de todas las capitales estatales.

Este mtodo le da flexibilidad. Se puede mover por un arreglo de cualquier mane


ra: no slo de valor en valor. Puede moverse hacia atrs, ir directamente al final,
saltar un valor de por medio usando dos enunciados next seguidos, o cualquier
mtodo que le sea til. Sin embargo, si quiere moverse por todo el arreglo de prin
cipio a fin, de valor en valor, PHP brinda f oreach,el cual hace exactamente lo que
necesita de forma ms eficiente, f or eachse describe en la siguiente seccin.

Usar foreach para moderse por un arreglo


f o r e a c h s e mueve por el arreglo de valor en valor y ejecuta el bloque de
enunciados usando cada valor en el arreglo. El formato general es

foreach( $nombr ear r egl o as $nombrecl ave => Snombreval or )


{
bloque de e n u n c i a d o s ;
}

Complete la informacin siguiente:

r v* nombrearregl o : El nombre del arreglo por la cual usted se est moviendo

\ v* n o mb r e c l a v e : El nombre de la variable donde desea almacenar la clave.


El nombreclave es opcional. Si no escribe $nombrecl ave =>, el valor se
I pondr en $nombreval o r .

u* nombreva 1o r : El nombre de la variable donde desea almacenar el valor

Por ejemplo, el siguiente enunciado f or each se mueve por el arreglo de


muestra de las capitales estatales y repite una lista:

$capitales = array ( "CA" => "Sacramento", "TX" => "Austin",


"OR" => "Salem" ) ;v
ksort ($capi tal es ; (
foreach ( $capitales as $estado --=> $ciudad )
{ :..r oyp: :
echo "$ciudad, $ e s t a d o< br >";
}

Los enunciados anteriores dan el siguiente output en la pgina web:

Sacramento, CA
Salem, OR
Austin,

Usted puede usar la siguiente lnea en lugar de la lnea foreach en los enun
ciados anteriores:
16 Parte III: PHP

foreach ( $capitales as Iciudad )

Cuando usa este enunciado foreach, slo la ciudad aparecer en el output.


Entonces, usted puede usar el siguiente enunciado echo:

echo "$ ciudad<br>";

El output con estos cambios es

Sacramento
Sal em
Austi n

Cuando foreach empieza a moverse por un arreglo, mueve el puntero al


principio del arreglo. Usted no necesita volver a establecer un arreglo antes
de moverse por el con foreach.

Arreglos multidimensiomles
En las secciones anteriores de este captulo, describo arreglos que son una so
la lista de parejas de claves y valores. Sin embargo, en algunas ocasiones, tal
vez usted desee guardar valores con ms de una clave. Por ejemplo, suponga
que desea almacenar los precios de estos productos juntos en una variable:

| v* camisa, 20.00

, pantalones, 22.50

manta, 25.00

: colcha, 50.00
iS lmpara, 44.00
1 v0 alfombra, 75.00

Puede almacenar estos productos en un arreglo como sigue:

$preciosproductos ['camisa'] = 20.00;


Ipreciosproductos ['pantalones'] = 22.50;
Ipreciosproductos ['manta'] = 25.00;
Ipreciosproductos ['colcha'] = 50.00;
$preciosproductos ['lampara'] = 44.00;
$preciosproductos ['alfombra'] = 75.00;

Su programa puede fcilmente registrar esta serie cada vez que necesite sa
ber el precio de un artculo. Pero suponga que tiene 3 000 productos. Su pro
grama necesitara rebuscar entre 3 000 productos para encontrar el que
tenga camisa o alfombra com o clave.
Captulo 7: Bloques de construccin PHP para programas 165
Observe que la lista de productos y precios incluye una gran variedad de pro
ductos, los cuales pueden clasificarse en grupos: ropa, ropa de cama y mue
bles. Si usted clasifica los productos, el programa slo tendra que registrar
una clasificacin para encontrar el precio correcto. Clasificar los productos
sera mucho ms eficiente. Puede clasificar los productos al poner los pre
cios en un arreglo multidimensional, como sigue:

Spreciosproductos ['r o p a ']['camisa = 20.00;


$preciosproductos ['r o p a ']['pantalones'] = 22.50;
$preciosproductos ['ropa de c a m a ']['manta'] = 25.00;
$preciosproductos ['ropa de c a m a ']['col c h a '] = 50.00;
Spreciosproductos ['m u e b l e s ']['1 a m pa ra'] = 44.00;
Spreciosproductos [*muebles']['alfombra'] = 75.00;

Este tipo de arreglo es un arreglo multidimensional, ya que es como un arreglo de se


ries. La Figura 7-1 muestra la estructura de Spreci osproductos como un arreglo de
series. La figura muestra que Spreciosproductos tiene tres parejas de claves y va
lores. Las claves son ropa, ropa de cama y muebles. El valor para cada clave es un
arreglo con dos parejas de claves y valores. Por ejemplo, el valor para la clave ropa es
un arreglo con dos parejas de claves y valores: camisa/20.00 y pantalones/22.50.

Spreciosproductos clave valor


clave valor
ropa camisa 20.00
pantalones 22.50
ropa de manta 25.00
cama
Figura 7-1: colcha 50.00
un arreglo muebles lampara 44.00
de series. alfombra 75.00

Spreciosproductos es una arreglo bidimensional. PHP tambin puede en


tender series multidimensionales de cuatro, cinco, seis o ms niveles de pro
fundidad. Sin embargo, a m me empieza a doler la cabeza cuando trato de
comprender un arreglo con ms de tres niveles de profundidad. La posibili
dad de confusin aumenta cuando el nmero de dimensiones aumenta.

Usted puede obtener los valores de un arreglo multidimensional usando los


mismos procedimientos que se utilizan con un arreglo unidimensional. Por
ejemplo, puede tener acceso a un valor directamente con esta enunciado:

Spreciocamisa = Spreciosproductos['ropa']['camisa'];

Tambin puede repetir el valor:

echo $preci os pr od uct os ['r o p a ']['camisa'];


Parte III: PHP

Sin embargo, si usted combina el valor entre comillas dobles, debe usar llaves
para encerrar el nombre de la variable. El $ que inicia el nombre de la variable
debe estar inmediatamente despus de {, sin ningn espacio, como sigue:

echo "El p r e c i o de una camisa es \ $ ! $ p r e c i o s p r o d u c t o s [ ' r o p a ' ] [ ' c a m i s a ' ] ) " ;

Observe la diagonal inversa (\) frente al signo de dlar ($). La diagonal inver
sa le dice a PHP que $ es un signo de dlares literal y no el inicio del nombre
de una variable. El output es

El precio de una camisa es $20

Usted puede moverse por un arreglo multidimensional usando enunciados


f oreach (descritos en la seccin anterior). Necesita un enunciado foreach
para cada serie. Un enunciado foreach est dentro de otro enunciado fo
reach. Poner enunciados dentro de otros enunciados se llama anidar.

Como un arreglo bidimensional, tal como $preciosproductos, contiene dos


series, hacen falta dos enunciados foreach para moverse por ella. Los enun
ciados siguientes toman los valores del arreglo multidimensional y las pre
sentan en una tabla en HTML:

echo "<table border=l>";


foreach( $preciosproductos as $categoria )
{
foreach( $categoria as $producto => Sprecio )
{
$f_price = sprintf("%01.2f", Sprecio);
echo "<tr><td>$producto:< / t d X t d > \ $ $ f _ p r i c e < / t d X / t r > " ;
}
}
echo "</table>";

La Figura 7-2 muestra la pgina web producida por estos enunciados en PHP.

P r o d u c t P n c e s - N e ts c a p e B R IO
f - i le L d it o o m m u n ic a to r H e lp

i\ - ^ A i ;. * , r f H S I
:| Back fo w rd fle lo a d H arte Search N eVaoe P ir t Security Stop J H B
d Bookm afk J k jjp o a fo rch ttp Z/ianetval sarnt com/PHP^MySQLofDummies/pnces php j y ^ ^ 'W h a f o R ekte<^ f

T| 1 Internet Q lo o k p j } New&Coci B ReaPas*


1- 2 :
|shut. [$2o7oo
i la [pants: ($22.50
i/eb banket: ($25.00
3 el |bedspread ($50.00
|lamp: )$44 Q0
lm g; :$?5 oo

lO o c u .e n fa D .nu
Captulo 7: Bloques de construccin PHP para programas

As es como el programa interpreta estos enunciados:

1. Da como output la etiqueta tabl e.

2. Entresaca la primera pareja de clave y valor en el arreglo Spreci osproduc


t o s y almacena el valor en la ve riable Scategori a. El valor es un arreglo.

3. Extrae la primera pareja de clave y valor en el arreglo Scategori a. Al


macena la clave en Sproducto y almacena el valor en Spreci o.

4. Da el formato correcto al valor en Spreci o para dinero.

5. Hace echo de una fila en la tabla para el producto y su precio.


6. Va a la siguiente pareja de clave y valor en el arreglo Scategori a.
7. Formatea el precio y repite la siguiente fila de la tabla para el producto y
su precio.

8. Como no hay ms parejas de clave y valor en $categoria,el enunciado


f oreach interno termina.

9. Va a la siguiente pareja de clave y valor en el enunciado f oreach exter


no. Pone el siguiente valor en $categoria,el cual es un arreglo.

10. Repite el procedimiento en los Pasos 2 9 hasta llegar a la ltima pare


ja de clave y valor en la ltima serie de Scategori a. Termina el enuncia
do foreach interno. El enunciado foreach externo termina.
11. Da como output la etiqueta /tabl e para terminar la tabla.

En otras palabras, el enunciado foreach externo empieza con la primera pareja


de clave y valor en el arreglo. La clave es ropa, y el valor de esta pareja es un
arreglo que se pone en la variable Scategoria.El enunciado foreach interno
luego se mueve por el arreglo en Scategori a. Cuando llega a la ltima pareja de
clave y valor enScategoria, acaba. El programa regresa entonces al ciclo exter
no, el cual contina con la segunda pareja de clave y valor... y as sucesivamente
hasta que el enunciado f or e ac h externo llegue al final del arreglo.

Enunciados condicionales tiles


Un enunciado condicional ejecuta un bloque de enunciados slo cuando se cum
plen ciertas condiciones. Estos son dos tipos de enunciados condicionales tiles:

enunciado i f: Establece una condicin y la prueba. Si la condicin es


verdadera, se ejecuta el bloque de enunciados.
enunciado swi tch: Establece una lista de condiciones alternativas. So
mete a prueba la condicin para determinar si es verdadera y ejecuta el
bloque de enunciados apropiado.

Describo estos enunciados en ms detalle en las dos siguientes secciones.


168 Parte Hi: PHP

Usar enunciados f
Un enunciado i f pregunta si ciertas condiciones existen. Un bloque de enun
ciados se ejecutar dependiendo de cules condiciones se cumplan. El forma
to general de un enunciado condicional i f es

if ( c o n d i c i n ... )
{
bloque de enunciados
1
elseif ( c o n d i c i n ... )

bloque de enunci ados
}
else
1
bloque de enunciados
}

El enunciado i f consta de tres secciones:

i f : Esta seccin es obligatoria. Prueba la condicin.


Si la condicin es verdadera: El bloque de enunciados se ejecuta.
Una vez que los enunciados se hayan ejecutado, el programa conti-
f na con los siguientes enunciados, despus del enunciado condi-
1 cional; si el enunciado condicional contiene secciones elseif o
e l se, el programa las pasa por alto.

Si la condicin no es verdadera: El bloque de enunciados no se


ejecuta. El programa pasa a la siguiente instruccin, la cual puede
ser una instruccin e l s e i f , una el se o la siguiente instruccin
despus del enunciado condicional i f .

v* e l s e i f : Esta seccin es opcional. Prueba una condicin. Usted puede


usar ms de una seccin e l s e i f si lo desea.

Si la condicin es verdadera: El bloque de enunciados se ejecuta.


Una vez ejecutado el bloque de enunciados, el programa contina
con el siguiente enunciado despus del enunciado condicional; si
el enunciado i f contiene secciones e l s e i f adicionales o una sec
cin el se, el programa las pasa por alto.

Si la condicin no es verdadera: El bloque de enunciados no se


ejecuta. El programa pasa a la siguiente instruccin, la cual puede
ser e l s e i f , e l s e o l a siguiente instruccin despus del enuncia-
I do condicional i f .
1
' v* el s e : Esta seccin es opcional. Slo se permite una seccin e l se. Esta
I seccin no prueba una condicin; en cambio, ejecuta el bloque de enun-
I ciados. Si el programa ha entrado a esta seccin, significa que la seccin
I if y todas las secciones e 1s e i f no son verdaderas.
Captulo 7: Bloques de construccin PHP para programas

Cada seccin del enunciado condicional i f prueba una condicin que consis
te en una o ms comparaciones. Una comparacin hace una pregunta que
puede ser falsa o verdadera. Algunas condiciones son

$a == 1;
$a K $b
$c != "Helio"

La primera comparacin pregunta si $a es igual a 1; la segunda pregunta si $a es


ms pequea que $b; la tercera comparacin pregunta si $c no es igual a "He
11 o". Usted puede usar dos o ms comparaciones en una condicin conectndo
las con and, or o xor. Comento en detalle cmo comparar valores y usar ms
de una comparacin en el Captulo 6. El siguiente ejemplo usa las tres secciones
del enunciado condicional if. Suponga que usted tiene versiones en alemn, fran
cs, italiano e ingls del catlogo de sus productos. Desea que su programa
muestre la versin correcta del idioma con base en dnde vive un cliente. Los
enunciados siguientes fijan una variable a la versin correcta del catlogo (de
pendiendo del pas donde vive el cliente) y establecen un mensaje en el idioma
correcto. Entonces, usted podr mostrar un mensaje en el idioma apropiado.

if ($ p a i s == "Alemania" )

$ versin = "aleman";
Smensaje = " Sie sehen unseren Katalog auf Deutsch";

Iseif ($pais == "Francia" )

$version = "francs";
$mensaje = " Vous verrez notre catalogue en fr a n c a i s " :

elseif ($pais == "Italia" )'C'

$version = "italiano";
Smensaje = ".Vedrete i 1/nos tr o catalogo i n Itali a n o " ;

lse

Sversion = "ingles";
$mensaje = "You w i 11 see our catalog in English";

echo "Smensaje<br>";

enunciado condicional i f procede como sigue:

1. Compara la variable $pais con "Alemania". Si son iguales, Sversi on se


establece en "alemn", Smensa j e se fija en alemn y el programa salta
hasta el enunciado echo. Si $pa i s no es igual a Al emani a , Sversi on y
Smensaje no se establecen, y el programa pasa a la seccin elseif.
2. Compara la variable $pais con "Francia". Si son iguales, Sversion y
Smens a j e se establecen, y el programa pasa al enunciado echo. Si $pa i s
no e s igual a Francia, Sversion y $mensajenosef ij an, yelprogramapa-
sa a la segunda seccin elseif.
3. Compara la variable $pais con "Italia". Si son iguales, $v e r s io n se fija en
"i tal iano,y el programa pasa al enunciado echo. Si $pa i s no es igual a Italia,
$version y $me n s aj e no se establecen, y el programa pasa a la seccin else.

4. $versin se establece en ingls, y Imensaje se fija en ingls. El pro


grama contina con el enunciado echo.

Observe que slo se hace echo del mensaje en este ejemplo. Sin embargo,
la variable $versi on se almacena porque versin es informacin til que se
puede usar ms adelante en el programa.

Cuando el bloque a ejecutarse por cualquier seccin del enunciado condicional


i f contiene un solo enunciado, las llaves no son necesarias. Veamos: si el ejem
plo anterior hubiese tenido un nico enunciado en los bloques, como sigue:

if ($ p a i s == "Francia")
1
$version = "fra nc s ";
}

Podra escribirla com o sigue:

if ($ p a i s == "Francia" )
Sversion = "fra nc s ";

Este atajo puede ahorrarle algo de digitacin pero, cuando se usan varios
enunciados i f, puede ocasionar confusin.

Usted puede tener un enunciado condicional if dentro de otro enunciado con


dicional i f. Poner un enunciado dentro de otro se llama anidar. Por ejemplo,
suponga que necesita contactar a todos los clientes que viven en Chile. Pla
nea enviarles un mensaje electrnico a los que tienen direccin electrnica y
una carta a aquellos que no la tengan. Puede identificar los grupos de clien
tes usando las siguientes enunciados i f anidados:

if ( $pai sel iente == "Chile )


{
if ( $direccionemai1 != "" )
{
$metodocontacto = "carta";
}
el se
{

$metodocontacto = "email";
}
)
else
{
$metodocontacto = "no se necesita";
Captulo 7: Bloques de construccin PHP para programas

Estos enunciados primero revisan si el cliente vive en Chile. Si el cliente vive


all, el programa busca una direccin electrnica. Si la direccin electrnica
est en blanco, el mtodo de contacto se fija en ca rta. Si la direccin electr
nica no est en blanco, el m todo de contacto es ema i 1. Si el cliente no vive
en Chile, la seccin el se establece el mtodo de contacto para indicar que el
cliente no ser contactado del todo.

Usar enunciados svCitch


En la mayora de las situaciones, los enunciados condicionales i f funcionan
mejor. No obstante, a veces usted tiene una lista de condiciones y desea eje
cutar diferentes enunciados para cada una de las condiciones. Por ejemplo,
suponga que su programa calcula el impuesto de ventas. Cmo maneja las
variaciones en el impuesto de ventas en diferentes lugares? El enunciado
swi tch fue diseado para este tipo de situaciones.

El enunciado swi tch prueba el valor de una variable y ejecuta el bloque de


enunciados para el valor que concuerda con la variable. El formato general es

switch ( $nombrevariable )
{
case v a l o r :
bloque de enunciados;
break; :
case v a l o r :
bloque de enunciados;
break; . " i/fCci

default:
bloque de enunciados;
break;
}

El enunciado swi tch prueba el valor de Snombreva ri abl e. El programa lue


go pasa a la seccin case para ese valor y ejecuta los enunciados hasta llegar
al enunciado break o al final del enunciado swi tch. Si no hay una seccin ca
se para el valor de Snombreva ri abl e, el programa ejecuta la seccin d e
faul t. Usted puede usar tantas secciones case como necesite. La seccin
defaul t es opcional. Si usa una seccin defaul t, se acostumbra ponerla al
final, aunque puede colocarse en cualquier parte.

Los siguientes enunciados establecen el impuesto de ventas para los diferen


tes estados de los Estados Unidos
172 Parte III: PHP

switch ( estadocliente )

case "OR" :
$tasaimpuestoventas = 0;
break;
case "CA" :
$tasaimpuestoventas = 1.0;
break;
default:
$impuestoventas = .5;
break;
}
Simpuestoventas = $costototalpedido * Itasaimpuestoventas;

En este caso, el impuesto de ventas para Oregn es 0, el de California es el 100


por ciento, y para los dems estados es el 50 por ciento. El enunciado swi tch
mira el valor d e $ e s t a d o c l i e n t e y pasa a la seccin que concuerde con el va
lor. Por ejemplo, si Sestadocl i ente es TX, el programa ejecuta la seccin de
fault y establece $tasaimpuestoventasen.5. Despus del enunciado swi tch,
el programa computa $i mpuestoventas en.5 veces el costo del pedido.

Los enunciados break son esenciales en la seccin case. Si una seccin c a s e no


incluye un enunciado brea k, el programa no deja de ejecutarse al final de la sec
cin ca s e. El programa contina ejecutando los enunciados despus del final de la
seccin case, hasta la siguiente seccin case, y contina hasta llegar al final del
enunciado swi tch (o tal vez un enunciado break en una seccin case posterior).

La ltima seccin case en un enunciado swi tch en realidad no requiere de un


enunciado break. ste puede omitirse. Sin embargo, es una buena idea in
cluirlo por razones de claridad.

Usar ciclos
Los ciclos, los cuales se usan con frecuencia en los programas, establecen un blo
que de enunciados que se repite. A veces, el ciclo se repite un nmero especfico de
veces. Por ejemplo, un ciclo para hacer eco de todas las capitales estatales de los Es
tados Unidos necesita repetirse 50 veces. Algunas veces, el ciclo se repite hasta que
cierta condicin exista. Por ejemplo, un ciclo que despliega informacin del produc
to para todos los productos necesita repetirse hasta que haya mostrado todos los
productos, sin importar cuntos productos haya. Estos son los tres tipos de ciclos:

| u* Ciclo f o r bsico; Establece un contador; repite un bloque de enuncia


dos hasta que el contador alcance un nmero especfico.

, u* Ciclo wh i 1 e : Fija una condicin; verifica la condicin; y, si es verdade-


1 ra, repite un bloque de enunciados.
Captulo 7: Bloques de construccin PHP para programas

| /> Ciclo do. . wh i l e : Establece una condicin; ejecuta un bloque de enun-


| ciados; verifica la condicin; si la condicin es verdadera, repite el bloque
S de enunciados.

Describo cada uno de estos ciclos en detalle en las secciones siguientes.

Usar ciclos for


Los ciclos for ms bsicos se basan en un contador. Usted fija los valores ini
cial y final para el contador, adems de cmo el contador se incrementa. El
formato general es

for ( v a l o r i n i c i a l ;c o n d i c i o n f i n a l ; i ncremento )
!
bloque de enunciados;
}

Rellene los siguientes valores:

val or i ni ci a l : Un enunciado que establece una variable para que sea


su contador y la fija a su valor inicial. Por ejemplo, el enunciado $i= 1; es
tablece $i como la variable contador y la establece en igual a 1. Frecuen-
| temente, la variable contador empieza con 0 1. El valor inicial puede
| ser una combinacin de nmeros (2 + 2) o una variable.
| u* condi c i o n f i na 1: Un enunciado que establece su valor final. Siempre y
cuando este enunciado sea verdadero, el bloque de enunciados sigue re
pitindose. Cuando este enunciado no es verdadero, el ciclo termina.
Por ejemplo, el enunciado $i< 10; fija el valor final para el ciclo en 10.
Cuando $i es igual a 10, el enunciado ya no es verdadero (porque $i ya
no es menor que 10), y el ciclo deja de repetirse. El enunciado puede in
cluir variables, como $i < $ t a m a o ;.

1 v* i ncr ement o: Un enunciado que incrementa su contador. Por ejemplo,


el enunciado $i++; suma 1 a su contador al final de cada bloque de enun-
| ciados. Usted puede usar otros enunciados de incremento, tales como
r $I + = l ; 0 $ i - - ; .

El ciclo bsico for establece una variable (por ejemplo, una variable llamada
$i,) que es un contador. Esta variable tiene un valor durante cada ciclo. La va
riable $i se puede usar en el bloque de enunciados que se repite. Por ejem
plo, el siguiente ciclo simple despliega Hola, Mundo! tres veces:

for ($i = l ;$ i <=3;$ i )


{
echo " $ i . Hola, Mundo!<br>";
176 Parte III: PHP

Los enunciados en el bloque no necesitan tener sangra. A PHP no le importa


si estn sangrados o no. Sin embargo, usar sangra en los bloques le ayuda
mucho a entender el programa.

El output de estos enunciados es

1. Hola, Hundo!
2. Hola, Mundo!
3. Hola, Mundo!

Los ciclos f o r son particularmente tiles para moverse en ciclo por un


arreglo. Suponga que usted tiene un arreglo de nombres de clientes y desea
desplegarlos todos. Puede hacerlo fcilmente con un ciclo:

for ($i=0;$i<100;$i++)
!
echo "Inombresclientes[$i]<br>";
}

El output despliega una pgina web con una lista de todos los nombres de
clientes, uno en cada lnea. En este caso, usted sabe que tiene cien nombres
de clientes; pero imagine que no sabe cuntos clientes hay en esta lista. Le
pregunta a PHP cuntos valores hay en el arreglo y usar ese valor en su cicl
f or. Por ejemplo, puede usar los siguientes enunciados:

for ($i=Q;$i<sizeof($nombresclientes);$i++)
{
echo "$nombresclientes[$i]<br>";
}

Ciclos for avanzados


La estructura de un ciclo for es bastante flexible y le permite construir ciclos para casi cualquier
propsito. Un ciclo for tiene este form ato general:
for ( enunciados iniciales;
enunciados condicionales;
enunciados finales)
{
bloque de enunci a d o s ;
}
Donde

v * Los enunciados iniciales se ejecutan una vez al inicio del ciclo.


v0 Los enunciados condicionales se prueban para cada iteracin del ciclo.
Captulo 7: Bloques de construccin PHP para programas

v * Los enun ciados finales se e je cu ta n una vez al final del ciclo.


Cada una de las seccio n e s de en u n c ia d o s se separa con un punto y com a (;). Cada secci n puede
c o n te n e rta n to s enunciados com o sean n ecesario s, sep arad o s por com as. C u alq u iersecci n p u e
de e s ta r va ca .

El siguiente ciclo tien e enun ciados en las tres secciones:


for ($ i=0,$j = l ;$ t < = 4 :$i++,$j++)

{
$t = $i + $j :
echo "$ t <b r>";

}
El output de estos enunciados es
1
3
5
El ciclo se ejecuta en el siguiente orden:

1. La secci n inicial, la cual contiene dos enunciados, se ejecu ta; Si se esta b le c e en 0 y $ j se es


ta b le c e en 1.

2. La secci n condicional que c o n tien e un enun ciado se evala. Es $ t m enor que o igual a 4? S,
en to n ces el enunciado es v e rd a d e ro . El ciclo contina ejecu tn d o se.

3. Los enun ciados en el bloque de enun ciados se ejecutan. $t se convierte en igual a Si m s $j,
lo cual es 0 + 1 , lo cual es igual a l . D espus, $ t se repite para d ar el output 1.

4. La secci n final, la cual co n tien e dos enunciados, se ejecuta: $++ y $j++. Se le suma uno a Si
para que sea igual a 1, y 1 se sum a a $j para que sea igual a 2.

5. La secci n condicional se evala. Es $ t m eno r que o igual a 4? Como $ t es igual a 1 en este


punto, el enun ciado es verd ad ero . El ciclo contina ejecutndose.

6. Los enun ciados en el bloque de enun ciados se ejecutan. $ ts e h ace igual que Si m s $j, que es
1 + 2, lo cual equivale a 3. Luego, $ t se repite para d ar el output 3.

7. La secci n final, que contiene dos e n u n c ia d o s ,s e ejecuta: $++ y $j++. Se suma uno a Si para
que sea igual a 2, y 1 se suma a $j para que s e a igual a 3.

8. La secci n condicional se evala. Es $t m eno r que o igual a 4? Como ahora $ t es igual a 3,el
e n u n ciad o es verdadero. El ciclo contina ejecutndose.

9. Los enun ciados en el bloque de enun ciados se ejecu tan . $ t se h ace igual a Si ms $j, lo cual
es 2 + 3, lo cual equivale a 5. D espus, $t se repite para d ar com o output 5.

10. La secci n final, la cual contiene dos enunciados, se ejecuta: $++ y $j++. Se suma uno a Si pa
ra que sea igual a 3, y 1 se sum a a $j para que se igual a 4.

11. La s e cci n condicional se evala. Es $t m enor que o igual a 4? Como $ t ahora equivale a 5, el
enu n ciad o no es verdadero . El ciclo no contina ejecu tn d o se. El ciclo term ina, y el programa
contina hacia el siguiente enu n ciad o despus del final del ciclo.
Observe que el valor final es sizeof($nombresclientes). Este enunciado
averigua el nmero de valores en el arreglo y usa ese nmero. De este modo,
su ciclo se repite exactamente el nmero de veces que corresponde con el
nmero de valores en el arreglo.

El primer valor en un arreglo con un ndice numrico es 0, a no ser que usted


deliberadamente lo establezca en un nmero diferente. Un error comn cuan
do se trabaja con series es pensar que el primer nmero es 1 en vez de 0.

Usar ciclos icfiite


Un ciclo w h i 1 e contina repitindose siempre y cuando ciertas condiciones
sean verdaderas. El ciclo funciona como sigue:

1. Usted establece una condicin.

2. La condicin se prueba al inicio de cada ciclo.

3. Si la condicin es verdadera, el ciclo se repite. Si la condicin no es ver


dadera, el ciclo se detiene.

El formato general de un ciclo while es

while ( condicin )
{
bloque de enunciados
>

Una condicin es cualquier expresin que pueda ser falsa o verdadera. Las
comparaciones, tales como las que se presentan a continuacin, a menudo se
usan como condiciones. (Para informacin detallada sobre cmo usar com
paraciones, consulte el Captulo 6).

$prueba <= 10
$pruebal == $prueba2
$a == "si" y $b !- "si
Sapel1 i do != "Perez"

Siempre y cuando la condicin sea verdadera, el ciclo se repetir. Cuando la con


dicin resulte falsa, el ciclo se detendr. Los siguientes enunciados configuran
un ciclo whi l e que registra un arreglo en busca de un cliente apellidado Perez:

$clientes = serie( "Huang", "Perez", "Herrera" );


Svariabledeprueba = "no";
$k = 0;
while ( Svariabledeprueba != "si" )
t :
if ($clientes[$k] == "Perez" )
{
Captulo 7: Bloques de construccin PHP para programas

Svari abIedeprueba = "si";


echo Perez<br>";
}
else

echo "$clie nt es [$ k], no Perez<br>";
1
$k++;

Estos enunciados muestran lo siguiente en una pgina web:

H u a n g , no Perez
Perez

El programa ejecuta los enunciados anteriores de esta manera:

1. Establece las variables antes de empezar el ciclo: $c 1 i entes (un arreglo


con tres valores), Svari ab 1 edeprueba (una variable de prueba estable
cida en "no) y $k (una variable contador establecida en 0).

2. Empieza el ciclo probando si $va r i a b 1edeprueba != " s i " es verdade


ra. Como Svari abl edeprueba se fij en "no", el enunciado es verdade
ro, de modo que el ciclo contina.

3. Prueba el enunciado i f. Es Sel i entes[$k] == " Perez" verdadero? En


este punto, $k es 0, por lo cual el programa verifica Sel i en tes [ 0] . Dado
que $clientes[0]es "Huang", el enunciado no es verdadero. Los enun
ciados en el bloque if no se ejecutan, y el programa pasa al enunciado el se.

4. Ejecuta el enunciado en el bloque el se. El bloque el se da com o output


la lnea "Huang , no Perez". Esta es la primera lnea del output.

5. Suma uno a $k, que ahora es igual a 1.

6. Llega al final del ciclo.

7. Va al inicio del ciclo.


8. Prueba la condicin nuevamente. Es $ va r i abl edeprueba != "si"
verdadera? Como Svariabledeprueba no ha cambiado y todava est
establecida en "no", es verdadera, de modo que el ciclo contina.

9. Prueba la condicin if. Es Sel i entes [ $ k ] == "Perez" verdadera?


En este punto, $ k es 1, por lo cual el programa revisa $clientes[l].
Como $c 1 i entes [1 ] es " Perez", el enunciado es verdadero. Enton
ces, el ciclo entra al bloque if.
10. Ejecuta los enunciados en el bloque if. Establece $va ri abl edeprueba
en "si". Da como output "Perez". Esta es la segunda lnea del output.

11. Suma uno a $k, que ahora se convierte en 2.

12. Llega al final del ciclo.

13. Va al inicio del ciclo.


178 Parte III: PHP

14. Prueba la condicin de nuevo. Es $va ri abl ecfeprueba != '^ '"verd a


dera? Como $var i abledeprueba ha cambiado y ahora est establecida
en "s", no es verdadera. El ciclo se detiene.

Es posible escribir un ciclo whi 1 e que sea infinito; o sea, un ciclo que conti
ne para siempre. Usted puede, fcilmente y sin proponrsele, escribir un ci
clo en el cual la condicin siempre sea verdadera. Si la condicin nunca se
vuelve falsa, el ciclo nunca acaba. Para una descripcin de los ciclos infinitos,
consulte la seccin "Ciclos infinitos", ms adelante en este captulo.

Usar ciclos do..u>hite


Los ciclos do. .whi 1 e son muy parecidos a los ciclos while. Un ciclo do. .w
h i l e contina repitindose siempre y cuando ciertas condiciones sean ver
daderas. Usted establece una condicin. La condicin se prueba al final de
cada ciclo. Si la condicin es verdadera, el ciclo se repite. Cuando la condi
cin no sea verdadera, el ciclo se detiene.

El formato general para un ciclo d o . .whi 1 e es

do
1
bl oque de enunciados
} while ( c o n d i c i n );

Los siguientes enunciados establecen un ciclo que busca al cliente apellidado


Perez. Este programa hace lo mismo que el programa en la seccin anterior,
el cual usa un ciclo while:

$cllentes = array( "Huang", "Perez", "Herrera" );


$variabledeprueba = "no";
$k = 0;
do
(
if ($ elientes[$k] == "Perez" )

$variabledeprueba = "si";
echo "Perez<br>";
}
el se

echo "$ cl ie ntes[$k], no Perez<br>";

$k++;
} while Ivariabledeprueba != "si" );

El output de estos enunciados en un explorador es

Huang, no Perez
Perez
Captulo 7: Bloques de construccin PHP para programas

Este es el mismo output mostrado en el ejemplo del ciclo whi 1 e. La diferen


cia entre un ciclo whi 1e y un ciclo d o . .whi 1e es el lugar donde se verifica la
condicin. En un ciclo whi 1e, sta se verifica al inicio del ciclo. Por lo tanto,
el ciclo nunca se ejecutar si la condicin nunca es verdadera. En el ciclo
do . .whi 1 e, la condicin se revisa al final del ciclo. Por lo tanto, el ciclo siem
pre se ejecuta al menos una vez, incluso si la condicin nunca es verdadera.

Por ejemplo, en el ciclo anterior que busca el apellido Perez, suponga que la
condicin original se establece en s, en lugar de no, usando este enunciado:

$variabledeprueba = "si":

La condicin sera falsa desde el inicio. Nunca sera verdadera. En un ciclo


whi 1 e, no habra ningn output. El bloque de enunciados nunca correra. Sin
embargo, en un ciclo do. . wh i 1 e, el bloque de enunciados se correra una vez
antes de probar la condicin. As, el ciclo whi i e no producira ningn out
put, pero el ciclo d o . .whi 1e producira el siguiente output:

Huang, no Perez

El ciclo d o . .whi 1 e produce una lnea de output antes de probar la condicin.


No produce la segunda lnea del output porque la condicin resulta falsa.

Ciclos infinitos
Usted puede fcilmente configurar los ciclos para que nunca se detengan.
Los ciclos de este tipo son ciclos infinitos. Se repiten para siempre. Sin em
bargo, casi nunca se crean ciclos infinitos intencionalmente. Por lo general se
trata de un error en la programacin. Por ejemplo, un cambio ligero en el pro
grama que establece un ciclo whi 1 e puede convertirlo en un ciclo infinito.

Este es el programa mostrado en la seccin "Usar ciclos while", la cual apare


ce anteriormente en este captulo:

Solientes = array ( "Huang", "Perez", "Herrera" );


Svariabledeprueba = "no";
$k = 0;
while ( $variabledeprueba 1= "si" )
1
if ($ elientes[$k] == "Perez" )
180 Parte III: PHP

$variabledeprueba = "si";
echo "P er ez<br>";
}
el se
{
echo "$cli e n t e s [$ k 3 , no Perez<br>";

$k++;
)

Este es el programa con un ligero cambio:

Solientes = array ( "Huang", "Perez", "Herrera" );


Svariabledeprueba = "no";
while ( Svariabledeprueba != "si" )
{
$k = 0: .
if (Selientes[$k] == "Perez" )
{
Svariabledeprueba = "si";
echo "Perez<br>";

else
{
echo "S el ientes[$k], no Perez<br>";
}
$k + + ;
}

El pequeo cambio es mover el enunciado $ k = 0; desde afuera del ciclo ha


cia adentro del ciclo. Esta pequea modificacin lo convierte en un ciclo sin
fin. El output de este programa cambiado es

Huang, no Perez
Huang, no Perez
Huang, no Perez
Huang, no Perez

Esto se repetir para siempre. Cada vez que el ciclo corra, reconfigura $k a 0.
Luego obtiene Sel ientes [0] y hace echo de l. Al final del ciclo, $k se incre
menta a 1. No obstante, cuando el ciclo empieza de nuevo, $k se restablece nue
vamente en 0. En consecuencia, slo el primer valor en el arreglo, Huang, es
ledo. El ciclo nunca llega al apellido Perez, y Svari abl edeprueba nunca se
establece en "s i". El ciclo es interminable.

No se avergence si escribe un ciclo infinito. Le garantizo que el mejor de los ex


pertos en programacin del mundo ha escrito muchos ciclos infinitos. No es na
da serio. Si usted est probando un programa y obtiene output en su pgina web
que se repite infinitamente, se detendr por s solo en pocos instantes. El tiempo
predeterminado es de 30 segundos, pero el perodo de pausa puede haber sido
Captulo 7: Bloques de construccin PHP para programas

cambiado por el administrador PHP. Usted tambin puede hacer clic en el botn
Stop en su buscador para detener el despliegue en su buscador. Despus, averi
ge por qu el ciclo se est repitiendo indefinidamente y arrglelo.

Un error comn que puede originar un ciclo infinito es usar un nico signo de
igual (=) cuando debera haber usado dos signos de igual (==). Un signo de igual
nico almacena un valor en una variable; el signo de igual doble prueba si dos
valores son iguales. Si escribe la siguiente condicin con un solo signo de igual:

wh i l e (Ivariabledeprueba = " s i " )

siempre ser verdadera. La condicin simplemente fija $va r i ab 1 edeprueba


igual a "si". Esto no es una pregunta que pueda ser falsa. Probablemente,
lo que usted quiso escribir es esto:

while (Ivariabledeprueba == "si")

Esta es una pregunta que quiere saber si Ivariabledeprueba es igual a " s i ",
a la cual puede responderse com o falso o verdadero.

Usted puede salvaguardar sus programas de este error en particular cambiando la


condicin a "si" == Ivariabledeprueba.Es menos lgico de leer, pero protege
contra el problema del signo de igual nico. Si usa un solo signo de igual en lugar
de uno doble en esta condicin, obtendr un error, y el programa no correr.

Otro error comn es dejar por fuera el enunciado que incrementa el contador. Por
ejemplo, en el programa ilustrado anteriormente en esta seccin, si usted deja por
fuera el enunciado $k++;, $k siempre ser 0, y el resultado es un ciclo infinito.

Escapar de un ciclo
A veces usted desea que su programa escape de un ciclo. PHP proporciona
dos enunciados para este propsito:

s u* b rea k : Sale completamente de un ciclo y contina con los enunciados


del programa despus del ciclo.
continu: Salta al final del ciclo donde la condicin se prueba. Si la condi
cin resulta positiva, el programa contina desde el principio del ciclo.

break y continu generalmente se usan en un enunciado condicional,


b r e a k, en particular, se usa ms a menudo en enunciados s wi t c h, como
coment anteriormente en el captulo.

Los siguientes dos conjuntos de enunciados muestran la diferencia entre


continu y break. Los primeros enunciados usan el enunciado break.
182 Parte III: PHP

Scontador = 0;
while ( Scontador < 5 )
!
$contador++;
If ( Scontador == 3 )
!
echo "break<br>";
break;
}
echo "Final del ciclo while: contador=$contador<br>";
1
echo "Despus del ciclo break<p>";

Los enunciados siguientes usan el enunciado continu:

Scontador = 0;
while ( Scontador < 5 )
(
$contador++;
If ( Scontador == 3 )
{
echo c o n t in ue <b r> ";
conti n u e ;
}
echo "Final del ciclo while: contador=$contador<br>";
}
echo "Despus del ciclo c o n t in ue <b r> ";

Estos enunciados construyen dos ciclos iguales, excepto que el primero usa
break, y el segundo usa conti nue. El output de estos primeros enunciados
que usan el enunciado break aparece en su explorador como sigue:

Final del ciclo while: contador=l


Final del ciclo while: contador=2
break
Despus del ciclo break

El output del segundo grupo de enunciados con el enunciado continu es el


siguiente:

Final del ciclo while: contador=l


Final del ciclo while: contador=2
conti nue
Final del ciclo while: contador=4
Final del ciclo while: contador=5
Despus del ciclo continu

El primer ciclo termina con el enunciado b r e a k. El ciclo se detiene y pasa in


mediatamente al enunciado despus del ciclo. El segundo ciclo no termina
con el enunciado continu. Simplemente impide la tercera repeticin del ci
clo y salta de regreso al principio del ciclo. Luego termina el ciclo, con la cuar
ta y quinta repeticiones, antes de continuar el enunciado despus del ciclo.
Captulo 7: Bloques de construccin PHP para programas

Un uso para los enunciados brea k es asegurarse contra los ciclos infinitos. Los si
guientes enunciados dentro de un ciclo pueden detenerlo en un punto razonable:

$prueba4i ntini to++;


if ($prueba4infi nito > 100 )
{
break:
)

Si usted est seguro de que su ciclo nunca debera repetirse ms de 100 ve


ces, estos enunciados impedirn que el ciclo se haga infinito. Use cualquier
nmero que le parezca razonable para el ciclo que est construyendo.

Las aplicaciones a menudo realizan la misma tarea en diferentes puntos en el


programa o en diferentes programas. Por ejemplo, su aplicacin podra mos
trar el logotipo de la compaa en varias pginas web distintas o en diferen
tes partes del programa. Suponga que usa los siguientes enunciados para
desplegar el logotipo de la compaa:

echo '<hr width="50" align="left">'," \ n " ;


echo '<img src="/images/logo.jpg" width="50"
hei g h t = " 5 0 " X b r > ', "\ n";
echo '<hr width="50" al i g n = " l e f t " X b r > ',"\ n " ;

Puede crear una funcin que contenga los enunciados anteriores y darle el
nombre de most ra r_l o g o t i po. Entonces, cada vez que el programa necesite
mostrar el logotipo, usted slo debe llamar a la funcin que contiene los
enunciados con un simple llamado de funcin, como sigue:

mostrar_logoti p o ( );

Observe los parntesis despus del nombre de la funcin. Estos son obligato
rios en un llamado de funcin, pues le dicen a PHP que esta es una funcin.

Usar una funcin ofrece varias ventajas:

u0 Menos digitacin; Basta con digitar los enunciados una sola vez: en la
funcin. Para siempre despus de eso, usted simplemente usa el llamado
de funcin y nunca tendr que digitar los enunciados de nuevo.

v* Lectura ms fcil: La lnea mostrar_J o g o t i po( ) es mucho ms fcil de


entender para una persona con un solo vistazo.
u0 Menos errores: Despus de haber escrito su funcin y haberle arreglado
f todos sus problemas, funcionar correctamente cada vez que la use.
186 Parte III: PHP

| v0 Ms fcil de cambiar: Si decide cambiar cmo debe realizarse la tarea,


slo hace falta cambiarla en un lugar. Basta con cambiar la funcin; no
| hay necesidad de buscar en cien lugares diferentes de su programa don-
I de llev a cabo la tarea y cambiar el cdigo cien veces. Por ejemplo, su-
| ponga que cambi el nombre del archivo de grficos donde guarda el
logotipo de la compaa. Usted cambia el nombre del archivo en un lu
gar, la funcin, y operar correctamente en todos los dems lugares.

Puede crear una funcin poniendo el cdigo en un bloque de funciones. El


formato general es

function n o m b r e d e l a f u n c i o n i )
{
bloque de enunciados;
return;
1

Por ejemplo, usted crea la funcin para mostrar el logotipo de la compaa


con los siguientes enunciados:

function m o s t r a r j o g o t i p o ( )
{
echo <hr width="50" al ign= "l ef t" >1," \ n " ;
echo '<img src="/images/logo.jpg" w i d t h = " 5 0
he i g h t = " 5 0 " X b r > ', " \ n";
echo '<hr w i dt h=50" al ign-"l eftX b r > ,"\ n " ;
return;
1

El enunciado return detiene la funcin y regresa al programa principal. El


enunciado return al final de la funcin no es obligatorio, pero hace que la
funcin sea ms fcil de entender. El enunciado return a menudo se usa para
un final condicional de una funcin.

Imagine que su funcin despliega un catlogo de equipo electrnico. Podra


usar el siguiente enunciado al inicio de la funcin:

if ( $edad < 13 )
re t u r n ;

Si la edad del cliente es menos de 13 aos, la funcin se detiene y el catlogo


de equipo electrnico no se mostrar.

Usted puede poner funciones en cualquier parte del programa, pero la prcti
ca comn es poner todas las funciones juntas al inicio o al final del archivo
del programa. Las funciones que planea usar en ms de un programa pueden
estar en un archivo separado. Cada programa tiene acceso a las funciones del
archivo externo. Para ms informacin sobre la organizacin de aplicaciones
en archivos y cmo tener acceso a archivos separados, revise el Captulo 10.
Captulo 7: Bloques de construccin PHP para programas

Observe que la funcin del ejemplo es bastante simple. No usa variables, y


no comparte ninguna informacin con el programa principal. Slo realiza una
tarea independiente cuando se la llama. Usted puede usar variables en fun
ciones y pasar informacin de una funcin al programa principal, siempre y
cuando conozca las reglas y limitaciones. Las secciones restantes en este ca
ptulo le explican cm o usar variables y pasar valores.

Usar Variables en funciones


Usted puede crear y usar variables que sean locales a la funcin. O sea, puede
crear y usar una variable dentro de su funcin. Sin embargo, la variable no es
tar disponible fuera de la funcin; no est disponible para el programa princi
pal. Usted puede lograr que la variable sea disponible usando un enunciado
especial llamado global , el cual hace que una variable sea disponible en cual
quier lugar del programa. Por ejemplo, la funcin siguiente crea una variable:

function formato_nombre O
{
$primer_nombr = "Goliat";
$apel1 ido = " P e r e z " ;
$nombre = Sapellido.", ".$p ri mer_nombre;
}
formato,, n o m b r e ();
echo " $ n o mb re ";

Estos enunciados no producen ningn output. En el enunciado echo, $nombre


no contiene ningn valor. La variable $nombre se cre dentro de la funcin, de
modo que no existe fuera de ella.

Puede crear una variable dentro de una funcin que exista fuera de la funcin
usando el enunciado g l o b a l . Los enunciados siguientes contienen la misma
funcin, con un enunciado g 1o b a 1 aadido:

function formato_nombre()

$primer_nombre = "Goliat";
Sapel1 i do = " P e r e z " ;
global n o m b r e ;
$nombre = Sapellido.", ".$primer_nombre;
}
fo rm ato_nombre();
echo "Snombre";

El programa ahora repite esto:

P e r e z , Gol i at

El enunciado gl obal permite que la variable est disponible en cualquier


ubicacin del programa. Usted debe crear la variable global antes de poder
186 Parte III: PHP

usarla. Si el enunciado gl obal sigue al enunciado de asignacin Snombre, el


programa no produce ningn output.

Las mismas reglas aplican cuando usted est usando una variable que fue
creada en el programa principal. No puede usar una variable que haya sido
creada fuera de una funcin en la funcin, a menos que la variable sea global,
como se muestra en los enunciados siguientes:

$primer_nombre = "Goliat";
$ a pe 11 ido = " P e r ez ";
function formato_ no mb re()
{
global S p ri me rj io mb re, $apellido;
Snombre = Sapellido.", ".$ p ri me r_ no mb re;
echo "Snombre";
}
formato__nombre();

Si no usa el enunciado g 1 oba 1 , $ a pe 1 i do y $primernombredentrodela


funcin son variables diferentes, creadas cuando usted les da un nombre. No tie
nen valores. El programa no producira ningn output sin el enunciado global .

Cmo pasar alores entre una


funcin et programa principal
Usted puede pasar valores hacia dentro de la funcin y recibir valores de la
funcin. Por ejemplo, imagine que escribe una funcin para sumar el impues
to de ventas correcto a un pedido. La funcin tendra que saber el costo del
pedido y en cul estado vive el cliente. La funcin necesitara enviar de vuel
ta el monto del impuesto de ventas.

Pasar atores a una funcin


Puede pasar valores a una funcin poniendo los valores entre parntesis
cuando llama a la funcin, como sigue:

nombredefuncion(valor, v a l o r , . . . ) ;

Por supuesto, las variables no pueden simplemente aparecer. La funcin de


be estar esperndolas. El enunciado function incluye los nombres de las
variables para los valores que est esperando, como sigue:

function nombredefuncion(Snombrevari abl e l ,Snombrevari able2,...)



enunciados
return;
Captulo 7: Bloques de construccin PHP para programas

Por ejemplo, la siguiente f uncti on calcula el impuesto de ventas:

f u n c t i o n c a l c u l a r _ i mp u e s t o d e v e n t a s ( l e a n t i d a d . l e s t a d o c l i e n t e )
{
swi t ch ( l e s t a d o c i i ente )
{
case "0 R" :
I t as ai mpues t ov ent as = 0;
break;
case "CA" :
I t as ai mpues t o v ent as = 1.0;
break;
default:
I t as ai mpues t ov ent as =. 5;
break;
}
I t as ai mpues t ov ent as = I cant i dad * I t asai mpuest ovent as;
echo " l i m p u e s t o v e n t a s < b r > " ;
)
I p r e c i o = 2000.00;
l e s t a d o c i i ente = "CA";
calcular_impuestodeventas(Iprecio,lestadoci i e n t e ) ;

La primera lnea muestra que la funcin espera dos valores, com o sigue:

f u n c t i on c a l c u l a r j m p u e s t o d e v e n t a s ( I c a n t i d a d , l e s t a d o c i i ent e)

La ltima lnea es el llamado de funcin, el cual pasa dos valores a la funcin


cal cul a r _ i mpuestodeventas, com o los espera. El monto del pedido y el es
tado donde vive el cliente se pasan. El output de este programa es 2000 por
que la tasa del impuesto de ventas para California es del 100 por ciento.

Usted puede pasar tantos valores como necesite. Los valores pueden ser va
riables o valores, incluyendo valores que se calculen. Los siguientes llamados
de funcin son vlidos:

cal cular_impuestodeventas (2000,"CA");


calcular_impuestodeventas ( 2 * 1 0 0 0 , " " ) ;
cal cul ar_Jmpuestodeventas (2000, "C", "A " );

Los valores se pueden pasar en un arreglo. La funcin recibe la variable como


un arreglo. Por ejemplo, los siguientes enunciados pasan un arreglo:

I ser i edenumer os = a r r a y ( 100, 200);


sumarnmeros( I seri edenumeros) ;

La funcin recibe todo el arreglo. Por ejemplo, suponga que la funcin empie
za con el siguiente enunciado:

f uncti on sumarnurneros ( Inumeros)


188 Parte III: PHP

La variable $nume ros es un arreglo. La fune ion puede incluir enunciados tales como

return $numeros[0] + $numeros[l];

Los valores pasados se pasan segn posicin. Es decir, el primer valor en la lis
ta que usted pasa se usa como el primer valor en la lista que la funcin espera,
el segundo se usa para el segundo, y as sucesivamente. Si sus valores no estn
en el mismo orden, la funcin usar el valor equivocado al realizar la tarea. Por
ejemplo, en calcula r_i mpuestodeventas, podra llamar a cal cu 1 a r__i m
puestodeventas para que pase valores en el orden equivocado, com o sigue:

calcular_impuestodeventas($estadocli e n t e ,$va 1ordelped d o ) ;

La funcin usa el estado como el valor del pedido, el cual establece en 0 porque
el valor pasado es una cadena. Establece el estado al nmero e n$ v a l o r d e l p e
d i do, el cual no concordara con ninguna de sus categoras. El output sera 0.

Si no enva suficientes valores, la funcin establece el valor faltante en una


cadena vaca para una variable en cadena, o a 0 para un nmero. Si enva de
masiados valores, la funcin ignora los valores adicionales.

Si pasa el nmero equivocado de valores a una funcin, podra recibir un


mensaje de advertencia, com o sigue, dependiendo del nivel de mensajes de
error para el cual PHP est configurado.

Warrnng: M i s s i n g argument 2 f o r c o m p u t e _ s a l e s t a x ( ) i n / t e s t 7 . php on l i n e 5

Para ms detalles sobre los mensajes de advertencia, consulte el Captulo 6.

Puede fijar valores predeterminados para usarse cuando un valor no se pase.


Los valores predeterminados se establecen cuando usted escribe la funcin
asignando un valor predefinido para el valor o los valores que est esperan
do, como sigue:

functon sumar_2_numeros($nurnl=l,$ n u m 2= l)
{
$tota! = $numl + $num2;
return $ t o t a 1 ;
}

Si uno de los valores no se pasa (o si no se pasa ninguno), la funcin usa los


valores predefinidos asignados. Pero, si se pasa un valor, ste se usa en lugar
del valor predeterminado. Por ejemplo, usted podra usar uno de los siguien
tes llamados:

sumar_2_numeros(2,2);
sumaf_2_numeros{2);
sumar_Z_numeros();

Los resultados son, en orden consecutivo:


Captulo 7: Bloques de construccin PHP para programas

$t o t a l = 4
$tot.al = 3
St ot al = 2

Obtener un Calor de una funcin


Cuando usted llama a una funcin, puede pasar valores como se describi ante
riormente. La funcin tambin puede devolver un valor al programa que la llam.
Use el enunciado return para regresar un valor al programa que ha emitido el lla
mado. El programa puede almacenar el valor en una variable o usarlo directamen
te; por ejemplo, puede usarlo en un enunciado condicional. El enunciado return
tambin devuelve el control al programa principal; es decir, detiene la funcin.

El formato general del enunciado return es

return val or:

Por ejemplo, en el programa de impuesto de la seccin anterior, yo hice eco


del impuesto de ventas usando los siguientes enunciados:

Simpuestodeventas = Smonto * St asai mpuest odevent as;


echo " $ i mpue s t o d e v e nt a s <b r >" ;

Podra devolver el impuesto de ventas al programa principal, en lugar de ha


cer eco de l, usando el siguiente enunciado:

Simpuestodeventas = Smonto * St asai mpue s t ode v e nt as ;


return Si mpuestodeventas;

De hecho, yo podra usar un atajo y enviarlo de regreso al programa principal


con un enunciado:

return Smonto * Stasai mpuest odevent as;

El enunciado return enva el impuestodeventas de regreso al programa


principal y termina la funcin. El programa principal puede usar el valor en
cualquiera de las formas usuales. Los enunciados siguientes usan el llamado
de funcin de manera vlida:

Simpuestodeventas = calcular_impuestodeventas,($precio.$estadocliente);

Scostototal = Sprecio + calcular_impuestodeventas($precio,Sestadocl iente);

if ( c a 1 c u l a r _ i mp u e s t o d e v e n t a s ( $ p r e c i o , S e s t a d o c l i e n t e ) >
100000.00 )

Secho " Gr a c i a s , muchas, muchas, muchas g r a c i a s < b r > " ;


190 Parte III: PHP

foreach($pedidclrente as monto)

Stotal = monto + calcu1arJmpuestodeventas($monto,$estadocliente);
echo "Su total es $total<br>";
}

Un enunciado ret urn puede devolver slo un valor. Sin embargo, el valor
devuelto puede ser un arreglo, de modo que usted en realidad puede devol
ver muchos valores desde una funcin.

Puede usar enunciados return en un enunciado condicional para devolver


diferentes valores para diferentes condiciones. Por ejemplo, la siguiente fun
cin devuelve una de dos cadenas diferentes:

functi on comparar_valores($val o r ,$valor2)


{
if($valorl < $valor2)
{
return "menor que":
}
el se
{
return "no menor que";
}
}

Aunque la funcin contiene dos enunciados return, slo una va a ejecutarse,


dependiendo de los valores en $val or y $ valor 2.

Usar funciones incorporadas


Las muchas funciones integradas de PHP son una de las razones por las cua
les PHP es tan poderoso y til para las pginas web. Las funciones incluidas
en PHP son funciones normales. No son muy diferentes de las que usted mis
mo puede crear. Pero PHP ya ha hecho el trabajo por usted.

Describo algunas de las funciones incorporadas en este captulo y captulos


anteriores. Por ejemplo, vea el Captulo 6 para ms informacin sobre las fun
ciones unset y number_format. Algunas funciones muy tiles para interac-
tuar con su base de datos MySQL se comentan en el Captulo 8. Otras
funciones tiles se incluyen en la Parte V de este libro. Y, por supuesto, todas
las funciones se enumeran y describen en la documentacin PHP, en el sitio
web de PHP: w w w . p h p .ne t / d o c s . p h p .
Captulo 8

Datos entran, datos salen


En este captulo
Conectarse a la base de datos
i Obtener informacin de la base de datos
y Usar formularios HTML con PHP
s Extraer datos de un formulario HTML
Procesar la informacin que los usuarios digitan en formularios HTML
Almacenar datos en la base de datos
? Usar funciones para insertar y extraer datos de la base de datos

HP y MySQL funcionan muy bien juntos. Esta sociedad dinmica hace


que PHP y MySQL sean tan atractivos para el desarrollo de aplicaciones
con bases de datos para la Web. Ya sea que usted tenga una base de datos lle
na de informacin que quiere poner a la disposicin de los usuarios (como
un catlogo de productos) o una base de datos que est esperando para que
los usuarios la rellenen (p or ejemplo, una base de datos de membresa), PHP
y MySQL trabajan juntos para implementar su aplicacin.

Una de las caractersticas ms fuertes de PHP es su habilidad para interac-


tuar con bases de datos. PHP provee funciones que hacen de la comunica
cin con MySQL algo extremadamente simple. Se usan las funciones de PHP
para enviar consultas SQL a la base de datos. No hace falta conocer los deta
lles de la comunicacin con MySQL; PHP se encarga de eso. Usted nada ms
necesita saber sobre las consultas SQL y cm o usar las funciones de PHP.

En captulos anteriores de este libro, describo las herramientas que se usan


para construir una aplicacin con base de datos para la Web. Usted averigua
cmo construir consultas SQL en el Captulo 4 y cmo construir y usar los
bloques de construccin del lenguaje PHP en los Captulos 6 y 7. En este cap
tulo, descubrir cm o usar estas herramientas para las tareas especficas
que una aplicacin con una base de datos para la Web debe realizar.
192 Parte III: PHP

Funciones de PHP/MySOL
Las funciones incorporadas de PHP se usan para interactuar con MySQL. Es
tas funciones se conectan al servidor MySQL, seleccionan la base de datos
correcta, envan consultas SQL y llevan a cabo otras comunicaciones con la
base de datos MySQL. Usted no necesita conocer los detalles sobre la inte
raccin con la base de datos, ya que PHP se encarga de todos los detalles. Us
ted slo debe saber cm o usar las funciones.

En este momento, PHP (empezando por la versin 5) cuenta con dos conjuntos de
funciones para interactuar con MySQL. Un conjunto de funciones se usa para inte
ractuar con la versin 4.0 de MySQL, o versiones anteriores. El otro conjunto de
funciones se usa para interactuar con la versin 4.1 de MySQL y las posteriores.

A lo largo de este libro, mis ejemplos y programas muestran las funciones


que trabajan con MySQL versin 4.0. Al momento de escribir este libro, la
versin actual estable de MySQL es la versin 4.0. Adems, las funciones de
PHP que se usan con MySQL versin 4.1 se describen en la documentacin
del sitio web de PHP com o experimentales, con una advertencia: Use esta ex
tensin bajo su propio riesgo. Por el momento, la versin 4.1 de MySQL slo
est disponible como software alpha, definido en el manual de MySQL como
sigue: Esta publicacin contiene una gran seccin de cdigo nuevo que no ha si
do probabo al 100%. Por lo tanto, estoy escribiendo este libro con base en el
uso de MySQL 4.0 y de las funciones de PHP que trabajan con esta versin.

Las funciones de PHP que se usan con MySQL 4.0 tienen el siguiente formato
general:

my s ql _f u/ 7 C7 on ( v a l o r , v a l o r , . . . ) ;

La segunda parte del nombre de la funcin es especfica a la funcin, general


mente una palabra que describe lo que hace la funcin. Adems, la funcin
requiere que se pasen uno o ms valores, y que se especifiquen cosas tales
com o la conexin con la base de datos, la ubicacin de los datos, etc. A conti
nuacin, dos de las funciones que se discuten en este captulo:

my s q l _ c o n n e c t ( $ c o n e c t a r ) ;
mysql _quer y( " enunei ado SQL", $c o n e c t a r ) ;

Para cuando usted lea este libro, es probable que MySQL 4.1 sea la versin
actual estable de MySQL. Si es as, puede usar MySQL 4.1 y las funciones que
trabajan con dicha versin. Al momento de escribir este libro, las funciones
discutidas en l son las mismas para MySQL 4.0 y MySQL 4.1 excepto por un
cambio en el nombre. Los nombres de las funciones que se usan con MySQL
4.1 empiezan con my s q 1i _ en vez de my s q 1__. As, las funciones mostradas
arriba tendran los siguientes nombres si se usan con MySQL 4.1:

mysqli_conriect(Iconectar);
my s q l i _ q u e r y ( $conecta r , "enunei ado SQL") ;
Captulo 8: Datos entran, datos salen

La funcionalidad y la sintaxis de las funciones son iguales o muy similares.


Por ejemplo, observe la diferencia entre las dos siguientes funciones.

my sq l_ qu er y($ s q 1 ,S c o n e c t a r );
my sq li_query(Sconectar,$s q 1);

Observe que el orden de los elementos pasados es distinto. Esto es as para


varias funciones.

Esta discusin se refiere a las funciones mysqli tal y como son ahora. Las fun
ciones mysql i pueden cambiar, por supuesto. Si una de las funciones mysql i
no parece funcionar como debiera, revise el manual para hallar cualquier di
ferencia de uso posible.

La i aadida al nombre es por improved (mejorado)', este conjunto de funcio


nes MySQL es proporcionado por la extensin mejorada de MySQL. En este
momento, no se incluye soporte para my s q 1 i en PHP en forma predetermina
da. Debe activarse cuando se instala PHP. Sin embargo, para cuando MySQL 4.1
sea la versin estable, es probable que my s q 1i sea parte de PHP sin necesidad
de activarlo especficamente. Para ver la condicin actual de my s q 1 i, revise la
documentacin en www. php. net/manual /en / re f . mysql i .php.

Hasta el momento de escribir esto, usted puede usar la siguiente opcin de


instalacin para activar mysqli:

--with mysqli=DIR

DIR es la ruta hacia el directorio donde se encuentra un programa llamado


mysql_confi g, el cual fue instalado cuando se instal MySQL 4.1.

Hacer una conexin


Antes de poder almacenar o extraer datos, usted debe conectarse a la base de da
tos. La base de datos podra estar en el mismo PC con sus programas PHP, o po
dra estar en un PC diferente. Usted no necesita saber los detalles sobre la
conexin con la base de datos, porque PHP maneja todos los detalles. Todo lo que
necesita saber es el nombre y la ubicacin de la base de datos. Imagine la cone
xin a la base de datos como una conexin telefnica. No hace falta conocer cmo
las palabras se trasladan de un telfono a otro. Usted slo debe saber es el cdigo
de rea y el nmero telefnico. La compaa telefnica maneja los detalles.

Despus de conectarse a la base de datos, usted enva consultas SQL a la ba


se de datos MySQL usando una funcin de PHP diseada especficamente pa
ra este propsito. Puede enviar tantas consultas como necesite. La conexin
permanece abierta hasta que usted especficamente la cierre o el programa
termine. Asimismo, en una conversacin telefnica, la conexin permanece
abierta hasta que usted la termine al colgar el telfono.
Conectarse al servidor MySOL
El primer paso para comunicarse con su base de datos MySQL es conectarse al
servidor MySQL. Para hacerlo, usted debe saber el nombre del PC donde se loca
liza la base de datos, el nombre de su cuenta MySQL y la contrasea para su cuen
ta MySQL. Para abrir la conexin, use la funcin mysql_connect como sigue:

Sconexi on=mysql_connect
("di recci o n " ,"cuentamysql", "el a v e " )
or die ("mensaje");

Complete la siguiente informacin:

di r ec c i or: El nombre del PC donde MySQL est instalado: por ejemplo,


servidordb.miempresa.com.Sila base de datos MySQL est en el mismo
PC que su sitio web, puede usar 1ocal host como el nombre del PC. Si esta
informacin est en blanco (""), PHP asume que es 1 ocal host.

cuentamysql: En nombre de su cuenta MySQL. (Discuto las cuentas


MySQL en detalle en el Captulo 5). Puede dejar esta informacin en
blanco (""), lo cual significa que cualquier cuenta puede conectarse; pe
ro, generalmente, esa es una mala idea por razones de seguridad.

el ave: La contrasea de su cuenta MySQL. Si su cuenta MySQL no re


quiere de una contrasea, no digite nada entre las comillas:

^ v* mensaje: El mensaje que se enva al buscador si la conexin falla. La


conexin falla si el PC o la red estn cados o si el servidor MySQL no es
t corriendo. Tambin puede fallar si la informacin brindada no es co-
: rrecta: por ejemplo, si hay un error de digitacin en la contrasea.

Sera bueno que usara un mensaje descriptivo durante el desarrollo, tal


como No se pudo conectar al servidor, pero use un mensaje ms
general adecuado para los clientes una vez que la aplicacin est en uso,
tal como El catal ogo de mascotas no esta disponible por el
momento. Por favor intente de nuevo mas tarde.

La di recci on incluye un nmero de puerto necesario para la conexin. Casi


siempre, el nmero del puerto es 3306. En algunas pocas ocasiones, el admi
nistrador de MySQL necesita configurar MySQL para conectarse a un puerto
diferente. En esos casos, el nmero de puerto es obligatorio para la conexin.
El nmero de puerto se especifica as n o m b re hu es pe d: numeropuerto. Por
ejemplo, usted podra usar 1 ocal h o s t :8808.

Con estos enunciados, mysql_connect trata de abrir una conexin con el PC nom
brado, usando el nombre de la cuenta y la contrasea proporcionados. Si la conex
in falla, el programa deja de correr en ese punto y enva el mensaje al explorador.

El siguiente enunciado se conecta al servidor MySQL en el PC local usando


una cuenta MySQL llamada catal ogo que no requiere de una contrasea:
Captulo 8: Datos entran, datos salen

Manejo de errores en MySQL


Las funciones m y sq l , ta les com o mysql_connect y mysql_query, se usan en el lenguaje
PHP para in te ra c tu a r con las base de datos M ySQ L. Si una de estas fu n c io n es no se ejecuta co
rrecta m e n te, se enva un m ens aje de e rro r M y S Q L con inform acin sobre el problem a. Sin em bar
go, este m en s aje de e rro r no ser en viad o al explo rador, a m eno s que el program a lo m ande
delib erad am en te. Estas son las tres form as com u nes de llam ar a las fu n c io n es my s q 1:

Llamara la funcin sin manejo de errores. La funcin es llam ada sin ningn enun ciado que brin
de m ensajes de error. Por ejem plo, la funcin mysql_connect se puede llam ar com o sigue:
Iconexion = mysql_connect($huesped,$usuario,$clave);
Si este e n u n ciad o falla (por ejem p lo, la cu en ta no es vlida), la conexin no se hace, pero los
e n un ciados restantes en el program a continan ejecu tn d o se. En m uchos casos, esto no es
til porque algunos de los enun ciados en el resto del program a (tal com o e x tra e r o alm acenar
datos en la base de datos) podran d e p e n d e r de co n tar con una conexin abierta.

Llamar a la funcin con un enunciado die. La funcin es llam ad a con un enun ciado d i e que
enva un m ensaje al buscador. Por ejem plo, la funcin mysql^connect se puede llam ar as:

Sconexion = mysql_connect($huesped,$usuario,$clave)
or die ("No se pudo conectar al servidor ");

S este enunciado falla, la conexin no se h ace y el enunciado d i e se ejecu ta. El enunciado d ie


d etie ne el program a y enva el m ensaje al explorador. Si la conexin no se puede establecer, nin
gn otro enunciado se ejecuta. Usted puede pon er el m ensaje que desee en el enunciado d ie.

Llamar a la funcin en un enunciado if. La funcin es llam ada usando un en un ciado i f que
e je c u ta un bloque de enunciados si la conexin falla. Por ejem plo, la funcin mysql__con-
nect puede llam arse as:
if (!Sconexion = mysql_connect($huesped,$usuario,$clave))

Smensaje = mysql_error();
echo n$mensaje<br>";
di e ();
}
Si esta conexin falla, los enunciados en el bloque i f se ejecutan. La funcin mysql_error
devuelve el m ensaje de error de M y S Q L y lo guarda en la variable mensa je. Luego, se hace
eco al m ensaje de error. El enunciado d i e term ina el program a, de modo que ningn otro enun
ciado se ejecu ta. Note e l ! (signo de adm iracin ) en el enunciado i f. I significa "not". En otras
palabras, el enunciado i f es verdadero si el enunciado de asignacin no es verdadero.

El m anejo de erro re s que usted quiera incluir en su program a dep en d er de lo que espera que su
ceda en el program a. Al desarrolla r el program a, se espera que ocurran algunos errores. Por en
de, d u ra n te el de sa rro llo , usted p ro b a b lem en te qu err un m anejo de errores que sea ms
descriptivo, ta l com o el te rc e r m todo de la lista anterior. Por ejem plo, suponga que est usando
una cuenta llam ad a root para te n e r a c c e s o a su base de datos y que com ete un error de digita
cin, com o en tos enunciados siguientes:
196 Parte III: PHP

$huesped = " l o c al ho st ";


$usuario = " r a z " :
$contrasea =
if (!$conexi%n = m y sq l_ co nn ec t($ hu es pe d,$u s u a r i o ,Scontrasea))

mensaje = my s q l _ e r r o r ( );
echo " $ m e n s aj e< br >";
d ie ();
1
Com o dgito Yaz" en lugar de "ra i z.,vera un m ensaje de erro r p arecido al siguiente:
Acceso negado al usuario: 'raz@localhost' (Contrasea usada: NO)

Este m ensaje de erro r tien e la info rm aci n que usted necesita para averiguar cul es el problema;
m uestra su nom bre de cuen ta con el erro r de digitacin. Sin em bargo, una vez que su program a est
corriend o y los clientes lo estn usando, usted probablem ente no querr que sus usuarios vean un
m ens aje de e rro rt c n ic o com o el anterior. En cam bio, usted seguram ente preferir usar el segundo
m todo con un enunciado g eneral en el m ensaje di e,tal como El catalogo de mascotas no
esta disponible por el momento. Por favor intente de nuevo mas tarde.

$conexion = m y s q l _ co nn ec t("1 ocalhost ,"cata!ogo , )


or die ("No se pudo conectar al servidor.");

Por razones de seguridad, es una buena idea almacenar la informacin de la cone


xin en variables y usar las variables en el enunciado de conexin, como sigue:

$ h u s pe d- "! oc alh os t";


$usuari o = " c a t a l o g o " ;
$ c la ve =" ";
$conexion - mysql_connect($huesped,$usuario,$clave)
or die ("No se pudo conectar al servidor.");

De hecho, para tener an ms seguridad, usted puede poner los enunciados


de asignacin para los datos sobre la conexin en un archivo separado, en un
lugar oculto, de m odo que el nombre de la cuenta y la contrasea no estn ni
siquiera en el programa. Le explico cmo hacerlo en el Captulo 10.

La variable Sconexion contiene informacin que identifica la conexin. Us


ted puede tener ms de una conexin abierta al mismo tiempo usando ms
de un nombre de variable. Una conexin permanece abierta hasta que usted
la cierre o el programa termine. Una conexin se cierra as:

my sq l_ c1 os e($nombreconexion);

Por ejemplo, para cerrar la conexin del ejemplo anterior, use este enunciado:

mysql_close($conexi o n ) ;
_____________________________Captulo 8: Datos entran, datos salen

Seleccionar la base de datos correcta


Una vez establecida y abierta la conexin con el servidor MySQL, usted nece
sita decirle a MySQL con cul base de datos desea interactuar. Use la funcin
my s q 1_s e 1e c t_d b como sigue:

$db =
mysql_select_db("nombrebasededatos",Snombreconexi on)
or die ( "m ensaje");

Rellene la siguiente informacin:

| v0 nombrebasededat os : El nombre de la base de datos.

| r0 nombreconexi o n : La variable que contiene los datos sobre la conexin. Si


| usted no introduce una conexin, PHP usa la ltima conexin que fue abierta.
Il
j mensaj e: El mensaje que se enva al explorador si la base de datos no
I se puede seleccionar. La seleccin podra fallar porque la base de datos
I no fue encontrada, lo cual generalmente es el resultado de un error de
digitacin en el nombre de la base de datos.

Por ejemplo, usted puede seleccionar la base de datos Catal ogodemascotas


con el siguiente enunciado:

$db = mysqlselect_db("Catalogodemascotas",Iconexi on)


or die ("No se pudo seleccionar la base de datos.");

Si mysql_select_db no puede seleccionar la base de datos, el programa se


detiene en este punto y el mensaje No se pudo seleccionar la base de
datos se enva al explorador.

Por razones de seguridad, es una buena idea almacenar el nombre de la base


de datos en una variable y usar la variable en el enunciado de conexin, co
mo sigue:

$basededatos = "Catalogodemascotas";
$db = mysql_se1ect_db(Ibasededatos, c on ex io n)
or die ("No se pudo seleccionar la base de datos.");

De hecho, para mayor seguridad an, usted puede poner el enunciado de asig
nacin para el nombre de la base de datos en un archivo separado, en una ubi
cacin escondida (tal como se sugiri para los enunciados de asignacin para
la informacin conexin), de modo que el nombre de la base de datos no est
ni siquiera en el programa. Le explico cmo hacerlo en el Captulo 10.

La base de datos permanece seleccionada hasta que usted explcitamente se


leccione una base de datos diferente. Para seleccionar una base de datos di
ferente, slo use un nuevo enunciado de funcin my sql _sel e c t_ db.
Enriar consultas SQL
Una vez abierta la conexin con el servidor MySQL, y cuando PHP sepa con
cul base de datos usted desea interactuar, usted enva su consulta SQL. La
consulta es una solicitud al servidor MySOL de que almacene, actualice o re
cupere algunos datos. (Consulte el Captulo 4 para ms informacin sobre el
lenguaje SQL y cm o construir consultas en SQL).

Para interactuar con la base de datos, ponga su consulta SQL en una variable y
envela al servidor MySQL usando la funcin my s q 1_q ue ry , com o en el ejem
plo siguiente:

consulta = "SELECT * . FROM M a s c ot a ;


$resultado = mysql_query($consulta)
or die ("No se pudo ejecutar la c n s u l t a .");

La consulta se ejecuta en la base de datos seleccionada para la ltima cone


xin que usted abri. Si fuera necesario (si usted tuviera ms de una cone
xin abierta, por ejemplo), puede enviar la consulta a un servidor de la base
de datos especfico as:

Iresultado = mysql_query($consu7ta,$conexion)
or die ("No se pudo ejecutar la consulta.");

La variable $resul tado guarda informacin sobre el resultado de la ejecu


cin de la consulta. La informacin depende de si la consulta obtiene infor
macin de la base de datos o no:

^ Para consultas que no obtienen datos: La variable Iresultado contiene infor


macin sobre si la consulta se ejecut satisfactoriamente o no. Si fue exitosa,
$resul tado se establece en VERDADERO; si no lo fue, r e s u l tado se establece
en FALSO. Algunas consultas que no devuelven datos son INSERT y UPDATE.

v* Para consultas que devuelven datos: La variable Iresultado contiene


un identificador de resultado que identifica dnde estn los datos obte
nidos, y no los datos obtenidos en s. Algunas consultas que s devuel
ven datos son SELECT y SHOW.

El uso de comillas dobles y simples puede resultar algo confuso al asignar la


cadena de consulta a Iconsul ta. En realidad, las comillas se usan en dos ni
veles: las comillas necesarias para asignar la cadena a Iconsul ta y las comi
llas que son parte de la consulta en lenguaje SQL. Las siguientes reglas le
ayudarn a evitar problemas con las comillas:

Use comillas dobles al comienzo y al final de la cadena.

w Use comillas simples antes y despus de los nombres de variables.

I i> Use comillas simples antes y despus de cualquier valor literal.

Los siguientes son ejemplos de cmo asignar cadenas de consulta:


Captulo 8: Datos entran, datos salen

I c o n s u l t a = "SELECT nombre FROM M i e m b r o " ;


I c o n s u l t a = "SELECT nombre FROM Miembro WHERE apel V i d o = P e r e z ;
I c o n s u l t a = "UPOATE Miembro SET a p e l i i d o = ' $ a p e l l i d o ' " ;

La cadena de consulta misma no incluye un punto y coma (;). Por lo tanto, no


ponga un punto y coma dentro de la ltima comilla. El nico punto y coma es
t al final; este es el punto y coma de PHP que termina el enunciado.

Extraer in formacin de una base de datos


Extraer informacin de una base de datos es una tarea comn en las aplica
ciones con bases de datos para la Web. Estos son dos usos comunes dados a
la informacin de una base de datos:

| v0 Use la informacin para ejecutar enunciados condicionalmente. Por ejem-


| po, usted podra obtener la ciudad de residencia del Directorio de miembros
| y enviar diferentes mensajes a los miembros que viven en ciudades distintas.
ft
| Despliegue la informacin en una pgina web. Por ejemplo, tal vez us-
1 ted quiera mostrar informacin sobre productos en su base de datos.

Para poder usar la informacin de una base de datos en un programa, usted


necesita poner la informacin en variables. Despus, puede usar las variables
en enunciados condicionales, enunciados echo u otros enunciados. Extraer
informacin de una base de datos es un proceso que consta de dos pasos:

1. Se construye una consulta SELECT y se enva a la base de datos. Cuando


la consulta se ejecuta, los datos seleccionados se almacenan en una ubi
cacin temporal.

2. Se mueven los datos de la ubicacin temporal a las variables y se usan


en el programa.

Enriar una consulta SELECT


La consulta SELECT se utiliza para obtener datos de una base de datos. Las
consultas SELECT se escriben en lenguaje SQL. (Discuto la consulta SELECT
en detalle en el Captulo 4.)

Para extraer datos de la base de datos, construya la consulta SELECT que ne


cesita, almacnela en una variable, y luego enve la consulta a la base de da
tos. Los siguientes enunciados seleccionan toda la informacin de la tabla
Mascotas en la base de datos Catal ogodemascotas:

Iconsulta = "SELECT * FROM Mascota":


Iresultado = mysql ..query(Sconsul t a )
or die ("No se pudo ejecutar la consulta."):
200 Parte III: PHP

La funcin my s q 1_q u e ry extrae los datos solicitados por la consulta S E L ECT y


los almacena en una ubicacin temporal. Imagine que estos datos se almacenan
en una tabla, parecida a la tabla MySQL, con la informacin en filas y columnas.

La funcin devuelve un identificador de resultado que contiene la informacin ne


cesaria para encontrar la ubicacin temporal donde los datos estn almacenados.
En los enunciados anteriores, el identificador de resultado se pone en la variable
Sresultado.El siguiente paso despus de ejecutar la funcin es mover los datos
desde su ubicacin temporal hacia variables que se puedan usar en el programa.

Si la funcin falla (por ejemplo, si la consulta es incorrecta) Sresultado con


tiene F A L S O .

Extraer y usar los datos


La funcin mysql_fe'tch_array se usa para extraer los datos de su ubica
cin temporal. La funcin extrae una fila de datos de la ubicacin temporal.
La tabla temporal de datos podra contener slo una fila de datos o, ms pro
bablemente, su consulta select podra dar como resultado ms de una fila de
datos en la tabla temporal de datos. Si necesita tomar ms de una fila de da
tos de la ubicacin temporal, use la funcin mysql_fetch_array en un ciclo.

Extraer una {Ha de datos


Para mover los datos de su ubicacin temporal y ponerlos en variables que pue
dan usarse en su programa, se utiliza la funcin PHP mysql _fetch_a rray. El
formato general dl a funcin mysql_fetch_array es

$fi 1a = mysq]jfetc\\__array( $ i d e n t i f ica d o rd e re su l t a d o , t i p o d e a r r e g l o );

Este enunciado toma una fila de la tabla de datos en la ubicacin temporal y la po


ne en una variable de arreglo llamada $f i 1 a. Complete la siguiente informacin:

i den t i f i cadorderesul tado: La variable que seala hacia la ubicacin


temporal de los resultados.
v* t ipodearreg lo: El tipo de serie en la cual se ponen los resultados. Puede ser
uno de dos tipos de series o ambos tipos. Use uno de los valores siguientes:

MYSQL_NUM: Un arreglo con una pareja de clave y valor para cada


columna en la fila, la cual usa nmeros como claves.

1 MYSQL__ASSOC : Un arreglo con una pareja de clave y valor para ca


da columna en la fila, la cual los nombres de columnas como claves.

| MYSQL_BOTH: Un arreglo con ambos tipos de claves. En otras pala


bras, el arreglo tiene dos parejas de clave y valor para cada colum
na: uno con un nmero como clave y uno con el nombre de la
columna com o clave. Si no se especifica el tipo de serie en el llama
se do de funcin, se asume que es MYSQL^BOTH .
Captulo 8: Datos entran, datos salen

La funcin my s q 1_fet c h_a r ray extrae una fila de datos de la ubicacin tem
poral. En algunos casos, una fila es lo nico que usted seleccion. Por ejemplo,
para verificar la contrasea digitada por un usuario, slo necesita obtener la
contrasea del usuario de la base de datos y compararla con la contrasea que
el usuario digit. Los siguientes enunciados revisan una contrasea:

lentradadelusuario = "secreta"; // contrasea digitada por


el usuario en el formulario
$consulta = "SELECT contrasea FROM Miembro
WHERE nombredeentrada='asmith"':
Sresultado = mysql_query($consulta)

or die ("No se pudo ej e c u t a r l a . c n s u l t a ;


$fi 1 a = mysql_fetch_array($resultado,MYSQL_ASSOC);
f ( $entradadelusuario == $fi1a [ 'el a v e '] )

echo "Entrada acep ta da <b r> ";


enunciados que muestran las paginas web exclusiva para miembros

1 se

echo "Clave in va li da <b r> ";


enunciados que permiten al usuario probar otra contrasea

Observe los siguientes puntos sobre los enunciados anteriores:

1 ^ La consulta SELECT solicita nicamente un campo (contrasea) de una


fila (la fila para gsmi th).
^ La funcin mysql_fetch_a rray devuelve un arreglo llamado $f i 1 a con
nombres de columnas com o claves.

\ v* El enunciado i f compara la contrasea que el usuario digit ($entrada-


I deusuar io) con la contrasea obtenida de la base de datos ($f i 1a [ ' con-
| trasea ' ] ) para ver si son iguales, usando los dos signos de igual (==).

* Si la comparacin es ve rd a d e r a, las contraseas concuerdan, y el bloque


i f (el cual muestra las pginas web exclusivas para miembros) se ejecuta.
| Si la comparacin no es verdadera, el usuario no digit una contrasea
| que concuerda con la contrasea almacenada en la base de datos, y el blo-
| que e 1 s e se ejecuta. El usuario ve un mensaje de error que le indica que la
3 contrasea no es correcta y se le devuelve a la pgina web de registro.

PHP brinda un atajo que resulta conveniente para usar variables recuperadas
con la funcin mysq!_fetch_array. Usted puede usar la funcin extract, la
cual divide el arreglo en variables que tienen el mismo nombre que la clave.
Por ejemplo, puede usar la funcin extract para reescribir los enunciados
anteriores para comprobar la contrasea. As se hace:
202 Parte III: PHP

$entradadeusuario = "secreta"; #clave que el usuario digito


en el formulario HTML
Sconsulta = "SELECT contrasea FROM Miembro
WHERE nombredeentrada='gsmi t h '";
Sresultado = mysql_query($consulta)
or die ("No se pudo ejecutar la consulta.");
$fila = mysql_fetch_array($resultado,MYSQL__ASSOC);
extract($fila);
if ( $entradadeusuario == $clave )
{
echo "entrada a c e p ta da <b r> ";
enunciados que muestran las paginas web exclusivas para miembros
1
el se
{
echo "clave inva li da <b r> ";
enunciados que permiten al usuario probar otra contrasea

Usar un ciclo para obtener todas tas filas de datos


Si seleccion ms de una fila de datos, use un ciclo para extraer todas las fi
las de la ubicacin temporal. Los enunciados del ciclo en el bloque de ciclos
extraen una fila de datos y la procesan. El ciclo se repite hasta que todas las
filas se hayan recuperado. Puede usar un ciclo wh i 1 e o un ciclo for para re
cuperar esta informacin. (Para ms detalles sobre los ciclos whi 1 e y for,
consulte el Captulo 7.)

La manera ms comn de procesar la informacin es usar un ciclo whi 1e co


mo sigue:

while ( $fi 1 a = my sq l_ fe tch_array($resultado))


{
bloque de enunciados
1

Este ciclo se repite hasta haber recuperado la ltima fila. Si usted deseara
simplemente hacer eco de todos los datos, por ejemplo, usara un ciclo pare
cido al siguiente:

while ( $fi 1 a = my sq l_ fetch_array( r e s ul ta do ))


(
extractf $fila);
echo "$Tipo_mascota: $N ombre_mascota<br>";
1

Ahora, fjese en el ejemplo de cmo obtener informacin para la aplicacin Ca


tlogo de mascotas. Asuma que el Catlogo de mascotas tiene una tabla llamada
Mascota con cuatro columnas: Idmascota, Ti pomadescota , Descripcion-
mascota y precio. La Tabla 8-1 muestra un conjunto de datos de muestra pa
ra la tabla Mascota.
Captulo 8: Datos entran, datos salen

Tabla 8-1 Datos de muestra para la tabla M ascota


Nombremascota Tipomascota Descripcinmascota Precio

U nicornio Caballo Cuerno en espiral centrado en la frente 10000

Pegaso Caballo Volador; alas brotan de su espalda 15000

Pony Caballo M u y pequeo; la mitad del tam ao 500


de un caballo estn dar

D ragn asitico D ragn Cuerpo serpentino 30000

D ragn m edieval D ragn Cuerpo parecido al de una lagartija 30000

Len Gato Grande; m elenudo 2000

Grifo Gato Cuerpo de len; cabeza de guila; alas 25000

El programa 1 i stadodema scota .php en la Lista 8-1 selecciona todos los caba
llos de la tabla Mascota y despliega la informacin en una tabla HTML en la p
gina web. La variable $ti pomascota contiene informacin que un usuario
digit en un formulario.

L is ta 8-1: M u e s tra e le m e n to s del C a t lo g o d e m a s c o ta s


? php
/* Programa: 1 istado de Ma sc ota s.php
* Descripcin: Muestra todas las mascotas en la categoria
seleccionada.
*/ '
?>
<html>
<head><title>Catalogo de ma s c o t a s < / t i t l e X / h e a d >
<body>
< ? php
$u su ar io =" ca tal og o";
$huesped=" lo cal ho st ";
$clave="";
Ibasededatos = "Cata!ogodemascotas";
$conexi on = mysql__connect($huesped ,$usuari o,$cl ave)
or die ("No se pudo conectar al servidor");
$db = mysql_select_db($basededatos,$conexion)
or die ("No se pudo seleccionar la base de datos");
$tipomascota = "caballo"; //caballo fue digitado en un
formulario por el usuario
{cnsulta = "SELECT * FROM Mascota WHERE
'Tipomscota='$tipomascota'";
{resultado = mysql query(iconsulta)
or die ("No se pudo ejecutar la consulta.");

/* Mostrar resultados en una tabla */


{tipojnascdta = ucfi rst($tipomascota)." s " ;
20b Parte III: PHP

echo "<tr><td c o l s p a n - '3'><hr></1d ></1r > ;


while ($fi 1 a = mysql__fetch_array(Sresultado))
{
e x t r a c t d f i 1 a );
$f_precio = nu mb er _format(Sprecio,2);
echo "<tr>Yn
<td>$Noi7ibremascota</td>\n
<td>$Descri pe i onmascota</td>\n
<td align='right'>\$$f__precio</td>\n
</tr>\n";
echo " C t r X t d c o l s p a n = 3 ><hr >< /t d> </ tr> \n ";
}
echo "</tabla>\nM ;
?>
</body></html>

La Figura 8-1 muestra la pgina web desplegada por el programa de la Lista 8-


1. La pgina web muestra los elementos Mascota para el Ti podemascota ca
ballo; el despliegue est formateado como una tabla HTML.

3 P e t C a td lo - M ic r o s o ft In te r n e t E x p lo r e r mmes

'M j
F ile ld it tfn 'W H t f iif iU '? 1 u n s H e lp
: j b
^ . 0 3 <a | na* j y , ^
; f j i Stop Rsfos*h Home Seerch Favoritas Pnrrf
; AjicIrsS S http: //janetval. san. fr com/PHP&MyS QLforD umrmes/pefDescrsp pfip "*] ^G o ! L .n ks **| i T n .

H orses

Unicom spiral hom centered tn forehead $10,000.00

Pegasus flying; wrngs sprouting ftom back $15,000 00

Pony very small; half the size of standard horse $500.00

Figura 8-1:
La pgina
w eb resul
tante de
1 i s ta d o -
dem asco
t a s .p h p .
t]
Captulo 8: Datos entran, datos salen

El programa de la Lista 8-1 usa un ciclo while para extraer todas las filas de la ubica
cin temporal. En algunos casos, quizs usted necesite usar un ciclo f o r . Por ejem
plo, si debe usar un nmero en su ciclo, un ciclo f o r es ms til que uno while.

Para usar un ciclo f or, necesita saber cuntas filas de datos se selecciona
ron. Puede averiguar cuntas filas hay en el almacenaje temporal usando la
funcin PHP mysql_num_rows como sigue:

$nfi 1 as = my sq l_num_rows(lresultado);

La variable $nf i 1as contiene el nmero de filas almacenadas en la ubicacin


temporal. Usando este nmero, usted puede construir un ciclo f or para obte
ner todas las filas, com o sigue:

for ($i=0;$i<$nfilas;$++)
{
$fila = mysql_fetch_array($resul t a d o ) )
bloque de enunciados;
}

Por ejemplo, el programa en la Lista 8-1 muestra los elementos Ma s c o t a del ti


po cabal 1o. Suponga que usted desea numerar cada elemento. La Lista 8-2
muestra un programa, 1 i stanumerada . php, el cual despliega una lista nume
rada usando un ciclo for.

Lista 8-2: M u estra una lista num erada de elem entos del C atlogo de m ascotas
<?php .
/* Programa: listanNumerada.php > j
* Descripcin: Muestra una lista numerada de todas 1 as
mascotas en la categoria seleccionada.
*/
?> . - ' '
<html>
C h e a d X t i t i e>Catalogo de mascotasC/titie></head>
<body>
<?php
lusuari o= "c at al og o";
$hu sped-"1oca 1h o s t " ;
I c la ve ="";
Ibasededatos = "Catalogodemascotas";
Iconexion = mysql_connect($huesped,$usuario,$clave)
or die ("No se pudo conectar al servidor ");
$db = mysql_select_db($basededatos,Iconexion)
or die ("No se pudo seleccionar la base de datos");
Itipomascota = "caballo"; //caballo fue digitado en un
formulario por un usuario
I c o n s u l t a = "SELECT * iFRQM Mascota WHERE
ti p o m a s c o t a = Itipomascota ";
Iresultado = mysql_query($consuIta)
or die ("No se pudo ejecutar la consulta.");
Infilas = mysql_num_rows(lresul t a d o ) ;
206 Parte III: PHP

/* Mostrar los resultados en una tabla */


echo "< hl >C ab an os </h l> ";
echo "<table cellspacing='15'>";
echo "<tr><td col s p a n = '4 'X h r X / t d X / t r > " ;
for ($i=0 ; $i<$nfi 1 a s ;$i++)
{
$n = $i + 1; #sumar 1 para que los nmeros no empiecen
en 0
$fila = mysql_fetch_array($resultado);
extract($fi la);
$f_precio = number_format($precio,2);
echo "<tr>\n
< t d > $ n .</td>\n
<td>$Nombremascota</td>\n
<td>$Descri peionmascota</td>\n
<td al i g n = 'righ t>\$$f_precio</td>\n
</tr>\n" ;
echo " < t r X t d colspan='4,X h r X / t d X / t r > \ n " ;
}
echo "</tabla>\n";
?>
</bodyX/html >

La Figura 8-2 muestra la pgina web que resulta de usar el ciclo for en este
programa. Observe que un nmero aparece antes de cada elemento Mascota
en esta pgina web.

Figura 8-2:
Pgina w eb
resultante
de p e t -
D e s c ri p-
F o r. php.
Captulo 8: Datos entran, datos salen

Usar funciones para extraer datos


En la mayora de las aplicaciones, los datos se obtienen de la base de datos.
A menudo, usted extrae datos en ms de una ubicacin de su programa o
ms de un programa en su aplicacin. Las funciones (bloques de enunciados
que realizan ciertas tareas especficas) estn diseadas para tales situacio
nes. (Le explico las funciones en detalle en el Captulo 7.)

Una funcin para extraer datos de una base de datos puede ser realmente
muy til. Cada vez que el programa necesite extraer datos, usted llama a la
funcin. Las funciones no slo le ahorran mucha digitacin, sino que tambin
hacen que el programa sea ms fcil de seguir.

Por ejemplo, considere un catlogo de productos, como el Catlogo de mas


cotas. Necesitar extraer informacin sobre un producto especfico muchas
veces. Puede escribir una funcin que extraiga los datos y luego usar dicha
funcin cada vez que los necesite.

La lista 8-3 para el programa obtienedatos.php muestra cmo usar una funcin
para extraer datos. La funcin en la Lista 8-3 obtendr la informacin para cual
quier mascota en el Catlogo de mascotas. La informacin sobre la mascota se
pone en un arreglo, y el arreglo se devuelve al programa principal. El programa
principal puede luego usar la informacin de cualquier forma que quiera. En este
caso, hace eco de la informacin de la mascota en una pgina web.

L ista 8-3: E x trae d a to s de una base de d ato s u san d o una fu n ci n


<7 php
/* Programa: obtieneDatos.php
* Descripcin: Extrae datos de una base de datos usando una
funcin
*/
?>
<html>
< h e a d > < t i t l e X a t a logo de m a s c o t a s < / t i t l e X / h e a d >
<body>
<?php
$usuario="catalogo";
$huesped="localhost";
$clave="";
$conexion = mysql_connect($huesped,$usuario,$clave)
or die ("No se pudo conectar al servidor");

SInfomascota = extraerlnfomascota"Unicornio");
//llamar funcin

$f_precio = number_format(SInfomascota['precio],2);
echo " < p X b > { $ I n f o m a s c o t a [ 'Nombremascota'] } < / b X b r > \ n
Descripcin:
($lnfomascota['Descripcionmascota']K b r > \ n
Precio: \${$Infomascota['precio']}\n"
208 Parte III: PHP

?> :
</body></htm1 >

<?pf'.p
f uncti on extraerlnfomascota ($ Nmbrenlas c o t a )
{
$db = my sq1_select_db("Cata!ogodemascotas")
or die ("No se pudo seleccionar la base de datos");
Sconsulta = "SELECT * FROM Mascota WHERE
No mbremascota='INombremascota'";
$resultado = my sq l_query($ cnsul t a )
or die ("No se pudo ejecutar la consulta.");
return mysql_fetch_array($resultado,MYSQL_ASSOC);
1
?>

La pgina web muestra

Unicornio
DescriDcion: cuerno en esDiral c en t r a do en la fren t e
Precio: $10,000.00

Observe lo siguiente sobre el programa en la Lista 8-3:

u* El programa es ms fcil de leer con el llamado de funcin de lo que sera


si todos los enunciados de la funcin estuvieran en el programa principal.

| u* Usted se puede conectar con el servidor MySQL una vez en el programa


principal y llamar a la funcin muchas veces para extraer los datos. Si la
conexin estuviera en la funcin en lugar de en el programa principal, se
conectara cada vez que usted llamara la funcin. Es ms eficiente co
nectarse slo una vez, si es posible.

>* u* Si tiene slo una conexin, mysql_sel ect_db usar esa conexin. Si tie
ne ms de una conexin, usted puede pasar la conexin y usarla en su
llamado de funcin mysql_sel ect_db. Si su aplicacin slo usa una ba
se de datos, usted puede seleccionarla una vez en el programa principal
en lugar de seleccionarla en la funcin.
v0 El llamado de funcin enva la cadena "Uni corni o". En la mayora de los
casos, el llamado de funcin usar el nombre de una variable.
El programa crea la variable $ Inf orna se ota para recibir los datos de la
funcin. Sntomas cota es un arreglo porque la informacin almacenada
en el es un arreglo.

La funcin anterior es muy simple: devuelve una fila de los resultados como
arreglo. Pero las funciones pueden ser ms complejas. La seccin anterior
proporciona un programa para extraer todas las mascotas de un tipo espec
fico. El programa obti enemascotas .php en la Lista 8-4 usa una funcin para
el mismo propsito. La funcin devuelve un arreglo multidimensional con los
datos de mascota para todas las mascotas del tipo especificado.
Captulo 8: Datos entran, datos salen

L is ta 8 -4 : M u e s tra u n a lis ta n u m e ra d a de m a s c o ta s u s a n d o una fu n c i n


<?php
/* Programa: ob t i e n e M a s c o t a s .php
* Descripcin: Muestra una lista numerada de elementos de
una base de datos.
*/
?>
<html>
<head><titie>Catalogo de m a s c o t a s < / ti tle X/ he ad >
<body>
<?php
S u s u a r i o =" ca tal og o";
$ h ue sp ed =" lo cal ho st ";
S e l a v e = " ";
$conexi on = mysql_ co nn ec t($ hus pe d,Susuario,$cl a v e )
or die ("No se pudo conectar al servidor"):

$Info_jnascotas = extraertipodemascotas"cabal! o " ):


//llamar funeion

/* Mostrar los resultados en una tabla */


echo "<hl>Cabal1o s < / h l > " ;
echo "<table cellspacing='15'>";
echo " < t r X t d col s p a n = '4' > < h r X / t d X / t r > " ;
for ($i=l;$i<=pesode($Infomascotas);$i++)
{ x x x..,:; x :x .--i
$f...precio - number format
($lnfoinascotas[$i JL preci o' ],?):
echo "<tr>\n
<td>$ i .</td>\n
<t d>{$Infomascotas[$i]['Nombremascota']}</td>\n
<td>$nfomascota[$i ]['Descripcionmascota] </td>\n
<Ld al i g n - r ight'>\$$f_precio</td>\n
"</tr>\n"; : "
echo " < t r X t d c o l s p a n = 4 ' X h r X / t d > < / t r > \ n " ;
} . .
echo "</tabla>\n":
?> . '
</bodyX/html >

<?php
function extraertipodemascotas($Tipomascota)
{
$db = mysql_select_db("Catalogodemascotas")
or die ("No se pudo seleccionar la base de datos");
$consulta = "SELECT * fROM Mascota WHERE
Ti p o m a s c o t a = $Tipom as co ta'";
Sresultado = mysql..query($consul ta)
or die ("No se pudo ejecutar la consulta.");

$j = 1:
whi 1 e ($fi 1 a=mysql_fetcharray(Sresultado.MYSQL_ASSOC))
210 Parte III: PHP

f or e ac h ( $ f i l a como Snombrecolumna => S v a l o r )



$s er i e [ $j ] [ $nombr e c ol umna] = $v a ! o r ;
}
$j+ + ;
}
return $ s e r i e ;
}
?>

El programa en la Lista 8-4 procede como sigue:

1. Se conecta con el servidor MySQL en el programa principal.

2. Llama a la funcin e x t r a e r t i p o d e m a s c o t a s . Pasa "cabal 1o" como


una cadena de caracteres y tambin establece $ I nf orna se otas para que
pueda recibir los datos devueltos por la funcin.

3 . La funcin selecciona la base de datos C a t o l o g o d e m a s c o t a s .

4 . La funcin enva una consulta para extraer todas las filas con c a b a l 1 o
en la columna Ti p o d e m a s c o t a . Los datos se almacenan en una tabla en
una ubicacin temporal. La variable Sr e s ul t ado identifica la ubicacin
de la tabla temporal.

5. Establece un contador. $j es un contador que se incrementa en cada


ciclo. Empieza en 1 antes del ciclo.

6. Inicia un ciclo whi 1e. La funcin intenta extraer una fila de la tabla tem
poral de datos y resulta exitosa. Si no hubiera filas para extraer en la
ubicacin temporal, el ciclo whi 1e terminara.

7. Inicia un ciclo f oreach. El ciclo se mueve por la fila y procesa cada campo.

8. Alm acena los valores en el arreglo. S ntomas c o t a s es un arreglo


multidimensional. Su primera clave es un nmero, el cual est esta
b lecido por el contador. Como esta es la prim era v e z que se atravie
sa el ciclo whi 1e, el contador, $j, es ahora igual a 1. Todos los
cam pos en la fila se almacenan en $ I n f o ma s c o t a s con el nombre
de la columna com o clave. (Explico las series multidimensionales en
detalle en el Captulo 7.)
9. Incrementa el contador. $j aumenta en 1.

1 0 . Llega al final del ciclo whi 1 e.

1 1. Regresa al inicio del ciclo whi 1e .

12. Repite los Pasos 6 11 para cada fila en los resultados.

1 3 . Devuelve $ser i e al programa principal. $seri e contiene todos los


datos para todas las filas seleccionadas.
1 4 . $ I n f o m a s c o t a s recibe datos de la funcin. Todos los datos se pasan.
La Figura8-3 muestra la estructura de $Inf omascotas despus de que
la funcin ha terminado de ejecutarse.
Captulo 8: Datos entran, datos salen 21
datosm ascota [1] [n o m b re m a s c o ta ] = u n ic o r n io
[d e s c rip c i n m a s c o ta ! = c u e rn o e s p ira l c e n tra d o al fre n te
Figura 8-3: [p re c io ] = 10000

La estruc
[2] [n o m b re m a s c o ta ] =pegaso
tura del [d e s c rip c i n m a s c o ta ] = v o la d o r alas bro tan de su esp a ld a
arreglo mul [p re c io ] =15 0 0 0

tidimensio
[3] [n o m b re m a s c o ta ] =pony
nal $ In f o - [d e s c rip c i n m a s c o ta ] =muy pequeo la mitad del tamao de un caballo estndar
m a s c o ta s . [p re c io ] =500

15. El programa principal enva las Descripciones de las mascotas al ex


plorador en una tabla HTML. Los datos apropiados se insertan desde el
arreglo Sl nf omascot as .

La pgina web resultante del programa en la Lista 8-4 es idntica a la pgina


web mostrada en la Figura 8-2, la cual es producida por un programa que no
usa una funcin. Las funciones no producen output diferente. Cualquier pro
grama que se pueda escribir usando una funcin, tambin puede escribirse
sin usar la funcin. Las funciones slo facilitan la programacin.

Obtener informacin del usuario


Muchas aplicaciones estn diseadas para formular preguntas que los usua
rios responden digitando informacin. A veces, la informacin se almacena en
una base de datos; otras, la informacin se usa en enunciados condicionales
para entregar una pgina web individual. Algunas de las tareas ms comunes
de las aplicaciones que requieren que los usuarios respondan preguntas son

| Hacer pedidos en lnea: Los clientes deben seleccionar productos y di-


gitar la informacin sobre el envo y el pago.


f
v0 Inscribirse: Muchos sitios requieren que los usuarios proporcionen al-
guna informacin antes de recibir ciertos beneficios, tales como tener
acceso a informacin especial o a software que se puede descargar.

Registrarse: Muchos sitios restringen el acceso a sus pginas. Los usua


rios deben digitar el nombre de una cuenta y una contrasea antes de
poder ver las pginas web.
u* Ver informacin seleccionada: Muchos sitios permiten a los usuarios
especificar cul informacin desean ver. Por ejemplo, un catlogo en l
nea podra permitir a los usuarios digitar el nombre del producto o se
leccionar una categora de productos que desean ver.

Las preguntas se formulan mediante formularios HTML. El usuario responde


las preguntas digitando informacin en el formulario o seleccionando ele-
2/2 Parte III: PHP

mentos de una lista. El usuario luego hace clic en un botn para enviar la in
formacin del formulario. Cuando el formulario es enviado, la informacin en
l se pasa a un segundo programa separado, el cual procesa la informacin.

En las siguientes secciones, no le informo sobre el HTML requerido para mos


trar un formulario; asumo que usted ya conoce HTML. (Si no lo conoce o ne
cesita un refrescamiento, consulte HTML 4 For Dummies, 4ta Edicin, por Ed
Tittel y Natanya Pitts; Wiley Publishing, Inc.). Lo que s le digo es cmo usar
PHP para desplegar los formularios en HTML y procesar la informacin que
los usuarios digitan en el formulario.

Usar formularios HTML


Los formularios HTML son muy importantes para los sitios web interactivos.
Si usted no conoce los formularios HTML, deber leer la seccin de formula
rios en algn libro sobre HTML. Para desplegar un formulario usando PHP,
puede hacer alguna de las siguientes operaciones:

J Use enunciados echo para hacer eco del HTML para un formulario.
| Por ejemplo:
it
< ? php
echo <form a c t i o n = pr ocesaformulario.p h p 1
J m e t h o d = ' P 0 S T >\n
<input :type='texto n o m b r e * 'n o m b r e '>\n
X i np ut type='submit' valor='enviar n o m b r e >\n
</form>\n";
?>
I
[. Use HTML simple fuera de las secciones en PHP. Para un formulario es-
| ttico simple, no hay razn para incluirlo en una seccin en PHP. Por
? ejemplo:
<?php
| enunciados en la seccin PHP
?>
<form action="procesaformulario.php" m e t h od =POST">
<input type="texto" nombre="Nombre">
<input type="submit" val or="envi ar nombre">
</form>
<?php
* enunciados en la seccin PHP
I ?>

Cualquiera de estos m todos produce el formulario que se muestra en la Fi


gura 8-4.
Captulo 8: Datos entran, datos salen

I 3 te s t fo rm - M ic r o s o ft In te r n e t E x p lo r e r IS I IE S l
i; tile til V il? # 1 e v e n to s lo o ls H e lp B | l

j * v v ' 3 <3 9 J
| Back - Fem ad, Stop , Refiesh Home '_ S 08rdh_ -ayantes ___ ______ j l
11 AEffireSS f e ] http7/|netval.san.ri.com/PHP&MySQLfoiDummi sxfyjfc&G o j j n k s * ] ] | |

Figura 8-4:
| ' S u b m ifN a m e |
Un formula
rio produci
do por
enunciados
H TM L -J
, j Done 9 Internet

Juan Cliente llena el formulario HTML. Hace clic en el botn Submit. Ahora
usted tiene la informacin que deseaba: su nombre. Entonces, dnde est?
Cmo puede tener acceso a l?

Usted obtiene la informacin en el formulario corriendo el programa que recibe la


informacin del formulario. Cuando se hace clic en el botn Submit, PHP automti
camente corre el programa. El parmetro a ct ion en la etiqueta del formulario le
dice a PHP cul programa correr. Por ejemplo, en el programa anterior, el parme
tro a ct i on=procesaformul ari o .php le dice a PHP que corra el programa
procesafo rmu 1ar i o, php cuando el usuario hace clic en el botn Submit. El pro
grama procesa-formulario.php puede mostrar, almacenar o usar de cualquier
otro modo los datos en el formulario que recibe cuando el formulario es enviado.

Cuando el usuario hace clic en el botn Submit, el programa especificado en


el atributo acti on corre, y los enunciados en dicho programa pueden extraer
la informacin del formulario a partir de series PHP incorporadas y usar la in
formacin en enunciados PHP. La Tabla 8-2 muestra las series incorporadas
que contienen la informacin del formulario.

Tabla 8-2 Series incorporadas con informacin de formularios


Serie Descripcin

$ _P0ST Contiene elementos para todos los campos incluidos en un


formulario si el formulario usa method=" PO S T " .

$HTTP_POST_VARS Igual que $ _ P 0 S T .

$ _GET Contiene todas las variables pasadas desde una pgina an


terior como parte del URL. Esto incluye los campos pasados
en un formulario usando m e th od =" ge t".

$HTTP_GET_VARS Igual que $ _ G E T .

$_REQUEST Contiene todos los elementos de las series que estn en


$_P0ST, $_GET y $_C00KIE.
2U Parte III: PHP

Cuando el formulario es enviado, el programa que corre puede obtener la in


formacin del formulario a partir del arreglo incorporado apropiado, como se
muestra en la Tabla 8-2. En estos arreglos incorporados, cada ndice de serie
es el nombre del campo de input en el formulario. Por ejemplo, si el usuario
digit Goliat Prez en el campo de input mostrado en la Figura 8-4 e hizo clic
en el botn Submit, el programa procesaformul ario, php corre y puede
usar una variable de arreglo en el formato siguiente:

$ _ P 0 S T [ 'n o m b r e ']

Observe que el nombre digitado en el formulario est disponible en el arreglo


$_P0ST porque la etiqueta del formulario especificada method= 'P O S T '. Ade
ms, observe que la clave de el arreglo es el nombre dado en el campo en el
formulario HTML con el atributo nombre asi: nombre="ful 1 a m e " .

Un programa que muestra todos los campos en un formulario es un programa


til para probar el formulario. Usted puede ver cules valores se pasan desde
el formulario para asegurarse de que su formulario est formateado apropia
damente y enva los nombres de campos y los valores que usted esperaba. To
dos los campos en un formulario del tipo POST son desplegados por el
programa en la Lista 8-5, llamado procesaformul ari o. php. Cuando el formu
lario mostrado en la Figura 8-4 es enviado, se corre el siguiente programa.

Lista 8-5: U n srcip t que m uestra todos los ca m p o s de un form ulario


< ? php
/* Nombre del programa: procesaformaulario.php
* Descripcin: El programa muestra toda la informacin que
se paso de un formulario.
*/
echo "<html>
<head><titie>Direccion del CIiente</titie></head>
<body>";
foreach ($_P0ST as $campo => valor)
1
echo "$campo = $valor<br>";
}
?>
</bodyX/html >

Si el usuario digit el nombre Goliat Prez en el formulario de la Figura 8-4, se


despliega el siguiente output:

nombre = Gol i at Perez

El resultado slo muestra una lnea porque solamente hay un campo en el


formulario de la Figura 8-4.

El programa en la Lista 8-5 se escribe para procesar la informacin de cual


quier formulario que use el mtodo POST. Suponga que usted tiene un formu
Captulo 8: Datos entran, datos salen 215
lario levemente ms complicado, tal com o el programa en la Lista 8-6, el cual
despliega un formulario con varios campos.

Lista 8-6: Un p ro g ram a q u e m u estra un form ulario de direcciones


<? php
/* Nombre del Programa: muestraFormulario.php
* Descripcin: Los enunciados muestran un formulario que
pide la direccin del cliente.
*/
echo "<html>
<head><ti tie>Di reccion del C l i e n t e < / t i t l e X / h e a d >
<body>";
$etiquetas = serie primernombre"=>"Primer Nombre:",
"segundonornbre"=>. "Segundo Nombre:",
"apel1 ido"=>"Apel 1 ido:",
"cal 1e"=>"Direccion de la calle:",
"c iu da d"=>"Ciudad:",
"estado"=>"Estado:",
"codi gopostal"=>"Codi g o _p os ta l:");
echo <p al i g n = 'c e n t e r '>
<b>Por favor digite su direccin a
continuacin.</bXhr>";
echo "<form action='procesaformulario.php' m e t h o d = ' P O S T '>
Ctable width='95%' border='0' cel1s p a c i n g = '0'
c e l l pa dd in g= '2' >\ n";
foreach($etiquetas como $campo=>$etiqueta)
i
echo "<tr>
<td a l ig n= 'r ig ht> <B>{$etiquetas[$campo]}
</brX/td>
< t d X i n p u t t y p e = ' t e x t n a m e = ,$campo' size='65'
m a x l e n g t h = '65' X / t d >
</tr>":
1
echo "</tabla>
<div al i g n = ' c e n t e r ' X p X i n p u t ty pe ='submit'
value='Enviar Direccion'> < / p X / d i v >
</form>";
?>
</bodyX/html >

Observe lo siguiente en cuanto a muest raf ormul a ri o .php, tal y como apa
rece en la Lista 8-6:

Se crea un arreglo que contiene las etiquetas usadas en el formulario.


Las claves son los nombres de los campos.

v0 El script procesaformul ari o .php lleva el nombre del script que co


rre cuando el formulario se enva. La informacin en el formulario se
enva a p ro ce sa fo rm ula ri o. ph p, el cual procesa la informacin.
Parte III: PHP

v* El formulario se formatea con una tabla HTML. Las tablas son una par
te importante del HTML. Si usted no est familiarizado con las tablas
HTML, consulte HTML 4 For Dummies, 4ta Edicin, por Ed Tittel y Natan-
ya Pitts (W iley Publishing, Inc.).
v* El script hace un ciclo por el arreglo $ e ti quetas con un enunciado
foreach. El cdigo HTML para una fila de la tabla es el output de cada ci-
* co. Los valores de serie apropiados se usan en el cdigo HTML.

Por razones de seguridad, siempre incluya maxl ength (define el nmero de ca


racteres que los usuarios pueden digitar en el campo) en su enunciado HTML.
Limitar el nmero de caracteres ayuda a prevenir que personas malintenciona
das digiten cdigos maliciosos en los campos de su formulario. Si la informa
cin ser almacenada en una base de datos, establezca 1 ongi tudmaxi ma al
mismo nmero del ancho de la columna en la tabla de la base de datos.

Cuando Goliat Prez rellena el formulario mostrado en la Figura 8-5 (creado


por el programa en la Lista 8-6) y lo enva, el programa pro
cesaformul ario, php corre y produce el siguiente output:

primernombre = Goliat
segundonombre =
apellido = Perez
calle = 1234 calle Alta
ciudad = Gran Ciudad
estado = TX ;
codigo postal = 8 8 8 8 8

Enprocesaformulario.php, todos los elementos del arreglo incorporado


$_P0ST se despliegan, ya que ambos formularios mostrados en esta seccin usa
ron el mtodo POST, tal como lo hace la mayora de los formularios. Hay otras se
ries incorporadas, adems del arreglo $_P0ST, como se aprecia en la Tabla 8-2.

Please enter your address below.

First ame: [~
Middle ame: [~
Last ame: [~
Street Address: ["
Figura 8-5: C ity :(
Formulario State: ["
para intro Zipcode:
ducir la di
reccin del
cliente.
Captulo 8: Datos entran, datos salen

La misma informacin est disponible en dos conjuntos de arreglos. Use los


arreglos ms nuevos (cuyos nombres empiezan con _ ) porque pueden usarse
en cualquier parte, incluso dentro de una funcin. (Le explico las funciones y
el uso de variables dentro de las funciones en el Captulo 7). Estas series, lla
madas superglobales o autoglobales, fueron introducidas en PHP 4.1.0. Los
arreglos ms viejos, con nombres largos como $HTTP_P0ST_VARS, deben ha
cerse globales antes de poder usarse en una funcin, com o explico en el Cap
tulo 7. Las series ms viejas slo deberan usarse cuando usted se ve forzado
a usar una versin de PHP ms vieja que PHP 4.1.0.

Hacer <(ue (os formularios sean dinmicos


PHP trae nuevas capacidades a los formularios HTML. Como usted puede usar
variables en los formularios PHP, sus formularios ahora pueden ser dinmicos.
Estas son las principales capacidades que PHP proporciona a los formularios:

Usar variables para mostrar la informacin en los campos de texto de entrada

i> Usar variables para crear listas dinmicas de las cuales los usuarios pue
den hacer selecciones

> Usar variables para construir listas dinmicas de botones de opcin

v* Usar variables para construir listas dinmicas de casillas para marcar

Desplegar informacin dinmica en tos campos det formulario


Cuando usted despliega un formulario en una pgina web, puede poner infor
macin en los campos en lugar de slo mostrar un campo vaco. Por ejemplo,
si la mayora de sus clientes vive en Estados Unidos, podra automticamente
introducir EEUU en el campo del pas cuando pide a los clientes su direccin.

Registrar arreglos largos


Una nueva configuracin php. i ni, introducida racin a desactivada (Off) , para que PHP no
en PHP 5, le permite evitar que PHP cree les viejos haga este trabajo adicional.
y largos arreglos automticamente. Es altamente
Aunque la configuracin actual predeterm ina
improbable que usted necesite usarlas, a no ser
da es On, eso podra cambiar. La configuracin
que est utilizando algunos scripts viejos que con
predeterm inada podra cam biar a Off en una
tengan las variables largas. La lnea siguiente en
versin futura. Si est usando scripts viejos y
p h p .ini controla esta configuracin:
obtiene errores en lneas que contienen las se
regi s t e r j ong__arrays:= On ries largas, como $ HTTP_GET_VARS, verifique
la configuracin de php.ini para las series lar
En este momento, esta configuracin est acti
gas. Podra estar desactivada (Off), y los
vada (On) en forma predeterm inada. A menos
arreglos largos que necesitan los scripts ms
que usted corra los viejos scripts que necesitan
viejos no se estn siendo creadas del todo.
los viejos arreglos, debera cam biar la configu
7
218 Parte III: PHP

Si el cliente realmente vive en los Estados Unidos, usted le habr ahorrado al


go de digitacin. Y si el cliente no vive en los Estados Unidos, simplemente
puede reemplazar EEUU con el pas apropiado. Adems, si el programa auto
mticamente ingresa EEUU como el valor en el campo, usted sabe que esa in
formacin no contendr errores.

Para mostrar un campo de texto que contiene informacin, usa el siguiente


formato para los enunciados HTML del campo de input:

<input t y p e = " t e x t " name="pais" value="EEUU">

Al usar PHP, usted puede utilizar una variable para desplegar esta informa
cin con cualquiera de los siguientes enunciados:

<input t y p e = " t e x t name="pais"


value="<?php echo $pais ?>">
echo "Cinput type='text' name='pais' val u e '$ pa i s '>";

El primer ejemplo crea un campo de input en una seccin HTML, usando una
seccin PHP corta slo para el valor. El segundo ejemplo crea un campo de
entrada usando un enunciado echo dentro de una seccin PHP. Si usted est
usando un formulario largo con slo una variable ocasional, usar el primer
formato resulta ms eficiente. Si su formulario usa muchas variables, es ms
eficiente usar el segundo formato.

Si tiene informacin de los usuarios almacenada en una base de datos, podra


querer mostrar la informacin de la base de datos en los campos del formulario.
Por ejemplo, podra mostrar la informacin al usuario, de modo que ste pueda
hacer cualquier cambio necesario. O bien, usted podra mostrar la direccin de
envo para el ltimo pedido en lnea del cliente, de manera que no haya necesi
dad de volver a digitar la direccin. La Lista 8-7 presenta el programa
muestradi rece i o n. php, el cual despliega un formulario con informacin dla
base de datos. Este formulario es muy parecido al formulario mostrado en la Fi
gura 8-5, excepto que este formulario tiene informacin en l (recuperada de la
base de datos) y los campos en el formulario en la Figura 8-5 estn vacos.

L is ta 8 -7 : P ro g r a m a p a ra m o s tra r u n fo rm u la rio H T M L c o n in fo rm ac i n
<?php
V * Nombre del programa: displayAddress
* Descripcin: El script muestra un formulario con
informacin sobre direcciones obtenido de la ase
de datos.
*/
echo "<html>
<head><ti tle>Di reccion del C1 iente</t it le X/h ea d>
<body>";
$etiquetas = serief 'primernombre"=>"Primer Nombre:",
"segundoNombre"=>"Apel1 ido:",
"calle=>"Direccion de la calle:",
"ciudad"=>"Ciudad:",
Captulo 8: Datos entran, datos salen

"estado"=>''Estado:",
"codigopostal "=>"Codigo..postal:");
$usuario="admin":
$huesped="localhost";
$clave="";
Ibasededatos = "DirectoriodeMiembros";
Inombreentrada = "gperez"; // nombre de registro del
usuario

Iconexion = mysql_connect(lhuesped,lusuario,lclave)
or die ("No me pude conectar al servidor");
Idb = mysql_select_db(lbasededatos,Iconexion)
or die ("No se pudo seleccionar la base de datos");
Iconsulta = "SELECT * FROM Miembro
WHERE noribreentrada=' Inombreentrada ;
Iresultado = mysql_query(lconsulta)
or die ("No se pudo ejecutar la consulta.");
Ifila = mysql__fetch_array(lresultado);

echo "<p alig n= 'c en te r>


<hl alig n= 'c en te r>Direccion de
lnombreentrada</hl>\n";
echo "<br><p al i g n = 'c e n t e r '>
<font s i ze =' +l'><b>Por favor verifique la informacin
a continuacin y cambie cualquier dato que esta
incorrecto. < / b X / f o n t >
<h r > " ;
echo "<form action='procesaDireccion.php' method='POST'>
<table width='95%' border='0' cellspacing='0'
c el1patdi n g = '2> \ n " ;
foreach(letiquetas as lcampo=>letiqueta)
{ '
echo "<tr>
<td a Ti gn='ri g h t '> <B >{ le tiqueta[lcampo]}
</brX/td>
< t d X i n p u t type='text' n a m e = 'I c a m p o '
v a l u e = 'Ifi 1a [ l c am po ]' s i z e = '65'
maxlength='65'>
</td>
</ tr >";
j
echo "</table>
<div a l i g n = ' c e n t e r ' X p X i n p u t t y p e = 's u b m i t '
value='Enviar D i re cc io n> < / p X / d i v >
< / fo rm >";
?>
</bodyX/html>

Observe lo siguiente en el programa en la Lista 8-7:

El enunciado del formulario transfiere la accin al programa proces -


; adi recci on. php. Este programa procesa la informacin en el formulario y ac
tualiza la base de datos con cualquier informacin que el usuario cambi. Este
| es un programa que usted mismo escribe. Verificar los datos en un formulario
I y guardar informacin en la base de datos se discuten ms adelante en este ca-
220 Parte III: PHP

ptulo, en las secciones "Revisar la informacin" y "Poner informacin en una


base de datos".

v * Cada campo de input en el formulario recibe un nombre. La informa


cin en el campo de input se almacena en una variable que tiene el mis
mo nombre que el campo de input.
v * El programa da a los nombres de campos en el formulario los mismos
nombres de las columnas en la base de datos. Esto simplifica el movi
miento de la informacin entre la base de datos y el formulario; no re
quiere de la transferencia de informacin de una variable a otra.

Los valores de la base de datos se muestran en los campos del formu


lario con el parmetro valor en el enunciado del campo de input. El
parmetro v a l o r muestra el valor apropiado del arreglo $f i 1 a, la cual
contiene datos de la base de datos.

Por razones de seguridad, siempre incluya maxl ength en su enunciado


HTML, maxl ength define el nmero de caracteres que un usuario puede digi
tar en el campo. Si la informacin ser almacenada en una base de datos, es
tablezca maxl ength al mismo nmero del ancho de la columna en la tabla de
la base de datos.

La Figura 8-6 muestra la pgina web resultante del programa en la Lista 8-7. La infor
macin en el formulario es la informacin que est almacenada en la base de datos.

Construir listas de seleccin


Un tipo de campo que usted puede usar en un formulario HTML es una lista
de seleccin. En vez de digitar en un campo, sus usuarios seleccionan de una
lista. Por ejemplo, en un catlogo de productos, usted podra proveer una lis
ta de categoras entre las cuales los usuarios pueden seleccionar lo que de
sean ver. 0 bien, el formulario para las direcciones de los usuarios podra
incluir una lista de pases que los usuarios pueden seleccionar. O los usua
rios podran ingresar una fecha seleccionando el mes, da y ao de una lista.

Use las listas de seleccin siempre que sea factible. Cuando el usuario selec
ciona un elemento de una lista, usted podr estar seguro de que el elemento
es correcto, sin errores ortogrficos, caracteres extraos u otros problemas
introducidos por los errores de digitacin de los usuarios.

Una lista de seleccin en HTML para las categoras en el Catlogo de masco


tas tiene el siguiente formato:

<form action="procesaformulario.php" method="POST">


<select name="Tipomascota">
<va1ue de la option="cabal1o">caballo
< valu de la option ="gato" selected>gato
< valu de la option ="dragon">dragon
</select> &nbsp;&nbsp;&nbsp;
Cinput ty pe="submit value="Seleccione el tipo de mascota ">
</form>;
Captulo 8: Datos entran, datos salen

3 C iis t o m e r A d d res s - M ic ro s o ft in te rn e t E x p lo re r
j File Edlt View Farvorites Tois Help

***B ck 4 * ] ' | g S e a rrh J T a v o iit r * jH is tu iy V -f +*

A d d 'e s s j h U p / / l o e H io s l/l l l t '& M v 'd J i t o i lju m n in s A lis p lo v A d ili i ss i> h p Go

Address for gsmith


Please check the Information bdow and change any inform adon that is incorrect.

F irst am e: jGoliath
LastName: Smith

Street Address: 1234 Gian'St.

City: jiV.u City


Figura 8-6:
State: AL
Formulario
Zipcode: 97850
que muestra
la direccin * ^uhmdAWdrPQts
del usuario.
?iDone (V Local intranet

La Figura 8-7 muestra la lista de seleccin que estos enunciados HTML produ
cen. Observe que gato es la opcin escogida cuando el campo se muestra por
primera vez. Usted determina esta seleccin predeterminada incluyendo se
lected en la etiqueta de opcin.

a -
rn ,. Id i. V , t n o is H ,ip

] t i a
B o rk 1- r S lo p -^ e s h Hor.v / $ a rch F a w g jb s s ^ j

| A d r e S S j i j r ] h ttp //(a n e tv a l san rr e om /P H V ?

Figura 8-7:
Un campo
de s elec
E3 I SeledTypBOlpBt ]
cin para el
Catlogo de
m ascotas
J Bone i 10 Internet ^

Cuando el usuario hace clic sobre la flecha en la casilla de lista desplegable


de seleccin, toda la lista se despliega, como se aprecia en la Figura 8-8, y el
usuario puede seleccionar cualquier elemento de la lista. Observe que gato
est seleccionado hasta que el usuario seleccione un elemento diferente.

Al usar PHP, sus opciones pueden ser variables. Esta capacidad le permite
construir listas de seleccin dinmicas. Por ejemplo, usted debe mantener la
222 Parte III: PHP

lista esttica de categoras de mascotas mostrada en el ejemplo anterior. Si


aade una categora nueva de mascota, debe agregar una etiqueta de opcin
manualmente. Sin embargo, con las variables PHP, usted puede construir la
lista en forma dinmica a partir de las categoras en la base de datos. Cuando
aada una nueva categora en la base de datos, la nueva categora se agrega
r automticamente a su lista de seleccin sin necesidad de cambiar el pro
grama PHP. La Lista 8-8 para el programa construirselect.php construye
una lista de seleccin de categoras de mascotas a partir de la base de datos.

| 3 P e t C a ta lo ij - M ic ro s o ft In te r n e t E x p lo r e r 3 I3 |
' LH e E d it V e w F a v o irte s T n a ls e lp Q Q ||

Figura 8-8: i! .
|J Back Forw ard x S to p . fteftesh Home j Seatcb Pavotles ]
Un campo 11 A d d r e S S h ttp 7 /ja n e tv a l.s a n u .co m /P H j j j ^ G o * jL in k S w i j |

de selec ......................... .............................................................. ............................ ....... ..... X 3


cin para el
Catlogo de |c a t n y S s te c tT y p e e r fP e t |
m ascotas fh o rs e |
E uE M M M H
con una lis jd ra q o n |
ta desple
d
g a re .
j$Q l l e n e | | j$ In te rn e t

L is ta 8-8: P ro g ra m a p a ra c o n s tru ir u n a lis ta de s e le c c i n


<?php
/* Nombre del programa: construirselect.php
* Descripcin: El programa construye una lista de
seleccin a partir de la base de datos.
*/
?>
<html>
<head><title>Tipos de mascotas</titie></head>
<body>
<?php
$usuari o="cat al og o";
$ h ue sp ed="localhost";
$ c 1a v e = ";
Sbasededatos = "CatalogodeMascotas ;

$conexion = mysql_connect($huesped,$usuario,$clave)
or die ("No se pudo conectar al servidor );
$db = mysql_select_db($basededatos,$conexion)
or die ("No se pudo seleccionar la base de datos"):
$consulta = "SELECT DISTINCT Tipomascota FROM Mascota ORDER
BY Ti p o m a s c o t a " ;
$resultado = my sq l_ query($consulta)
or die ("No se pudo ejecutar la consulta.");

(contina)
Captulo 8: Datos entran, datos salen

/* crea un formulario que contiene la lista de seleccin */


echo "< f o rm a c t i o n = 1p ro c e s a fo rmu1a r io .p h p ' me th od='POST>
<select n a m e = ,Tipomascota'>\n";

while ($fi 1 a = mysql_fetch_array($re'sutado))


{
e x t r a c t d f i la);
echo "<option v a l u e = '$Tipomascota'>$Tipomascota\n";

echo "</select>\n";
echo <input t y p e = 's u b m i t ' value='Seleccionar tipo de
m a s c o t a '>
</form >\ n";
?>
</body></html>

Observe lo siguiente en el programa de la Lista 8-8;

Uso de DISTINCT en la consulta: DISTINCT causa que la consulta extraiga


cada tipo de mascota slo una vez. Sin DI ST IN CT, la consulta devolvera cada
tipo de mascota varias veces si apareciera varias veces en la base de datos.

Uso de ORDER BY en la consulta: Los tipos de mascota se ordenan alfa


bticamente.

v* Enunciados echo antes del ciclo: Se hace echo de las etiquetas f orm y
sel ect antes de que el ciclo whi 1 e empiece, porque se les hace echo
slo una vez.
i> Enunciados echo en el ciclo: A las etiquetas opti on se les hace echo
en el ciclo: una vez para cada tipo de mascota en la base de datos. Nin
gn elemento est marcado como seleccionado, por lo cual el primer
elemento en la lista se selecciona automticamente.

v0 Enunciados echo despus del ciclo: A las etiquetas finales f orm y


sel ect se les hace echo despus del ciclo porque se les hace echo s
lo una vez.

La lista de seleccin producida por este programa es inicialmente la misma


que la de la Figura 8-7, con gato seleccionado. Sin embargo, gato est selec
cionado en este programa porque es el primer elemento en la lista, y no por
estar seleccionado especficamente (com o lo est en las etiquetas HTML que
producen la Figura 8-7). La lista desplegable producida por este programa es
t en orden alfabtico, como se aprecia en la Figura 8-9.

Tambin puede usar variables PHP para establecer cul opcin est seleccionada
cuando la casilla de seleccin aparece. Por ejemplo, suponga que usted desea que el
usuario seleccione una fecha de las listas de seleccin mes, da y ao. Usted cree que
la mayora de las personis seleccionar la fecha de hoy; por eso, quiere que la fecha
de hoy est seleccionada en forma predeterminada cuando la casilla se despliega. La
Lista 8-9 muestra el programa sel ecci onarfecha .php,el cual despliega un formula
rio para seleccionar una fecha y selecciona la fecha de hoy automticamente.
Parte III: PHP

Pr' T y r e s . N e ts c a p e

m
Figura 8-9: r io F d it V ie w G C o m m u n ir a to r H e lp

Un c a m p o T i 'A ii- i
6ack w m Reload Home Seaich Netscape s
de s e le c c i n
EL t ^ n e t v a k a n ~ ir c o m /P H P ^
p a ra el C a t @1 Internet j Lookup g j NewiCool n ed P Iq m
logo de m a s
ca
cotas
pro d u c id o
por el p r o
gram a
b u l 1d S e -
le c t.p h p .
B o c n te n fc Por ,

Lista 8-9: P rogram a para c re a r una lista de selec ci n para la fecha


<?php .
/* Nombre del programa: se leccionarFecha.php
* Descripcin: El programa muestra una lista de seleccin
que los clientes pueden usar para seleccionar una
fecha.
*/
echo "<html>
< h e a d X t i t i e > S e l e c c i o n e una fecha</title></head>
<bod y> ";

/* crea una serie de meses */


Snombremes = array(l=> "enero", "febrero", "marzo",
"abril", "mayo", "junio", "julio",
"agosto", "setiembre", "octubre",
"noviembre", "diciembre"):

$hoy = d a t e O ; //almacena la fecha de


hoy
$f_hoy = d a te (" M- D- A",$ h o y ); //da formato a la fecha de
hoy

echo "<div a l i g n = c n t e r > \ n " :

/* muestra la fecha de hoy */


echo "<p>&nbsp;<h3>Hoy es $ f _ h o y < / h 3 X h r > \ n " ;

/* crea un formulario que contiene una lista de seleccin


para la fecha */
echo "<form action procesaformulario.php'
method='POST'>\n":

/* construye una lista de seleccin para el mes */


Shoymes = d a t e ( " m ,$hoy); //extrae el mes en $hoy
echo "<select na me =' fechames> \ n ;
for ($n=l;$n<=12;$n++)
Captulo 8: Datos entran, datos salen

L is ta 8-9: (c o n tin u a c i n )

{
echo "<option value=$n";
i f (Shoymes == $ n )
(
echo " checked";
}
echo "> $nombr em es [$ n]\ n ;
}
echo "</select>";

/* construye la lista de seleccin para el di a */


$hoydia= date( "d ,$ h o y ); //extrae el di a de $hoy
echo "<select n a m e = 'f e ch ad ia'> \ n ;
for ($ n = l ; $ n < -31;$n++)

echo '' <option value=$n";
if ($diahoy == $n )
{
echo " checked";
1
echo "> $n\n";
)
echo "< /select>\n";

/* construye una lista de seleccin para el ano */


Sannioinicio = fechaC'Y", $hoy); //obtenga el ano de $hoy
echo "<select name='fechaannio'>\n";
for ($n=$ann io i n ici o;$n<*$anni ooi ni ci o + 3 ;$n++)
i
echo " <option value=$n";
if ($anniooi nicio == $n )
, 'i
echo " selected";
1
echo "> $n\n";
1
echo "</select>\n";
echo "</form>\n ;
?>
</body></html> .

La pgina web producida por el programa de la Lista 8-9 se muestra en la Fi


gura 8-10. La fecha aparece sobre el formulario, de modo que pueda verse
que la lista de seleccin muestra la fecha correcta. La lista de seleccin para
el mes muestra los 12 meses al caer. La lista de seleccin para el da muestra
31 das al desplegarse. La lista de seleccin para el ao muestra cuatro aos.

El programa en la Lista 8-9 produce la pgina web de la Figura 8-10 siguiendo


estos pasos:
226 Parte III: PHP

ili Edft Virn 1jVDii'S fonht flulp

9*fc "* Sgy


(5 Rtrfwh Hdw
^ _ M i fwtfe
*' ^ AM**
at ^ ftw
Figura 8-10:
Un c a m p o
de s e l e c
cin p a r a la
(Oecembei J . -J
f e c h a c o n la
f e c h a de
hoy s e le c
c io n a d a
PIS**'

1. Crea un arreglo que contiene los nombres de los meses. Las claves para el
arreglo son los nmeros. El primer mes, enero, empieza con la clave 1, de ma
nera que las claves para el arreglo concuerden con los nmeros de los meses.

2. Crea variables que contienen la fecha actual. $hoy contiene la fecha en


un formato del sistema y se usa en el formulario. $f_hoy es una fecha
formateada que se usa para mostrar la fecha en Ja pgina web.

3. Muestra la fecha actual en la parte superior de la pgina web.

4. Construye el campo de seleccin para el mes.

i. Crea una variable que contiene el mes actual.

ii. Hace eco de la etiqueta sel ect, a la cual debera hacrsele eco
una sola vez.
iii. Empieza un ciclo for que se repite 12 veces.

iv. Dentro del ciclo, hace eco de la etiqueta opci on usando el primer
valor del arreglo $nombremes.

v. Si el nmero del mes que se est procesando es igual al nmero del


mes actual, aade la palabra "sel ected" a la etiqueta opti on.

vi. Repite el ciclo 11 veces ms.

vii. Hace e c h o de la etiqueta sel ect de cierre para el campo de selec


cin, a la cual debera hacrsele eco una sola vez.
5. Construye el campo de seleccin para el da. Usa el procedimiento des
crito en el Paso 4 para el mes. Sin embargo, slo se usan nmeros para
esta lista de seleccin. El ciclo se repite 31 veces.
6. Construye el campo de seleccin para el ao.
i. Crea la variable aoi ni ci o, la cual contiene el ao actual.

ii. Hace eco de la etiqueta s el ect, a l a q u e s e l e debe hacer e c h o s


lo una vez.

iii. Inicia un ciclo for. El valor inicial para el ciclo es lanioi ni ci o. El


valor final para el ciclo es $a ni o i ni ci o + 3 .
Captulo 8: Datos entran, datos salen

iv. Dentro del ciclo, hace echo de la etiqueta opti on, usando el valor
inicial del ciclo f or , que es el ao actual.

v. Si el nmero de aos que se est procesando es igual al nmero del


mes actual, aade la palabra "sel ected" a la etiqueta de opcin.

vi. Repite el ciclo hasta que el valor final sea igual a $anioi ni ci o+3 .

vii. Hace eco de la etiqueta de cierre sel ect para el campo de selec
cin, a la que se debe hace echo slo una vez.

7. Hace eco de la etiqueta final para el formulario.

Crear listas de botones de opcin


Tal vez usted quiera usar botones de opcin en lugar de listas de seleccin.
Por ejemplo, puede desplegar una lista de botones de opcin para su Catlogo
de mascotas, y pedir a los usuarios que seleccionen el botn para la categora
de mascota de su inters.

El formato para los botones de opcin en los formularios es

<input type="radio" name="mascotas" value="Unicornio">

Puede construir una lista dinmica de botones de opcin que represente to


dos los tipos de mascotas en su base de datos del mismo modo que se cons
truye una lista de seleccin dinmica en la seccin anterior. La Lista 8-10
muestra el programa const ruyeradi o .php, el cual crea una lista de botones
de opcin con base en los tipos de mascotas.

Lista 8-10: P ro g ram a para co nstru ir una lista de boto n es de opcin


<?php
/* Nombre del programa: construyeRadio.php
* Descripcin: El programa muestra una lista de botones de
opcion con la informacin de la base de datos.
*/
echo "<html>
< h e a d X t i t l e > T i p o s de m a s c o t a s C / t i t l e X / h e a d X
<body>";
Susuari o="cata1ogo"
$huesped="localhost";
Iclave
$ b a s e d e d a t o s > "CatalogodeMascotas ;

$conexion = mysql_connect($huesped,$usuario,$cl ave)


or die ("No se pudo conectar al servidor");
$db = mysql_select_db($basededatos,$conexion)
or die ("No se pudo seleccionar la base de datos");
Iconsulta = "SELECT DISTINCT Tipomascota FROM Mascota
ORDER BY Tipomascota";
Sresultado = mysql_.query($consulta)
or die ("No se pudo ejecutar la consulta.");
228 Parte III: PHP

echo "<div style margin-1 e f t : .5irt'>


<p>&nbsp;
<p><b>En que tipo de mascota esta interesado?</b>
<p>Por favor escoja un tipo de mascota de la lista
sigu ie nt e:\ n " ;

/* crea un formulario que contiene botones de opcion */


echo "<form action='procesaformulario.php'
method='POST'>\n";

while ($fi 1 a = my sql_fetch_array(Iresultado))


{
extract($fila);
echo "<input t y p e = radio' name='interest'
v a l u e = ,$T ipomascota'>$Tipomascota\n";
echo <br>\n";
1
echo "<p><input type='submit' value='Seleccione el tipo de
m a s c o t a >
</form>\n'';
?>
</di v X / b o d y X / h t m l >

Este programa es muy parecido al de la Lista 8-9. La pgina web producida


por este programa se muestra en la Figura 8-11.

^ P e t T y p e s - N e tsc a p e
i'" I dil Vipw fm f iimmunii lu
; a i ^ ^ 4
BaJ tte lu o d H & ie * S u a irh H e 'sce p e
...

F rrA

S jeurity f
..o
r_J'

^j L o c rf0 ft|h lt'p 7 /[a n tv a l >an rr co m /P H P&M y SOL orpurnm ies/buildP i * ) W h flta R nahod

%j ISf rteme to o lu jp j S ew U Iuo ^ ile d P t o y * _________________________________________________________

Figura 8-11: Which type ofpet are you interested in?

Lista de bo P lease ch o o se one typ e o fp e t from th e follow ing list:


tones de op
C ' cat
cin produ C' dragn

cida por el O h o rse


programa ^e g c tiy p p n fP e t ^
en la Lista
8 10
- .

F =r

Construir listos de casillas para marcar


Tal vez usted prefiera usar casillas en su formulario. Las casillas para marcar
son diferentes a las listas de seleccin y a los botones de opcin, ya que per
miten a los usuarios seleccionar ms de una opcin. Por ejemplo, si usted
despliega una lista de categoras de mascotas usando casillas, un usuario
puede marcar dos o tres o ms categoras de mascotas. El programa bu i 1d-
C h e c k b o x .php en la Lista 8-11 crea una lista de casillas para marcar.
_______________________________ Captulo 8: Datos entran, datos salen

Lista 8-11: P ro g ram a para c o n stru ir una lista de casillas para m arcar
<?php 1
/* Nombre del programa: construyeCheckbox.php
* Descripcin: ET programa muestra una lista de casillas
para marcar con informacin de la base de datos.
*/
echo <html>
<head><titie>Tipos de mascotas</titie></head>
<body>":
Su s u a r i o = c a t a l o g o " ;
$h ue sp ed =" l o c a l h o s t " ;
$clave="";
Ibasededatos = "Catalogodemascotas";

$ conexin = mysql_connect($huesped,$usuario,$clave)
or die ("No se pudo conectar al servidor");
$db = mysql_select_db($basededatos,$conexion)
or die ("No se pudo seleccionar la base de datos");
$consulta = "SELECT DISTINCT Tipomascota FROM Mascota
ORDER BY Tipomascota";
$resultado = my sq l_ qu er y( $co ns ul ta)
or die ("No se pudo ejecutar la consulta.");

echo "<div style="margin-left: .5i n '>


<p>&nbsp;
< p X b > E n que tipo de mascota esta interesado?</b>
<p>Escoja tantos tipos de mascotas como quiera.-\n";

/* crea un formulario que contiene casillas para marcar */


echo X f o r m a c t i o n = procesaformulario.php'
m e t h o d = P O S T ,>\n";

while ($f i 1 a = my sq l_.fetcharray($ res ul t a d o ) )

ex t r a c t( Sf il a);
echo "Cinput t y p e - ' ch ec kb ox
name='interestl$Tipo_mascota]
value= 'S Ti po mas co ta'>$Tipomascota\n";
echo "<br>\n";
}
echo " < p X i n p u t type= s u b m i t value= Seleccione el Tipo de
M a s c o t a '>
< / fo rm >\ n";
?>
</di v X / b o d y X / h t m l >

Este programa es muy similar al programa en la Lista 8-10 que construye una lis
ta de botones de opcin. Sin embargo, observe que el campo de inout usa un
arreglo $i nterest como el nombre del campo. Esto es porque ms de una casi
lla puede ser seleccionada. Este programa crear un elemento en el arreglo con
una pareja de clave y valor para cada casilla seleccionada. Por ejemplo, si el
usuario selecciona tanto caballo como dragn, se crea la siguiente serie:
Parte III: PHP

L ile f if il V ie w F a v a ritc s In n ls H r ip

-r - 0 j Sp*..^
5a t srn -,-f*,r S to o f t fr e s h 'N o m P ! b w n /ifc ? U ia w v 1 M h| P t fr t

WJiich l}pe ofpet are you interested in?

Figura 8-12: Choose asm anytypes ofpets as youwant:


Una lista de
P cat
casillas pa P : dragn
ra m arcar P horse
producida
SeectType QfPet
por el pro
gram a en la
Lista 8-11.
Done ) f~" latente*

$1nterest[cabal 1o]=cabal1 o
$ i nterest[dragn]=dragon

El programa que procesa el formulario tiene las selecciones disponibles en el


arreglo POST, como sigue:

$ _ P 0 S T [ nterest'][' cabal lo' ]


$ _ P 0 S T [ 'i n t e r es t'][ 'dragn']

La Figura 8-12 muestra la pgina web producida por bul 1 d C h e c k b o x .p h p .

Usar (a informacin del formulario


Como coment anteriormente en esta seccin, Juan Cliente rellena un formu
lario HTML, selecciona entre las listas y dgita informacin en campos de tex
to. Hace clic en el botn Submit.

En la etiqueta formul ari o, usted le dice a PHP cul programa correr cuando se
hace clic en el botn Submit. Esto se hace al incluir action=nomb r eprograma"
en la etiqueta formul ario. Por ejemplo, en la mayora de las listas de ejemplo
en este captulo, yo usoaction="procesaf ormul ario. php". Cuando el usuario
hace clic en el botn Submit, el programa corre y recibe la informacin del for
mulario. EL manejo de la informacin del formul ari o es una de las mejores ca
ractersticas de PHP. Usted no necesita preocuparse sobre los datos del
formulario, puede simplemente obtenerlos de una de los arreglos incorporados
y usarlos.

Los datos del formulario estn disponibles en el programa de procesamiento


en series, como se muestra en la Tabla 8-1. La calve para el elemento del
Captulo 8: Datos entran, datos salen

arreglo es el nombre del campo de input en el formulario. Por ejemplo, si ha


ce eco del siguiente campo en su formulario

echo "<input type='text' name='primernombre'>";

el programa de procesamiento puede usar la variable $_P0ST[pri mernom


bre] , la cual contiene el texto que el usuario digit en el campo. La informa
cin que el usuario selecciona de las listas desplegables de seleccin o de los
botones de opcin tambin est disponible para usar. Por ejemplo, si su for
mulario incluye la lista siguiente de botones de opcin

echo "<input t y p e = 'r a d i o ' n a m e = 'i n te re st' v a l u e = 'p e r r o '>


perro\n";
echo "<input type='radio' name='interest' value='gato'>gato\n";

usted puede tener acceso a la variable $_P0ST[i nterest], la cual contiene


ya sea perro o gato, dependiendo de lo que el usuario haya seleccionado.

Las casillas se manejan en forma algo diferente, ya que el usuario puede se


leccionar ms de una. Como se muestra en la Lista 8-11, los datos de una lista
de casillas para marcar se pueden almacenar en un arreglo, de manera que
todas las casillas estn disponibles. Por ejemplo, si su formulario incluye la
lista siguiente de casillas para marcar
P~$PEC

Post versus get


P a ra e n v ia r in fo rm aci n de un fo rm u lario , se cin separada con el program a de procesa
usa uno de dos m todos. Los m todos pasan los miento. Las ventajas de este m todo son: se
dato s del form ulario de m anera diferente y tie puede pasar informacin ilimitada y los datos
nen v e n ta ja s y desventajas distintas. estn m s seguros. Las desventajas son las
operaciones auxiliares y m enor velocidad.
M t o d o g e t : Los datos del form ulario se
p asan a g re g n d o lo s al URL que llam a al Para program as CGI que no son de PHP, el pro
program a de procesam ien to del form ulario. gram a que procesa el form ulario debe encontrar
Por ejem plo, el URL podra verse as: la in fo rm aci n y poner los datos en variables. En
este caso, el m todo get es m ucho m s simple
processform.php?apellido=
Perez&pnombre=Gol i at y fcil de usar. M u ch o s program adores usan el
m todo get por esta razn. Sin em bargo, PHP
Las ventajas de este m todo son su sim pli h a c e todo este trabajo por usted. Los mtodos
cidad y velocidad. Las desventajas son que get y post son igualm ente fciles de usar en
se pueden pasar menos datos y la inform a pro g ram as PHP. Por lo tan to , al usar PHP, casi
cin ap a re ce en el explorador, lo cual p u e siem p re es m ejor usar el m todo post, pues us
de representar un problema de seguridad en ted obtiene las ventajas del m todo post (paso
algunas situaciones. de datos limitado, m ejor seguridad) sin su prin
u * M to d o p o s t : Los datos del form ulario se cipal desventaja (m s difcil de usar).
pasan com o un paquete en una c o m u n ica
232 Parte III: PHP

echo "Cinput type=, checkbox' hame='interestdog]'


v a l u e = 'p e r r o '>perro\n";
echo "<input t y pe =' ch ec kb ox name='interest[cat]'
v a l u e = 'g a t o '>gato\n":

usted puede tener acceso a los datos usando la variable multidimensional


$P0ST[ i n t e r e s t ] , la cual contiene lo siguiente:

$ P O S T [ i n t e r e s t ] [ p e r r o ] = perro
$ P O S T [ i n t e r e s t ] [ g a t o ] = gato

En algunos casos, usted querr tener acceso a todos los campos en el formu
lario. Tal vez quiera revisarlos todao para asegurarse de que el usuario no ha
ya dejado ningn campo en blanco. Como se muestra en el programa
procesaf ormul a r i o . php, anteriormente en este captulo (vea la Lista 8-5),
puede usar f or each para moverse por el arreglo incorporado $_ POST o
$_GET. Muchos de los programas de muestra y los enunciados en este libro
usan el mtodo post. Las claves son los nombres de campos. Consulte el
cuadro "Post versus get" para ms informacin sobre los dos mtodos.

Por ejemplo, suponga que su programa incluye los siguientes enunciados pa


ra desplegar un formulario:

echo "<form action='procesaformulario.php' m e t h o d = 'POST'>\n";


echo X i n p u t type='text' name='ape11ido' v a l u e = Pe~
r e z > < b r > \ n " ;
echo X i n p u t t y p e = radio' name='interest' v a l u e = ' p e r r o >
perro\n";
echo X i n p u t type='radio' name='interest' va1ue='gato'>gato\n";
echo "<input ty p e = ' h i d d e n ' name='hidvar' v a l u e = '3'> \ n " ,
echo "<br><input type='submit' value=Seleccione tipo de mascota')
</form>\n";

El programa procesaf ormul ar i o. php contiene los siguientes enunciados


que enumerarn todas las variables recibidas del formulario:

foreach ($_P0ST as Icampo => $valor)


{
echo "$campo, $valor<br>":
}

El resultado del ciclo f or e ac h sera

apellido, Perez
interest, perro
hidvar, 3

El output muestra tres variables con estos tres valores por las siguientes razones:

| El usuario no cambi el texto en el campo de texto. El valor "Perez"


T que el programa mostr sigue siendo el texto en el campo de texto.
Captulo 8: Datos entran, datos salen

| El usuario seleccion el botn de opcin para perro. El usuario puede


| seleccionar slo un botn de opcin.
!
| > El programa pas un campo escondido llamado hidvar. El programa
| establece el valor para los campos escondidos. El usuario no puede afec-
tar los campos escondidos.

Rerisar (a informacin
Juan Cliente completa un formulario HTML, selecciona de las listas y dgita infor
macin en los campos de texto. Hace clic en el botn Submit. Ahora, usted tiene
toda la informacin que deseaba. Bueno, tal vez. Juan puede haber digitado in
formacin que contiene algn error. O quizs haya digitado algo sin sentido. O
incluso podra haber digitado informacin maliciosa que puede causarle proble
mas a usted o a otras personas que usan su sitio web. Antes de utilizar la infor
macin de Juan o almacenarla en su base de datos, es mejor revisarla, para
cerciorarse de que sea la informacin solicitada. Revisar los datos es validarlos.

Validar los datos incluye lo siguiente:

f* v0 Revisar en busca de campos vacos: Usted puede pedir a los usuarios


| que digiten informacin en un campo. Si el campo est en blanco, se le
i dice al usuario que la informacin es obligatoria, y el formulario reapare-
I ce para que el usuario pueda digitar la informacin faltante.

| u* Verificar el formato de la informacin: Usted puede revisar la informa


cin para ver si est en el formato correcto. Por ejemplo, ab3&*xx clara-
I mente no es un cdigo postal vlido.

Revisar en busca de campos Vacias


Cuando usted crea un formulario, puede decidir cules campos son obligato
rios y cules son opcionales. Su decisin se implementa en el programa PHP.
Usted revisa los campos obligatorios en busca de informacin. Si un campo
obligatorio est vaco, enva un mensaje al usuario que indica que el campo
es obligatorio, y luego vuelve a mostrar el formulario.

El formato general para revisar en busca de campos vacos es

i f ($ a pe11 ido == "")


1
echo "No digito su apellido. El apellido es obligato-
ri o . < b r > \ n " ;
mostrar el formulario;
e x i t O ;: v,
:} ;- .O e o ::0 :O O V .,. o -,
echo " Bienvenido a'l'cl ub exclusivo para mi em b r o s .
Puede seleccionar del men a continuacin.<br>\n";
mostrar el men:
234 Parte III: PHP

Observe el enunciado ex i t. Los enunciados exit finalizan el programa. Sin el enun


ciado ex it, el programa continuara con los enunciados despus del enunciado if.
En otras palabras, sin el enunciado ex it, el programa desplegara el formulario y
luego continuara haciendo eco del enunciado de bienvenida, adems del men.

En muchos casos, unted quiere verificar todos los campos en el formulario.


Puede hacerlo al m overse con un ciclo a travs del arreglo $ __P0ST. Los si
guientes enunciados registran el arreglo buscando campos vacos:

foreach ($_P0ST as $valor)


1
if ( Svalor == "" )
{
echo "No ha completado todos los campos<b r> \n ";
mostrar el formulario:
exi t {);
1
1
echo "Bienvenido":

Al volver a desplegar el formulario web, asegrese de que contenga la infor


macin que el usuario ya digit. Si los usuarios deben volver a digitar infor
macin, probablemente se frustren y se retiren de su sitio web.

En algunos casos, usted podra requerir que el usuario rellene la mayora de


los campos, pero no todos. Por ejemplo, podra solicitar un nmero de fax en
el formulario o brindar un campo para el segundo nombre, pero realmente no
quiere restringir la inscripcin a su sitio web slo a usuarios que tienen se
gundo nombre y fax. En este caso, puede hacer una excepcin para los cam
pos que no son obligatorios, como sigue:

foreach ($_P0ST as $campo => Svalor)


{
if ( Scampo != "fax" and Scampo != "segundonombre" )
{
if ( Svaior "" )
{
echo "No ha completado todos los ca mpos<br>\n";
mostrar el formulario;
e x i t ( );

echo "Bienvenido";

Observe que el enunciado condicional i f externo es verdadero slo si el campo no


es el campo fax y no es el campo segundo nombre. Para esos dos campos, el progra
ma no llega al enunciado if interno, el cual revisa en busca de campos en blanco.

El algunos casos, tal vez usted quiera decir al usuario exactamente cules campos
deben rellenarse. El programa chequeodedatos. php en la Lista 8-12 procesa un
Captulo 8: Datos entran, datos salen

formulario con cuatro campos: primer^nombre, segundcuiombre, apellido y


telefono. Todos los campos son obligatorios, excepto segundo_nombre.Enel
ejemplo que aparece en la Figura 8-13, el usuario no digit el primer nombre: El
mensaje de error resultante cuando se procesa el formulario le dice al usuario cul
campo dej vaco.

L ista 8-12: P ro g ra m a q u e revis a en b u s c a de c a m p o s en blanco


< ? php
/* Nombre del programa: chequeaDatos.php
* Descripcin: El programa revisa todos los campos del
formulario para ver si hay campos en blanco.
*/
?>
<html>
<head><titie>Campos vacios</ti ti e X / h e a d >
<body>
<?php
/* fija una serie de etiquetas de campo */
Sarreglo_etiqueta = array ( "primer_nombre" => "Primer
Nombre ",
"segundo_nombre " => "Segundo
Nombre",
"apellido" => "Apellido",
"telefono" => "telefono"):
/* verifica cada campo excepto el segundo nombre por si hay
campos en bl anco */
foreach ($_P0ST as $campo => Svalor)
{ . . .
if ($campo != "segundo_nombre")
{
if ( Svalor == "" )
'(
Sarregl o_Bl anco[$carripo] = "blanco";
}
} ...........
} / / t e r m i n a r el ciclo foreach para S_P0ST
/* si hay campos en blanco, mostrar el mensaje de error y
el formulario */
if (@sizeof($arreglo_Blanco) > 0) //si se encuentran campos
en blanco
{
echo "<b>No completo uno o mas campos obligatorios.
Debe d i g i t a r : < / b X b r > " ; :
/* mostrar la lista de informacin faltante */
foreach($arreglo)_Blanco sd Scampo => Svalor)

echo
"&nbsp:&nbsp:&nbsp;{Sarreglo_etiqueta[$campo]}<br>
it ,
} //terminar el ciclo foreach para blancos
/* volver a mostrar el formulario */
$primer_nombre=trim(strip_tags($_P0ST[ primer_nombre ]));

$segundo_nombre=trim(strip_tags($_.P0ST['segundono
m b r e ']));
S a pe lido=trim(strip_tags($_POST[apellido' ])):
>36 Parte III: PHP

$tel efono=trim(stri p_tags($_POST['telefono']));


echo "<p><hr>
<form action='chequeaDatos.php' method='POST'>
<center>
<table w i d t h = ' 9 5 % border='0' cel1s pac in g='0'
c e l 1paddi ng='2'>
<tr><td
al i gn='ri ght' ><b> S$arreg o__etiqueta['primer_nombre

</brX/td>
< t d X i n p u t t y pe =' te xt name='primer_nombre'
si z e = 65'
maxlength='65'
value='{$primer_nombrel' X / t d >
</tr>
<tr><td
al i g n = ri g h t '><b>{arreglo_etiqueta['segundo_nombr
e ' 3} :
</brX/td>
< t d X i n p u t t y p e = text' n a m e = 'segundo_nombre
si z e = '65'
maxlength='65' v a l u e = '$segundo_nombre' >
</td>
</tr>
<trXtd
al ign=' ri g h t 'X b > {arregl o_etiqueta['a pe 11 ido' ]):
</bX/td>
<td> <input type =' te xt name='apel l.ido' size='65
maxlength='65' value='$apellido> </td>
</tr>
<tr><td
al i g n= 'r ig ht><b>{$arreglo_etiqueta['telefono']}:
</bX/td>
<td> <input type='text' name='telefono' s i ze =' 65
m a x l e n g t h = '65' value='$te 1e f o n o '> </td>
</tr>
</tabla>
< p X i n p u t type='submit'
value='Enviar nombre y numero telefonico'>
</form>
</center>":
exitO;
}
echo "Bienvenido";
?>
</bodyX/html >

Para revisar si hay vacos, el programa hace lo siguiente:

1. Establece un arreglo de etiquetas de campo. Estas etiquetas se usan


com o etiquetas en el formulario, y tambin se usan para mostrar la lista
de informacin faltante.

2. Se mueve en ciclo por todas las variables pasadas desde el formulario,


revisando si hay vacos. Las variables estn en el arreglo $ _P0ST. Cual
quier campo en blanco que se encuentre se agrega a un arreglo de cam
pos en blanco $arregl o_bl anco.
Captulo 8: Datos entran, datos salen

3. Revisa si se encontraron campos vacos. Verifica el nmero de elemen


tos en S a r r e g l o _ b l a n c o .

4. Si no se encontr ningn campo en blanco, salta al mensaje de bienvenida.

5. Si encontr uno o ms campos en blanco:


i. Muestra un mensaje de error. Este mensaje explica al usuario que
falta alguna informacin obligatoria.

ii. Muestra una lista de inform acin faltante. Hace un ciclo por
$ s e r i e _ b l a n c o y muestra la (s ) etiqueta(s).

iii. Despliega el formulario. Como el formulario incluye nombres de


variables en el atributo valor, la informacin que el usuario digit
anteriormente se recupera de $_P0ST y se despliega.

iv. Sale. Se detiene despus de desplegar el formulario. El usuario de


be hacer clic en el botn Submit para continuar.

jSJKM. Recuerde. Los programas que procesan formularios usan la informacin del for
mulario. Si usted los corre por s solos, no tienen ninguna informacin que se ha
ya pasado del formulario y no corrern correctamente. Estos programas fueron
hechos para correr cuando el usuario oprime el botn Submit para un formulario.

No se olvide del enunciado exi t. Sin el enunciado exi t, el programa continua


ra y mostrara el mensaje de bienvenida despus de mostrar el formulario.

La Figura 8-13 muestra la pgina web que resulta si el usuario no digit su pri
mer o segundo nombre. Observe que la lista de informacin faltante no inclu
ye el segundo nombre, pues ste no es obligatorio. Adems, observe que la
informacin digitada originalmente por el usuario en el formulario todava
aparece en los campos del formulario.

Verificar et formato de la informacin


Cuando los usuarios deben digitar informacin en un formulario, usted puede
esperar cierto nmero de errores de digitacin. Puede detectar algunos de
estos errores cuando el formulario es enviado, hacrselos saber al usuario y
luego solicitarle que vuelva a digitar la informacin. Por ejemplo, si el usuario
dgita 8899776 en el campo del cdigo postal, usted sabe que esto no es co
rrecto para los Estados Unidos. Esta informacin es muy larga para ser un c
digo postal y muy corta para ser el cdigo postal +4.

Usted tambin debe protegerse de los usuarios maliciosos, usuarios que po


dran querer daar su sitio web o su base de datos, o robar informacin suya
o de sus usuarios. No querr que los usuarios digiten etiquetas HTML en los
campos del formulario: algo que podra tener resultados inesperados cuando
se enva a un explorador web. Una etiqueta particularmente peligrosa sera
una etiqueta de scriptque permite a un usuario introducir un programa en el
campo de un formulario.
Parte III: PHP

M i iiiiiiiin 1 1 1 mi n i
file fifi! V iew r s w iillR T n n h Help
^ -
flaok
- d O 2
J
a i; J
F *w ** Hptay '
.y
_
_j
-P m
w . +
^ . . . JjjM to w JLA;
**< i , , php ; 3 s ! o * * ; i r ? *
: *=^1
You didn't fill in one or more rrquired fieids. Yon mus enter:
First ame

F ir s t a m e : j

M id d le a m e : f
L a s tN a m e : js m it h

P K o r n : 5 5 5 -5 5 5 -5 5 5 5

Submit neme and oddress


Figura 8-13:
El resultado
de procesar
un form ula
rio con in
formacin
faltante. d
! M m m I

Si usted revisa cada campo en busca de su formato esperado, puede pescar


errores y protegerse de la mayora del contenido malicioso. Sin embargo, ve
rificar la informacin es un asunto delicado. Usted quiere hallar tantos datos
incorrectos como sea posible, pero no desea bloquear ninguna informacin
legtima. Por ejemplo, cuando revisa un nmero telefnico, podra limitarlo a
nmeros. El problema con esta verificacin es que rechazara nmeros telef
nicos legtimos en el formulario 555-5555 u (888) 555-5555. Por eso, usted
tambin debe permitir guiones (-), parntesis ( ) y espacios. Podra limitar el
campo a una longitud de 14 caracteres, incluyendo parntesis, espacios y
guiones, pero esto rechazara nmeros del extranjero o nmeros que inclu
yan una extensin. En resumidas cuentas: Usted debe pensar cuidadosamen
te cul informacin desea aceptar o rechazar para cualquier campo.

Puede verificar la informacin en el campo usando expresiones regulares, las


cuales son patrones. Usted compara la informacin en el campo con el pa
trn para ver si concuerda. Si no concuerda, la informacin en el campo es
incorrecta, y el usuario debe digitada de nuevo. (Consulte el Captulo 6 para
ms sobre las expresiones regulares.)

En general, estos son los enunciados que se usan para revisar campos:

if ( !er eg f" p a t r n " ,nombredevariable) )


{
echo mensaje de error;
volver a mostrar el formulario;
exitO;
}
echo "Bienvenido";
Captulo 8: Datos entran, datos salen

Observe que la condicin en el enunciado i f es negativa. O sea, el ! (signo


de admiracin) significa "not". Entonces, el enunciado if realmente dice: Si la
variable no concuerda con el patrn, ejecute el bloque i f.

Por ejemplo, suponga que usted desea revisar un campo de input que contiene
el apellido del usuario. Puede esperar que los apellidos contengan letras y no n
meros, y posiblemente caracteres como un apstrofo y un guin (como en
O'Hara y Smith-Jones, respectivamente) y tambin espacios (com o en Van Dyk).
Adems, es difcil imaginar un nombre que tenga ms de 50 caracteres. As, us
ted puede usar los siguientes enunciados para chequear un apellido:

if ( ! e r e g ( " [ A - Z a - z ' -] { 1 , 5 0 } " , $ape 11 ido)


{
echo mensaje de error;
volver a mostrar el formulario;
exi t ( );
1
echo "Bienvenido";

Si quiere incluir un guin ( - ) com o parte de un conjunto de caracteres per


mitidos encerrados entre corchetes ( [ ] ), debe indicar el guin al inicio o al
final de la lista. De otro modo, si lo pone entre dos caracteres, el programa lo
interpretar como el rango entre los dos caracteres, com o en A Z.

En la seccin anterior, usted aprendi cmo verificar cada campo del formu
lario para garantizar que no haya vacos. Adems de esta accin, probable
mente tambin querr verificar todos los campos que tienen datos para
asegurarse de que los datos tengan un formato aceptable. Puede chequear el
formato haciendo unos cuantos cambios simples al programa en la Lista 8-12.
La Lista 8-13 muestra el programa modificado llamado chequetodos.php.

Lista 8-13: Program a que revisa to dos los datos en los cam pos de un form ulario
<? php
/* Nombre del programa: chequeaTodos.php
* Descripcin: El programa revisa todos los campos del
formulario para ver si hay campos en blanco o tienen
el formato incorrecto.
*/
?>
< h tml>
<head><title>Campos vacios</tit;Ie></head>
<body>
<? php
/* establece una serie de etiquetas de campos */
$arreglo_etiquetas= array ( "primer ..nombre" => "Primer Nombre

"segundo..nombre" => "Segundo Nombre ",


y"apellido " => "apellido ,
"telefono" X "telefono");
foreach ($_P0ST as Icampo => $valor)
2liQ Parte III: PHP

/* verificar cada campo excepto el segundo nombre por si hay


campos en blanco */
if ( $valor == "" )

if ($campo != segundo_nombre")
{
$arregloblanco[$campo] = "blanco";
1
}
elseif (campo == "primerjiombre" o campo ==
segundo_nombre
o $campo == "apel1 ido " )
1
if (!ereg("A [A-Za-z' -]{1,50}$",$_P0ST[$campo]) )
{
$mal_formato[$campo] = "malo";
}
1
elseif ($campo == "telefono")

if(!ereg(A [0-9)( - ] i7 ,20} (([xX]I(ext)|(ex))?[ -]?[0-
9]{1.7})?$",$valor))
{
$mal_formato[lcampo] = "malo";
1
1
1
/* si cualquier campo no esta bien, mostrar un mensaje de error
y el formulario */
if (@sizeof($arregloblanco) > 0 or @sizeof(mal_formato) > 0)
1
if (@sizeof($arreglo_blanco) > 0)
.{
/* mostrar mensaje de informacin faltante */
echo "<b>No completo uno o mas de los campos
obligatorios. Debe digitar:</b><br>";
/* mostrar la lista de la informacin faltante */
foreach($arreglo_blanco como $campo => $valor)
{
echo
"&nbsp;&nbsp;&nbsp;{arreglo_etiquetas[campo])<br>" ;
}
1
if (@sizeof($mal_formato) > 0)
{
/* mostrar mensaje de informacin incorrecta */
echo <b>Uno o mas campos tienen informacin que parece
incorrecta. Corrija el formato de:</bXbr>";
/* mostrar la lista de la informacin incorrecta */
foreach($mal_formato as campo => iva 1o r )
{
echo
"&nbsp;&nbsp;&nbsp;{arreglo_eti quetas[campo])<br>";
1
}
/* volver a mostrar el formulario */
primer_no)nbre = _P0ST['primerjiombre'] ;
$segundo_nombre = _P0ST['segundo., nombre'];
apel 1 ido = .$_P0ST[:'apel 1 ido' ];
telefono = $_P0ST['telfono
echo <p><hr>
<form action='checkTodos.php' method='P0ST>
Captulo 8: Datos entran, datos salen

<center>
Ctable width='95%' border='0' cellspacing^'O'
cellpaddjng='2'> ,
<tr)<td
al ign='right><B){$ar.reglo_etiquetas['primer_nombre]
}: </ brX/td>
< t dXinput type='text name='primer_nombre' size='65'
maxl ength='65'
value='$pri merenombre' > </td>
</tr>
<trXtd
al ign='right'XB>{$arreglo_etiquetas['segundo_nombre'
]}:</brX/td>
<tdXinput type='text name='segundo_nombre' size='65'
maxlength='65'
value='$segundo_nombre' > </td>
</tr>
<tr><td
align='right'XB>{$arreglo_etiquetas['apellido']}:</B
></td>
<td> Cinput type='text' name='apel1 id o size='65'
maxlength='65'
value=$apel1 ido'> </td>
</tr>
<tr><td
al ign=' ri g h t 'X B > { $arreg o_eti quetas['te 1efono' ] :</B
X/td>
<td> <input type='text' name='telefono' size='65'
maxlength='65
value='$telefono> </td>
</tr>
</table>
< p X i n p u t type~'submit' value='Enviar el nombre y el
numero telefnico')
</form>
</center>";
exi t():
1
echo- "Bienvenido"; ...
?>
</body)</html>

Estas son las diferencias entre este programa y el programa de la Lista 8-12:
) > Este programa crea dos series para los datos problema. Crea
$ s e r i e_b 1 a n c o, al igual que el programa anterior. Pero este programa
tambin crea $ m a l _ f o r m a t o para los campos que contienen informa
cin con un formato no aceptable.
Este programa hace un ciclo por $mal_formato para crear una lista se
parada de datos problemticos. Si hay campos vacos, crea un mensaje de
error y enumera los campos con problemas, al igual que el programa ante
rior. Si hay campos con un formato inaceptable, este programa tambin
crea un segundo mensaje de error y enumera los campos problemticos.
La pgina web en la Figura 8-14 es el resultado obtenido cuando el usuario acciden
talmente dgita su primer nombre en el campo del segundo nombre y tambin dgi
ta un sinsentido como nmero telefnico. Observe que aparecen dos mensajes de
error, los cuales muestran que el campo del primer nombre est en blanco y el
campo del nmero telefnico contiene informacin incorrecta.
Parte III: PHP

Dar a tos usuarios ta oportunidad de


escoger, con mttptes (fotones de enOo
Usted puede usar ms de un botn Submit en un formulario. Por ejemplo, en
un formulario para pedidos del cliente, podra usar un botn que diga Enviar
pedido y otro que diga Cancelar pedido. Sin embargo, slo puede enumerar un
programa en la parte acti on=nombreprograma de su etiqueta formul ario,
lo cual significa que los dos botones corren el mismo programa. PHP resuelve
este problema. Usando PHP, usted puede procesar el formulario de manera
diferente, dependiendo de en cul botn el usuario haga clic.

Los siguientes enunciados crean un formulario con dos botones de envo:

<form action =" do sb oto ne s.php" method="POST">


<input type="texto" name="apel 1 ido maxlenght="50"Xbr>
<input type="submit" name="mostrar_boton"
value="Mostrar di recci on">
<input type="submit" name="mostrar_boton"
v a l u e = Mostrar numero telefnico")
</form>

Observe que los campos para los botones de envo tienen un nombre:
mostrar Ja o t o n. Cada uno de los campos tiene un valor diferente. Cualquiera de los
dos botones en que el usuario haga clic establece el valor para Imostrar. boton. El
programa dosbotones.phpenla Lista 8-14 procesa el formulario anterior.

& C heck a ll fie ld s - Netscape


ili> Efit y ie w o C o m m u n iu to r IJelp
t -
Back
^
s -*
, '
H r iu a d
l
H o rv S w fL h
>ii
N e ts c a p e
d fc '
Pnnl
dt
_ Seeunp
ft
r -

^ " B o o k m a ik s L c c a t e n j iM p /7 |a n e v a l san u c o m /P H P M ^ y S Q U o rD u m m te > /c h e c k A II p h p z lt

You didnt fill in one or more required fields. You must enter:
First am e
One or more fields have informado n that appears to be incorrect. Correct the format for:
Phone

F irs t am e:

Figura 8-14: M id dle P an: j G o l i a t h

El resultado Last ame: jsm th


de procesar Phone: jxxx-xxxx
un form ula
rio tanto con
informacin
faltante co
mo con in
formacin
incorrecta.
DocuHenfts Da
_______________________________ Captulo 8: Datos entran, datos salen

L ista 8-14 : P ro g ra m a q u e p ro ce sa d o s b o to n e s de envo


<? php
/* Nombre del programa: d o sb ot on es.php
* Descripcin: El programa muestra diferente informacin
* dependiendo de cual boton de envi fue presionado.
*/
?>
<html>
<head><titie>Direccion o Numero telefnico del
el i ente</titl e X / h e a d >
<body>
<?php
$usuar io =" ad min ";
$h ue sp ed="localhost";
$ elav e= "";
$basededatos = "Directoriodemiembros";
$conexion = mysql_connect($huesped,$usuario,$clave)
or die ("No se pudo conectar al servidor");
$db = mysql_sel ect_db.( $basededatos ,Scon ex io n)
or die ("No se pudo seleccionar la base de datos");
if ($ _ P 0 S T [ 'mo s t r a r _ b o t o n '] == "Mostrar Direccin")
{
Sconsulta = "SELECT cal 1e ,c i u d a d ,e s t a d o ,codigopostal
FROM Miembro
WHERE a pe 1ido='$_P0ST[apel1 i d o ] ' ;
Sresultado = mysql_query($consulta)
or die ("No se pudo ejecutar la cons ul ta . );
$fi 1 a = mysql_fetch_array($resul t a d o ) ;
extract($fi la);
echo "Seal 1e < br >$ ci ud ad, testado $codigo_postal<br> ;
}
el se
{
Sconsulta = "SELECT telefono FROM Miembro
WHERE ape 1 i d o = '$_P0ST[apel1 i d o ] '";
Sresultado = mysql_query($consulta)
or die ("No se pudo ejecutar la consulta.");
Sfila = my sq l_fetch_array($resultado); , :
echo "Telefono: {$fi 1a [ 'telefono'] )<br>";
}
?>
</body></html>

El programa ejecuta diferentes enunciados, dependiendo de cul botn se ha


presionado. Si el usuario hace clic en el botn de la direccin, el programa da
como output la direccin que corresponde al nombre enviado en el formula
rio; si el usuario hace clic en el botn Mostrar nmero telefnico, el progra
ma muestra el nmero de telfono.
2tU Parte III: PHP

Insertar informacin en una base de datos


Su aplicacin probablemente necesite almacenar datos en su base de datos. Por
ejemplo, su base de datos podra almacenar informacin que un usuario digit en
un formulario para su uso; un Directorio de miembros es un buen ejemplo de es
to. O bien, su base de datos podra almacenar datos temporalmente durante la
aplicacin. De cualquier modo, usted almacena datos enviando consultas SQL a
MySQL. (Le explico las consultas SQL en detalles en el Captulo 4.)

Preparar los datos


Debe preparar los datos antes de almacenarlos en la base de datos. Preparar
los datos incluye lo siguiente:

Poner 1os datos en variables


Asegurarse de que los datos estn en el formato esperado por la base de datos

v* Depurar los datos

Poner tos datos en daables


Los datos se almacenan envindolos a la base de datos en una consulta SQL. Usted
almacena los datos en variables e incluye los nombres de las variables en la con
sulta. Este proceso es simple si se usa PHP. El usuario proporciona la mayora de
los datos que usted desea almacenar por medio de un formulario. Como coment
anteriormente en este captulo, PHP almacena los datos en una variable con el
nombre del campo del formulario, en forma invisible y automtica, sin necesidad
de que usted mismo los almacene. Usted nada ms usa las variables que PHP pro
porciona. Ocasionalmente, querr almacenar la informacin que usted mismo ge
nera, tal como la fecha de hoy o el nmero del pedido de un cliente. Slo debe
guardar esta informacin en una variable, para poder incluirla en una consulta.

Usar el formato correcto


Al disear su base de datos, usted establece el tipo de datos para cada co
lumna. Los datos que desea almacenar deben concordar con el tipo de datos
de la columna en la cual los desea almacenar. Por ejemplo, si la columna es
pera datos del tipo de nmeros enteros, los datos deben ser nmeros. 0 si la
columna espera datos que sean fechas, los datos enviados deben tener un
formato que MySQL reconozca como una fecha. Si usted manda datos con el
formato incorrecto, MySQL igualmente los almacenar, pero puede ser que
no almacene el valor que usted espera. Estos son los detalles de cmo
MySQL almacena datos para los tipos de datos usados ms frecuentemente:

i is* CHAR o VARCHAR: Almacena cadenas. MySQL almacena prcticamente


cualquier dato enviado a una columna de caracteres, incluyendo nmeros o
i fechas, como cadenas. Cuando usted cre la columna, especific su longi-
Captulo 8: Datos entran, datos salen

tud. Por ejemplo, si especific CHAR( 2 0 ) , slo 20 caracteres se podrn alma


cenar. Si enva una cadena que tenga ms de 20 caracteres, slo los primeros
20 caracteres se almacenarn. Los caracteres restantes se eliminan.

Establezca maxlength para cualquier campo de input de texto en un for


mulario a la misma longitud del ancho de la columna en la base de datos
donde se almacernarn los datos. De ese modo, el usuario no podr digi
tar ms caracteres de los que puede almacenar la base de datos.
^ INT o DECIMAL: Almacena nmeros. MySQL tratar de interpretar cualquier
dato enviado a una columna de nmeros como un nmero, ya sea que tenga
sentido o no. Por ejemplo, podra interpretar una fecha como un nmero, y us
ted terminara con un nmero como 2001.00. Si MySQL es incapaz de interpre
tar los datos enviados como un nmero, guardar 0 (cero) en la columna.
Ii
D A T E : Almacena fechas. MySQL espera fechas como nmeros con el
ao primero, despus el mes y, por ltimo, el da. El ao puede tener dos
o cuatro dgitos (2001 01). La fecha puede ser una cadena de nmeros;
o bien, se puede separar cada parte con un guin (-), un punto (.) o una
diagonal ([). Algunos formatos vlidos para las fechas son 20011203,
980103, 2001-3-2 y 2000.10.01. Si MySQL no puede interpretar los datos
enviados como una fecha, almacena la fecha como 0000-00-00.

ENUM: Almacena slo los valores que usted permiti cuando cre la co-
: lumna. Si enva datos que no son permitidos, MySQL almacena un 0.

En muchos casos, los datos se recopilan en un formulario y se almacenan en la


base de datos tal y como estn. Por ejemplo, los usuarios digitan sus nombres
en un formulario, y el programa los almacena. Sin embargo, en algunos casos,
los datos deben cambiarse antes de ser almacenados. Por ejemplo, si un usua
rio dgita una fecha en un formulario en tres listas de seleccin separadas para
mes, da y ao (com o describo en la seccin "Construir listas de seleccin", an
teriormente en este captulo), los valores en los tres campos deben juntarse en
una sola variable. Los siguientes enunciados juntan los campos:

$expDate = $_P0ST['expYear
$expDate.= $P0SI [ e x p M o n t h ]." - ;
$expDate.= $_P0 ST ['e x p D a y ] ;

Otro caso en el cual usted podra querer cambiar los datos antes de almace
narlos es cuando est guardando nmeros telefnicos. Los usuarios digitan
los nmeros de telfono en una variedad de formatos, usando parntesis, ra
yas, puntos o espacios. En vez de almacenar esta variedad de formatos en su
base de datos, usted podra slo guardar los nmeros. Luego, al recuperar un
nmero telefnico de la base de datos, puede formatearlo com o quiera antes
de mostrarlo. El siguiente enunciado retira caracteres de la cadena:

$telefono =.erec^repiace("[ )(.-]" ," ,$ _ P 0 S T [ 't e l e f o n o ']);

La funcin ereg_repl ace usa expresiones regulares para buscar un patrn.


La primera cadena que se pasa es la expresin regular con la cual debe coin
cidir. Si cualquier parte de la cadena concuerda con el patrn, es reemplaza
2t>6 Parte III: PHP

da por la segunda cadena. En este caso, la expresin regular es [ ) ( . - ] , lo


cual significa cualquiera de los caracteres entre los corchetes. La segunda ca
dena es la cual es una cadena sin nada. Por lo tanto, cualquier espacio, pa
rntesis, puntos o guiones en la cadena son reemplazados por nada.

Depurar los datos


La seccin anterior "Obtener informacin del usuario," la cual describe el uso de
los formularios HTML, discute cmo verificar los datos en los formularios. Los
usuarios pueden digitar datos en un campo de texto, ya sea accidental o malicio
samente, los cuales pueden causar problemas para su aplicacin, su base de da
tos o sus usuarios. Revisar los datos y aceptar slo los caracteres esperados
para la informacin solicitada puede evitar muchos problemas. Sin embargo, us
ted puede pasar algo por alto. Adems, en algunos casos, la informacin que el
usuario dgita debe permitir bsicamente cualquier cosa. Por ejemplo, usted
normalmente no permitira los caracteres < y > en un campo. No obstante, po
dra existir una situacin en la cual el usuario necesite digitar estos caracteres,
tal vez al digitar una frmula o especificacin tcnica que los requiera.

PHP brinda dos funciones que pueden depurar los datos, hasta convertirlos
en inofensivos:

| i> s t r i p_t a g s : Esta funcin retira todo texto encerrado entre < y > de los da-
|tos. Busca un < de apertura y lo elimina junto con todo lo dems, hasta en-
contrar un > de cierre o llegar al final de la cadena. Usted puede incluir
etiquetas especficas que desea permitir. Por ejemplo, el siguiente enunciado
elimina todas las etiquetas de una cadena de caracteres excepto <b > e <i>:
$ a pe 1 ido = strip_tags($apellido,"<b><i>");

v* html speci al cha rs : Esta funcin cambia algunos caracteres especia


les que tienen significado para HTML a un formato HTML que permita
mostrarlos sin ningn significado especial. Los cambios son

< se convierte en &lt:

> b se convierte en &gt;

& b se convierte en &amp;

De esta forma, los caracteres < y > se pueden mostrar en una pgina
web sin ser interpretados por HTML com o etiquetas. El siguiente enun
ciado cambia estos caracteres especiales:
$apel1 i do = htmlspeci alchars($apel1 id o ) ;

Si usted est seguro de que no desea permitir a sus usuarios digitar ningn
carcter < o > en un campo de un formulario, use stri p_tags. Sin embargo,
si desea permitir los caracteres < o >, puede almacenarlos con seguridad des
pus de que hayan sido procesados mediante html speci al chars.

Otra funcin que debera usar antes de almacenar los datos en su base de datos
es t r im. Los usuarios a menudo digitan espacios al inicio o al final de un campo
Captulo 8: Datos entran, datos salen

de texto sin querer. T r im elimina cualquier espacio al inicio o al final, para que no
sean almacenados. Use el siguiente enunciado para eliminar estos espacios:

$ape l1 ido = t r i m ( $ P 0 S T [ 'apel 1 ido']);

Aqreqar informacin nuea


Se usa la consulta I NSERT (descrita en el Captulo 4) para aadir informacin
nueva a la base de datos. I NSERT agrega una fila nueva a una tabla en una ba
se de datos. El formato general es

$consulta = "INSER 'INTO nombredetabla (c ol ,col,col...)


VALUES ( v a r ' ,v a r ' ,v a r ' ...)";
$resultado = mysq1_query(Iconsul t a )
or die ("No se pudo ejecutar la consulta.");

Por ejemplo, los enunciados para almacenar el nombre y nmero telefnico


que un usuario digit en un formulario son

$primer_nombre = "Goliat"; // del campo del formulario


$apellido = "Perez"; // del campo del formulario
$telefono = "555-555-5555"; // del campo del formulario
$consulta = "INSER INTO Mi embro (apel1 id o ,pri mer j n o m br e,telefono)
VALUES ('$apel1 ido',$primer_nombre','$telefono')";
Sresultado = mysql_query( $consul t a )
or die ("No se pudo ejecutar la co n s u l t a . );

La Lista 8-15 muestra un programa llamado guardartel efono .php, el cual


almacena un nombre y nmero telefnico de un formulario.

L ista 8-15: P ro g ra m a q u e a lm a c e n a d a to s de un fo rm u la rio


<?php
/* Nombre del programa: guardaTelefono.php
* Descripcin: El programa revisa todos los campos del
formulario en busca de campos vacios y formato
incorrecto. Guarda los campos correctos en una base
de datos.
*/
?>
<html>
Ch ea d X t i t i e > N u m e r o telefnico del miembr o< /t it ieX /h ea d>
<body>
<?php
$primer_nombre = strip_tags(trim($_POST['primer_nombre']));
$apel 1 ido = st ri p__tags (t ri m( $_P0STC'apellido']));
$telefono = strip_tags(trim($_PST['telefono']));
Stelefono = ereg_replace("[)( telefono);

/* verificar informacin del formulario */


248 Parte III: PHP

/* establecer serie de etiquetas de campos */


$arreglo_etiquetas = array( "primerjiombre" => "Primer
nombre",
"apel1 i d o => "Apel1 i d o " ,
"telefono" => "Telefono");
foreach ($_P0ST as campo => valor)
{
/* revisar cada campo en busca campos en blanco */
if ( valor == "" )
{
arreglo_b1anco[$campo] = "blanco ;
)
elseif ( ereg (" (nombre)",campo) )
{
if ( ! e r e g ( " A[ A - Z a ~ z ' ~ ] 1 ,50)$",$_P0ST[$campo]) )
{
mal_formato[campo] = "malo";
1
}
elseif (campo == "telefono")
{
if(!ereg("A [0~9)( -]{7,20}(([xX]I(ext)I(ex))?[ -]?[0
9]{1,71)?$",valor) )
{
$malformato[$campo] = "malo";

) // terminar foreach para _P0ST


/* si algn campo no esta bien, mostrar mensaje de error y
formulario */
if (@sizeof($arreglo_blanco) > 0 o @ s i z e o f ($malformato) >
0)
{
if (@sizeof(arreglo_blanco) > 0)
{
/* desplegar mensaje de informacin faltante */
echo "<b>No completo uno o mas campos obligatorios.
Debe digitar:</b><br>";
/* mostrar la lista de informacin faltante */
foreach(arreglo_blanco as campo => valor)
{
echo
"&nbsp;&nbsp;&nbsp;{arreglo_etiquetastcampo]}<br>

if (@sizeof($mal_formato) > 0)
{
/* mostrar mensaje de informacin incorrecta */
echo "<b>Uno o mas campos tienen informacin que
parece ser incorrecta. Corrija el formato
de:</bXbr>";
./* desplegar lista de informacin incorrecta */
foreach($mal_formato as campo => valor)
{
echo
"&nbsp;&nbsp;&nbsp;{arregloetiquetasEcampo]}<br>

}
1
/* volver a mostrar formulario */
Captulo 8: Datos entran, datos salen

echo "<p><hr>
<form action-'chequeaTodos.php' me th od='POST>
<center>
<table w i d t h = '95%' border='0' cel1s pacing=0'
cellpadding='2'->
<trXtd
al i g n = 'r i gh t' XB >{ $a rre gl o etiquetas [' prime renombre
']} : < / b r X / t d >
< t d X i n p u t type='text' name='primernombre' size='65'
m a x l e n g t h = '651
value='$primer_nombre' > </td>
</tr>
<trXtd
al i g n = 'ri g h t '><B>{Sarreglo_eti q u e t as ['ape 1 i d o ']}:<
/BX/td>
<td> <input type='texto' name='apellido' size ='65'
m a x l e n g t h = '65'
value='Sapellido> </td>
</tr>
<trXtd
al ign =' right'XB>{$arreglo_etiquetas[ 'telefono' ] 1 :<
/BX/td>
<td> <input type='texto' name='telefono' size='65'
m a x l e n g t h = '65'
v a l u e = '$telefono'> </td>
</tr>
</table>
< p X i n p u t t y p e = 'submi t ' val ue='Envi ar el nombre y numero
t e le f ni co> :
</form>
< / center>";
exitO.;
}
el se //si los datos estn bien '
{
$usuario="admin";
$huesped="local h o s t " ;
$cla.ve="";
Sbasededatos "Directoriodemiembros";
Iconexi on = m y s q X c o n n e c t d husped,Susuari o, $cl ave)
or die ("No se pudo conectar al servidor );
$db = m y s q V s e l ect_db( Sbasededatos,$conexi o n )
or die ("No se pudo seleccionar la base de d a t o s );

consulta - "INSERI INTO Miembro


(apel 1ido,primerjiombre,telefono)
VALORES
( Sapell i d o ' ,'$prtmer_nombre','$telefono')";
Iresultado = mysql__query($consulta)
or die ("No se pudo ejecutar la consulta.");
echo "Miembro nuevo agregado a la base de datos<br>";
}
?> '
</bodyX/html >

Este programa ampla el programa en la Lista 8-14. Revisa los datos en el formu
lario en busca de campos vacos o formatos incorrectos, y le pide al usuario que
vuelva a digitar los datos cuando encuentra un problema. Si los datos estn bien,
el programa los recorta, los depura y los almacena en la base de datos.
El programa en la Lista 8-15 es un programa de demostracin, el cual muestra
cmo aadir una sola lnea a una tabla de una base de datos. Si usted usa este
programa, slo puede agregar un cliente a la base de datos, pues el programa
no crea ni inserta un nombre de registro nico. Es necesario borrar el cliente
que agreg antes de poder correr el programa nuevamente. Este no es un pro
grama que se usara para agregar clientes en una situacin real. Tan slo se tra
ta de un programa de demostracin muy sencillo para mostrar los principios
que se necesitan. La Lista 12-3 en el Captulo 12 es un ejemplo de un programa
real para aadir clientes, el cual sera til en una aplicacin web verdadera.

Su aplicacin podra necesita almaceanr datos en varios lugares diferentes.


Una funcin que almacena datos de un formulario puede ser muy til. La si
guiente es una funcin que almacena todos los datos en un formulario:

funcion guardadatos(Idatosformulario,$ n om br et ab la)


{
if (!i sarray(Idatosformulari o ) )
!
return FALSE;
exi t ();
}
foreach (Idatosformulario como $campo => Ivalor)
{
$$datosformu!ario [Icampo] = trim($$datosformu1ario [$campo]);
$$datosformulario [$campo] = strip_tags(lldatosformula-
rio [Icampo]);
if ($campo == "telefono")
{
$$datosformulario [Icampo] =
e r e g _ r e p l a c e ( ,1 Idatosformulario [Icampo]);
}
lserie_campo[]=lcampo;
lserie_valor[]=$Idatosformul ario [I c a m p o ] ;
}
lcampos=imp]ode(",",lserie_campo);
lvalores=implode('";H ,|serie_valor);
IconsuTta = "INSERf INfO lnombre_tabla (Icampos)
VALORS (V' lv alores\")":
Iresultado = mysql_query(lconsul t a )
or die ("No se pudo ejecutar la consulta.");
return fRUE;
}

La funcin devuelve f RU E si termina de insertar los datos sin ningn error. Al


principio, la funcin verifica si los datos pasados efectivamente son un arreglo. Si
I d a t os f o rmu 1 a r io no es un arreglo, la funcin se detiene y devuelve FALSE.

Observe que esta funcin slo trabaja si los nombres de los campos en el for
mulario son iguales a los nombres de las columnas en la tabla de la base de
datos. Adems, observe que esta funcin asume que usted ya est conectado
al servidor MySQL y ha seleccionado la base de datos correcta. Al usar esta
funcin, esta es la ltima parte del programa en la Lista 8-15:
Captulo 8: Datos entran, datos salen

else //si los datos estn bien


{
$almacenado = guardadatos($_POST,"Miembro");
echo "Nuevo miembro agregado a la base de datos<br>";
}
?>
</body></html>

Observe cunto ms fcil de leer es este programa, con la mayora de los enun
ciados en la funcin. Ms an, esta funcin trabaja para cualquier formulario,
siempre y cuando los nombres de los campos en el formulario sean iguales a
los de las columnas en la tabla de la base de datos. Si la funcin no es capaz de
ejecutar la consulta, detiene la ejecucin en ese punto e imprime el mensaje de
error"No se pudo ejecutar la consulta ".Si hay alguna circunstancia en
la cual la consulta podra fallar, usted debe tomarla en cuenta.

Actualizar in formacin existente


La informacin existente se actualiza con la consulta UPDATE, tal y como des
cribo en el Captulo 4. Actualizar significa cambiar datos en las columnas de
filas que ya estn en la base de datos: no aadir filas nuevas a la tabla de la
base de datos. El formato general es

iconsulta = "UPDATE nombretabla SET col=valor WHERE col=valor";


Sresultado = mysql.. qu er y( Sc on su lta)
or die ("No se pudo ejecutar la consulta.");

Por ejemplo, los enunciados para actualizar el nmero telefnico de Goliat


Prez son

$primer_nombre = "Goliat"; // del campo del formulario


apellido = "Perez"; // del campo del formulario
Stelefono = "555-555-5555"; // del campo del formulario
Iconsulta = "UPDATE Miembro SET telefono='$ telefono'
WHERE apellido='$apellido'
AND primer_nombre='$primer_nombre ;
Sresultado = my sq l_ qu er y( Sco ns ul ta)
or die ("No se pudo ejecutar la consulta.");

Si no usa una clusula WHERE en una consulta UPDATE, el campo SET se esta
blece para todas las filas. Rara vez es eso lo que usted desea hacer.

La Lista 8-16 muestra un programa llamado actual i zantel e f o n o .php, el


cual almacena un nombre y un nmero telefnico de un formulario.
252 Parte III: PHP

L is ta 8-16: P ro g ra m a q u e a c tu a liza los d a to s _________________


<?php
/* Nombre del programa: actualizaTelefono.php
* Descripcin: El programa revisa el numero telefnico para
ver si el formato es incorrecto. Actualiza el
numero de telefono en la base de datos para el
nombre especificado.
*/
?>
<html>
C h e a d X t i t i e > N u m e r o telefnico del m i e m b r o < / t i t i e X / h e a d >
<body>
<?php
$telefono = strip_tags(trim($_P0ST[-'t e l e f o n o ']));
Stelefono = ereg_replace("[)( ,$telefono):
$primer_nombre = $ _ P 0 ST ['primer_nombre'];
$ a pe 11 ido = $ _ P 0 S T [ 'ap el ii do];

/* verificar la informacin en el formulario */

/* establecer una serie de etiquetas para los campos */


Sarreglo_etiquetas = array ( "primer_nombre => "Primer
nombre",
"apellido" => "Apellido".,
"telefono => "Telefono");
foreach ($_P0ST as $campo => $valor)
{
/* revisar cada campo en busca de campos en blanco */
if ( $valor == "" )
{
$arreglo_blanco[$campo] = "blanco";
1
elseif ( ereg("(nombre)",Icampo) )
{
if ( !ereg("A [A-Za-z' -]{1,50}$",$_P0ST[$campo]) )
1
$mal_formato[$campo] = "malo";
1
1
elseif ($campo == "telefono")
{
if( !ereg("A [0-9)( - ] {7,20}((CxX]|(ext)|(ex))?[ -]?[0-
9]{1,7})?$",$valor))
{
$mal_formato[$campo] = "malo";
1
1
1
/* si algn campo/no estaba bien, mostrar mensaje de error y
formulario */
if (@sizeof($arreglo_blanco) > 0 or @sizeof($mal__formato) >
0)
{
if (@sizeof($arreglo_blanco) > 0)
{
/* desplegar mensaje de informacin faltante */
ech "<b>No completo uno o mas de los campos
obligatorios.
Captulo 8: Datos entran, datos salen

Debe d i g i ta r:</b><br>";
/* mostrar lista de informacin faltante */
foreach($arreglo_blnco as campo => valor)
{
echo
"&nbsp;&nbsp;&nbsp;{arreglo_etiquetas[campo]}<br>
ii #

}
1
if (@sizeof(mal_formato) > 0)
{
/* desplegar mensaje de informacin incorrecta */
echo "Xb>Uno o mas campos tienen informacin que
parece incorrecta. Corrija el formato d e : X / b Xb r> ";
.-'/* desplegar lista de informacin incorrecta */
foreach(malformato as campo => valor)
{
echo
"&nbsp;&'nbsp;&n.bsp; {arregl oetiquet as [campo ] }<br>
ii ,
*

}
1
/* volver a mostrar el formulario */
echo " < p X h r >
<form action='chequeaTodos.php' method='P0ST>
<center>
<table width='95%* border='0' cellspacing='0'
cellpadding='2'>
< t r X t d al igh= ri g h t '> V

<b>{arregl o. et iquetasl. 'primer_nombre' ]} :< / b X / t d >


< t d X i n p u t type-'text' na m e = primer_nombre'
si z e = '65'
m a xl en gt h-'65' v a l u e - 'primer.nombre' > </td>
</tr>
X t r X t d al i g n = 'right.'>
<b>{ arreglo_eti q u e t as ['apel 1 i d o ]}: < / b X / t d >
< t d > :<input type-'text' na m e = apellido' size='65'
maxlength='65' value='apellido'> </td>
</tr>
X t r X t d a 1 ig n = Tri
<b>{arreglo_etiquetas['telefono']}: X/b>X/td>
Xtd> Xinput t y p e - t e x t ' n a m e = 'telefono' s i z e = '65'
maxl en gt h= '6 5 value='telefono'> X/td>
X/tr>
X/table>
Xp>Xinput t y p e = 's u b m i t '
: valu-'Fnviar el nombre y numero telefonico>
X/form> i
X/ceriter>";
exitO; ;
} ..:.j ....O
else //si los datos estn bien
{ .
usuario-"adrnin";
huesped-"localhost";
clave="";
basededatos = "Di rectoriodeMiembros";
conexion = mysql. connecthuesped,usuario.clave)
25b Parte III: PHP

or die ("No se pudo conectar al servidor );


$db = mysql_sel ect__db($basededatos,Iconexi on)
or die ("No se pudo seleccionar la base de datos");

consulta = "UPDATE Miembro SET te lefono='$t e 1e f o n o '


WHERE apellido='$apellido' AND
pritner_nombre='$primer_nombre'";
$resultado = mysql_query($consu1 t a )
or die ("No se pudo ejecutar la
c ns ul ta." .mysql_error());
echo " El numero telefnico del miembro se ha
actual i zado <b r> ";
}
?>
</body></html>

El programa de la Lista 8-16, el cual actualiza la base de datos, es casi idnti


co al de la Lista 8-15, que agrega datos nuevos. Usar una consulta UPDATE en
este programa (en lugar de la consulta INSERT usada para aadir datos nue
vo s ) es la principal diferencia. Ambos programas verifican los datos y luego
los depuran porque ambos programas almacenan datos en la base de datos.

Poner ta informacin en archivos


A veces, usted desea recibir un archivo completo de informacin de un usua
rio, tal como currculos de usuarios para su sitio de bsqueda de empleos, o
fotos para su sitio web de lbum fotogrfico. O bien, imagine que est cons
truyendo el catlogo a partir de informacin suministrada por el departamen
to de Ventas. Junto con el texto descriptivo sobre el producto, quiere que
Ventas le proporcione una foto del producto. Usted puede ofrecer un formula
rio que Ventas puede usar para cargar un archivo de imagen.

Usar un formulario para subir el archivo


Puede mostrar un formulario que permite al usuario cargar un archivo usan
do un formulario HTML diseado para dicho propsito. El formato general
del formulario es el siguiente;
t
<form enctype="multipart/form-data"
action="processfi1e.php" method =" PO ST>
<input type="hidden" name=MAX_FILE_SIZE" value="30000">
<input ty p e = file" name="archivo_usuario">
<input type="submit" value="Subir archivo ">
</form>

Observe los puntos siguientes en relacin con el formulario;


Captulo 8: Datos entran, datos salen 255
j> El atributo enctype se usa en la etiqueta form. Usted debe fijar este atri
buto en mui ti part/form-data al subir un archivo, para garantizar que
el archivo llegue correctamente.

v0 Se incluye un campo oculto que enva un valor (en bytes) para MAX. FI LE SI
ZE. Si el usuario trata de cargar un archb ro que es ms grande que este valor, no
podr hacerlo. Usted puede fijar este valor hasta un mximo de 2MB. Si necesi
ta subir un archivo ms grande, deber cambiar la configuracin predetermina
da para u p1oad_max_f i 1 esi ze in php. ini a un nmero mayor antes de
enviar un valor superior a 2MB para MAX_F IL E_S IZ E en el campo oculto.

u0 El campo de input que carga el archivo es del tipo f i 1e. Observe que
el campo tiene un nombre (a rchi vo_usua ri o), al igual que los otros ti
pos de campos en un formulario. El nombre de archivo que el usuario d
gita en el formulario se enva al programa de procesamiento y est
disponible en el arreglo incorporado llamado FI LES. Le explico la es
tructura e informacin en FI LES en la siguiente seccin.

Cuando el usuario enva el formulario, el archivo se sube a una ubicacin tem


poral. El script que procesa el formulario necesita copiar el archivo a otra ubi
cacin, pues el archivo temporal se borra tan pronto como el script termina.

Procesar et archivo cargado


La informacin sobre el archive subido se almacena en el arreglo PHP incorpora
da llamada $ F I LES. Hay un arreglo de informacin disponible para cada archi
vo que haya sido cargado, por lo cual $ _ F I LES es un arreglo multidimensional.
Como con cualquier otro formulario, usted puede extraer la informacin del
arreglo usando el nombre del campo. La siguiente es el arreglo disponible de
$ _ F I LES para cada archivo que se carga.

$_FILES['nombrecampo'] [ 'nombre']
$__FI LES[' n o m b r e c a m p o '] [' ti p o ']
$ _ F I L E S [ 'nombrecampo']['nombre_temporal ']
$_FILES[ 'nombrecampo'.][ 'tamao' ]

Por ejemplo, suponga que usa el siguiente campo para subir un archivo, co
mo se mostr en la seccin anterior:

<input type="file" npmbre="archivo_usuario">

Si el usuario sube un archivo llamado t e s t .txt usando el formulario, el arreglo


resultante que puede usar el programa de procesamiento luce ms o menos as:

$FILES[archivo_usuario][nombre] = test,txt
$_FILES[archivo_usuario][tipo] = texto/simple
$_FILES[archivo_usuario][nombre_temporaI3 = D:\WINNT\php92C.tmp
$_FILES[arcbi vo_usuari o][tamao] = 435
250 Parte III: PHP

En esta serie, nombre es el nombre del archivo que se subi, t i po es el tipo de ar


chivo, nomb re_tempora 1 es la ruta/nombre de archivo del archivo temporal y
43 5 es el tamao. Observe que el nombre contiene slo el nombre de archivo, pe
ro nomb r e__t empo r a 1 incluye la ruta del archivo adems del nombre de archivo.

Si el archivo es demasiado grande para cargarse, el nombretempora i en el


arreglo se establece en ni nguno, y el tamao se establece en 0. El programa de
procesamiento debe mover el archivo subido desde la ubicacin temporal hasta
una ubicacin permanente. El formato general del enunciado que mueve el ar
chivo es el siguiente;

move_upl oaded_fi 1e ( r u t a/ no mb rea rc hi vo te mpo ra 1 , ruta/nombrear-


c h iv op e rma n en t e) ;

ruta/nombrea rch i votempora 1 est disponible en el elemento incorporado del


arreglo$_FILES['nombrecampo']['archivo_temporal']. ruta/nombrear
chivopermanenteesla ruta hacia el archivo donde usted desea almacenar el ar
chivo. El siguiente enunciado mueve el archivo subido en el campo de input, el
cual tiene el nombre a rch i v<y_usiia ri o, mostrado anteriormente en esta seccin:

move__upl oaded_f i 1e($__FI LES[ a rch ivo__usuari o' ][' nombre__temporal'],


'c :\datos\new__f i 1 e .t x t ');

El directorio de destino (en este caso, c : \ d a t o s ) debe existir antes de poder


mover el archivo hacia l. Este enunciado no crea el directorio de destino.

La seguridad es un asunto importante cuando se trata de cargar archivos. Per


mitir que extraos suban archivos a su PC es riesgoso; podra haber archivos
maliciosos. Usted probablemente querr revisar los archivos en busca de tan
tos factores com o sea posible despus de que haya sido cargados, usando
enunciados condicionales para chequear las caractersticas del archivo, tales
como el tipo y tamao de archivo esperados. En algunos casos, para tener in
cluso ms seguridad, sera una buena idea cambiar el nombre del archivo, de
modo que los usuarios no sepan dnde estn sus archivos o cm o se llaman.

Unir todo
Un ejemplo completo de un script se muestra en la Lista 8-17. Este programa des
pliega un formulario para que el usuario suba un archivo, guarda el archivo subi
do y luego muestra un mefosaje despus de que el archivo haya sido cargado
exitosamente. Es decir, este programa despliega el formulario y lo procesa. El
programa espera que el archivo subido sea un archivo de imagen, y lo prueba
para asegurarse de que lo sea, pero cualquier tipo de archivo se puede subir. El
cdigo HTML para el formulario est en el archivo que se muestra en la Lista 8-
18. Una pgina web que despliega el formulario aparece en la Figura 8/15.
Captulo 8: Datos entran, datos salen 257
Lista 8-17: Script que sube un archivo usando un formulario POST
< ?p h p
/* Nombre del programa: subirArchivo.php
* Descripcin: Sube un archivo por medio de HTTP usando un
formulario POST.
*/
i f (!i ss e t ( $ _ P 0 S T [ 'Sub r '])) #5
{
include("form_upload.inc");
} # endif
else #9
f
i f ($_ FI LE S['p i x ']['nombre_temporal '] == "ninguno")
#11
{
echo "<b>El archivo no se subi exitosamente. Verifique
el tamao del archivo. El archivo debe ser menor
que 5 0 0 K . < b r > " ;
incl ude( " f or m_ up lo ad.inc");
exit();
}
if ( !ereg( "i ma ge =,$_ FI LE SCpix' ]['type'])) #16

echo "<b>El archivo no es una imagen. Por favor intente
con otro archivo.</b><br>";
incl ude( " f or m up lo ad.i n c );
ex i t ( );

else #23
{
destino = 'c : \ d a t o s " \ \ " .$_FI LE S['pix']['n o m b r e '];
$archivo.temporal = $_.FILES['pix']['nombre_temporal']:
move_uploaded_file($archivo_temporal ,Sd es ti no ):
echo " < p X b > E l archivo se subi exitosamente:</b>
{$_ TI LES I 'pi x '1['n o m b r e ]}
({$ _ F I L E S [ 'p i x '][' tamannio' -]} )</p>";
.

?>

Aad nmeros al final de algunas de las lneas del script. El script se discute
a continuacin, con referencia a estos nmeros:

5 Esta lnea es un enunciado i f que prueba si el formulario ha sido enviado.


Si no, el formulario se muestra incluyendo el archivo que contiene el cdi
go del formulario. El archivo que se incluye se muestra en la Lista 8-18.

9 Esta lnea empieza un bloque else que se ejecuta si el formulario se ha


enviado. Este bloque incluye el resto del script y procesa el formulario en
viado y sube el archivo.

11 Esta lnea es un enunciado i f que prueba si el archivo se subi exitosamen


te. Si no, un mensaje de error se despliega, y el formulario vuelve a aparecer.
258 Parte III: PHP

16 Esta lnea es un enunciado i f que prueba si el archivo es una imagen. Si


no, un mensaje de error se desplega, y el formulario vuelve a aparecer.

23 Esta lnea inicia un bloque el se que se ejecuta si el archivo ha sido subi


do exitosamente. El archivo se mueve a su destino permanente, y apare
ce un mensaje que indica que el archivo se ha subido.

La Lista 8-18 muestra el archivo que se incluye usado para mostrar el formu
lario para cargar.

L is ta 8 -1 8 : A rc h iv o in c lu id o q u e m u e s tra el fo rm u la rio p a ra s u b ir un archivo


<!- Nombre del Programa: form_upload.inc
Descripcin: Muestra un formulario para subir un archivo -->
<html>
<head><titie>Subir un archivo</1i tie></head>
<body>
Col X I i>Digite el nombre de archivo de la foto del producto
que desea subir o use el boton Buscar para navegar
por el archivo de imgenes.</li>
<li>Cuando la ruta hacia el archivo de la foto aparece en
el campo de texto, haga clic en el boton Upload
Pi c t u r e .</li >
</ol>
Cdiv al i g n = " c e n t e r " X h r >
Cform enctype="multipart/form-data"
action="uploadFi1e.php" method="P0ST">
Cinput type="hidden" nombre="MAX_FILE_SIZE" valor="500000">
Cinput type="file" nombre="pix" tamao="60">
C p X i n p u t type="submit" nombre="Upload"
valor="Upload Picture">
</form>
C/bodyX/html >

Observe que el archivo incluido no contiene cdigo PHP, slo cdigo HTML.

El formulario que permite a los usuarios elegir un archivo para subir se muestra en la
Figura 8-15. El formulario tiene un campo de texto para digitar el nombre del archivo
y un botn Browse que permite al usuario navegar hasta el archivo y seleccionarlo.

[ FileUpload-MicrosoftInternetExplorer
Iti* Hit Vipw (dvoimhs faoia Help
,>D/*k * J cjFtivnnlri jHutw;
m
http://localhott/PHPfcMySQUoiDummies/up1oadFle.php *j
Figura 8-15:
1 Enter the file ame ofthe product pictui e you want to upload or use the browse button to
Formulario navigate to the ptcture file
2 When the path to the picture file shows in the text field, c k k the Upload Picture button
que permite
a los usua
rios subir un 1 ........................... ..... . firowss. }

archivo de
imagen.
F'Dune i-;1Lticaflirtrinvt ^
Captulo 9

Mover informacin de una


pgina Web a otra
^ - i4 -c ^ ' ^ m# # & & . # # & ^ * & # & # dr i- # ^
& * y < & '

En este capitulo
Mover a su usuario de una pgina a otra
Mover informacin de una pgina a otra
* Agregar informacin a un URL
Echar un vistazo a las cookies
Usar campos ocultos en los formularios
Descubrir sesiones PHP

a mayora de los sitios web constan de ms de una pgina web. Esto inclu

ye pginas web estticas que usted tal vez haya desarrollado en el pasado.
Con las pginas web estticas, los usuarios hacen clic en los vnculos para mo
verse de una pgina a la siguiente. Los usuarios hacen clic en un vnculo de una
pgina web, y una nueva pgina aparece en su explorador. Cuando los usuarios
se mueven de pgina en pgina de este modo, no se transfiere informacin de la
primera pgina a la segunda. Cada pgina nueva que se enva al explorador del
usuario es independiente de cualquier otra pgina que el usuario haya visto an
teriormente. Con las pginas web dinmicas, usted quizs necesite transferir
informacin de una pgina a otra. Si usted es un desarrollador de avanzado
HTML, probablemente tenga algo de experiencia con mtodos limitados para
transferir informacin de una pgina a la siguiente usando formularios HTML y
CGI (Common Gateway Interface) o cookies. Sin embargo, PHP es mucho ms
poderoso para pasar informacin de una pgina web a otra.

MoOer a su usuario de una pgina a otra


Al usar slo HTML, usted proporciona vnculos para que el visitante pueda ir
de una pgina a otra en su sitio web. Cuando usa PHP, sin embargo, tiene tres
opciones para mover a su usuario de una pgina a otra:
260 Parte III: PHP

\S Vnculos: Puede hacer eco de las etiquetas HTML que despliegan un vncu
lo. El formato general de un enunciado HTML que despliega un vnculo es
<a h r e f = " n e w p a g e . php" >Text o que el us uar i os ve como
v i nc ul o </a>

Cuando los usuarios hacen clic sobre el vnculo, el programa newpa


ge . php se enva a su buscador. Este mtodo se usa extensivamente en
las pginas web en HTML. Usted probablemente est familiarizado con
la creacin de vnculos debido a su experiencia con HTML, pero si nece
sita un refrescamiento, puede averiguar ms sobre los vnculos en cual
quier libro sobre HTML, tal como HTML 4 For Dummies Quick Reference,
2a Edicin, por Deborah S. Ray y Eric J. Ray (W iley Publishing, Inc.).

Botones para enviar formularios: Puede usar un formulario HTML con


uno o ms botones de envo. Cuando el usuario hace clic en un botn de
envo, el programa en la etiqueta formul a r i o corre y enva una pgina
web nueva al explorador del usuario. Usted puede crear un formulario
sin campos (slo con un botn de envo) pero el usuario debe hacer clic
en el botn de envo para moverse a la pgina siguiente.
Comento los formularios y los botones de envo en detalle en el Captulo 8.

v* La funcin header: Puede enviar un mensaje al servidor web que le dice


que enve una pgina nueva usando la funcin header de PHP. Cuando
^ usa este mtodo, puede mostrar una pgina nueva en el explorador del
usuario sin que el usuario necesite hacer clic en un vnculo o un botn.

La funcin header puede usarse para enviar una pgina nueva al explorador
del usuario. El programa usa un enunciado header y despliega la pgina web
nueva sin necesidad de ninguna accin por parte del usuario. Cuando el
enunciado header se ejecuta, la nueva pgina aparece. El formato de la fun
cin header que solicita una pgina nueva es

h e a d e r ( " L o c a t i o n : URL ) :

El archivo localizado en el URL se enva al explorador del usuario. Cualquiera


de los enunciados siguientes es un enunciado header vlido;
y
h e a d e r " L o c a t i o n : pagina nueva. php") ;
header ( " L o c a t i o n : http://compai a.com/cata logo/cat a i ogo. php");

Sin embargo, la funcin header tiene una limitacin importante. El enunciado


header slo puede usarse antes de enviar cualquier otro output. No se puede
mandar un mensaje solicitando una pgina nueva en medio de un programa
despus de haber hecho eco a algn output de la pgina web. Vea una discu
sin al respecto en el cuadro "Enunciados que deben ir antes del output".

A pesar de su limitacin, la funcin header puede ser til. Usted puede tener
tantos enunciados PHP com o desee antes de la funcin header, siempre y
cuando no enven output. Por lo tanto, los enunciados siguientes funcionarn:
Captulo 9: Mover informacin de una pgina Web a otra
SPc

URLs
Un UR L(Uniform Resource Locator) es una di probadores, pero no para los clientes. Cuan
reccin en la W orld W id e W eb. Cada pgina do el sitio est listo para los clientes, se po
w eb tiene su propio URL o direccin. El URL es ne a la disposicin en el puerto 80.
utilizado por el servidor w eb para encontrar la
r u t a : Esta es la ruta hasta el archivo, la
pgina w e b y enviarla a un explorador.
cual sigue las reglas de cualquier ruta. La
El formato de un URL es raz de la ruta es el directorio principal del
sitio w eb. Si la ruta seala hacia un directo
H T T P : //n o m b r e d e l s e r v i d o r : nume-
rodepuerto/ruta/fmeta ?cade- rio, en lugar de hacia un archivo, el servidor
na=cadena w eb busca el nombre predeterm inado del
archivo, tal como default.html o n
Este es un desglose de las partes que confor dex . ht ml . La persona que administra el
man el URL: sitio w eb define el nombre del archivo pre
v * H T T P : / / nombredel s e r v i d o r : Estele determ inado. La ruta /c at a l o g o / s
indica al servidor que la direccin es un sitio how, php indica un directorio llamado
w eb y le da el nombre del PC dondel sitio w eb catal ogo que est en el directorio princi
se localiza. Otros tipos de transferencia se pal del sitio w eb y un archivo llamado
. pueden especificar, tal como FTP (File Trans- show.php. La ruta c a t a l o g o / s
fer Protocol), pero estos no se relacionan con how .php indica un directorio llamado ca
el tema de este libro. Si se deja por fuera es tlogo que est en el directorio actual.
ta parte del URL, el servidor w eb asume que v* #me t a ; Una etiqueta HTM L define una me
el PC es el mismo desde donde se est digi ta. Esta parte del URL m uestra una pgina
tando el URL. Opciones vlidas para esta par w eb en la ubicacin donde est colocada
te son H IIP : // am az on.com o la etiqueta objetivo. Por ejem plo, si la eti
H T T P : //I ocal h o s t . Nota: HTTP no de queta < a nombre="me ta ">< /a > est
be estar necesariam ente en maysculas. en medio del archivo en alguna parte, la p
v * : nrjinerodepuerto: El servidor w eb in gina w eb aparecer en la etiqueta, y no al
tercam bia inform acin con Internet en un inicio del archivo.
puerto particular del PC. La mayora de las ?cadena=cadena : El signo de interroga
veces, el servidor w eb est configurado pa cin permite agregar informacin al final del
ra comunicarse por medio del puerto 86. Si el URL. La informacin en formularios que usan
nmero del puerto no se especifica, se asu el mtodo get se pasa al final del URL en el
me que es el puerto 80. En algunas circuns formato nombredecampo=val or. Usted
tancias poco comunes, un servidor w eb puede agregar informacin al final de un
puede usar un nmero de puerto diferente, URL para pasarla a otra pgina. PHP auto
en cuyo caso el nmero del puerto debe es mticamente obtiene informacin del URL y
pecificarse. La razn ms comn para usar la pone en series incorporadas. Usted puede
un nmero de puerto diferente es al montar pasar ms de un par de cadena=cadena
un sitio w eb de prueba en otro puerto que es separando cada par con un signo (&): por
t disponible slo para los desabolladores y ejemplo, ?estado=CA&ci udad=hogar.
262 Parte III: PHP

Enunciados que deben ir antes del output


A lgunos e n u n ciad o s PHP slo pued en usarse antes de e n viar cualq u ier output. Los enunciados
h e a d e r y s e t c o o k i e , y las fu n c io n es s e s s i on (todos ellos descritos en este captulo), de
ben ir an tes de e n viar c u a lq u ie r output. Si usted usa uno de estos enun ciados despus de enviar
output, v e r el siguiente m ensaje:
Cannot add header Inform ation - headers already sent
El m ensaje tam bin proporcionar el nom bre del archivo e indicar cul linea envi el output anterior.
0 bien, tal vez usted no vea un m ensaje del todo; la pgina nueva sim plem ente no aparecer. (El que
vea un m ensaje de error o no depender del nivel de m ensajes de error al que est configurado PHP;
consulte el Captulo 6 para m s detalles). Los enunciados siguientes fallarn porque el mensaje hea -
d e r no es el prim er output:
<html>
C h e a d X t i t l e>comprobar encabezado</title></head>

<body>
<?php
he a d e r ("Locati o n : h t t p :// e m p r e s a .co m " );
?>
</body>

</htm l>
S e envan tre s lneas de cdigo H T M L antes del enunciado h e a d e r . Los siguientes enunciados
fu n c io n a r n , aunque no tien e n m uch o sentido:
<?php
header( "Location: http://em presa.com " ) ;
?>
<html>
< h e a d X t i t f e>comprobar encabezado</titi eX /head>
<body>
</body>
</html> s
Las siguientes enun ciados falla r n :
<?php
header( " Location: http://em presa.com " ) ;
?>
<html>
<headXtitie>com probar encabezado</titieX/head>
<body>
</body>
</html>
La razn por la cual estos e nun ciados fallan no es fcil de v er pero, s usted observa cuidadosam en
te , notar un espacio sencillo en b lanc o antes d l a etiqueta PH P de apertura. Este espacio vaco es
o u tp u t p ara el explorador, aunque la pgina w e b resultante se vea vaca. Por lo tanto, el enunciado
h e a d e r falla porque hay output a n tes de l. Este es un erro r com n, difcil de detectar.
Captulo 9: Mover informacin de una pgina Web a otra

< ? php
if (Sedad elente < 1 3 )
{
header("Location: Catalogodejuguetes.p h p " );
}
el se
{
header"Locati o n : Catalogoequi poelectroni c o . p hp ");
1
?>

Estos enunciados corren un programa que despliega un catlogo de juguetes si la


edad del cliente es menor que 13 aos; por otro lado, corren un programa que
muestra un catlogo de equipo electrnico, si la edad del cliente es 13 o ms aos.

A W er informacin de una fagina a otra


Las pginas HTML son independientes entre s. Cuando un usuario hace clic en
un enlace, el servidor web enva una pgina nueva al explorador del usuario,
pero el servidor web no sabe nada sobre la pgina anterior. Para las pginas
HTML estticas, este proceso funciona bien. Sin embargo, muchas aplicacio
nes dinmicas necesitan pasar informacin de una pgina a otra. Por ejemplo,
usted podra querer almacenar un nombre de usuario y referirse a esa persona
por su nombre en otra pgina web.

Las aplicaciones web dinmicas a menudo consisten en muchas pginas y es


peran que el usuario visualice varias pginas diferentes. El perodo que em
pieza cuando un usuario ve la primera pgina y finaliza cuando el usuario
deja el sitio web es una sesin. A menudo usted desea que haya informacin
disponible durante una sesin completa. Los siguientes son ejemplos de se
siones que necesitan compartir informacin entre pginas:

I v * Restringir el acceso a un sitio web: Suponga que su sitio web es restrin-


f gido, y los usuarios se registran con una contrasea para tener acceso al
! sitio. Usted no quiere que los usuarios deban registrarse en cada pgina.
Slo quiere que lo hagan una vez y, despus, tengan la posibilidad de ver
todas las pginas que quieran. Usted desea que los usuarios traigan in-
t formacin consigo a cada pgina, la cual demuestre que se han registra-
| do y estn autorizados para visualizar la pgina. Usted quiere que los
| usuarios se registren y permanezcan registrados durante toda la sesin.
: Proporcionar pginas w eb basadas en exploradores: Como los explora-
| dores interpretan algunas caractersticas HTML de maneras diferentes,
| usted quizs desee proporcionar diferentes versiones de sus pginas web
| para distintos exploradores. Debe verificar el buscador de su usuario
* cuando ste visualiza la primera pgina, y luego entregar todas las dems
1 pginas con base en el tipo y la versin de explorador del usuario.
26i5 Parte III: PHP

Con PHP, puede mover informacin de una pgina a otra usando cualquiera
de estos mtodos:

v0 Agregar informacin al URL: Usted puede aadir cierta informacin al final


del URL de la pgina nueva, y PHP pondr la informacin en series incorpo
radas que usted puede usar en la pgina nueva. Este mtodo es ms apropia
do cuando necesita pasar slo una pequea cantidad de informacin.
u0 Almacenar informacin mediante cookies: Puede almacenar cookies (pe
queas cantidades de informacin que contienen parejas devariable=va
1 o r) en el PC del usuario. Una vez almacenada la cookie, puede obtenerse de
cualquier pgina web. Sin embargo, los usuarios pueden rehusarse a aceptar
las cookies. Por lo tanto, este mtodo slo funciona en ambientes en los cua
les usted est seguro que el usuario tendr las cookies activadas.
u0 Pasar informacin usando formularios HTML: Puede pasar informa
cin a un programa especfico usando una etiqueta formul ario. Cuan
do el usuario hace clic en el botn de envo, la informacin en el
formulario se enva al siguiente programa. Este mtodo es muy til cuan
do usted necesita recopilar informacin de los usuarios.
v0 Usar funciones de sesin PHP: Empezando con PHP 4, hay funciones PHP
disponibles que configuran una sesin de usuario y almacenan la informa
cin correspondiente en el servidor; se puede tener acceso a dicha infor
macin desde cualquier pgina web. Este mtodo es ms til para sesiones
en las cuales usted espera que los usuarios vean muchas pginas.

Agregar informacin at URL


Una manera simple de m over informacin de una pgina a otra es agregar in
formacin al URL. Ponga la informacin en el formato siguiente:

variable=valor

v a r i a b 1 e es el nombre de la variable, pero no use el signo de dlar ($) en


ella. El v a 1 o r es el valor por almacenarse en la variable. Puede agregar las
parejas v a r i a b l e = v a l o r e n cualquier parte donde use un URL. El inicio dla
informacin se seala con un signo de interrogacin (?). Todos los enuncia
dos a continuacin son formas vlidas de pasar informacin en el URL:

<form action="pafinasiguiente.php?estado=CA" m e t h o d = POST>

<a href="paginasiguiente.php?estado=CA">ir a la pagina si-


gui ente</a>

he ader("Location: paginasiguiente.php?estado=CA");

Puede agregar varias parejas vari abl e=val or,si las separa con signos (&), as:

<form action="paginasiguiente.php?estado=CA&ciudad=hogar" method="POST">


Captulo 9: Mover informacin de una pgina Web a otra 265
He aqu dos razones por las cuales tal vez no quiera pasar informacin en el URL:

Seguridad: El URL aparece en la lnea de direccin del explorador, lo cual


significa que la informacin aadida al URL tambin se ve. Si la informacin
necesita ser segura, usted no querr exhibirla tan pblicamente. Por ejem
plo, si est moviendo una contrasea de una pgina a la siguiente, proba
blemente no desea pasarla en el URL. Adems, el URL puede ser marcado
como favorito por el usuario. Puede haber razones por las cuales usted no
quiera que sus usuarios guarden la informacin aadida al URL.

v * Longitud de la cadena: Hay un lmite sobre la longitud del URL. El lmite


difiere segn el tipo y la versin del explorador, pero siempre hay un l
mite. Por lo tanto, si est pasando mucha informacin, quizs no haya
* espacio para ella en el URL.

Agregar informacin al URL es muy til para una transferencia rpida y senci
lla de datos. Por ejemplo, suponga que desea proporcionar una pgina web
donde los usuarios puedan actualizar su nmero telefnico. Usted quiere que
el formulario se com porte de la siguiente manera:

1. Cuando el usuario despliega el formulario por primera vez, el nmero telef


nico de la base de datos aparece en el formulario, de modo que el usuario
puede ver cul es el nmero almacenado actualmente en la base de datos.

2. Cuando el usuario enva el formulario, el programa revisa el nmero tele


fnico para ver si el campo est en blanco o si est en un formato que
no podra ser un nmero de telfono.

3. Si el nmero telefnico resulta correcto, se almacena en la base de datos.

4. Si el nmero telefnico est en blanco o tiene datos incorrectos, el progra


ma vuelve a ensear el formulario. Sin embargo, esta vez usted no quiere
mostrar los datos de la base de datos. Por el contrario, desea mostrar los
datos incorrectos que el usuario digit y envi en el campo del formulario.

El programa mo st ra rt el ef ono .p hp en la Lista 9-1 muestra cm o usar el URL


para determinar si esta es la primera vez que se muestra el formulario o una
subsiguiente. El programa muestra el nmero telefnico para el nombre de
registro del usuario y permite al usuario cambiarlo.

Lista 9-1: Program a que m uestra el nm ero telefnico en un formulario


<? php
/* Nombre del programa: m o st ra rl e!.php
* Descripcin: Muestra el numero telefnico recuperado de
la base de datos y permite al usuario cambiarlo.
*/
?>
<h tm l>
<head><title>Mostrar numero telefonico </ tit ie X/ he ad >
<body>
<?php
266 Parte III: PHP

$h uesped="localhost";
Susuar io =" ad min ";
$clave="";
$basededatos="Di re ct oriodemiembros";
$nombre_entrada = "gperez"; // pasado de la pagina
anterior
$conexion = m y s q 1 _ c o n n ec t(S hu es pe d,Su s u a r i o ,Sel a v e )
or die ("No se pudo conectar al servidor ");
$db = mysql_se le ct _db (S ba se de da tos,Sc on ex io n)
or die ("No se pudo seleccionar la base de datos");

if (@$_GET['primero'] == "no")

Stelefono = $ _ P 0 S T [ 't e l e f o n o '];
if ( !ereg("A [0-9)( -]{7,20}(([xX]|(ext) I(ex))?[ -]?[0-
9]{1,7})?$",$ t e 1efono)
or Stelefono == '"')
{
echo "<p al i g n = 'c e n t e r '>E1 numero telefnico parece
no ser val i d o .< b r > " ;
}
el se
I
Sconsulta = "UPDATE Miembro SET te l e f o n o = '$telefono'
WHERE
n o mb r e n e t r a d a = $ n om br ee nt ra da' " ;
Soutput = mysql_.query( Sconsul t a )
or die ("No se pudo ejecutar la consulta.");
echo "Numero telefnico ha sido actual i z ad o.<br> ;
exi t ( );
}
}
el se
{
Sconsulta = "SELECT telefono FROM Miembro WHERE
n o m b r e en tr ad a='Snombr ee nt ra da'";
Soutput = mysql_qu er y( Sco ns ul ta)
or die ("No se pudo ejecutar la consulta.");
Sfila = mysql_fetc h_ arr ay (S ou tp ut );
e x tr a c t ( S f i l a ) ;
}

/* Mostrar telefono del usuario en formulario */


echo "<br><p al i g n = c e n t e r '>
<font s i z e = ' + l '><b>Por favor verifique el numero
telefnico a continuacin y corrijalo si es
necesario.</bX/font>
<hr>
<form a c t i o n = 'm o s t r a r T e l .p h p? fi rs t= no' method='POST'>
<div al ig n= ' c e n t e r '>
<table width='50%' border='0' c e ll sp ac in g=0'
c e ll pa dd in g= '2>
<tr><td al i g n = 'ri g h t 'X B > $ n o m b r e n e t r a d a < / b r X / t d >
<td al ig n= 'centerX i n p u t type='text'
name='telefono'
size='20' maxlength='20' value='Stelefono' >
</td>
</tr>
< t r > < t d > < / t d X t d al ign='center'>
Captulo 9: Mover informacin de una pgina Web a otra 261
Cbr Xi np ut t y p e = ' s u b m i t v a l u e = ' Enviar numero
telefonico'X/td>
</tr>
</t abl e>
< / f o r m> " ;
?>
</bodyX/ht ml >

O bserve los siguientes puntos claves sobre este programa:

y^ El mismo programa despliega y procesa el formulario. El nombre de este


programa es mostrartel efono.php. Observe que la etiqueta formul ario in
cluye action=mostrartelefono.php,lo cual significa que, cuando el usuario
hace clic en el botn de envo, el mismo programa corre nuevamente.

ys* Se agrega informacin al URL. La etiqueta formul ario incluye ac


ti on=mostrartel efono.php?first=no. Cuando el usuario hace clic
en el botn de envo y m o s t r a rt e le f on o. p hp corre por segunda vez, la
variable $pri mero se pasa con el valor "no".

u * El valor que se pas para primero en el arreglo incorporado $_GET se


revisa al inicio del programa. Esto es para ver si esta es la primera vez
que el programa corre.
i v * Si $_GET[primero] es igual a "no", el nmero telefnico se revisa.
$_GET[pri mero] slo es igual a no si el formulario est siendo enviado.
$_GET[ pri mero] no es igual a no si esta es la primera vez que se atra-
i viesa por el programa.
Si el nmero telefnico est bien, se almacena en la base de datos
y el programa termina.
Si el nmero de telfono no est bien, aparece un mensaje de error.

Si $_GET[primero] no es igual a "no", el nmero de telfono se recupe


ra de la base de datos. En otras palabras, si $G ET [ p r i me r o ] no es
igual a no, se trata de la primera vez que el programa corre. El programa
debera conseguir el nmero telefnico de la base de datos.

v * Si el programa alcanza los enunciados que despliegan el formulario, ste


ser mostrado. Si esta no es la primera vez que se atraviesa por el programa y
se envi un nmero telefnico correcto, el nmero se almacena en la base de
datos, y el programa se detiene. Nunca llegar hasta los enunciados que des
pliegan el formulario. En todos los dems casos, el formulario se mostrar.

El formulario desplegado por el programa en la Lista 9-1 se muestra en la Fi


gura 9-1: se ilustra la apariencia de la pgina web al aparecer por primera vez.
O bserve que el URL en el campo de direccin del explorador no tienen ningu
na informacin aadida.

La Figura 9-2 muestra los resultados cuando un usuario digita un nmero tele
fnico sin sentido en el formulario de la Figura 9-1. Observe que el URL en el
campo de direccin del explorador tiene ahora ?pri mero=no agregado al final.
268 Parte III: PHP

3 D is p a y p h o n e n u m b e r - M ic ro s o ft In te r n e t E x p lo r e r
H it' E d it V ip w F a v u ritp s T o o l, H e lp m m h

Back Stop ' fle fie h Home ! Search Favoies Histoty ' M a l Ftinl E d ReScom

S h llp A '|a n e U a l san it c o m /P H P tM yS L fo rD u m m ip s/d isp la yP h o n e .p h p

:3
Please check the phone number below and coirect it if necessary.

gsmith |l 23- 123-1234

Subnw phone number

Figura 9-1:
Formulario
H TM L para
actualizar
un nmero
telefnico. d
j Done 0 Intern et

3 D is p la y p h b e r M ic ro s o ft In te r n e t E x p lo r e r
F ile [H it V ie w F d v o r rtre T o o ls H e lp *.

^ ^ ' ^ Q a & 1 -J v . .
- Stop Re'jesh Home Sketch F w it e s Httfory , Man Frin R eulcam _
h ttp ://ia n e tv a l.s a n .rr com /P H P ?< M yS Q LforD um m ies/displayP hone.php?fB st= no ""3
Phone number does not appear to be valid

He ase check the phone number below and correct it if necessary.

gsmith j l 23- 123 -xxxx

Submit phone number . |

Figura 9-2:
Formulario
H TM L cuan
do un usua
rio enva un
nmero
telefnico
sin sentido. ----- --------- d
& imm i Internet
Captulo 9: Mover informacin de una pgina Web a otra

Almacenar informacin mediante cookies


Usted puede almacenar informacin como cookies. Las cookies son pequeas canti
dades de informacin que contienen parejas va r i abl e=va 1 or, parecidas a las pa
rejas que pueden agregarse al URL. El explorador del usuario almacena las cookies
en el PC del usuario. Su aplicacin puede luego obtener la cookie de cualquier pgi
na web. Por qu se les llama cookies (galletas, en ingls) es uno de los grandes miste
rios de la vida. Tal vez sea porque, a primera vista, parecieran ser algo maravilloso;
pero, al examinarlas ms de cerca, usted se da cuenta de que no le hacen muy bien.
Para algunas personas en algunas situaciones, las cookies no son tiles para nada.

A primera vista, las cookies parecen resolver todo el problema de mover datos
de pgina en pgina. Slo meta una cookie en el PC del usuario y consgala
cuando la necesite. De hecho, la cookie se puede almacenar de modo tal que
permanecer ah despus de que el usuario deje su sitio y estar disponible
cuando el usuario entre a su sitio web de nuevo, un mes despus. Problema re
suelto! Bueno, no realmente. Las cookies no estn bajo su control: estn bajo el
control del usuario. El usuario puede en cualquier momento borrarlas. De he
cho, los usuarios pueden configurar sus exploradores para rehusarse a acep
tarlas. Y muchos usuarios las rechazan o las borran rutinariamente. Muchos
usuarios no se sienten cm odos con la idea de que un extrao almacene cosas
en sus PCs, especialmente archivos que permanecen all incluso despus de
dejar el sitio web del extrao. Es una actitud comprensible. Sin embargo, defi
nitivamente limita la utilidad de las cookies. Si su aplicacin depende de ellas y
el usuario las tiene desactivadas, su aplicacin no funcionar para l.

Las cookies fueron diseadas originalmente para almacenar pequeas cantida


des de informacin por perodos cortos de tiempo. A menos que usted espec
ficamente configure la cookie para permanecer durante un perodo ms largo
de tiempo, sta desaparecer cuando el usuario deje su sitio web. Aunque las
cookies son tiles en algunas situaciones, usted probablemente no las necesi
tar en su aplicacin con base de datos para la Web, por estas razones:

Los usuarios configurar sus exploradores para rechazar cookies. A me


nos que usted sepa con certeza que todos sus usuarios tendrn las coo
kies activadas o pueda solicitarles que las activen (y espera que ellos
respondan favorablemente), las cookies son un problema. Si su aplica
cin depende de ellas, no funcionar si estn desactivadas.

v* PHP tiene caractersticas que funcionan mejor que las cookies. Empezan
do con PHP 4, PHP incluye funciones que crean sesiones y almacenan infor
macin que est disponible durante toda la sesin. Esta caracterstica de
sesiones es ms confiable y muchos ms fcil de usar que las cookies para
poner la informacin disponible en todas las pginas web en una sesin.
Las sesiones no funcionan para almacenar informacin a largo plazo, pero
las bases de datos MySQL pueden usarse con ese propsito.

v* Puede almacenar datos en su base de datos. Su aplicacin incluye una


base de datos donde puede almacenar y recuperar datos, la cual gene-
270 Parte Mi: PHP

ramente es una mejor solucin que una cookie. Los usuarios no pueden
> borrar los datos en su base de datos en forma inesperada. Como usted
est usando una base de datos en esta aplicacin, puede usarla para
cualquier almacenamiento de datos que necesite, especialmente el alma
cenamiento a largo plazo. Las cookies son ms tiles para aplicaciones
que no hacen uso de bases de datos.

Las cookies se almacenan por medio de la funcin setcooki e. El formato


general es

setcookie( " v a r i a b l e " , " v a l o r ");

va r i abl e es el nombre de la variable, pero no incluya el signo de dlar ($).


Este enunciado almacena la informacin slo hasta que el usuario salga de su
sitio web. Por ejemplo, el siguiente enunciado

s et c oo ki e( "e sta do "," C A " );

almacena CA en una variable cookie llamada estado. Despus de configurar


la cookie, la informacin estar disponible para sus otros programas PHP en
el elemento de un arreglo incorporado como $ COOKI ECestado], No necesi
ta hacer nada para obtener la informacin de la cookie. PHP lo hace autom
ticamente. La cookie no estar disponible en el programa donde est
configurada. El usuario debe ir a otra pgina o volver a mostrar la pgina ac
tual antes de que la informacin de la cookie pueda usarse.

Las cookies tambin estn disponibles en un arreglo llamado $HTTP__C00KI E


_VARS con los nombres de variables como claves. Por ejemplo, el valor en la
cookie configurada en el ejemplo anterior tambin se puede usar como
$ H TT P _ C 0 0 K I E _ V A R S [ 1estado ' ]. Esta serie integrada debe usarse si est
usando una versin de PHP anterior a PHP 4.1.

Si desea que la informacin almacenada en una cookie permanezca en un ar


chivo en el PC del usuario despus de que el usuario ste abandone su sitio
web, configure su cookie con un tiempo de expiracin, como sigue:

s e t c o o k i e ( " v a r i a b l e , " v a l o r " , t i e m p o d e e x p i r a c i n ) ;

El valor ti empodeexpi raci on establece el tiempo cuando la cookie expirar,


ti empodeexpi raci on generalmente se establece usando la funcin ti me o
mkti me como sigue:

i/0 t i me: Esta funcin devuelve el tiempo actual en un formato que el PC


puede entender. Se usa la funcin time ms un nmero de segundos para
establecer el tiempo de expiracin de la cookie, com o se muestra en los
enunciados siguientes:
s e t c o o k i e ( " e s t a d o " , " C A " , t i m e ( H 3 6 0 0 ) ; //expi ra en 1 hora
| s e t c o o k i e " N o m b r e " , $ No mb r e , t i me ( ) + ( 3 * 8 6 4 0 0 ) )// expi r a en
k 3 dias
Captulo 9: Mover informacin de una pgina Web a otra

mkt im e : Esta funcin devuelve una fecha y hora en un formato que el


PC puede comprender. Usted debe proporcionar la fecha y hora desea
das en el siguiente orden: hora, minuto, segundo, mes, da y ao. Si cual
quier valor no se incluye, se usa el valor actual. La funcin mkt ime se
utiliza para configurar el tiempo de expiracin de una cookie, como se
muestra en los enunciados siguientes:
setcookie("estado" ,"CA",mktime(3.0,0.4,l,2003));
//expira a las 3:00 AH el 1 de abril, 2003.
se t c o o ki e( "e sta do "," C A " ,mkti m e (1 2 , 0 , 0,,,));
//expira al medioda de hoy

Puede remover una cookie al establecer su valor en nada. Cualquiera de los


enunciados siguientes retira la cookie:

se tc oo ki e( "n om br e" );
setcookiei"nombre";

Empero, la funcin setcooki e tiene una limitacin importante. Slo puede


usarse antes de enviar cualquier output. No se puede establecer una cookie a
la mitad de un programa, despus de haber hecho eco de algn output hacia
la pgina web. Consulte el cuadro "Enunciados que deben ir antes del out
put", anteriormente en este captulo.

Pasar informacin con formularios HTML


El modo ms comn de pasar informacin de una pgina a otra es a travs de for
mularios HTML. Un formulario HTML se despliega con un botn de envo. Cuan
do el usuario hace clic en el botn, la informacin en los campos del formulario
se pasa al programa incluido en la etiqueta del formulario. El formato general es

<form acton="procesaformulario.php" method="POST">


etiquetas para uno o mas campos
<input type="submit" valor="cadena">
</form>

El uso ms comn de un formulario es recopilar informacin de los usuarios


(el cual comento en detalle en el Captulo 8). Sin embargo, tambin se pueden
usar formularios para pasar otros tipos de informacin usando campos ocul
tos, los cuales se agregan al formulario y se mandan con la informacin que
el usuario digit. De hecho, usted puede crear un formulario que tenga nica
mente campos ocultos. Siempre necesitar un botn de envo, y la pgina
nueva no se desplegar hasta que el usuario no haga clic en l, pero no hace
falta incluir ningn campo para que el usuario complete.

Por ejemplo, los enunciados siguientes pasan el color de fondo preferido por
el usuario a la prxima pgina cuando el usuario hace clic en un botn llama
do Siguiente pgina:
272 Parte III: PHP

<?php
Scolor = "azul"; //pasada por medio de un formulario
echo "<form action='paginasiguiente.php' method='POST'>
<input type='oculto' nombre='color' valor='$color'>
Cinput type='submit' valor='Siguiente pagina >
</form>\n";
?>

La pgina web muestra un botn de envo etiquetado Siguiente pgina, pero


no le pide al usuario ninguna informacin. Cuando el usuario hace clic en el
botn, paginasiguiente.php corre y puede usar el elemento del arreglo
$_P0ST[col or ], la cual contiene "azul

Usar sesiones PHP


Una sesin es el tiempo que un usuario pasa en su sitio web. Los usuarios pue
den visualizar muchas pginas web durante el tiempo comprendido entre su
ingreso al sitio y su abandono de l. A menudo usted quiere que la informacin
persiga al usuario por el sitio, de modo que est disponible en cada pgina.
PHP, empezando con la versin 4.0, proporciona un modo para hacerlo.

Como funcionan tas sesiones PHP


PHP le permite configurar una sesin en una pgina web y guardar variables
como variables de sesin. Luego, usted abre la sesin en cualquier otra pgi
na y las variables de sesin estn disponibles para su uso en series incorpo
radas $_SESSI0N. Para lograrlo, PHP hace lo siguiente:

1. Asigna un nmero de identificacin a la sesin: El nmero es realmen


te largo y no tiene mucho sentido; es exclusivo para el usuario y nadie
podra adivinarlo nunca. La identificacin de sesin se almacena en una
variable del sistema PHP llamada PHPSESSID.
2. Almacena las variables de sesin en un archivo en el servidor: El nom
bre del archivo es el nmero de identificacin de la sesin. El archivo se
almacena en \tmp en Unix/Linux; en Windows, se almacena en un direc
torio llamado sessi ondata, bajo el directorio donde est instalado PHP.
Si usted es el administrador de PHP, puede cambiar la ubicacin donde
se almacenan los archivos de sesin al editar el archivo de configuracin
php.ini. Encuentre la configuracin para s e s s i o n . s a v e_p a t h y cambie
la ruta a la ubicacin donde desea almacenar los archivos.
3. Pasa el nmero de identificacin de la sesin a cada pgina: Si el usua
rio tiene las cookies activadas, PHP pasa la identificacin de sesin
usando cookies. Si el usuario tiene las cookies desactivadas, PHP pasa la
identificacin de sesin en el URL para los vnculos o en una variable
oculta para formularios que usan el mtodo p o s t .
Captulo 9: Mover informacin de una pgina Web a otra

4. Obtiene las variables del archivo de la sesin para cada nueva pgina de
sesin: Cuando un usuario abre una pgina nueva que es parte de la sesin,
PHP consigue las variables del archivo usando el nmero de identificacin de
sesin que fue pasado de la pgina vieja y lo pone en el arreglo incorporado
$_S ESS ION. Usted puede usar los elementos del arreglo con el nombre de la
variable como clave, y tienen el valor que usted asign en la pgina anterior.

Las sesione no funciona a menos que t r a c k_v a r s est activado. A partir de


PHP 4.0.3, t r a c k v a r s siempre est activado. Para versiones anteriores a
4.0.3,1a opcin -enable-track-vars debera usarse al instalar PHP.

Si los usuarios tienen las cookies desactivadas, las sesiones no funcionarn a


no ser que t r a n s - s i d est activado. Aprenda cmo activar y desactivar
trans-sid ms adelante, en la seccin "Usar variables de sesin PHP".

Abrir sesiones
Usted debera abrir una sesin en cada pgina web. La sesin se abre con la
funcin sessi on_start, com o sigue:

session__start();

La funcin primero revisa si hay un nmero existente de identificacin de sesin.


Si encuentra uno, configura el arreglo $__S ESS ION. Si no encuentra ninguno, em
pieza una sesin nueva al crear un nuevo nmero de identificacin de sesin.

Puesto que las sesiones usan cookies si el usuario las tiene activadas,
sessi on_sta rt est sujeto a la misma limitacin que las cookies. O sea,
se debe llamar a la funcin sessi on_start antes de enviar cualquier out
put. Puede leer los detalles com pletos en el cuadro "Enunciados que deben
ir antes del output", anteriormente en este captulo.

Usted puede decirle a PHP que cada pgina en su sitio debera empezar auto
mticamente con sessi on_start. Para hacer esto, edite el archivo de confi
guracin p h p . i ni . Si usted es el administrador de PHP, puede editar este
archivo; de lo contrario, pida al administrador que lo haga. Busque la varia
ble sessi on .auto_sta rt y establezca su valor en 1. Tal vez deba reiniciar el
servidor web antes de que esto surta efecto. Con auto_start activado, no
necesita agregar sessi on_start al principio de cada pgina.

Usar Variables de sesin PHP


Cuando desea guardar una variable como una variable de sesin (es decir,
una que est disponible en otras pginas web que el usuario podra visitar),
gurdela en el arreglo $_SESSION, as:

$ S E S S I O N C 'nombredevariable ] = v a l o r ;
274 Parte III: PHP

El valor de la variable estar entonces disponible en el arreglo $SESSI0N en


otras pginas web. Por ejemplo, usted puede almacenar el estado donde vive
el usuario usando el siguiente enunciado:

$ _ S E S S I 0 N [ 'e s t a d o '] = "CA";

Luego puede utilizar $_S ESSI0N[ ' e s t a d o ' ] en cualquier otra pgina web, y
tendr el valor CA.

Los dos siguientes programas muestran cmo usar sesiones para pasar informa
cin de una pgina a la prxima. El primer programa, t e s t s e s s i o n l . p h p e n l a
Lista 9-2, muestra la primera pgina donde empieza la sesin. La Lista 9-3 mues
tra el programa t e s t s e s s i o n2 . php para la segunda pgina de una sesin.

L ista 9-2: E m p e za r una s e si n


< ? php
sessi o n _ s ta rt ();
?>
<html>
<head><t i t i e>Pr ueba de pagina Sesiones K / t i t i e X / h e a d >
<body>
<?php
$ S ES S I O N ['s '] = "prueba";
echo "Esta es una prueba de la caracterstica sesiones.
<form action='testsesion2.php' m e t h o d = 'P O S T '>
<input t y p e = 'h i d d e n ' na me =' form_var'
v a l o r = 'p r u e b a '>
<input t y p e = submit' value='ir a la prxima pagina >
</ fo rm > ;
?>
</bodyX/html >

Observe que dos variables estn configuradas en este programa para que
sean pasadas a la segunda pgina. Se crea la variable de sesin sessi on_var.
Adems, se despliega un formulario con una variable oculta f o r m_v a r , la
cual tambin se pasa a la segunda pgina cuando se oprime el botn de en
vo. Ambas variables estn establecidas en "prueba.

L ista 9-3: S e g u n d a p g in a de una se si n


< ? php
sessi on_s ta rt ();
?>
<html>
< h e a d X t i t l e > P r u e b a de pagina Sesiones 2 < / t i t i e X / h e a d >
<body>
< ? php
echo "session_var = {$_SESS10 N ['s ']}<br>\n";
echo "form_var =. {$_P0ST[form_var']}<br>\n";
?>
</bodyX/htrn! >
Captulo 9: Mover informacin de una pgina Web a otra 275
Dirija su buscador a testsessionl .php y luego haga clic en el botn de envo
que dice Ir a la siguiente pgina. Entonces, ver el siguiente output de
sessi o n T e s t 2 .php:

session__var = prueba
form_var = prueba

Como las sesiones funcionan de maneras diferentes para los usuarios con las
cookies activadas y aquellos que las tienen desactivadas, usted debera probar
los dos programas en ambas condiciones. Para desactivar las cookies en su ex
plorador, se cambian las configuraciones para las opciones o preferencias.

Para desactivar las cookies en Internet Explorer, siga estos pasos:

1. Escoja Herramientas1^Opciones de Internet.

Se abre el recuadro de dilogo Opciones de Internet.

2. Haga clic en la pestaa Seguridad en IE 5.5 o la pestaa Privacidad en


IE 6.

3. Haga clic en el icono de Internet para resaltarlo.

4. Haga clic en el botn Nivel Personalizado.


Aparece el recuadro de dilogo Configuracin de Suguridad.

5. Desplcese hasta la seccin Cookies y seleccione Deshabilitar para ca


da una de las configuraciones de cookie.

6. Haga clic en Aceptar.

Para desactivar las cookies en Netscape Navigator, siga estos pasos:

1. Escoja EditarOReferencias.

2. Resalte Avanzadas.
3. Marque Deshabilitar Cookies.

4. Haga clic en Aceptar.

Si el output de t e s t s e s s i o n 2 muestra un valor en blanco para


$ s e s s i on_v a r cuando desactiva las cookies en su buscador, p robable
m ente sea porqu e t r a n s - s i d no est activado. Puede activarlo en su
archivo p h p . i n i. Encuentre la siguiente lnea:

s e s s i o n .use_trans_sid = 0

Cambie el 0 a 1 para activar trans-sid. Si no puede arreglar este problema, toda


va puede usar sesiones, pero debe pasar el nmero de identificacin de la sesin
en sus enunciados de programacin, ya que PHP no lo pasar automticamente
cuando las cookies estn desactivadas. Para ms detalles sobre cmo usar sesio
nes cuando t r a n s s i d no est activado, consulte la siguiente seccin.
Para PHP 4.1.2 o anterior, trans-sid no est disponible a menos que haya si
do activado usando la opcin --enable-trans-sid cuando PHP se compil.

Sesiones sin cookies


Muchos usuarios desactivan las cookies en sus exploradores. PHP revisa el ex
plorador del usuario para ver si se permiten las cookies y se comparta de acuer
do con esto. Si el buscador del usuario permite cookies, PHP hace lo siguiente:

Establece la variable SPHPSESSID igual al nmero de identificacin de la


sesin.
p* Usa cookies para mover $PHPSESSID de una pgina a otra.

Si el explorador del usuario no acepta las cookies, PHP hace lo siguiente:

v* Establece una constante llamada SID. La constante contiene una pareja


variable=valor que luce como PHPSESSID=/r?a 1a rga cadena den ume ros
Podra mover el nmero de identificacin de sesin de una pgina a
otra, y podra no hacerlo, dependiendo de si trans-sid est activado. Si
: est activado, PHP pasa el nmero de identificacin de la sesin; si est
desactivado, PHP no pasa el nmero.

Activar trans-sid tiene ventajas y desventajas. La ventaja es que las sesiones


funcionan sin problemas incluso cuando los usuarios desactivan las cookies.
Tambin es mucho ms fcil programar sesiones con trans-sid activado. La
desventaja es que el nmero de identificacin de sesin a menudo se pasa en
el URL. En algunas situaciones, este nmero no debera mostrarse en la direc
cin del explorador. Adems, cuando el nmero est en el URL, el usuario lo
puede marcar como favorito. Luego, si el usuario regresa a su sitio usando la
marca de favorito con el nmero de identificacin de sesin en ella, el nuevo
nmero de identificacin de sesin de la visita actual se puede confundir con
el nmero viejo de la visita anterior, y probablemente cause problemas.

Sesiones con trans-sid activado


Cuando trans-sid est activado y el usuarp tiene las cookies desactivadas,
PHP automticamente enva el nmero de identificacin de sesin en el URL
o com o un campo oculto en un formulario. Si el usuario se mueve a la pgina
siguiente usando un vnculo, una funcin header o un formulario con el mto
do get, el nmero se agrega al URL. Si el usuario se mueve a la pgina siguien
te usando un formulario con el mtodo post, el nmero se pasa en un campo
oculto. PHP reconoce $PHPSESSID como el nmero de identificacin de la se
sin y maneja la sesin sin ninguna programacin especial de su parte.
Captulo 9: Mover informacin de una pgina Web a otra

El nmero de identificacin de la sesin slo se aade a los URLs de las pgi


nas en su sitio web. Si el URL de la pgina siguiente incluye el nombre de un
servidor, PHP asume que el URL est en otro sitio web y no aade el nmero
de identificacin de la sesin. Por ejemplo, si su enunciado de vnculo es

<a href="paginanueva,php"> ;

PHP aadir el nmero de identificacin. Sin embargo, si su enunciado es

<a href="H T T P :// w w w .empresa.com/paginanueva.php">

PHP no lo agregar.

Sesiones con trans-sid desactivado


Cuando t r a n s - s i d n o est activado, PHP no enva el nmero de identificacin
de la sesin a la siguiente pgina cuando los usuarios tienen las cookies desac
tivadas. Ms bien, usted mismo debe enviar el nmero de identificacin.

Afortunadamente, PHP proporciona una constante que usted puede usar pa


ra mandar la identificacin de sesin usted mismo. Una constante es una va
riable con informacin que no puede modificarse. (Describo las constantes
en el Captulo 6). La constante que PHP proporciona se llama SID y contiene
una pareja vari abl e=val or que usted puede agregar al URL, como sigue:

<a href="paginasiguiente.php?<?php echo SID?>" > pagina si


guiente </a>

Este enunciado de vnculo agrega un signo de interrogacin (? ) y la constante


SID al URL. SID contiene el nmero de identificacin de sesin, formatea
do como vari abl e=val or. El output de echo SID luce ms o menos as:

PHPSESSID=877c22163d8df9deb342c7333cfe38a/

Por lo tanto, el URL que se enva es

<a href^"paginasiguiente.php?PHPSrSSID=-877c22163d8df9deb34?c7333cfe38a7>
pagina siguiente </a>

Por alguna de varias razones (las cuales comento en la seccin "Agregar in


formacin al URL", anteriormente en este captulo), tal vez usted no quiera
que el nmero de identificacin de la sesin aparezca en el URL mostrado
por el explorador. Para impedirlo, puede mandar el nmero de identificacin
en un campo oculto de un formulario usando el mtodo post. Primero, consi
ga el nmero de identificacin de la sesin; luego envelo en un campo ocul
to. Los enunciados para hacerlo son
2 7 5 Parte III: PHP

<?php
$PHPSESSID = session_id();
echo "<form action='p.aginasiguiente.php' method='POST'>
<input t y n e = 1o c u l t o ' n o m b r e = 'PH P S E S S I D '
valor='$PHPSESSID->
<input t y p e = 's u b m i t ' valor='Pagina siguiente'>
< / f o r m>" ;
?>

Estos enunciados hacen lo siguiente:

1. Almacenan el nmero de identificacin de la sesin en una variable lla


mada SPHPSESSID. Usan la funcin session_id, la cual proporciona el
nmero de identificacin de la sesin actual.
2. Mandan $PHPSESSI D en un campo oculto de un formulario.

En la pgina nueva, PHP automticamente usar SPHPSESSID para conseguir


cualquier variable de sesin, sin ninguna programacin especial de su parte.

Hacer privadas (as sesiones


Las funciones de sesin de PHP son ideales para sitios web que son restringidos y
requieren que los usuarios se registren con un nombre de ingreso y una contrase
a. Esos sitios web indudablemente tienen muchas pginas, y usted no querr
que el usuario deba conectarse en cada pgina. Las sesiones PHP pueden deter
minar si el usuario se ha registrado o no, y rechazar el acceso a los usuarios que
no estn registrados. Puede usar sesiones PHP para hacer lo siguiente:

1. Mostrar a los usuarios una pgina de registro.


2. Si un usuario se registra satisfactoriamente, establece y almacena una
variable de sesin.
3. Cada vez que el usuario vaya a una pgina nueva, revisa la variable de
sesin para ver si el usuario se ha registrado.
4. Si el usuario ya se registr, muestra la pgina.
5. Si el usuario no se ha registrado, muestra la pgina de registro.

Para verificar si un usuario se ha registrado, agregue los siguientes enuncia


dos en la parte superior de cada pgina:

<? php
se s s i o n_ st ar t() .
if ( @ $ _ S E S S I O N C '1o g i n '] != "si )
{
header("Location: paginaderegistro.php");
xi'tC) V"
1
?>
Captulo 9: Mover informacin de una pgina Web a otra

En estos enunciados, $SESSI0N[1 ogi n] es una variable de sesin que se


establece en "s" cuando el usuario se registra. Los enunciados verifican si
$_SESSI0N[1 ogi n] es igual a " s i ". Si no lo es, el usuario no est registrado,
y se le enva a la pgina de registro. Si $_SESS10N[ 1ogi n] es igual a "s", el
programa sigue adelante con el resto de los enunciados en la pgina web.

Cerrar sesiones PHP


Para sesiones restringidas en las cuales los usuarios deben registrarse, a me
nudo usted quiere que los usuarios se desconecten cuando hayan terminado.
Para cerrar una sesin, use el enunciado siguiente:

sessi o n _d es tr oy();

Este enunciado se deshace de toda la informacin sobre variables de sesin


almacenada en el archivo de sesin. PHP ya no pasa el nmero de identifica
cin de la sesin a la siguiente pgina. No obstante, el enunciado no afecta a
las variables que estn configuradas en la pgina actual: siguen teniendo los
mismos valores. Si desea eliminar las variables de la pgina actual (adems
de impedir que pasen a la pgina siguiente) suprmalas con este enunciado:

unseti $_SESSI0N ) ;
Parte IV
Aplicaciones
La 5a Ola Por Rich Tennant

"La nueva tecnologa realmente me lia ayudado a


organizarme. Guardo los informes de mis proyectos
debajo del PC, los presupuestos debajo de mi PC porttil,
y los memorandos debajo de m i localizador".
En esta pa rte.. .
n esta parte, usted aprende a tomar el plan y la infor

macin para iniciar de la Parte I, la informacin sobre


MySQL de la Parte II y la informacin sobre PHP de la Parte
III, y a juntarlo todo en una sola aplicacin con base de da
tos para la Web. Los Captulos 11 y 12 le presentan dos apli
caciones de muestra, incluyendo sus bases de datos y
todos sus programas PHP.
Captulo 10

Unirlo todo
En este captulo
- Organizar toda su aplicacin
? Organizar programas individuales
Hacer que su aplicacin sea segura
Documentar su aplicacin

os captulos anteriores de este libro le brindan las herramientas necesa

rias para construir su aplicacin con base de datos para la Web. En la


Parte I, usted aprendi cmo funcionan PHP y MySQL y cm o tener acceso a
ellos. Adems, descubri qu debe hacerse para construir su aplicacin y en
qu orden hacerlo. En la Parte II, averigu cmo construir y usar una base de
datos MySQL. En la Parte III, descubri cules caractersticas tiene PHP y c
mo usarlas. Adems, esta parte tambin explic cmo mostrar informacin
en una pgina web, recopilar informacin de los usuarios y almacenar la in
formacin en una base de datos. Ahora, est listo para unirlo todo.

En este captulo, le muestro cmo juntar todas las piezas para formar una
aplicacin completa. Para hacerlo, usted deber

: v* Organizar la aplicacin

; Asegurarse de que la aplicacin es segura

! Documentar la aplicacin

Aqu le describo cada uno de los pasos en detalle.

Organizar ta aplicacin
Organizar la aplicacin es para beneficio suyo. En lo que respecta a PHP, la
aplicacin podra tener 8 millones de enunciados PHP en una sola lnea de un
archivo del PC. A PHP no le importan las lneas, las sangras ni los archivos. Sin
embargo, los humanos escriben y dan mantenimiento a los programas para la
aplicacin, y los humanos s necesitan organizacin. Las aplicaciones requie
ren de dos niveles de organizacin:
284 Parte IV: Aplicaciones

i/* El nivel de la aplicacin: La mayora de las aplicaciones necesita ms


de un programa para tener funcionalidad completa. Usted debe dividir
las funciones de la aplicacin en un conjunto organizado de programas.

v * El nivel del programa: La mayora de los programas realizan ms de


una tarea especfica. Es necesario dividir las tareas del programa en sec
ciones dentro del programa.

Organizarse en el niel de ta aplicacin


En general, las aplicaciones con bases de datos para la Web consisten en un
programa por pgina web. Por ejemplo, tal vez usted tenga un programa que
proporcione un formulario para recopilar informacin y un programa para al
macenar la informacin en una base de datos, el cual le dice al usuario que los
datos han sido almacenados.

Otro fundamento de la organizacin es un programa por tarea principal. Por ejem


plo, usted podra tener un programa para presentar el formulario y un programa que
almacene los datos en una base de datos. Para las aplicaciones web, la mayora de
las tareas importantes conllevan enviar una pgina web. Recopilar los datos de los
usuarios requiere de una pgina web para el formulario HTML (HyperText Markup
Language Lenguaje de Marcado de Hipertexto, por sus siglas en ingls); proporcio
nar informacin sobre los productos a los clientes requiere de pginas web; y cuan
do usted almacena datos en una base de datos, generalmente desea enviar una
pgina de confirmacin al usuario indicando que los datos fueron almacenados.

Un programa por pgina web o un programa por tarea principal no es una regla,
sino ms bien una gua. La nica regla relacionada con la organizacin es que
sta debe ser clara y fcil de entender. Y esto es totalmente subjetivo. Aun as,
la organizacin de una aplicacin como el Catlogo de mascotas no necesita ser
demasiado complicada. Suponga que el diseo del Catlogo de mascotas exige
que la primera pgina enumere todos los tipos de mascotas (tales como gatos,
perros y pjaros) entre los cuales el usuario puede seleccionar. Entonces, cuan
do el usuario haya seleccionado un tipo, todas las mascotas en el catlogo para
ese tipo se muestran en la siguiente pgina web. Una organizacin razonable se
ra tener dos programas: uno para mostrar la pgina con los tipos de mascotas
y otro para mostrar las mascotas segn el tipo de mascota escogido.

Estas son algunas sugerencias adicionales para organizar sus programas:

* * Escoja nombres muy descriptivos para los programas en su aplicacin.


Los nombres de los programas son parte de la documentacin que hace
que su aplicacin se pueda entender. Por ejemplo, nombres tiles para
los programas del Catlogo de mascotas seran MostrarTiposdemasco
tas. php y MostrarMascotas .p h p . Se acostumbra, aunque noes requi
sito, empezar los nombres de programas con una letra mayscula. El uso
de maysculas o minsculas no es importante para los nombres de los
programas en PCs con Windows, pero s es muy importante para PCs con
Captulo 10: Unirlo todo 285
Unix/Linux. Ponga atencin a las letras maysculas y minsculas de mo-
, do que sus programas puedan correr en cualquier PC si fuese necesario.
u * Ponga los archivos de los programas en subdirectorios con nombres
significativos. Por ejemplo, ponga todos los archivos de imgenes en un
directorio llamado imagenes. Si slo tiene tres archivos, podra bastar
le un solo directorio, pero buscar entre docenas de archivos un archivo
especfico puede hacerle perder mucho tiempo.

Organizarse en et nii/et del programa


Un programa individual bien organizado es muy importante por las siguien
tes razones:

Es ms fcil de escribir. Cuanto mejor organizado est su programa,


ms fcil ser para usted leerlo y comprenderlo. Puede ver lo que el pro
grama hace y arreglar cualquier problema con mayor rapidez.
v* Es ms fcil para otros entenderlo. Tal vez otros necesiten comprender
su programa. Despus de cobrar esa enorme herencia y partir hacia la Isla
del Mar del Sur que compr, alguien ms tendr que darle mantenimiento
a su aplicacin.
r Es ms fcil para usted darle mantenimiento. Sin importar cun a fondo
usted la pruebe, su aplicacin probablemente tendr uno o dos proble-
| mas. Cuanto mejor organizado sea su programa, ms fcil ser para usted
encontrar y reparar los problemas, especialmente seis meses despus.
v* Es ms fcil de cambiar. Tarde o temprano, usted o alguien ms deber cam-
| biar el programa. Las necesidades de los usuarios podran cambiar. Las nece-
f sidades de su negocio podran cambiar. La tecnologa podra cambiar. La
\ capa de ozono podra cambiar. Por una razn u otra, el programa necesitar
| modificarse. Averiguar qu hace el programa y cmo lo hace, para poder
cambiarlo, resulta mucho ms fcil si est bien organizado. Le garantizo que
| usted no recordar los detalles; slo deber poder entender el programa.

Las siguientes reglas producirn programas bien organizados. No quisiera lla


marlas reglas, porque puede haber razones en cualquier ambiente especfico
para romper una o ms de las reglas, pero le recomiendo pensar cuidadosa
mente antes de romper cualquiera de las reglas siguientes:

Divida los enunciados en secciones pzura cada tarea especfica. Empiece cada
seccin con un comentario que describa lo que hace la seccin. Separe las sec-
. ciones entre s agregando lneas en blanco. Por ejemplo, para el Catlogo de
mascotas, el primer programa podra tener tres secciones para tres tareas:

1. Hacer eco del texto introductorio, tal como el encabezado de la pgina


y los enunciados. El comentario antes de la seccin podra ser /* tex
| to de apertura */. Si el programa ha ce echo aunagran cantidad de
I texto y grficos complicados, usted podra dividirlo en ms de una sec-
I cin, tal como /* titulo y logotipo */ y /* enunciados */.
Parte IV: Aplicaciones

2. Extraer una lista de tipos de mascotas de la base de datos. Si esta


seccin es larga y complicada, puede dividirla en secciones ms
pequeas, tales como 1) conectarse con la base de datos; 2) ejecu
tar la consulta SELECT; y 3) poner los datos en variables.

3. Crear un formulario que muestre una lista de seleccin de los ti


pos de mascotas. Los formularios a menudo son largos y complica
dos. Puede ser til tener una seccin para cada parte del formulario.

u * Use sangras. Use sangra en los bloques de enunciados PHP. Por ejemplo,
sangre los bloques i f y wh i 1 e como lo he hecho yo en el cdigo de mues
tra para este libro. Si hay bloques anidados dentro de otros bloques, use
una sangra adicional para el bloque anidado. Es mucho ms fcil ver dn
de empiezan y terminan los bloques cuando estn sangrados, lo cual, a su
vez, facilita la comprensin de lo que hace el programa. Poner sangras en
los enunciados HTML tambin puede resultar til. Por ejemplo, si usted
pone sangras en las lneas entre las etiquetas de apertura y cierre para
un formulario o entre la etiqueta <table>yla etiqueta </ta b 1e>, puede
ver ms fcilmente qu hacen los enunciados.
v * Use comentarios libremente. Definitivamente, aada comentarios al ini
cio para explicar lo que hace el programa. Y agregue comentarios para
cada seccin. Adems, comente cualquier enunciado que usted conside
re que no es obvio, o enunciados en los cuales cree haber hecho algo de
un modo poco comn. Si le tom un rato averiguar cm o hacer algo, es
probable que amerite un comentario. No olvide los comentarios cortos
al final de las lneas; a veces, slo una palabra o dos son de gran ayuda.

v* Use enunciados simples. A veces los programadores se dejan llevar por


I la idea de usar cdigos concisos, con lo cual sacrifican la legibilidad. Ani
dar seis llamados de funcin uno dentro de otro puede ahorrar algunas l
neas y teclazos, pero tambin har que el programa sea ms difcil de leer.

! v* Repita los bloques de enunciados. Si se da cuenta que est digitando las


mismas diez lneas de enunciados PHP en varios lugares del programa,
puede mover ese bloque de enunciados hacia otro campo y llamarlo
cuando lo necesite. Una lnea en su programa que diga e x t r e a e r D a t o s( )
? es mucho ms fcil de leer que las diez lneas que extraen los datos. Es
ms, si necesita cambiar algo en dichas lneas, puede hacerlo en un archi-
L vo externo en vez de tener que encontrarlo y cambiarlo en una docena de
lugares diferentes en su programa. Hay dos maneras de repetir enuncia
dos: las funciones y los enunciados i ncl ude. El Captulo 7 explica cmo
escribir y usar funciones. Las dos secciones siguientes explican el uso de
funciones y enunciados i n c 1 u d e en la organizacin de su programa.

u0 Use constantes. Si su programa usa el mismo valor muchas veces, tal como
el impuesto de ventas de su estado, puede definir una constante al princi
pio del programa para crear una constante llamada CA_SALES_TAX que
i| es.97 y usarla cuando la necesite. Definir una constante que le brinde un
nombre al nmero ayuda a cualquiera que lea el programa a entender cul
es el nmero; adems, si alguna vez necesita cambiarlo, slo deber cam-
I biarlo en un lugar Las constantes se describen en detalle en el Captulo 6.
Captulo 10: Unirlo todo

Usar enunciados inctude


PHP le permite poner enunciados en un archivo externo (o sea, un archivo sepa
rado de su programa) e insertar el archivo donde quiera en el programa, usando
el enunciado i ncl iide. Los archivos i nclude son muy tiles para almacenar un
bloque de enunciados que se repite. Se agrega un enunciado incl ude donde
quiera usar los enunciados en lugar de aadir todo el bloque de enunciados en
varios lugares diferentes. Este enunciado hace que sus programas sean mucho
ms cortos y fciles de leer. El formato de un enunciado i n c 1 u d e es

i nc l u de (" nombredearchi v o" ) ;

El archivo puede tener cualquier nombre. A m me gusta usar la extensin, inc.


Los enunciados en el archivo se incluyen tal y como estn, en el punto donde se
usa el enunciado i ncl ude. Los enunciados se incluyen como HTML, no PHP. Por
lo tanto, si desea usar enunciados PHP en su archivo i ncl ude, debe incluir eti
quetas PHP en el archivo incl ude. De lo contrario, todos los enunciados en el ar
chivo i ncl ude se vern como HTML y sern enviados como output en la pgina
web ser tal y como estn.

Estas son algunas maneras de usar archivos incl ude para organizar sus programas:

u0 Ponga todo o la mayora de su HTML en archivos i ncl ude. Por ejemplo, si


su programa enva un formulario al explorador, ponga el HTML para el for
mulario en un archivo externo. Cuando necesite enviar el formulario, use un
enunciado incl ude. Poner el HTML en un archivo i ncl ude es una buena
| idea si el formulario se muestra varias veces. Es incluso una buena idea si
< se muestra slo una vez, pues hace que su programa sea mucho ms fcil
de leer. Los programas en los Captulos 11 y 12 ponen el cdigo HTML para
los formularios en archivos separados e y haga incl ude a los archivos
cuando los formularios se despliegan.

3t Almacene la informacin necesaria para tener acceso a la base de da-


a tos en un archivo separado de su programa. Almacene los nombres de

I las variables en el archivo como sigue:

<?php :
$huespcd="localhost";
lu su ario="raiz";
$contrasea="";
?>

Observe que este archivo necesita etiquetas php porque el enunciado


i ncl ude inserta el archivo como HTML. Incluya este archivo en la parte
superior de cada programa que necesite conectarse a la base de datos.
Si cualquier informacin (tal como la contrasea) cambia, simplemente
cambie la contrasea en el archivo i ncl ude. No necesita buscar entre
todos los archivos del programa para cambiar la contrasea. Para un po
co ms de seguridad, es una buena idea usar un nombre de archivo en-
I gaoso, y no uno obvio como el a v e s _ s e c r e t a s .inc.
288 Parte IV: Aplicaciones

i v0 Ponga sus funciones en archivos i ncl ude. Usted no necesita tener los
enunciados para las funciones en el programa; puede ponerlos en un archi
vo i ncl ude. Si cuenta con muchas funciones, organice las funciones que se
relacionan en varios archivos i ncl ude, tal como funci ones^dedatos.inc
y funci ones_del formul a r i o .inc. Use enunciados i ncl ude al principio
de sus programas, y enumere las funciones que se usan en el programa.

v * Almacene los enunciados que todos los archivos en su sitio web tienen
en comn. La mayora de los sitios web tiene muchas pginas web con mu
chos elementos en comn. Por ejemplo, todas las pginas web empiezan
con etiquetas <html > , <head> y <body>. Si usted almacena los enuncia
dos comunes en un archivo i ncl ude, puede incluirlos en cada pgina web,
lo cual garantizar que todas sus pginas se vean iguales. Por ejemplo, us
ted podra tener los siguientes enunciados en un archivo i ncl ude:
<html>
<head><titie><?php echo $ti 1 1 e ? X / t i t l e X / h e a d >
<body topmargin="0">
<p al i g n = " c e n t e r " X i m g s r c= "l og o. gi f" width="100"
h e i g h t = 200">
<hr color="rojo">

Si incluye este archivo al inicio de cada programa en su sitio web, se


ahorrar mucha digitacin, y sabr que todas las pginas concuerdan.
Adems, si desea modificar algo de la apariencia de todas sus pginas,
slo deber cambiarlo en un lugar: el archivo i ncl ude.

Puede usar un enunciado similar, como sigue:

include_pnce("nombredearchivo");

Este enunciado evita que los archivos include con variables parecidas se so
brescriban unos a otros. Use i ncl ude_once cuando incluya sus funciones.

Puede usar el nombre de una variable para el nombre de archivo, as:

i nclude("Snombredearchivo");

Por ejemplo, usted quizs desee mostrar mensajes diferentes en das diferen
tes. Puede almacenar estos mensajes en archivos con el nombre del da en
que el mensaje debera desplegarse. Por ejemplo, podra tener un archivo lla
mado d o m .i nc con el siguiente contenido:

<p>No se preocupe. Duerma hasta tarde. No hay trabajo hoy.</p>

Y archivos parecidos para todos los das de la semana. Los enunciados si


guientes se pueden usar para mostrar el mensaje correcto para el da actual:

. $hoy = f e ch a( " D " );


inclde'$h oy"y .inc')V
Captulo 10: Unirlo todo

Despus del primer enunciado, $hoy contiene el da de la semana abreviado.


El enunciado fecha se comenta en el Captulo 6. El segundo enunciado inclu
ye el archivo correcto, el cual usa el da almacenado en $hoy. Si $hoy contie
ne dom, el enunciado incluye un archivo llamado dom. i nc .

Proteger sus archivos i ncl ude es importante. La mejor manera de hacerlo es


almacenar los archivos i ncl ude en un directorio fuera de su espacio web, de
modo que n los visitantes a su sitio web no puedan tener acceso a ellos.

Puede configurar un directorio i nc 1ude donde PHP busque cualquier archivo espe
cificado en un enunciado i nc 1ude. Si usted es el administrador PHP, puede estable
cer un directorio i nc 1ude en el archivo php. i ni (el archivo de configuracin PHP
en el directorio de su sistema, tal como describo en el Apndice B). Encuentre la
configuracin para i ncl ude_pathy cmbiela a la ruta de su directorio preferido. Si
hay un punto y coma al inicio de la lnea, antes de i nc 1ude_p a t h, qutelo. Los si
guientes son ejemplos de configuraciones i ncl ude_path en el archivo php. i ni:

i n c l u d e _ p a t h = " . ; d : \ i n c l ud e " : # para Windows


i n c l u d e p a t h = " . : /us uar i o/l ocal /i nc l ude " ; # para Unix/Linux/Mac

Estos dos enunciados especifican dos directorios donde PHP busca archivos
i ncl ude. El primer directorio es dot (es decir, el directorio actual), seguido
de la ruta del segundo directorio. Usted puede especificar tantos directorios
include como desee, y PHP buscar en ellos el archivo i ncl ude en el orden en
que se enumeran. Las rutas de los directorios se separan con un punto y co
mo para Windows y dos puntos para Unix/Linux.

Si no tiene acceso a php. i ni , puede configurar la ruta en cada script indivi


dual usando el siguiente enunciado:

i n i _ s e t ( " i n c l ude _ pat h" , " d : \hi dden" )';

Este enunciado establece la ruta ( i nc l ude_path) hacia el directorio especifi


cado slo mientras el programa est corriendo. No establece el directorio pa
ra todo el sitio web.

Para tener acceso a un archivo desde un directorio incl ude, simplemente use el
nombre del archivo, como sigue. No hace falta usar el nombre completo de la ruta.

i n c l u d e ( " e l e v e s _ s e c r e t a s . i nc );

Si su archivo i ncl ude no est en un directorio incl ude, tal vez usted deba usar
el nombre completo de la ruta en el enunciado i nc 1ude. Si el archivo est en el
mismo directorio que el programa, basta con usar el nombre de archivo. No obs
tante, si el archivo se localiza en otro directorio, tal como un subdirectorio del
directorio en el que est el programa o un directorio oculto fuera del espacio
web, ser necesario usar el nombre completo de la ruta al archivo, como sigue:

i nc l ude( " d : / hi d d e n / c l a v e s _ s e c r e t a s . i n c " ) ;


Parte IV: Aplicaciones

Usar funciones
Use las funciones con frecuencia para organizar sus programas. (En el Captu
lo 7, le explico cmo crear y usar funciones en detalle). Las funciones son ti
les cuando su programa necesita realizar la misma tarea en ubicaciones
repetidas de un programa o en diferentes programas en la aplicacin. Una
vez escrita la funcin que lleva a cabo la tarea, y cuando usted sepa que fun
ciona, puede usarla en cualquier parte en que la necesite.

Busque oportunidades para usar funciones. Su programa es mucho ms fcil


de leer y entender con una lnea como esta:

extraerDatosdemiembros();

que con las 20 lneas de enunciados que en efecto extraen los datos.

De hecho, despus de escribir programas PHP durante un tiempo, tendr un


arreglo de funciones que ha escrito para diversos programas. A menudo el pro
grama que est escribiendo puede usar una funcin escrita para otra aplicacin
dos trabajos atrs. Por ejemplo, yo frecuentemente necesito usar una lista de los
estados de EEUU. En lugar de incluir una lista con todos los 50 estados cada vez
que la necesito, tengo una funcin llamada extraerNombresdeestados ( ) la
cual devuelve un arreglo que guarda los nombres de los 50 estados en orden alfa
btico y una funcin llamada ex traerCod ig os deestados ( ) la cual devuelve un
arreglo con los cdigos de los estados que constan de dos letras, en el mismo or
den. Estas funciones son tiles muy a menudo.

D a sus funciones nombre muy descriptivos. Los llamados de funcin en su


programa deberan indicar exactamente qu hace la funcin. Est bien que
sea largo. Usted no querr ver una lnea en su programa que diga

funci o n l ( );

Esta lnea no es muy informativa, incluso una lnea como la siguiente es me


nos informativa de lo que podra ser:

extraerDatosf);

Es mejor ver una lnea com o esta:

extraerTodoslosnombresdemi embros ();

Mantenerlo en privado
Debe proteger su aplicacin con base de datos para la Web. Alguna gente po
dra tener diseos atroces en su sitio web para propsitos tales como
Captulo 10; Unirlo todo

u0 Robar cosas: Esperan encontrar un archivo por ah, lleno de nmeros


vlidos de tarjetas de crdito o la frmula secreta de la eterna juventud.

u0 Destrozar su sito web: Algunas personas creen que es divertido. Algu


nas personas lo hacen para demostrar que pueden hacerlo.

v0 Hacer dao a sus usuarios: Una persona maliciosa puede agregar cosas a su
sitio web que daan a las personas que visitan su sitio, o que les roban cosas.

Este no es un libro sobre seguridad. La seguridad es un tema largo y comple


jo, y yo no soy experta en seguridad. Sin embargo, quiero orientar su aten
cin hacia algunos aspectos y hacer algunas sugerencias que podran
ayudarle. Las siguientes medidas aumentarn la seguridad de su sitio web,
pero si su sitio maneja informacin secreta y realmente importante, lea algu
nos libros sobre seguridad y hable con expertos:

v0 Asegure la seguridad del PC que hospeda su sitio web. Esto probable


mente no sea su responsabilidad, pero sera bueno que hable con las
- personas responsables para discutir sus preocupaciones sobre seguri
dad. Se sentir mejor si sabe que alguien se preocupa por la seguridad.
00 No deje que el servidor web muestre los nombres de archivos. Los
usuarios no necesitan saber los nombres de los archivos en su sitio web.

v0 Oculte las cosas. Almacene su informacin de modo que nadie pueda te-
^ ner acceso a ella fcilmente desde la Web.

u0 No confe en la informacin de los usuarios. Siempre depure cualquier


informacin que no haya generado usted mismo.

v0 Use un servidor web seguro. Esto requiere de trabajo adicional, pero es


importante si usted cuenta con informacin ultra secreta.

Asegure la seguridad del PC


Primero, el PC mismo debe estar seguro. El administrador del sistema del PC
es responsable de mantener a los visitantes no autorizados y a los vndalos
fuera del sistema. Las medidas de seguridad incluyen cosas tales como barre
ras de proteccin (firewalls), encriptacin, ocultamiento de contraseas, de
tectores de escaneado, etc. En la mayora de los casos, usted no es el
administrador del sistema. Si es as, debe investigar seriamente los temas rela
cionados con la seguridad. Si est usando una compaa de hospedaje web, se
ra bueno que discuta la seguridad con los encargados para sentirse ms
seguro de que est usando suficientes medidas de seguridad.
Parte IV: Aplicaciones____________ _______________________________________

No deje que et servidor vVeb


muestre los nombres de archivos
Tal vez habr notado que a veces usted recibe una lista de nombres de archivo
cuando apunta a un URL. Si apunta a un directorio (y no a un archivo especfico) y
el directorio no contiene un archivo con el nombre de archivo predeterminado
(tal como i n d e x .html), el servidor web podra desplegar una lista de archivos
entre los cuales seleccionar. Usted probablemente no querr que su servidor web
haga esto; su sitio no ser seguro si un visitante puede ojear cualquier archivo en
l. En otros sitios web, quizs haya visto un mensaje de error que dice

F o rb id d e n
You d o n ' t have p e r m i s s i o n t o a ccess / s e c r e t d i r e c t o r y on t h i s s e r v e r .

En estos sitios, el servidor web est configurado de manera que no despliegue


una lista de nombres de archivos cuando el URL apunta hacia un directorio. En
su lugar, muestra este mensaje de error. Esto es ms seguro que enumerar los
nombres de los archivos. Si el nombre de archivo es enviado desde su sitio
web, debe cambiarse una configuracin para el servidor web. Si usted no es el
administrador de su servidor web, solicite un cambio. Si usted s lo es, depen
de de usted cambiar este comportamiento. Por ejemplo, en Apache, este com
portamiento es controlado mediante una opcin llamada Indexes, la cual se
puede activar y desactivar en el archivo httpd .conf com o sigue:

Options Indexes // la activa


Options -Indexes // la desactiva

Consulte la documentacin para su servidor web para permitir o prohibir


mostrar la lista del directorio en el explorador web del usuario.

Oculte tas cosas


Mantenga la informacin tan privada como le sea posible. Por supuesto, las
pginas web que desea que los visitantes vean deben almacenarse en un di
rectorio de espacio web pblico. Pero no todo necesita almacenarse ah. Por
ejemplo, puede almacenar archivos include en un lugar totalmente diferente,
en un espacio del PC al cual no se pueda tener acceso desde la Web. Su base
de datos ciertamente no se almacena en su espacio web, pero podra estar in
cluso ms segura si estuviera en un PC totalmente diferente.

Otra forma de ocultar cosas es darles nombres engaosos. Por ejemplo, el


archivo include que contiene las variables de la base de datos no debera
llamarse claves.inc. Un mejor nombre sera Re ce ta de s o p a d e p o l l o t i o
Juan . i nc. S que esta sugerencia viola otras secciones del libro donde
prom uevo el uso de nombres de archivo descriptivos, pero este es un caso
especial. Las personas maliciosas a veces hacen cosas obvias com o digitar
w w w . susi ti o .com/claves, html en su explorador para ver qu sucede.
___________________________________________ Captulo 10: Unirlo todo

No confe en ta informacin de tos usuarios


Los usuarios malintencionados pueden usar los formularios en sus pginas
web para enviar texto peligroso a su sitio web. Por lo tanto, nunca almacene in
formacin de los formularios directamente en su base de datos sin revisarla
primero. Verifique la informacin que recibe en busca de formatos razonables
y caracteres peligrosos. En particular, no debe aceptar etiquetas HTML, tales
com o etiquetas <scr i pt>, de los formularios. Al usar etiquetas script, un
usuario podra digitar un script real, quizs uno malintencionado. Si usted
acepta el campo del formulario sin revisarlo y lo almacena en su base de datos,
podra tener cualquier cantidad de problemas, particularmente si el script al
macenado fue enviado en una pgina web a un visitante de su sitio web. Para
ms sobre cmo chequear los datos de los formularios, vea el Captulo 8.

Use un servidor Web seguro


La comunicacin entre su sitio web y sus visitantes no es totalmente segura.
Cuando los archivos en su sitio web se envan al buscador del usuario, alguien
en Internet entre usted y el usuario puede leer los contenidos de estos archivos
conforme pasan. Para la mayora de los sitios web, esto no representa un proble
ma; sin embargo, si su sitio recopila o enva nmeros de tarjetas de crdito u
otra informacin secreta, use un servidor web seguro para proteger estos datos.

Los servidores web seguros usan Security Sockets Layer (SSL) para proteger
la comunicacin enviada a los exploradores y recibida de ellos. Esto es pare
cido a las llamadas telefnicas codificadas de las cuales oye hablar en las pe
lculas de espas. La informacin se codifica (se traduce a cadenas
codificadas) antes de ser enviada por la Web. El software que la recibe la des
codifica hasta dar con su contenido original. Adems, su sitio web usa un cer
tificado que verifica su identidad. Usar un servidor web seguro implica
trabajo adicional, pero es necesario para algunas aplicaciones.

Puede saber cundo se est comunicando usando SSL. El URL empieza con
HTTPS, en lugar de HTTP.

La informacin sobre los servidores web seguros es especfica al servidor


web que usted est usando. Para averiguar ms sobre cmo usar SSL, vea el
sitio web del servidor web que est usando. Por ejemplo, si est usando Apa
che, revise dos proyectos de fuente abierta que implementan SSL para Apa
che en w w w .modssl .org y w w w . a p a c h e s s l .org. Tambin hay software
comercial disponible, el cual proporciona un servidor seguro con base en el
servidor web de Apache. Si est usando Microsoft Internet Information Ser-
ver (US), busque SSL en el sitio web de Microsoft en www. mi crosoft.com.
Parte IV: Aplicaciones

Completar su documentacin
Esto es lo ltimo que dir aqu. Documentar su aplicacin con base de datos
para la Web es esencial. Se empieza con un plan que describe lo que supues
tamente debe hacer la aplicacin. Con base en su plan, usted crea un diseo
para la base de datos. Mantenga el plan y el diseo al da. A menudo, confor
me el proyecto avanza, se hacen cambios. Asegrese de que su documenta
cin cambie para concordar con las nuevas decisiones.

Mientras disea sus programas, asocie las tareas en el plan de la aplicacin


con los programas que planea escribir. Enumere los programas y lo que har
cada uno. Si los programas son complicados, tal vez quiera incluir una breve
descripcin de cmo el programa realizar sus tareas. Si este es un esfuerzo
de equipo, indique quin es responsable de cada programa. Al completar su
aplicacin, debera contar con los siguientes documentos:

u * Plan de la aplicacin: Describe lo que supuestamente hace la aplica


cin, e indica las tareas que llevar a cabo.
Diseo de la base de datos: Describe las tablas y los campos que estn
en la base de datos.
Diseo de los programas: Describe cmo los programas harn las ta-
reas en el plan de la aplicacin.

i v * Comentarios del programa: Describen los detalles sobre cmo funciona


el programa individual

Imagine que han pasado cinco aos y usted est a punto de reescribir su apli
cacin. Qu deber saber sobre la aplicacin para poder cambiarla? Cerci
rese de incluir toda la informacin que necesita saber en su documentacin.
Captulo 11

Construir un catlogo en lnea


En este captulo
Disear un catlogo en lnea
Construir la base de datos para el Catlogo de Mascotas
Disear las pginas web para el Catlogo de Mascotas
Escribir los programas para el Catlogo de Mascotas

m os catlogos en lnea estn en todas partes en la Web. Todo negocio que tie-
tm n e productos a la venta puede usar un catlogo e