Вы находитесь на странице: 1из 77
PC Cuadernos www.pe-cuadernos.com te en ] cos Instalacien y configuraci6én Apache, Xampp, PHPedit. Sintaxis y estructuras Arrays, Strings, Variables, funciones y bucles. Proyectos practicos Analisis de formularios, proteccién con contrasena, cookies, agregador RSS Nimero 28 -PHP 5 5,00 EUR PC Cuadernos PHP 5 Johann-Christian Hanke © Copyright: KnowWare EURL Traduccién: Victoria Mengual PC Cuadernos - Técnicos www.pe-cuadernos.com Sociedad editora: KnowWare E.U.R.L. 70, rue Georges Villette F-77250 Ecuelles Francia Director: Mikkel Franck Direccién electrénica: info@po-cuadernos.com Depésito legal: 8-50240-2005 ISBN: 2-915605-31-9 Imprenta: Imprints impressions intercomarcals, S.A. Sant Fruités de Bages, Barcelona Distribucién quioscos: Coedis S.L. Avda. de Barcelona, 225 Molins de Rei Barcelona Venta por nuimeros: Después de su aparicién, los nimeros de esta coleccién pueden pedirse por correo (Consulta la pagina 77) PHP es uno de los lenguajes de pro- gramacién mas populares y mas exten- didos en Internet. Y tiene motivos para serio: es flexible, es potente, y es de cd- digo abierto. De hecho, es la base de in- numerables proyectos que siguen ese mismo espiritu, como muchos de los sis- temas de gestién de contenidos, por ejemplo WordPress. Aprender un lenguaje de programacién ‘sdlo se puede hacer de una forma: la practica. Y de eso trata precisamente este cuadero, de ensefiar paso a paso, con ayuda de ejemplos y pequefios pro- yectos, las bases de PHP. Por el camino, el lector aprendera a rea- lizar cdlculos, a pedir la opinion de sus visitantes con un libro de visitas, a pro- teger contenidos mediante contrasefia o a crear y analizar encuestas Web. Ademias, para facilitar aun mas las co- sas, la mayoria de los ejemplos que se presentan aqui estan disponibles en forma de suplemento gratuito que se puede descargar desde la Web de PC Cuadernos. Todos estos proyectos tienen por objeto permitir asimilar de una forma amena y sencilla los fundamentos de la sintaxis de PHP, y despertar la imaginacién del lector para que pueda sacarle partido a este lenguaje de programacién con sus propias ideas. Mikkel Franck, editor. mfranck@pe-cuadernos.com Todos los productos citados en este manual son marcas registradas o marcas comerciales. El au- tor y el editor-declinan toda responsabilidad que pueda surgir de la utilizacion de los datos 0 pro- gramas que aparecen en este libro. Prélogo 3 Prélogo De modo que quieres aprender PHP... muy bien, Podras hacer que tu pagina Web sea més dinamica. Ademés, es francamente divertido y no tan complicado como pueda parecer. Sooo ee un SSO oncom ka ign explicaremos como crear paginas ‘con cue {Qué aprenderas en este cuaderno? En este cuaderno se ofrece una introduccién al Jenguaje de programacién PHP. Concretamen- te, descubriras: * Qué es PHP y cémo funciona * Como instalar un servidor Web local * Como trabajar con variables, estructuras de control, expresiones condicionales y bucles * Cémo programar un contador, un libro de isitas y una encuesta * Como leer flujos de noticias RSS * Como analizar formularios y enviar el con- tenido por formmail * Como proteger paginas mediante contrase- fa * Cémo comunicar la fecha y la hora y traba- jar con cookies Requisitos previos Para este cuademo, necesitards tener buenos conocimientos de HTML. Asimismo, asumiré que te sabes desenvolver correctamente con el sistema operativo. Deberias saber como: + Abrir el Explorador de Windows (Finder en el caso de Mac) + Trabajar con carpetas y archivos Ademds, también espero que tengas activadas las extensiones de archivo, que la tiltima v sion Windows oculta de forma predetermina- da, Este curso se basa en un sistema Windows. Sin embargo, puesto que PHP es un lenguaje inde- pendiente de la plataforma, también podrés aplicar mis explicaciones a un Mac o Linux. | Este cuademo puede utilizarse casi indistin- coating ne rencias entre ambas versiones solo val lector de noticias RSS (pag. 67). | Sobre el autor Me llamo Johann-Christian Hanke, tengo 38 aos y soy alemédn. Estudié literatura y filologia, pero dado que con esto es dificil ganarse la vida, cambié mis estudios por la informatica. Desde 1996 trabajo como autor y periodista especializado auté- nomo, y cada dia me gusta mas mi trabajo. Y a los lectores también: hasta la fecha he pul do 35 libros y 30 cuadernos. Suelo escribir re- ‘gularmente para revistas alemanas de informa- tica. Pero no he olvidado lo dificil que puede ser es- te tema; yo también di mis primeros pasos y tuve que aprender por mi cuenta con gran es- fuerzo. Por eso te explicaré todo lo que sé tal como lo comprendi. ‘Suplemento con archivos de ejemplo {Tienes problemas al copiar el cédigo? {No hay forma de que un script te funcione? En vw pe- ‘cuadernos.com encontraras gran parte de los ejemplos para su descarga. Y para terminar, sélo me queda desearte que disfrutes aprendiendo PHP. Johann-Christian Hanke ‘yew. jchanke.de 4 {Qué es PHP y para que sirve? éQué es PHP y para qué sirve? éQuién inventé PHP? Pinte (e)at- Wed Lag Extrahamente, no es inglés, ni francés, ni espa- Aol, Fue el canadiense-danés Rasmus Lerdorf, Los daeses son ciudadanas del mundo: http:/Merdorf.com Corria el afio 1994. Rasmus queria comprobar Ja acogida que tenia su curriculum publicado en linea, y sin perder tiempo creé una'serie de “comandos de servidor”: acababa de crear las “Personal Home Page Tools” (PHP). Sin em- bargo, lo mas importante en la Web son los fomularios, por lo que no es de extraiiar que Rasmus anadiese pronto un Form Interpreter (FI) para el anélisis de formularios, En junio de 1995, Rasmus Lerdorf present la primera versién de PHP al gran puiblico, y lo hizo a través de un mensaje en el grupo de no- ticias comp.infosystems.www.quthoring.cai que levaba por titulo “Announcing the Personal Home Page Tools (PHP Tools) version 1.0." Rasmus Lerdorf publics sus “tools” bajo la li- cencia piblica GNU. Estaban escritas en C y, ya en aquel entonces, permitian proteger pagi- nas con contrasefa o crear un libro de visitas. La comunidad de desarrolladores empez6 a in- teresarse por PHP/F1 y en poco tiempo PHP se convirti6 en un elaborado trabajo de equipo. La tiltima versi6n disponible de PHP es la 5. Actualmente PHP se utiliza como acrénimo de “Hypertext Preprocessor” es decir, como pre- procesador de paginas Web. 2Qué es PHP? Un lenguaje de programacién. mejor atin: un sencillo lenguaje de secuencias de comands (scripts). Se integra directamente en las paginas HTML y es interpretado por el servidor. Puesto que fue creado para la Web, s6lo puede hacer cosas que sean necesarias en la Web. PHP no arrastra ningin lastre innece- sario como ocurre con otros lenguajes, por lo que se puede aprender muy fécilmente. Como ya hemos dicho, PHP es interpretado por el Servidor Web. {Pero qué ocurre exacta- mente? El navegador envia una solicitud http al servidor Web (una peticién de llamada de la pagina), El servidor reacciona, lee la pagina PHP, ejecuta los comands que ésta contiene y envia el documento montado al navegador. Puesto que PHP se ejecuta en el lado del servi- dor, el usuario nunca llega a ver el cédigo PHP, sino que se limita a recibir el resultado final en formato HTML. Diferencias entre JavaScript y PHP Si tienes algtin conocimiento de JavaScript, quizés gracias a la lectura de otro cuaderno de esta coleccién, te propongo que compares am- bbos lenguajes. JavaScript también se escribe directamente dentro del cédigo HTML. Sin embargo, el cé- digo sf esta siempre a la vista del usuario. ¢Por qué? Porque JavaScript slo se interpreta des- pués de descargar la pagina del servidor. Es decir, JavaScript es interpretado por el cliente, por el navegador. Y eso ocurre mientras mira- ‘mos la pagina. Los problemas que conlleva son conocidos por toclos: cada navegador se comporta de forma ligeramente distinta con JavaScript y, si el c6- digo es desactivado por los usuarios detracto- res de JavaScript, todo deja de funcionar. En este sentido, PHP cuenta con una gran ventaja: cuando funciona, funciona, y lo hace en todos Jos navegadores. Lo primordial es que tu pro- veedor dle servicios oftezca un servidor Web ‘con soporte para PHP. Qué es PHP y para qué sirve? 5 Modelo de licencia de PHP Corea Clie ee oa eal PHP no cuesta ni un céntimo. Este lenguaje de programacién se distribuye en el marco de una licencia open source, por lo que el e6digo fuen- te es abierto y cualquiera puede consultarlo. Se trata de un modelo de licencia que me pare~ ce muy positivo, El software open source nun- ca “llamaré a casa” sin avisarnos ni nos espiar alo gran hermano”. Habitualmente, PHP se instala junto con el servidor gratuito Apache. Apache es el servidor Web mas popular en la red. Alojamiento adecuado De acuerdo, PHP no cuesta nada; pero si que- remos afadir PHP a nuestro sitio Web, necesi- taremos un proveedor de alojamiento que ofrezca soporte para PHP. Deberds tener este factor en cuenta a la hora de elegir tu provee- dor, ya que de lo contrario no funcionaré nada. iensasotutionsofrece soporte PHP/MySQL desde 3,95€ al mes Piensasolutions es un proveedor espaiiol con aftos de experiencia, y su oferta ofrece una muy buena relacién calidad-precio. Sin embar- go, hay muchas otras posibilidades. En Espana, Por ejemplo: www.atsys.es 0 wiwwascens.com ‘Aunque también se puede contratar un servi- dor en Estados Unidos: vnw.dreamhost.com. {Qué puede hacer PHP? Todo. O easi todo lo que un autor de sitios Web ambicioso pueda imaginar. Necesitas un contador o un libro de visitas? Ninguin problema. En pocas lineas de cédigo habrés terminado. Quieres mostrar la hora o utilizar cookies? No hay nada més sen- cillo. Quieres comprobar si se ha rellenado el campo de un formulario? También es muy sencillo. Puedes volver a mostrarle al usuario todos los datos det formulario. ‘Sin embargo, PHP es especialmente apreciado por su gran compatibilidad con casi todos los sistemas de bases de datos imaginables. La combinaci6n mas usual en este sentido es PHP con MySQL, puesto que este sistema de base de datas es gratuito. a santisima trinidad compuesta por Apa- che, MySOL y PHP se ha convertido prict- | camente en sindnimo de publicacién Web | asada en una base de datos. Sin embargo, para empezar, no necesitars MySQL: verds que la mayoria de cosas también se pueden hacer sin base de datos. De todas formas, si te interese el tema, hablaré de MySQL en mi siguiente cuaderno dedicado a PHP. Si el sistema de programacién esta mon- tado sobre un servidor Web Linu, se suele hablar de LAMP (Linux - Apache- MySQL - PHP), mientras que la variante que propongo para los archivos de prueba de este cuadero, es WAMP (W=Windows). UEs facil programar? Depende. Si se tiene experiencia previa, resulta mis facil aprender un segundo lenguaje de programacién, de forma parecida a lo que ocu- re con una segunda lengua extranjera. Sin embargo, al principio es bastante complicado. También debo admitir que yo necesité algiin tiempo hasta llegar a comprender correctamen- te conceptos como el de las expresiones condi- cionales o los bucles. ;Y todavia sigo cometien- do fallos! Por tanto, no hay que desesperar si de buenas a primeras no se entiende mucho. Intentaré ex- plicarlo todo desde el principio de forma tan sencilla, detallada y clara como pueda. Mas adelante, las cosas se iran complicando. 8 {Qué es PHP y para qué sirve? La paciencia es la madre de la ciencia Al igual que cuando se aprende un nuevo idioma, en el caso de los lenguajes de progra- macién tampoco hay que olvidar el dicho de que la paciencia es la madre de la ciencia. De- dica tiempo a PHP. Repite los antiguos scripts. Prucha algo nuevo. Busca mas material de aprendizaje sobre el tema. Analiza los scripts disponibles en Internet y adptalos a tus nece- sidades. Hay muchas cosas que son simplemente fruto de la experiencia. Manual de PHP @Quieres saber mas? Entra en Internet y des- carga la amplia documentacion en linea y el ‘manual oficial de PHP. Como obra de consulta de funciones y comandos, yo recomiendo la traduccién al espanol del manual oficial de PHP: www. pho.netimanualles! Si deseas descargar el documento directamente a tu equipo local, accede a: wuw.oho nevidownload-docs. oho Aqui encontraras ef manual en version HTML, como documento PDF, para Palm Pilot e inclu- so como archivo de ayuda de Windows. Esta uiltima variante es la que me parece mas reco- mendable. Para todos los demés tipos de archivo, necesi- faremos un programa capaz de descomprimir archivos RAR (por ejemplo WinZip). Sin em- bargo, el archivo de ayuda de Windows se puede descargar directamente en formato CLIM (extensién . chm). El manual de PHP esd disponible como archivo de ayusta dde Windows Para consultarlo, basta con hacer doble clic en este archivo y se abriré el manual. Desde aqui sse pueden consultar todas las funciones y co- mandbs. Yo siempre tengo esta ayuda funcio- nando en segundo plano para resolver dudas. Instalar un servidor local con PHP 7 Instalar un servidor local con PHP Si quieres aprender PHP, debers poder probar los scripts que crees. Siempre podrias publicar cada archivo que programes en tu servidor Web remoto con soporte para PHP y probarlo, Esta seria la solucién més sencilla, pero a largo plazo también la mas cara, sobre todo si toda via no dispones de una conexién a Internet de alta velocidad y tienes que conectarte a Inter- net mediante el acceso telefonico a redes. Hay una forma muy fécil de ahorrarse todo este trabajo. Servidor Web Apache Mi sugerencia es que trabajes offline, es decir, en tu propio PC. Instala en él el mismo pro- grama que se ejecuta en el servidor de tu pro- veedor: el servidor Web Apache. Para poder ““reproducir" los ejemplos que presentaré en este cuaderno en tu disco duro, deberds insta- lar un servidor Apache local con PHP. Que no cunda el panico: el servidor Apache no es nin- guna gran maquina que vaya a ocupar espacio en tu casa. Se trata de un programa de cédigo abierto que se puede instalar en el disco duro. Antiguamente era necesario descargar e insta- lar por separado cada uno de los distintos ele- mentos: servidor Apache, PHP, MySQL, etc. Ademés, después de la instalacién habia que aplicar una serie de ajustes de configuracién. Para ello habja que recurrir a destripar cripti- cos archivos de texto, provocar que no funcionase nada. Pero eso ‘es cosa del pasado: hay otra solucién mejor. pe Por suerte, existe un fabuloso programa que puede instalar por ti todas estas cosas de forma automatica y (en el 99% de los casos) también se encarga de configurarlas correctamente, El paquete inclu + Servidor Web Apache + PHP y MySQL. + phpMyAdmin eee (Detrés de phpMyAdmin se esconde una herramienta para configurar y administrar ba- ses de datos MySQL. Lo necesitaremos en el proximo cuaderno, en el que también trataré sobre MySQL). Este fantastico paquete de instalaci6n se llama XAMPP y se puede descargar gratuitamente desde www apachefriends ora/en/, XAMPP es sin dala mejor y mas sencilla herramienta de instalacion para PHP y MySQL. Las ventajas de XAMPP hablan por sf mismas: * XAMPP siempre esté al dia se actualiza y ajusta cada dos semanas. Por ejemplo, préc- ticamente al mismo tiempo que la nueva version 5 de PHP también aparecié un XAMPP con PHP 5. + XAMPP es facil de instalar y muy fiable. + XAMPP ocupa poco espacio y no crea en- tradas en el registro de Windowss.a menos que se utilice la variante con instalacior. Pa- ra desinstalarlo, basta con borrar la carpeta XAMPP que se crea durante la instalacién. XAMEP es obra de mis compaferos autores Kai Oswald Seidler de Berlin y Kay Vogelge- sang y Carsten Wiedeman. Kai, Kay, Carsten otros “friends” son, pues, los “Apachefriends” Gracias a su genial herramienta, fomentan la expansion del servicior Apache. Advertencia previa: con esta herramienta sagerats oda os oo asos. Sin embargo, eso significa que en un ‘1% de casos, es posible que no funcione por diversos motivos, 8 Instalar un servidor local con PHP escarga de XAMPP XAMPP funciona bajo Windows a partir de la version 98, Sin embargo, también existen va~ riantes de XAMPP para Linux y Mac OS. Qué versién de XAMPP es la adecuada para ti? Para mis explicaciones, supondré que la que te i teresa es la variante para Windows. Pero tam- bien en este caso existen tres posibilidades. Yo recomiendo el método B: Instalaci6n sin \ ieee are de instalacion ocupa ‘unos iy seaceee - ‘ocuparemos Accede a waw.apacheftiends.ora/en/xampp- windows himl y busea el vineulo XAMPP 1.5-x (0 superior) ee su Descarga la variate comprimtita con 7-Zip, es la que ‘cup menos Haz clic en la entrada EXE (7-zip) y espera unos instantes. Se abrir un pagina de Source Forge, en la que deberas seleccionar el mirror desde el que descargar el archivo. Haz clic en cualquier de los vinculos Doziilond de la co Jumna Download y tras unos segundos se ini- ciaré la descarga. Instalaci6n de XAMP Cuando termine la descarga, deberias tener en. tu disco duro un archivo llamado sainop~ vein 0 similar. (La x corresponde a un mimero de version, que puede ir desde 0 hasta 16 0 mas). Para nuestros ejemplos, instalaremos el nuevo sistema en la carpeta : \apachefriends Descomprimir el archivo .exe ‘Descomprime el archivo .exe directamenteen la carpeta C:lapachefriends. Para ello, haz do- ble clic en el archivo xaiopisina2~1.5.x-exey selecciona la carpeta de destino en la ventana del cuadro de didlogo: Bn este cundro de didtogo debe figurar CAapachefriends\. Para confirinar ta acci6n, haz cic en “Exitact”, De este modo habremos descomprimido XAMPP en la carpeta apache triends. Ten pa- Ciencia, la operacién puede durar unos minu- tos-al fin y al cabo, los archivos han sido muy bien comprimidos por 7-Zip. Instalacion de XAMPP Si todo ha ido bien, XAMPP se habré copiado en la ruta C:lapachefriendstxampp. Comprué- baloen el Explorador de Windows. No aparece ninguna Mamada apa~ hateLanst resions[f) pars actual Abre la carpeta xampp y haz doble clic en el ar- chivo setup_xampp.bat. Inicn ta instalacén de KAMP abriendo el archivo ccorrespontiente. Se abrird una ventana de DOS. Espera un ins- tante a que se inicie la instalacion. Cuando el proceso termine, tendremos que presionar cualquier tecla del teclado para cerrar la venta- na de DOS. XAMPP ya esta perfectamente ins- talado. Instalar un servidor local con PHP 9 atest CU et ‘Ya podemos iniciar el servidor Apache y el servicio MySQL. Para ello, abre la carpeta C:lapachefriends\xampp y haz. doble clic en xompp_start .exe para iniciar el servidor Apa~ che y PHP (y también MySQL) de una sola vez. xampp.restariexe —xampp_start.exe ‘amep.stop.exe — xanppchanges.ixt Elarchivo sampp_start.eveinicia Apache, PHP y MySQL. En ningiin caso deberas cerrar la ventana de DOS que abre XAMPP. Déjala abierta, ya que esta ventana garantiza el funcionamientode Apache y MySQL. Para facilitar las cosas, puedes crear un acceso directo a la carpeta xaspp en el escritorio. De este modo podras acceder répidamente a los archivos para iniciar y detener el servicio. eFunciona Apache? {Quieres comprobar si funciona todo corree- tamente? Abre el navegador y escribe hetp://tecainost/ en la barra de direcciones, yy presiona into). Se abriré una pagina inicial, en la que deberss hacer clic en Spanish, XAMPP te dard la bienvenida con su propia Pagina index.nen!, y lo hard en espaitol. Mas adelante podemos eliminar esta pagina. cena yen to atm (=) XAMPP for Windows Si todo ta ido bien, vents esta pagina. El servidor Web local Apache ya funciona, y la pagina principal de XAMPP también ofrece un par de demostraciones. Es asombrosa la facili- dad con la que se instala XAMPP. Si deseas detener el servicio, basta con hacer doble clic en el archivo xampp_stop.exe. Ademés, no estas limitado a tener que escri- bir heep: //lecathost, De forma alternativa, también se puede escribir hetp://127.0.0.1, Inchuso podemos usar | ntep://nombredelordenador, He decidido agregar un marcador de esta pa- gina a mi navegador Firefox para acceder mas. rapidamente a “Localhost”. ems ora agregar un marcador,presiona (Coal Si has “comprendido” el principio de la insta~ lacién, observarés que XAMPP es muy fiable y raras veces da problemas. En la mayorfa de ca- 505 no es necesario realizar ningtin tipo de ajuste de configuracién, ya que todo se instala ¥ configura correctamente de forma automati- ca. Las opciones las fuera de line, no pars pu bl teal en la Web. Resolucién de problemas Ocupémonos ahora de los problemas con los que alguna vez me he topado cuando Apache no se dejaba instalar correctamente. Puede de- berse a distintas causas: + Hay otro servidor Web local activo, por ejemplo TIS (Internet Information Server) en el caso de Windows 2000 o XP Professional. En ese caso, deberds desactivarlo antes de iniciar XAMPP. + Algtin programa antivirus funcionando en segundo plano est bloqueando XAMPP. En caso de dudas, es mejor apagarlo. (Pero 10 Instalar un servidor local con PHP después de usar XAMPP vuélvelo a activar: la seguridad ante todo). * Un firewall local no permite el buen funcio- namiento de XAMPP. En caso de dudas, es mejor apagarlo temporalmente. * Siusas Skype (vniwu.skype.com) para tus Ha- madas, el conocicio programa de telefonia gratuita, debes saber que Skype bloquea el puerto 80 y la tinica solucién es desactivarlo completamente. gTodayia no se ha solucionado tu problema? Consulta la lista de preguntas frecuentes de XAMPP en: apachefnends ota/en/fac y lee todas las preguntas y respuestas (en in- gles). Pe eRe M UL Tienes varios equipos conectados en red? El Liltimo método de acceso al host local mediante el nombre del ordenador correspondiente tam- bin funciona en redes con varios PC. Escribe hetp://epe/, sihas instalado las paginas Web enel equipo Pepe. Los usuarios de otros equipos podran acceder a tu pequena Web a través de HTTP. Tener un servidor Web HTTP propio es una excelente posibilidad: ideal para una Intranet. jndoows,htrnl cam Has instalado XAMPP en tuna red de em- rest Reg he ao Sete pled fae ‘Sin embargo, para las explicaciones del cua- UDOnde esta la pagina de inicio? Volvamos a la pagina inicial predeterminada. Hasta ahora, Apache te muestra junto con XAMPP una pagina de prueba propia, En nuestro caso, la pagina se encuentra en C:lapachetriends\xamppihtdocs Sin embargo, seguro que te interesard poder poner tu propio contenido. Tu primer documento PHP Abre el editor de textos y crea un nuevo do- cumento PHP. Lo flamaremos :rto.php (exten- sion .php) y lo guardaremos en la carpeta hntdoes (C:\apachefriends\xampp\hidocs). Nuevo archivo con clic derecho Sigue estas instrucciones: 1, Haz clic con el botén derecho en la carpeta en la que desees crear el nuevo documento PHP -en nuestro caso C:lapachetriends\xamppihtdocs. ALhacer clic, aseguirate de hacerlo en un punto va- cfo de la carpeta. 2, Selecciona Nuevo | Documento de texto. 3. Aparecerd un nuevo icono que llevar por Nombre Nuevo Docunanto de texto. txt. Puesto que el nombre esté seleccionado, basta con escribir encima info.php. Sial Windows te advier- Se Seere clean tes exten al on chivo, puedes ignorar el aviso. Haz clic en Si. 4. Elarchivo de texto (vacio) info.php ya se encuentra en la carpeta htdocs. 5. Abre el archivo. Tras hacer doble clic, pro- bablemente deberss seleccionar el programa dle una lista para abrir siempre este tipo de archivo. En el cuadro de didlogo Abrir con selecciona Bloc de notas. Activa la casilla para que este tipo de archivo siempre se abra con el Bloc de notas. {Te parece demasiado complicado? En ese ca- 50, abre el Bioc de notas y arrastra el archivo correspondiente a la ventana abierta del pro- grama. La funci6n phpinfo() Observa el Siguiente cédigo HTML. La parte PHP se reduce a la llamada a la funcién de PHP phpintot). ead> Instalar un servidor local con PHP 4 shimInformacién sobre PHP Guarda el documento. Tu primera plgina PHP: este es et aspecto del e6digo fuente de info php en et Bloc de nota, Puesto que el archivo se encuentra en la carpe- ta hedocs (la raiz), basta con escribir en el na- vegador: http: //locathost/ info.php (Bice Fh el Sis6lo escribes http: //1ocalhost/, se abrir | Ta pagina inicial de XAMPP. | Si todo va bien, deberias ver algo similar a esto: otoomacion sobre PHE —————— _——— {Felicidades! PHP 5.0.5 se ha instalado correctamente, Hojea el documento por encima. Ofrece mus chisima informacién sobre la versién instalada de PHP, el entorno de servidor, el sistema ope- rativo, las rutas de acceso... la licencia cle PHP. BVM li Cee edad 019 Pronto comprobards que para crear paginas PHP no hay que cumplir ningtin requisito es- pecial. Un sencillo editor de texto servira per- fectamente como entorno de desarrollo. En el ejemplo anterior, hemos usado el Bloc de notas de Windows. Sin embargo, seria mejor pro- ‘gramar usando un entorno algo mas comodo: un “verdadero” editor de PHP. Para empezar, podemos usar la version free- ware 08. Si te gusta el programa, siempre puedes adquirir la ultima version comercial, que cuesta 75 €. La versién comercial no s6lo incluye més funciones, sino que sirve como apoyo para el desarrollo futuro del programa. Descarga de PHPEdit Para descargar PHPEdit 0.8, accede a la direc- cién www.waterproottridownload!. Abre la carpeta PHPEdit,, después IDE/y finalmente webinstall/ Desde aqui, deberds descargar el archivo eus- Git_Pullpackage_0.8.0.25.tar.gz.Ocupa ‘unos 19 MB. Extraccién de PHPEdit A continuacién, deberds extraer los archivos de este archivo comprimido en formato tar. Fl proceso es doble: una vez para descomprimir y luna segunda vez para extraer los archivos. | dit_Pulipackage_0.8.0.25.tar. 12 Instalar un servidor local con PHP Instalacion de PHPEdit Ahora ya podemos instalar PHPEdit. Haz do- ble clicen pupeditsetup.exe y sigue las ins- trucciones de instalacion. Esta versién del pro- ‘grama est’ disponible en inglés, francés 0 ale~ mén. Optaremos por el inglés: nai ame Eanes ‘alco saa Instalo PHPEiit paso a paso y acepta licencia de Ten paciencia: la instalacién de PHPEdit tarda- i unos minutos, incluso aunque tu PC sea po- tente, Cuando abras el programa por primera vez, te preguntara si deseas que escriba unos ajustes predeterminados. Contesta Yes, El pro- rama te preguntard con qué tipos de archivo deseas asociatlo -activa como minimo la casilla php y haz clicen OK. Primeros pasos con PHP 13 Primeros pasos con PHP Por fin nos ponemos manos a la obra. En este capitulo, presentaré los fundamentos de la no- tacién de PHP. Te mostraré cémo presentar da- tos sin ninguna complicacién. Asimismo, también te presentaré las fabulosas variables. Pero vamos por partes, empezare- ‘mos por el principio. TeiteMe (Medal ea el Lo primero que deberemos hacer es iniciar PHPEdit y crear una carpeta de ejercicios a la que llamaremos pies. Dicha carpeta deberd encontrarse bajo la carpeta raiz htdocs. Por tan- to, siguiendo nuestro ejemplo, la ruta de acceso serd: C: \apachefriends\xanpp\ntdocs\phps. Podemos usar el mismo PHPEdit para crear la carpeta. En la esquina superior izquierda det programa verds el médulo File Explorer. Acce- dea la carpeta hedors y haz clic en el icono co- rrespondiente para crear una carpeta, en la es- quina derecha: ata sf Se ha creado una nueva carpeta lamade Netw Folder. Sobrescribe el nombre predeterminado de la carpeta, cambialo por paps. Aqui es donde guardaremos todos los archivos de ejemplos y oad a : i f en C: \apachefriends\xampp\htdoes \phps, | pee del navegador { Teepe Tecathese pees Maem lM iL Imte | 18 Hello world! (Hola mundo) suele ser el primer script que se aprende en cualquier lenguaje de programacién. Puesto que no queremos rom- per la tradicién, te presentaré el conocido script Hello world en PHP. Abre PHPEdit, si es que todavia no lo esta. Po- drés ver un archivo vacio, preparado para que ‘escribamos en él los comandos deseados. Tiene este codigo: @version $1d$ Acopyrignt 2003 1 Sin embargo, este archivo:no nos es de mucha ayuda, ya que no se trata de un archivo HTML, sino de un archivo PHP puro. Ciérralo y crea un archivo HTML vacio. Para ello, basta con seleccionar Fite | New | HTML. Aparecerd un ar- chivo HTML vacio en PHPEdit. Prepara el ar- chivo como sigue. Deja vacio el espacio entre las etiquetas

. telle World</itie> </vead> <body> <hl>The fanotis Hello worid-Script</ni> > </p> </body> </ntml> {Por qué lo escribo en inglés? Porque PHP es tun idioma internacional, y porque sin duda querrés presentar nuestro sitio Web a un pui- 14 Primeros pasos con PHP blico internacional. Y porque deberias practicar tus conocimientos del idioma... y no me que~ dan ya mas argumentos. En cualquier caso, el cédigo de la mayoria de ejemplos del cuaderno estard en inglés -no te preocupes, son muy faci les de entender. Guardar el archivo Un momento, nos estamos olvidando de lo ‘més importante: guarda el archivo inmediata- mente, y en la carpeta correcta: php. Elnom- bre del archivo debe ser belio.phe. Si? Haz clic en la carpeta correspondiente en la parte inferior {el explorador de archivos se muestran todos los archivos contenidasen la carpet seleccionada, Para familiarizarnos con el funcionamiento del programa, cerraremos el archivo. Para ello, se- lecciona File | Close o (Contro!)+{w). Y abrelo de nuevo, haciendo doble clic en el nombre det archivo en el explorador de archivos. Etiquetas PHP Ya basta de abrir y cerrar: a partir de ahora, programaremos en PHP. Y para ello, una regla de oro: las etiquetas del céigo PHP se insertan sencillamente en un documento HTML co- rriente. En principio no importa en qué punto del documento se insertan. (En el ejemplo que veremos, insertaremos las etiquetas PHP entre las etiquetas HTML <p></5>). ‘Lo importante es saber identificar que se trata de cédigo PHP. La notacién de PHP noes complicada. Para iniciar un parrafo en PHP, se debe escribir: <?php Para terminarlo, insertaremos: Mostrar datos con echo La siguiente linea de cédigo emite un texto que escribe “Hello world” en el documento HTML. Para mostrar los datos, recurriremios a la ex- presion echo. o> FO Bimeemnes ‘The famous Hello world script Salucla al mumdo de PHP diciendo Hell, En el patrafo <p></p> que antes hemos dejado en blanco, escribe estas Iineas: <?php echo “Hello world!" Abre el documento en el navegador escribien- do en el campo Direccién: http: //localhost /php5/hello.php. ki Si todo ha funcionado, deberias estar viendo las palabras Helto warld en el navegador. Por cierto: puedes escribir el texto entre comillas simples o dobles, en este caso no importa. Etiquetas HTML dentro de echo Quieres dar formato a la palabra Hello en ne- rita? Utiliza las etiquetas HTML correspon- dientes, insertndolas de la siguiente forma: echo "<b>Hlelloc/b> World!"; Como pueces ver, es posible mezclar instruc- ciones en HTML y PHP tranquilamente. Eso mismo es lo que hace que trabajar con PHP sea tan flexible. Punto y coma para final de linea Quizas te estés preguntando para qué se nece- sita el punto y coma al final. Lo cierto es que es obligatorio: para senalizar el final de una linea, hay que usar un punto y coma Primeros pasos con PHP 15 echo "eb>Hello</b> world!"; Al igual que en C++, Java 0 JavaScript, los sal- tos de linea en el cédigo PHP exigen un punto y coma. Sobre todo si el script tiene mas de una iinea de cédigo, ya que de lo contrario aparece dn mensajes de error. Te te et poe oe a OO GB IBY Ov Cae Parse error pase sor, menpected T_ECHO, expecting ot in C:apachefriend:\xampphidece phpSikelo,php on ine 10 ened @ Un error tipico: falta el punto y coma. Donde hay una regla hay una excepeidn: si se define una funcién con la palabra function (), no hay que hacer tso del punto y coma. Tam- poco se permite un punto y coma después de Sf, else, while, switen etc. En estos tiltimos casos te lo recordaré cuando sea necesario. En el caso de JavaScript se puede prescindir de Jos puntos y coma siempre que se inserte un salto de linea, pero no cuando se trabaja con PHP. " Sien PHP nos olvidamos tun punto y coma, Re ae Comentar el codigo Mi experiencia me dice que trabajar con co- mentarios es muy recomendable, ya que ayuda a mantener la perspectiva. Por eso deberias anotar lo que hace cada linea de cédigo. (Quizas te pareceré inditil hacerlo en scripts cor- tos, pero en proyectos grandes, después de semanas y meses de trabajo, seguro que no re- cordarés qué hace una determinada funcién 0 a qué hace referencia el undécimo paréntesis de cierte. :Nos apostamos algo? Sintaxis de los comentarios en PHP Para comentarios cortos, se utiliza una doble barra //. Los comentarios que ocupen varias lineas se suclen escribir entre /= ... */ 1/ fsto es un comentario cor (+ Este comentario puede ocupar varias Lines */ En los ejemplos més largos del cuadero in- cluiré comentarios coctos. Ademés, normal- mente divido el cédigo con espacios en blanco adicionales y lineas vacias adicionales. Me gus- ta indentarlo (aplicarle sangria) y verlo bien ordlenadlo. De todas formas esto no afecta al funcionamiento del cédigo, ya que PHP no lee las lineas vacias. ‘Los comentarios, espacios en blanco 0 lineas en blanco no afectan al rendimiento del pro- grama. En el ultimo capitulo te presentaré las reglas més importantes para ordenar bien el cdigo. ‘Te mostraré como puedes dejarlo todo bien or- denado automaticamente gracias a PHPEdit. Truco: descomentar {Para qué otra cosa sirven los comentarios? Pa- ra el diagndstico de errores. Si tras insertar ‘unas nuevas lineas de cédigo el script PHP de- ja de funcionar, comenta una linea y vuéivelo a probar. Sigue comentando lineas hasta que lo- gres detectar el problema. 16 Variables como comodin variable Variables como comodin variable Y llegamos por fin a las variables. No hay nin- atin lenguaje de programacién que no las utili- ce, Pero antes de nada, permiteme explicar en detalle el concepto de variable. Las variables son huecos de memoria en la memoria del ordenador. Imaginalas como con- tenedores que estan disponibles durante la eje~ cucién del programa. En estos “contenedores” se pueden “almacenar” valores mientras se ejecute el script. No importa si almacenamos ntimeros 0 texto (cadenas de caracteres).. En inglés, las cadenas de caracteres se sue- | Jen Mamar strings, ee Durante la “vida” de una variable, podremos acceder a los valores almacenacios en ella. Y no s6lo es0, sino que los valores de las variables también se pueden cambiar. Piensa, por ejem- plo, en el resultado del célculo de un carrito de Ja compra. Por cada nuevo producto que se agrega al pedido, aumenta el resultado. Y también el texto “crece”: asi, por ejemplo, es posible que inicialmente una variable s6lo con- tenga una palabra, pero al final puede almace- nar el texto de una pagina HTML completa Tipos de datos de las variables Ya he mencionado dos “tipos de datos”: de un lado, tenemos las strings, y del otro los ntime- ros. Los grandes lenguajes de programacién como C++, Visual Basic o Java subdividen es- tas categorias con gran precisién. Asi, en funcidn del lenguaje, junto a una string también tenemos integer (ntimeros enteros), boolean (valores booleanos), byte (ntimeros de 0-255), cioat (ntimeros de coma flotante), double, date, currency, variant etc. Cada vez que se crea (se declara) una variable, es necesa- rio asignarle un determinado tipo de datos. Si se aprende un idioma ast, enseguida se cae en la mas absoluta desesperacién. Por suerte, PHP es un lenguaje de seripts senci- Uo, que s6lo fue creado para la Web. Sus crea- dores han omitido todo aquello que no sea im- prescindible. En pocas palabras: cuando se tra~ baja con PHP no es necesario preocuparse por el tipo de datos. Los tipos de datos se recono- cen y asignan automaticamente. Al igual que JavaScript (que por regla general s6lo se usa en la Web) PHP es un lenguaje con “loose ty- ping’ ‘Nota all margen: PHP trabaja internamente con los tipos de datos string (texto), £0 ger (niimero entero), cioax (coma eae boolean como true/te: Y otro dato mas para los que conozcan JavaS- cript: no es necesario declarar las variables ca- da vez. Cuando ya se ha utilizado (inicializa- do) una variable por primera vez, ésta se con- sidera declarada. Sin embargo, puesto que nos interesa que tengas un buen fundamento, aprenderemos a declarar las variables. Nombres de variables permitidos {Qué aspecto tiene una variable? Ante todo, hay que recordar que el nombre de una varia- ble debe (a diferencia de JavaScript y cia.) em- pezar con el signo del délar (3). El resto del nombre es de libre eleccién. Por ejemplo, po- demos usar Snosbre como comodin para alma- cenar un nombre. ‘acentos, espacios en blanco ni ca~ ee neo _ tinguen maydsculas y miniisculas, por | quonny sete son arable iti ‘Tampoco se pueden usar como nombres de va- riables algunas palabras reservadas para PHP como while, ‘f, switch ete. Asimismo, tampo- co se puede empezar con un ntimero. Sin em- bargo, el guién bajo (_) esta permitido y se sue- Je usar como sustituto del espacio en blanco. Hello Mikkel, nice to meet ror 2Qué tal silo vemos con un ejemplo prictico? Crea un documento llamado variabiet php, Variables como comodin variable 17 Escribe el esqueleto de un documento HTML (-selecciona nuevamente File | New | HTML en. PHPEdit). Para este ejemplo, saltidaremos en inglés al editor de PC Cuadernos, Mikkel Franck: ake Oa Be N= ecto Deere, noe, G+ > BF DP) (Diretoareniterienteite | Variables Heo Mikel ceo mise | fo Lastring o cadena almacenada-en la variable se muestra en el navegador como HTML. Crea un nuevo parrafo escribiendo las etique- tas <p></p>. (No es necesario, pero segtin la norma HTML cualquier texto debe aparecer dentro de un elemento de bloque). Inserta las siguientes lineas PHP dentro del parrafo: <2php Silane = "Mikkel: echo "ilelle <b>same</b>, nice to meet yout": Abre el documento en el navegador. Si todo ha salido bien, deberias ver en pantalla el texto Hello Mikkel, nice to meet you! {Qué efecto tienen estas lineas? Ein la primera linea de cédigo hemos declarado la variable, y al mismo tiempo la hemos inicializado, En este ejemplo, la “rellenamos” con la string Mikkel. La segunda linea sirve para presentar el conte- nido de la variable con un aspecto mas pulido. | Atencién: la variable fares ual Ce eet ie ete Ge bin el eet Seep | ae eras vexers selsaetehe Importante: en esta ocasién, el texto que sigue a echo debe escribirse entre comillas, ya que es el unico modo de que PHP busque variables y analice su contenido. Si por el contrario, lo quie queremos es guardar un valor numérico para una variable, no deberemos usar comillas, Sin embargo, en el ejemplo anterior se trata de una cadena de caracteres, es decir de una variable del tipo string, Pero, como ya hemos dicho, no tenemos que preocuparnos por el tipo de datos en este mo- mento. PHP es incluso capaz. de convertir nti- meros (que hayamos escrito entre comillas por error) auitomaticamente del tipo string a uno de los tipos de ntimeros. Y viceversa Concatenar strings y variables Si sabes algo de JavaScript (u otto lenguaje de programacién), en este punto seguramente te estards preguntanco donde est el operador de concatenacién en la expresién con echs. Por que normalmente es necesario concatenar las cadenas de caracteres (la parte entre comillas) y las variables. Para ello, en JavaScript se utili- 2a el operador de concatenacién +, lo que siempre conlleva problemas porque el signo + se utiliza al mismo tiempo como operador aritmético. La buena noticia es que PHP es sencillo, por lo que no suele ser necesario concatenar variables con cadenas de caractetes. Esto supone una gran mejora en comparacién con JavaScript y otros lenguajes de programacién. Oy Te Teel me Meer HELL) punto (.) Como ya hemos dicho, por lo general no es ne- cesario concatenar cadenas de caracteres y va- riables. Es posible usar el operador de conca- tenacion, pero no es obligatorio. Sin embargo, hay una excepcién a esta regla, en la que deberas usar el operacor de concate nacién, por ejemplo para la emisién de valores, de funciones o arrays. Con raz6n, en PHP se cligié el punto (.) en lugar del signo de suma. Para que comprendas bien la sintaxis, te mos- traré el script “Hello Mikkel ” en una variante concatenada mas “complicada’’. Tendria este aspecto: <aphp ‘Same = "Mikkel": echo "Hello <b>" , Same . "é/b>, ni Pero el resultado en el navegador es exacta- mente el mismo. Comparalo con el archivo variabie2-php. 18 Variables como comodin variable Como evitar errores {Te has topado con algtin error en el script con este pequeno ejemplo? Comprueba el cédigo repasando la siguiente lista de control: + @Has cerrado cada linea con un punto y coma? A veces yo también me olvido de £50... + gHas empezado el nombre de la variable realmente con un signo de délar (5) y no un ampersand (<) 0 un signo de porcentaje (s)? Bs facil teclearlo mal porque las teclas estan muy juntas. = (Has insertado correctamente las comillas? Cada comilla de entrada exige también una comilla de cierre. = ¥ por tiltimo: zrealmente has accedido al documento en el navegador a través de hetp://Leealhoat ete. o lo has publicado enel servidor de tu proveedor de servicios compatible con PHP? Si abres el archivo “mormalmente” a través del sistema de ar- chivos no funcionar, ya que es necesario tener de por medio un intérprete de PHP. No hagas doble clic en el archivo para abrirlo, asi no funcionard. {Break 0 salto de linea? 19 Break o salto de linea? A continuacién, veremos los tipos de salto que No pasa nada especial. En la primera linea nos ofrece PHP. Para ello, partiremos del script hemos insertado un salto HTML (<b:>) y “Hello Mikkel” en la primera version, sin con- hemos afadido una segunda linea echo. Como catenar. Guarda el documento con el nombre cabria esperar, el resultado en el navegador es breail.php. Inserta la etiqueta <br> y, a conti- el siguiente: nuaci6n, otra fila vacia. Este es el resultado: <?php sName = "Mikkel"; echo "Hello <b>Sname</b>, nice to meet you!<be>"; ech "Thank you for coning!"; > Weir siete eal Mairsine Archive Estar Ver Ip SF OD BD Dhtr:itocahostitostrests.oho Break en la ventana del navegador Hello Mikkel, nice to meet you! Thank you for coming! Terminedo ‘Mediante la etiqueta <br> secren una mueoa linea en ta vista del navegador. A continuacién, observa las entrafias del archivo: echa un vistazo al cédigo fuente HTML. Para ello, si usas Firefox como navegador selecciona Ver | Cédigo fuente de la pagina (en Internet Explorer, Ver | Cédigo fuente): Vew:sources-Cotigp vente de:hitp://localbust/phpSIbreakt.phip- Mozilla Firefox DIRE) <meta bttp-equiv=" contente"texc/nemi: o: </head> <body> <hi>Sreak en la ventana del navegador</hi> <> Hello <boMikkel</b>, nice to meet you!<br>Thank you for coming!</p> </body> </hn Sin embargo, emel céigo fuente del archivo no sé puede apreciar ningtin salto de Kinea, 20 {Break o salto de linea? ‘Como podemos ver, en el eédigo fuente el tex- tono tiene ningtin salto de linea. Tratandose sélo de dos lineas no supone un problema, pe- ro si siguiesemos insertando instrucciones echo se crearia una linea infinita en el cédigo fuente. Aunque no supone un problema fun- cional, es un problema estético. El comando new line in Para mejorar el aspecto del cédigo se utiliza el comando new line, que en PHP se escribe de la siguiente forma: \a iSorpréndete! Modifica el script de break pho como sigue: <?php Silane = "uLkkel" echo "Hello <b>sNane</b>, nice to meet you!<be>\n"; hank you £or echo sng ns Observa que antes de la n (de new line) es ne~ cesario escribir una barra invertida. Escribe la sin espacio en blanco antes de la barra inver- tida. Guarda el archivo como break? -php y abre el documento. En el navegador no se aprecia ninguna diferencia con respecto a la versiGn anterior. La tinica diferencia esta en el codigo fuente del documento: Abvora también hay un salto de Kine “entre bastidores” Observa de nuevo atentamente ambos ejem- plos para ver la diferencia: ne> slo afecta al “primer piano” en el navegador. Sin embargo, con \n forzamos un salto de linea directamente en el cédigo fuente. El signo escape \ iInteresante! Acabas de conocer el signo “esca- pe” \ con un significado especial: el de salto de Iinea, Sin embargo, ademés de para eso, el sig- no “escape” también sirve para enmascarar de~ terminacos caracteres especiales que de otro modo seria imposible mostrar en pantalla, Enmascarar comillas y otros caracteres es- peciales {Quieres que en el script anterior el nombre aparezca entre comilias? Normalmente, las comillas en el cddigo fuente sirven para seftali zar el inicio o el final de una string, por lo que en realidad no se pueden usar. A no ser que las “enmascaremos” de la siguiente forma, en cu- ‘yo caso se mostrarén correctamente en panta- Ta echo Helle \"<b>$Name</b>\' to meet you!<br>"; Enmascara también las comillas simples (el signo del délar (5) 0 la barra invertida (\) siempre que quieras que aparezcan como HTML mediante ccho. Sin embargo, para ello es necesario que las comillas de la siting tam- bién sean comillas sencillas, como aqui: echo * Willi\'s Bar’? Enel siguiente ejemplo, por el contrario, la ba- ra invertida también se mostrar en pantalla aclemas de la comilla simple de Will’s, ya que las comillas exteriores de la string son dobles en lugar de simples: echo * WiLLEN's Barts iPruébalo y lo entenderas! Introduccién a las arrays 24 Introducci6n a las arrays Las variables estén muy bien, pero gqué ocurre cuando necesitamos almacenar varios valores en tuna sola variable? zY si estos valores guardan algtin tipo de relacién entre si? En estos casos se recurte a las practicas arrays, también conocidas como matrices o listas de valores. Atencién: la palabra array se pronuncia ira. _ La primera “a” es corta, y el acento recae en la liltima sflaba, Los dias de la semana como Eel Tal como nos indica la palabra “lista de valores”, Jas arrays se componen de varios valores, que PHP contard de forma interna. Al contador co- rrespondiente se llama valor indice o clave (key). La clave (aqui el contador) siempre se ini- cia con el valor 0. Este es también el caso de la mayoria de lenguajes de programacién, y suele provocar confusién. jNo lo olvides! El primer valor de una array eel primer val de wa aay despa ie {Qué tal si lo vemos con un ejemplo? Crearemos luna lista de valores con todos los dias de la se- mana. Primero te mostraré el método “largo” de hacerlo. Mi archivo de muestra se llama we2k- daysi.pnp. Lo bueno del método largo es tanto el valor indice como el valor de la variable se es- criben en una fila propia, lo cual mejora la legi- bilidad general. Al mismo tiempo, emitiré un valor de la array. Para ello se utiliza la siguiente sintaxis: Variable [valorindice] Si la variable se llama scay podriamos mostrar el cuatto valor de la siguiente forma: sdayi3 He aqui el cédigo PHP correspondiente a los i- as de la semana: como puedes ver, en este caso he optado por escribir los dias de la semana en espafol, manteniendo el nombre de la variable Sday en inglés: <2phe Sday[0} = "domingo"; Sday(1] = "lunes"; Sday(2] = "martes" Sday(3] = "nlércoles"; Sday[4] = "jueves" Sday[5] = "viernes"; Sday[6) = "sabado"; 7/ mostrar solo el miércoles echo Sday!2)+ Probar el script Este es el resultado visto en el navegador. El ter- cer dia de la semana es en realidad el cuarto, puesto que el lunes tiene el valor indice 0. ene Oe) Beane nme ine O Gi BM Grewrmeeasrerpeatansive ¥ Ox weekdaysl.php riercles Todos tos dias de la semana estén almacenados en una caeriabie, y aqui sélo miostramos et mircoles Arrays: método corto También existe otra forma de escribir arrays, corta, que te mostraré enseguida, Ten en cuenta que he dividido la linea después de la etiqueta <zpnp en varias lineas por falta de espa~ cio en este cuaderno, pero en los archivos de ejemplo la array es una sola linea <2php Sday = array("domingo", "lunes", "martes", “nigecoles", "jusves", "iernas™, "sdbado"l 7 Uf mostrar s610 #1 domingo echo Saay(o) Despugs de la palabra clave array sigue la lista de valores entre paréntesis. Los valores se divi- den mediante comas. La asignacién de las claves. (indexacién) se realiza de forma automitica. Comparalo con el archivo weekdays?..php. Vers que el resultado es exactamente el mismo. 22 Introduccién a las arrays DESC CIF uCUr melee.) Ahora ya conoces el fundamento de las arrays indexadas. Constan de una clave (key) y el va- lor correspondiente (value). La clave es un va~ lor indice que se asigna autométicamente em- pezando desde cero. Pero: como podriamos decir en PHP el dia de la semana que es hoy? De ello se ocupa la funcisn date() , conjunta- mente con el caracter de formato "w". Lo. harfamos de la siguiente forma: gatertw") Lo bueno dela funcion date) es que el 0 | también corresponde al domingo. Nos viene | como anillo al dedo, ya que la indexacién de las arrays también se inicia con el 0. Con el siguiente script podemos mostrar di- namicamente el dia de la semana. Pruébalo con el archivo woekdaye3 -php, que he incluido en el suplemento. <?php Sday = array("domingo®, Lunes", miercoles", "jueves", "sabado") ; date ("Ww"): ecko “Hoy es Sday[Sdaynunber! "7 Ge BF | YD Drrvvwsrenstosrediay Ov weekdays3.php Hoy es mares Es cierto: hayes martes, Espero jo estar confundiendo al lector con esta mezcla de idiomas: recuerd que los tromsres de las variables se pueden elegir libremente, por lo que pueden esiaren espail siempre que no usemtos caractres especiales. {UCOmo funciona el script? ‘Muy sencillo. En primer lugar, la array esté es- rita con el método corto. Al domingo le co- rresponde el 0, al hunes el 1, al martes el 2, ete. PHP se ocupa autométicamente de la numera- cin. A continuaci6n, utilizo la funcién ca te("w") para mostrar qué dia de la semana es hoy. Si hoy es martes, la funcién devuelve un 2. Sies un sébado, el valor devuelto es el 6. Si es un jueves, el valor sera 4. Este valor es el que se almacena en la variable saaynumber. Para terminar, incluyo ls variable ent la emision del dia, Y seiay(21 es martes, por lo que hoy (el dia en que escribo estas lineas) es un martes. Numero del mes ‘También podriamos mostrar el mes actual con date ("o"), que solo devolveria ntimeros del 1 al 12, correspondientes a cada mes. Por tanto, el recuento no empieza en 0. Volveremos a hablar de la funcion dave () mds adelante. Por ‘el momento, lo dejaremos a un lado. eel lala] CO GEC Ey con count() 2 Cuntos dias tiene 1a semana? Cuantos ele- ‘mentos tiene una array? Lo podemos saber {4- cilmente con la funcién count (). He aqui el script: <?php Sday = atray("domingo”, "Lunes", "martes", "aigrcoles", "jueves", "viernes", "sabado" Sdaynumber - date ("w") echo “Hoy es Sday | Sdaynunber) .<br>\ Selenentnumber = count (Sday)+ acho "La semana tiene Selementmumber aias.\n"? > Naturalmente, en este caso se escribe 1un 7 en el documento; no era nada complicado. Pero la funci6n count () es especialmente titil cuando no sabemos con antelacién cudntos elementos contiene una array, Assays Mazilla Fi 8 > & Brome Ov weekdays4.php Hoy es martes Para contor elementos de arrays podenios user la funcién count Introduccién a las arrays 23 Puedles encontrar el archivo correspondiente el ejemplo en el suplemento buscando weekdaysd.php. Arrays asociativas Estéis harto de los ntimeros indice? En ese ca- 50, trabaja con arrays asociativas, que no usan indices. En lugar de ello, como key se utiliza ‘un esquema propio que podemos definir noso- tros mismos. Eso es lo que significa “asociati- vas". También en este caso podemos escribirlas de forma desarrollada o abreviada: Forma desarrollada Supongamos que queremos almacenar las principales capitales europeas en la variable Scapital. Como “sutitutive del indice” que- remos usar el c6digo del pais, es decir 0, 9%, ¥R 25. Ningiin problema: el documento se Mama capital i.shp y lo puedes encontrar en el suplemento: <?php Scapital |'DE"] = Scapital|'DK'] = "Copenhague" Scapital| eR] = "Paris" Seapical["E8"] = "Madead™; echo Seapital (*68"12 erlin*? Forma abreviada con el signo de equivalen- cia (=>) Naturalmente también existe una forma abre- viada. Al igual que en la primera forma abre- viada, aqui también se utiliza la palabra clave array con paréntesis. Y al igual que antes, los valores de la lista tam- bign se dividen con comas. Pero aqui no sélo tenemos valores, sino también el “sustitutivo. del indice” (la key), que en nuestro caso es pe, bk, Ry ES. ¢C6mo se realiza la asignacién? Con el signo de “inferencia” (=>). Por tanto, es- cribiremos: <2php Seapital = array(*DE" => "Berlin", "Dk" ‘> "Copenhague™, "FR" => "Paria", *ES" => "Maaeid®) ¢ echo Scapital "ESI: La linea se leeria ast: para la key pi "se infiere” value Berlin, para la key OK “se infiere” value copenhasus, ete. El documento de ejemplo del suplemento se llama capitai2.ehp. Lens be ae PBs tee te Ge BS BD Bremitearonsrosiagin ¥ Oe capital2.php Madi Funciona: detras de este texto se esconde una array ‘sociation, ~Concatenar strings o no Las claves (keys) de nuestra array asociativa son strings, concretamente d&, D#, Pty Px. Por ese motivo podemos mostrarlas a través de acho Seapital ('ES"] Supongamos que deseamos mostrar la siguien- te frase: La capital de Francia es Paris, «Qué po- driamos hacer? En el caso de la variante como- da, sin concatenacién, las comillas de ecno y las de las claves de la array se “estorbaria mutua- mente”. Por tanto, no nos serviria. La solucién es concatenar las strings. Asi, podriamos hacer- Jo de la siguiente forma: echo “la capital de Francia es * . Scapital|*FR') > De este modo nos quitamos un peso de enci- ma. Pero tenemos otra posibilidad de redactarlo que funcionard sin necesidad de concatena- cién: rodeando la variable de Haves podemos “ineluirla” en la string. Incluso pademos in- cluir una pequema frase en la string sin necesi- dad de otra concatenacién: echo "La capital de {Seapital[!FR')]. ancia es Cémodo, zverdad? Compruébalo con el archi- vo capitals.pnip del suplemento, Mas adelante te mostraré como utilizar las arrays asociativas en relacién con formularios. EL truco es que PHP convierte automaticamen- te los pares atributo-valor devueltos por un formulario en una array asociativa, 24 Calculos con PHP Calculos con PHP Quieres contar con PHP? Por ejemplo, zpara calcular los precios de los productos de una tienda en linea? 20 simplemente para mostrar el impuesto sobre el valor anadido (IVA) de un pedido? Operadores de calculo Para célculos, podemos usar los operadores de céleulo que sin duda conoceras de programas como Excel u otros programas de hojas de cél- culo: +,-,"y /. Los principales operadores Estos son los principales operadores: Operador Significado Ejempio + ‘Suma (sa=15+Sc : Resta Se=80-1 = ‘Multipficacién | 12*3 t Division $x/ Sy ” Aiaie 1 Sit (Gignifca $i= si+1) 2 Resta} Si (significa $i = $i-1)_ Como signo de dedecimales, ae | | Un detalle importante sobre los decimales: no debemos usar una coma como signo de deci- mal. En lugar de ello, se sigue la norma inter- nacional, el punto. Incrementos/Disminuciones Te han parecido extranos los dos tiltimos ope- adores de la tabla anterior? Efectivamente, en PHP, al igual que en muchos otros lenguajes de programacién, también se utiliza el signo ++ y ~=-que incrementan o disminuyen un valor ent. En pocas palabras: scounter++ significa lo mismo que Scounter = Scounter + 1y seounter-- equivale a dcounter ~ counter 1. Esta sintaxis se introdujo para ahorrar espa- cio. Basta con recordar que -+ significa uno mas. Sumas simples Para abrir boca, empezaremos con una suma sencilla. Guarda el script como suma.:hp. El resultado se calcula a partir de snunbex_a = 12 y Snunber_b = 35 y se almacena en la varia- ble sresuit. Finalmente, la variable se muestra con ayuda de echo. Recuerda que los ntimeros se escriben sin comillas. <?php Snunber_a = 12; Snunber_b = 357 $result = Snunber_e + Snunber_br echo $result: ee a] Ga =e «BCD OY TB remureconasesresinmas +) O sumal.php Una swma sencilla. IVA de un valor neto ‘Qué te pareceria una multiplicacién? Calcula- remos el IVA a partir del valor neto. Si un pro- ducto cuesta 100 euros, en Espafia se le aplica- ria un impuesto sobre el valor aitadido (IVA) del 16,0% (el equivalente a 0.16). - Recordatorio: los decimales se indican con | punto en lugar de coma. i Visién general del script El célculo del IVA es sencillo: precioneto + 0.196 Observa el script de muestra. Puedes copiarlo y guardarlo como neto.phe: <?php Sprecionoto = 100; Siva = 0.167 Calculos con PHP 25° Sresultado = §precioneto * Sivar echo Sresultado: > Esta vez trabajo con las variables sprectoneto e Siva, a GB BY Bienmarenmesrese —¥ Ox neto.php 6 Lgico: i cuesta 100 EUR, el IVA son 16,0 EUR Puedes encontrar el archivo de muestra en el. suplemento buscando neto.pnp. Redondeo El script tiene un problema de redondeo. Qué ocurriria si el producto costase 101,98 euros ne- ‘tos? En ese caso el resultado seria 16.3168, es decir cuatro decimales. Pero en la vida real no. tenemos monedas tan pequeitas. En estos casos, podemos usar la funcién round() para redondear. La sintaxis basica float xound{float val [, int precision]) No te preocupes por esta forma de escribir la sintaxis de una funci6n, es la misma que en- contraras en el manual de PHP. Significa lo siguiente: la funci6n acepta dos ar- ‘gumentos, el valor propiamente dicho (tipo ‘oat, es decir un decimal) y la cantidad de de- cimales que se deben redondear (tipo integer). El resultado es una cifra con decimales. Pruébalo. Para redondear el valor 16,208 a dos decimales después de la coma, sélo tendriamos que escribir: echo round(16.208) 2); ‘Naturalmente, en lugar de la cifra nosotros uti- lizaremos la variable $:esitado. Y aqui te presento el script mejorado, corres- pondiente al archivo del suplemento round phi <2php Sprecioneto ~ 101.987 Siva = 0.1967 Sresultado = Sprecioneto * Siva echo round(resultado, 2) > dette Gite er Mwcaderes teenie Ane Q @ Sep BD D Brmiecstenttesiont & Or round.php 1632 El resultado det eleulo es 16,32. Ze (UT ELL) abe gt ce) El célculo que acabamos de hacer era muy sen- cillo. Qué tal silo modificamos para usar ple- namente los operadores de célculo? Calcula- remos el IVA partiendo del precio bruto. El cilculo no es tan inmediato: es necesario deri- var la f6rmula con ayuda de una regla de tres. En primer lugar, es necesario relacionar todos los valores entre si, El precio neto equivale al 100%. Para 100% también se puede usar un 1 El porcentaje de IVA real se deduce de la dife- rencia entre el precio neto y el bruto, He aqui mi ejemplo de muestra, Recuerda que las Iineas intermedias se deben escribir como ‘una sola linea, aqui aparece cortada por moti- vos de espacio. Lo he llamado bratot .php <?php spreciobrot Siva = 0.16: Seeaultado = Spreciobruto = Spreciobruto 7 (1 + Sivali echo round (Sresultado, 2); 2 = 119.6: Atencidn a los paréntesis, ya que de no usarlos PHP aplicaré la regla de precedencia de opera- dores (los operadores de multiplicacién y divi- sidn tienen mayor precedencia que los de suma oresta).. oe ey eae ee a Ow GBS ® Brwiteoreswresinar ¥ Ow brutol.php les En um precio bruto de 119.6 EUR, 16,5 EUR son IVA 26 Calculos con PHP 4Por qué es tan complicado? ine preguntaron algunos alumnos de mi cur so. No serviria simplemente usar 1.196 como factor? Claro, pero con mi variante soy flexible. No sélo me permite cambiar el precio bruto, sino también el porcentaje de IVA, ya que he usado una variable propia para cada valor. Quién sabe lo que puede cambiar en el futu- ro... quizas el proximo gobierno decida au- mentar el porcentaje de IVA. Formato con sprintf() jigue sin convencerte la forma de presentar las cifras? <Quieres mostrar la cifra siempre con dos decimales? No hay problema, para ello recurriremos a la funcién sprintf (). Esta fun- cién da formato a una string (o un mimero) y ladevuelve formateado. La sintaxis basica es: string speint€(etring format [, mixed args}? El segundo argumento esta claro, es donde pondremos la variable sresuivado. Sin embar- 0, para el primero deberemos preparar una instruccién de formato. Instruccién de formato para moneda Se trata de una instruecién de formato muy compleja que permite detallar exactamente el formato de un mimero llegando a poner los puntos sobre las fes. Siempre me recuerda a los cédiigos de formato de Excel. La instruccién de formato que tecomiendo se Hama £02 .2¢. La funcién correspondiente se Mama sprintt("¥01.28",, Svariable). Su cometido es mostrar siempre el valor de la variable con dos decimales. Te ruego que la copies tal cual y no preguntes por los detalles de esta instruccién de formato. Para comprobar cémo funciona puedes usar el archivo del suplemento sprint #.oho. <tene Spreciobrute = 119.67 Siva = 0.196; Sresultado = $preciobruto ~ sprectobruto 7 + sivali Sregultads = sprintf(*s01.26", ‘Sresultado) 7 echo "Spreciobrute EUR Stesultado BUR de IVA. denen weve En ue) uncasees Kenan aie OO @ en ao sprintf.php 119.6EUR conven 16.40 EUR de IVA. Deesta forma siempre se muestrar dos decimales. En cierto sentido, esta emparentada con round (]: se redondean una serie de decimales. Sin embargo, a diferencia de sound (), los de- cimales que faltan se llenan con ceros, Creacion y andlisis de formularios 27 Creacion y analisis de formularios Los formularios son uno de los inventos mas importantes de Internet. Si noexistieran, emo se podrian recopilar los datos de los clientes y enviarlos a los proveedores de servicios? Cémo podriames recibir la opini6n de un lector? Las primeras versiones de HTML ya ofrecian la po- sibilidad de crear campos de texto, mentis des- plegables o botones de opcisn. PENCE CM CNL Liles Para los siguientes ejemplos, supondré que tie- nes buenos conocimientos de formularios en HTML, ya que el esqueleto del formulario debe erearse usando HTML. Dejo por lo tanto en ma- nos del lector la creacién de los formularios. Pe- ro ze6mo se pueden analizar? ¢Y cémo se pue- den comprobar los datos de un formulario antes de enviarlo? Con PHP. Y es mas: es muy senci- lo. Con una serie de andlisis de distintos formula- ios comprobards lo fécil que es trabajar con PHP. Crear la mascara HTML En primer lugar, crea un documento HTML convencional al que llamaras forn.nte1. Correc- to, un sencillo documento HTML. Mi ejemplo tiene este aspecto. ve ZF Grevemsctestonutennas + Ox Rellena los campos (form.html) Tuaoate tidal aa eons HTML nos ofrece una mascara peri ta introduecion de datos, en este caso con uni canipo de texto | Encontraras mi ejemplo en la subcarpeta del suplemento llamada fozm1. Para que no pro- dentro de la carpeta del proyecto pps ala que puedes llamar form. | Este es el cédigo fuente HTML del documento, nuevamente en una variante bien sencilla: ehtml> <head> ctithe>Formulario HIML Tu nombres El atributo action Seguro que conocerds la sintaxis HTML. Des- pués de hacer clic en el bot6n Erroiar (submit) se activa el atributo action. ¢Pero qué ocurre exac- tamente? El atributo act ion significa accién del formulario, y en este caso lo que hace es enviar el contenido del formulario a una pagina lama- da analisis.php. No te preocupes, crearemos esta pagina mis adelante. Method: Zpost o get? AY qué significa el atributo method? Es el respon- sable del método de envio del contenido del formulario. Se puede usar tanto get como post. Sise usa netihod="set", los datos se incrustan a la URL, Seguro que te sonardn las largas direc- ciones con una interrogante. ees PD rwositocahosrsres tern ianalassrortestiamestaiiel arcades Perimangae | Ange analisis.php) Inrustado en ta URL mediante method =" get” Sin embargo, yo no aconsejo el uso de set, ya que de este modo se mostrarfan claramente:tex- tos confidenciales, como las contrasefias. Ade- més, con comentarios largos la URL se vuelve demasiado larga y complicada. 28 Creacion y analisis de formularios Personalmente recomiendo usar method="post". De este modo, el contenido del formulario (en nuestro caso slo un campo de texto con el nombre ¢iv{$ POST[*fizstName']}, encantado de saludarte."; Guarda el documento, rellena el formulario y haz clic en el bot6n Enviar. tir te P Seadees Meron ane © >| BS B Drermatonsmsieminn ¥ Or anilisis de formularios (analisis.php) ola Mike, ecannds de sade Le hemos dado la bienoenida personabnente al visitante Como ya hemos dicho, PHP trata los datos de formularios como la array asociativa Post y pone a nuestra disposicion los resultados a tra- vés de la key correspondiente. Te gustaria acceder al nombre del usuario? Es- eribe (3 Fost(firsexiane| | las llaves sélo son necesarias dentro de una string. {Sorprendido de lo facil que es el manejo de formularios con PHP? Con la ayuda de s_rost y el nombre del campo del formulario podemos acceder comodamente al contenido de dicho campo. Esta variante es la mejor y la mas segura. Pero existe otra posibili- dad. {Datos de formularios como variable? Anteriormente (antes de PHP 4.1) todavia era mis seneillo. Se podia acceder al contenido de tun campo de formulario llamado, por ejemplo, firstname directamente mediante $£irsttame. Por tanto, el nombre del campo del formulario se convertia en una variable. Sin embargo, esta sintaxis es antigua y por motivos de seguridad ya no debe usarse. Ademés, es posible que algunos proveedores de Internet ya no lo permitan. En esos casos, el elemento de configuracién register_globals del archivo php. ini figura en oft (register globals = 0f¢) porloquenose permiten los comportamientos antiguos de PHP. SU ewes Por fin hemos llegado a las estructuras i-e1se, tuna de las herramientas de control mas impor- tantes de cualquier lenguaje de programacién. Si (palabra clave if) la condicion (condition) es cierta, se ejecuta el caso A (case A). En caso con- trario, (palabra clave else) se aplica el caso B (case B). LE (condition) { case Az } else | case Br ) La parte e1se también se puede omitir. En ese aso, el conjunto tendria este aspecto: Af (condition) ( case Ar Llaves para bloques Aquif'se nos presenta un interesante detalle so- bre la sintaxis: las expresiones relacionadas co- mo funciones, bucles o estructuras if en PHP se suelen limitar con un par de llaves ( ). De esta forma, estas expresiones se agrupan en un blo- que. Creacién y andlisis de formularios 29 Después de escribir la lave de abertura, escribe siempre su pareja de cierre, y a continuacién, es- cribe las lineas de c6digo entre ambas Haves. La lave de abertura se debe colocar al final de la Ii- nea, después de un espacio en blanco. De esta forma te acordards de no poner un punto y co- mal final de esa linea. Para la llave de cierre, es mejor crear una linea propia. El hecho de olvidarse involuntariamente de una_ de las llaves es una fuente muy comtin de erro- res, Sin embargo, es poco probable que te en- cuentres en esta situacién si utilizas PHPEdit, ya que este pequefio y practico programa insertaré automaticamente la lave de cierre ©. Botones de opcion Para nuestro siguiente ejemplo, he “ajustado” li- geramente el formulario, En lugar del nombre, esta vez pediremos el apellido del usuario. Y, aclemas, le preguntaremos por el tratamiento deseado (lo que nos proporcionara su sexo). Para este nuevo proyecto, crea una carpeta nue- va y llémala ¢o2n2. Si lo deseas, puedes copiar los archivos de rormi y adaptar el cédigo. La pagina del formulario GS BY A Grmineananarettenatemret # Oe Rellena los campos (form.html) ® Se © Sen Troe oan ace ara conocer el sexo dél usuario, usamos botones de opcin Para empezar, examinemos el cédigo fuente del archivo forn.ntmi. Esta vez s6lo copiaré los da- tos especificos del formulario, es decir, el eédigo entre las etiquetas . Observa que no he llamado el campo de texto tirstvane (nombre), sino Last tiane (apellido).
radio” name="gender" sr. Je="radio" name="gender" "> Sra-
mente ya sabras de sobra lo que son los botones de opcién y cémo funcionan. Solamente se puede seleccionar una de ambas casillas. En este caso es justo lo que necesitamos, ya que s6lo se puede ser hombre o mujer. En el caso de los hombres, se almacena un 0 co- rrespondiente a masculino en $2081 (*gender" yssison mujeres un 1. La pagina analisis.php Llegamos por fin al andlisis del formulario. Adapta el script de analisis.pap. A continua- ci6n, presento el c6digo PHP, que analizaremos justo después. Observa también el espacio en blanco detras de Sr. y Sra: ]$_Posr{'1astNane") 1, eheantads de saludarte.\a"? Y este es el aspecto del archivo para nuestro ejemplo de nuestro Sr. Gonzalez: ¢: BY MY Drmimarairircrtonineate + Ow andlisis de formularios (analisis.php) ‘Hala Se Gone, escnind de ede Hombre o misjer? Con et “Sr.” detanit, est clarisime, Prueba lo mismo con Sra, Gonzflez, y no te olvi- des de seleccionar el sexo correcto. Asi funciona el script Como funciona el script? Muy fécil: si el valor de la variable corresponde a 0, se ejecuta el c6- digo entre las Haves. La parte if se cumple, y se escribe Hola Sr. en el documento final (con un espacio en blanco). Recuerda que como opera- 30 Creacién y andlisis de formularios dor de comparacién es obligatorio usar el doble signo de igual ‘Repito: como operador de comparacién en PHP se utiliza el doble signo de igual (==). eV la parte ese? En el formulario no hay nin- guna otra opcién posible que no sea una mujer. En ese caso se escribira Hola Sra. en el documen- to, y después PHP ejecutars la linea de codigo de debajo de la estructura i¢-eise. Se completa asi: (8_Posr(" lastNane"]} (es decir, el apellido), encantado de saludarte. ‘Ademés, he vuelto a hacer uso de una nueva If- nea (\n) pata dividir el codigo fuente. Colyer ( Colca mee eee) Ha llegado el momento de ocuparnos més ceta- ladamente de los demas operadores de compa- aci6n, El signo de: simple en PHP es el opera- Rie eee esl de error muy frecuente. A mi también me han fallado algunas consultas if por haber cam- biado por equivocacién el signo de igual do- ble por uno seneillo. En conclusién: hay que estar muy atento. En esta tabla te muestro los operadores logicos de com- paracién més importantes. Operador —Significado igual Idéntico (también coincide el tipo de datos) Diferente > Mayor que < Menor que > Mayor 0 igual que = Menor 0 igual que 88 (and) {i (0") Y lbgico, todas las expresiones se cumpien O l6gico, se cumpie como minimo una ex- presién Vision general de los openaitorestogicos y de comparacibr. ‘Adems, al hablar de las arrays asociativas ya te he presentado el operador de “inferencia’”. Tiene este aspecto: => Problemas menores del formulario ‘Nuestro formulario presenta todavfa algunos problemas menores. Supongamos que el usuario se olvida de rellenar su tratamiento. La variable no esti definica y provoca un mensaje de error. Sin embargo, también es posible que el usuario Hegue pos casualidad directamente a la pagina analisis.php. Sino ha visto y rellenado el for- mulario, también se produciré un error. @ 5 © Biwmtenavawends 9 Or nailisis de formutarios (analisis.php) etice: dene ine: ender bs ‘C°apachefreds samp doc pS form2iansn php one 1 Las variables indefnidas provocan a apaicion de mensajes deerror, Precisamente para evitar este tipo de errores, las estructuras {x nos van como anillo al dedo. Te presentaré dos posibilidades para mejorar el script. Para ello, crea dos nuevas carpetas Ha- madas form? y forms. Copia nuevamente en elias los datos de fern. Activar los mensajes de error Lo has probado y en tu caso no aparece ningtin mensaje de error? Eso es porque XAMPP conti- gura PHP de modo que no se muestren avisos sobre este tipo de errores. Sin embargo, como programador te interesa mostrar todos los ertores, ocultarlos solo tiene sentido en la Web. Para ver cualquier error que se procuzca, deberemos editar el archivo php. ini, el archivo de configuracion de PHP que he mencionado antes. Se encuentra en la carpeta xanpp\apache\bin, en nuestro caso c:\apachefr‘ends\xampp\apache\bin, Busca la linea que indica: error_reporting = © ALL 6 -£ NOTICE & ~E_STRICT Atencién, busca la linea que no empiece por un punto y coma (;). Las lineas con punto ¥ coma son solo comentarios. Modifica la linea para que quede ast: ertor_reporting = BALL Creacién y andlisis de formularios 3 Guarda el archivo y reinicia XAMPP. Recuerda, para ello sélo tienes que hacer doble clic en el archivo xanpp_restart.exe. Funcion isset() Ahora nos ocuparemos de ocultar los errores de nuestro formulario. Para ello, utilizaremos senci- Hamente la funcién ssset (), puesto que Sset() comprueba si una determinada variable est definida y en caso afirmativo devuelve true (verdadero). En caso negativo, el resultado de la prueba devuelve aise (also). La sintaxis de la funcisn es la siguiente: bool teset (nixed var) Por tanto, se comprueba una variable y se de- vuelve un valor booleano (es decir, verdadero o falso). Podemos comprobarlo con una consulta 41, De hecho, asi lo hacen muchas funciones, Espero que hayas copiado todos los datos a la carpeta corn. En el formulario propiamente di- cho (foxm.nts1) no he cambiado nada, sélo he atadido una pequena modificacién en el script PHP de ansiteie.phe. La funcién isset() caza los errores descritos an- teriormente y en ese caso no muestra el mensaje de bienvenida al usuario. Para ello, nos basta con una consulta i que abarque todas las Iineas de cédigo anteriores. ($_POST[' Last Name"] ), encantado de saludarte.\ ) else { echo "Por favor relléna todos 10s campos": En este caso, nuevamente deberemos limitar la variable de la array con Haves, para que PHP la interprete correctamente. Explicacion de la consulta if La primera linea {© es larga: hemos juntado va- rias condiciones. Sélo cuando se cumplan todas las condiciones (cuando sean verdaderas) se mostrarén los valores de las variables. Para ello utilizamos el operador logico Y (6s). Es decir: es necesario que estén definidos tanto gender como lastilane. :Pero qué se oculta detras de os $_posT(!Tastiama!] [= ** -aqui utilizamos ol operador de diferencia?! El motivo es que el valor de la variable para s_P0st/‘ tastNane' | tampo- co puede estar vacio. Este seria el caso si el usua- tio hace clic en el bot6n “Enviar” pero no ha re- Menado el campo 1astiane. La funcién isset () trabaja en perfecta armonia con if. Pero isset ()no es la tinica funcién que devuelve «rue (verdadero) si se cumple una condicién y false en caso de que no se cumpla. Visién general de la parte else Para darle el toque final al cédigo, he optado por ‘mostrar un texto alternativo. Al fin y al cabo, no tendria mucho sentido mostrarle una pagina va- cia al usuario, En caso de problemas, le recorda remos al usuario que debe rellenar todos los campos del formulario. ee ey Bee meee ane OES « B >) BD Brtwiteatenstostenaind ¥ Ox andlisis de formularios (analisis.php) Porfinor ren todos os campos Sie usuario no rellena tados los campos & mejor ‘mostrarle este aviso que un indescfrable mentsje de error. PVE R MUI eh) Hasta ahora hemos separado el formulario en un archivo, y el andlisis del mismo en otro ar- chivo. Sin embargo, si se desea es posible com- binar ambos documentos creando un solo archi- vo. En realidad es muy fécil si usamos nuestra com- probacién de variables :sse¢ (). Retomemos ‘nuestro tiltimo ejemplo y lo adaptaremos para que quede un solo archivo. Lo que haremos es trasladar el script de analieis.php ala pagina del formulario, colo- cindolo después del cédigo del formulario. Ademas, también es necesario cambiar la exten- sin del archivo de form.htmi a torm.php, Ya que normalmente el servidor silo busca codigo PHP en los archivos con extension rhe. 32 Creacién y andlisis de formularios Muy importante: deberas modificar la action del formulario. Ya no debemos llamar al archivo araltsis.pip, sino a cox. php. Como puedes ver, en realidad lo que hace la pagina es llamar- sea si misma. Aqui te muestro el cédigo entre las etiquetas : Tods en una pagina (form-php)
Sra.
Tu nombre: me="gubmitbutton

<2php iE [iseet (8 POST ("gender"}) as iasat (s_ FosT| 'lastNane $_post(TlastName! Sf (Post [" gender") echo "Hola sr. *; ) else { echo “Hola Sra. *; echo "[$_POST |" 1astNane'|), encantado de saludarte.\n"s )else { Af (isset (5

{Qué cambios hemos aplicado? Observa prime- ro el formulario. Lo primero que hecho es aftadirle un “value” al campo inpur de svdmie. Ahora el bot6n submit mostrara el texto Envialo!, Ademés, he asignado un nombre a este botdn (nane="submitbutton"). El motivo es que cada campo de un formulario que tenga un nombre serd interptetado por PHP como variable >_pos Con este truco puedo mostrar el texto Por favor rellena todos los campos después de que el usuario haya hecho clic en Enoidlo. De lo contrario, el texto se mostraria allf desde el principio. De ello se ocupa nuestra funcién isset () inclui- da en el c6digo PHP. if (Leset(S_POst{*submiebuetoa'])9 { La primera vez que se accede a la pagina se in- terpreta el cddigo PHP. Puesto que las variables todavia no estén definidas, PHP no tiene nada mas que hacer. Es después de hacer clic en En vialo! cuando el script se ejecuta: a > BC remraranpontenatenste 3 Ot Todo en una pagina (form.php) SO Sen Tuasabee: Aaiguar ola Se. Rodrigue, ensreuado de studae ‘Tras enviar e formario se muestra el saludo ~debajo det farmulario, PHP sélo reaccionaré una vez enviado el formu- lario, analizando el contenido y respondiendo: Hola Sr. Rodriguez, encantado de saludarte. Nombre del documento cortecto Pasemos al atributo action. {Te has olvidado de indicar el nombre correcto del archivo? La pagi- nase tiene que lamar a si misma Variable $ SERVER['PHP_SELF'] La variable de servidor 5_seaver{ "pa? seu") (jse escribe asi!) nos devuelve la ruta y el nom- bre del documento actual. De esta forma, en lu- gar de act ion="forn.php" también podriamos escribir action="<2php echo $_SERVER['PHP_SELF'];2>". Son totalmente equivalentes. Copia form. php en una nueva car- peta llamada Forms y prueba este nuevo método de llamar al documento: al) op echo 5_SERVERE' PHP SELF > HTML y PHP mezclados: esto es lo que hace que trabajar con PHP sen tan flexible. Formularios avanzados 33 Formularios avanzados En este capitulo te presentaré otras téenticas de analisis de formularios y funciones importantes. Pero antes, examinaremos con més atencién el cardcter de arrays de los datos de un formulario y resumiremos algunos de los conceptos apren- didos hasta ahora, Datos de formularios como EEN Ey Aestas alturas, ya sabes que los datos que de- ‘vuelve un formulario son tratados como array asociativa por PHP, Un breve recordatorio: las arrays son listas de valores que constan de un par clave-valor. En las arrays indexadas conven- cionales, la clave es un niimero indice que em- pieza a contar desde 0. En el caso de las arrays asociativas, sin embargo, podemos fijar libre- ‘mente tanto el valor como la clave. En los formularios tratados por PHP, el nombre del campo del formulario equivale a la clave y el valor es lo que el usuario ha introducido en el campo del formulario. Hasta aqui, no estoy di- ciendo nada nuevo. $_POST y § GET Sien la etiqueta utilizas nechod="post*, a array que contiene todos los datos del formu- Iario se llamaré s_post. Por el contratio, si usas nethod="get" podras acceder a los datos del formulario mediante $_ cE. Contar la cantidad de elementos Lo interesante de conocer el cardcter de array de Jos datos de un formulario es que podemos uti- lizar funciones especiales de arrays. Ya hemos visto una de ellas, coun: (¢nesay)~ Asi, la fun- Gi6n count (3_Post) devuelve la cantidad de elementos del formulario. Mostrar nuevamente los datos Observa de nuevo la tiltima version del script del formulario, rorm.php. Por ahora, el script funciona perfectamente. Solo hay un pequefio problema: cy siel usuario ha enviado los datos y se ha olvidado de rellenar un campo? Teudsia que volver a rellenario todo desde el principio. @Por qué? En nuestra variante “de un solo do- ‘cumento”, la pagina se vuelve a llamar a si misma y se carga nuevamente en el navegador. Solo esto ya constituiria motivo sulficiente para inclinarse a favor de la variante “de varios do- cumentos”, pero no nos dejaremos doblegar. “Guardar” un valor de un campo de texto 2Cémo podriamos solucionarlo? Tenemos que leer el valor de la variable y después de “recar- gat” la pagina, hacer que PHP lo “introduzca”” dindmicamente en el formulario, Empecemos por el caso mas facil: nuestro campo de texto del nombre del usuario tendria este aspecto: dela siguiente forma: Asi poderios guardar el estado de los botones de opin. Elarchivo del suplemento se Hama form.phe y se encuentra en la subearpeta forms. ae) yur me EMER) {Qué ocurriria si los datos del usuario incluye- ‘ran comillas u otros caracteres especiales? Haz la prueba: escribe un nombre en el campo de texto ‘que incluya un cardcter especial. No te creas que es tan extrafo, sin duda hay gente que se llama O'Hara 0 O'Lacey. pee aap | vere meet ha Oy ee ee oer Todo en una pagina (form.php) Ose Tunostee: Oy Las carnctres especiales coma las comilas simples doles se selon enmascorr atomstcamente ‘Como puedes ver, antes de determinados carac- teres como " (comillas dobles) * (comillas sim- ples) o incluso la barra invertida (\), PHP inserta automaticamente tina harra invertida. El motivo es una opcién llamada magic suokes ot = ‘on que se encuentra en el archivo de configuracion php. ini. Esta op- cién se encarga de enmascarar (escape) auto- a banda 4 itor We wap Jas ejemplos en tu se | ‘y nb te encuentras con este problema, es que Aoeretecuaigulohesatgenis | ‘magic_quotes_gpc enort.Sinembargo,es extrafio que sea asi. En tiltima instancia, la barra invertida para en- ‘mascarar seria slo un problema estético. Sin embargo, resultarfa un problema si escribimos unas comillas dobles por equivocacién. Sélo pa- ra probar, escribe 0" Lacey (con comillas dobles). El resultado es que el nombre deja de mostrarse completo en el campo de texto. Lee ber ae seer reer tae Se én > - FS G Guwinatouterintioie $ O> Todo en una piigina (form.php) © & 6 Sa Tusa ©) & Hote Sn Lacey, sade de aie La parte del nombre que iia después de las comilias queda ccortada, El poder de las comilias Segtin cémo se apliquen, las comillas dobles (y en ocasiones también las simples) actian como, unidades de detenci6n, Asi, dentro de unas co- millas exteriores dobles slo podemos usar co- millas interiores simples, y dentro de comillas exteriores simples sélo podemos usar comillas interiores dobles. Quizas replicaras que en el caso de los nombres no supone ningtin problema: al fin-y al cabo, no. habra mucha gente que tenga nombres con ba- rras invertidas o con comillas dobles. Pero pien- sa en campos de formularios en los que se solici- ten otros datos. Piensa, por ejemplo, en los cam- pos textarea de un formulario para recopilar la ‘opinion de los usuarios. Formularios avanzados 35 Si ignoramos esta regla, el proceso de lectura de Ja linea se interrumpird en el punto donde el usuario haya insertado las comillas dobles. En resumen: es necesario mejorar el script. Co- mo ménimo en el caso de las comillas dobles se puede hacer sin demasiado esfuerzo. Funcion htmispecialchars() Para poder usar todos los caracteres especiales de HTML, como es el caso de las comillas dobles * (aunque por lo general no afecta a las comillas simples) podemos usar la funcién PHP htmlspeciaichars(). La funcién tiene la si- guiente sintaxis: stelng htmlapacialchars (string string) Esta funcién convierte los siguientes cuatro ca- racteres en sus respectivas entidades HTML: Caracter Pasaaser Significa < ait; lower than > Sati ‘greater than & amp: ‘ampersand : Sauot; {quotation mark Esta funcién es de vital importancia, ya que evi- ta que se ejecute cédigo HTML que modifique el layout de nuestra pagina. También permite con- vertir en inofensivos los posibles scripts de Ja- vaScript que algiin usuario malintencionado pretenda ejecutar en nuestra pagina. aU ECT 9) Con la funcién anterior hemos solventado el problema de las comillas, pero el problema esté- tico de la barra invertida sigue pendiente de re- solucién. Recurriremos a la funcidn st ripstashes(). Esta funcién elimina todas las instancias de la barra invertida que encuentre en una string. Asi, una barra invertida doble (barra invertida para en- mascarar una barra invertida) terminaria siendo una sola barra invertida. La sintaxis de la fun- cién: ¢ string steipelashes(etring sts) En comparacién con la versi6n anterior del script, en este ejemplo he afadiclo dos lineas (re- saltadas en gris) y he acortado la ultima: (§_POST[LastNama] }, encantads do saludarte.\ar? y convertiria en esto: echo *, encantado de saludarte.\a": De este modo, la emisién de! nombre se “benefi- cia” de nuestra “correccién estética’, ome @- > -G Ch Bitwinarwsetneitenn htmilspecialchars() y stripslashes() © fe. 9 Sm. ‘Tommbee a8 Ha Sm O" Laney, ec ati stripstashest) filira la barra incerta de la string. Puedes encontrar el archivo de ejemplo en la subcarpeta fornular?, Funcion nl2br() Si ineluyes una gran en el formula rio para poder recibir los comentarios de los usuarios, te interesard probar (en este y en mu- chos otros casos) la funcién n12br (). La funcién n12bs () transforma todos los sal- tos de linea del editor en el. HTML
(sintaxis XHTML). nizor') es Ja abreviacién de new line to break. 36 Formularios avanzados La sintaxis es la siguiente: nldbr (3Variable) nl2br() «O60 Team Pose Teme 3) ot See Pop, ade ee he deer opm eace conden) Seer ey baste Nop rt oe ao oie? Los sltos de nen setransforman en
En este ejemplo he afiadido un campo para co- mentarios en el formulario, como seria usual pa- ra recopilar opiniones de los usuarios. Inserta es- te campo debajo de Tu nombre y antes del botén Envialo. Este serfa el cédigo fuente correspondiente:
comentario:
Debajo del formulario, concretamente debajo de la linea echo "$Name, encantado de saludarte.\n"; vuelvo.a mostrar el contenido de este campo del formulario. Para ello accedo de nuevo a la variable Sconnent xy mantengo todos los saltos de linea: echo "ebr>\n"s Sconment = nl2be (Sconent) s echo Sconment Si quieres ver el cédigo completo, abre el archi- vo del suplemento de la subcarpeta fo2n3. Proteccién con contrasefia 37 Proteccién con contrasefa PHP permite proteger paginas mediante contra- sefia, y de forma muy segura, Las contrasefias se guardian en el servidor y no son visibles. Ade- més, lo que muestra el navegador es siempre la pagina HTML final, y no el codigo PHP. Para hacer que el capitulo sea mas interesante, aprovecharemos para aprender otros elementos basicos de PHP, concretamente las estructuras elseif y switch, Pero antes, te mostraré como redirigir de una pagina a otra pagina usando PHP. Redireccion con header() Para ello se usa la funcién header (), dela que nosotros nos interesaremos tinicamente por el caso especial Location. Este caso especial se con- sigue redireccionar a otra pagina a través del navegador. La sintaxis seria esta: header "Location: URL"); del documento HTML, de la prime- cesses ene ne NOR Oe a Por tanto, con el siguiente script lograriamos re- dirigir a otra pagina: cheag> Redixeceiéne/hi> Puedes consultar este ejemplo en el archivo del suplemento redieccion.php. Lo més importan- te es que el cédigo PHP de redireccién se en- cuentre al principio del documento, antes de la etiqueta . A continuacién, perfeccionaremos esta redirec- cién para que s6lo se produzca en conjuncion con una contrasefa “Es necesario colocar header () justo al princi- | ione/bitLe> El formulario Crea el siguiente formulario e insértalo en una pagina HTML. Guarda el documento como pasel.phpt En “la seccién header” comprobaremos si la con~ trasefia concuerda con uno de los dos valores permitidos. A continuaci6n, redirigiremos al usuario a la pagina correspondiente. Pero cual es? He aquf mis propuestas. Crea primero los dos documentos HTML de destino para seguir ade- lante con el ejemplo. Son sélo sencillos docu- mentos “comodin”: Password Redirige a Es decir a UsxTz _newpaget him! ‘Seccion 1 Ri2Tu —_newpage2 htm! Seccién 2 Finalmente, también he previsto un documento Mamado sorzy.ntst. Si el usuario no introduce correctamente la contrasefa, le redirigiremos a esta pagina. aos ¢Cémo solucionaremos este problema? Podria- mos anidar varias consultas i, pero hay una al- temativa mejor: ele: t. Esta instruccidn permite ‘comprobar varias condiciones, La sintaxis basica es la siguiente: 4€ (condicéén) | Lineas de cédigor ) eleoit (condiesén) ( Lineas de cédigos ) alse ( Eineas de cédigos 1 Se puede incluir tantos e1seit como se desee. El siguiente eiseir mas profundo solo se ejecutara siel resultado de la comprobacién del :£ 0 eiseit anterior fue falso, es decirm si no se cum- lis la condicion. La parte e1 se se deja para el final. 38 Proteccion con contrasefia Header Pero veamos qué aspecto tiene todo el conjunto mediante un ejemplo practico. Para ello, inserta~ remos las siguientes lineas de c6digo al princi- pio de nuestro documento pass1 .php: <2php Sf (eset ($ POSTI*pw'})) ( sew = $_POST[ "pws Sf (Spw == "U6x72") | header ("Loeation: newpagel-heml"); ) elseif (spy == "RI2TU") | header (*Location: newpage2-htal") j else ( header (*hocation: sorry.html"); i En primer lugar se comprueba el valor de! cam- po de la contrasefia, y se guarda en la variable ‘pw. A continuacién, reaccionamos a las dos po- sibles contrasefias y se ejecuta la redireccion adecuada segiin el caso. ares Gitar Yer Mecnsires Heromenies ansio ) @ ©, SD BF DD [Dvcrimeronsrosneren +] © x Sorry ‘Seer est vist que io sabes ln contrasea emai — {Mala suerte! Sino se sabe la contrasei, se nos redirige a Sorry tml. Le | | cédigo? Con isset () me aseguro Ia redireccién después de Se een ecua ee el tee usuario haya, del, ee ERR Sin embargo, nuestra proteccién mediante con- trasefa sigue sin ser del todo segura. 2Y si al- guien adivina el vinculo directo a la pagina de destino? Una posible solucién seria usar nom- bres de archivo cripticos y rutas de acceso muy complicadas. Serfa mas dificil que alguien lo adivinase... pero seguiria habiendo un riesgo. 2Cémo podriamos empaquetar el contenido de forma realmente segura? Agrupandolo todo en una sola pagina y protegiéndola mediante una contrasefa invisible con tuna estructura i£/elseit. Lo probaremos con un archivo lla~ mado pase2.php. Esta vez, sin embargo, no redi- rigitemos a otra pagina, sino que todos los datos ‘ya estaran presentes en el archivo pass2.php. Funcionamiento del script ‘Observa el script que te presento a continuacién. Funciona de forma similar al ejemplo de redirec- cionamiento que acabamos de ver. La diferencia es que agrupamos todos los datos protegidos en Ja misma pagina, para lo cual utilizamos nue- vamente iy elsel ¢. Encontrarés el archivo pass2.php en el suplemento del cuaderno, Cédigo fuente de pass2.php sitml> Stead> Celtien goineodi’ ta contvusetate/eteies inka Bhtp-aquase"content-orpe cext/ntml; charseteiso-€859- zconoces 1a contrasefia? tpass2.php) 1. secci6n protegida

Contenido interesante. ..

<2php } else [

Lo siento, no puades entrar. Proteccién con contraseiia 39. eo > Seats Sete tam Cesta {Conoces In contraseita? (pass2.php) =) 4. sect protegida Corea seen Elcontenido slo se muestra si se introduce una contenseria correcta, La instruccién switch Junto a ir y eiseir también existe la instruccién switch. switch permite comprobar distintas condiciones para una variable y reaccionar en consecuencia. Esta estructura de control es simi- lara ity e1sei£, Siguiendo con nuestro ejemplo de las contrasenas, podemos lograr exactamente el mismo resultado usando esta instruccién. Pero antes, permiteme presentar la sintaxis de switch, La sintaxis de switch La instruccién switch comprueba si una variable coincide con los valores de una lista. En caso afirmativo, se ejecuta la instruecién pertinente. Para impedir que se sigan realizando comproba- ciones, se utiliza la palabra clave bcoak (cance- lar, abortar). Sino coincide ningtin valor, se ejecutard la ins- trucci6n desauir:, serfa comparable a «1 ve. He aqui la sintaxis: switch (Varisble) | case Va break case Value: anstrucciéns break: éefaule: default; aceléne ' Analicemos esta sintaxis utilizando un ejemplo. He modificado el c6digo del archivo pass2..phe y lo he guardado como pass3..php. A continua- ‘i6n, s6lo copiaré la parte més importante del cédigo -he resaltado las instrucciones PHP sobre fondo gris. El script funciona de forma muy parecida a it/elseif/else. Se comprueba el contenido de las variables, 2Es correcta la contrasefia? Para ello se utiliza el primer bloque case. En caso afirmativo, se ejecuta la instruccién debajo de case "Nasa". La palabra clave break sitve para salir de switcn. Sino hay ninguna coincidencia, se ejecutard el codigo de aozauit:. Vision general del script He aqui el script al completo. Si quieres consul- tar el suplemento, busca el archivo pass3.phy 1. seecign protegida <

Contenido interesante. ..

<2php break: case "Ri >

2. seccién provegida

Contenido interesante...

<2php defaule: sh3>Lo siento, no puedes entrar.

Esta visto que no sabes 1s cont rasena.

ieuantas veces? \ Scountert#2 ) echo "Se acabd.\n"; ’

re a B DG Grew marnitornraise 4) O En este ejemplo ol buce se ha ejecutndo cuatro veces. Explicacion del cédigo fuente 2Qué es lo que hace exactamente el script? Para empezar, nada: la primera vez que se llama al cédigo, el script no tiene nada que hacer. Gra~ cias a la consulta iseet () el programa “se da cuenta” de que la variable §_P087 ("number") todavia no esta definida. Mediante un formu- lario preguntamos al usuario cudntas veces quiere escribir la frase. La cantidad se almace- na en la variable $_post{*nunber" j y el script se llama a si mismo. En ese momento se inicia el bucle. El contador (variable scountex) inicializado en 1 se compa- ra con el valor que devuelve el formulario. Mientras el valor sea inferior o igual a este va- lor, el bucle se seguira ejecutando. ‘Sin embargo, para no crear un bucle infinito, el contador se incrementa en 1 cada vez que se ejecuta el bucle. Esto es lo que ocurre en la linea de cédigo: Scountert#; Como recordatorio: esta linea es sélo la forma abreviada de: Scounter = Scounter + 17 Por tanto, si introducimos un 4 el bucle se eje- cutard cuatro veces. Si la expresion que se comprueba en el encabezado del bucle deja de cumplirse, es decir, si el “contador” pasa a ser mayor que el valor introducido por el usuario, el programa ejecuta el cédigo posterior al bu- cle. En este caso, lo que hace es escribir Se acubé ena pagina. Bucles 44 No olvidar la condicién de cierre algtin momento debe cumplirse Noes cweaies trapado a el ale , atrapado en el bucle y no | esi salir eclent, | Ejercicio: mostrar el contador ‘Lo mis importante de este bucle es el contador. Lo hemos inicializado en 1 y lo incrementamos en I cada vez que se ejecuta el bucle. Aprove- cha este contador para mostrar la cantidad de pasadas del bucle. (Mis tarde podrias usarlo ‘para mostrar la cantidad de productos de un pedido o algo similar). Para ello transformaremos la linea: ee aie OW ay esha en lo que sigue (sin saltos de linea): ilies dhs tewaniectelb> Taoge ze Saag OANA Guarda el documento modificado como isthe php. ee DAY SDB OD Greomnensesneate +O while2.php i ica et = 1 Loops messy 2 Loops me ess! Loops me ay! “Loop are ear! S Loops ear! Seactbe Eleontador se utitta para numerar. Junto al bucle whe existe también otra posibi- lidad, el Hamado bucle do-wnile. La diferencia es que, en el caso del bucle white se comprueba la condicion en el encabezado del bucle, mientras que en el caso del bucle do- ‘eh’ te la comprobacién se lleva a cabo al final. del bucle. No lo he utilizado todavia en ningu- no de mis proyectos de programacién, por lo que no veo el interés de presentarlo aqui. Si quieres saber més, consulta el manual de PHP. A continuacién, hablaremos del bucle contador por excelencia, el bucle for. Esta es su sintaxis: for (variable_contador: condicién: patron_contader) Cédigo mientras se cunpla 1a condicién: 1 Lo interesante de este tipo de bucle es que la variable contador, la comprobacién de la con- dici6n y la determinacién del patron de re- cuento se realizan en el encabezado del bucl ‘Todo esto se agrupa entre paréntesis y se di de mediante puntos y coma. ‘Nuevamente el misino resultado: mds abajo encontraras e1 cidigo fuente de for. php. Funcionamiento del bucle Te volveré a ensefar todo el cédigo, pero para facilitar la visién de conjunto, te lo muestro se- parado: for {variable contador: condicisns patrén_contador). | Cédigo mientras se cumpla la condiciéns , Antes de nada, compéralo con el ejemplo de while. Enseguida lo convertiremos en un bucle for. Repasa las dos tltimas péginas que acabas de leer. Recuerda que en el ejemplo de «nie te- rnemos un contador (3counter), que hemos ini- Galizado en 1: es la variable contador. De ello se ocupa la linea de cédigo $counter= 1; que habfamos colocado al principio del bucle. En el encabezado escribimos la condicién: scountox <~ $number, Asimismo, habiamos determinado un patron de recuento: el contador se incre- mentaba en 1, 42 Bucles La instruccién era la siguiente: scounter ++; y se encuentra en el centro del bucle. Fin del re- cordatorio, Pasemos ahora el bucle for: Sieres avispado, ya habris visto que el bucle For es una especie de nile mas modo. Lo tinico que tenemos que hacer es agrupar to- dos estos datos en el encabezado del bucle. Guarda este ejemplo como For ph. Scounter: Loops are easy !'\0"7 ) echo "Se acabé.\n": ' > Créeme: los bucles for son uno de los tipos de bucle mas dificiles de entender. Sin embargo, espero que hayas comprendido el principio de este tipo de bucle gracias a estas explicaciones. 1a Cara) Para terminar te presentaré otro tipo de loop que es sencillamente genial. El bucle foreach tecorre una array y devuelve los valores alma- cenados en la misma. Mostrar todos los dias de la semana Probémoslo con una array “convencional”. La sintaxis seria: foreach (Sarray as $v echo "Svalue
\n", , Te acuerdas del ejemplo de array con los dias de la semana? Veamos si podemos escribirlos de forma mas limpia. Guarda el ejemplo como foreach .php. Este es el script: \n"s d En esta primera variante solo se emite el valor de las entradas de la array (vatve), no la clave, es decir el indice. Aunque en este caso no es ton importante, corresponde al nximere indice. ‘Se muestra todos los valores de la array. Mostrar también la clave (key) Enel siguiente ejemplo queremos mostrar también la clave. Para hacerlo mas interesante, partiremos de una array asociativa: nuestra lis- ta de capitales europeas. La sintaxis basica del bucle tiene este aspecto: foreach (Sarray as $key acho “SkeysSvaluecbr>\n™ ) $value) ee GDF DD Sitoineanonsrertent ¢ Ox foreach2.php Deeste modo se muestra tanto la clave (Rey) como el valor (value) Probemos el nuevo cédigo. El archivo resultan- tese llama foresch2.ohp. $valvel | echo "Skey=svaluecbr>\n"; t Bucles 43 Fantastico! Ahora la array nos devuelve todos los pares clave-valor. EE ee Esta téenica resulta especialmente ttil para el anélisis de formularios, ya que los formularios son una array asociativa formada por pares. atributo-valor (key-value). En el capitulo si- guiente volveremos a hablar del envio de for- mularios. 44 Envio de un formulario de opinion Envio de un formulario de opinion ‘Sin duda, una de las cosas més interesantes de PHP es la posibilidad de enviar contenidos de formularios por e-mail. Los datos se envian con ayuda del mailer SMTP instalado en el servidor (en el caso de Linux suele ser el programa Sendmail). Antes de nada, veremos cémo funciona el en- vio de correo electrénico, para después lanzar- nos al andlisis avanzado de formularios, que ‘nos llevara a crear un mailer universal. “iapevanet ontop tu No hay nada més fécil que enviar un mensaje de correo electrénico desde un script de PHP. Para ello, slo necesitamos usar la funcién rail (). La sintaxis basica de esta funci6n es: nail ("direccién destinatario", Yaaunto", “nenzaje", “from: direccién_renite") Podemos indicar todos los valores en la fun- ci6n, 0 representarlos mediante variables. Utilizaremos este conocimiento para dar las gracias al usuario si se consigue enviar correc- tamente su mensaje. En caso contrario, mostra- remos un mensaje de error. Consejo: si te interesa, puedes provocar el fallo del programa en tu equipo Windows local. La falta de un mailer SMTP provocaré que el mai- ler no funcione. Mailer para envio de opinion Como primer script de muestra te planteo un pequefio mailer para que el usuario envie su opinién. Recopilars la direccién del remitente y un breve comentario, A continuacién, se en- via todo el contenido al destinatario por e-mail. Este es el aspecto que tendré la pagina: a GDM Greirarensermansce FO ara et envto de datos se usa la funcign mail) Puesto que he integrado algiin pequefio perfec- cionamiento en el script, quiero presentarte an- tes la nueva funci6n empty). Prueba de variables: empty() ‘Con empty 1) podemos lograr casi lo contrario que con isset(), Recuerda que isset () com- prueba si una variable esté definida y en caso afirmativo devuelve true. En caso negativo, devuelve faise. Por el contrario, expty () sirve para saber si una variable no esta definida, si esté vacia o si le corresponde el valor 0. En estos tres casos, la funcién devuelve true, de lo contrario el valor de enpty () sera fase, Asi matamos tres paja- ros de un tiro. La sintaxis es similar a isset (): bool empty(mixed var) Dado que enpey(y devuelve true o false (es de- cir un booleano), esta funcién (igual que ieset ()) es perfecta para estructuras if. El script del mailer He aqui el c6digo fuente completo del formula- rio mailer. Copia el cédigo y guarda el archivo ‘como feedback. pip (0 simplemente abre el ar- chivo del suplemento), Envio de un formulario de opinion 45 Peedback-Mailer

jEnviame un e-ail!

Tu direccién de e-mail:
\n"y } else { echo "

to siento, ha ocurride un error.

\n"y 1 , > 46 Envio de un formulario de opinién Pq e ect sg {Has cargado el script en el servidor y lo has probado? El programa no es demasiado com- plicado: tenemos un formulario que recopila la direccidn de e-mail (variable $ p09 (‘¥311")) yee texto del mensaje (variable §_ post message" |). Tras hacer clic en el bot6n. Enviar la pagina se vuelve a llamar a si misma. He resaltado todo el cédigo PHP con un fondo gris. PHP comprueba sila variable + post {'Mail') esté definida y no vacia, De este forma nos aseguramos de que como minimo se haya in- sertado algiin dato como direccién del remiten- te. 2Son ciertas ambas condiciones? Gracias a nuestro operador && (Y) deben cumplinse to- das las condiciones. Entonces, el destino pasa a manos de la funcién mat (). Resulta especial- mente practico que la direccién del destinatario se determine al principio del script, en la va- tiable Sreceivertiail. La funcién mail) asu- me el valor de esta variable como primer at- gumento. Pero no nos limitamos a enviar estos datos por Jas buenas, sino que aprovecharemos la “prue- ba de éxito” integrada en la funcién mast () como medida adicional de seguridad: a fun- cidn nai () devolverd t-rue en caso de que el proceso tenga éxito, mientras que en caso de error devolverd faise. ae Shan zi che eas ‘naii() ha funcio- {Ha funcionado? En ese caso, proporcionamos amail() la direccidn del destinatario y un asunto predefinido (Tienes correo nuevo). Como cuerpo del mensaje se utiliza el escrito del campo de formulario textarea. La direcci6n “From” se deduce de la variable $_post[*mail' |. Confirmacion de envio Si el mensaje logra enviarse correctamente, el usuario veré el texto Gracias por tu apinién. Por el contrario, si se produce algtin error entra en accidn else e informa al usuario sobre el problema. Prueba el script en tu sistema local. De este modo te aseguraris de “forzar” este error, ya que en ttt equipo local no tienes insta- lado ningiin servidor de correo. En el sistema loca, ef script provoca un error. ultar mensajes de error Hemos logrado que, en caso de error, el script devuelva el mensaje deseado: Lo siento, ha ocu- rrido un error. Sin embargo, el codigo que acompafia este mensaje no es nada bonito, aparte de no proporcionar mucha informacién al usuario. Ademés, un hacker potencial podria sacar muchas conclusiones a partir de estos mensajes de error -en este caso el codigo “dela- ta” la ruta de acceso y el niimero de linea. Por suerte existe un truco para ocultar los mensajes de error. Inserta un signo de arroba al Principio de la funcién: @. Es decir, en lugar de mail () escribe @nail(). Esto es precisamente lo que he hecho en nues- tro ejemplo feeaback. php , ya continuacién te muestro el resultado. Solo tienes que afadir el signo de arroba en el archivo de ejemplo del suplemento. yore Sw wraae terme te @ Gee BD B [Divorietecrsroriete % Oe Eonar) Los ciptcos mensajes de erro han desaparecido: ahora ef scriph slo muestra el mensaje que hemes programado nosotros. Envio de un formulario de opinion 47 PSC ra im Acer cir) Antes de presentarte mi “formmailer univer- sal” me gustaria hacer hincapié en un par de cosas. Los programadores suelen ser bastante -vagos y prefieren abreviar siempre que sea po- sible. De hecho, ya hemos visto algunos trucos para ello: asi, a++ significa a = a + Ly b- equivaleab = » - 1. Es una “reformulacion” del operacior de suma o resta, Sin embargo, también es posible “reformular” el operador de asignacién =. Se puede usar simulténeamente para concatenar 6 incluso para sumar (0 res- tar). Observa el script del formmailer que encontra- rs en la pagina siguiente. En él presento un ejemplo de la forma abreviada de concatena- cin. Mientras que en forma desarrollada se es- cribiria asi: Smessage = $message . “Snane~Svalue\n"; Si usamos el operador de asignaci6n = nos ahorramos tener que escribir una variable: Snessage .= "Snane=$value\n": Algo similar ocurre con la sustitucién de a = a + »pora += b. En este caso recurrimos al ope- rador de asignacién +=. Esta explicaciOn es s6lo a titulo informativo, para que no te extrafies cuando te tropieces con construcciones como esta. Y a continuacién, me complace presentar mi... TE MA Lest | En este punto me gustaria presentar mi propio formmailer, que te servira para enviar todos tus formularios, (casi) independientemente de como estén montados y de cudntos campos tengan. Importante: deberds incluir en tu for- mulario un campo llamado sta: para la direc- cidn de correo electrénico del remitente. Slo se enviard el contenido del formulario si la va- ible suai esté definida. Ademés, ten en ‘cuenta que deberds ajustar cada elemento del formulario con otro nombre. Si deseas que el script envie casillas de verificacién, una posible estructura de ejemplo seria es No necesitarias agregar una segunda checkbox Hamada partner, sino que bastaria con lamar- la partnex2 o similar. En la pagina siguiente encontrarés el cédigo fuente del mailer -el ar- chivo del suplemento se llama uninsiler.php. Enel suplemento del cuaderno he inchuido también un archivo Hamado sampieforn. html para que puedas probarlo. nane="partner" 48 Envio de un formulario de opinion <1DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional //EN"> ‘cheml> Fornmailer Svalue) ( J+ Todos los datos se guardan en $message: */ Smessage .= "Sname: Svalue\n") // Forma abreviada de concatenacién 1 /* Enviar’ Prever un campo mail en el formulario! */ Af (isset ($_POST/*Mail']} @6 §_POST['Mail"] I= "") { // iCampo mail no esta vacto? /* Se activa la funcién de envio mail() */ Sposter = $_POST(*Mail'); if (Gmail (Sreceivertail, Seubject, $message, "From: Sposter")) ( /* ta funeionado mail()? Entonces el usuario verd lo siguiente */ echo "Gracias por hacerme llegar to opinién.\n"; echo "

Tu mensaje ha sido enviado.

\n"s /* €n caso contrario, se muestra un mensaje de error: */ } else { echo "chi>Le sentimes, ne se pude enviar tu mensaje.\a"s ) / cerca: la funcién if externa /* else para if externo en el caso de que la variable $_POST('Mail') no eaté definida + F else ( echo “\n"z , Programar un contador 49 Programar un contador eTe gustarfa poder incluir un contador propio fen tus paginas? ,O quiz4s un libro de visitas sin publicidad, totalmente personalizado? En este capitulo de mostraré cémo hacerlo, y por el camino te presentaré la “lectura” y la “escri- tura” en archivos mediante PHP. Todos los scripts de este capitulo son tan senci- los como me ha sido posible a fin de aclarar el principio. Un contador sencillo Olvidémonos por un momento del hecho de que cualquier contador es todo menos fiable. Un contador sdlo cuenta los hits, es decir que se incluyen también las visitas que se limitan a un clic en el botén Reload. Para empezar, nues- tro contador no ser ninguna maravilla~pero Jo mejoraremos. Archivo counter.txt Para empezar crearemos un archivo de texto, al que llamaremos counter. txt. Escribe un "1” (0 cualquier otra cifra), y guarda el documento counter txt en la misma carpeta en Ja que después guardarés el archivo PHP que crea- remos a continuacién. El archivo PHP se lla- mard counter -phe. one Sour wr Bader rarimanae ace @ «¢ a PY Dr teuranwesi ¥ Oe Contador sencillo Cantidad de vistas 13 Tena Un contador sencillo se puede crear muy répido con PHP. En PHP, todo es como en la vida misma: p mero se abre el archivo, y después se puede“ leer y, si se desea, modificar. Codigo fuente de counter. php ‘A continuacién te muestro el cédigo del archi- vo counter. pho. Copia el cbdigo fuente o abre el archivo del suplemento counter. php. Aqui s6lo te muestro las lineas de cédigo PHP: <7php Sfp = fopen("counter. txt, “e¥4); Seounter ~ fgets\Sfp, 7) echo Scounter: Seounter++; Fewina (Sep): spurs (Sfp, Scouncez)? felose (stp); p

‘Veamos qué se oculta detrs de todas estas funciones. Abrir un archivo con fopen() Para abrir un archivo se utiliza la funcién fopen (). La sintaxis de la funcién es la siguien- te: resource fopen(string filename, string mode) Nombre de archivo (filename) En nuestro ejemplo, el nombre del archivo (£32enane) no supone ninguna dificultad. Es- cribiremos la string (la cadena de caracteres) counter txt. ‘Modo (mode) El modo (node) indica lo que se puede hacer con el archivo que se abre. Un archivo se puede abrir en modo de solo lectura (r de read onty), en modo lectura y escritura (x+ de read + write), en modo de s6lo escritura (w de write only), o en modo adjunto (a de append), etc. Observa la tabla siguiente en la que detallo ca- da modo: Modo Explioacién r Modo s6lo lectura (F de read ony): el archivo ‘solo se puede leer, Modo lectura y escrtura (r+ de tead and wri- te): el archivo se puede leer y escribir. w Modo s6lo eseritura (w de write oniy) ‘chivo slo Se puede escribir. Siempre se de- fine en 0 bytes. Siel archivo no existe, se in- tentara creario. w+ Modo lectura y escritura (w* de write and ead): el archivo se puede leer y escribir. Siempre se define en 0 bytes. Si el archivo no existe, se intentara creario, a Modo escrtura adjunta (a de append): abre 50 Programar un contador el archivo sélo para escribir en él, todos los valores se adjuntan al final del archivo. Ex- cepcionalmente, el “apuntador de archivo" ‘no se encuentra al principio sino al final del archivo. Sie! archivo no existe, se intentara crearlo. a Modo lectura y escritura adjunta (a+ de ap- pend and read): abre e| archivo solo para leer y escribir en él, todos los valores se ad- juntan al final del archivo. Excepcionalmente, ‘el “apuntador de archivo” no se encuentra al principio sino al final de archivo. Si el archi- ‘vo no existe, se intentaré crearlo. Puesto que queremos tener permiso tanto de lectura como de escritura, usaremos el modo: r+ de read and writs Importante: en este modo, la lectura y la es- | critura se inician al principio del archivo. El misterioso apuntador de archivo {Qué significa exactamente la variable $¢5? {Qué hace exactamente el misterioso apunta- dor de archivo? La funcién Eopen () siempre coloca un “apun- tador de archivo” (file pointer) en el archivo. Si elarchivo ya esté abierto, se sigue trabajando con este apuntador. Para ello se guard el es- tado del apuntador en una variable. En nuestro caso concreto, utilizo la variable stp para el apuntador de archivo. Recuerda: en el modo ++ el apuntador de archivo apunta al principio del archivo, al primer caracter. Imaginalo asf: se coloca un “cursor invisible” momentineamente al principio del archivo de texto abierto, y espera “instrucciones”, Ha iteeymie (641) A continuacién, analizaremos la funcién fgets). Lo que hace es leer los datos de un archivo. La lectura terminard cuando se legue a la tiltima linea o al final del archivo, o cuan- do se alcance la cantidad maxima de bytes. La sintaxis de esta funci6n es: string fgete(resource handle (, int length) Puesto que hemos indicado un 7 como valor longitud de bytes (length), la funcién siempre tendré en cuenta que el ntimero tenga la longi- tud adecuada, y en el recuento se incluiran también el/los caracteres invisibles del final de Iinea. $i el niimero es demasiado largo, en la Iectura se ignoraré el resto (en caso necesario, puedes ajustar el valor). De momento el peligro no es muy importante, porque en el archivo counter. tt todavia tenemos un “1”. Se leer este ntimero y se almacenaré en la variable Scounter. En la linea siguiente emitimos esta variable y la aumentamos en uno: echo Seounters Scowntert ts {Qué tal vamos de imaginaci6n? Imagina que el “cursor invisible” se ha deslizado al final de la linea (0 se ha detenido en el limite de los 7 bytes). eT) RAL SEL) A continuacién, vamos a rebobinar. La funci6n rewind () vuelve a colocar el “cursor invisible” al principio de la linea. De ello se ocupa la linea de codigo: rewind (Stp1 7 La funcion pure (Sfp, Scounter): es la responsable de escribir la string derivada de la variable scountex en el archivo. Puesto que hemos especificado un modo de lectura y escritura (r+) y el apuntador vuelve a estar al principio del archivo, el antiguo valor (inicial- mente 1) se sobrescribe por 2. Cerrar el archivo con fclose() Siendo tan ordenados como somos, cerraremos el archivo con £close(3#p). Aunque el script también funciona sin esta acciGn, de este modo ahorramos recursos de! sistema. Siempre que sbramos un archivo, después de leerlo o modi- ficarlo deberiamos cerratlo con fc1os¢ Resolucion de problemas con chmod Si ya has comprobado que el script funciona en tu servidor local, sube los archivos a tu pro- veedor Web y vuélvelo a probar. La mayoria de veces funcionaré sin rechistar. Sin embargo, en algunos proveedores la cosa se torceré Programar un contador 51 oe G21) i seeenannerwes FO Contador sencillo Cea ee ‘Ware pence ae open sen Per dee ‘me poceraberigs eos somos oui 10 ‘eae pceratergeonecnar.com owtergp oui It eran: gts-std agement ans al soam rewce ‘time faeries ieaaecmra am conn hp ae IS oa ee: pie argent spot ai sem researc in Jem gersbrigeaaramara comeing 6 Por qué no paran de aparecer mensajes de error cnda vez que accedemos a la pigina? 2Qué ha ocurrido aqui? Puede ser que tu pro- ‘veedor no permita que se ejecute ningtin script en el que se escriban datos en un archivo. El motivo es bien sencillo: el archivo de texto est protegido contra escritura. Es decir, que los usuarios no tendrin derechos de escritura, sélo podran leer el archivo. Por eso aparecen los mensajes de error. Pero todo tiene solucié para quitar la protecci6n contra escritura en un servidor Unix/Linux, se utiliza el comando chmod. En muchos foros se aconseja liberar “comple- tamente los archivos para lectura, escritura y ejecucién’”. Esto se traduce en el comando ches 777. ;Pruébalo! Si utilizas un programa de FTP como WS_FTP, sélo tienes que seguir mis instrucciones: conéctate al servidor. Ase- giirate de haber subido el archivo countar.txt ‘en su defecto el archivo que cesees desprote- ger Haz clic en el archivo del servidor remoto con el botén derecho del ratén. Selecciona el comand chnos (UND). Aparece- ré la ventana Remote File Permissions. Activa todas las casillas, es decir 3x3, concretamente todas las correspondientes a Read/ Wri- telExecute (Lectura/Escritura/Ejecucién) y haz clicen OK. Echmod 777 o chmod 666? Al hacer clic en todas estas casillas, desprote- ‘gemos completamente el archivo: para ello, en segundo plano se ejecuta el comando chmod ™ Dune Group Other Read W Read Read Rwite | Wit F wre T Ewecute | [7 Evecute T Enecute ‘These are usually only applicable on UNIX hosts. exe Pruébalo: normalmente basta con chmod 666 Sin embargo, chic 696 también deberfa ser més que suficiente. Es decir, que s6lo necesita- riamos otorgar derechos de lectura y escritura a los tres grupos (Owner, Group, Other). Basta con activar las casillas de Read y Write. Experimenta con distintas configuraciones y comprueba cuando funciona el script en tu ser- vidor remoto. En algunos proveedores el script podria funcionar incluso sin necesidad de chmod. Naturalmente, este truco también es aplicable a los scripts que veremos a partir de ahora. Para que funcionen correctamente, también es nece- sario que el archivo del servidor remoto no esté protegido contra escritura. Si todavia siguen apareciendo mensajes de error, puede deberse a que, como norma, tu proveedor no permita asignar derechos de es- critura, En ese caso no podemos hacer nada. 52 Tu propio libro de visitas Tu propio libro de visitas Con Jos conocimientos que tienes ahora, en principio podrias crear tu propio libro de visi- tas. En este caso, también mantendremos la es- tructura basada en dos archivos. Todos los ‘comentarios se almacenarén en el archivo queetbook.-cxt, mientras que el libro de visitas propiamente dicho es la pagina questbeok.php. El libro de visitas almacenard el comentario, el nombre y la direccién de e-mail del usuario. ‘Ademés, los nuevos comentarios se mostrarén los primeros de la lista. Al igual que en el caso del contador, debere- ‘mos cumplir un requisito: crear un archivo de wee tie wy Beas recat Ana SB GB Broscanesrermanease Libro de visitas Tu comeatano Tunombee Twemat “Mostrar todos los comentarios Pepa (oepapepit com) wrote oa 2005-11-2 texto para almacenar los datos. Llimalo guestbook. ext y guardalo en la misma carpeta que el archivo PHP. Escribe un espacio en blanco para que el archivo tenga un minimo contenido y la funcidn ¢raad() no muestre ningtin mensaje de error. Cédigo del archivo guestbook.php En la pagina siguiente encontraras el cddigo fuente del script al completo. He comentado las acciones més importantes. Si no tienes ganas de copiar, puedes usar el archivo de ejemplo del suplemento: guestbook.php. Hey Joann! Flidades por el cunderno, me parece bastate td, aunque a primera vist ea todo tan compicado! Pape (pape botela cots) wroteon 200561-27 ‘Sinceramente, me esperaba algo mas De toda forma creo que poke use eSdigo de exe jesicio par cra coma, Mister X (oisters Depo de) wroteon 200514 Hi geod work, I ayn the reload protection Pater (eter’Bt-udve de) vote on 2005 Hi Johmn how are you? Yeu guestbook is rea nie, eel 3) Las entradas inclnyen Ia foha y os iltimos comentarios se muestran arriba de todo del ita. Tu propio libro de visitas 53 sbtmi> shead> ceivlern Libro de visitas sencilie bibro de visitas
Ty e-mail : Semsil"; // Se incluye 1a fecha y se le da formato Sdateorentry = date // Ocultar caracteres HIM, eliminar slashes, mantener saltos de linea Scomment = htalspecialchars (Sconment) + Scomment = stripslashes (ni2br (Scomment) | + 7 “Wontar” 1a entrada (entry) del libro de visitas Sentry="snanec/b> (Seail) wrote on SdatedfEntry:
scomment

\n" // BL cursor invisible salta al principio rewind (Sp) 7 // Becribir 1a nueva entrada ates de las antiguas en el archivo: fputs(sfp, "Sentry \n Sod"); W Cerrar el archivo felose (Sfp) i , // Mostrar @1 archive completo readfile(srile)s > ‘comment ">
dos los conentarios 54 Tu propio libro de visitas Funcionamiento del script Pasemos a analizar el script: por comodidad, guardo el nombre del archivo en la variable Stile. A continuacién compruebo si la variable transmitida por el formulario HTML esta defi- nida (3_20sT( ‘comment ']) y no esta vacia (g_POST['name" } y $_POST["email']). (Naturalmente, podriamos incluir una com- probacién mucho mas exhaustiva). A continuacién, el archivo se abre para lectura y escritura. funcion fread() Aqui se presenta una nueva funci6n: fread (). A diferencia de la funcién tsets() que sélo funciona a nivel de Iinea, freaci() lee el conte- nido de todo el archivo. Por lo demas, la sin- taxis es igual a lade fuers() string €read(resource handle, int lengthy seeaa() también tiene como argumentos el apuntador de archivo (resource handte) y el tamaiio del archivo (Lengtn). Y precisamente este tiltimo argumento resulta problemético: no sé qué tamaio tiene el archivo, Pero la si- guiente funci6n nos ayudara a solucionarlo. Funcién filesize() Puesto que no quiero limitarme desde el prin- cipio en lo que respecta al tamaito del archivo, Jo averiguaré dindmicamente con la funcién filesize). La sintaxis de fiesize () es la siguiente: int filenize(string filename) Este es el aspecto de la linea de cédigo: Sold = freadi$ip, filesize (Stile) | .Qué representa la variable $010? En ella jguardo el contenido recopilado hasta ahora, es decir, el contenido “antiguo” del archivo Generar el vinculo del e-mail A continuacién, generamos el vinculo del co- reo electrénico en HTML y guardamos la string correspondiente en la variable senai. Para ello recurro a la barra invertida para ocul- tar las comillas. Utilizo la palabra clave que ya conoceras de HTML. No es necesario que preguntes al ustiario por su direccién de e-mail, podrias usar también la direccion Web. En ese caso, basta con omitir mailvo:. Muchos usuarios te agradecerén no tener que incluir su direceién de e-mail, ya que estaran més seguros y mas protegidos contra el spam si no se muestra su e-mail. Mostrar la fecha con date() Asimismo, “crearemos” una “marca de tiem- po” para cada entrada. La funcidn date () dela que ya hemos hablado anteriormente devuelve Ja fecha con un determinado formato. En mi caso, usaré sélo la fecha (no la hora). 4, n €¥ devuelven el dia y el mes en dos cifras, yelafioen cuatro cifras. ¥ lo hacen a la manera americana, es decir, empezando por el ato (puedes adaptarlo para mostrarlo a tu gusto). Para el ejemplo que nos ocupa, la string de la fecha se almacena en la variable seareotene © Sdateofentry = date(ry stripstashes() y htmispecialchars() Las lineas siguientes ya te sonaran de los scripts anteriores. La funci6n htnispeciatchars () sitve para ‘enmascarar los cédigos HTML. De lo contrario, un usuario malintencionado podria insertar c6digo HTML o JavaScript en el archivo y crear su propio CSS, cambiando totalmente el disenio de la pagina. Con svripsiashes () se omiten las barras invertidas, y con n12br() nos asegu- ramos de que los saltos de linea que introduzca el usuario se mantengan en el archivo final. puts () me permite asegurarme de que los nuevos comentarios aparezcan antes del con- tenido antiguo del archivo. La idea es que las nuevas opiniones siempre se muestren al prin~ cipio de la lista: Epute (Sfp, “entry \n Sold"); Funcién readfile() Qué significa react#ite (9¢1¢)? La funcién readfile() leerd el contenido completo del ar- chivo y enviaré el resultado al navegador. En pocas palabras: el mantenimiento del libro de Visitas no podria ser mas sencillo. Si no te convence el comentario de un usuario, s6lo tienes que abrir cl archivo de texto y borrar la entrada problemstica. Tu propio libro de visitas 55 eee CRMC cae) proteccion contra reload No me acaba de convencer el libro de visitas, creo que le falta una proteccién contra reload. Tal como esté ahora, si el usuario hace clic en el botén Reload (Actualizar) del navegador, se vuelve a insertar su comentario por segunda vez. Te parece poco probable que eso ocurra? No lo creas: si alguien quiere jugarte una mala pa- ve Gaon ae YBa hermes E-D - GD Brwrtcatenstesineatesaae Libro de visitas avanzado Tu coment Tw nombre Teme Ter 127001 Todos tos comentarios Pepa (psx Zpenia com) rte on 2005-11-27 sada, descubriré facilmente que puede desba- ratar el libro de visitas de esta forma. Bl resul- tado final puede ser una lista interminable de comentarios sin sentido. Por eso modificare- mos cl libro de visitas. He aqui una eaptura de pantalla de la version modificada. ;Ves la dife- rencia? Cédigo fuente de guestbook2.php En la pagina siguiente podrds ver el script mo- dificado. He llamado al archivo guestbook? php. Después de que hayas “dige- ido” el c6digo hablaremos de las modificacio- rnes que he realizado. ‘Hey Johar Fecidades pore eundemo, me parece bastante i, aunque a primera vist sen todo tan complica! Pepe (pspe Bootes cons) wroteon 2008-11-27: ‘Shaceraeste, me esperaba algo mis. De todas formas creo qu podré usr el digo de este ecco para ras cove. ‘Mister X (wincrs 2aoogl de) wrote en 2008-11-4 Ki vod work Im uyng the reload-protection Peter ctr Hi fohamn, ae de) wroteon 2005-12-4 hw ae you? Your guestbook is read ce, Guardamtos Ia direccién IP det usuario y ta utitizantos para compararla, En este caso, el hecho de mostrar ia EP es slo a titulo demostratico también la puedes eliminar, 56 Tu propio libro de visitas bibro de visitas avanzado Libro de visitas avanzado
Tu comentario:
cbr> a nombres
Tu IP: $ip

" SEpl - fopen(Sfilel, "r")7 Soldip = fgeta(stpl)s Eclose(Stpl)s echo "ch3>Todos los comentarios"; Lf ({ssat($_POST['comment']) s& $_POST|'name'] I= "" && $_POST['email"] t= "" ki Sip t= Soldip) ( Scomment = $_POST( "comment ‘17 Shame = $_POST|'name') ; Semail = $_POST[*omai1"] Sfp2 = fopen($file2, "r+": Sold = fread(#£p2, filesize($file2)}+ Semail = "Senail"; Sdateorentry = date("Y-n-3"); Scomnent = htmlspecialchars(Sconnent) Sconment = stripslashes(nl2br ($conment)) Sentry="

Snamec/b> (Semail) dijo el dia Sdateofentry:
scomment

\n" xewind(S£p2) 7 EputsiSfp2, "Sentry \n Sold"); felose($£p2) Sfpl = fopen(Sfilel, "we gpurs($fpl, Sip)s felose(Sfpll; name" > : readfile(stilez); > Tu propio libro de visitas 57 ‘Veamos cémo funciona exactamente el script. Cele Melero) M Lo que hago es averiguar la direccién IP de-ca- da usuario. Para ello utilizo la variable de ser- vidor ¢_ssaveR| ‘REMOTE_ADDR’ }. Sip = $_SERVER[*RENOTE_ADOR') Ademas, muestro la IP en la pagina insertando enla linea siguiente: echo "

tu TP: sipe/p>"? Sino quieres mostrar la IP en la pagina, omite esta linea de cédigo, Archivo oldip.txt Accontinuacién, abro el archivo oidip.txt ~ {que naturalmente he creado antes. Leo el valor de dicho archivo y lo guardo en la variable solaip. Spl = fopen(s#itet, *e*) Soldip = fgeta(sipi) : felose (Sep); Para ello basta con abrir el archivo en modo s6- Jo lectura (), leer el contenido y volver a guar- dar el archivo. Por el momento no nos interesa escribir ningiin dato en él Comparacién adicional He aftadido a la linea if una comparacién adi- cional: & Sip I= Sotaip Por tanto, sélo se permitira la publicacién del comentario si la direcci6n almacenada ante- riormente no coincide con la direccién IP ac- tual. Esto es lo que suele ocurrir cuando la en- trada es nueva, Guardar la direccién IP Se ha publicado la entrada? En ese caso, debe- temos almacenar la direccién IP del visitante del libro de visitas en el archivo ciaip.txt. De Jo contrario, no tendria ningtin sentido la com- paracién. Para ello, abriremos el archivo en modo w+. Lo que conseguimos es borrar el con- tenido anterior (esa es la particularidad de este modo) e insertar la nueva IP: Stpl = fopen(seitel, fpate(stpl, Sip) Eclose(stpt) r De este modo, la tiltima IP quedara disponible para la préxima comparacién, er Tete M1) Volvamos a la funcién date (). Analicemos esta funcidn mas detenidamente: no sélo permite mostrar la fecha, incluido el dia de la semana, sino también la hora, ee ¢->- 8 SO Cieimtawenma 9 05 funcién date() (Tenemos muchas posibitidades de formato para la fecha! A continuacién, presento una pequefa lista de los caracteres de formato mas importantes de Ja funcién date (): Caracteres de formato de fecha Los siguientes caracteres de formato son los que determinan como se mostrar la fecha. Cardcter | Explicacion Ejempio de forma- to i Dia del mes sin cero inicial De 1 a 31 d Dia del mes con cero inicial De 01 a 34 n Mes sin cero inciat Deta12 im Mes con cero inicial Deot a2 |s Cardinales en inglés (st, nd, | tst rd 6th 1th) y ‘Afio con dos ciras 02 v ‘Ato con cinco cifras 2005 > Dia de la semana, abreviado Mon UCL’ me Dia de ia semar Monday riiscula) —desarrollada M Nombre del mes, abreviado Jan F Nombre del mes, desarrolla- January w mana (O=do- De Das z ia del anto Deo 2366 t Cantidad de dias delmes De 28.231 ¢Quieres mostrar la fecha con el formato 1.8.06? Sdlo tendrias que escribir: echo datec".n.y") + 58 Tu propio libro de visitas {Te gustarfa que apareciese la fecha como Sril of August 2006? En ese caso, escribe: echo datei"s Si lo que te interesa es mostrar el da de la se mana en forma desarrollada, basta con: of FY: eco datec*t" | Como se puede ver, para el formato de la fe- | cha podemos jugar con espacios en blanco e incluso con otros caracteres. Sélo hay que | colocarlos en el punto deseado dentro de | date"). Si queremos mostrar cuntos dias tiene un de- terminado mes, escribiriamos algo asi como: echo "Este mes tiene dias."7 date("t") 2" Caracteres de formato de la hora Naturalmente, también tenemos a nuestra dis- posicién caracteres cle formato para mostrar la hora. Caracter Explicacion Ejemplo ‘am o pm am AMOPM AM Horasen formato 12h 1.412, Horas en formato 24h 124 Minutosde 00259 04 Segundosde00a59 12 o-zz>> La siguiente linea muestra la hora en la que se carga una pagina echo date("Hiize"); TEU eae M LE) {Te apetece hacer un poco de recapitulacion? {Te atreverfas con otro breve ejemplo con la funcién dace(0? El siguiente script saluda al usuario de forma distinta en funcisn de la hora en la que se visite la pagina. Para ello, utilizo una estructura i‘ elseif. fee aove Sew wb uecaiees eran Anse @ Gu) BS My Bresinsaneesrese sO » Momentos del dia Buenas acest Salutamos al usuario de forma distinta segri ta hora det dia, Encontraris el archivo correspondiente en el suplemento; se lama tnesofsay. pip: ) eleeif (date(i") <= 17) { echo "Tedavia sigues crabesendo2"y ) else { echo "jBuenas tardest Cookies y PHP 59 Cookies y PHP iNos alegramos de volver a saludarle! ¢En cudntas paginas Web has podido leer algo asi? Y lo mejor de todo... es que es verdad. Incluso semanas despues de tu tiltima visita, una tienda online se acuerda de los productos que guardaste en la cesta de la compra (y no llegaste a comprar). Todo sigue alli, comio sino hubiera pasado el tiempo. El “culpable” de to- do esto son las cookies. £Qué son las cookies? Las cookies son una de las técnicas més in- comprendidas en Internet: permiten espiar los datos de tu disco duro, son la puerta de entra- da de los virus.. jNada mas lejos de la realidad! Las cookies no son nada mas que archivos de texto que un si- tio Web puede usar para guardar informacién en el PC del usuario. Gracias a las cookies, un sitio Web puede ‘guardar tu visita en tu PC. O una tienda en li nea puede recordar los articulos que todavia siguen en tu cesta de la compra. Estos datos almacenados se vuelven a leer cuando se necesitan. :Quién los lee y desde dénde? Sélo puede leerlos la misma pagina que los cre6. O, para ser mas exactos, solo pueden hacerlo los documentos HTML de la misma carpeta o paginas HTML de subcarpe- tas. Pero, por lo general, no pueden ser leidos desde otro dominio. Por tanto, las cookies son un asunto privado entre el sitio Web, el navegador y el usuario. eDénde se guardan las cookies? Los datos se almacenan en el disco duro del PC. Asi, por ejemplo, Internet Explorer suele guardar las cookies en la carpeta ‘C:AWindows\Cookies. En el caso de Firefox, se- lecciona Herramientas | Preferencias y haz clic en Privacidad, Haz clic en el signo de suma jun- to a Cookies. Finalmente, haz clic en Ver coo- ios. En la ventana que se abrird, podras ver y bo- rrar las cookies a voluntad. Ver y borrar cookies: con Fiefse es de lo ms sencilt, ‘La cantidad maxima de cookies por usuario es- t limitada a 300. Una cookie no puede ocupar més de 4 KB, Un dominio no puede “hornear” més de 20 “galletas”. gSuponen las cookies un riesgo de seguridad? Quizas. Normalmente, el webmaster de una pagina Web no sabe que su sitio Web ha guar- dado una cookie en el equipo del usuario. Normalmente. Pero algunos webmasters ma- lintencionados podrian aprovechar las cookies junto con otros datos que hayan recopilado so- bre nosotros para crear perfiles de navegacién ¥ perfiles de usuario. Por tanto, las cookies pa- sana ser peligrosas cuando el usuario propor- ciona datos personales como el nimero de te- Iéfono, la direcciGn postal o la direccién de co- treo electrénico. 60 Cookies y PHP Establecer cookies con PHP Después de todas estas consideraciones pre- vias, ahora nos toca a nosatros “hornear” coo kies. Vamos a saludar al usuario con un saludo personalizado. oro Ge im Macares reraneo Ane GB) Wirmeitenenninseans S) Oe ey cookiel.php |Mealepe deen! oy En la primera visita se guarda ta cookie. ‘Guardaremos una cookie en el equipo del usuario. De este modo, la proxima vez que nos visite, leeremos la cookie y le saludaremos “personalmente”. oo faa ek Maen paranean Anse Gi BF SG Citwaronirosinn & Oy cookiel.php Me algo de voher a vena ord ‘Cuando se recarga la pagina, se le la cookie guardada. Nuestra cookie de muestra se Hamara stt=1, Crear una cookie en PHP es (como casi todo) extremadamente sencillo. Recuerda: las cookies son strings. Funcién setcookie() La funcion sercookie () te facilitara el trabajo enormemente. La sintaxis basica es la siguiente ~aqui sélo te muestro los argumentos que ne- cesitaremos para nuestro ejemplo. bool sateookie(steing name, stying value) Lo importante es que la cookie se envia en el apartado header. Por eso es necesario llamar a Ja funci6n al principio de todo, antes de la eti- queta HTML inicial. | Todas las cookies se almacenan automati- camente en la variable 5 costs, y el nom- "bre de la cookie se convierte en key. Seguro que no te resultars dificil leer y com- prender el sencillo script que te presento. ‘Nuestra galleta de muestra se llama "visit" = 3, por lo que podemos acceder al valor de la cookie a través de §_cookre | visit". Esta es Ja primera versién del script: Puedes consultar el archivo del suplemento cockiet.php. set eookle</titie> <meta http-equiv"content—type" content="cext/heml; charset=iso-BB59- cs </head> <body> <hl>cookiel -php</ni> - <?php 11 (existe In cookie y tiene ol valor 17 if (isaet (G COORIR|*vielt!]) 36 § COOKIET'wSese"] == 1) | echo "iMe algro de volver a verte!\n" } else [ echo "iMe algxo de verte!\n"; s </p> </eety> </pem]> ‘Ya hemos visto que en PHP abundan las arrays, por lo que no es de extrafar que todas las cookies se almacenen en la array asociativa Mamada $_cooKte. Get, Post, Cook No dejan de resultar interesantes los parale- lismos con el andlisis de formularios, con 520s y 3_ce. Anteriormente se podia acce~ der a las cookies directamente a través del nombre, igual que los valores devueltos por los formularios. El contenido de un campo de formulario llamado emai quedaba automati- ‘camente a nuestra disposicién en $enait. ¥ lo mismo con el valor de la cookie ve sie: podia- mos acceder a él.a través de $yisic. Sinem- ‘argo, actualmente sélo se puede acceder a ella a través de Cookies y PHP 61 $_COORIE 'Nonbre_de_1a_cookie"}, es decir, y siguiendo nuestro ejemplo, a través de 8 'visie"). Por lo menos mientras la opcidn seqister_glonais del archivo php.ini figure como or éCuanto tiempo vive! Después de recargar la pagina hemos visto que nuestra cookie para saludar al usuario funcio- na de maravilla, Pero si cerramos el navega- dor, lo abrimos mas tarde e intentamos acceder de nuevo a la pagina, ya no nos “recordara”. Se nos saludaré como si fuera la primera vez quella visitamos. No te preocupes, tu navegador no tiene mala memoria. Lo que pasa es que nos hemos olvi- dado de asignarle una “fecha de caducidad” a la cookie.que hemos creado. Hasta ahora hemos visto s6lo cookies tempora- Jes. Sin una fecha de caducidad definida, las cookies s6lo permanecen activas durante una sesién, 0 como mucho un par de horas més. Pero supongamos que queremos almacenar una cookie durante 30 dias. Indicar una fecha de caducidad Lasintaxis de la cookie ampliada con fecha de cadlucidad tiene este aspecto: bool seteookie(string nane, string value, int expire) A nosotros nos interesa el tercer argumento. Como determinamos la vida titil de la cookie? Para ello tenemos que saber primero la canti dad de segundos que han pasado desde el ini- cio de la época Unix. La época Unix se inicié el 1.1.1970 a las 0:00 h Puesto que este valor cambia constantemente, utilizaremos la funcién time () Con tine () podemos determinar la cantidad de segundos desde el inicio de la época Unix, Sin embargo, nuestro propésito era asignar una fecha de caducidad a la cookie. Para ello, agregaremos la cantidad de segundos que que- remos que “viva” la cookie en el futuro. Si la cookie debe permanecer activa durante 30 dias, sumariamos 2592000 segundos. También podemos escribirlo de esta forma: ‘ime () 186400°30 Cémo ajustar el script En nuestro ejemplo concreto, lo tinico que te- nemos que hacer es modificar esta linea: sercookie (visit, 1)7 dela siguiente forma: satcookle(*yisit", 1, time() + '86400"30); Encontraras el script modificado en el suple- mento con el nombre cookie2.php. Eliminar una cookie 2Cémo se puede eliminar una cookie? Supon- gamos que queremos borrarla porque el usua- tio ha abandonado definitivamente la idea de realizar un pedido con los productos que estan en su cesta de la compra. Muy sencillo: vuelve a colocar exactamente la misma cookie. Tanto el nombre como el valor deben coincidir. Sin embargo, en esta ocasién deberemos asignar una fecha de caducidad pa- sada. La siguiente linea de cédigo borraria la cookie de nuestro ejemplo anterior: setcookie("visit", 1, tine()-86400) Encontrards el cédigo correspondiente en el archivo del suplemento deietecookie. php. Cuando pruebes su funcionamiento, ten en cuenta que la cookie se eliminara cuando cie- rres el navegador. 62 Encuesta Web Encuesta Web En este capitulo nos dedicaremos a las encues- tas Web. Con PHP es muy sencillo crear en- cuestas: veamoslo con un ejemplo practico, Después de un largo y penoso periodo de obras y tras una pausa de muchos aftos, los tranvias llegaron de nuevo a Barcelona. Les preguntaremos a nuestros visitantes qué les parece la idea. Los nuevos tranvias de Barcelona. Sabias que Gaualf rmurié atropellado por un tranvia? Considera este ejercicio como un ejemplo que puedes adaptar mas tarde a tus necesidades. Nuestra encuesta permitiré al usuario elegir luna entre tres respuestas posibles. Puedes cambiar los textos y el tema de la encuesta, ya que el script es universal. Se puede adaptar (practicamente) a todos los gustos. Ademés, he incluido un par de “extras” en este ejemplo. En primer lugar, el resultado de la encuesta se almacenara en un sencillo archivo de texto con valores separados por comas. ES decir, no necesitaremos una base de datos SQL. ‘A este efecto, deberemos crear un archivo de | texto al que llamaremos resuits.txt.Es | nuestro almacén de datos. Escribe como va- lor iniciales 0, 0,0 es decir, tres ceros segui- dos. Recuerda que como signo de separa- ci6n usaremos la coma. Cuando publiques este archivo en tu servidor remoto, acuérda- tede ejecutar el comando ehmoa, del que ya hemos hablado antes. | En segundo lugar, me interesa evitar en la me dida de lo posible que se hagan trampas ~que alguien vote més de una vez. Esta vez solucio- naremos el problema sin recurrir ala direccién IP: en lugar de ello usaremos una cookie, El usuario solamente podra votar si no tiene coo- kie. A los que ya hayan votado se les guardaré una cookie en su equipo, de modo que no po- drén hacerlo por segunda vez. (No podemos evitar que tn mismo usuario vuelva a votar utilizando otro navegador o si desactiva las cookies. Desgraciadamente, el vo- to realmente controlado en Internet es practi- camente imposible). Une encuesta con todo Jo necesaro: después de enviar el oto «l boton de voto quedaré desactado. En tercer lugar, el resultado final de la encues- ta se representaré graficamente como un dia- grama de barras, mostrando los porcentajes de cada voto. Como veremos, en este caso s6lo hay que aplicar sencillos célculos matematicos. Pero para empezar, veamos la estructura del formulario. Visién general del script ‘Veamos los archivos de nuestra encuesta, y después de explicaré paso a paso su funciona- miento. Sino tienes ganas de copiatlo todo, en el suplemento puedes encontrar el archivo de la encuestavore.pnp, y el archivo de los resul- tados results.eho. vole.php Este es el script completo de la encuesta. Encuesta Web 63 <?php setcookie("check", 1); Af (isset(s post{‘submit'i)) ( setcookie(*voted™, 1); > <html> <head> <title>encuesta de opinitn " method="post"> Una idea exclente, los tranvias son rapidos y eficientes.
Me da igual, yo siempre voy en coche.
[Barcelona no necesita tranvias!

<2php Af (empty($_POST['submit']} s6 empty (3_COOKTE[*voted'])) ( Jj Mostrar el botén Subait s6lo si el formularic todavia 7/ no 90 ha enviado y el usuario no ha votado. Gracias por tu voto.

\n"; // (forwulario enviado? :Cookies activas? {Pero todavia no se ha votado? Af (Isset ($ POST['reply'}) 44 isset($_COOKIE('check']) && empty (S_COOKIE['voted"})) | // Guardar nombre de archivo en 1a variable Stile = "results.txt": Sip = fopen ($file, "r+"); Svote = fread($fp, filesize(9file)); /1 Descomponer 1a string del archivo en array con coma como separador Sarr_yote = explode(",", Svota); // explode convierte la string en array /] (Qsb valor se ha seleccionado en el formulario? // {81 recuento aumenta en 1! Sreply ~ $_P0ST["zeply']; Sarr_vote[Sreply]+r: // Volver a montar 1a string Svote = implode(",", $arr_vote); // implode vincula elementos de la array a string rewind (Sfp) ; // Escribir nueva string en el archivo fputs($£p, Svote): felose (Sfp) : 480-8859-1"> ubmit" value="Vora! >

[ results.php" target="_blank">ver resultados de la encuesta | 84 Encuesta Web Establecer una cookie Al principio del archivo se establecen dos coo- ies: la cookie check y la segunda, voved, (gra ‘las a la consulta i +) cuando el usuario ha en- viado el contenido del formulario. Ambas coo- kies s6lo permaneceran activas durante la se- sin actual, ya que no les asignamos tna fecha de caducidad especifica, Formulario La parte del script correspondiente al formula rio Seguro que te resulta obvia, creo que ya hemos hablado suficientemente de este tema. Creo un grupo de botones de opcian llamados seply. A partir de ellos se crea la variable 5_Pos? |" reply" i, que habré almacenado el va~ Jor 0, 10 2. Enseguida veremos por qué he asignado estos valores. Tampoco te suscitard dudas la visualizacién dinémica del botén submit: el botén de voto sélo aparecerd si to- davia no se ha enviado el contenido del formu- lario, es decir, mientras el usuario todavia no haya emitido su voto. Al botén submit le asignamos a propésito el nombre suibnit, ya que s6lo se crea tna varia- ble llamada s_Post|"subnit") después de hacer clic en él botén, y consultaremos su exis- tencia mas adelante. Asi, la cookie votes solo se establece una ver se ha enviado el contenido del formulario. explode() e implode() En el formulario hemos utilizado una funcién absolutamente genial, de la que todavia no habiamos hablado: expode (). Esta funcion divide una string autométicamente con ayuda de un signo de division y la convierte en una array, en nuestra querida y conocida lista de valores: vay explode (string separator, string string) De este modo, los valores entre los signos de division se convierten en elementos de la array. La funci6n impiode«) se encarga de hacer lo contrario: divide la array, elimina los signos de divisién y devuelve una string. De este modo logramos que nuestros inocentes rntimeros (hasta ahora 0,0,0) se conviertan en el primer, segundo o tercer valor de una array. enel cero, primero y segundo, para ser mas exactos. Porque segiin deberias recordar, la in- dexacién de una array siempre empieza por cero. Y esa es precisamente mi intencién. Creo una array llamada s2rr_vote para poder acceder a cada una de las posiciones a través de {0}, Svoteitl y vote [2]. Por ese motivo he asignado al campo del | formulario llamado rep los valores 0 (para la primera opeién), 1 (para la segunda op- | cion) y 2 (para la tercera opcién). Lallinea svote|Sreply}++) se encarga de au- mentar en uno el valor de la opcién corres- pondiente al voto del usuario. Para terminar, agrupo el elemento aumentado en uno y los ‘otros elementos que no habrin cambiado de la string, los vuelvo a guardar en la variable svo- te y lo devuelvo todo al archivo reswits cx: Enel fondo es muy sencillo, zn0? Reece mee Lier) Pasemos a la representacién grafica de los re- sultados: BB Siete enmany Resultados de la encuesta Teak deso Resultados a a One Las proporciones se muestran en forma de diagrasna de bras 2X el script de los resultados? Qué pasa con el archivo al que accederd el usuario cuando desee ver los resultados de la encuesta? Cédigo fuente de results.php En a pagina siguiente encontraras el c6digo completo del archivo resuits. php. shead> Stitlerencuests de opinidne/titie> body> Resul tados

opeién 1 unbsp:ced width="<2php eche Slengthd 4énbspy (<

23" bgcoloraved">anbsp; -<2php ocho $vote (0) 12>) La celda propiamente dicha la he rellenado con ‘un espacio en blanco protegido ( :) pero la longitud es determinada dindmicamente por PHP. La ultima celda muestra el porcentaje y valor absoluto de los votos. Este seria nueva~ mente el c6digo fuente del primer valor de la encuesta: Lector de hilos RSS 67 Lector de hilos RSS Has pensado alguna vez en poner los diltimos titulares de los portales mas importantes en tu propia pagina? Si el portal en cuestién ofrece newsfeeds o hilos RSS, no supone ningtin pro- blema. RSS es la abreviatura de Rich Site Summary 0 Really Simple Syndication -en funcién de dénde se lea en la Web. La idea de todo este asunto es que otras paginas ponen los titulares a disposi- cin de los usuarios, y nosotros podemos pre- sentarlos en nuestra pagina. Cada vez mas portales y especialmente perié- dicos ofrecen este servicio. Busca simplemente enlaces como “RSS”, "XML" o "RDF", con des- ctipciones que a veces indican “RSS 2” 0 “RSS Feed”. EI Pais también ofrece un hilo RSS para ler los ttulares Para leer estos hilos RSS normalmente es nece- sario disponer de un programa especial: un agregador de noticias, lector de feeds 0 feedrea- der. Thunderbird, el programa de correo gra- tuito de Mozilla, también puede leer hilos RSS. Si disponemos de un agregador de noticias, podemos leer el titular en pantalla y hacer clie en un vinculo para leer el articulo completo. Funci iento de RSS Sin embargo, lo que nos ocupa ahora es inte- grar estos contenidos en nuestra propia pagina Web, y adaptarlos a nuestro propio disero. Puesto que los hilos RSS se basan en el formato XML, no estén limitados a una determinada plataforma oa un sistema operativo concreto. Y si, ademas, utilizamos PHP 5, disponemos del lenguaje ideal para leer archivos XML. {OCDE sera sa revi ceca coon ela Ast mostrar ls feeds nuestro agresatr de noticias. Si se Ihae chic en “ler todo” se redirige at usuario ala pina original de fa noticia Documento de ejemplo Como hemos dicho, los newsfeeds son archi- vos XML. En la pagina siguiente te muestro la estructura basica de un archivo RSS versién 0.91 creado por m{ mismo. “Las versiones 0.91 y 2.0 son las versiones tos expands do RSS. Las dfrencias en tre 0.91 y 2.0 apenas son importantes ‘Sluis Hee prea oo | das las versiones. A continuacién puedes ver el cédigo de un ar- chivo RSS ficticio. El archivo se llama silverstone.xai,-con la extensién . xsi puesto que tiene formato XML. Sin embargo, en Inter- net se suelen usar también las extensiones .:ss © -php. Nuestro agregador podra leerlas todas. 68 Lector de hilos RSS <2xml versten Posta Frank Silverstonec/title> <linkohttp: //wwe, frank-silverstone.org</Link> <description>Servicic para mis lectores </description> <language>es</anguage> <copyright>Frank Silverstone</copyright> <title>servicio para mls amigos</titie> <description>01timos poenas...</description> <Linkohttp: / /wwe. frank~si lverstone.org/poenas</Link> </item> <item <ELtLeStuevos: posmas</titie> <description>Volunen 3</description> <Linkohttp://mww. frank~silverstone.org/volunen3</Link> </iten> <item ‘<eitlemi famitia</eitie> <desceiption>Mi familia es...</deseription> <Linkohetp: //wew. frank~silverstone.org/familias/Link> </iten> /ehannel> </rss> ESO-BB59-1" 2> Lector de hilos RSS 69 heeigoc Nf octane? Sint. dk ben pane E> Asi se veri el archioo XML “desnudo” en el navegador, Si nolo ves ast, seguramente et archivo tiene algt error. Pero hablemos del eédigo XML. Vision del codigo XML La primera linea constituye el prologo XML, en el que suele indicarse el conjunto de carac- teres europeo occidental (:s0-8859-1). A con- tinuacién se coloca la declaracién del tipo de documento (pura formalidad). Aqui se indica el tipo de documento junto con un vinculo a la definicién del tipo de documento. Sin embar- go, muchos autores omiten esta Iinea sin que €llo conlleve ningiin problema de visualiza- cién. La siguiente etiqueta es el Hamado elemento raiz del archivo XML/RSS. Aqui es donde el autor debe indicar la versi6n RSS, por ejemplo 0.91 6 2.0. El elemento raiz debe cerrarse al fi- nal del archivo RSS. A continuacién se coloca el elemento <channe1>, que también aparece s6lo una vez. ¥ también debe cerrarse al final. Es el gran “pa- réntesis” que abarca todo el “canal de noti- jas”: <ehannel>Canal de noticias</channel> Lectura de elementos Dentro de este canal (channel) se colocan los items, es decir, los verdaderos “puntos de con- tenido”. Cada item esté rodeado por el par de etiquetas <iten></iten>, Dentro de un <iten>, Jos siguientes pares de etiquetas son especial- ‘mente importantes para nuestro caso: <title>titilec/titie> <LiniouRE</Linko <description>....</description> Se trata del titulo, el vinculo al articulo comple toy una descrpcién. También se puede incluir una imagen con la etiqueta: <tnage></image> yla URL de la imagen: <url></url> Existen_ muchos otros atributos como copy- right, author, etc., que no presentaré aqui para intentar simplificar las cosas. En la practica tampoco se usan con demasiada frecuencia, por lo que no los leeremos en nuestro ejemplo. Cero me (Me ola a ey Pasemos ahora al agregador de feeds propia- ‘mente dicho. Gracias a RSS puedes incluir noti- cias de otras paginas en tu propia Web: titula- res, descripciones y vinculos a tus feeds favori- tos. Sin embargo, antes de ponerse manos a la obra es conveniente informarse en cada fuente sobre las condiciones de utilizacién de este ser~ vicio. Gracias a PHP 5 es muy sencillo leer un archi- vo XML, porque desde la versin PHP 5 se ha incluido la genial funcién SimpleXML. Sélo ne- cesitamos una funcién, un bucle y un par de li- neas de cbdigo. Cédigo fuente del archivo feedreader.php En primer lugar te ensefiaré el cédigo fuente completo del agregador de noticias, y después analizaremos en detalle su funcionamiento. 70 Lector de hilos RSS <!DOCTYPE HIML PUBLIC "-//W3C//DTD HTML 4.01 Teansitional//EN"> ‘ehoml> <head> ctitlesPeadreader Lector RSS chanhel->item as $item) { Sshow .= "ch3>($item->title) "s Sshow .= "

{Sitem->description}

"; Sshow = "edivoca hrefe! (Sitem->Link) '>leer todo"; , echo utfé decode ($show) | else ( echo "

Error, no se pudo leer el archivo
"; ) Jw elpais.es/ras hem"; Lector de hilos RSS m1 simplexml_load_file() La estrella de nuestro script se lama sencilla- mente simplexmi_toad_rile(). ¥ tan sencillo como su nombre es el funcionamiento ce esta funcién, He aqui la sintaxis basiea: object simplexml_toad_¢ite (string filenane) La funci6n toma una string, en este caso el ar- chivo XML, y devuelve un objeto. Pero antes de entrar en detalles, em conel pun- to enel que se indica la del archivo XML en cuestion, En primer lugar, lenamos la variable snewstees con la direccién Web del feed de- seado. En este caso se trata del feed de titulares de El Pais (www.clpals.es), pero deberias poder ‘usar cualquier otra direccién sin problemas. Como prueba, podrfamos usar nuestro archivo local siiverstone.xni. En ese caso, escribiria- mos: Snewsfeed ~ "sitverstone.xal": Y veremos lo siguiente en pantalla al abrir el archivo feedreader.php: Lector RSS Servicio para mis amigos hint poms Ieertode Nuevos poemas otinen 3 Mt fama Ma lesen Nuestro archivo locel también se puede leer perfectamente, En este sentido, no importa si el archioo XML tiene a extensign xml 0.18, Es s6lo una sugerencia. Nuestro agregador de feeds es universal, y es capaz de leer la mayo- ria de feeds en formato RSS0.91 y 2.0. A continuaci6n, inicializamos la variable con una cadena vacfa y llamamos a la funcién simplexl load file(snewsfeed). El signo de arroba sirve solamente para ocultar los mensa- jes de error que podeian aparecer si el feed no. fuera valido, La funcién creara el objeto que ya hemos dicho, que guardaremos en la variable sess. Utiliza- ‘mos la consulta ‘£ s6lo por motives de seguri- dad. La funcidn simpexm_load file) com- probaré al leer el archivo que el cédigo XML. sea valido. En caso negativo, la funcidn de- vuelve £21se. Puesto que no tendria sentico ‘mostrar contenido no vilido, lo que haremos es mostrar el siguiente texto: Error, no se pudo leer elarchivo. Bucle foreach() {Qué es Jo que ocurre si la funcién termina sa~ tisfactoriamente, para qué sirve el bucle foreach? Los distintos niveles de jerarquia del archivo XML se guardan en el objeto $rss co- mo una array de objeto, pero nosotros quere- ‘mos consultar todos los ‘ons. Por lo tanto, pa- samos del objeto de nivel superior desde la ett queta channel hasta item: Seve->ohannel >iten El bucle foreach nos permite recorrer la array con todos los : same: de este modo podemos consultar el contenido de las etiquetas subor- dinadas, y hacerlo paso a paso mediante: siten->tagnane Por ejemplo, se puede acceder al titulo con: Siten->titie Para averiguar la deseripcién, se usa: eiten-sdeseription Y el vinculo se puede consultar a través de: Siten->tink No podria ser mas seneillo. Al final, damos formato a todos los elementos utilizando HTML, se crea el vinculo y se guar- da la string en la variable $show. 72 Lector de hilos RSS Funci6n utf8_decode() 2Y para qué sirve esta linea de codigo? echo ut£8_decode($show) 7 ‘Todos los feeds se parsean como UTF-8 (Uni- code), aunque el archivo XML use el encoding 1S0-8859-1. De ello se encarga, de forma total- mente automatica, la funcién sinplexml_load_£i16().Por tanto, sin ur£®_dacoda() los acentos y caracteres espe- ciales de los feeds tendrén un aspecto ininteli- fe ee) ean ee ee eet Lector RSS. Soibes ve improbable probaciAs de ofr «Eades sn condones lied ome Pd in plaid gm dn (gral ertwarh Thue Compromise melo Co ‘rdte ova Etre etapa setae h surge da eat {OCDE stern se revs erect dn eeonomnAn ‘opal he tb en 208 acre Compa Dr Eon OCH a cna ome dwn eet ‘Feta pr yn \ Sia jor nal wa omen pase pen Este ese aspect del fed si nose incluye la funcin utf8_decode(). i utilizamos ut £8_decode() podemos conver- tir los datos codificados en Unicode nueva- ‘mente al conjunto de caracteres ISO-8859-1. El funcionamiento es muy sencillo: SimpleXML es capaz de leer y mostrar incluso contenidos HTML dentro de los llamados pérrafos CDA- TA (CDATA = CharacterDATA). Este tipo de parrafos CDATA (es decir, parrafos con HTML. € imagenes integradas) se pueden encontrar en RSS 2.0. Resolucién de problemas Has publicado el script en tu servidor Web remote y ya nada funciona? Recuerda que es- tamos trabajando con PHP 5. El script de mues- tra s6lo funciona a partir de PHP version 5, no en versiones anteriores. Para nuestra prueba local no supone ningtin problema, porque XAMPP instala automaticamente PHP 5. Sin ‘embargo, si tu proveedor de alojamiento no ha instalado esta versin de PHP, el script no fun- cionard. Lo mejor es que compruebes si el pro- ‘veedor soporta la tiltima versién. Muchos alo- jamientos Web Io hacen, incluso paralelamente En las pruebas que he realizado por mi cuenta nome he topado con ningiin problema de ver- siones en servidores remotos ~aunque solo con Ia extensi6n ppp. Lo mAs recomendable es investigar previamente si tu proveedor de alo- jamiento soporta PHP 5. Anexo: sangria del codigo 73 Anexo: sangria del codigo Para terminar el cuaderno dedicaré unas pagi- Sin embargo. es muy recomendable ordenar y nas al tema del “buen e6digo”. Pero antes de organizar el cédigo, y para ello se puede usar nada, tengo una pregunta: ;Conoces PEAR? ‘un amplio repertorio de "white spaces”: espa- cios en blanco, tabulaciones o lineas en blanco. Pea Ny Esto te ayudard a estructurar correctamente tu cédigo. | PEAR es la abreviatura de “PHP Extension and. : : Application Repository”, una grandiosa biblio- En este cuaderno he predicado con el ejemplo y teca de ampliaciones y aplicaciones de PHP Jo he programado todo siguiendo la norma de que se pueden descargar y usar libremente, codificacion de PEAR. Actualmente existen 350 paquetes de progra- mas distintos, también Hamados “packages, a: ser ordenados desde la A de autenticacidn hasta la ‘eter penile | Tadonting and Line Length X de XML. Puedes encontrar el listado comple- toen hitp:/ipear pho net. Site interesa colaborar en la biblioteca de PEAR como programador, deberas respetar al- gunas normas de programacién, por ejemplo. las relativas al formato del cédigo y la disposi- cién de espacios en blanco. El manual de codificaci6n de PEAR se puede descargar desde itp: /fpear phat, {Pero qué es exactamente lo que exige esta norma de codificacién? Espacios en blanco En primer lugar, veamos donde es necesario insertar siempre espacios en blanco adiciona- les. Operador de asignacion Una ania oferta de packages para todos los gustos: si Coloca siempre un espacio en blanco antes y ‘qucromes partcipar aportando nuestro granito de aren, después de un operador de asignacién: deberemos respetar la norma de cédigo de PEAR, Pipalutbelisces Detrds de la norma de codificacién de PEAR Si colocas varias asignaciones de variables una se esconden estrictas normas para la escritu- detras de otra (por ejemplo, al principio de un ade c6digo legible, script), también puedes poner varios espacios x= a en blanco para que la lista esté mejor ordenada Al parser de PHP (es decir tu servidor Web con . y equilibrada. PHP que se encarga de interpretar el e6digo) Siong_variable = “sample s cen principio la da igual cémo escribas el cba! Sshort go. Una linea debajo de otra o una detrés de iceiiae oie 2 thas ‘otra? ¢Todo en una sola linea? Mientras no te : olvides delos puntos y coma al “Final de la Ie Puedes hacerlo asi, aunque no es obligatorio. nea” y no cometas ningtin otro error de pro~ gramacién, no pasa nada. 74 Anexo: sangria del codigo Operadores de comparacion Coloca un espacio en blanco antes y después de cada operador de comparacién, por ejem- plo, en las estructuras de control. Observa el siguiente ejemplo de codigo: if (Spasswordli=sl"abe xyz 123") { Eneste ejemplo estamos aplicando también la siguiente regla: Estructuras de control y bucles Coloca un espacio en blanco en las estructuras de control como if y switch y bucles con for 0 white. Colécalo después de la palabra clave y antes de la Have de abertura. Adfl(Spassword == “abe_xye 123") Sin espacios en blanco eDénde NO hay que poner espacios en blanco? Liamadas a funciones {Quieres llamar a una funci6n o definirla? En ese caso, entre el nombre de la funcién y el par dee paréntesis no debe colocarse ningxin espacio en blanco: setcookia("visit®, 1) De esta forma podemos distinguir las funcio- nes de las estructuras de control e indicamos que el nombre de la funci6n y el /los argumen- to(s) estén estrechamente relacionados. setcvokte (visit, JB) {Cuando es necesario aplicar sangria al c6di- 20? En las estructuras de control como ‘+ 0 switch. Yen los bucles camo white, For. do 0 foreach. | Bl codigo se: entre un par de llaves eee es Af (Spassword == “abo_xyz 123") | MMMislogin = trues 6 for (G1 = 07 $1 < Smaxz S39) | Mecho "This is a sentence”: ) Sin embargo, en el caso de una expresi6n con switch la sangria tendria este aspecto. Ademés, después de cada break deberemos insertar una linea en blanco: Switeh (Condition) { case 1: (Miactionl; Mireak; case 2: (iection2; (iereak: default: (liidefavitaction; Giereak: ' Lo bueno de la sangria es que evita confusiones con las Haves de abertura y cierre. Gracias ala sangria, podremos reconocer estructuras ani- dadas, y encontraremos fécilmente la lave de cierre correspondiente. (Te has fijado? PHPEdit también te ayuda a encontrar los pares de laves relacionados. Al hacer licen la primera llave, se resaltaré en color rojo la Wave de cierre. Llaves A propésito de las llaves: los responsables de PEAR recomiendan precisamente el uso de las, aves tal como esté aplicado en este cuaderno, y animan a utilizar siempre llaves, incluso ‘cuando no sean estrictamente obligatorias. (Pe- ro dado que en ningiin momento he recomen- dado obviar las llaves en estos casos, no debes preocuparte por eso). Anexo: sangria del cédigo 75 al aN TCC] ENo tienes ganas de aplicar sangria al cédigo a ‘mano? Yo también pasé tiempo buscando un editor con una funcion de “lifting” automatico del cédigo. Como habris imaginado, el practi- co editor PHPEdit puede hacer exactamente eso, Sangria automatica Prueba una vez la funcidn de “belleza” del 06- digo y quedaras admirado. 1. Abre un documento PHP ya existente. Sa w [0 seRe er Sg Into oi 2. Selecciona Tools | Code beautifier | Beautify ‘Curront Document 3. La primera vez que se utiliza esta funcién es necesario asignar un nombre al perfil y configurar las opciones. En principio se pueden dejar todas lac opciones predeter- minadas y sencillamente hacer clic en acep- tar. PHPEdit seguir automaticamente las normas de sangria de PEAR. Sélo la san- gtia aplicada a switclt es un poco demasia- do, 4, Tras ejecutar la funcién, el cédigo quedara perfectamente organizado como por arte de magia. ‘Yo suelo usar esta funcién muy a menudo y no tengo ninguna queja. Indice de palabras clave 79 indice de palabras clave “oncatenacién, Intranet, 10 php.ini, 30 ens Soa issn), 31,48 Pie '$_SERVER[THP SELF] fanpesiec IVA.de un valorbeto, i... : = “sable 60 IVA de un valor net, post 27 fecha decaducidad, a Problema de ts a a Javascript coms 38 ation, introdacsiin, 59 PHP, Proteccin con Actvaros mensajes de Pec: ie ontraset, 37 nl pinned AMP, 5 Prosescon conta pee ie dae) 2, 54,57 edo, Rasmus 4 ssentura 51 eee sdeterminar el dia de Libro ce visitas, 52 Panto y coma, 14 eae Ja semana, 22, Me ites, 34 readfile(), 54 remmstreiyr ——_gacctrcanas, «Mu, ie “ae mes 22 Mes Reondeo, 25 Apache Dees method, post y get, 27 register gtobals, 61 ui, 1 Buplement,# ier, 44 register_globals, 28 itpaconf, 10 noe Miniter, Apuntador de archivo, i Mostrar la fecha, 57 pla de tres 66 cy sowie new ne Regus previs 3 Archivo, modo, 4? ee nizbrd, rewind), 50 Archivos de ejemplo, sae ewe eae Nueva linea, 20, round(), 25, descarga, 3 else, (Ocultar caracteres RSS, 67 Arrays 21 lst 38 especiales, 20 Sangria, 73 onto olementos, 22 E-mail, vinewlo emai, one SEP, 6 foreach, 42 a concatenacién, 17 ‘Servidor Web Apache, 9 formesboevinds, 21 smpry0.d4 Operadores de calcul, setcookil, 0 forma desarolada, ren - aaa - ferent Operadores de simploxm oad indice, 21 iin, 6 aren, kerry value, 33 explodel), 1 Ste finlareaieas signode feose) 50 resumen 20 nt.20 equivalencis, 3 Feedreader, 67 mee feat, Araya, 23, FOeecok prbiai bien sau vas para a teateat Problema delas ra figets0, 50 ‘colaboracién con arden 23 break 19 Sete S05 is tipode variables, 16 Bucle de recuento, $1 fepanty pape stint. 35 Bucles definicién, 4 a condicion de ciere, foreach 42,71 defines a a pacer ee funcionamiento, 4 ‘Tipos de datneide tas do white, 41 Formmailet universal, informacién en iared, variables, 16 for, 41 = 6 ‘utf8_decode(), 72 foreach, 42 Borecnlerien informacién sobre value, 33 introduecion 40 ‘vanzados, 23 PHP as Bisque de errors fputs), 50 inventor 4 ‘rays 21 comentarios, 15 fread, 5 material de intradeciin, 16 errores comunes, 18 get referencia, 6 pprobar con empty), Cater lia de a Get, Pt, Cookie, 60 primeronpaos 3 ee ‘semana, 22 header, 37 redondeo, tipos de datos, 16 Citeulos eon PHP, 24 Hola Mundo, 13 tall de ines, 19 WAM, 5 checked, 33 Hosting, 5 pee ae XAMPP chmod 666,51 HITTP-Request 4 jee ee ilies ‘olde: Apeetay Céigo sgn ls implode, 64 - ntti normas PEAR 73 ie atesiae stax sala, Comentarios, 15. Inicio de MySQL, 9 i : versus JavaScript 4 PHP 5 PROLOGO. LQUE ES PHP Y PARA QUE SIRVE? “QUEEN INVENTO PHP? : [ASIFUNCIONA PHP... MODELO OE UICENCIA be PHP. AALOJAMIENTO ADECUADO, CaracTerismicas De PHP MaNUAL.DE PHP. INSTALAR UN SERVIDOR LOCAL CON PHP WOMEIIVADTERR EO ‘SERVIDOR WEB APACHE. XAMPP DeScARGA DE KAMPP INSTALAGION DE XAMPP. Inicio DE XAMPP. RESOLUGION DE PROBLEMAS ec XAMPP PARA LA INTRANET... Seam ‘TU PRIMER OOCUMENTO PHP non 10 LAFUNGION PHPINFO). AD ‘TUEDITOR: PHPEDMT ae ca PRIMEROS PASOS CON PHP .. Inicio De PHPEDIT... stars HELLO WORLO! EL PRINER SCRIPT 3 MOSTRAR DATOS CON ECHO. 14 ComenTar Et coo16o. 15 VARIABLES COMO COMODIN VARIABLE .. ‘VARIABLES. HELLO MIKKEL, NCE TO MEET YOUI concn QpERADOR DE CONCATENAGION PU (nn COMO EVITAR ERRORES UBREAK 0 SALTO DE LINEA?.. ELSIGNOESCAPE\, INTRODUCCION A LAS ARRAYS. LOS DIAS DE LA SEMANA COMO ARRAY. 2 DIAS DE LA SEMANA OINAMICOS. 2 CONTAR ELEMENTOS OE ARRAYS CON COUNT().. 22 ‘ARRAYS ASOCIATIVAS ¢CONCATENAR STRINGS © NO? CALCULOS CON PHP. ‘OPERADORES DE CALCULO Suns SIMPLES IVADE UN VALOR NETO... IVADE UN VALOR BRUTO. FORMATO CON SPRINTF(). CREACION Y ANALISIS DE FORMULARIOS... 'ANALISIS DE FORMULARIOS CODIGO DE ANALISIS PHP ESTRUCTURA IF-ELSE....00 ns vovoonnsnrans 2B BOTONES DE OPCION a8 OPERADORES DE COMPARACION onan [ACTIVAR LOS MENSAJES DE ERROR 30 FUNCION SET) on ANALISIS ENUN ARCHIVO FORMULARIOS AVANZADOS. [DATOS DE FORMULARIOS COMO ARRAYS =. 33 [MOSTRAR NUEVANENTE LOS DATOS. 38 EL PROBLEMA DE LAS COMILLAS m4 FUNCION HTMLSPECIALCHARS() 3 35 FUNCION STRIPSLASHES(. 35 FUNCION NL2BR(). seasons PROTECCION CON CONTRASENA... REDIRECCION CON HEADER()... IEY ELSEIF. CCoNTRASERA GON ELSEIF ENVio DE UN FORMULARIO DE OPINION. LA FUNCION WAL() NAILER PARA ENVIO DE OPINION. PRUEBA OE VARIABLES: EMPTY), EXPLICACION DEL SCRIPT CCONFIRMACION DE ENVIO nn COCULTAR MENSAJES DE ERROR... [ASIGNACION Y CONCATENACION FORNOAILER UNIVERSAL PROGRAMAR UN CONTADOR. UN CONTADOR SENCILLO FUNCION FGETS() REWIND() ¥ FPUTS().. RESOLUCION DE PROBLEMAS CON CHMOD | ‘Tu PROPIO LIBRO DE VISITAS LA FUNCION FREAD) nnn MOSTRAR LA FECHA CON OATE(), LIBRO DE VISITAS CON PROTECCIGN CONTRA RELOADSS DETERMINAR LA DIRECCION IP. ar CARACTERES DE DATE() MOMENTOS DEL DA... Cookies Y PHP ZQUE SON LAS COOKIES?... ESTABLECER COOKIES CON PHP. Get, Post, COOKE... {.CUANTO TIEMPO VIVEN? ELiMINAR UNA COOKIE Encuesta Wes.. EXPLODE() EIMPLODE() REPRESENTACION GRAFICA. Lector 0€ HiLos RSS FUNCIONAMIENTO DE RSS, \VisION DEL cODIGo XML. CCREACION DEL LECTOR DE FEEDS... SIMPLEXML_LOAD_FILE() Bucte FoREACH(. FUNOION UTF8_DECODE(). RESOLUCION DE PROBLEMAS. ANEXO: SANGRIA DEL CODIGO.. ZQUE ES PEAR? EspAciOS EN BLANCO... ‘SIN ESPACIOS EN BLANCO. Sancrla. 7 PHPEDIT Te AVUDARA ‘SANGRIA AUTOMATICA LOS MANUALES DE PC CUADERNOS. VENTA AL NUMERO. INDICE DE PALABRAS CLAVE... ISBN 2-915605-31-9 9°782915"60531

Вам также может понравиться

chpopeion 2 énbspysnbsp: énbap;anbsps (} : snbsp
cb>opeion 3 Enbep: inbap/ tnbsps ()
65 66 Encuesta Web Vision general del script Para empezar, abrimos el archivo vesuitts-tx*. En esta ocasidn nos bastaré el modo de solo lectura, por lo que escribiremos 2fp (Sfile, "e"); Con fread) leeremos después el contenido de todo el archivo y al- macenaremos la string en la variable svore. No necesitamos mas, por lo que enseguida pode- mos volver a cerrar el archivo con tose ()« A continuacién se activa la funcién explode) que divide nuestros tres niimeros separados por comas en una array. A continuacién, se suman los tres nimeros y el valor resultante se guarda en la variable sai tvores, De este modo ya sabemos cuantos votos se han emitido hasta el momento. Lo siguiente es ocuparnas del diagrama. Tenemos que definir como minimo Ja longitud maxima de una barra: yo opto por dejario en 400 pixeles y guardo el valor en la variable siensth, Longitud de las barras La dificultad no estriba en dibujar barras ~ese problema lo hemos resultado con celdas de ta- blas dle distintos colores. Asigno dinamicamen- teal atributo wsiatn de cada celda la longitud ceseada. No es especialmente elegante, pero funciona. El verdadero problema es cémo se determina la longitud. No queremos que las barras crezcan desde cero hasta un mimero ilimitado de pixeles, ya que en algxin momento se nos acabaria la pantalla. La longitud de las barras tiene que tener sentido, respetando la relacion que existe entre ellas. piel), Asi, puedo calcular la longitud de la primera barra (variable seagrn0) de la siguiente for- sma Flenytho = Svotet] + Flength / Sailvotes; El valor resultante se redondea (porque necesi- to ntimeros enteros para el valor en pixeles) y se muestra como widths de las celdas de la ta- bia. Determinar los porcentajes Aprovecho la ocasién para calcular también los porcentajes, y redondearlos. Multiplico la can- tidad de votos por 100 y lo divido por la canti- dad total de votos. Este seria el célculo del primer valor de la encuesta: // Caleulay y xedondear el porcentaje // de 0 Spercent0 = 100 * SvotefOl / Sallvotes: Spercent0 = round(Spercent0, 0) El truco de la tabla invisible Como ya hemos dicho, para mostrar los datos y dibujar las barras se utilizan varias tablas in- visibles, Resulta especialmente interesante la peniiltima celda de cada tabla, en la que se crea Ja barra de resultados:
anbap; énbsp?anbsp; ()