Está en la página 1de 74

Programacin en PHP

Programacin en PHP

1 / 74

Prlogo

La forma en la que se ha redactado este manual lo hace accesible a cualquier persona no familiarizada con la programacin. Sin embargo, es posible que en determinados momentos alguien que no haya programado pueda verse un poco desorientado. Nuestro consejo es no querer entender todo antes de pasar al siguiente captulo sino intentar asimilar algunos conceptos y volver atr s en cuanto una duda surja o hayamos olvidado alg!n detalle. Nunca viene mal leer varias veces lo mismo hasta que quede bien grabado y asimilado. "ntes de comenzar con este curso es altamente aconsejable, sino imprescindible, haber llevado previamente el curso sobre p ginas din micas en el cual se e#plica a grandes rasgos qu$ es el %&% '%&% (ntroduction), algunos conceptos !tiles sobre el modo de trabajar con p ginas din micas al mismo tiempo que nos introduce algunos elementos b sicos de la programacin como pueden ser las variables y las funciones.

*areas+

Las tareas son peque,os fragmento de cdigo que deben ser realizadas por el estudiante, ya que estas ejemplifican el tema en estudio.

-jercicios (ntegradores+ " partir del captulo . se inician con -jercicios (ntegradores. Los ejercicios integradores e#igen que se haya comprendido a la perfeccin el captulo en estudio. -l ejercicio integrador del captulo . es un ejercicio guiado, los ejercicios a partir del captulo / solo contendr n las instrucciones para llevarlo a cabo. La solucin al ejercicio puede ser variada, dado que cada programador tiene su forma de resolver problemas, sin embargo el instructor mostrar una solucin al finalizar el ejercicio. 0na de las soluciones se muestra en el !ltimo captulo del manual.

Programacin en PHP

2 / 74

Contenido
CAPTULO 1: INTRODUCCIN.........................................................................................................................5 1.1 INTRODUCCIN................................................................................................................................................5 1.2 BREVE HISTORIA DE PHP.................................................................................................................................5 1.3 TAREAS PRINCIPALES DEL PHP.......................................................................................................................6 CAPTULO 2: INTRODUCCIN AL LENGUAJE............................................................................................8 2.1 INTRODUCCIN A LA SINTAXIS PHP................................................................................................................8 2.2 VARIABLES EN PHP.........................................................................................................................................9 2.3 VARIABLES DE SISTEMA.................................................................................................................................10 2.4 CONSTANTES..................................................................................................................................................11 2.5 ARREGLOS ARRA!S".....................................................................................................................................12 2.6 CADENAS.......................................................................................................................................................14 2.# VARIABLES EST$TICAS..................................................................................................................................16 2.8 OPERADORES..................................................................................................................................................16 2.9 CONTROL DE %LU&O........................................................................................................................................18 2.10 %UNCIONES...................................................................................................................................................23 CAPTULO 3: CADENAS Y EXPRESIONES REGULARES.........................................................................27 3.1 %UNCIONES PARA CADENAS...........................................................................................................................2# 3.2 %UNCIONES DE PARSING................................................................................................................................28 3.3 SUBCADENAS.................................................................................................................................................29 3.4 B'S(UEDAS ! REEMPLA)OS..........................................................................................................................30 3.5 SINTAXIS B$SICA DE UNA EXPRESIN REGULAR...........................................................................................30 3.6 E&ERCICIO INTEGRADOR.................................................................................................................................32 CAPTULO 4: FORMULARIOS.........................................................................................................................33 4.1 PASAR VARIABLES POR URL.........................................................................................................................33 4.2 PROCESAR VARIABLES DE %ORMULARIOS......................................................................................................34 4.3 E&ERCICIO INTEGRADOR.................................................................................................................................35 CAPTULO 5: PERSISTENCIA..........................................................................................................................37 5.1 UTILI)ACIN DE LAS COO*IES.......................................................................................................................3# 5.2 SESIONES........................................................................................................................................................38 5.3 E&ERCICIO INTEGRADOR.................................................................................................................................40 CAPTULO : !ASES DE DATOS MYS"L......................................................................................................41 6.1 CONECTAR A M!S(L DESDE PHP................................................................................................................41 6.2 CREACIN DE UNA BASE DE DATOS EN M!S(L..........................................................................................41 6.3 MOSTRAR LOS DATOS DE UNA CONSULTA.....................................................................................................44 6.4 UN BUSCADOR PARA LA BASE DE DATOS.....................................................................................................45 6.5 A+ADIR REGISTROS.......................................................................................................................................4# 6.6 MODI%ICAR REGISTROS.................................................................................................................................48 6.# BORRAR REGISTROS......................................................................................................................................49 6.8 TODO A LA VE).............................................................................................................................................49 6.9 E&ERCICIO INTEGRADOR.................................................................................................................................50 CAPTULO 7: GENERACIN DIN#MICA DE IM#GENES........................................................................54 #.1 INTRODUCCIN..............................................................................................................................................54

Programacin en PHP

3 / 74

#.2 CREACIN DE UNA IMAGEN...........................................................................................................................54 #.3 CREACIN ! ALO&AMIENTO DE COLORES......................................................................................................55 #.4 %UNCIONES PARA CREACIN DE OB&ETOS EN LA IMAGEN..............................................................................55 #.5 GENERACIN DE LA IMAGEN.........................................................................................................................5# #.6 E&ERCICIO INTEGRADOR.................................................................................................................................60 8. INTRODUCCIN A SOC$ETS...................................................................................................................... 2 8.1 %SOC*OPEN....................................................................................................................................................62 8.2 OTRAS %UNCIONES 'TILES.............................................................................................................................63 8.3 E&ERCICIO INTEGRADOR.................................................................................................................................63 CAPTULO %: SOLUCIN EJERCICIOS INTEGRADORES....................................................................... 5 9.1 E&ERCICIO INTEGRADOR 4 9.2 E&ERCICIO INTEGRADOR 5 9.3 E&ERCICIO INTEGRADOR 6 9.4 E&ERCICIO INTEGRADOR # 9.5 E&ERCICIO INTEGRADOR 8 %ORMULARIO PARA AMORTI)ACIN"................................................................65 CARRITO DE COMPRAS B$SICO".........................................................................6# CARRITO CON BASE DE DATOS"........................................................................69 MAPA"................................................................................................................#2 MONITOR SITIOS ,EB"......................................................................................#3

Programacin en PHP

4 / 74

Captulo 1: Introduccin
Objetivo: "l terminar el captulo, el alumno conocer lenguaje de programacin %&% los orgenes y la actualidad del

1.1 (ntroduccin
%&% es uno de los lenguajes de lado servidor m s e#tendidos en 2eb. Nacido en 133/, se trata de un lenguaje de creacin relativamente reciente que ha tenido una gran aceptacin en la comunidad de 4ebmasters debido sobre todo a la potencia y simplicidad que lo caracterizan. %&% nos permite embeber peque,os fragmentos de cdigo dentro de la p gina &*5L y realizar determinadas acciones de una forma f cil y eficaz, sin tener que generar programas desarrollados ntegramente en un lenguaje distinto al &*5L. %or otra parte, y es aqu donde reside su mayor inter$s con respecto a los lenguajes pensados para los 67(, %&% ofrece un sinfn de funciones para la e#plotacin de bases de datos de una manera llana, sin complicaciones. 8ealizando una vaga comparacin entre %&% y "S% se puede decir que son lenguajes parecidos en cuanto a la curva de aprendizaje, sin embargo, algunas diferencias principales son+
%&%, aunque multiplataforma, ha sido concebido inicialmente para entornos 0N(9 y es en

este sistema operativo donde se pueden aprovechar mejor sus prestaciones. "S%, siendo una tecnologa 5icrosoft, esta orientado hacia sistemas 2indo4s.
Las tareas fundamentales que puede realizar directamente el lenguaje son definidas en

%&% como funciones mientras que "S% invoca m s frecuentemente los objetos. %or supuesto, esto no es m s que una simple cuestin de forma ya que ambos lenguajes soportan igualmente ambos procedimientos.
"S% realiza numerosas tareas sirvi$ndose de componentes que deben ser comprados 'o

programados) por el servidor a determinadas empresas especializadas. %&% presenta una filosofa totalmente diferente y, con un espritu m s generoso, es progresivamente construido por colaboradores desinteresados que implementan nuevas funciones en nuevas versiones del lenguaje.

1.: ;reve historia de %&%


%&% es un lenguaje creado por una gran comunidad de personas. -l sistema fue desarrollado originalmente en 133/ por 8asmus Lerdorf como un 67( escrito en 6 que permita la interpretacin de un n!mero limitado de comandos. -l sistema fue denominado %ersonal &ome %age *ools y adquiri relativo $#ito gracias a que otras personas pidieron a 8asmus que les permitiese utilizar sus programas en sus propias p ginas. <ada la aceptacin del primer %&% y de manera adicional, su creador dise, un sistema para procesar formularios al que le atribuy el nombre de =( '=orm (nterpreter) y Programacin en PHP 5 / 74

el conjunto de estas dos herramientas, sera la primera versin compacta del lenguaje+ %&%>=(. La siguiente gran contribucin al lenguaje se realiz a mediados de 133? cuando se volvi a programar el analizador sint ctico, se incluyeron nuevas funcionalidades como el soporte a nuevos protocolos de (nternet y el soporte a la gran mayora de las bases de datos comerciales. *odas estas mejoras sentaron las bases de %&% versin .. "ctualmente %&% se encuentra en su versin /, que utiliza el motor @end, desarrollado con mayor meditacin para cubrir las necesidades actuales y solucionar algunos inconvenientes de la anterior versin. "lgunas mejoras de esta nueva versin son su rapidez Agracias a que primero se compila y luego se ejecuta, mientras que antes se ejecutaba mientras se interpretaba el cdigoA, su mayor independencia del servidor 2eb Acreando versiones de %&% nativas para m s plataformasA y un "%( m s elaborado y con m s funciones. -n el !ltimo a,o, el n!mero de servidores que utilizan %&% se ha disparado, logrando situarse cerca de los B millones de sitios y CDD.DDD direcciones (%, lo que le ha convertido a %&% en una tecnologa popular. -sto es debido, entre otras razones, a que %&% es el complemento ideal para que el t ndem Linu#A"pache sea compatible con la programacin del lado del servidor de sitios 2eb. 7racias a la aceptacin que ha logrado, y los grandes esfuerzos realizados por una creciente comunidad de colaboradores para implementarlo de la manera m s ptima, podemos asegurar que el lenguaje se convertir en un est ndar que compartir los $#itos augurados al conjunto de sistemas desarrollados en cdigo abierto.

1.. *areas principales del %&%


%oco a poco el %&% se va convirtiendo en un lenguaje que nos permite hacer de todo. -n un principio dise,ado para realizar poco m s que un contador y un libro de visitas, %&% ha e#perimentado en poco tiempo una verdadera revolucin y, a partir de sus funciones, en estos momentos se pueden realizar una multitud de tareas !tiles para el desarrollo del 2eb+

1.3.1 Funciones de correo electrnico


%odemos con una facilidad asombrosa enviar un eAmail a una persona o lista parametrizando toda una serie de aspectos tales como el eAmail de procedencia, asunto, persona a responder, etc. Etras funciones menos frecuentes pero de indudable utilidad para gestionar correos electrnicos son incluidas en su librera.

1.3.2 Gestin de bases de datos

8esulta difcil concebir un sitio actual, potente y rico en contenido que no es gestionado por una base de datos. -l lenguaje %&% ofrece interfaces para el acceso a la mayora de las bases de datos comerciales y por E<;6 a todas las bases de datos posibles en sistemas 5icrosoft, a partir de las cuales podremos editar el contenido de nuestro sitio con absoluta sencillez.

1.3.3 Gestin de archivos

6rear, borrar, mover, modificar...cualquier tipo de operacin m s o menos razonable que se nos pueda ocurrir puede ser realizada a partir de una amplia librera de funciones para la gestin de archivos por %&%. *ambi$n

Programacin en PHP

6 / 74

podemos transferir archivos por =*% a partir de sentencias en nuestro cdigo, protocolo para el cual %&% ha previsto tambi$n gran cantidad de funciones.

1.3.4 Tratamiento de imgenes


-videntemente resulta mucho m s sencillo utilizar %hotoshop para una el tratamiento de im genes pero...FG si tenemos que tratar miles de im genes enviadas por nuestros usuariosH La verdad es que puede resultar muy tedioso uniformar en tama,o y formato miles de im genes recibidas da tras da. *odo esto puede ser tambi$n automatizado eficazmente mediante %&%. *ambi$n puede parecer !til el crear botones din micos, es decir, botones en los que utilizamos el mismo dise,o y solo cambiamos el te#to. %odremos por ejemplo crear un botn haciendo una !nica llamada a una funcin en la que introducimos el estilo del botn y el te#to a introducir obteniendo autom ticamente el botn deseado. " partir de la librera de funciones graficas podemos hacer esto y mucho m s. 5uchas otras funciones pensadas para Internet 'tratamiento de cooIies, accesos restringidos, comercio electrnico...) o para propsito general 'funciones matem ticas, e#plotacin de cadenas, de fechas, correccin ortogr fica, compresin de archivos...) son realizadas por este lenguaje. " esta inmensa librera cabe ahora a,adir todas las funciones personales que uno va creando por necesidades propias y que luego son reutilizadas en otros sitios y todas aquellas intercambiadas u obtenidas en foros o sitios especializados. 6omo puede verse, las posibilidades que se nos presentan son sorprendentemente vastas. Lo !nico que se necesita es un poco de ganas de aprender y algo de paciencia en nuestros primeros pasos. -l resultado puede ser muy satisfactorio.

Programacin en PHP

7 / 74

Captulo 2: Introduccin al Lenguaje


Objetivo: "l terminar el captulo, el alumno conocer a detalle la sinta#is y gram tica del lenguaje de programacin %&%, as mismo ser capaz de desarrollar peque,os programas de procesamiento.

:.1 (ntroduccin a la sinta#is %&%


%&% se escribe dentro de la propia p gina 2eb, junto con el cdigo &*5L y, como para cualquier otro tipo de lenguaje incluido en un cdigo &*5L, en %&% necesitamos especificar cu les son las partes constitutivas del cdigo escritas en este lenguaje. -sto se hace, como en otros casos, delimitando nuestro cdigo por etiquetas. %odemos utilizar distintos modelos de etiquetas en funcin de nuestras preferencias y costumbres. &ay que tener sin embargo en cuenta que no necesariamente todas est n configuradas inicialmente y que otras slo est n disponibles a partir de una determinada versin. -stos modos de abrir y cerrar las etiquetas son+
<? <% <?php y y y ?> %> ?>

-l modo de funcionamiento de una p gina %&%, a grandes rasgos, no difiere del cl sico para una p gina din mica de lado del servidor+ -l servidor va a reconocer la e#tensin correspondiente a la p gina %&% 'phtml, php, php/,...) y antes de enviarla al navegador va a encargarse de interpretar y ejecutar todo aquello que se encuentre entre las etiquetas correspondientes al lenguaje %&%. -l resto, lo enviar sin m s ya que, asumir que se trata de cdigo &*5L absolutamente comprensible por el navegador.

2.1.1 Separacin de Instrucciones


Etra caracterstica general de los programas en %&% es la forma de separar las distintas instrucciones. %ara hacerlo, hay que acabar cada instruccin con un punto y coma J ;J. %ara la !ltima e#presin, la que va antes del cierre de etiqueta, este formalismo no es necesario.

2.1.2 omentarios
0n comentario es una frase o palabra que nosotros incluimos en el cdigo para comprenderlo m s f cilmente al volverlo a leer un tiempo despu$s y que, por supuesto, el ordenador tiene que ignorar ya que no va dirigido a $l sino a nosotros mismos. Los comentarios tienen una gran utilidad ya que es muy f cil olvidarse del funcionamiento de un programa escrito un tiempo atr s y resulta muy !til si queremos hacer r pidamente comprensible nuestro cdigo a otra persona. La forma de incluir estos comentarios es variable dependiendo si queremos escribir una lnea o m s. Keamos esto con un primer ejemplo de programa+

Programacin en PHP

8 / 74

<? $mensaje="Tengo hambre!!"; //Comentario de una lnea echo $mensaje; #Este comentario tambin es de una lnea /*En este caso mi comentario ocupa varias lneas. */ ?>

Si usamos doble barra '>>) o el smbolo L podemos introducir comentarios de una lnea. 5ediante >M y M> creamos comentarios multilnea. %or supuesto, nada nos impide de usar estos !ltimos en una sola lnea. 8ecordamos que todo el te#to insertado en forma de comentario es completamente ignorado por el servidor. 8esulta importante acostumbrarse a dejar comentarios, es algo que se agradece con el tiempo.

:.: Kariables en %&%


Las variables en %&% se definen anteponiendo el smbolo de pesos ' $) al nombre de la variable. <ependiendo de la informacin que contenga, una variable puede ser considerada de uno u otro tipo+ Variables numricas $entero=2002; N!meros sin decimales $real=3.14159; N!meros con o sin decimal

-nteros 8eal

6adenas

Variables alfanumricas "lmacenan caracteres alfanum$ricos

$cadena="Hola mundo";

Tablas "rreglos Son las variables que guardan las tablas


$sentido[1]="ver"; $sentido[2]="tocar"; $sentido[3]="or"; $sentido[4]="gusto"; $sentido[5]="oler";

bjetos Se trata de conjuntos de variables y funciones asociadas. %resentan una complejidad mayor que las variables vistas hasta ahora pero su utilidad es m s que interesante. " diferencia de otros lenguajes, %&% posee una gran fle#ibilidad a la hora de operar con variables. -n efecto, cuando definimos una variable asign ndole un valor, el servidor le atribuye un tipo. Si por ejemplo definimos una variable entre comillas, la variable ser considerada de tipo cadena+
$variable="5"; //esto es una cadena

Sin embargo si pedimos en nuestro programa realizar una operacin matem tica con esta Programacin en PHP 9 / 74

variable, no obtendremos un mensaje de error sino que la variable cadena ser asimilada a num$rica+
<? $cadena="5"; //esto es una cadena $entero=3; //esto es un entero echo $cadena+$entero; ?>

-ste programa dar como resultado JCJ. La variable cadena ha sido asimilada en entero 'aunque su tipo sigue siendo cadena) para poder realizar la operacin matem tica. <el mismo modo, podemos operar entre variables tipo entero y real. %&% se encarga durante la ejecucin de interpretar el tipo de variable necesario para el buen funcionamiento del programa. Sin embargo, en contraste, hay que tener cuidado en no cambiar may!sculas por min!sculas ya que, en este sentido, %&% es sensible. 6onviene por lo tanto trabajar ya sea siempre en may!sculas o siempre en min!sculas para evitar este tipo de malentendidos a veces muy difciles de localizar.

:.. Kariables de sistema


<ada su naturaleza de lenguaje de lado servidor, %&% es capaz de darnos acceso a toda una serie de variables que nos informan sobre nuestro servidor y sobre el cliente. La informacin de estas variables es atribuida por el servidor y en ning!n caso nos es posible modificar sus valores directamente. %ara hacerlo es necesario influir directamente sobre la propiedad que definen. -#isten multitud de variables de este tipo, algunas sin utilidad aparente y otras realmente interesantes y con una aplicacin directa para nuestra aplicacin 2eb+ Variable !escripcin Nos informa principalmente sobre el sistema operativo, tipo y versin de navegador. Su principal utilidad radica en que, a partir de esta informacin, podemos redireccionar nuestros usuarios hacia p ginas optimizadas para su navegador o realizar cualquier otro tipo de accin en el conte#to de un navegador determinado. Nos devuelve la o las abreviaciones del idioma considerada como principal por el navegador. -ste idioma o idiomas pueden ser elegidas en el men! de opciones del navegador. -sta variable resulta tambi$n e#tremadamente !til para enviar al usuario las p ginas escritas en su idioma, si es que e#isten. Nos indica la 08L desde la cual el usuario ha tenido acceso a la p gina. 5uy interesante para generar botones de J"tr sJ din micos o para crear nuestros propios sistemas de estadsticas de visitas. Nos devuelve una cadena con la 08L del programa que est siendo ejecutado. 5uy interesante para crear botones para recargar la p gina. Se trata de un arreglo que almacena los nombres y contenidos de las variables enviadas al programa por 08L o por formularios 7-*. Se trata de un arreglo que almacena los nombres y contenidos de

$HTTP_USER_AGENT

$HTTP_ACCEPT_LANGUAGE

$HTTP_REFERER

$PHP_SELF

$HTTP_GET_VARS $HTTP_POST_VARS

Programacin en PHP

10 / 74

$HTTP_COOKIES_VARS

$PHP_AUTH_USER

$PHP_AUTH_PW

$REMOTE_ADDR $DOCUMENT_ROOT $PHPSESSID

las variables enviadas al programa por medio de un formulario %ES*. Se trata de un array que almacena los nombres y contenidos de las cooIies. Keremos qu$ son m s adelante. "lmacena la variable usuario cuando se efect!a la entrada a p ginas de acceso restringido. 6ombinado con N%&%O"0*&O%2 resulta ideal para controlar el acceso a las p ginas internas del sitio. "lmacena la variable pass4ord cuando se efect!a la entrada a p ginas de acceso restringido. 6ombinado con N%&%O"0*&O0S-8 resulta ideal para controlar el acceso a las p ginas internas del sitio. 5uestra la direccin (% del visitante. Nos devuelve la ruta fsica 'absoluta) en el que se encuentra alojada la p gina en el servidor. 7uarda el identificador de sesin del usuario. Keremos m s adelante en qu$ consisten las sesiones.

No todas estas variables est n disponibles en la totalidad de servidores o en determinadas versiones de un mismo servidor. "dem s, algunas de ellas han de ser previamente activadas o definidas por medio de alg!n acontecimiento. "s, por ejemplo, la variable N&**%O8-=-8-8 no estar definida a menos que el usuario acceda al programa a partir de un enlace desde otra p gina.

:./ 6onstantes
" diferencia de las variables, las constantes mantienen su valor desde que son definidas hasta que termina la ejecucin del programa. No pueden redefinirse. %ara definir una constante se utiliza la funcin+
define(nombre, valor);

donde nombre es el nombre de la constante, por ejemplo %(, y valor es la cantidad o cadena que va a contener la constante, por ejemplo ..1/1B+
define(PI, 3.1415);

-n %&% e#isten algunas constantes predefinidas que no requieren la instruccin define. "lgunas de ellas son+ OO=(L-OO 6ontiene el nombre del archivo que se est ejecutando y la ruta completa de su ubicacin en el servidor. OOL(N-OO 6ontiene el n!mero de lnea 'incluidas lneas en blanco) del archivo %&% que se est interpretando. -s muy !til para depurar las p ginas %&% %&%OES 6ontiene informacin sobre el Sistema Eperativo que utiliza el servidor en el que se est interpretando el archivo. Programacin en PHP 11 / 74

%&%OK-8S(EN Nos indica la versin de %&% que est siendo utilizada por el servidor. 8ealicemos la siguiente tarea+
<HTML> <HEAD> <TITLE>Ejemplo de Constantes</TITLE> </HEAD> <BODY> <?php # La constante del sistema __FILE__ nos devolver # el nombre del archivo que se est interpretando # actualmente. En este caso nos devolver constantes.php # y tambin su ruta (path) echo "La ruta completa de este archivo es: "; echo __FILE__; # La constante del sistema __LINE__ nos devolver # el nmero de lnea que se est interpretando # tambin cuenta las lneas en blanco # cuenta las lneas y vers que devuelve ... 21 echo "<br>Esta es la lnea: ".__LINE__."del archivo"; echo "<br>Estamos utilizando la versin: ".PHP_VERSION." de PHP"; echo "<br>El PHP se est ejecutando desde el sistema operativo: ".PHP_OS; ?> </BODY> </HTML>

:.B "rreglos 'arrays)


Los arreglos o ParraysQ, son un tipo de variable que ya hemos descrito pero puede ser relativamente complicado de asimilar con respecto a la mayora. 0n arreglo es una variable que est compuesta de varios elementos cada uno de ellos catalogado dentro de ella misma por medio de una clave.
$sentido[1]="ver"; $sentido[2]="tocar"; $sentido[3]="or"; $sentido[4]="gustar"; $sentido[5]="oler";

-n este caso este arreglo cataloga sus elementos 'valores), por n!meros. Los n!meros del 1 al B son por lo tanto las claves y los sentidos son los valores asociados. Nada nos impide emplear nombres 'cadenas) para clasificarlos. Lo !nico que deberemos hacer es entrecomillarlos+
<? $moneda["mexico"]="Peso"; $moneda["espana"]="Peseta"; $moneda["francia"]="Franco"; $moneda["usa"]="Dlar"; ?>

Etra forma de definir id$nticamente este mismo arreglo y que nos puede ayudar para la creacin de arreglos m s complejos es la siguiente sinta#is+

Programacin en PHP

12 / 74

<? $moneda=array("mexico" => "Peso", "espana" => "Peseta", "francia" => "Franco", "usa" => "Dlar"); ?>

0na forma muy pr ctica de almacenar datos es mediante la creacin de arreglos multidimensionales 'tablas). %or ejemplo+ Rueremos almacenar dentro de una misma tabla el nombre, moneda e idioma hablado en cada pas. %ara hacerlo podemos emplear un arreglo llamado pas que vendr definido por estas tres caractersticas 'claves). %ara crearlo, deberamos escribir una e#presin del mismo tipo que la vista anteriormente en la que meteremos una arreglo dentro del otro+
<? $pais=array ( "mexico" =>array ( "nombre"=>"Mxico", "lengua"=>"Castellano", "moneda"=>"Peso" ), "francia" =>array ( "nombre"=>"Francia", "lengua"=>"Francs", "moneda"=>"Franco" ) ); echo $pais["mexico"]["moneda"] ?>

//muestra en pantalla: "Peso"

"ntes de entrar en el detalle de este peque,o programa, comentemos algunos puntos referentes a la sinta#is. 6omo puede verse, en esta secuencia de programa, no hemos introducido punto y coma JSJ al final de cada lnea. -sto es simplemente debido a que lo que hemos escrito puede ser considerado como una sola instruccin. -n realidad, somos nosotros quienes decidimos cortarla en varias lneas para, as, facilitar su lectura. La verdadera instruccin acabara una vez definido completamente el arreglo y es precisamente ah donde hemos colocado el !nico punto y coma. %or otra parte, se puede observar cmo se ha utilizado el tabulador para separar unas lneas m s que otras del principio. -sto tambi$n lo hacemos por cuestiones de claridad, ya que nos permite ver qu$ partes del cdigo est n incluidas dentro de otras. -s importante acostumbrarse a escribir de esta forma del mismo modo que a introducir los comentarios ya que la claridad de los programas es fundamental a la hora de depurarlos. 0n poco de esfuerzo a la hora de crearlos puede ahorrarnos muchas horas a la hora de corregirlos o modificarlos meses m s tarde. Lo que es interesante es que la utilidad de los arreglos no acaba aqu, sino que tambi$n podemos utilizar toda una serie de funciones creadas para ordenarlos por orden alfab$tico directo o inverso, por claves, contar el numero de elementos que componen el arreglo adem s de poder movernos dentro de $l. 5uchas son las funciones propuestas por %&% para el tratamiento de arreglos, no vamos a entrar aqu en una descripcin de las mismas. Slo incluiremos esta peque,a tabla que puede ser complementada con la documentacin que se ha mencionado. "uncin
array_values (mi_array)

!escripcin Lista los valores contenidos en miOarray

Programacin en PHP

13 / 74

asort(mi_array) y arsort(mi_array) count(mi_array) ksort(mi_array) y krsort(mi_array) list ($variable1, $variable2...)=mi_array next(mi_array), prev(mi_array), reset(mi_array) y end(mi_array) each(mi_array)

Erdena por orden alfab$tico directo o inverso en funcin de los valores Nos da el numero de elementos de nuestro arreglo Erdena por orden alfab$tico directo o inverso en funcin de las claves "signa a cada variable cada uno de los valores del arreglo Nos permiten movernos dentro del arreglo con un puntero hacia delante, atr s y al principio y al final. Nos da el valor y la clave del elemento en el que nos encontramos y mueve al puntero al siguiente elemento.

:.T 6adenas
0na de las variables m s comunes a las que tendremos que hacer frente en la mayora de nuestros programas son las cadenas, que no son m s que informacin de car cter no num$rico 'te#tos, por ejemplo). %ara asignar a una variable un contenido de este tipo, lo escribiremos entre comillas dando lugar a declaraciones de este tipo+
$cadena="Esta es la informacin de mi variable"

Si queremos ver en pantalla el valor de una variable o bien un mensaje cualquiera usaremos la instruccin echo como ya lo hemos visto anteriormente+
echo $cadena //sacara "Esta es la informacin de mi variable" echo "Esta es la informacin de mi variable" //dara el mismo resultado

%odemos yu#taponer o concatenar varias cadenas poniendo para ello un punto entre ellas+
<? $cadena1="Perro"; $cadena2=" muerde"; $cadena3=$cadena1.$cadena2; echo $cadena3 //El resultado es: "Perro muerde" ?>

*ambi$n podemos introducir variables dentro de nuestra cadena lo cual nos puede ayudar mucho en el desarrollo de nuestros programas. Lo que veremos no es el nombre, sino el valor de la variable+
<?php $a=55; $mensaje="Tengo $a aos"; echo $mensaje //El resultado es: "Tengo 55 aos" ?>

La pregunta que nos podemos plantear ahora es... F6mo hago entonces para que en vez del valor JBBJ me salga el te#to JNaJH -n otras palabras, cmo se hace para que el smbolo N no defina una variable sino que sea tomado tal cual. -sta pregunta es tanto m s interesante dado que en algunos programas este smbolo debe ser utilizado por una simple razn comercial 'pago en pesos por ejemplo), si lo escribimos tal cual, %&% lo va a

Programacin en PHP

14 / 74

interpretar como una variable. %ara poder utilizar este tipo de caracteres y otros utilizados por el lenguaje dentro de las cadenas y no confundirlos, lo que hay que hacer es escribir una diagonal invertida adelante+ Car#cter
\$ \" \\ \8/2

-scribe -scribe -scribe -scribe

$fecto en la cadena dlar en la cadena comillas en la cadena una diagonal invertida en la cadena C>: y no / en la cadena

"dem s, e#isten otras utilidades de esta diagonal invertida que nos permiten introducir en nuestro documento &*5L determinados eventos+ Car#cter
\t \n \r

$fecto en la cadena (ntroduce una tabulacin en nuestro te#to 6ambiamos de lnea 8etorno de carro

-stos cambios de lnea y tabulaciones tienen !nicamente efecto en el cdigo y no en el te#to ejecutado por el navegador. -n otras palabras, si queremos que nuestro te#to ejecutado cambie de lnea hemos de introducir un echo "<br>" y no echo "\n" ya que este ultimo slo cambia de lnea en el archivo &*5L creado y enviado al navegador cuando la p gina es ejecutada en el servidor. La diferencia entre estos dos elementos puede ser f cilmente comprendida revisando el cdigo fuente producido al ejecutar este programa+
<HTML> <HEAD> <TITLE>cambiolinea.php</TITLE> </HEAD> <BODY> <? echo "Hola, \n sigo en la misma lnea ejecutada pero no en cdigo fuente.<br>Ahora cambio de lnea ejecutada pero continuo en la misma en el cdigo fuente." ?> </BODY> </HTML>
* Echar un vistazo al codigo fuente del navegador

-l cdigo fuente que observaramos seria el siguiente+


<HTML> <HEAD> <TITLE>cambiolinea.php</TITLE> </HEAD> <BODY> Hola, sigo en la misma lnea ejecutada pero no en cdigo fuente.<br>Ahora cambio de lnea ejecutada pero continuo en la misma en el cdigo fuente.</BODY> </HTML>

Las cadenas pueden asimismo ser tratadas por medio de funciones de todo tipo. Keremos estas funciones m s adelante con m s detalle. *an slo debemos retener que e#isten muchas posibles acciones que podemos realizar sobre ellas+ <ividirlas en palabras,

Programacin en PHP

15 / 74

eliminar espacios sobrantes, localizar secuencias, remplazar caracteres especiales por su correspondiente en &*5L o incluso e#traer las etiquetas 5-*" de una p gina 2eb.

:.? Kariables -st ticas


6uando definimos una variable dentro una funcin al salir de ella pierde el valor que pasa a ser nulo. %ara poder conservar el !ltimo valor de una variable definida dentro de una funcin basta con definirla como est tica. La sinta#is para definir una variable est tica es+
static nombre=valor;

%or ejemplo, si la variable fuera Na y el valor inicial que pretendi$ramos asignarle fuera . escribiramos+
static $a=3;

La variable conserva siempre el !ltimo valor que pudo haberle sido asignado durante la ejecucin de los programas %&% contenidos en la p gina. *area+
<HTML> <HEAD> <TITLE>Variables Estticas</TITLE> </HEAD> <BODY> <?php function verVariable() { for ($i = 1; $i <= 10; $i++) { $a=0; static $b=0; echo "Vuelta: ".$i." Variable a: ".$a." Variable b: ".$b."<br>"; a++; $b++; } } verVariable();

:.C Eperadores
Las variables, como base de informacin de un lenguaje, pueden ser creadas, modificadas y comparadas con otras por medio de los llamados operadores. -n esta seccin se pretende listar los m s importantes.

2.!.1 "peradores aritm#ticos


Nos permiten realizar operaciones num$ricas con nuestras variables + * Programacin en PHP Suma 8esta 5ultiplicacin 16 / 74

/ %

<ivisin <evuelve el resto de la divisin

2.$.2 "peradores de comparacin


Se utilizan principalmente en nuestras condiciones para comparar dos variables y verificar si cumple o no la propiedad del operador. == != < <= > >= (gualdad <iferente 5enor que 5enor igual que 5ayor que 5ayor igual que

2.!.3 "peradores lgicos


Se usan en combinacin con los operadores de comparacin cuando la e#presin de la condicin lo requiere. And Or ! Y O No

2.!.4 "peradores de incremento


Sirven para aumentar o disminuir de una unidad el valor de una variable ++$variable --$variable "umenta en uno el valor de Nvariable 8educe en uno el valor de Nvariable

2.!.% "peradores combinados


0na forma habitual de modificar el valor de las variables es mediante los operadores combinados+ $variable += 10 $variable -= 10 $variable .= "aado" Suma 1D a Nvariable 8esta 1D a Nvariable 6oncatena las cadenas Nvariable y Ja,adoJ

-ste tipo de e#presiones no son m s que abreviaciones de otras formas cl sicas+

Programacin en PHP

17 / 74

$variable += 10;

-s lo mismo que+
$variable = $variable + 10;

:.3 6ontrol de flujo


La programacin e#ige en muchas ocasiones la repeticin de acciones sucesivas o la eleccin de una determinada secuencia y no de otra dependiendo de las condiciones especficas de la ejecucin. 6omo ejemplo, podramos hacer alusin a un programa que ejecute una secuencia diferente en funcin del da de la semana en el que nos encontramos. -ste tipo de acciones pueden ser llevadas a cabo gracias a un conjunto de instrucciones presentes en la mayora de los lenguajes. <escribiremos algunas de ellas propuestas por %&% y que resultan de evidente utilidad.

2.&.1 ondiciones i'


6uando queremos que el programa, llegado a un cierto punto, tome un camino concreto en determinados casos y otro diferente si las condiciones de ejecucin difieren, nos servimos del conjunto de instrucciones if, else y elseif. La estructura de este tipo de instrucciones es la siguiente+
if(condicin) { Instruccin 1; Instruccin 2; ... } else { Instruccin A; Instruccin B; ... }

Llegados a este punto, el programa verificar el cumplimiento o no de la condicin. Si la condicin es cierta las instrucciones 1 y : ser n ejecutadas. <e lo contrario ' else), las instrucciones " y ; ser n llevadas a cabo. -sta estructura puede complicarse un poco m s si tenemos en cuenta que no necesariamente todo es blanco o negro y que muchas posibilidades pueden darse. -s por ello que otras condiciones pueden plantearse dentro de la condicin principal. &ablamos por lo tanto de condiciones anidadas que tendran una estructura del siguiente tipo+
if (condicin1) { Instruccin 1; Instruccin 2; ... } else { if (condicin2){ Instruccin A;

Programacin en PHP

18 / 74

Instruccin B; ... } else { Instruccin X ... } }

<e este modo podramos introducir tantas condiciones como queramos dentro de una condicin principal. <e gran ayuda es la instruccin elseif que permite en una sola lnea introducir una condicin adicional. -ste tipo de instruccin simpifica ligeramente la sinta#is que acabamos de ver+
if (condicin1) { Instruccin 1; Instruccin 2; ... } elseif (condicin2) { Instruccin A; Instruccin B; ... } else { Instruccin X ... }

-l uso de esta herramienta resultar claro con un poco de pr ctica. %ongamos un ejemplo sencillo de utilizacin de condiciones. -l siguiente programa permitira detectar el idioma empleado por el navegador y visualizar un mensaje en dicho idioma.
<HTML> <HEAD> <TITLE>Detector de Idioma</TITLE> </HEAD> <BODY> <? //Antes de nada introducimos mensajes en forma de variables $espanol="Hola"; $ingles="Hello"; $frances="Bonjour"; //Ahora leemos del navegador cul es su idioma oficial $idioma=substr($HTTP_ACCEPT_LANGUAGE,0,2); //Formulamos las posibilidades que se pueden dar if ($idioma == "es") { echo "$espanol"; } elseif ($idioma=="fr") { echo "$frances"; } else { echo "$ingles"; } ?> </BODY> </HTML>

%ara ver el funcionamiento de este programa es necesario cambiar el idioma preferido lo cual puede ser realizado a partir del men! de opciones del navegador.

Programacin en PHP

19 / 74

%ara leer la lengua aceptada por el navegador lo que hacemos es definir una variable '$idioma) y, mediante la funcin substr, recogemos las dos primeras letras del cdigo correspondiente al idioma aceptado por el navegador '$HTTP_ACCEPT_LANGUAGE). La tercera parte del programa se encarga de ver si el navegador est en espa,ol 'es), franc$s 'fr) o en cualquier otro idioma que no sea ninguno de estos dos y de imprimir el mensaje que proceda en cada caso. 6uando se trata de comparar variables, ponemos un doble igual JUUJ en lugar de un simple JUJ. -ste !ltimo queda reservado e#clusivamente para asignar valores a variables.

2.&.2 ondiciones S(itch


"dicionalmente a las condicionales if>elseif>else se desarrollaron las condiciones s4ith>case, este tipo de control de flujo simplifica, la escritura cuando se tiene un conjunto grande de decisiones. La sinta#is del condicional es+
switch( variable_condicin ) { case valor_variable1 : instruccin1; instruccin2; ... break; case valor_variable2 : instruccin1; instruccin2; ... break; case ... }

La funcin s4itch es un condicional que eval!a el valor de la variable y busca dentro del contenido de V W si e#iste una etiqueta case seguida de un n!mero coincidente con el valor de la variable. Si e#iste ese n!mero ejecuta todas las instrucciones e#istentes despu$s de case incluidas las que pudiera haber detr s de otros cases. La sinta#is anterior incluye antes de cada nuevo case la funcin de ruptura breaI con la que se consigue que se ejecuten !nicamente las instrucciones que siguen a cada uno de los case pero evitando que se ejecuten las que van detr s de los case siguientes. 6uando se pretende que se ejecuten unas instrucciones concretas en el caso de que el valor de la variable no coincida con ninguna de las opciones case se puede insertar default+ seguido de esas instrucciones. *odas la instrucciones que siguen a default+ se ejecutar n para cualquier valor de la variable distinto de los indicados en los case que le preceden. -l cdigo del ejercicio de la seccin anterior empleando el condicional s4itch, quedara de la siguiente forma+
<HTML> <HEAD> <TITLE>Detector de Idioma</TITLE> </HEAD> <BODY> <?

Programacin en PHP

20 / 74

// Introducimos mensajes en forma de variables $espanol="Hola"; $ingles="Hello"; $frances="Bonjour"; // Leemos del navegador cul es su idioma oficial // y se imprime. switch( substr($HTTP_ACCEPT_LANGUAGE,0,2) ) { case "es: echo "$espanol"; break; case "fr": echo "$frances"; break; default: echo "$ingles"; break; } ?> </BODY> </HTML>

2.&.3 iclo )hile


Sin duda el ciclo m s utilizado y el m s sencillo. Lo usamos para ejecutar las instrucciones contenidas en su interior siempre y cuando la condicin definida sea verdadera. La estructura sint ctica es la siguiente.
while (condicin) { instruccion1; instruccion2; ... }

0n ejemplo sencillo es este ciclo que aumenta el tama,o de la fuente en una unidad a cada nueva vuelta por el ciclo+
<? $size=1; While ($size<=6) { echo"<font size=$size>Tamao $size</font><br>\n"; $size++; } ?>

%rimero debemos de definir el valor de la variable que vamos a evaluar en la condicin. "lgo absolutamente obvio pero f cil de olvidar. -n este caso le hemos atribuido un valor de 1 que corresponde a la letra m s peque,a. -l paso siguiente es crear el ciclo en el que imponemos la condicin que la variable no e#ceda el valor de T. La instruccin a ejecutar ser imprimir en nuestro documento un cdigo &*5L en el que la etiqueta font y el mensaje que contiene varan a medida que $size cambia su valor. -l siguiente paso es incrementar en una unidad el valor de Nsize. -sto se puede hacer con una e#presin como la mostrada en el ciclo que en realidad es sinnima de+
$size=$size+1

Programacin en PHP

21 / 74

Keremos otras de estas abreviaciones m s adelante.

2.&.4 iclo *o+)hile


-ste tipo de ciclo no difiere en e#ceso del anterior. La sinta#is es la siguiente+
do { instruccion1; instruccion2; ... } while (condicin)

La diferencia con respecto a los ciclos while es que este tipo de ciclo eval!a la condicin al final con lo que, incluso siendo falsa desde el principio, $ste se ejecuta al menos una vez.

2.&.% iclo For


%&% provee de otros tipos de ciclos que tambi$n resultan muy pr cticos en determinadas situaciones. -l m s popular de ellos es el ciclo for que, como para los casos anteriores, se encarga de ejecutar las instrucciones entre llaves. La diferencia con los anteriores radica en cmo se plantea la condicin de finalizacin del ciclo. %ara aclarar su funcionamiento vamos a e#presar el ejemplo de cliclo while visto en la seccin anterior en forma de ciclo for+
<? for ($size=1; $size<=6; $size++) { echo"<font size=$size>Tamao $size</font><br>\n"; } ?>

Las e#presiones dentro del par$ntesis definen respectivamente+ (nicializacin de la variable. Kalida para la primera vuelta del ciclo. 6ondicin de evaluacin a cada vuelta. Si es cierta, el bucle continua. "ccin a realizar al final de cada vuelta de ciclo.

2.&., iclo Foreach


-ste ciclo, implementado en las versiones de %&%/, nos ayuda a recorrer los valores de un arreglo lo cual puede resultar muy !til por ejemplo para efectuar una lectura r pida del mismo. 8ecordamos que un arreglo es una variable que guarda un conjunto de elementos 'valores) catalogados por claves 'llaves). La estructura general es la siguiente+
foreach ($arreglo as $clave=>$valor) { instruccion1; instruccion2; ...; }

Programacin en PHP

22 / 74

0n ejemplo pr ctico es la lectura de un arreglo lo cual podra hacerse del siguiente modo+
<? $moneda=array("Espaa"=> "Peseta","Francia" => "Franco","USA" => "Dolar"); foreach ($moneda as $clave=>$valor) { echo "Pais: $clave Moneda: $valor<br>"; } ?>

-ste programa se encargara de mostrarnos por pantalla el contenido del arreglo $moneda.

2.&.$ -rea. / ontinue


-stas dos instrucciones se introducen dentro de la estructura y nos sirven respectivamente para escapar del ciclo o saltar a la iteracin siguiente. %ueden resultarnos muy pr cticas en algunas situaciones.

:.1D =unciones
5uchas veces, cuando trabajamos en el desarrollo de una aplicacin, nos surge la necesidad de ejecutar un mismo bloque de cdigo en diferentes partes de nuestra aplicacin. 0na =uncin no es m s que un bloque de cdigo al que le pasamos una serie de par metros y nos devuelve un valor. 6omo todos los lenguajes de programacin, %&% trae una gran cantidad de funciones para nuestro uso, pero las funciones m s gran cantidad de funciones para nuestro uso, pero las funciones m s importantes son las que nosotros creamos. %ara declarar una funcin debemos utilizar la instruccin function seguido del nombre que le vamos a dar, y despu$s entre par$ntesis la lista de argumentos separados por comas, aunque tambi$n habr funciones que no recojan ning!n argumento.
function nombre_de_funcion (arg_1, arg_2, ..., arg_n) bloque de cdigo } {

6ualquier instruccin v lida de %&% puede aparecer en el cuerpo 'lo que antes hemos llamado bloque de cdigo) de una funcin, incluso otras funciones y definiciones de clases. -n %&% no podemos redefinir una funcin previamente declarada.

2.10.1 1a instruccin 23T425


6uando invocamos una funcin, la ejecucin del programa pasa a ejecutar las lneas de cdigo que contenga la funcin, y una vez terminado, el programa continua su ejecucin desde el punto en que fue llamada la funcin. -#iste una manera de terminar la ejecucin de la funcin aunque a!n haya cdigo por ejecutar, mediante el uso de la instruccin return terminamos la ejecucin del cdigo de Programacin en PHP 23 / 74

una funcin y devolvemos un valor. %odemos tener varios return en nuestra funcin, pero por lo general, cuantos m s return tengamos menos reutilizable ser nuestra funcin.
<?php function mayor ($x, $y) { if ($x > $y) { return $x." es mayor que".$y; } else { return $y." es mayor que".$x; } } ?>

"unque quedara mejor+


<?php function mayor ($x, $y) { $msg = ""; if ($x > $y) { $msg = $x." es mayor que".$y; } else { $msg = $y." es mayor que".$x; } return $msg; } ?>

6on la instrucin return puede devolverse cualquier tipo de valor, incluyendo tablas y objetos. %&% solo permite a las funciones devolver un valor, y para solventar este peque,o problema, si queremos que nuestra funcin devuelva varios tenemos que utilizar un arreglo.

2.10.2 6armetros de las 'unciones


-#isten dos formas de pasar los par metros a una funcin, por valor o por referencia. 6uando pasamos una variable por valor a una funcin, ocurra lo que ocurra en $sta en nada modificar el contenido de la variable. 5ientras que si lo hacemos por referencia, cualquier cambio acontecido en la funcin sobre la variable lo har para siempre. -n %&%, por defecto, las variables se pasan por valor, en vez de por referencia. %ara hacerlo por referencia debemos anteponer un ampersand 'X) a la variable.
<?php function suma ($x, $y) { $x = $x + 1; return $x+$y; } $a = 1; $b = 2; //parmetros por valor echo suma ($a, $b); // imprimir 4 echo $a; // imprimir 1 //parmetros por referencia echo suma (&$a, $b); // imprimir 4 echo $a; // imprimir 2

Programacin en PHP

24 / 74

?>

Si queremos que un par metro de una funcin se pase siempre por referencia debemos anteponer un ampersand 'X) al nombre del par metro en la definicin de la funcin. -n %&% podemos definir valores por defecto para los par metro de una funcin. -stos valores tienen que ser una e#presin constante, y no una variable o miembro de una clase. "dem s cuando usamos par metros por defectos, $stos deben estar a la derecha de cualquier par metro sin valor por defecto, de otra forma %&% nos devolver un error.
<?php function suma ($x=1, $y) { $x = $x + 1; return $x+$y; } ?>

Si ejecutamos esta funcin nos dara error, ya que hemos dado a N# el valor 1 por defecto y la hemos colocado a la izquierda de un par metro que no tiene valor por defecto. La forma correcta es+
<?php function suma ($y, $x=1) { $x = $x + 1; return $x+$y; } ?>

Las variables est ticas 'static) se definen dentro de una funcin, la primera vez que es llamada dicha funcin la variable se inicializa, guardando su valor para posteriores llamadas.
<?php function contador () { static $count = 0; $count = $count + 1; return $count; } echo contador()."<BR>"; // imprimir 1 echo contador()."<BR>"; // imprimir 2 echo contador()."<BR>"; // imprimir 3 ?>

Las variables globales, no se pueden declarar dentro de una funcin, lo que hacemos el llamar a una variable que ya ha sido declarada, tomando el valor que tenga en ese momento, pudiendo ser modificado en la funcin.
<?php var $a = 1; function ver_a() { global $a; echo $a."<BR>"; // imprimir el valor de $a $a += 1; // sumamos 1 a $a } echo ver_a(); // imprimir 1 echo ver_a(); // imprimir 2 $a = 7;

Programacin en PHP

25 / 74

echo ver_a(); // imprimir 7 echo ver_a(); // imprimir 8 ?>

2.10.3 Funciones 7ariable


%&% soporta el concepto de funciones variables, esto es significa que si una variable tiene unos par$ntesis a,adidos al final, %&% buscar una funcin con el mismo nombre que el contenido 'valor) de la variable, e intentar ejecutarla.
<?php function imprime($texto) { echo $texto . "\n"; } function imprimeNegrilla($texto) { echo "<B>$texto</B>\n"; } $MiFunc = "imprime"; $MiFunc("Hola"); //imprimir Hola $MiFunc = "imprimeNegrilla"; $MiFunc("Hola"); //imprimir Hola ?>

2.10.4 2ecursin
%&% tambi$n permite la recursin, es decir, una funcin se puede llamar as misma. %ara aclarar el concepto de recursin, vamos a crear una funcin que comprueba si un n!mero es entero o no. 0n n!mero que no sea entero '?./), tiene una parte entera y otra decimal 'comprendida entre D y 1), lo que vamos a hacer para comprobar si un n!mero es entero o no, ser restarle 1 al n!mero en cuestin hasta que nos quedemos sin parte entera, y entonces comprobaremos si tiene parte decimal.
<?php function esEntero($numero) { if ($numero > 1) { return (esEntero($numero -1)); } elseif ($numero < 0) { /* como los nm. son simtricos chequeamos lo convertimos a positvo */ return (esEntero((-1) * $numero -1)); } elseif (($numero > 0) AND ($numero < 1)) { return ("NO"); } else { /* el cero es entero por definicin */ return ("SI"); } } //fin function echo echo echo echo ?> "Es 0 un nmero entero? ".esEntero(0)."\n"; "Es 3.5 un nmero entero? ".esEntero(3.5)."\n"; "Es -7 un nmero entero? ".esEntero(-7)."\n"; "Es -9.2 un nmero entero? ".esEntero(9.2)."\n";

Programacin en PHP

26 / 74

Captulo %: Cadenas & $'presiones (egulares


Objetivo: -l alumnos conocer las funciones m s comunes para el manejo de cadenas y aprender la sinta#is b sica de las e#presiones regulares. "l final realizar un ejercicio integrador guiado empleando e#presiones regulares.

..1 =unciones para 6adenas


" continuacin se describe un resumen de las funciones mas importantes de %&% para manejo de cadenas.

3.1.1 8a/9sculas / min9sculas:


string=strtoupper(string); string=strtolower(string); string=ucfirst(string); string=ucwords(string); de una lnea). %asa una cadena a may!sculas. %asa una cadena a min!sculas. %asa a may!scula el primer car cter de una cadena. %asa a may!sculas el primer car cter de cada palabra cadena 'separadas por blancos, tabulaciones y saltos de

3.1.2 Trimming:
string=chop(string); cadena. string=ltrim(string); cadena. string=trim(string); -limina blancos y saltos de lnea a la derecha de una -limina blancos y saltos de lnea a la izquierda de una -limina blancos y saltos de lnea a derecha e izquierda.

3.1.3 omparaciones:
int=strpos(string1,string2); <evuelve la posicin de la primera ocurrencia de string2 dentro de string1. int=strspn(string1,string2); <evuelve la longitud en caracteres de s1 contando desde el principio hasta que aparece un caracter en string1 que no esta en string2. int=strcmp(string1,string2);

Programacin en PHP

27 / 74

6ompara dos cadenas y devuelve 1, D o Y1 seg!n sea mayor el primero, iguales o el segundo. int=strcasecmp(string1,string2); (dem anterior pero caseAinsesitive 'no distingue may!sculas y min!sculas) int=strcspn(string1,string2); <evuelve la longitud de string1 desde el principio hasta que aparece un caracter que pertenece a string2. int=strstr(string1,string2); <evuelve todos los caracteres de string1 desde la primera ocurrencia de string2 hasta el final. int=stristr(string1,string2); (dem anterior pero caseAinsensitive 'no distingue may!sculas de min!sculas) int=similar_text(string1,string2,referencia); "naliza la semejanza entre dos cadenas, devuelve la cantidad de caracteres iguales en las dos cadenas, si se pasa como tercer par metro una referencia a una variable devuelve en la misma el porcentaje de similitud entre ambas cadenas de acuerdo al algoritmo de Eliver '133.). -jemplo+
similar_text($string1,$string2,&$porcentaje);

..: =unciones de %arsing


array=explode(separator,string); <evuelve un arreglo donde cada elemento es una subcadena de la cadena original particionada de acuerdo a un caracter separador 'delimitador). -jemplo+
$st=hola,mundo,como,estan $vec=explode(,,$st); //$vec=(hola,mundo,como,estan);

string=implode(separator,array); 7enera un cadena concatenando todos los elementos del arreglo pasado e intercalando separator entre ellos. string=chunk_split(string,n,end); end es opcional y por default es P \r\nQ, devuelve una cadena donde cada PnQ caracteres de la cadena original se intercala el separador PendQ. -jemplo+
$st=hola mundo; $st2=chunk_split($st,2,,); //$st2=ho,la, m,un,do;

array=count_chars(string); <evuelve un arreglo de :BT posiciones donde cada posicin del arreglo indica la cantidad de veces que el caracter de dicho orden aparece en el arreglo. string=nl2br(string); Programacin en PHP 28 / 74

<evuelve un cadena en donde todos los saltos de lnea se han reemplazado por la bandera <BR> de &*5L. string=strip_tags(string,string_tags_validos); <evuelve una cadena eliminando de la cadena original todas las banderas &*5L, si se pasa el segundo par metro opcional es posible especificar que banderas no deben eliminarse 'solo hace falta pasar las banderas de apertura) -jemplo+
$string2=strip_tags($string1,<br> <table>);

-limina todos las banderas &*5L de $string1 e#cepto <br> , <table> y </table> string=strtok(separador,string); <ado un separador obtiene el primer PtoIenQ de una cadena, sucesivas llamadas a strtoI pasando solamente el separador devuelven los toIens en forma sucesiva o bien falso cuando ya no hay mas toIens. -jemplo+
$tok=strtok($st,/); while($tok) { //Hacer algo $tok=strtok(/); }

parse_string(string); <ada una cadena de la forma Pnombre=valor&nombre2=valor2&nombreN=valorNQ, asigna las variables correspondientes con los valores indicados. -jemplo+
parse_string(v1=hola&v2=mundo); //asigna $v1=hola y $v2=mundo

Codificacin y decodificacin ASCII. char=chr(int); <evuelve el caracter dado su n!mero ascii. int=ord(char); <ado un caracter devuelve su cdigo "scii.

... Subcadenas
string=substr(string,offset,longitud); <evuelve la subcadena correspondiente a la cadena pasada desde la posicin indicada por offset y de la longitud indicada como tercer par metro, si no se pasa el tercer par metro se toman todos los caracteres hasta el final de la cadena. string=substr_replace(string,string_reemplazo,offset, longitud); (dem anterior pero la subcadena seleccionada es reemplazada por string_reemplazo, si string_reemplazo es PQ entonces sirve para eliminar una porcin de una cadena.

Programacin en PHP

29 / 74

../ ;!squedas y 8eemplazos


str_replace(string1,string2,string3); 8eemplaza todas las ocurrencias de string1 en string3 por string2. -sta funcin no admite e#presiones regulares como par metros. string=strtr(string1,string_from,string_to); 8eemplaza en string1 los caracteres en string_from por su equivalente en string_to 'se supone que string_from y string_to son de la misma longitud, si no lo son los caracteres que sobran en la cadena mas larga se ignoran) -jemplo+
$st=hola mundo strtr($st,aeiou,12345); //$st=h4la m5nd4

array=split(pattern,string); (dem a e#plode pero el separador puede ser ahora una e#presin regular. boolean=ereg(pattern,string,regs); <evuelve true o false seg!n si la cadena empata o no una e#presin regular dada, el tercer par metro es opcional y debe ser el nombre de un arreglo en donde se devolver n los empates de cada par$ntesis de la e#presin regular si es que la misma tiene par$ntesis. boolean=eregi(pattern,string,regs); (dem anterior pero caseAinsensitive. ereg_replace(pattern_from,string_to,string); 8eemplaza todas las ocurrencias de una e#presin regular en string por el contenido de string_to. eregi_replace(pattern_from,string_to,string); (dem anterior pero no considera may!sculas y min!sculas para la b!squeda de la e#presin regular.

..B Sinta#is b sica de una e#presin regular


Los smbolos especiales P^Q y P$Q se usan para empatar el principio y el final de una cadena respectivamente. %or ejemplo+ ^el fin$ ^abc$ abc etc... -mpata cadenas que empiezan con PelQ -mpata cadenas que terminan en Pcolorin coloradoQ 6adenas que empieza y termina en abc, es decir solo empata PabcQ 0na cadena que contiene PabcQ por ejemplo PabcQ ,QgfabcQ, PalgoabcfgehQ,

Los smbolos P*Q , P+Q y P?Q denotan la cantidad de veces que un caracter o una secuencia de caracteres puede ocurrir. G denotan D o m s, una o m s y cero o una ocurrencias respectivamente. %or ejemplo+

Programacin en PHP

30 / 74

ab* ab+ ab? de 1. a?b+$

-mpata cadenas que contienen una PaQ seguida de cero o mas PbQ -j+ PaQ, PabQ, PcabbbbQ, etc -mpata cadenas que contienen una PaQ seguida de una o mas PbQ -mpata cadenas que contienen una PaQ seguida o no de una PbQ pero no m s -mpata PaQ seguida de una o mas PbQ terminando la cadena.

%ara indicar rangos de ocurrencias distintas pueden especificarse la cantidad m #ima y mnima de ocurrencias usando llaves de la forma Vmin,ma#W ab{2} ab{2,} ab{3,5} 0na PaQ seguida de e#actamente : PbQ 0na PaQ seguida de : o mas PbQ 0na PaQ seguida de . a B PbQ 'PabbbQ, PabbbbQ, QabbbbbQ)

-s obligatorio especificar el primer n!mero del rango pero no el segundo. <e esta forma + equivale a {1,}. * equivale a {0,} y ? equivale a {0,1} %ara cuantificar una secuencia de caracteres basta con ponerla entre par$ntesis. a(bc)* -mpata una PaQ seguida de cero o mas ocurrencias de PbcQ ej+ PabcbcbcQ

-l smbolo P|Q funciona como operador PorQ hola|Hola -mpata cadenas que contienen PholaQ u P&olaQ (b|cd)ef 6adena que contienen PbefQ o PcdefQ (a|b)*c Secuencias de PaQ o PbQ y que termina en PcQ -l car cter P.Q empata a cualquier otro caracter. a.[0-9] ^.{3}$ -mpata PaQ seguido de cualquier caracter y un dgito. 6ualquier cadena de e#actamente . caracteres.

Los corchetes se usan para indicar que caracteres son validos en una posicin !nica de la cadena. [ab] [a-d] ^[a-zA-Z] [0-9]% -mpata cadenas que contienen PaQ o PbQ -mpata cadenas que contienen PaQ, PbQ , PcQ o PdQ 6adena que comienzan con una letra. 0n dgito seguido de un signo Z

*ambi$n puede usarse una lista de caracteres que no se desean agregando el smbolo P ^Q dentro de los corchetes, no confundir con P[Q afuera de los corchetes que empata el principio de lnea. [^abg] [^0-9] 6adena que NE contienen PaQ , PbQ o PgQ 6adena que no contienen dgitos

Los caracteres P^.[$()|*+?{\Q deben escaparse si forman parte de lo que se quiere buscar con una diagonal invertida adelante. -sto no es v lido dentro de los corchetes donde todos los caracteres no tienen significado especial.

Programacin en PHP

31 / 74

..T -jercicio (ntegrador


Nota+ " partir de este captulo se inician con -jercicios (ntegradores. Los ejercicios integradores e#igen que se haya comprendido a la perfeccin el captulo en estudio. %or ser este el primer ejercicio integrador, va a ser un ejercicio guiado, los ejercicios a partir del siguiente captulo solo contendr n las instrucciones para llevarlo a cabo. Kalidar una suma monetaria en formato+ P1DDDD.DDQ, P1D,DDD.DDQ, P1DDDDQ o P1D,DDDQ es decir con o sin centavos y con o sin una coma separando tres dgitos.
^[1-9][0-9]*$

-sto valida cualquier n!mero que no empieza con cero, lo malo es que PDQ no pasa la prueba. -ntonces+
^(0|[1-9][0-9]*)$

0n cero o cualquier n!mero que no empieza con cero. "ceptemos tambi$n un posible signo menos delante.
^(0|-?[1-9][0-9]*)$

E sea cero o cualquier n!mero con un posible signo PAP delante. -n realidad podemos admitir que un n!mero empiece con cero para una cantidad monetaria y supongamos que el signo PAP no tiene sentido, agreguemos la posibilidad de decimales+
^[0-9]+(\.[0-9]+)?$

Si viene un P.Q debe estar seguido de un dgito, 1D es v lido pero P1D.Q no. -specifiquemos uno o dos dgitos decimales+
^[0-9]+(\.[0-9]{1,2})?$

"hora tenemos que agregar las comas para separar por miles.
^[0-9]{1,3}(,[0-9]{3})*(\.[0-9]{1,2})?$

E sea un conjunto de 1 a . dgitos seguido de uno m s conjuntos de P,Q seguido de tres dgitos. "hora hagamos que la coma sea opcional.
^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(\.[0-9]{1,2})?$

G de esta forma podemos validar n!meros con los / formatos validos en una sola e#presin.

Programacin en PHP

32 / 74

Captulo ): "ormularios
Objetivo: -l alumno aprender sobre la creacin de formularios y el paso de variables del navegador al programa. "l terminar el captulo el alumno desarrollar un peque,o sistema para calcular la amortizacin basado en formularios.

/.1 Pasar variables por URL


Los ciclos y condiciones son muy !tiles para procesar los datos dentro de un mismo programa. Sin embargo, en una aplicacin 2eb, las p ginas vistas y los programas utilizados son numerosos. 5uy a menudo necesitamos que nuestros distintos programas est$n conectados unos con otros y que se sirvan de variables comunes. %or otro lado, el usuario interacciona por medio de formularios cuyos campos han de ser procesados para poder dar una respuesta. *odo este tipo de factores din micos han de ser eficazmente regulados por un lenguaje como %&%. 6omo se habr notado en los ejercicios realizado las variables de un programa tienen validez e#clusiva para el programa y resulta imposible conservar su valor cuando ejecutamos otro archivo distinto aunque ambos est$n enlazados. -#isten varias formas de enviar las variables de una p gina a otra de manera que la p gina destino reconozca el valor asignado por el programa de origen. %ara pasar las variables de una p gina se puede realizar introduciendo dicha variable dentro del enlace de hiperte#to de la p gina destino. La sinta#is sera la siguiente+
<a href="destino.php?variable1=valor1&variable2=valor2&...">Mi enlace</a>

-s importante notar que estas variables no poseen el smbolo N delante. -sto es debido a que en realidad este modo de pasar variables no es especfico de %&% sino que es utilizado por otros lenguajes. " este m$todo se le denomina 7-*. "hora nuestra variable pertenece tambi$n al entorno de la p gina destino.php y est lista para su e#plotacin. %ara aclarar posibles dudas, veamos esto en forma de ejemplo. *endremos pues dos p ginas, origen.html 'no es necesario darle e#tensin %&% puesto que no hay ning!n tipo de cdigo) y destino.php+
<HTML> <HEAD> <TITLE>origen.html</TITLE> </HEAD> <BODY> <a href="destino.php?saludo=hola&texto=Esto es una variable texto">
Paso variables saludo y texto a la pgina destino.php</a> </BODY> </HTML>

<HTML>

Programacin en PHP

33 / 74

<HEAD> <TITLE>destino.php</TITLE> </HEAD> <BODY> <? echo "Variable \$saludo: $saludo <br>\n"; echo "Variable \$texto: $texto <br>\n" ?> </BODY> </HTML>

8ecordamos que es posible recopilar en una variable tipo arreglo el conjunto de variables que han sido enviadas al programa por este m$todo a partir de la variable de sistema N&**%O7-*OK"8S, que es un arreglo asociativo. 0tiliz ndolo quedara as+
<? echo "Variable \$saludo: $HTTP_GET_VARS["saludo"] <br>\n"; echo "Variable \$texto: $HTTP_GET_VARS["texto"] <br>\n" ?>

/.: Procesar variables de formularios


-ste tipo de transferencia es de gran utilidad ya que nos permite interaccionar directamente con el usuario. -l proceso es similar al e#plicado para los 08Ls. %rimeramente, presentamos una primera p gina con el formulario cl sico a llenar y las variables son recogidas en una segunda p gina que las procesa+
<HTML> <HEAD> <TITLE>formulario.html</TITLE> </HEAD> <BODY> <FORM METHOD="POST" ACTION="destino2.php"> Nombre: <INPUT TYPE="TEXT" NAME="nombre"><br> Apellidos: <INPUT TYPE="TEXT" NAME="apellidos"><br> <INPUT TYPE="SUBMIT"> </FORM> </BODY> </HTML>

<HTML> <HEAD> <TITLE>destino2.php</TITLE> </HEAD> <BODY> <? echo "Variable \$nombre: $nombre <br>\n"; echo "Variable \$apellidos: $apellidos <br>\n" ?> </BODY> </HTML>

8ecordamos que es posible recopilar en una variable tipo arreglo el conjunto de variables que han sido enviadas al programa por este m$todo a partir de la variable de sistema N&**%O%ES*OK"8S.

Programacin en PHP

34 / 74

/.. -jercicio (ntegrador


<ise,e un peque,o sistema de amortizacin basado en saldos insolutos. -l sistema debe preguntar al arrancar el 5onto a amortizar, la tasa mensual en porcentaje, y el periodo en meses. <ebajo del formulario debe aparecer la tabla de amortizacin con las siguientes columnas+ 5es, Saldo (nicial, "bono 5ensual, "bono a 6apital, "bono a (ntereses, Saldo =inal. -l Saldo (nicial es igual al Saldo =inal del mes anterior. 6uando sea la primera vez que se ejecute el programa, no debe de mostrar la tabla, solamente debe mostrar la parte del formulario. %ara la realizacin del sistema utilice las siguientes formulas+ Saldo Inicial(0) = Monto Saldo Inicial(n) = Saldo Final(n-1) Monto * Tasa Pago Mensual = ---------------1-(1+Tasa)^(-n) Abono a Capital = Abono Mensual Abono a Intereses Intereses = Saldo Inicial * Tasa -l %ago 5ensual es constante y el saldo final en el !ltimo mes debe dar cero. 8ecuerde que los valores num$ricos deben estar alineados a la derecha y en formato con comas. %ara dar formato a un n!mero con comas en miles utilice la funcin numberOformat').

Programacin en PHP

35 / 74

Programacin en PHP

36 / 74

Captulo *: Persistencia
Objetivo: -n este captulo el alumno aprender como conservar las caractersticas o sesin de trabajo del usuario a trav$s de varias p ginas. "l finalizar el alumno ser capaz de programar un carrito de compras b sico.

B.1 Utilizacin de las cookies


Sin duda este t$rmino resultara familiar para muchos. "lgunos lo habr n ledo u odo pero no saben de qu$ se trata. Etros sin embargo sabr n que las cooIies son fragmentos de informacin almacenado por un sitio 2eb en el disco duro del usuario. -sta informacin es almacenada en un archivo tipo te#to que se guarda cuando el navegador accede al sitio 4eb. -s posible ver estos archivos. %ara abrirlos hay que ir al directorio 6+\2indo4s\6ooIies para los usuarios de (- /] o a 6+\...\Netscape\0sers\defaultuser para usuarios de Netscape. -n la mayora de los casos la informacin que se puede obtener es indescifrable. La utilidad principal de las cooIies es la de poder identificar al navegador una vez $ste visita el sitio por segunda vez y as, en funcin del perfil del cliente dado en su primera visita, el sitio puede adaptarse din micamente a sus preferencias 'idioma, colores de pantalla, formularios rellenados total o parcialmente, redireccin a determinadas p ginas, entre otros). %ara crear un archivo cooIies, modificar o generar una nueva cooIie lo podemos hacer a partir de la funcin Set6ooIie+
SetCookie("nombre_de_la_cookie",valor,expiracion);

Keamos un ejemplo sencillo. (maginemos que queremos introducir en una variable cooIie el nombre del visitante. -l nombre ha podido ser previamente recogido por un formulario+
SetCookie("persona",$nombre,time()+86400*365);

<e este modo hemos creado una cooIie llamada persona que tiene como valor el contenido de la variable Nnombre y tendr una duracin de 1 a,o a partir de su creacin 'el tiempo time') actual en segundos sumado a un a,o en segundos). -s importante que la creacin de la cooIie sea previa a la apertura del documento &*5L. -n otras palabras, las instrucciones Set6ooIie deben ser colocadas antes de la etiqueta &*5L. %or otra parte, es interesante se,alar que el hecho de que definir una cooIie ya e#istente implica el borrado de la antigua. <el mismo modo, el crear una primera cooIie conlleva la generacin autom tica del archivo te#to. %ara utilizar el valor de la cooIie en nuestros programas tan slo tendremos que llamar la

Programacin en PHP

37 / 74

variable que define la cooIie. &ay que tener cuidado sin embargo de no definir variables en nuestro programa con el mismo nombre que las cooIies puesto que %&% privilegiar el contenido de la variable local con respecto a la cooIie y nos dar un mensaje de error. -s posible recopilar en una variable tipo arreglo el conjunto de cooIies almacenadas en el disco duro del usuario mediante la variable de servidor $HTTP_COOKIES_VARS. Las cooIies son una herramienta para personalizar nuestra p gina pero hay que ser cautos ya que, por una parte, no todos los navegadores las aceptan y por otra, se puede deliberadamente impedir al navegador la creacin de cooIies. -s por ello que resultan un complemento y no una fuente de variables infalible para nuestro sitio.

B.: Sesiones
-n los programas que hemos visto hasta ahora, hemos utilizado variables que slo e#istan en el archivo que era ejecutado. 6uando carg bamos otra p gina, los valores de estas variables se perdan a menos que nos tom semos la molestia de pasarlos por el 08L o inscribirlos en las cooIies o en un formulario para su posterior e#plotacin. -stos m$todos, aunque !tiles, no son todo lo pr cticos que podran en determinados casos en los que la variable que queremos conservar ha de ser utilizada en programas diferentes. %odramos pensar que ese problema puede quedar resuelto con las cooIies ya que se trata de variables que pueden ser invocadas en cualquier momento. -l problema es que las cooIies no son aceptadas ni por la totalidad de los usuarios ni por la totalidad de los navegadores lo cual implica que una aplicacin que se sirviera de las cooIies para pasar variables de un archivo a otro no sera 1DDZ infalible. -s importante a veces pensar en Jla inmensa minoraJ, sobre todo en aplicaciones de comercio electrnico donde debemos captar la mayor cantidad de clientes posibles y nuestros programas deben estar preparados ante cualquier eventual deficiencia del navegador del cliente. Nos resulta pues necesario el poder declarar ciertas variables que puedan ser reutilizadas tantas veces como queramos dentro de una misma sesin. (maginemos un sitio multiling^e en el que cada vez que queremos imprimir un mensaje en cualquier p gina necesitamos saber en qu$ idioma debe hacerse. %odramos introducir un programa identificador del idioma del navegador en cada uno de los archivos o bien declarar una variable que fuese valida para toda la sesin y que tuviese como valor el idioma reconocido en un primer momento. %ensemos tambi$n en un carrito de compras de una tienda virtual donde el cliente va navegando por las p ginas del sitio y a,adiendo los artculos que quiere comprar a un carrito. -ste carrito podra ser perfectamente una variable de tipo arreglo que almacena para cada referencia la cantidad de artculos contenidos en el carrito. -sta variable debera ser obviamente conservada continuamente a lo largo de todos los programas. -ste tipo de situaciones son solventadas a partir de las variables de sesin. 0na sesin es considerada como el intervalo de tiempo empleado por un usuario en recorrer nuestras p ginas hasta que abandona nuestro sitio o deja de actuar sobre $l durante un tiempo prolongado o bien, sencillamente, cierra el navegador. %&% nos permite almacenar variables llamadas de sesin que, una vez definidas, podr n ser utilizadas durante este lapso de tiempo por cualquiera de los programas de nuestro

Programacin en PHP

38 / 74

sitio. -stas variables ser n especficas del usuario de modo que varias variables de sesin del mismo tipo con distintos valores pueden estar coe#istiendo para cada una de las sesiones que est n teniendo lugar simult neamente. -stas sesiones tienen adem s su propio identificador de sesin que ser !nico y especfico 'S(<). &emos dicho que la variables de sesin se diferencian de las variables cl sicas en que $stas residen en el servidor, son especificas de un solo usuario definido por un identificador y pueden ser utilizadas en la globalidad de nuestras p ginas. %ara iniciar una sesin podemos hacerlo de dos formas distintas+ a) <eclaramos abiertamente la apertura de sesin por medio de la funcin session_start(). -sta funcin crea una nueva sesin para un nuevo visitante o bien recupera la que est siendo llevada a cabo. b) <eclaramos una variable de sesin por medio de la funcin session_register( !ariable ). -sta funcin, adem s de crear o recuperar la sesin para la p gina en la que se incluye tambi$n sirve para introducir una nueva variable de tipo sesin. Las sesiones han de ser iniciadas al principio de nuestro programa. "ntes de abrir cualquier etiqueta o de imprimir cualquier cosa. -n caso contrario recibiremos un error. 6on lo visto, vamos a proponer el ejemplo cl sico de utilizacin de una sesin+ un contador. -ste contador deber aumentar de una unidad cada vez que recargamos la p gina o apretamos al enlace+
<? session_start(); session_register('contador'); ?> <HTML> <HEAD> <TITLE>contador.php</TITLE> </HEAD> <BODY> <? if(isset($contador)==0) $contador=0; ++$contador; echo "<a href=\"contador.php\">Has recargado esta pgina $contador veces</a>"; ?> </BODY> </HTML>

La condicin if tiene en cuenta la posibilidad de que la variable $contador no haya sido todava inicializada. La funcin isset se encarga de dar un valor cero cuando una variable no ha sido inicializada. Etras funciones !tiles para la gestin de sesiones son+ "uncin Session_id() Session_destroy() Session_unregister('var') !escripcin Nos devuelve el identificador de la sesin <a por abandonada la sesin eliminando variables e identificador. "bandona una variable sesin

Programacin en PHP

39 / 74

B.. -jercicio (ntegrador


<esarrolle un carrito de compras b sico empleando sesiones. %ara ello debe guardar la lista de los productos en un arreglo la cual debe mostrarse en el navegador del usuario. 6ree un conjunto de arreglos donde almacene la clave del producto, el nombre, el precio y una breve descripcin. "dicionalmente debe llevar un arreglo donde se van almacenando las claves de los productos que el usuario agreg al carrito de compras, esta variable debe ser almacenada en la sesin. La pantalla del usuario debe contener tres secciones o columnas, la primera con la lista de los productos y una liga por cada producto para consultar sus detalles 'clave, nombre, descripcin, y precio). Los detalles deben aparecer en la seccin central. -n la parte inferior de los detalles del producto colocar un botn o liga donde el usuario pueda agregar el producto a su carrito de compras. -n la tercera columna liste los productos que el usuario agrego a su carrito de compras, el precio de cada producto y un botn o liga para quitarlo del carrito. %or el momento el sistema no preguntar la cantidad de producto a agregar al carrito ni tampoco realizar el checIAout del carrito. No olvide agregar un botn para terminar la sesin.

Programacin en PHP

40 / 74

Captulo +: ,ases de !atos -&./L


Objetivo: -n este captulo el alumno conocer la interaccin b sica con bases de datos. "s mismo aprender los detalles de la programacin con 5ySRL como bacIend de base de datos. "l terminar el alumno modificar el carrito de compras y lo adaptar para utilizar bases de datos.

T.1 6onectar a 5ySRL desde %&%


0na vez que tengamos el servidor de base datos trabajando y con datos utilizamos el siguiente programa para conectarnos y obtener los datos de un registro.
<html> <body> <?php $link = mysql_connect("localhost", "nobody"); mysql_select_db("mydb", $link); $result = mysql_query("SELECT * FROM agenda", $link); echo "Nombre: ".mysql_result($result, 0, "nombre")."<br>"; echo "Direccin: ".mysql_result($result, 0, "direccion")."<br>"; echo "Telfono :".mysql_result($result, 0, "telefono")."<br>"; echo "E-Mail :".mysql_result($result, 0, "email")."<br>"; ?> </body> </html>

-n la primera lnea del programa la funcin mysqlOconnect'), abre una cone#in con el servidor 5ySRL en el &ost especificado 'en este caso la misma m quina en la que est alojada el servidor 5ySRL, localhost). *ambi$n debemos especificar un usuario y si fuera necesario un pass4ord. Si la cone#in ha tenido $#ito, la funcin mysqlOconnect') devuelve un identificar de dicha cone#in que es almacenado en la variable NlinI, sino ha tenido $#ito, devuelve D '="LS-). 6on mysqlOselectOdb') %&% le dice al servidor que en la cone#in NlinI nos queremos conectar a la base de datos mydb. Se pueden establecer distintas cone#iones en diferentes servidores. La siguiente funcin mysqlOquery') usando el identificador de la cone#in 'NlinI), enva una instruccin SRL al servidor 5ySRL para que $ste la procese. -l resultado de $sta operacin es almacenado en la variable Nresult. =inalmente, mysqlOresult') es usado para mostrar los valores de los campos devueltos por la consulta 'Nresult). -n este ejemplo mostramos los valores del registro D, que es el primer registro y mostramos el valor de los campos especificados.

T.: 6reacin de una ;ase de <atos en 5ySRL


"ntes de seguir con %&%, vamos a preparar la base de datos que vamos a utilizar como Programacin en PHP 41 / 74

ejemplo. 6omo servidor de base de datos, usaremos 5ySRL un peque,o y compacto servidor, ideal para peque,as y medianas aplicaciones. 5ySRL soporta el est ndar SRL '"NS(), y adem s est disponible para distintas plataformas. 0na vez instalado 5ySRL, vamos a crear nuestra base de datos ejemplo. 5ySRL utiliza una tabla de permisos de usuarios, por defecto, en la instalacin crea el usuario root sin pass4ord. <ebemos crear distintos usuarios con distintos permisos. -ntre ellos, el usuario administrador de 5ySRL, con todos los permisos, y como recomendacin de seguridad, el usuario nobody slo con el permiso de consultar 'S-L-6*), que es el que utilizaremos para conectarnos al servidor de base de datos en nuestros programas. Keremos dos formas de crear una base de datos y sus tablas. %ara ello vamos a crear la base de datos que nos servir de ejemplo en secciones siguientes+

,.2.1 1;nea de comandos


%ara crear nuestra base de datos en sistemas Linu#>0ni#, debemos ser el administrador de 5ySRL o tener el permiso pertinente para crear bases de datos, para ello haremos lo siguiente+
mysqladmin create mydb

Ga hemos creado una base de datos, ahora le a,adiremos una tabla y algunos registros, para lo cual hay que copiar el siguiente te#to y guardarlo en un archivo 'ej. mydb.dump).
CREATE TABLE agenda (id INT NOT NULL AUTO_INCREMENT, nombre CHAR(50), direccion CHAR(100), telefono CHAR(15), email CHAR(50), KEY (id) )\g INSERT INTO agenda VALUES (0, 'Juan Prez', 'C/ Rayo 15', '455.5555', 'juan@agenda.com' )\g INSERT INTO agenda VALUES (1, 'Luis Garca', 'C/ Ramirez Calderon, '255.6633', 'luis@agenda.com' )\g INSERT INTO agenda VALUES (2, 'Carlos Rodrguez', 'C/ Torres', '613.2277', 'carlos@agenda.com' )\g

&ay que tener en cuenta que los comandos de arriba debe escribirse cada uno en una sola lnea. Se han separado para aumentar la legibilidad del cdigo. "hora desde la lnea de comandos ejecutamos+
cat mydb.dump | mysql mydb

6abe destacar el campo id, que no puede estar vaco, y adem s es autoincrementable, lo cu l deberemos tener en cuenta a la hora de actualizar y a,adir registros. Si no hemos cometido ning!n error, ya tenemos nuestra base de datos de ejemplo en el servidor 5ySRL.

,.2.2 6rograma
Programacin en PHP 42 / 74

0na segunda forma de crear las bases de datos y tablas es utilizar las funciones que para ello nos da %&%. %ara crear una base de datos tenemos dos opciones, una utilizar la funcin mysqlOcreateOdb'), o bien enviado una consulta SRL con la instruccin J68-"*<"*";"S- mydbJ. 6omo ejemplo vamos a crear un programa crearOmy.php que crear la anterior base de datos.
<html> <body> <?PHP define ("CONSTANTE", "Hola Mundo"); printf (CONSTANTE); ?> </body> </html> $basedatos = "mydb"; //conectamos con el servidor $link = @mysql_connect("localhost", "root", ""); // Comprobamos que hemos establecido conexin en el servidor if( ! $link ) { echo "<h2 align='center'>ERROR: Imposible establecer conexin</h2>"; exit; } // obtenemos una lista de las bases de datos del servidor $db = mysql_list_dbs(); // vemos cuantas BD hay $num_bd = mysql_num_rows($db); //comprobamos si la BD que queremos crear ya existe $existe = "NO" ; for( $i=0; $i<$num_bd; $i++ ) { if( mysql_dbname($db, $i) == $basedatos ) { $existe = "SI" ; break; } } // si no existe la creamos if( $existe == "NO" ) { /* manera 1 */ if( ! mysql_create_db($basedatos, $link) ) { echo "<h2 align='center'>ERROR: Imposible crear base de datos</h2>"; exit; } /* manera 2 if( ! mysql_query("CREATE DATABASE $basedatos", $link) ) { echo "<h2 align='center'>ERROR: Imposible crear base de datos</h2>"; exit; } */ } // creamos la tabla $sql = "CREATE TABLE agenda (";

Programacin en PHP

43 / 74

$sql $sql $sql $sql $sql $sql

.= .= .= .= .= .=

"id INT NOT NULL AUTO_INCREMENT, "; "nombre CHAR(50), "; "direccion CHAR(100), "; "telefono CHAR(15), "; "email CHAR(50), "; "KEY (id) ) ";

if( @mysql_db_query($basedatos, $sql, $link) ) { echo "<h2 align='center'>La tabla se ha creado con xito</h2>"; } else { echo "<h2 align='center'>No se ha podido crear la tabla</h2>"; } ?> </body> </html>

T.. 5ostrar los datos de una consulta


"hora que ya sabemos conectar con el servidor de base de datos, veremos como mostrar los datos por pantalla.
<html> <body> <?php $link = mysql_connect("localhost", "nobody"); mysql_select_db("mydb", $link); $result = mysql_query("SELECT nombre, email FROM agenda", $link); echo "<table border = '1'> \n"; echo "<tr> \n"; echo "<td><b>Nombre</b></td> \n"; echo "<td><b>E-Mail</b></td> \n"; echo "</tr> \n"; while( $row = mysql_fetch_row($result) ) { echo "<tr> \n"; echo "<td>$row[0]</td> \n"; echo "<td>$row[1]</td> \n"; echo "</tr> \n"; } echo "</table> \n"; ?> </body> </html>

-n esta ocasin 4hile') eval!a la funcin mysqlOfetchOro4'), que devuelve un arreglo con el contenido del registro actual 'que se almacena en Nro4) y avanza una posicin en la lista de registros devueltos en la consulta SRL. La funcin mysqlOfetchOro4') tiene un peque,o problema, es que el arreglo que devuelve slo admite referencias num$ricas a los campos obtenidos de la consulta. -l primer campo referenciado es el D, el segundo el 1 y as sucesivamente. -n el siguiente programa solucionaremos este peque,o inconveniente.
<html> <body> <?php $link = mysql_connect("localhost", "nobody&ost", "nobody"); mysql_select_db("mydb", $link); $result = mysql_query("SELECT nombre, email FROM agenda", $link); if ($row = mysql_fetch_array($result)){

Programacin en PHP

44 / 74

echo "<table border = '1'> \n"; echo "<tr> \n"; echo "<td><b>Nombre</b></td> \n"; echo "<td><b>E-Mail</b></td> \n"; echo "</tr> \n"; do { echo "<tr> \n"; echo "<td>".$row["nombre"]."</td> \n"; echo "<td>".$row["email"]."</td>\n"; echo "</tr> \n"; } while ($row = mysql_fetch_array($result)); echo "</table> style="margin-left: 50">echo "</table> \n"; } else { echo "No se encontraron registros"; } ?> </body> </html>

-sencialmente, este programa hace lo mismo que el anterior. "lmacenamos en Nro4 el registro actual con la funcin mysqlOfetchOarray') que hace e#actamente lo mismo que mysqlOfetchOro4'), con la e#cepcin que podemos referenciar a los campos por su nombre 'Nro4_JemailJ`), en vez de por un n!mero. 6on la sentencia if>else, asignamos a Nro4 el primer registro de la consulta, y en caso de no haber ninguno 'else) mostramos un mensaje 'JNo se encontraron...J). 5ientras que con la sentencia do>4hile, nos aseguramos que se nos muestren todos los registros devueltos por la consulta en caso de haber m s de uno.

T./ 0n ;uscador para la ;ase de <atos


Kamos a ver una aplicacin de todo lo visto hasta ahora. -scribiremos un programa que sirva para buscar una determinada cadena 'que recibiremos de un formulario, y la almacenamos en la variable Nbuscar), dentro de nuestra base de datos, concretamente dentro del campo JnombreJ. -n primer lugar escribiremos el te#to &*5L de la p gina 2eb que nos servir formulario de entrada, la llamaremos formulario.htm. como

<html> <body> <form method = "POST" action = "http://mysevidor/php/buscador.php3"> <strong>Palabra clave:</strong> <input type="text" name="buscar" size="20"><br><br> <input type="submit" value="Buscar"> </form> </body> </html>

-l siguiente programa de b!squeda lo llamaremos buscador.php, y ser el encargado de hacer la b!squeda en la base de datos, y devolver por pantalla los registros encontrados.
<html> <body> <?php if (!isset($buscar)){

Programacin en PHP

45 / 74

echo "<p>Debe especificar una cadena a buscar</p> \n"; echo "<p><a href=buscador_bd.htm>Volver</p> \n"; echo "</html></body> \n"; exit; } $link = mysql_connect("localhost", "nobody"); mysql_select_db("mydb", $link); $sql = "SELECT * FROM agenda WHERE nombre LIKE '%$buscar%' ORDER BY nombre"; $result = mysql_query($sql, $link); if ($row = mysql_fetch_array($result)){ echo "<table border = '1'> \n"; //Mostramos los nombres de las tablas echo "<tr> \ndigo" style="margin-left: 50">echo "<tr> \n"; mysql_field_seek($result,0); while ($field = mysql_fetch_field($result)){ echo "<td><b>$field->name</b></td> \n"; } echo "</tr> \n"; do { echo "<tr> \n"; echo "<td>".$row["id"]."</td> \n"; echo "<td>".$row["nombre"]."</td> \n"; echo "<td>".$row["direccion"]."</td> \n"; echo "<td>".$row["telefono"]."</td> \n"; echo "<td><a href='mailto:"href='mailto:".$row["email"]."'>". $row["email"]."</a></td> \n"; echo "</tr> \n"; } while( $row = mysql_fetch_array($result) ); echo "<p><a href=buscador_bd.htm>Volver</p> \n"; echo "</table> \n"; } else { echo "<p>No se ha encontrado ningn registro!</p>\n"; echo "<p><a href=buscador_bd.htm>Volver</p> \n"; } ?> </body> </html>

Lo primero que comprobamos es que el contenido de la variable Nbuscar que recibimos del la p gina formulario.htm no es una cadena vaca, y esto lo hacemos con la funcin isset') que devuelve afalsoa si la variable que recibe est vaca. " la funcin le anteponemos el signo admiracin 'b) que es equivalente a un NE*, para convertirlo en averdaderoa en caso de que la variable est$ vaca, y en ese caso terminamos la ejecucin del programa con e#it. Lo m s importante de este programa, es sin duda la sentencia SRL que le enviamos al servidor 5ySRL, y m s concretamente la condicin que le imponemos, 2&-8- nombre L(c- aZNbuscarZa. 6on la sentencia L(c- buscamos cualquier ocurrencia de la cadena contenida en Nbuscar, mientras que con los signos de porcentaje 'Z) indicamos el lugar de la coincidencia, por ejemplo, si hubi$semos puesto nombre L(c- aZNbuscara, buscaramos cualquier ocurrencia al final del campo JnombreJ. =inalmente las funciones mysqlOfetchOfield'), obtenemos informacin acerca de las caractersticas de cada campo, como su nombre, tipo, longitud, nombre de la tabla que los contiene, etc. %ero para ejecutar la funcin anterior debemos colocar el apuntador en el primer campo, y eso lo logramos con la funcin mysqlOfieldOseeI'), la cual mueve el apuntador interno a la posicin indicada.

Programacin en PHP

46 / 74

T.B ",adir 8egistros


-n esta leccin veremos como a,adir nuevos registros a nuestra base de datos. La recogida de datos se realizar a trav$s de un formulario. -n primer lugar vamos a crear una p gina 2eb con un simple formulario, con los campos que deseamos.
<html> <body> <body> <form method="post" action="add_reg.php3"> Nombre :<input type="Text" name="nombre"><br> Direccin:<input type="Text" name="direccion"><br> Telfono :<input type="Text" name="telefono"><br> E-mail :<input type="Text" name="email"><br> <input type="Submit" name="enviar" value="Aceptar informacin"> </form> </body> </html>

&asta aqu hemos creado el formulario donde recogeremos los datos, y una vez introducidos ejecutamos un programa llamado addOreg.php+
<html> <body> <?php // process form $link = mysql_connect("localhost", "root"); mysql_select_db("mydb",$db); $sql = "INSERT INTO agenda (nombre, direccion, telefono, email) ". "VALUES ('$nombre', '$direccion', '$telefono', '$email')"; $result = mysql_query($sql); echo "Gracias! Hemos recibido sus datos.\n"; ?> </body> </html>

%ara introducir un nuevo registro, utilizamos la funcin mysqlOquery'), la cual tambi$n usamos para las consultas, y usaremos para las actualizaciones. 0n detalle importante, para poder a,adir o modificar registros debemos tener permiso en el servidor de la base de datos, por eso en este caso la cone#in fue como root, pero podra ser cualquier otro usuario. %ara terminar esta leccin vamos a combinar la p gina 2eb de formulario y el archivo de programa %&%, en un solo archivo que llamaremos addOreg.php
<html> <body> <?php if ($enviar) { // process form $link = mysql_connect("localhost", "root"); mysql_select_db("mydb",$db); $sql = "INSERT INTO agenda (nombre, direccion, telefono, email) ". "VALUES ('$nombre', '$direccion', '$telefono', '$email')"; $result = mysql_query($sql); echo "Gracias! Hemos recibido sus datos.\n"; }else{ ?> <form method="post" action="add_reg.php3">

Programacin en PHP

47 / 74

Nombre :<input type="Text" name="nombre"><br> Direccin:<input type="Text&quo>Direccin:<input type="Text" name="direccion"><br> Telfono :<input type="Text" name="telefono"><br> E-mail :<input type="Text" name="email"><br> <input type="Submit" name="enviar" value="Aceptar informacin"> </form> <?php } //end if ?> </body> </html>

T.T 5odificar 8egistros


Lo primero que se debe de hacer es seleccionar el registro que deseamos modificar, y luego, mandamos una consulta con la modificaciones. Suponemos que las modificaciones las recogemos de un formulario como el de la leccin anterior.
<html> <body> <?php if (isset($id)){ // process form $link = mysql_connect("localhost", "root"); mysql_select_db("mydb",$db); $sql = "SELECT * FROM agenda WHERE id = $id" $result = mysql_query($sql); $sql = "UPDATE agenda SET nombre='$nombre', direccion='$direccion', telefono='$telefono', email='$email'"; $result = mysql_query($sql); }else{ echo "Debe especificar un 'id'.\n"; } </body> </html>

E bien, 5odificar registros opcin ;+


<html> <body> <?php if (isset($id)){ // process form $link = mysql_connect("localhost", "root"); mysql_select_db("mydb",$db); $sql = "UPDATE agenda SET nombre='$nombre', direccion='$direccion', ". "telefono='$telefono', email='$email' WHERE id=$id"; $result = mysql_query($sql); }else{ echo "Debe especificar un 'id'.\n"; } ?> </body> </html>

Programacin en PHP

48 / 74

T.? ;orrar 8egistros


-l proceso de borrar un registro es id$ntico al de modificar, solo que en vez de utilizar 0%<"*- utilizamos <-L-*- en la sentencia SRL. %or tanto el programa quedara como sigue.
<html> <body> <?php if (isset($id)){ // process form $link = mysql_connect("localhost", "root"); mysql_select_db("mydb",$db); $sql = "DELETE FROM agenda WHERE id=$id") $result = mysql_query($sql); }else{ echo "Debe especificar un 'id'.\n"; } ?> </body> </html>

T.C *odo a la Kez


6omo resumen veamos como quedara el programa si integramos lo desarrollado hasta aqu.
<html> <body> <?php $link = mysql_connect("localhost", "root"); mysql_select_db("mydb",$link); //Comprobamos si hemos recibido datos del formulario if( $enviar ) { // Si recibimos un id, modificamos, sino aadimos un registro if( $id ) { $sql = "UPDATE agenda SET nombre='$nombre', direccion='$direccion'". "telefono='$telefono', email='$email' WHERE id=$id"; echo "Registro Actualizado<p>"; } else { $sql = "INSERT INTO agenda (nombre, direccion, telefono, email) ". "VALUES ('$nombre', '$direccion', '$telefono', '$email')"; echo "Registro Aadido<p>"; } // Enviamos la sentencia SQL al servidor de base de datos $result = mysql_query($sql); } elseif( $delete ) { // Borramos un registro $sql = "DELETE FROM agenda WHERE id=$id"; $result = mysql_query($sql); echo "Registro Borrado<p>"; } else { /* Esta parte se ejecuta si no hemos presionado el boton enviar, es decir no venimos de un formulario */

Programacin en PHP

49 / 74

if( !$id ) { // Mostramos todos los registros de nuestra BD $result = mysql_query("SELECT * FROM agenda",$link) while ($myrow = mysql_fetch_array($result)) { echo $myrow["nombre"]." - ".$myrow["direccion"]." - ". $myrow["Telefono"]." - ".$myrow["email"]; echo "[<a href=\$PHP_SELF?id=". $myrow["id"]."&delete=yes">Borrar</a>]"; echo "[<a href=\$PHP_SELF?id=".$myrow["id"].">Modificar</a>] <br>"; } } ?> <p>[<a href="<?php echo $PHP_SELF?>">Aadir un registro</a>]</p> <form method="post" action="<?php echo $PHP_SELF?>"> <?php if( $id ) { // editamos el registro seleccionado $sql = "SELECT * FROM agenda WHERE id=$id"; $result = mysql_query($sql); $myrow = mysql_fetch_array($result); $id = $myrow["id"]; $nombre = $myrow["nombre"]; $direccion = $myrow["direccion"]; $telefono = $myrow["telefono"]; $email = $myrow["email"]; // enviamos el id para poder editar el registro echo "<input type=hidden name="id" value=$id>"; } ?> Nombre:<input type="Text" name="nombre" value="<?php echo $nombre ? >"><br> Direccin:<input type="Text" name="direccion" value="<?php echo $direccion ?>"><br> Telefono:<input type="Text" name="telefono" value="<?php echo $telefono ?>"><br> Email:<input type="Text" name="email" value="<?php echo $email ?>"><br> <input type="Submit" name="enivar" value="Enviar Informacin"> </form> <?php } // End If if ($enviar) ?> </body> </html>

6abe destacar el uso de N%&%OS-L=, esta es una funcin interna de %&% que nos devuelve la direccin del programa que se esta ejecutando.

T.3 -jercicio (ntegrador


5odifique el ejercicio integrador anterior para realizar las operaciones sobre una base de datos. Los pedidos de los clientes deben guardarse en la base de datos con los datos del cliente como nombre, fecha, tel$fono, y direccin, esto debe ocurrir cuando el cliente le de clic al botn de cerrar compra. "gregue una opcin e#terna de consulta que listar los pedidos y mostrar un botn para borrar el pedido, incluyendo los detalles. -ste archivo se debe llamar pedidos.php. %or el momento solo la informacin de los pedidos se guardar en la base de datos, para el cat logo de productos seguiremos utilizando las variables de arreglos. La consulta de

Programacin en PHP

50 / 74

los detalles no se realizar en este ejercicio. 0tilice un modelo maestroAdetalle para guardar los pedidos de los clientes. -s decir, defina una tabla que contendr la informacin del cliente 'pedido) y otra tabla que contendr los productos 'pedido<etalle), las tablas se asociar n a trav$s del id de la primera tabla. 0tilice las siguientes estructuras de tablas+ CREATE TABLE id_pedido nombre fecha direccion telefono ); pedido ( INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY , VARCHAR( 30 ) NOT NULL , DATE NOT NULL , VARCHAR( 60 ) NOT NULL , VARCHAR( 20 ) NOT NULL

CREATE TABLE pedidoDetalle ( id_pedidoDetalle INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY , id_pedido INT UNSIGNED NOT NULL , clave VARCHAR( 8 ) NOT NULL );

-l usuario entra a la p gina y agrega productos a su carrito de compras 'panel derecho). -n la parte inferior aparece un nuevo botn para cerrar la cuenta y enviar los datos del usuario y del carrito a la base de datos. "l dar clic en esta liga debe preguntar, en el panel central, los datos del cliente.

Programacin en PHP

51 / 74

6uando el usuario llena sus datos le da clic en el botn de -nviar para guardar sus datos. 0na vez almacenado el pedido aparece en el panel central la notificacin de que el pedido ha sido guardado, junto con una liga para regresar al carrito normalmente. No se debe borrar la informacin del carrito cuando se almacenan los datos.

La p gina pedidos.php para listar y borrar los pedidos tendra la siguiente forma+

6uando no haya registros de %edidos, no debe mostrar la tabla sino simplemente una leyenda indicando que no hay pedidos. "l dar clic en el botn de borrar se debe mandar llamar a si misma la p gina, no utilice Programacin en PHP 52 / 74

una p gina e#terna para realizar esta operacin, todo debe quedar en un solo archivo pedidos.php.

Programacin en PHP

53 / 74

Captulo 0: 1eneracin !in#mica de Im#genes


Objetivo: -n este captulo el alumno aprender a crear im genes en tiempo real, con ayuda de la librera 7<. "l finalizar el alumno desarrollar un programa donde colocar din micamente un te#to dado en las coordenadas 9,G que especifique el usuario a trav$s de un formulario.

?.1 (ntroduccin
Las im genes din micas nos son !tiles cuando queremos representar datos que cambian. -n lugar de tener que recrear la gr fica cada vez que agregamos, alteramos o eliminamos alg!n dato, resulta m s conveniente tener un programa en %&% que sea capaz de leer los datos y crear la gr fica cada vez que se lo solicitemos. 0na de las partes m s interesantes y pr cticas de %&% es que permite realizar de manera muy sencilla im genes din micas. 6on otros lenguajes de programacin para p ginas 2eb se requiere conseguir alg!n paquete adicional para hacer esto, o no resulta tan sencillo. -n algunos casos como la programacin en "S% es necesario adquirir 'NN) el paquete para poder hacer las im genes. %&% provee la posibilidad de generar im genes din micamente y de incluir estas im genes en una p gina 2eb, esto se hace utilizando funciones de una biblioteca denominada P7<Q que viene compilada en php/, seg!n la versin de 7< la biblioteca permita generar im genes 7(=, d%-7 o %N7. 0na vez generada din micamente la imagen es posible transmitirla directamente al navegador o guardarla en disco para luego levantarla usando una bandera <IMG> de &*5L.

?.: 6reacin de una (magen.


image_handler=ImageCreate($x,$y); 6rea una (magen de tama,o 9 por G p#eles y devuelve un handler a la imagen en $IM 'se maneja el handler a la imagen en el resto de las funciones que manipulan la imagen, como si fuera un archivo). 0na vez creada la imagen, %&% provee funciones para dibujar rect ngulos, arcos, te#to y dem s elementos en la imagen. Etras variantes para crear una imagen consisten en crear la imagen a partir de una imagen e#istente en el disco de forma tal de poder modificarla+
int=imageCreateFromGIF(path); int=imageCreateFromPNG(path); int=imageCreateFromJPEG(path);

Programacin en PHP

54 / 74

"l igual que ImageCreate estas funciones devuelven un (mage&andler.

?.. 6reacin y alojamiento de colores.


%ara utilizar colores en una imagen es necesario en primer lugar crear el color y alojarlo en la imagen, esto se hace con (mage6olor"llocate de la siguiente forma+
color_handler=ImageColorAllocate(image_handler,int_rojo,int_verde,int_az ul);

La funcin recibe una imageOhandler en donde alojar el color y los valores decimales de la cantidad de rojo, verde y azul del color 'D a :BB), devuelve un colorOhandler que puede ser usado en cualquiera de las funciones que veremos a continuacin y utilizan colores.

?./ =unciones para creacin de objetos en la imagen.


$.4.1 reacin de ob<etos en la imagen
ImageRectangle(image_handler, x1,y1,x2,y2,color_handler); <ibuja un rect ngulo desde la coordenada #1,y1 'D,D es la esquina superior izquierda de la imagen) hasta la coordenada #:,y: del color indicado por colorOhandler 'previamente alojado con (mage6olor"llocate). ImageFilledRectangle(image_handler, x1,y1,x2,y2,color_handler); (dem anterior pero dibuja el rect ngulo relleno con el color indicado. int imagearc (image_handler, cx, cy, ancho, alto, angulo_comienzo, angulo_fin, color_handler); <ibuja un arco de elipse centrado en c#,cy con el ancho y alto especificado 'sin son iguales la elipse es una circunferencia) y desde el ngulo de comienzo al ngulo de fin 'en grados D a .TD). -l arco se dibuja con el color indicado. ImageDashedLine(image_handler, x1,y1,x2,y2,color_handler); <ibuja una lnea puntuada entre las coordenadas especificadas y con el color indicado. ImageFill(image_handler,x,y,color_handler); %inta con el color indicado a partir de la coordenada #,y y con el color indicado, llena con el color indicado. ImagePolygon(image_handler,array_puntos,cantidad_puntos,color_handler); <ibuja un polgono usando un arreglo de puntos de la forma '#D,yD,#1,y1,#:,y:,....etc) el par metro cantidadOpuntos indica cuantos puntos considerar para crear el polgono. ImageFilledPolygon(image_handler,array_puntos,cantidad_puntos,color_handler ); (dem anterior pero el polgono adem s se rellena con el color indicado. ImageLine(image_handler, x1,y1,x2,y2,color_handler); <ibuja una lnea desde #1,y: hasta #:,y: con el color indicado.

Programacin en PHP

55 / 74

$.4.2 8ane<o de olores:


color_handler=ImageColorAt(image_handler,x,y); <evuelve el color handler correspondiente al color del pi#el especificado. color_handler=imagecolorclosest(image_handler, int_rojo, int_verde, int_azul) <evuelve el color localizado m s cercano al color indicado en 87; por las cantidades de rojo, verde y azul 'en decimal) color_handler=imagecolorexact(image_handler, int_rojo, int_verde, int_azul); (dem anterior pero devuelve el colorOhandler del color pasado si el color no esta alojado en la imagen devuelve Y1. color_handler=imagecolorresolve(image_handler, int_rojo, int_verde, int_azul); -s una mezcla de las dos anteriores, esta funcin siempre devuelve un colorOhandler, o bien el color e#acto localizado en la imagen o bien el color m s cercano. int=ImageColorsTotal(image_handler); <evuelve la cantidad total de colores de la imagen. imageColorTransparent(image_handler,color_handler); "signa el color indicado por el handler como transparente para la imagen. ImageCopy(image_handler_dest,image_handler_origen, x_dest, y_dest,origen_x,origen_y, ancho,alto); 6opia una porcin de imagen desde la coordenada origenO#, origenOy con el ancho y alto especificado desde imageOhandlerOorigen hacia imageOhandlerOdest en la coordenada #Odest, yOdest. imageCopyResized(image_handler_dest, image_handler_origen, dest_x, dest_y, origen_x, origen_y, dest_ancho, dest_alto, origen_ancho, origen_alto); 6opia con opcin de achicar o agrandar una porcin de la imagen hay que especificar la imagen origen, la imagen destino, la coordenada desde donde copiar en la imagen origen, la coordenada a donde copiar en la imagen destino, y el ancho y alto tanto en el origen como en el destino.

$.4.3 8ane<o de te=to.


imageString(image_handler,font_number, x, y, string, color_handler); 6oloca una cadena en la imagen, si fontUD se usa el font default, si font es 1,:,.,/, o B se usa un font predefinido. X e Y son las coordenadas donde dibuja la cadena y especifican la esquina superior izquierda de la cadena. imageStringUp(image_handler,font_number, x, y, string, color_handler); (dem anterior pero la cadena se dibuja en forma vertical.

Programacin en PHP

56 / 74

array imagettftext(image_handler,size,angulo,x,y, color_handler,font_path, string); <ibuja una cadena en la imagen usando un tipo de letra trueAtype, la letra en formato nombre.ttf debe guardarse en alg!n lugar del sistema de archivos que se especifica con font_path 'ej.+ /fonts/arial.ttf). X e Y son las coordenadas de la esquina inferior izquierda de la cadena 'string). Angulo es el ngulo con el cual se dibuja la cadena string 'DUde izquierda a derecha en forma horizontal). Size indica el tama,o en puntos del te#to a usar. <evuelve un arreglo de C elementos representando los / puntos que delimitan la cadena de la forma+ izquierdaOarriba, derechaOarriba, abajoOizquierda, abajoOderecha. 'cada esquina esta representada por dos coordenadas+ # e y) array imagettfbbox(size, ngulo, font_path, string); <etermina el tama,o que ocupara la cadena en la imagen y devuelve un arreglo de C elementos con el mismo formato descrito en la funcin anterior.

?.B 7eneracin de la (magen.


ImageInterlace(image_handler,boolean); <etermina si la imagen ser interlazada o no 1Uinterlazada, DUno interlazada. imageGIF(image_handler, path); imageJPEG(image_handler, path); imagePNG(image_handler, path); <ado un imageOhandler genera un archivo gif>jpeg>png con la imagen correspondiente, el archivo puede luego incluirse con una bandera <IMG> para mostrarse en una p gina. Si no es necesario almacenar la imagen es posible llamar a imagejpeg de la forma+
imagejpeg(image_handler)

-n cuyo caso la imagen generada es transmitida directamente al navegador, es necesario enviar antes al navegador un encabezado 'header) indicando que se va a recibir un jpg, gif, png, etc.
header("Content-Type: image/jpg"); ImageJPEG($IM);

6omencemos con un ejemplo sencillo que lo !nico que hace es crear una imagen y sobre ella crear una cuadrcula+
<? Header("Content-Type: image/png"); $imagen = ImageCreate(300, 60); $color_fondo = ImageColorAllocate($imagen, 255, 233, 0); $color_rayas = ImageColorAllocate($imagen, 0, 0, 255); for($i=0; $i<=60; $i+=10) { ImageLine($imagen, 0, $i, 300, $i, $color_rayas); } for($i=0; $i<=300; $i+=10) { ImageLine($imagen, $i, 0, $i, 60, $color_rayas); }

Programacin en PHP

57 / 74

ImagePNG($imagen); ?>

-l resultado de este programa es el siguiente 'si abren solamente la im gen pueden ver que efectivamente se trata de un %&%+

"hora viene la parte difcil que es tratar de e#plicar que es lo que hace el programa. %ara empezar en este programa en particular es necesario hacer hincapi$ en que no hay &*5L. -l archivo donde est el programa comienza con la bandera especial eH, y no hay ning!n caracter despu$s de su contraparte. -sto es debido a que nuestro programa ya no est produciendo &*5L, sino que toda su salida ser una imagen. Kemos que al principio del programa hay una funcin llamada &eader'), que toma un argumento de te#to. %ara entender lo que hace esta funcin es necesario analizar un poco el proceso de lo que realmente sucede cuando accesamos una p gina de (nternet. %rincipalmente se trata de entender que cuando cargamos una p gina de (nternet 'o cualquier otra cosa va &**%), no slo aparece el archivo en nuestro navegador. "l momento de solicitar cualquier archivo va &**%, el navegador manda : partes al servidor. La primera es un encabezado que incluye entre otras cosas informacin sobre el navegador que estamos usando, o cuando mandamos datos va el m$todo %ES* con una forma, los datos de la forma. La segunda es la peticin especfica que estamos haciendo, es decir, que parte especfica estamos solicitando. 6uando el servidor termina de recibir nuestra solicitud tambi$n nos manda : partes. La primera es nuevamente un encabezado, que puede incluir muchas cosas. -ntre otros la fecha de !ltima modificacin del archivo, el tama,o del mismo, y lo que nos interesa en este momento, el tipo de archivo del que se trata. -sto lo hace a trav$s de lo que se llaman 5(5- *ypes. 6uando se trata de una p gina &*5L el tipo 5(5- es te#t>html, mientras que si se trata de un archivo de te#to el tipo es te#t>plain. -sta informacin la usa el navegador para saber de que forma representar la informacin que est recibiendo del servidor. 6on la funcin &eader') y especficamente al decirle 6ontentA*ype+, estamos mandando implcitamente el tipo 5(5- de la salida de nuestro programa. -n ocasiones anteriores no hemos necesitado esta funcin porque normalmente %&% asume que nuestra salida es &*5L y eso ha sido el caso hasta ahora. La siguiente lnea del programa llama a una funcin (mage6reate') que toma : argumentos, y que nos regresa un identificador de imagen. Los argumentos de la funcin son el ancho y el alto de la imagen en p#eles. -l identificador de la imagen es sencillamente un valor que en este caso guardamos en una variable llamada Nimagen, que nos sirve para referirnos a la imagen que estamos creando. " continuacin usamos la funcin (mage6olor"llocate') que toma / argumentos. -sta funcin nos sirve para crear los colores que vamos a usar en nuestra imagen. -l primer par metro que toma es el identificador de la imagen en la que queremos crear el color. Los argumentos :, . y / se refieren respectivamente a los valores de rojo, verde y azul de el color que estamos especificando. -stos valores van desde el D hasta el :BB, como en los programas de dibujo.

Programacin en PHP

58 / 74

-l primer color que creamos con (mage6olor"llocate') es el color que tomar la imagen como color de fondo. La funcin nos va a devolver un valor que se va a referir al color que creamos. Lo guardamos en una funcin para referirnos a $l cada vez que lo queramos usar en alguna funcin que utilice alg!n color. La siguiente funcin relacionada con im genes que empleamos es (mageLine'). -l primer argumento que toma es el identificador de la imagen donde queremos pintar. Los argumentos :, ., / y B se refieren a los valores de N#1, Ny1, N#: y Ny: respectivamente. 'N#1, Ny1) representa el primer punto o punto de origen, mientras que 'N#:, Ny:) representa el punto final de la lnea. 6abe mencionar que el sistema de coordenadas considera que el 'D, D) est ubicado en la esquina superior izquierda, y que 9 aumenta de izquierda a derecha y G aumenta de arriba hacia abajo. -l !ltimo argumento de la funcin es el color del que queremos pintar la lnea. Los ciclos for se encargan de repetir la funcin que pinta las rayas varias veces. -l primer ciclo for pinta las lneas horizontales a 1D p#eles de distancia cada una, mientras que el segundo ciclo pinta las rayas verticales separadas una distancia igual. 6uando terminamos de modificar la imagen, la funcin (mage%N7') se encarga de mandar la imagen como %N7. *ambi$n podemos usar (maged%-7 si quisi$ramos crear una imagen d%-7, pero tendramos que cambiar el tipo 5(5- en la funcin &eader') al principio del programa. &e aqu el resultado del siguiente ejemplo+

G a continuacin el cdigo que produce la imagen anterior+


<? Header("Content-Type: image/png"); $imagen = ImageCreate(300, 300);

Programacin en PHP

59 / 74

$color_fondo = ImageColorAllocate($imagen, 255, 255, 255); $fondo_grafica = ImageColorAllocate($imagen, 200, 200, 200); $negro = ImageColorAllocate($imagen, 0, 0, 0); $color_barras = ImageColorAllocate($imagen, 0, 123, 255); ImageRectangle($imagen, 0, 0, 299, 299, $negro); ImageFilledRectangle($imagen, 20, 20, 280, 280, $fondo_grafica); ImageRectangle($imagen, 20, 20, 280, 280, $negro); $valor_max = 25; $valores = array(20, 3, 12, 24, 14, 8); $ancho = 260; $alto = 260; $x_inicial = 20; $y_inicial = 280; $ancho_barra = $ancho / count($valores); $alto_barra = $alto / $valor_max; for($i = 0; $i < count($valores); $i++) { $x = $x_inicial + $ancho_barra * $i; $y = $y_inicial - $alto_barra * $valores[$i]; ImageFilledRectangle($imagen, $x, $y, $x + $ancho_barra, $y_inicial, $color_barras); ImageRectangle($imagen, $x, $y, $x + $ancho_barra, $y_inicial, $negro); } ImagePNG($imagen); ?>

-n este ejemplo introducimos dos funciones adicionales que son muy similares. (mage=illed8ectangle') e (mage8ectangle') dibujan ambas rect ngulos en la imagen, la diferencia siendo que la primera funcin rellena los rect ngulos y la segunda no. "mbas toman los mismos argumentos a pesar de esto. -l primero es el identificador de imagen. Los siguientes / par metros son : puntos '#1, y1) y '#:, y:) correspondientes a : puntos de esquinas opuestas. -l resto de este ejemplo emplea !nicamente opciones de %&% que hemos visto anteriormente. -s importante mencionar que las alturas de las barras dependen de los valores que se encuentran en el arreglo Nvalores. 6on este programa es f cil modificar los valores de ese arreglo y ver como se reflejan en la gr fica, mostrando as que efectivamente se tiene una gr fica din mica.

?.T -jercicio (ntegrador


6ree un sistema que muestre una imagen con un te#to en una coordenada 9,G dado por el usuario a trav$s de un formulario. %ara este ejercicio se requiere de dos archivos %&%. -l primero debe mostrar el formulario y el mapa gr fico, este mismo archivo es el que va a recibir los valores del formulario para pasarlos por 7-* al segundo archivo que es el encargado de generar el gr fico. -l nombre de los archivos debe ser mapa.php y mapaOimg.php respectivamente. -n el archivo mapa.php cree una tabla con dos columnas, en la primera columna coloque

Programacin en PHP

60 / 74

la instruccin e(57f que mandar cargar el mapa imagen 'el segundo archivo %&%) que se generar din micamente en base a los par metros. -n la segunda columna coloque el formulario que preguntar por el te#to y las coordenadas 9,G. La p gina del ejercicio quedar de la siguiente forma+

Programacin en PHP

61 / 74

23 Introduccin a .oc4ets
C.1 fsocIopen
%&% dispone de varias funciones de Net4orIing, la m s usada y la m s fle#ible es fsocIopen que permite conectarse a un socIet en un host determinado por una direccin (% y un puerto, mediante esta funcin es posible conectarse a servidores &**%, =*%, *elnet, (5"%, %E%. y otros protocolos, incluso que nosotros mismos hayamos desarrollado. -s de destacar que la funcionalidad de Net4orIing de %&% es como 6liente, %&% no puede crear un socIet con nombre y hacer un PlistenQ de cone#iones a dicho puerto por lo que no puede funcionar como servidor. La sinta#is de fsocIopen es+
file_handler = fsockopen(string hostname, int port, int errno, string errstr, double timeout);

Los tres !ltimos par metros son opcionales. Hostname es el nombre o direccin (% del host al cual conectarse. Port es el n!mero de puerto donde se va a realizar la cone#in. Errno y errstr deben ser de tipo referencia a las variables donde se guardan el n!mero de error y la cadena o descripcin del error, solo en caso de no poder realizar la cone#in. Timeout es el tiempo m #imo a esperar por la cone#in en segundos. -sta funcin regresa un file_hander, el cual puede usarse como un archivo normal usando fgets, fread, fputs, f4rite, foef, fclose, etc. -jemplo+
$fp = fsockopen(www.itnova.com.mx, 80, &$errno, &$errstr, 30); if( !$fp ) { echo $errstr ($errno) <br>\n; } else { fputs($fp, GET / HTTP/1.0\n\n); while( !feof($fp) ) { echo fgets($fp, 128); } fclose($fp); }

-n este ejemplo abrimos el puerto CD del protocolo &**% de un host '444.itnova.com.m#). Luego le enviamos por el socIet un request de &**% y entramos en un ciclo recuperando el contenido que devuelve el servidor. -s una especie de miniA navegador &**%.

Programacin en PHP

62 / 74

C.: Etras funciones !tiles


!.2.1 gethostb/addr e gethostb/name
-stas dos funciones permiten, respectivamente, conseguir el nombre de un hu$sped partiendo de su direccin (% y conseguir la direccin (% asociada a un nombre de dominio. Las sinta#is para las dos funciones son+
$hostname = gethostbyaddr(IP_address); $hostaddress = gethostbyname(hostname);

%or ejemplo, supongamos que J444.server.comJ tenga la direccin (% 13:.1TC.1.: que nosotros conocemos, pero queremos que sea un programa %&% quien lo reconozca. -scribiremos, por lo tanto+
$hostname = gethostbyaddr("192.168.1.2"); $hostaddress = gethostbyname("http://www.server.com"); print "$hostname tiene direccin IP $hostaddress.\n";

!.2.2 getservb/name
-sta funcin nos permite conseguir el n!mero del puerto al que est determinado servicio. La sinta#is de la funcin es+
$port = getservbyname(service, protocol);

asociado un

%or ejemplo, queriendo saber a qu$ puerta est escribir+

asociado el protocolo ftp, podemos

$ftp_port = getservbyname("ftp", "tcp");

que, muy probablemente, nos devolver el puerto :1 'default para el =*%).

C.. -jercicio (ntegrador


<esarrolle una aplicacin que este monitoreando varios sitios 2eb y que lo informe en un mapa. La informacin de los sitios 2eb debe estar en una base de datos 'host, coordO#, coordOy). La p gina debe refrescarse autom ticamente cada B minutos, en la carga es cuando debe revisar si el sitio 2eb esta corriendo. 0tilice un peque,o grafico para indicar el sitio 2eb en el mapa, abajo del icono imprima el nombre del host y el status 'EI, -rror). 8ecuerde utilizar dos programas, uno de &*5L con un emetaf para recargar la p gina y que manda llamar el programa %&% que revisa los sitios 2eb y genera el gr fico. -jemplo de como quedara el monitor de sitios 2eb+

Programacin en PHP

63 / 74

Programacin en PHP

64 / 74

Captulo 5: .olucin $jercicios Integradores


Objetivo: -n este captulo se muestra una de las formas en que se pudo haber resulto el ejercicio integrador del captulo correspondiente.

3.1 -jercicio (ntegrador / '=ormulario para "mortizacin)


amorti6acion3p7p
<html> <head> <title>Sistema de Amortizacion</title> </head> <body> <center> <h1>Sistema de Amortizaci&oacute;n</h1> <?php echo "<form action=\"$PHP_SELF\" method=\"POST\"> \n"; echo "Monto: <input type=text name=\"monto\" value=\"$monto\"> <br> \n"; echo "Tasa: <input type=text name=\"tasa\" value=\"$tasa\"> % <br> \n"; echo "Meses: <input type=text name=\"meses\" value=\"$meses\"> <br> \n"; echo "<input type=submit name=ok value=\"Calcular\"><br> \n"; echo "</form>"; if( $monto > 0 ) { echo "<table border=1 cellpadding=8 cellspacing=0>"; echo "<tr>"; echo " <th>Mes</th>". " <th>Saldo<br>Inicial</th>". " <th>Pago<br>Mensual</th>". " <th>Abono<br>Capital</th>". " <th>Intereses</th>". " <th>Saldo<br>Final</th>". "</tr>"; $tasa=$tasa/100; $pagoMes=($monto*$tasa)/(1-pow(1+$tasa,-$meses)); $saldo=$monto; for( $i=1; $i<$meses+1; $i++) { $intereses = $saldo*$tasa; $abonoCapital = $pagoMes-$intereses; echo '<tr>'; echo "<td align=center>$i</td>"; echo '<td align=right>'.number_format($saldo,2).'</td>'; echo '<td align=right>'.number_format($pagoMes,2).'</td>'; echo '<td align=right>'.number_format($abonoCapital,2).'</td>'; echo '<td align=right>'.number_format($intereses,2).'</td>'; $saldo-=$abonoCapital; echo '<td align=right>'.number_format($saldo,2).'</td>'; echo "</tr>"; } } ?> </center> </body> </html>

Programacin en PHP

65 / 74

Programacin en PHP

66 / 74

3.: -jercicio (ntegrador B '6arrito de compras b sico)


carrito3p7p
<?php session_start(); session_register('carrito'); // -----------------------------------------------------------$productos[1] = array('nombre'=>'Windows 2K', 'descripcion'=>'', 'precio'=>'5,999.00'); $productos[2] = array('nombre'=>'Linux RedHat', 'descripcion'=>'', 'precio'=>'199.00'); $productos[3] = array('nombre'=>'Linux SuSE', 'descripcion'=>'', 'precio'=>'356.00'); $productos[4] = array('nombre'=>'Netware', 'descripcion'=>'', 'precio'=>'19,200.00'); $productos[5] = array('nombre'=>'QNX', 'descripcion'=>'Sistema Operativo en Tiempo Real.', 'precio'=>'4,500.00'); $productos[6] = array('nombre'=>'OpenVMS', 'descripcion'=>'Un poco viejo.', 'precio'=>'148,789.00'); if( $tr=='Add' ) $carrito[$id]=1; if( $tr=='Del' ) unset($carrito[$id]); if( $tr=='Logout' ) session_destroy(); // -----------------------------------------------------------$izq = panelIzq(); $cen = panelCen(); $der = panelDer(); echo <<<EOT <center> <h1>Mini-Carrito</h1> <table width=700 <tr> <td width=25%> <td width=45%> <td width=30%> </tr> </table> border=1 cellpadding=0 cellspacing=0> $izq </td> $cen </td> $der </td>

[<a href="?tr=Logout">Salir</a>] </center> EOT; // -----------------------------------------------------------function panelIzq() { global $productos; $c = '<ul>'; foreach( $productos as $k=>$v ) $c.="<li><a href=\"?id=$k\">$v[nombre]</a>"; $c.='</ul>'; return $c; } // -----------------------------------------------------------function panelCen() { global $productos,$id; $c = "<table border=0> <tr><td>Clave:</td><td>$id</td></tr>

Programacin en PHP

67 / 74

<tr><td>Nombre:</td><td>".$productos[$id][nombre]."</td></tr> <tr><td>Descripcion:</td><td>".$productos[$id][descripcion]."</td></tr> <tr><td>Precio:</td><td>".$productos[$id][precio]."</td></tr> </table>"; $c.= "<center><a href=\"?id=$id&tr=Add\">Agregar</a></center>"; return $c; } // -----------------------------------------------------------function panelDer() { global $productos,$carrito; $c = '<table>'; if( count($carrito)>0 ) foreach( $carrito as $k=>$v ) $c.="<tr><td><a href=\"?id=$k&tr=Del\">B</a></td> <td><a href=\"?id=$k\">".$productos[$k][nombre]."</a></td> <td align=right>".$productos[$k][precio]."</td> </tr>"; $c.='</table>'; return $c; } ?>

Programacin en PHP

68 / 74

3.. -jercicio (ntegrador T '6arrito con ;ase de <atos)


carrito8db3p7p
<?php session_start(); session_register('carrito'); // -----------------------------------------------------------$productos[1] = array('nombre'=>'Windows 2K', 'descripcion'=>'', 'precio'=>'5,999.00'); $productos[2] = array('nombre'=>'Linux RedHat', 'descripcion'=>'', 'precio'=>'199.00'); $productos[3] = array('nombre'=>'Linux SuSE', 'descripcion'=>'', 'precio'=>'356.00'); $productos[4] = array('nombre'=>'Netware', 'descripcion'=>'', 'precio'=>'19,200.00'); $productos[5] = array('nombre'=>'QNX', 'descripcion'=>'Sistema Operativo en Tiempo Real.', 'precio'=>'4,500.00'); $productos[6] = array('nombre'=>'OpenVMS', 'descripcion'=>'', 'precio'=>'148,789.00'); if( $tr=='Add' ) $carrito[$id]=1; if( $tr=='Del' ) unset($carrito[$id]); if( $tr=='Logout' ) session_destroy(); // -----------------------------------------------------------if( isset($cerrarCuenta) ) { //--- Muestra formulario para preguntar los datos del cliente --$izq = ''; $cen = '<form action="?" method=POST>'. 'Nombre: <input type=text name=nombre><br>'. 'Fecha: <input type=text name=fecha>(aaaa-mm-dd)<br>'. 'Telefono: <input type=text name=telefono><br>'. 'Direccion: <input type=text name=direccion><br>'. '<center><input type=submit name=Enviar value="Enviar"></center><br>'. '</form>'; } elseif( isset($Enviar) ) { $link = mysql_connect("localhost","root",""); mysql_select_db('carrito_db'); //--- Guarda el Maestro --$result=mysql_query("INSERT INTO pedido(nombre,fecha,telefono,direccion) ". " VALUES('$nombre','$fecha','$telefono','$direccion') " ,$link); $idPedido = mysql_insert_id(); //--- Guarda los Detalle --if( count($carrito)>0 ) foreach( $carrito as $k=>$v ) $result=mysql_query("INSERT INTO pedidoDetalle(id_pedido,clave) ". " VALUES('$idPedido','$k')",$link); //--- Muestra que ya se guardo la informacion --$izq = ''; $cen = '<br><br><br><center>'. 'Solicitud de Productos Enviada. Gracias<br>'. '<br><br><a href="?">Continuar</a>'. '</center><br><br><br>'; } else { $izq = panelIzq(); $cen = panelCen(); }

Programacin en PHP

69 / 74

$der = panelDer(); echo <<<EOT <center> <h1>Mini-Carrito</h1> <table width=700 <tr> <td width=25%> <td width=45%> <td width=30%> </tr> </table> border=1 cellpadding=0 cellspacing=0> $izq </td> $cen </td> $der </td>

[<a href="?cerrarCuenta=1">Cerrar Cuenta</a>] &nbsp; &nbsp; [<a href="?tr=Logout">Salir</a>] </center> EOT; // -----------------------------------------------------------function panelIzq() { global $productos; $c = '<ul>'; foreach( $productos as $k=>$v ) $c.="<li><a href=\"?id=$k\">$v[nombre]</a>"; $c.='</ul>'; return $c; } // -----------------------------------------------------------// function panelCen() { global $productos,$id; $c = "<table border=0> <tr><td>Clave:</td><td>$id</td></tr> <tr><td>Nombre:</td><td>".$productos[$id][nombre]."</td></tr> <tr><td>Descripcion:</td><td>".$productos[$id][descripcion]."</td></tr> <tr><td>Precio:</td><td>".$productos[$id][precio]."</td></tr> </table>"; $c.= "<center><a href=\"?id=$id&tr=Add\">Agregar</a></center>"; return $c; } // -----------------------------------------------------------function panelDer() { global $productos,$carrito; $c = '<table>'; if( count($carrito)>0 ) foreach( $carrito as $k=>$v ) $c.="<tr><td><a href=\"?id=$k&tr=Del\">B</a></td> <td><a href=\"?id=$k\">".$productos[$k][nombre]."</a></td> <td align=right>".$productos[$k][precio]."</td> </tr>"; $c.='</table>'; return $c; } ?>

pedidos3p7p
<html> <body> <center> <h1>Consulta de Pedidos</h1> <?php //--- Conexion y seleccion de la base de datos --$link=mysql_connect("localhost","root","");

Programacin en PHP

70 / 74

mysql_select_db("carrito_db"); //--- Si existe $tr entonces tiene tareas que realizar if( isset($tr) AND $tr=='Del' ) { $result=mysql_query("DELETE FROM pedido WHERE id_pedido='$id' ",$link); $result=mysql_query("DELETE FROM pedidoDetalle WHERE id_pedido='$id' ",$link); } //--- Muestra la lista de los pedidos --$result=mysql_query("SELECT * FROM pedido ",$link); if( mysql_num_rows($result) > 0 ) { echo '<table border=1 cellpadding=4 cellspacing=0>'; echo '<tr>'. '<th>&nbsp;</th>'. '<th>Nombre</th>'. '<th>Fecha</th>'. '<th>Telefono</th>'. '</tr>'; while( $rw = mysql_fetch_array($result) ) { echo '<tr>'; echo '<td>[<a href="?tr=Del&id='.$rw[id_pedido].'">B</a>]</td>'; echo '<td align=left>'.$rw[nombre].'</td>'; echo '<td align=center>'.$rw[fecha].'</td>'; echo '<td align=left>'.$rw[telefono].'</td>'; echo '</tr>'; } echo "</table>"; } else { echo "<br><br><br><br>No se existen Pedidos<br><br><br>"; } ?> </center> </body> </html>

Programacin en PHP

71 / 74

3./ -jercicio (ntegrador ? '5apa)


mapa3p7p:
<html> <head> <title>Mapa Web</title> </head> <body> <center> <h1>Mapa Web</h1> <table border=2 cellpadding=0 cellspacing=0> <tr> <td><img src="mapa_img.php?<?php echo "texto=$texto&x=$x&y=$y"; ?>" border=0></td> <td> <form method="?"> Nombre: <input name=texto type=text><bR> Coord X: <input name=x type=text><br> Coord Y: <input name=y type=text><br> <input type=submit value="Ver"> </form> </td> </tr> </table> </center> </body>

mapa8img3p7p
<?php $width = 300; $height = 300; Header( "Content-type: image/png"); Header( "Expires: Mon, 17 Aug 1998 12:51:50 GMT"); $im = imagecreate($width,$height); $white=ImageColorAllocate($im,255,255,255); $black=ImageColorAllocate($im,0,0,0); ImageFilledRectangle($im,0,0,$width,$height,$white); ImageRectangle($im,0,0,$width-1,$height-1,$black); ImageString($im, 2, $x, $y, "[$texto]",$black); ImagePng($im); ImageDestroy($im); ?>

Programacin en PHP

72 / 74

3.B -jercicio (ntegrador C '5onitor sitios 2eb)


monitor37tml
<html> <head> <title>Monitor Sitios Web</title> <meta HTTP-EQUIV="REFRESH" CONTENT="20"> <meta HTTP-EQUIV="EXPIRES" CONTENT="Sat, 01 Jan 2001 00:00:00 GMT"> </head> <body> <center> <h1>Monitor Sitios Web</h1> <img src="monitor_img.php" border=0> </center> </body>

monitor8img3p7p
<?php // $width = 600; $height = 400; // // Prepara plano de trabajo // Header( "Content-type: image/png"); Header( "Expires: Mon, 17 Aug 1998 12:51:50 GMT"); $im = imagecreate($width,$height); $x=imagesx($im); $y=imagesy($im); // // Configuracion de Colores // $red=ImageColorAllocate($im,255,0,0); $green=ImageColorAllocate($im,0,150,0); $white=ImageColorAllocate($im,255,255,255); $black=ImageColorAllocate($im,0,0,0); $gray=ImageColorAllocate($im,150,150,150); // ImageFilledRectangle($im,0,0,$width,$height,$white); ImageRectangle($im,0,0,$width-1,$height-1,$black); // // Dibuja los hosts // $link=mysql_connect("localhost","root",""); mysql_select_db("ejercicio",$link); // $result=mysql_query("SELECT host,x,y FROM sitios",$link); while( $rw=mysql_fetch_array($result) ) { $host = $rw[host]; $x = $rw[x]; $y = $rw[y]; $icn = ImageCreateFromPNG("server.png"); // // Imprime el icono // ImageCopy($im,$icn,$x,$y,0,0,ImageSX($icn),ImageSY($icn)); // // Nombre del HOST // $x1=$x+ImageSX($icn)/2-ImageFontWidth(2)*strlen($host)/2; $y1=$y+ImageSY($icn);

Programacin en PHP

73 / 74

ImageString($im, 2, $x1, $y1, $host,$black); // // Etiqueta STATUS // $fp = fsockopen($host, 80, &$errno, &$errstr, 30); if( $fp ) { $color=$green; $label="OK"; fclose($fp); } else { $color=$red; $label="ERROR!"; } $x1=$x+ImageSX($icn)/2-ImageFontWidth(2)*strlen($label)/2; $y1=$y+ImageSY($icn)+ImageFontHeight(2); ImageString($im, 2, $x1, $y1, $label,$color); } mysql_close($link); // // Envia la imagen al navegador // ImagePng($im); ImageDestroy($im); ?>

Programacin en PHP

74 / 74