Académique Documents
Professionnel Documents
Culture Documents
com
Programacin en PHP
Principios bsicos para la programacin en PHP, el popular lenguaje del lado del servidor. Manual asequible para no programadores que sienta los fundamentos bsicos de este lenguaje. Continuacin lgica del manual de pginas dinmicas.
Daniel Lpez
http://pichongol.blogspot.com (% captulo
Jorge Ramos
(% captulo
Brian Hernndez
or !u aprender H
Enumeracin y e plicacin de las ra!ones por las que debes invertir tu tiempo en aprender a desarrollar sitios "eb con PHP . "El bien ms preciado que tenemos en la vida es el tiempo"
Me he permitido comenzar con una frase que dudo haber sido el primero en pronunciar, y por la que muchos de vosotros pensaris que me he puesto "mstico" innecesariamente. Pero tiene su razn de ser. Cuando te pones a estudiar un nuevo len ua!e de pro ramacin est"s invirtiendo tu tiempo, ese bien tan preciado que tienes y, por supuesto, debemos esco er correctamente a qu len ua!e apostar nuestras cartas. P#P es el len ua!e que hoy puede resultar m"s interesante de aprender por muchas razones, y de ello trata este artculo, que sirve de resumen del contenido ofrecido durante el pro rama $php%& del '( de enero de )*'+. , continuacin te ofrecemos el listado de razones destacadas por los distintos ponentes que participaron en este evento, animando a todos los espectadores a aprender P#P"PHP es la evolucin lgica en el aprendizaje de todo desarrollador web" .os /imas 0u!"n 1!osedlu!an ,prender P#P es idneo porque es el len ua!e m"s indicado para cualquier persona que haya e2plorado previamente otros len ua!es 3eb m"s b"sicos, como pueden ser #4M0, C55 o .avascript. 4odo desarrollador 3eb que se precie ha pasado por P#P, por diversas razones, entre las que destaca su facilidad de aprendiza!e y las capacidades de P#P de realizar tareas clave que necesitan implementar la mayora de las aplicaciones o sitios 3eb. 4al como nos indic .os, de los $android%&, P#P es sencillo porque se desprende de muchas de las dificultades o ri ideces de los len ua!es de pro ramacin. Podemos hacer un uso sencillo de P#P, pero tambin tiene frmulas para un uso avanzado. 6s un trmino medio entre un len ua!e "marciano" y un len ua!e "humano". "5i t7 desarrollas 3eb, pero no pasaste por P#P, te perdiste un aprendiza!e muy bonito, muy divertido y la posibilidad de hacer las cosas sencillas". "La comunidad hace grandes a los lenguajes de programacin" Claudio Morales 1pronuer 8a!o la e2periencia de Claudio, fundador de 1pro ramasP#P, la comunidad de P#Peros de M2ico, la comunidad es uno de los puntos que hacen fuertes a P#P. 62iste mucho traba!o bien hecho por las personas que hacen o traba!an con P#P y que provoca que este len ua!e ten a una lar a vida. 6n pocas horas una persona puede empezar a pro ramar en P#P y eso facilita que la comunidad no pare de crecer y cada vez P#P sea m"s utilizado. Por otra parte, destac Claudio, la mayora de soluciones de hospeda!e incluyen P#P como opcin principal y m"s econmica. 6sto provoca que las personas al final quieran usar m"s el len ua!e y las tecnolo as que lo rodean. P#P es un len ua!e de la comunidad, hecho por una enorme comunidad y utilizado por decenas de millones de desarrolladores en todo el mundo. 4antos millones de profesionales no pueden estar equivocados al mismo tiempo. ",prender P#P es como remar contra corriente, si no se hace, se retrocede". "Puedes desarrollar muy rpido aplicaciones web utilizando frameworks" 9einaldo , uilera 1reia uilera 0a curva de aprendiza!e de P#P es sencilla, y ests en el sistema operativo que ests, puedes instalar P#P y empezar a pro ramar. P#P es muy poderoso y est" presente en la mayora de los servidores p7blicos de %nternet. 4odas esas son razones suficientes para esco er P#P como len ua!e de pro ramacin del lado del servidor, pero hay un motivo que todava ana m"s fuerza en la actualidad, los frame3or:s.
Tu mejor ayuda para aprender a hacer webs www.desarrolloweb.com 6s muy f"cil encontrar un pro ramador de P#P, pero no lo es tanto encontrar un pro ramador de P#P que adem"s desarrolle atendiendo a un modelo o patrn de dise;o, con buenas pr"cticas que eneren un cdi o de calidad y f"cilmente mantenible. Para todo ello tenemos los frameworks. 6n P#P disponemos de infinidad de variantes, unas m"s sencillas que otras, entre las que destacan Codei niter, 5ymfony, <end, =ii. 5on productos que han lle ado a un estado de madurez muy interesante y que nos ayudar"n enormemente a ser me!ores desarrolladores y m"s productivos. Pero adem"s de los propios frame3or:s, hay multitud de aplicaciones que nos pueden ayudar a cumplir ob!etivos en un abrir y cerrar de o!os, con calidad y altas prestaciones en todos los sentidos. 4enemos CM5s como >ordpress, .oomla? o /rupal, los m"s populares, que son una maravilla, y que forman parte del corazn de miles de millones de sitios 3eb. = no solo eso, si necesitamos un soft3are para comercio electrnico, las me!ores soluciones tambin est"n en P#P, como Ma ento, &sCommerce o Prestashop, etc. 0os e!emplos de herramientas basadas en P#P son inacabables. 9einaldo, de los $dev%&, invit a todos los espectadores a tuitear al creador de P#P y a radecerle su traba!o, que nos ha dado de comer a millones de desarrolladores en todo el mundo. "@racias 1rasmus por P#P $php%&" "Por u! estudiar PHP" para trabajar" Pablo 8ernardo 1voylinu2 Pablo 8ernardo, director de $0inu2%&, nos di una apro2imacin a su e2periencia como desarrollador incorporado al mundo 3eb desde hace menos tiempo que otros compa;eros de este evento. ,ntes de decidirse por P#P pre unt a un e2perto en el que confiaba qu len ua!e esco era para aprender y ste le respondi con otra pre unta Aqu es lo que deseas hacer con ese len ua!eB Pablo di!o "encontrar traba!o". 0a respuesta que recibi fue rotunda- ",prende P#P". 6l hecho es que P#P le funcion, encontr traba!o y desde hace relativamente poco tiempo se dedica profesionalmente a la pro ramacin y ha tenido el enorme placer de acceder a una de las me!ores comunidades, la del soft3are libre y la pro ramacin en P#P. Pero m"s all" de la e2periencia personal, son datos ob!etivos que cualquiera de nosotros puede comprobar accediendo a cualquier 3eb de empleo y comprobando las ofertas laborales que hay en cada len ua!e. "Co puedo andar coqueteando con tantos len ua!es, necesito acceder directamente a uno que me abra las puertas del mercado laboral" "PHP es el lenguaje mejor documentado y donde ms ayudas encontrars" Mi uel ,n el ,lvarez 1mides3eb 6ntre los motivos que deberan llevarte a aprender P#P no es nada despreciable el hecho de P#P de ser el len ua!e en el que encontrar"s la mayor cantidad de informacin, manuales, talleres, tutoriales, etc. 6s muy difcil que lle ues a toparte con un problema, o enfrentarte a una necesidad, que no haya sido resuelta por un desarrollador antes que t7. "@u lea" y encontrar"s respuesta a cualquier duda en forma de artculo, script, manual, etc. 62isten decenas de sitios donde puedes aprender de manera autodidacta, y est"s en uno de ellos. 5implemente tienes que ir a nuestra seccin P#P a fondo para encontrar manuales y tutoriales de P#P a todos los niveles, talleres, videoturoriales, etc. 6ntonces APor qu debera estudiar en un curso de P#PB Porque queremos ofreceros nuestro compromiso para formaros como profesionales de este len ua!e, porque queremos que puedas estar en clase con un profesor que pueda llevarte paso por paso en el aprendiza!e, al uien que te ense;e todas esas tcnicas de primera mano y que, si no has comprendido al o, que puedas pre untar para que te lo e2plique de nuevo. Due ten as la posibilidad de acceder a tutoras con los docentes y puedas realizar todo tipo de pre untas y beneficiarte de las respuestas que se ofrezcan a otros compa;eros. 6n definitiva, porque estamos convencidos que podemos hacer del aprendiza!e una e2periencia realizadora, amena y altamente aprovechable. ",prende P#P, pero no te quedes en los ob!etivos inmediatos"
Tu mejor ayuda para aprender a hacer webs www.desarrolloweb.com /ebes conocer las bases de P#P para lue o poder adentrarte en aquellas tcnicas que te ayudar"n a producir sitios m"s profesionales en menos tiempo. Por ello desde /esarrollo>eb.com vamos a impartir el Curso de P#P 8"sico de 6scuela%4, la plataforma para la formacin tutorizada de /esarrollo>eb.com. 6n 6scuela%4 estamos montando un curso de P#P b"sico, y no porque lue o vayamos a hacer un curso avanzado, sino porque queremos primero divul ar las bases que todo desarrollador debe conocer de P#P, para poder lue o enfrentarse a otros ob!etivos. Con este curso b"sico comienza un ciclo, que daremos continuidad con otros cursos como pro ramacin orientada a ob!etos, pro ramacin de mdulos en >ordpress o /rupal, frame3or:s como 5ymfony o Codei niter, etc. 5i quieres aprender P#P no ha as la carrera de los '** metros, sino tmatelo con nosotros a un plazo un poco mayor y aprende las herramientas que te convertir"n en un profesional cotizado. ,l final del han out $php%& "Por qu aprender P#P" tendr"s una descripcin m"s detallada de nuestro pro rama formativo, as como de la filosofa de este curso y las mec"nicas para la formacin que implementamos en 6scuela%4, siempre con clases en directo y en las que podr"s disponer del profesor para realizar tus dudas y recibir respuestas en el instante. 0os profesionales que intervinieron en este hangout son los mismos profesores del curso, y el que os escribe, el docente titular. 4ambin puedes acceder a la p" ina del curso de P#P para encontrar mucha m"s informacin detallada. E@racias por confiar en nosotros?
Artculo por
Parte 1:
Qu es PHP
+aptulos introductorios donde hablaremos sobre los lengua,es de desarrollo del lado del ser-idor en general para e.plicar /0/ en particular ! 1ue se entienda cu2l es su modo de &uncionamiento ! los tipos de cosas 1ue se pueden hacer con este lengua,e.
Tu mejor ayuda para aprender a hacer webs www.desarrolloweb.com funciones para la e2plotacin de bases de datos de una manera llana, sin complicaciones. Podramos efectuar la quiz"s odiosa comparacin de decir que P#P y ,5P son len ua!es parecidos en cuanto a potencia y dificultad si bien su sinta2is puede diferir sensiblemente. ,l unas diferencias principales pueden, no obstante, mencionarse#ctualizado" 6n estos momentos ya no es tan polmica la comparacin de P#P con ,5P, puesto que son dos len ua!es que han evolucionado de maneras distintas. Mientras que ,5P se ha estancado y han salido productos nuevos como .C64 para sustituirlo, P#P ha ido me!orando mucho con los a;os y actualmente su potencia y posibilidades son totalmente distintas, con lo que ha de!ado muy atr"s la competencia con ,5P. 6ste manual lo comenzamos con la versin + de P#P y hoy ya van por la ( y est"n cerca de sacar la versin H. ,s pues ya no tiene mucho sentido comparar P#P con ,5P, aunque las lneas si uientes a esta nota, que distin uen ,5P de P#P, pueden ser de utilidad y una referencia v"lida, puesto que estas diferencias no han cambiado a da de hoy. ,s mismo, queremos informar que a pesar del manual tener ya cierto tiempo publicado, siempre lo estamos actualizando cuando sur en cambios en los modos de traba!o con P#P.
P#P, aunque multiplataforma, ha sido concebido inicialmente para entornos IC%J y es en este sistema operativo donde se pueden aprovechar me!or sus prestaciones. ,5P, siendo una tecnolo a Microsoft, esta orientado hacia sistemas >indo3s, especialmente C4. 0as tareas fundamentales que puede realizar directamente el len ua!e son definidas en P#P como funciones mientras que ,5P invoca m"s frecuentemente los ob!etos. Por supuesto, esto no es m"s que una simple cuestin de forma ya que ambos len ua!es soportan i ualmente ambos procedimientos. ,5P realiza numerosas tareas sirvindose de componentes Kob!etosL que deben ser comprados a determinadas empresas especializadas Ko pro ramados por nosotros mismos en otros len ua!esL. P#P presenta una filosofa totalmente diferente y, con un espritu m"s eneroso, es pro resivamente construido por colaboradores desinteresados que implementan nuevas funciones en nuevas versiones del len ua!e.
6ste manual va destinado a aquellos que quieren comenzar de cero el aprendiza!e de este len ua!e y que buscan en l la aplicacin directa a su proyecto de sitio o a la me!ora de su sitio #4M0. 0os captulos son e2tremadamente simples, sino simplistas, buscando ser accesibles a la mayora. 6llos pueden ser complementados posteriormente con otros art$culos de mayor nivel destinados a ente m"s e2perimentada. 0a forma en la que hemos redactado este manual lo hace accesible a cualquier persona no familiarizada con la pro ramacin. 5in embar o, es posible que en determinados momentos al uien que no haya pro ramado nunca pueda verse un poco desorientado. Cuestro conse!o es el de no querer entender todo antes de pasar al si uiente captulo sino intentar asimilar al unos conceptos y volver atr"s en cuanto una duda sur!a o hayamos olvidado al 7n detalle. Cunca viene mal leer varias veces lo mismo hasta que quede bien rabado y asimilado. ,ntes de comenzar a leer este manual es altamente aconse!able, sino imprescindible, haber ledo previamente el manual sobre manual sobre pginas dinmicas en el cual se e2plica a randes ras os qu es el P#P, al unos conceptos 7tiles sobre el modo de traba!ar con p" inas din"micas al mismo tiempo que nos introduce al unos elementos b"sicos de la pro ramacin como pueden ser las variables y las funciones. &tra referencia a la cual haremos alusin es el tutorial de %&L que nos ser" de ran ayuda para el tratamiento de bases de datos y a My5D0, del que podremos aprender muchas cosas en el 'aller de (y%&L. Para todos los lectores, pero aun m"s para las personas m"s ine2pertas y con m"s dificultades de aprendiza!e, tenemos adem"s una recomendacin que puede ayudarles mucho. 5e trata del )ideotutorial de PHP que estamos publicando con diversos vdeos que e2plican con ran detalle la pro ramacin en P#P. 6speramos que este manual resulte de vuestro a rado y que corresponda a nuestras e2pectativas- 6l poder acercar P#P a todos aquellos amantes del desarrollo de 3ebs que quieren dar el paso hacia las 3ebs "profesionales". 0os scripts que usamos en estos primeros e!emplos pueden ser descar ados a u$.
Artculo por
Rubn Alvarez
@r"fica del n7mero de dominios y direcciones %P que utilizan P#P. 6stadstica de Cetcraft. 6n el 7ltimo a;o, el n7mero de servidores que utilizan P#P se ha disparado, lo rando situarse cerca de los ( millones de sitios y Q**.*** direcciones %P, lo que le ha convertido a P#P en una tecnolo a popular. 6sto es debido, entre otras razones, a que P#P es el complemento ideal para que el t"ndem 0inu2P,pache sea compatible con la pro ramacin del lado del servidor de sitios 3eb. @racias a la aceptacin que ha lo rado, y los randes esfuerzos realizados por una creciente comunidad de colaboradores para implementarlo de la manera m"s ptima, podemos ase urar que el len ua!e se convertir" en un est"ndar que compartir" los 2itos au urados al con!unto de sistemas desarrollados en cdi o abierto.
Artculo por
Rubn Alvarez
Parte 2:
Tu mejor ayuda para aprender a hacer webs www.desarrolloweb.com P Ina instalacin autoe2traible de la versin m"s reciente de P#P que, adem"s de tardar menos en descar arse, os uiar" paso a paso en el proceso de instalacin. 6sta versin no incluye todas las funcionalidades de P#P, pero os servir" para aprender hasta un buen nivel. #ay que se;alar que, para el caso de P#P en P>5, adem"s de todo lo dicho en captulo de instalacin, es importante al crear el directorio virtual permitir la e!ecucin de scripts validando la ca!a correspondiente. 6n >indo3s F(NFQ tambin podremos utilizar el servidor ,pache y puede que sea una opcin todava m"s completa que la de utilizar P>5. , continuacin e2plicamos m"s sobre ello.
*'&'4'( Conclusin
6n cualquier caso, para fines de desarrollo en local, podemos contentarnos en un principio de traba!ar con cualquier sistema. 5olamente en casos de pro ramacin realmente avanzada podremos confrontarnos con problemas relacionados con el sistema operativo utilizado o el servidor en el que hacemos correr nuestras p" inas. #ay que pensar tambin que, en casos puntuales para los que nuestro PC pueda quedarse corto, podemos hacer directamente nuestras pruebas en el servidor donde alo!amos nuestro sitio el cual ser" muy probablemente, como hemos dicho, un Ini2 o 0inu2 funcionando con ,pache.
+eferencia" 6n /esarrollo>eb hemos publicado diversos manuales y artculos que pueden ser una buena referencia para la instalacin de P#P. ,l unos se pueden ver a continuacin-
Confi uracin de P#P con ,pache en >indo3s Confi uracin de P#P como mdulo de ,pache, tambin en >indo3s %nstalacin del Personal >eb 5erver %nstalacin de %%5 en >indo3s JP profesional /irectorio de ,pache K#emos publicado un manual o estar" en breveL M,D sobre cmo instalar P#P en >indo3s Rideotutorial de instalacin de P#P con >amp Rdeo- instalar P#P en una llave I58
Artculo por
Rubn Alvarez
62isten dos formas de confi urar P#P para traba!ar con ,pache, instalar como un mdulo o instalar como un C@%. 6n este artculo vamos a ver cmo instalarlo com C@%, aunque disponemos de otro artculo para instalar P#P como mdulo en ,pache.
*'*'&'( ara instalar H como un C/) +a8 !ue seguir los siguientes pasos?
6n primer lu ar, hay que descar arse P#P desde la p" ina de php.net. 62isten dos versiones, una que tiene un instalador, y otra que es un fichero <%P. #ay que descar arse esta 7ltima. Ina vez descar ado, hay que descomprimirlo dentro de una carpeta, esta no tiene que estar ba!o el "rbol de directorios de ,pache. 6l artculo asumir" que se descomprime dentro de la carpeta C-P#P. Comprobar que los contenidos del archivo <%P no quedan en un subdirectorio de la carptea C-P#P, sino directamente en dicha carpeta. /entro de la carpeta c-P#P se encuentra un fichero llamado P#PGts.dll, hay que mover el fichero dentro de la carpetac-3indo3ssystem c-3inntsystem 6n este fichero se encuentra toda la confi uracin de P#P, y las modificaciones en la confi uracin de P#P Kmostrar 6rrores, variables lobales etc...L se encuentra dentro del mismo. 6s muy recomendable cambiar la directiva displaySerrors que por defecto esta en &MM, y pornerla en &C, para poder ver los errores que se producen en las p" inas durante el desarrollo. Para un servidor en produccin en conveniente de!arla en &MM. Ina vez se han hecho estos cambios, queda indicarle al ,pache, donde se encuentra instalado el P#P, para ello hay que editar el fichero httpd.conf que se encuentra dentro de la carpeta conf, en la carpeta de instalacin del apache Kpor defecto c-archivos de pro ramaapache roupapache)confL ,brir el fichero, y situarse al final del mismo, y escribir las si uientes lneasScriptAlias /php/ "c:/php/" AddType application/x-httpd-php .php Action application/x-httpd-php "/php/php.exe"
6n ellas se indica donde se encuentra el e!ecutable de php, y lo asocia a los ficheros .php que se encuentren dentro de apache.
10
Tu mejor ayuda para aprender a hacer webs www.desarrolloweb.com , continuacin reiniciar el servidor ,pache, y ya esta? Por 7ltimo, indicar que para probar la nueva instalacin, es recomendable crear un fichero php con el si uiente contenido<? phpinfo();?>
0ue o lo uardamosdentro de la carpeta raz de documentos del ,pache Kpor defecto c-archivos de pro ramaapache roupapache)htdocs L, con un nombre terminado en .php, por e!emplo info.php Para e!ecutarlo, a travs de un nave ador, escribir la direccin http-NNlocalhostNinfo.php. /ebera aparecer una pantalla como la que se muestra a continuacin.
5i la vemos correctamente es que todo ha ido bien y que tenemos perfectamente instalado P#P en nuestro servidor ,pache.
-ota" 6ste tipo de instalacin de P#P sobre ,pache es poco recomendada por motivos de se uridad. Podemos se uirla para confi urar P#P en local, con intencin de desarrollar nuestras p" inas 3eb, pero nunca si vamos a utilizar el servidor en un entorno de produccin, es decir, en un servidor que se encuentre permanentemente conectado a %nternet sirviendo p" inas a todo tipo de usuarios. 5era necesario instalar P#P como un mdulo de ,pache, en lu ar de C@%, para dotar al sistema de una mayor se uridad, y tambin m"s potencia. +eferencia" 6n esta M,D damos otras opciones para la instalacin de P#P, utilizando pro ramas que permiten instalar y confi urar ,pache T P#P T My5D0 en un sencillo paso, accesible para todos los usuarios- Cmo instalar P#P en >indo3s.
Artculo por
11
Tu mejor ayuda para aprender a hacer webs www.desarrolloweb.com pruebas hemos utilizado >indo3s JP, pero se uro que con otros sistemas el proceso ser" muy parecido, aunque, en todo caso, indicaremos las diferencias documentadas en el sitio de P#P. ,nteriormente habamos e2plicado la instalacin de P#P como un C@%, aunque en la p" ina de P#P desaconse!an esta opcin, puesto que adolece de raves problemas de se uridad. ,dem"s, P#P instalado como mdulo de ,pache resulta mucho m"s r"pido que como C@%.
+eferencia" Ramos a suponer que el servidor de p" inas 3eb ,pache ).* est" instalado en nuestro sistema. Co obstante, para los que no lo ten an, les referimos a nuestro manual de instalacin y confi uracin de ,pache.
12
Tu mejor ayuda para aprender a hacer webs www.desarrolloweb.com /ebemos a;adir un par de lneas de confi uracin del mdulo de ,pache.
oad!od"le php#$%od"le &:phpsapiphp#apache'.dll AddType application/x-httpd-php .php
6l lu ar adecuado para a;adir esas lneas es en el bloque de car a de mdulos, que podemos encontrar si buscamos por el te2to "0oadModule". Podemos a;adir las lneas de car a del mdulo P#P despus de la car a de los otros mdulos que vienen ya confi urados en archivo httpd.conf de ,pache. 5i no instalamos P#P en el directorio c-php, debemos editar las lneas a colocar en el httpd.conf para colocar la ruta correcta al directorio donde est" la librera phpGapache).dll.
Syntax error on line 173 of C !Arc"ivos #e progra$a!Apac"e %roup!Apac"e&!conf!"ttp#'conf Cannot loa# C !p"p!sapi!p"p(apac"e&'#ll into server )o se pue#e encontrar el $*#ulo especifica#o'
&tra confi uracin que podemos aplicar al archivo httpd.conf es definir tambin como documento por defecto el archivo inde2.php en nuestro servidor ,pache. 6l documento por defecto es eneralmente inde2.html, pero lo habitual si vamos a pro ramar con P#P es que tambin necesitemos definir inde2.php como documento a mostrar si no se indica otro documento del directorio al que se est" accediendo. 6l documento por defecto se define con la variable /irectory%nde2. Cos quedar" una deninicin como esta(irectory)ndex index.ht%l index.ht%l.*ar index.php
6sta funcin simplemente crear" una p" ina de muestra de las confi uraciones definidas para P#P en ese servidor. Para acceder al archivo creado desde nuestro e2plorador, escribiremos en la barra de direcciones esta I90http-NNlocalhostNprueba.php
13
Tu mejor ayuda para aprender a hacer webs www.desarrolloweb.com /ebera aparecer un resultado como el de la si uiente ima en.
+eferencia" 6n esta M,D damos otras opciones para la instalacin de P#P, utilizando pro ramas que permiten instalar y confi urar ,pache T P#P T My5D0 en un sencillo paso, accesible para todos los usuarios- Cmo instalar P#P en >indo3s.
Artculo por
/ebe haber decenas de maneras de instalar ,pache, P#P y My5D0 sobre @CIN0inu2 y en %nternet encontraremos una ran cantidad de informacin a este respecto. Cosotros vamos a destacar una a continuacin que nos ha funcionado siempre bien, con al unos detalles adicionales que nos pueden facilitar diversas labores de desarrollo en nuestros sistemas. ,dem"s, complementaremos la informacin comentando los pasos para instalar otra herramienta fundamental, como es el PhpMy,dmin.
14
Conviene decir que esta receta la hemos obtenido del sitio 3eb #o3toMor e. =o la he traducido libremente y la he complementado con e2plicaciones adicionales y al unos pasos e2tra que he considerado de inters. Como un primer paso, podemos lanzar un comando para obtener los privile ios de root para la administracin a travs de la lnea de comandos.
s"do s"
Cos pedir" la clave de nuestro usuario, que es la misma clave que usamos al arrancar el equipo.
/urante el proceso de instalacin tendr"s que introducir la clave que deseas confi urar al usuario root de My5D0.
6n este punto, una vez instalado ,pache, puedes hacer una primera comprobacin, que nos permitir" saber si el servidor 3eb est" funcionado correctamente. Para ello abre un nave ador cualquiera e introduce la I90 de localhost o la %P local de tu ordenadorhttp://localhost
& bienhttp://-.'.-/0.1.22 (s"stit"ye esa )3 por la )3 de t" %4,"ina) -ota" 5i no sabes cu"l es tu %P de red local, tienes a tu disposicin en 0inu2 el comando ifconfi .
,l acceder a cualquiera de esas dos I90 debera salirte el mensa!e de ,pache diciendo que est" funcionado K%t 3or:s?L Para tu informacin, el directorio predeterminado donde se uardan los documentos del servidor 3eb en ,pache es NvarN333 y el fichero de confi uracin del servidor est" en NetcNapache)Napache).conf. &tras confi uraciones est"n almacenadas en otros subdirectorios de NetcNapache) como NetcNapache)NmodsPenabled para los mdulos habilitados, NetcNapache)NsitesPenabled para los "virtual hosts" y NetcNapache)Nconf.d para las confi uraciones lobales que afectar"n a todos los virtual host.
-ota" 62iste en /esarrollo>eb.com un manual sobre la instalacin de ,pache en >indo3s, que no te ayudar" mucho si est"s en 0inu2, pero que tiene mucha informacin sobre la confi uracin de ,pache. 4e servir" de ayuda puesto que la mayora de los archivos de confi uracin funcionan e2actamente i ual y las variables de confi uracin son e2actamente las mismas.
15
/espus de la instalacin de P#P( como mdulo de ,pache, debemos reiniciar el servidor 3eb y para ello lanzamos este otro comando.
/etc/init.d/apache' restart
Como puedes ver, hacemos un "restart", pero tambin podras hacer primero un "stop" y lue o un "start". 0le ado este punto, podemos crear ya un documento 3eb que nos sirva para comprobar si P#P est" correctamente instalado en nuestro sistema y para ello podemos utilizar la lnea de comandos y el editor que prefieras. , al unas personas les usta el editor llamado Ri, pero yo soy de los que prefiere otros m"s sencillos como el .oe.
-ota" Para conocer m"s acerca del pro rama .oe, puedes visitar la M,D- A5abis de una alternativa a RiB
6n cualquier caso, tendr"s que crear un archivo en la ruta por defecto de publicacin del ,pache, que ya di!imos es NvarN333. Puedes llamarle como desees, por e!emplo info.php, en el que colocar"s las si uientes lneas de cdi o.
<?php phpinfo(); ?>
6sa funcin de P#P phpinfoKL te mostrar" mucha informacin 7til sobre la instalacin de P#P que tienes en tu m"quina, como mdulos incluidos y diferentes confi uraciones en funcionamiento.
-ota" para crear el archivo P#P tambin puedes utilizar el editor r"fico que desees, que te ser" incluso m"s cmodo que cualquier pro rama que traba!e con el terminal. 6l 7nico detalle es aplicarle los permisos necesarios a la carpeta NvarN333 para que sea propiedad de tu usuario y puedas ciertas cosas con ella. 4en en cuenta que ponerse como usuario due;o de la carpeta se recomienda solo sitios que no estn en produccin. 0o haras con el comandos"do cho6n -7 89S:7:89S:7 /*ar/666 5i lo deseas, tambin puedes hacer el comando echo 89S:7 Para ver el nombre del usuario en el que est"s y el que vas a poner como duelo de la carpeta NvarN333 .
Ina vez creado el archivo de te2to info.php con el cdi o indicado, podemos acceder a l desde un nave ador con una I90 como estahttp://localhost/info.php
5i ves toda una serie de informacin de tu instalacin P#P, como en la ima en anterior, es que has podido instalar P#P en correctas condiciones.
16
Tu mejor ayuda para aprender a hacer webs www.desarrolloweb.com Puede que no ten as todos los que necesitas y en concreto podr"s observar que no tienes habilitado el mdulo de My5D0, por lo que podr"s instalarlo. 5i haces el comandoapt-cache search php2
Podr"s encontrar el listado de e2tensiones de P#P disponibles en los repositorios, puedes ele ir aquellos que desees e instalarlos con la lneaapt-+et install php2-%ys,l php2-c"rl php2-+d php-pear php2-i%a+ic; php2-s,lite php2-tidy php2-x%lrpc php2-xsl
, continuacin debes reiniciar el servidor para que los cambios ten an efecto.
/etc/init.d/apache' restart
5i refrescas la p" ina del phpinfoKL podr"s encontrar los nuevos mdulos instalados.
Rer"s a continuacin una serie de pre untas, como tu servidor 3eb. Ina vez instalado puedes acceder al estor por medio de una I90 como estahttp://localhost/php%yad%in/
*'0'C'( Conclusin
Con este proceso tendr"s a tu disposicin todos los materiales para comenzar a desarrollar con P#P en tu 0inu2. 5implemente se;alar un detalle importante, que ya se apunt de refiln, pero que quiero remarcar. 6s posible que en esta instalacin de ,pache y P#P quieras desarrollar sitios 3eb y utilizar para pro ramar dichos sitios un editor para pro ramadores con interfaz r"fica como Uomodo 6dit o 6clipse. 6n este caso recuerda que, para editar o crear archivos en la carpeta NvarN333 desde esos pro ramas, tendr"s que poner tu usuario como due;o de la carpeta, con cho3n. 6so se e2plic en una nota anterior.
+eferencia" Para optimizar la confi uracin de tu ,pache en 0inu2 de una manera muy pr"ctica para tu servidor de desarrollo, te aconse!amos la lectura del artculo Confi uracin de ,pache en 0inu2 con carpetas e2ternas.
17
Tu mejor ayuda para aprender a hacer webs www.desarrolloweb.com tienda virtual, proveedores o clientes de una empresa, pelculas en cartelera en el cine...L. 6stos re istros son catalo ados en funcin de distintos par"metros que los caracterizan y que presentan una utilidad a la hora de clasificarlos. ,s, por e!emplo, los artculos de una tienda virtual podran catalo arse a partir de distintos campos como puede ser un n7mero de referencia, nombre del artculo, descripcin, precio, proveedor... 0a base de datos m"s difundida con el tandem IC%JP,pache es sin duda My5D0. Como para el caso de ,pache, una versin para >indo3s est" disponible y puede ser descargada ratis. 5u puesta a punto no entra;a mucha dificultad. Ina vez instalado el pro rama podemos e!ecutar nuestras ordenes en modo M5P/&5. Para ello abrimos una ventana M5P/&5 y nos colocamos en el directorio bin de mysql. 6n este directorio se encuentran los archivos e!ecutables. ,qu habr" que encontrar un archivo llamado mysqld. 6n el caso de la versin m"s actual durante la redaccin de este articulo este archivo es llamado mysqldPshare3are. Ina vez e!ecutado este archivo podemos e!ecutar el si uiente- mysql. 0le ados a este punto veremos cmo un mensa!e de bienvenida aparece en nuestra pantalla. 6n estos momentos nos encontramos dentro de la base de datos. , partir de ah podemos realizar todo tipo de operaciones por sentencias 5D0. Co vamos a entrar en una e2plicacin pormenorizada del funcionamiento de esta base de datos ya que esto nos dara para un manual entero. /aremos como referencia nuestro tutorial de %&L a partir del cual se puede tener una idea muy pr"ctica de las sentencias necesarias para la creacin y edicin de las tablas. 4ambin e2iste una documentacin e2tensa en in ls en el directorio Docs de My5D0. , modo de resumen, aqu os proponemos adem"s las operaciones m"s b"sicas que, combinadas nuestro tutorial de %&L pueden dar solucin a ran parte de los casos que se os presenten-
Descripcin 3uestra el con,unto de bases de datos presentes en el ser-idor Determina la base de datos sobre la 1ue -amos a traba,ar +rea una nue-a bd con el nombre especi&icado Elimina la base de datos del nombre especi&icado 3uestra las tablas presentes en la base de datos actual Describe los campos 1ue componen la tabla
9se nombre:de:la:base +reate Database nombre:de:la:base8 Drop Database nombre:de:la:base8 4how tables8 Describe nombre:de:la:tabla8 Drop #able nombre:de:la:tabla8 (oad Data (ocal "n&ile <archi-o.t.t< "nto #able
;orra la tabla de la base de datos +rea los registros de la tabla a partir de un &ichero de te.to en el 1ue separamos por
18
nombre:de:la:tabla8 5uit
Para evitarnos el tener que editar nuestras tablas directamente sobre archivos de te2to, puede resultar muy pr"ctico usar cualquier otra base de datos con un editor y e2portar a continuacin la tabla en un archivo de te2to confi urado para de!ar tabulaciones entre cada campo. 6sto es posible en ,ccess por e!emplo pinchando con el botn derecho sobre la tabla que queremos convertir y eli iendo la opcin e2portar. Ina ventana de dialo o aparecer" en la que ele iremos uardar el archivo en tipo te2to. 6l paso si uiente ser" ele ir un formato delimitado por tabulaciones sin cualificador de te2to. &tra posibilidad que puede resultar muy pr"ctica y que nos evita traba!ar continuamente tecleando rdenes al estilo de anta;o es servirse de pro ramas en P#P o Perl ya e2istentes y descar ables en la red. 6l m"s popular sin duda es php(y#dmin. 6ste tipo de scripts son e!ecutados desde un nave ador y pueden ser por tanto alber ados en nuestro servidor o empleados en local para, a partir de ellos, administrar My5D0 de una forma menos sufrida. ,simismo, dentro del directorio bin de My5D0, podemos encontrar una peque;a aplicacin llamada My5qlMana er. 5e trata de una interface 3indo3s, m"s a radable a la vista y al uso que la que obtenemos e!ecutando el archivo mysql. 6n este caso, las sentencias 5D0 deben realizarse sin el punto y coma final.
Artculo por
Rubn Alvarez
19
O.
20
21
22
23
Tu mejor ayuda para aprender a hacer webs www.desarrolloweb.com Copiar el codi o si uiente en el archivo
<<?php // testin+ sessions // chec; to see if files are 5ein+ created // in the session.sa*e$path folder session$start(); ?> <ht%l> <head> <title>3<3 Test</title> </head> <5ody> <p> The 5ro6ser yo"=re "sin+ is <?php echo 8$S:7>:7?=<TT3$9S:7$A@:AT=B; ?> </p> <p> <C-- test the 5ro6scap set"p --> Do"r 5ro6ser=s capa5ilities are: <5r/> <pre> <?php print$r(+et$5ro6ser(n"llE tr"e)); ?> </pre> </p> <?php phpinfo(); ?> </5ody> </ht%l>
). ,brir %6H y poner la direccin http-NNlocalhostNinde2.php, si le da error verificar los pasos de la instalacin. 5i no da error saldra una pantalla con informacin sobre la versin de php.
Artculo por
+orge Ra$os
24
Parte 3:
6ste ultimo modo est" principalmente aconse!ado a aquellos que ten an el valor de traba!ar con Mront Pa e ya que, usando cualquier otro tipo de etiqueta, corremos el ries o de que la aplicacin nos la borre sin m"s debido a que se trata de un cdi o incomprensible para ella. 6l modo de funcionamiento de una p" ina P#P, a randes ras os, no difiere del cl"sico para una p" ina din"mica de lado servidor- 6l servidor va a reconocer la e2tensin correspondiente a la p" ina P#P Kphtml, php, phpG,...L y antes de enviarla al nave ador va a encar arse de interpretar y e!ecutar todo aquello que se encuentre entre las etiquetas correspondientes al len ua!e P#P. 6l resto, lo enviara sin m"s ya que, asumir" que se trata de cdi o #4M0 absolutamente comprensible por el nave ador. &tra caracterstica eneral de los scripts en P#P es la forma de separar las distintas instrucciones. Para hacerlo, hay que acabar cada instruccin con un punto y coma "Z". Para la ultima e2presin, la que va antes del cierre de etiqueta, este formalismo no es necesario. %ncluimos tambin en este capitulo la sinta2is de comentarios. In comentario, para aquellos que no lo sepan, es una frase o palabra que nosotros incluimos en el cdi o para comprenderlo m"s f"cilmente al volverlo a leer un tiempo
25
Tu mejor ayuda para aprender a hacer webs www.desarrolloweb.com despus y que, por supuesto, el ordenador tiene que i norar ya que no va diri ido a l sino a nosotros mismos. 0os comentarios tienen una ran utilidad ya que es muy f"cil olvidarse del funcionamiento de un script pro ramado un tiempo atr"s y resulta muy 7til si queremos hacer r"pidamente comprensible nuestro cdi o a otra persona. Pues bien, la forma de incluir estos comentarios es variable dependiendo si queremos escribir una lnea o m"s. Reamos esto con un primer e!emplo de script<? 8%ensaHeG"Ten+o ha%5reCC"; //&o%entario de "na linea echo 8%ensaHe; I:ste co%entario ta%5iJn es de "na linea /K:n este caso %i co%entario oc"pa *arias lineasE lo *es? K/ ?>
.jecutar script 5i usamos doble barra KNNL o el smbolo $ podemos introducir comentarios de una lnea. Mediante N[ y [N creamos comentarios multilnea. Por supuesto, nada nos impide de usar estos 7ltimos en una sola lnea. Co os preocupis si no comprendis el te2to entre las etiquetas, todo lle ar". &s adelantamos que las variables en P#P se definen anteponiendo un smbolo de dlar K\L y que la instruccin echo sirve para sacar en pantalla lo que hay escrito a continuacin. 9ecordamos que todo el te2to insertado en forma de comentario es completamente i norado por el servidor. 9esulta importante acostumbrarse a de!ar comentarios, es al o que se a radece con el tiempo.
Artculo por
Rubn Alvarez
,'*'( Dariables en H
0ipos de variables, caracter1sticas generales y aspectos espec1ficos de PHP de estos elementos bsicos de la programacin. 0as variables son uno de los primeros temas que tenemos que conocer en P#P y en la mayora de los len ua!es de pro ramacin. ,s que a continuacin vamos a tratar este tema dentro del Manual de P#P, e2plicando los tipos de variables que podremos encontrar. ,nteriormente en /esarrollo>eb.com, en el manual de p" inas din"micas, ya habamos introducido el concepto de variable. 6n el captulo anterior coment"bamos que, para P#P, las variables eran definidas anteponiendo el smbolo dlar K\L al nombre de la variable que est"bamos definiendo. /ependiendo de la informacin que conten a, una variable puede ser considerada de uno u otro tipo-
Dariables numricas 7lmacenan ci&ras Enteros Real =entero>2??28 =real>@.%4%$A8 )umeros sin decimales )umeros con o sin decimal
26
=cadena><0ola amigo<8
-ablas 7lmacenan series de in&ormaciones numCricas !/o al&anumCricas =sentidoD%E><-er<8 =sentidoD2E><tocar<8 =sentidoD@E><oir<8 =sentidoD4E><gusto<8 =sentidoD$E><oler<8
EbFetos 4e trata de con,untos de -ariables ! &unciones asociadas. /resentan una comple,idad ma!or 1ue las -ariables -istas hasta ahora pero su utilidad es m2s 1ue interesante.
, diferencia de otros len ua!es, P#P posee una ran fle2ibilidad a la hora de operar con variables. 6n efecto, cuando definimos una variable asi n"ndole un valor, el ordenador le atribuye un tipo. 5i por e!emplo definimos una variable entre comillas, la variable ser" considerada de tipo cadena8*aria5leG"2"; //esto es "na cadena
5in embar o si pedimos en nuestro script realizar una operacin matem"tica con esta variable, no obtendremos un mensa!e de error sino que la variable cadena ser" asimilada a numrica<? 8cadenaG"2"; //esto es "na cadena 8enteroGL; //esto es "n entero echo 8cadenaM8entero ?>
.jecutar script 6ste script dar" como resultado "Q". 0a variable cadena ha sido asimilada en entero Kaunque su tipo si ue siendo cadenaL para poder realizar la operacin matem"tica. /el mismo modo, podemos operar entre variables tipo entero y real. Co debemos preocuparnos de nada, P#P se encar a durante la e!ecucin de interpretar el tipo de variable necesario para el buen funcionamiento del pro rama. 5in embar o, en contraste, hay que tener cuidado en no cambiar may7sculas por min7sculas ya que, en este sentido, P#P es sensible. Conviene por lo tanto traba!ar ya sea siempre en may7sculas o siempre en min7sculas para evitar este tipo de malentendidos a veces muy difciles de localizar. )ariables asignadas por referencia 6n P#P tambin podemos asi nar variables por referencia. 6n ese caso no se les asi na un valor, sino otra variable, de tal modo que las dos varialbles comparten espacio en memoria para el mismo dato. 0a notacin para asi nar por referencia es colocar un "]" antes del nombre de la variable.
<?php 8foo G =No5=; // Asi+na el *alor =No5= a 8foo 85ar G O8foo; // 7eferencia 8foo *Pa 85ar. 85ar G "!i no%5re es 85ar"; // !odifica 85ar... echo 8foo; // 8foo ta%5iJn se %odifica. echo 85ar; ?>
6sto dar" como resultado la visualizacin dos veces del strin "Mi nombre es 8ob". ,l o como-
27
Tu mejor ayuda para aprender a hacer webs www.desarrolloweb.com Mi nombre es 8obMi nombre es 8ob
-ota" 4enemos un videotutorial que nos habla de las variables P#P
Artculo por
Rubn Alvarez
\a V "'"Z NN\a es una cadena \a^*_ V "f"Z NNA6stamos editando el ndice de la cadena o forzando a arrayB
,','&'( .orzado
6n cualquier caso, podemos forzar una variable para que cambie de tipo con la funcin set4ypeKL. set4ypeK\variable,"nuevoStipo"LZ la funcin set4ypeKL actualiza el tipo de \variable a "nuevoStipo" y devuelve un boleano indicando si hubo 2ito o no en la conversin. 6ntre "nuevoStipo" tenemos` "inte er" ` "double" ` "strin " ` "array" ` "ob!ect" 4ambin podemos hacer que una variable se comporte como un tipo determinado forz"ndola, de la misma manera a como se hace en el len ua!e C. \variable V ")+"Z \variable V KintL \variableZ 0os forzados permitidos son-
28
Tu mejor ayuda para aprender a hacer webs www.desarrolloweb.com ` KintL, Kinte erL P fuerza a entero Kinte erL ` KrealL, KdoubleL, KfloatL P fuerza a doble KdoubleL ` Kstrin L P fuerza a cadena Kstrin L ` KarrayL P fuerza a array KarrayL Kob!ectL P fuerza a ob!eto Kob!ectL
Artculo por
Dariable
Descripcin
)os in&orma principalmente sobre el sistema operati-o ! tipo ! -ersi*n de na-egador utilizado por el internauta. 4u principal utilidad radica en 1ue6 a partir =0##/:94ER:7FE de esta in&ormaci*n6 podemos redireccionar nuestros )# usuarios hacia p2ginas optimizadas para su na-egador o realizar cual1uier otro tipo de acci*n en el conte.to de un na-egador determinado. )os de-uel-e la o las abre-iaciones de la lengua considerada como principal por el na-egador. Esta =0##/:7++E/#:( lengua o lenguas principales pueden ser elegidas en el 7)F97FE menB de opciones del na-egador. Esta -ariable resulta tambiCn e.tremadamente Btil para en-iar al internauta a las p2ginas escritas en su lengua6 si es 1ue e.isten. )os indica la 9R( desde la cual el internauta ha tenido acceso a la p2gina. 3u! interesante para generar =0##/:REGERER botones de <7tr2s< din2micos o para crear nuestros propios sistemas de estadsticas de -isitas. =/0/:4E(G )os de-uel-e una cadena con la 9R( del script 1ue est2 siendo e,ecutado. 3u! interesante para crear botones
29
para recargar la p2gina. 4e trata de un arra! 1ue almacena los nombres ! =0##/:FE#:H7R4 contenidos de las -ariables en-iadas al script por 9R( o por &ormularios FE# 4e trata de un arra! 1ue almacena los nombres ! =0##/:/I4#:H7R4 contenidos de las -ariables en-iadas al script por medio de un &ormulario /I4# 4e trata de un arra! 1ue almacena los nombres ! =0##/:+IIJ"E:H7 contenidos de las cooKies. Heremos 1uC son m2s R4 adelante. 7lmacena la -ariable usuario cuando se e&ectBa la entrada a p2ginas de acceso restringido. +ombinado =/0/:79#0:94ER con =/0/:79#0:/W resulta ideal para controlar el acceso a las p2ginas internas del sitio. 7lmacena la -ariable password cuando se e&ectBa la entrada a p2ginas de acceso restringido. +ombinado =/0/:79#0:/W con =/0/:79#0:94ER resulta ideal para controlar el acceso a las p2ginas internas del sitio. =RE3I#E:7DDR 3uestra la direcci*n "/ del -isitante. =DI+93E)#:RII )os de-uel-e el path &sico en el 1ue se encuentra # alo,ada la p2gina en el ser-idor. =/0/4E44"D Fuarda el identi&icador de sesi*n del usuario. Heremos m2s adelante en 1uC consisten las sesiones.
Co todas estas variables est"n disponibles en la totalidad de servidores o en determinadas versiones de un mismo servidor. adem"s, al unas de ellas han de ser previamente activadas o definidas por medio de al 7n acontecimiento. ,s, por e!emplo, la variable \#44PS96M6969 no estar" definida a menos que el internauta acceda al script a partir de un enlace desde otra p" ina.
30
,'0'*'( G/LEBAL<
Contiene una referencia a cada variable disponible en el espectro de las variables del script. 0as llaves de esta matriz son los nombres de las variables lobales. \@0&8,05 e2iste dese P#P +. /0%.+).+ Rariables definidas por el servidor 3eb directamente relacionadas con el entorno en don el script se esta e!ecutando. ,n"lo a a la anti ua matriz \#44PS569R69SR,95 Kla cual est" todava disponible, aunque no se useL. /01.' Rariables proporcionadas al script por medio de #44P @64. ,n"lo a a la anti ua matriz \#44PS@64SR,95 Kla cual est" todava disponible, aunque no se useL. /0P2%' Rariables proporcionadas al script por medio de #44P P&54. ,n"lo a a la anti ua matriz \#44PSP&54SR,95 Kla cual est" todava disponible, aunque no se useL. /03224*. Rariables proporcionadas al script por medio de #44P coo:ies. ,n"lo a a la anti ua matriz \#44PSC&&U%6SR,95 Kla cual est" todava disponible, aunque no se useL. /05*L.% Rariables proporcionadas al script por medio de la subida de ficheros via #44P . ,n"lo a a la anti ua matriz \#44PSP&54SM%065 Kla cual est" todava disponible, aunque no se useL. Rea tambin 5ubiendo ficheros por mtodo P&54 para m"s informacin. /0.-) Rariables proporcionadas al script por medio del entorno. ,n"lo a a la anti ua matriz \#44PS6CRSR,95 Kla cual est" todava disponible, aunque no se useL. /0+.&6.%' Rariables proporcionadas al script por medio de cuaquier mecanismo de entrada del usuario y por lo tanto no se puede confiar en ellas. 0a presencia y el orden en que aparecen las variables en esta matriz es definido por la directiva de confi uracin variablesSorder. 6sta matriz no tiene un an"lo o en versiones anteriores a P#P G.'.*. Rea tambin importSrequestSvariablesKL. /0%.%%*2Rariables re istradas en la sesin del script. ,n"lo a a la anti ua matriz \#44PS5655%&CSR,95 Kla cual est" todava disponible, aunque no se useL. Rea tambin la seccin Munciones para el mane!o de sessiones para m"s informacin.
Artculo por
Rubn Alvarez
31
Tu mejor ayuda para aprender a hacer webs www.desarrolloweb.com 0as variables lobales se pueden acceder en cualquier lu ar de la p" ina, mientras que las variables locales slo tienen validez dentro de la funcin donde han sido creadas. /e modo que una variable lobal la podemos acceder dentro de cualquier parte del cdi o, mientras que si intentamos acceder a una variable local fuera de la funcin donde fue creada, nos encontraremos con que esa variable no tiene contenido al uno. ,hora bien, si intentamos acceder a una variable lobal dentro de una funcin, en principio tambin nos encontraremos con que no se tiene acceso a su valor. 6sto es as en P#P por motivos de claridad del cdi o, para evitar que se pueda prestar a confusin el hecho de usar dentro de una funcin una variable que no ha sido declarada por nin 7n sitio cercano.
-ota" tal vez resulten desconocidos los conceptos sobre funciones, que se tratan m"s adelante en este manual- funciones en P#P
6ntonces, si queremos utilizar una variable lobal a la p" ina dentro de una funcin, tenemos que especificar de al una manera que esa variable que vamos a utilizar es una lobal. 62isten en P#P un par de maneras de utilizar variables lobales a la p" ina dentro de una funcin. 5on las si uientes(atriz 1L27#L% 62iste un array en P#P llamado \@0&8,05, que uarda una referencia a todas las variables creadas de manera lobal a la p" ina. 6s una matriz o array asociativo, de los que en lu ar de ndices numricos utilizan ndices de te2to, donde cada ndice es el nombre que hemos dado a la variable y cada valor es el contenido de cada variable. 5upon amos que tenemos esta declaracin de variables lobales a la p" ina, es decir, fuera de cualquier funcin8%i*aria5le G "pepe"; 8otra*aria5le G -'L#;
5i queremos acceder a esas variables dentro de una funcin utilizando el array \@0&8,05 tendramos este cdi of"nction %if"ncion()Q //estoy dentro de la f"nciRnE para aceder a las *aria5les "tiliSo 8@ TNA S echo 8@ TNA S?"%i*aria5le"B; echo 8@ TNA S?"otra*aria5le"B; U
Como se puede ver, se accede al contenido de las variables lobales con el array \@0&8,05, utilizando como ndices de la matriz los nombres de variables que deseamos mostrar. 6sto imprimira por pantalla el te2to "pepe')+G", el valor de las dos variables uno detr"s del otro. 8eclaracin de uso de variables globales dentro de una funcin &tra cosa que podemos hacer para acceder a variables lobales dentro de una funcin es especificar al comienzo de dicha funcin la lista de variables que vamos a utilizar dentro. Para especificar esas variables utilizamos la palabra " lobal" se uida de la lista de variables que se van a utilizar del entorno lobal.
f"nction %if"ncion()Q +lo5al 8%i*aria5leE 8otra*aria5le //con esa lPnea dentro de la f"nciRnE declara%os el "so de *aria5les +lo5ales echo 8%i*aria5le; echo 8otra*aria5le; U
Como vemos, con " lobal" se especifica que vamos a utilizar unas variables que fueron declaradas como lobales a la p" ina. Ina vez hecho esto, ya podemos acceder a esas variables lobales como si estuvieran declaradas dentro de la funcin. Cualquier alteracin que ha amos a las variables dentro de la funcin permanecer" cuando se haya salido de la funcin, tanto si accedemos a travs del array \@0&8,05 o declarando con " lobal" el uso de esas variables.
Artculo por
32
,'A'( Eperadores
+ista descriptiva de los operadores ms frecuentemente utili!ados 0as variables, como base de informacin de un len ua!e, pueden ser creadas, modificadas y comparadas con otras por medio de los llamados operadores. 6n los captulos anteriores hemos utilizado en nuestros e!emplos al unos de ellos. 6n este captulo pretendemos listar los m"s importantes y as dar constancia de ellos para futuros e!emplos.
I ( J 5 K
+eferencia" 6l operador aritmtico que puede resultar m"s desconocido para los lectores es el operador X. 62plicamos con mayor detenimiento su funcionamiento y un e!emplo en el que es 7til en el taller- 0istas de elementos con colores alternos en P#P.
33
7nd Er M
L I )o
MM=-ariable
NN=-ariable
6ste tipo de e2presiones no son m"s que abreviaciones de otras formas m"s cl"sicas\variable TV '* es lo mismo que\variable V \variableT'*
Artculo por
Rubn Alvarez
34
Parte 4:
rrays y ca!enas
)os detenemos para -er c*mo son los arra!s en /0/6 la estructura de datos m2s esencial 1ue e.iste. 7dem2s aprenderemos a traba,ar con cadenas en /0/.
6n este caso este array catalo a sus elementos, comunmente llamados valores, por n7meros. 0os n7meros del ' al ( son por lo tanto las claves y los sentidos son los valores asociados. Cada nos impide emplear nombres KcadenasL para clasificarlos. 0o 7nico que deberemos hacer es entrecomillarlos<? 8%oneda?"espana"BG"3eseta"; 8%oneda?"francia"BG"Vranco"; 8%oneda?""sa"BG"(olar"; ?>
&tra forma de definir idnticamente este mismo array y que nos puede ayudar para la creacin de arrays m"s comple!os es la si uiente sinta2is<? 8%onedaGarray("espana"G> "3eseta"E"francia" G> "Vranco"E""sa" G> "(olar"); ?>
Ina forma muy practica de almacenar datos es mediante la creacin de arrays multidimensionales KtablasL. Pon amos el e!emplo si uiente- Dueremos almacenar dentro de una misma tabla el nombre, moneda y len ua hablada en cada pas. Para hacerlo podemos emplear un array llamado pas que vendr" definido por estas tres caractersticas KclavesL. Para crearlo, deberamos escribir una e2presin del mismo tipo que la vista anteriormente en la que meteremos una array dentro del otro. 6ste proceso de incluir una instruccion dentro de otra se llama anidar y es muy corriente en pro ramacin<? 8paisGarray ( "espana" G>array (
35
.jecutar script ,ntes de entrar en el detalle de este peque;o script, comentemos al unos puntos referentes a la sinta2is. Como puede verse, en esta secuencia de script, no hemos introducido punto y coma "Z" al final de cada lnea. 6sto es simplemente debido a que lo que hemos escrito puede ser considerado como una sola instruccin. 6n realidad, somos nosotros quienes decidimos cortarla en varias lneas para, as, facilitar su lectura. 0a verdadera instruccin acabara una vez definido completamente el array y es precisamente ah donde hemos colocado el 7nico punto y coma. Por otra parte, podis observar cmo hemos !u ado con el tabulador para separar unas lneas m"s que otras del principio. 6sto tambin lo hacemos por cuestiones de claridad, ya que nos permite ver qu partes del cdi o est"n incluidas dentro de otras. 6s importante acostumbrarse a escribir de esta forma del mismo modo que a introducir los comentarios ya que la claridad de los scripts es fundamental a la hora de depurarlos. In poco de esfuerzo a la hora de crearlos puede ahorrarnos muchas horas a la hora de corre irlos o modificarlos meses m"s tarde. Pasando ya al comentario del pro rama, como podis ver, ste nos permite almacenar tablas y, a partir de una simple peticin, visualizarlas un determinado valor en pantalla. 0o que es interesante es que la utilidad de los arrays no acaba aqu, sino que tambin podemos utilizar toda una serie de funciones creadas para ordenarlos por orden alfabtico directo o inverso, por claves, contar el numero de elementos que componen el array adem"s de poder movernos por dentro de l hacia delante o atr"s. Muchas son las funciones propuestas por P#P para el tratamiento de arrays, no vamos a entrar aqu en una descripcin de las mismas. 5lo incluiremos esta peque;a tabla que puede ser complementada, si necesario, con la documentacin que ya hemos mencionado.
.uncin arra!:-alues (mi:arra! asort(mi:arra! ! arsort(mi:arra! count(mi:arra! Ksort(mi:arra! ! Krsort(mi:arra! list (=-ariable%6 =-ariable2... >mi:arra!
Descripcin (ista los -alores contenidos en mi:arra! Irdena por orden al&abCtico directo o in-erso en &unci*n de los -alores )os da el numero de elementos de nuestro arra! Irdena por orden al&abCtico directo o in-erso en &unci*n de las cla-es 7signa cada una -ariable a cada uno de los -alores del arra!
36
ne.t(mi:arra! 6 pre-(mi:arra! 6 )os permiten mo-ernos por dentro del arra! con un reset(mi:arra! ! end(mi:arra! puntero hacia delante6 atras ! al principio ! al &inal. )os da el -alor ! la cla-e del elemento en el 1ue nos encontramos ! mue-e al puntero al siguiente elemento.
each(mi:arra!
/e ran utilidad es tambin el bucle foreach que recorre de forma secuencial el array de principio a fin. Para complementar esta informacin resultar" de ran inters el artculo 4raba!o con tablas o arrays en P#P y para los que prefieran la formacin en vdeo, recomendamos ver los videotutoriales sobre los arrays en P#P.
Artculo por
Rubn Alvarez
37
Tu mejor ayuda para aprender a hacer webs www.desarrolloweb.com echo "WpY"Z NNmodifico otra vez \salida V arraySslice K\salida, 'LZ NNmuestro el array foreach K\salida as \actualL echo \actual . "WbrY"Z BY 4endr" como salidaMi uel Pepe .uan Pepe .uan array0shift:; 6sta funcin e2trae el el primer elemento del array y lo devuelve. ,dem"s, acorta la lon itud del array eliminando el elemento que estaba en la primera casilla. 5iempre hace lo mismo, por tanto, no recibir" m"s que el array al que se desea eliminar la primera posicin. 6n el cdi o si uiente se tiene el mismo vector con nombres propios y se e!ecuta dos veces la funcin arraySshiftKL eliminando un elemento en cada ocasin. 5e imprimen los valores que devuelve la funcin y los elementos del array resultante de eliminar la primera casilla.
<? 8entrada G array ("!i+"el"E "3epe"E "X"an"E "X"lio"E "3a5lo");
NNquito la primera casilla \salida V arraySshift K\entradaLZ NNmuestro el array echo "0a funcin devuelve- " . \salida . "WbrY"Z foreach K\entrada as \actualL echo \actual . "WbrY"Z echo "WpY"Z NNquito la primera casilla, que ahora sera la se unda del array ori inal \salida V arraySshift K\entradaLZ echo "0a funcin devuelve- " . \salida . "WbrY"Z NNmuestro el array foreach K\entrada as \actualL echo \actual . "WbrY"Z BY /a como resultado0a funcin devuelve- Mi uel Pepe .uan .ulio Pablo 0a funcin devuelve- Pepe .uan .ulio Pablo unset:; 5e utiliza para destruir una variable dada. 6n el caso de los arre los, se puede utilizar para eliminar una casilla de un
38
Tu mejor ayuda para aprender a hacer webs www.desarrolloweb.com array asociativo Klos que no tienen ndices numricos sino que su ndice es una cadena de caracteresL. Reamos el si uiente cdi o para conocer cmo definir un array asociativo y eliminar lue o una de sus casillas.
<? 8estadios$f"t5ol G array("Narcelona"G> "Ao" &a%p"E"7eal !adrid" G> "Santia+o Nerna5e""E">alencia" G> "!estalla"E"7eal Sociedad" G> "Anoeta");
NNmostramos los estadios foreach K\estadiosSfutbol as \indiceVY\actualL echo \indice . " PP " . \actual . "WbrY"Z echo "WpY"Z NNeliminamos el estadio asociado al real madrid unset K\estadiosSfutbol^"9eal Madrid"_LZ NNmostramos los estadios otra vez foreach K\estadiosSfutbol as \indiceVY\actualL echo \indice . " PP " . \actual . "WbrY"Z BY 0a salida ser" la si uiente8arcelona PP Cou Camp 9eal Madrid PP 5antia o 8ernabeu Ralencia PP Mestalla 9eal 5ociedad PP ,noeta 8arcelona PP Cou Camp Ralencia PP Mestalla 9eal 5ociedad PP ,noeta
NNaumentamos el tama;o del array arraySpushK\tabla, "@orrin", "Paloma", "&so"LZ foreach K\tabla as \actualL echo \actual . "WbrY"Z BY /a como resultado esta salida0a arti!a ,ra;a Perro @ato 9atn @orrin
39
Tu mejor ayuda para aprender a hacer webs www.desarrolloweb.com Paloma &so array0merge:; ,hora vamos a ver cmo unir dos arrays utilizando la funcin arraySmer eKL. , sta se le pasan dos o m"s arrays por par"metro y devuelve un arre lo con todos los campos de los vectores pasados. 6n este cdi o de e!emplo creamos tres arrays y lue o los unimos con la funcin arraySmer eKL
<? 8ta5la G array (" a+artiHa"E "AraWa"E "3erro"E "@ato"E "7atRn"); 8ta5la' G array ("-'"E"L#"E"#2"E"2'"E"-'"); 8ta5laL G array ("Sa"ce"E"3ino"E"AaranHo"E"&hopo"E"3erro"E"L#");
NNaumentamos el tama;o del array \resultado V arraySmer eK\tabla, \tabla), \tabla+LZ foreach K\resultado as \actualL echo \actual . "WbrY"Z BY /a como resultado0a arti!a ,ra;a Perro @ato 9atn ') +G G( () ') 5auce Pino Caran!o Chopo Perro +G Ina 7ltima cosa. 4ambin pueden introducirse nuevas casillas en un arre lo por los mtodos habituales de asi nar las nuevas posiciones en el array a las casillas que necesitemos. 6n arrays normales se hara as8ta5la G array ("Sa"ce"E"3ino"E"AaranHo"); 8ta5la?LBG"Al+arro5o";
6n arrays asociativos8estadios$f"t5ol G array(">alencia" G> "!estalla"E"7eal Sociedad" G> "Anoeta"); 8estadios$f"t5ol?"Narcelona"BG "Ao" &a%p";
Reremos m"s adelante otras posibilidades del traba!o con arrays. Ponemos a vuestra disposicin las p" inas P#P que contienen los cdi os con los que hemos traba!ado.
+eferencia"en el taller de P#P tenemos artculos sobre el traba!o con arrays en P#P. Concretamente tenemos uno que e2plica los distintos tipos de ordenacin de arrays en P#P- &rdenar arrays con P#P
Artculo por
40
0','( Cadenas en H
(spectos relevantes de las cadenas o strings en PHP , un tipo de variables muy utili!ado. +ista de caracteres protegidos. Ino de los tipos de variables m"s corrientes, a las que tendremos que hacer frente en la mayora de nuestros scripts, son las cadenas. 4ambin podremos conocerlas como strin s o cadenas de caracteres y no son m"s que informacin de tipo te2to y que pueden contener uno o m"s caracteres alfanumricos, es decir, una mezcla de caracteres numricos y no numricos. Por decirlo con otras palabras, en eneral, cuando uardamos cualquier te2to en una variable, lo que estamos uardando tcnicamente le llamamos cadenas o strin s. Para asi nar a una variable un contenido de este tipo, lo escribiremos entre comillas dando lu ar a declaraciones de este tipo8cadenaG":sta es la infor%aciRn de %i *aria5le";
5i queremos ver en pantalla el valor de una variable o bien un mensa!e cualquiera usaremos la instruccin echo como ya lo hemos visto anteriormenteecho 8cadena; //sacarPa ":sta es la infor%aciRn de %i *aria5le"
echo "6sta es la informacin de mi variable"Z NNdara el mismo resultado Podemos yu2taponer o concatenar varias cadenas poniendo para ello un punto entre ellas<? 8cadena-G"3erro"; 8cadena'G" %"erde"; 8cadenaLG8cadena-.8cadena'; echo 8cadenaL; //:l res"ltado es: "3erro %"erde" ?>
.jecutar script 4ambin podemos introducir variables dentro de nuestra cadena lo cual nos puede ayudar mucho en el desarrollo de nuestros scripts. 0o que veremos no es el nombre, sino el valor de la variable<? 8aG22; 8%ensaHeG"Ten+o 8a aWos"; echo 8%ensaHe; //:l res"ltado es: "Ten+o 22 aWos" ?>
.jecutar script 0a pre unta que nos podemos plantear ahora es...ACmo ha o entonces para que en vez del valor "((" me sal a el te2to "\a"B 6n otras palabras, cmo se hace para que el smbolo \ no defina una variable sino que sea tomado tal cual. 6sta pre unta es tanto m"s interesante cuanto que en al unos de scripts este smbolo debe ser utilizado por una simple razn comercial Kpa o en dlares por e!emploL y si lo escribimos tal cual, el ordenador va a pensar que lo que viene detr"s es una variable siendo que no lo es. Pues bien, para meter ste y otros caracteres utilizados por el len ua!e dentro de las cadenas y no confundirlos, lo que hay que hacer es escribir una contrabarra delante-
Carc ter =
41
<
P/2
,dem"s, e2isten otras utilidades de esta contrabarra que nos permiten introducir en nuestro documento #4M0 determinados eventos-
Carc ter t n r
7#ecto en la cadena "ntroduce una tabulaci*n en nuestro te.to +ambiamos de lnea Retorno de carro
6stos cambios de lnea y tabulaciones tienen 7nicamente efecto en el cdi o y no en el te2to e!ecutado por el nave ador. 6n otras palabras, si queremos que nuestro te2to e!ecutado cambie de lnea hemos de introducir un echo "<br>" y no echo "n" ya que este ultimo slo cambia de lnea en el archivo #4M0 creado y enviado al nave ador cuando la p" ina es e!ecutada en el servidor. 0a diferencia entre estos dos elementos puede ser f"cilmente comprendida mirando el cdi o fuente producido al e!ecutar este script<<T! > <<:A(> <T)T :>ca%5iolinea.php</T)T :> </<:A(> <NT(D> <? echo "<olaE n si+o en la %is%a lPnea eHec"tada pero no en cRdi+o f"ente.<5r>Ahora ca%5io de lPnea eHec"tada pero contin"o en la %is%a en el cRdi+o f"ente." ?> </NT(D> </<T! >
.jecutar script
6char un vistazo al codi o fuente del nave ador
6l cdi o fuente que observaramos seria el si uiente<<T! > <<:A(> <T)T :>ca%5iolinea.php</T)T :> </<:A(> <NT(D> <olaE si+o en la %is%a lPnea eHec"tada pero no en cRdi+o f"ente.<5r>Ahora ca%5io de lPnea eHec"tada pero
42
0as cadenas pueden asimismo ser tratadas por medio de funciones de todo tipo. Reremos estas funciones m"s adelante con m"s detalle. 4an slo debemos retener que e2isten muchas posibles acciones que podemos realizar sobre ellas/ividirlas en palabras, eliminar espacios sobrantes, localizar secuencias, remplazar caracteres especiales por su correspondiente en #4M0 o incluso e2traer las etiquetas M64, de una p" ina 3eb.
Artculo por
Rubn Alvarez
Parte ":
#unciones en PHP
(as &unciones son esenciales para poder realizar c*digo de calidad6 tanto en /0/ como en muchos otros lengua,es de programaci*n. En estos captulos del 3anual de /0/ aprenderemos a de&inir &unciones6 traba,ar con par2metros ! retornar -alores.
4'&'( .unciones en H
/tilidad de las funciones, creacin y almacenamiento en arc%ivos. Ejemplo prctico de creacin de funcin. 6n nuestro manual de p" inas din"micas vimos el concepto de funcin. Rimos que la funcin podra ser definida como un con!unto de instrucciones que e2plotan ciertas variables para realizar una tarea m"s o menos elemental. P#P basa su eficacia principalmente en este tipo de elemento. Ina ran librera que crece constantemente, a medida que nuevas versiones van sur iendo, es complementada con las funciones de propia cosecha dando como resultado un sinfn de recursos que son aplicados por una simple llamada. 0as funciones inte radas en P#P son muy f"ciles de utilizar. 4an slo hemos de realizar la llamada de la forma apropiada y especificar los par"metros yNo variables necesarios para que la funcin realice su tarea. 0o que puede parecer li eramente m"s complicado, pero que resulta sin lu ar a dudas muy pr"ctico, es crear nuestras propias funciones. /e una forma eneral, podramos crear nuestras propias funciones para conectarnos a una base de datos o crear los encabezados o etiquetas meta de un documento #4M0. Para una aplicacin de comercio electrnico podramos crear por e!emplo funciones de cambio de una moneda a otra o de calculo de los impuestos a a;adir al precio de articulo. 6n definitiva, es interesante crear funciones para la mayora de acciones m"s o menos sistem"ticas que realizamos en nuestros pro ramas. ,qu daremos el e!emplo de creacin de una funcin que, llamada al comienzo de nuestro script, nos crea el encabezado de nuestro documento #4M0 y coloca el titulo que queremos a la p" ina<? f"nction hacer$enca5eSado(8tit"lo) Q
43
6sta funcin podra ser llamada al principio de todas nuestras p" inas de la si uiente forma8tit"loG"!i 6e5"; hacer$enca5eSado(8tit"lo);
/e esta forma automatizamos el proceso de creacin de nuestro documento. Podramos por e!emplo incluir en la funcin otras variables que nos ayudasen a construir la etiquetas meta y de esta forma, con un esfuerzo mnimo, crearamos los encabezados personalizados para cada una de nuestras p" inas. /e este mismo modo nos es posible crear cierres de documento o formatos diversos para nuestros te2tos como si se tratase de ho!as de estilo que tendran la venta!a de ser reconocidas por todos los nave adores. Por supuesto, la funcin ha de ser definida dentro del script ya que no se encuentra inte rada en P#P sino que la hemos creado nosotros. 6sto en realidad no pone nin una pe a ya que puede ser incluida desde un archivo en el que iremos almacenando las definiciones de las funciones que vayamos creando o recopilando. 6stos archivos en los que se uardan las funciones se llaman libreras. 0a forma de incluirlos en nuestro script es a partir de la instruccin require o includerequireK"libreria.php"L o includeK"libreria.php"L 6n resumen, la cosa quedara as4endramos un archivo libreria.php como si ue
<? //f"nciRn de enca5eSado y colocaciRn del tit"lo f"nction hacer$enca5eSado(8tit"lo) Q 8enca5eSadoG"<ht%l>n<head>nt<title>8tit"lo</title>n</head>n"; echo 8enca5eSado; U ?>
Por otra parte tendramos nuestro script principal p" ina.php Kpor e!emploL<? incl"de("li5reria.php"); 8tit"loG"!i Ye5"; hacer$enca5eSado(8tit"lo); ?> <5ody> :l c"erpo de la p4+ina </5ody> </ht%l>
.jecutar script
6char un vistazo al codi o fuente del nave ador
Podemos meter todas las funciones que vayamos encontrando dentro de un mismo archivo pero resulta muchsimo m"s venta!oso ir clasific"ndolas en distintos archivos por tem"tica- Munciones de cone2in a bases de datos, funciones comerciales, funciones enerales, etc. 6sto nos ayudara a poder localizarlas antes para corre irlas o modificarlas, nos permite tambin car ar 7nicamente el tipo de funcin que necesitamos para el script sin recar ar ste en e2ceso adem"s de permitirnos utilizar un determinado tipo de librera para varios sitios 3ebs distintos. 4ambin puede resultar muy pr"ctico el utilizar una nomenclatura sistem"tica a la hora de nombrarlas- 0as funciones comerciales podran ser llamadas comSloquesea, las de bases de datos bdSloquesea, las de tratamiento de archivos fileSloquesea. 6sto nos permitir" reconocerlas ense uida cuando leamos el script sin tener que recurrir a nuestra o2idada memoria para descubrir su utilidad. Co obstante, antes de lanzarnos a crear nuestra propia funcin, merece la pena echar un vistazo a la documentacin para ver si dicha funcin ya e2iste o podemos aprovecharnos de al una de las e2istentes para ali erar nuestro traba!o. ,s, por e!emplo, e2iste una funcin llamada header que crea un encabezado #4M0 confi urable lo cual nos evita tener
44
Tu mejor ayuda para aprender a hacer webs www.desarrolloweb.com que crearla nosotros mismos. Como puede verse, la tarea del pro ramador puede en al unos casos parecerse a la de un coleccionista. #ay que ser paciente y metdico y al final, a base de traba!o propio, intercambio y tiempo podemos lle ar poseer nuestro peque;o tesoro.
-ota" 5i lo deseas puedes repasar todos los conceptos anteriores sobre las funciones, as como diversas otras cosas interesantes en el Rideotutorial sobre las funciones en P#P.
0a manera de realizar esta funcin ser" recorrer el strin , caracter a caracter, para imprimir cada uno de los caracteres, se uido de el si no "P". 9ecorreremos el strin con un bucle for, desde el carater * hasta el n7mero de caracteres total de la cadena. 6l n7mero de caracteres de una cadena se obtiene con la funcin predefinida en P#P strlenKL, que recibe el strin entre parntesis y devuelve el n7mero de los caracteres que ten a.
<ht%l> <head> <title>f"ncion -</title> </head> <5ody> <? f"nction escri5e$separa(8cadena)Q for (8iG1;8i<strlen(8cadena);8iMM)Q echo 8cadena?8iB; if (8i<strlen(8cadena)--) echo "-"; U U escri5e$separa ("hola"); echo "<p>"; escri5e$separa ("Texto %4s lar+oE a *er lo ,"e hace"); ?> </5ody> </ht%l>
0a funcin que hemos creado se llama escribeSsepara y recibe como par"metro la cadena que hay que escribir con el separador "P". 6l bucle for nos sirve para recorrer la cadena, desde el primer al 7ltimo car"cter. 0ue o, dentro del bucle, se imprime cada car"cter separado del si no "P". 6l if que hay dentro del bucle for comprueba que el actual no sea el 7ltimo car"cter, porque en ese caso no habra que escribir el si no "P" Kqueremos conse uir "hPoPlPa" y si no estuviera el if obtendramos "hPoPlPaP"L. 6n el cdi o mostrado se hacen un par de llamadas a la funcin para ver el resultado obtenido con diferentes cadenas como par"metro. Podemos ver el script en marcha.
Artculo por
Rubn Alvarez
45
,s definimos una funcin llamada f' que recibe dos par"metros. Como se puede observar, no se tiene que definir el tipo de datos de cada par"metro. 0os par"metros tienen validez durante la e!ecucin de la funcin, es decir, tienen un "mbito local a la funcin donde se est"n recibiendo. Cuando la funcin se termina, los par"metros de!an de e2istir. Los parmetros se pasan por valor 6l paso de par"metros en P#P se realiza por valor. "Por valor" es una manera tpica de pasar par"metros en funciones, quiere decir que el cambio de un dato de un par"metro no actualiza el dato de la variable que se pas a la funcin. Por e!emplo, cuando invocamos una funcin pasando una variable como par"metro, a pesar de que cambiemos el valor del par"metro dentro de la funcin, la variable ori inal no se ve afectada por ese cambio. Puede que se vea me!or con un e!emplof"nction por*alor (8para%etro-)Q 8para%etro-G"hola"; echo "<5r>" . 8para%etro-; //i%pri%e "hola" U 8%i*aria5le G "esto no ca%5ia"; por*alor (8%i*aria5le); echo "<5r>" . 8%i*aria5le; //i%pri%e "esto no ca%5ia"
6sta p" ina tendr" como resultadohola esto no cambia Paso de parmetros por referencia 6n contraposicin al paso de par"metros por valor, est" el paso de par"metros por referencia. 6n este 7ltimo caso, el cambio del valor de un par"metro dentro de una funcin s afecta al valor de la variable ori inal. Podemos pasar los par"metros por referencia si, en la declaracin de la funcin, colocamos un "]" antes del par"metro.
<? f"nction porreferencia(O8cadena) Q 8cadena G =Si ca%5ia=; U 8str G =:sto es "na cadena=; porreferencia (8str);
46
6ste script mostrar" por pantalla b5i cambiab. Parmetros por defecto Podemos definir valores por defecto para los par"metros. 0os valores por defecto sirven para que los par"metros conten an un dato predefinido, con el que se inicializar"n si no se le pasa nin 7n valor en la llamada de la funcin. 0os valores por defecto se definen asi nando un dato al par"metro al declararlo en la funcin.
f"nction pordefecto (8para%etro-G"pepe";8para%etro'GL)
Para la definicin de funcin anterior, \parametro' tiene como valor por defecto "pepe", mientras que \parametro) tiene + como valor por defecto. 5i llamamos a la funcin sin indicar valores a los par"metros, estos tomar"n los valores asi nados por defectopordefecto () // 8para%etro- *ale "pepe" y 8para%etro' *ale L
5i llamamos a la funcin indicando un valor, este ser" tenido en cuenta para el primer par"metro.
pordefecto ("hola") // 8para%etro- *ale "hola" y 8para%etro' *ale L
,tencin, estamos obli ados a declarar todos los par"metros con valores por defecto al final.
Artculo por
47
echo i*a(-111) . "<5r>"; echo i*a(-111EZ) . "<5r>"; echo i*a(-1E1) . "<5r>"; ?> </5ody> </ht%l>
5i se han entendido bien los conceptos, este e!emplo no puede resultar difcil. 0a funcin recibe un par"metro llamado \porcenta!e con 'H como valor por defecto. /evuelve el porcenta!e dado aplicado a la base tambin indicada por par"metro. ,s pues, en la primera e!ecucin de la funcin, como no se indica el porcenta!e, se mostrar" el 'HX de '***. 6n la se unda, se muestra el OX de mil y en la tercera, el *X de '*. Puede verse el resultado en una p" ina aparte. http-NN333.desarrollo3eb.comNarticulosNe!emplosNphpNe!Siva.php +etornar m<ltiples valores Ina funcin devuelve un 7nico valor. 5i queremos hacer que se puedan devolver varios valores distintos tenemos que recurrir a un truco que consiste en devolver un array.
f"nction s%all$n"%5ers() Q ret"rn array (1E -E '); U list (8SeroE 8oneE 8t6o) G s%all$n"%5ers();
listKL se usa para asi nar una lista de variables en una sola operacin. /espus de esa operacin, \zero valdr" *, \one valdr" ' y \t3o valdr" ).
Artculo por
48
Parte $:
A; N;
0le ados a este punto, el pro rama verificar" el cumplimiento o no de la condicin. 5i la condicin es cierta las
49
Tu mejor ayuda para aprender a hacer webs www.desarrolloweb.com instrucciones ' y ) ser"n e!ecutadas. /e lo contrario KelseL, las instrucciones , y 8 ser"n llevadas a cabo. 6sta estructura de base puede complicarse un poco m"s si tenemos cuenta que no necesariamente todo es blanco o ne ro y que muchas posibilidades pueden darse. 6s por ello que otras condiciones pueden plantearse dentro de la condicin principal. #ablamos por lo tanto de condiciones anidadas que tendran una estructura del si uiente tipoif (condiciRn-) Q )nstr"cciRn -; )nstr"cciRn '; ... U else Q if (condiciRn') Q )nstr"cciRn A; )nstr"cciRn N; ... U else Q )nstr"cciRn [ ... U U
/e este modo podramos introducir tantas condiciones como queramos dentro de una condicin principal. /e ran ayuda es la instruccin elseif que permite en una sola lnea introducir una condicin adicional. 6ste tipo de instruccin simpifica li eramente la sinta2is que acabamos de verif (condiciRn-) Q )nstr"cciRn -; )nstr"cciRn '; ... U elseif (condiciRn') Q )nstr"cciRn A; )nstr"cciRn N; ... U else Q )nstr"cciRn [ ... U
6l uso de esta herramienta resultar" claro con un poco de pr"ctica. Pon amos un e!emplo sencillo de utilizacin de condiciones. 6l si uiente pro rama permitira detectar la len ua empleada por el nave ador y visualizar un mensa!e en dicha len ua.
<<T! > <<:A(> <T)T :>(etector de en+"a</T)T :> </<:A(> <NT(D> <? //Antes de nada introd"ci%os %ensaHes en for%a de *aria5les 8espanolG"<ola"; 8in+lesG"<ello"; 8francesG"NonHo"r"; //Ahora lee%os del na*e+ador c"4l es s" len+"a oficial 8idio%aGs"5str(8<TT3$A&&:3T$ AA@9A@:E1E'); //Vor%"la%os las posi5ilidades ,"e se p"eden dar if (8idio%a GG "es")
50
.jecutar script Para poder ver el funcionamiento de este script es necesario cambiar el idioma preferido lo cual puede ser realizado a partir del men7 de opciones del nave ador. Para leer la len ua aceptada por el nave ador lo que hacemos es definir una variable K idiomaL y, mediante la funcin substr, reco emos las dos primeras letras del cdi o correspondiente al idioma aceptado por el nave ador K\#44PS,CC6P4S0,C@I,@6L. 0a tercera parte de script se encar a de ver si el nave ador est" en espa;ol KesL, francs KfrL o en cualquier otro idioma que no sea nin uno de estos dos y de imprimir el mensa!e que proceda en cada caso. , notar que, cuando se trata de comparar variables, ponemos un doble i ual "VV" en lu ar de un simple "V". 6ste 7ltimo queda reservado e2clusivamente para asi nar valores a variables
+eferencia" #emos publicado un vdeo para mostrar la creacin y el funcionamiento de las estructuras %M- 6structuras de control, Rdeo '- condicional if
Artculo por
Rubn Alvarez
In e!emplo sencillo es este bucle que aumenta el tama;o de la fuente en una unidad a cada nueva vuelta por el bucle<? 8siSeG-; Yhile (8siSe<G/) Q echo"<font siSeG8siSe>Ta%aWo 8siSe</font><5r>n";
51
.jecutar script , modo de e2plicacin, diremos que, antes de nada, hemos de definir el valor de la variable que vamos a evaluar en la condicin. ,l o absolutamente obvio pero f"cil de olvidar. 6n este caso le hemos atribuido un valor de ' que corresponde a la letra m"s peque;a. 6l paso si uiente es crear el bucle en el que imponemos la condicin que la variable no e2ceda el valor de H. 0a instruccin a e!ecutar ser" imprimir en nuestro documento un cdi o #4M0 en el que la etiqueta font y el mensa!e que contiene varan a medida que si!e cambia su valor. 6l si uiente paso es incrementar en una unidad el valor de \size. 6sto se puede hacer con una e2presin como la mostrada en el bucle K\sizeTTL que en realidad es sinnima de\sizeV\sizeT' Reremos otras de estas abreviaciones m"s adelante.
6n este e!emplo se define una cadena con el valor "hola a todo el mundo". Posteriormente se recorre esa cadena hasta el final de la cadena o hasta encontrar el caracter "m", utilizando una variable \i que lleva la cuenta de los caracteres recorridos. ,l final del bucle 3hile, si se sali porque se encontr el caracter "m", la variable \i valdr" un n7mero menor que la lon itud de la cadema. 5i se sali por lle ar al final de la cadena, la variable \i valdr" lo mismo que la lon itud en caracteres de esa cadena. 6n el condicional simplemente se comprueba si \i vale o no lo mismo que la lon itud de la cadena, mostrando los mensa!es adecuados en cada caso. Podemos ver el e!emplo en funcionamiento.
52
U 6hile (condiciRn)
0a diferencia con respecto a los bucles while es que este tipo de bucle eval7a la condicin al final con lo que, incluso siendo falsa desde el principio, ste se e!ecuta al menos una vez.
+eferencia" Para una ayuda pr"ctica sobre estos bucles ver el si uiente videotutorial 6structuras de control, Rdeo )- bucles for, 3hile y doP3hile. ,dem"s, las e2plicaciones sobre estructuras de control se complementan con el videotutorial de 53itch y las instrucciones brea: y continue.
Artculo por
Rubn Alvarez
.jecutar script 0as e2presiones dentro del parntesis definen respectivamenteP%nicializacin de la variable. Ralida para la primera vuelta del bucle. PCondicin de evaluacin a cada vuelta. 5i es cierta, el bucle continua. P,ccin a realizar al final de cada vuelta de bucle.
53
Tu mejor ayuda para aprender a hacer webs www.desarrolloweb.com un con!unto de elementos KvaloresL catalo ados por claves. 0a estructura eneral es la si uienteVoreach (8array as 8cla*eG>8*alor) Q instr"ccion-; instr"ccion'; ; U
In e!emplo pr"ctico es la lectura de un array lo cual podra hacerse del si uiente modo<? 8%onedaGarray(":spaWa"G> "3eseta"E"Vrancia" G> "Vranco"E"9SA" G> "(olar"); Voreach (8%oneda as 8cla*eG>8*alor) Q echo "3ais: 8cla*e !oneda: 8*alor<5r>"; U ?>
.jecutar script 6ste script se encar ara de mostrarnos por pantalla el contenido del array moneda. Co resultara mala idea crear una funcin propia basada en este bucle que nos permitiese visualizar arrays monodimensionales y almacenarla en nuestra librera. 6sta funcin podra ser definida de esta formaV"nction %ostrar$array (8array) Q Voreach (8array as 8cla*eG>8*alor) Qecho "8cla*eG>8*alor<5r>";U U
Artculo por
Rubn Alvarez
54
Parte &:
55
Tu mejor ayuda para aprender a hacer webs www.desarrolloweb.com Podis observar que estas variables no poseen el smbolo \ delante. 6sto es debido a que en realidad este modo de pasar variables no es especfico de P#P sino que es utilizado por otros len ua!es. ,hora nuestra variable pertenece tambin al entorno de la p" ina destino"php y est" lista para su e2plotacin.
-ota" Co siempre se definen autom"ticamente las variables recibidas por par"metro en las p" inas 3eb, depende de una variable de confi uracin de P#P- re isterS lobals, que tiene que estar activada para que as sea. Rer comentarios del artculo al final de la p" ina para m"s informacin.
Para aclarar posibles dudas, veamos esto en forma de e!emplo. 4endremos pues dos p" inas, origen"html Kno es necesario darle e2tensin P#P puesto que no hay nin 7n tipo de cdi oL y destino"php<<T! > <<:A(> <T)T :>ori+en.ht%l</T)T :> </<:A(> <NT(D> <a hrefG"destino.php?sal"doGholaOtextoG:sto es "na *aria5le texto">3aso *aria5les sal"do y texto a la p4+ina destino.php</a> </NT(D> </<T! > <<T! > <<:A(> <T)T :>destino.php</T)T :> </<:A(> <NT(D> <? echo ">aria5le 8sal"do: 8sal"do <5r>n"; echo ">aria5le 8texto: 8texto <5r>n" ?> </NT(D> </<T! >
.jecutar ejemplo
C'&','( GQ/7, partir de la versin G.'.* de P#P se ha introducido el array asociativo \S@64, que es idntico a \#44PS@64SR,95, aunque un poco m"s corto de escribir.
56
Tu mejor ayuda para aprender a hacer webs www.desarrolloweb.com dar" problemas. Por e!emplo, el si no "[" no puede fi urar tampoco en una I90. ,s pues, tenemos que hacer al o para convetir esos caracteres, de modo que no den problemas en la I90. 0a solucin en P#P es sencilla, simplemente debemos codificar la variable que tiene caracteres conflictivos a formato I90. Para ello utilizamos la funcin urlencondeKL, que viene en la librera de funciones de P#P. Podemos encontrar m"s informacin sobre esto en la M,D- Problemas con variables pasadas en la I90 en al unos caracteres.
+eferencia" 5i lo deseas, puedes complementar esta informacin con unos e2plicativos videotutoriales sobre el paso de variables por @64 en P#P.
Artculo por
Rubn Alvarez
.jecutar ejemplo
57
Tu mejor ayuda para aprender a hacer webs www.desarrolloweb.com por este mtodo a partir de la variable de sistema \#44PSP&54SR,95.
echo ">aria5le 8no%5re: " . 8<TT3$3TST$>A7S?"no%5re"B . "<5r>n"; -ota" ,unque podamos reco er variables con este array asociativo o utilizar directamente las variables que se definen en nuestra p" ina, resulta m"s se uro utilizar \#44PSP&54SR,95 por dos razones, la primera que as nos ase uramos que esa varible viene realmente de un formulario y la se unda, que as nuestro cdi o ser" m"s claro cuando lo volvamos a leer, porque quedar" especificado que esa variable estamos recibindola por un formulario.
C'*'*'( GQ E<, partir de P#P G.'.* se pueden reco er las variables de formulario utilizando tambin el array asociativo \SP&54, que es el mismo que \#44PSP&54SR,95, pero m"s corto de escribir.
6sta es una p" ina sin nin 7n cdi o P#P, simplemente tiene un formulario. Mi!monos en el action del formulario, que est" diri ido hacia una p" ina llamada edad).php, que es la que recibir" el dato de la edad y mostrar" un contenido u otro dependiendo de ese valor. 5u cdi o es el si uiente<ht%l> <head> <title>7estrin+ir por edad</title> </head> <5ody> <? 8edad G 8$3TST?"edad"B; echo "T" edad: 8edad<p>"; if (8edad < -0) Q echo "Ao p"edes entrar"; UelseQ echo "Nien*enido"; U ?> </5ody> </ht%l>
58
Tu mejor ayuda para aprender a hacer webs www.desarrolloweb.com 6speramos que este otro cdi o tampoco resulte e2tra;o. 5implemente se recibe la edad, utilizando el array \SP&54. 0ue o se muestra la edad y se e!ecuta una e2presin condicional en funcin de que la edad sea menor que 'Q. 6n caso positivo Kedad menor que 'QL, se muestra un mensa!e que informa de que no se de!a acceder al p" ina. 6n caso ne ativo Kmayor o i ual a 'QL se muestra un mensa!e de bienvenida. Podemos ver el e!emplo en funcionamiento.
Artculo por
Rubn Alvarez
6l listado de cdi o que se realiz en directo es el si uiente<C(T&TD3: ht%l> <ht%l> <head> <title>:H - de 3<3</title> </head> <5ody> <h->:stoy en 3<3CC</h->
59
K/
8contador G 2 M 2; 8contador G 8contador M -1; echo 8contador; // estr"ct"ras de control 8edad G L#; if(8edad < -0)Q echo "Si es %enor de -0"; U // repeticiones o 5"cles 6hile(8contador < -11)Q // todo esto se repetir4 echo "contador *ale " . 8contador; echo "<5r>"; 8contador G 8contador M Z; U ?> </5ody> </ht%l>
60
4oda la parte de P#P se queda simplemente en la recepcin de los datos de ese formulario y su procesamiento, que en este e!emplo se realiz en una p" ina y archivo aparte. 6l procesamiento que se implement es muy sencillo, simplemente para darnos cuenta de que b"sicamente con P#P podemos acceder a los datos del formulario de una manera muy sencilla, a travs de los arrays \SP&54 y mencionando sus "hermanos" \S@64 o \S96DI654. 6l e!emplo es muy simple, aunque poco a poco fuimos complicando un poco para introducir diversos mtodos de inte rar cdi o P#P en una p" ina #4M0, por lo que el listado a continuacin puede parecer un poco comple!o en un primer vistazo, aunque en la clase se e2plica todo perfectamente y paso a paso.
<C(T&TD3: ht%l> <ht%l> <head> <%eta charsetG""tf-0" /> <title>reci5o datos del for%</title> </head> <5ody> <?php //reci5o 8no%5re$"s"ario G 8$3TST?"no%5re"B; 8edad$"s"ario G 8$3TST?"edad"B; //*alido los datos //echo "<ola " . 8no%5re$"s"ario . " t" edad es " . 8edad$"s"ario; // to%a de decisiRn en f"nciRn de la edad if(8edad$"s"ario >G -0)Q ?> <di* styleG"color: 5l"e;"> <5> <?php echo "<ola 8no%5re$"s"arioE co%o t" edad es 8edad$"s"arioE p"edes *er este contenidoCC"; ?> </5></di*> <?php UelseQ //parte ne+ati*a echo =<span styleG"color: red;">=; echo " o siento 8no%5re$"s"arioE no p"edes *er esta p4+inaCCC AdiRsC"; echo "</span>"; U ?> </5ody> </ht%l>
61
Artculo por
62
6n el e!emplo, el primer paso es conocer si se est"n recibiendo o no datos por un formulario. Para ello se comprueba con un enunciado if si e2iste o no una variable \SP&54. 6n concreto if K?\SP&54L querra decir al o como "5i no e2isten datos venidos de un formulario". 6n caso de que no e2istan, muestro el formulario. 6n caso de que s e2istan, reco!o los datos y los imprimo en la p" ina. 5e puede ver el e!emplo en funcionamiento en una p" ina aparte. Para paso de variables por 6+L 0a idea es la misma. Comprobar con un enunciado if si se reciben o no datos desde una I90. Reamos el cdi o a continuacin. 5e trata de una p" ina que muestra una serie de enlaces para ver las tablas de multiplicar de el ' hasta el '*. Cada uno de los enlaces muestra una tabla de multiplicar. Pulsando el primer enlace podemos ver la tabla del ', pulsando el se undo la tabla del ), etc. 9ecordemos que la p" ina se llama a si misma. Para comprenderla m"s f"cilmente ser" interesante verla en funcionamiento.
<ht%l> <head> </head> <title>Ta5las de %"ltiplicar</title>
<5ody> <? if (C8$@:T)Q for (8iG-;8i<G-1;8iMM)Q echo "<5r><a hrefG=*er$ta5la.php?ta5laG8i=>>er la ta5la del 8i</a>\n"; U U else Q 8ta5laG8$@:T?"ta5la"B; ?> <ta5le ali+nGcenter 5orderG- cellpaddin+G"-"> <? for (8iG1;8i<G-1;8iMM)Q echo "<tr><td>8ta5la [ 8i</td><td>G</td><td>" . 8ta5la K 8i . "</td></tr>\n"; U ?> </ta5le> <? U ?> </5ody> </ht%l>
6ste cdi o es un poco m"s complicado, porque hace un poco m"s de cosas que el anterior, pero para el asunto que nos ocupa que es la autollamada de p" inas, todo si ue i ual de simple. #ay que fi!arse en el if que comprueba si se reciben o no datos por I90- if K?\S@64L, que querra decir al o como "5i no se reciben variables por la I90". 6n caso positivo Kno se reciben datos por I90L se muestran los enlaces para ver cada una de las tablas y en caso de que s se reciban datos, se muestra la tabla de multiplicar del n7mero que se est" recibiendo en la I90. Para hacer para mostrar los enlaces y las tablas de multiplicar se utilizan bucles for, que esperamos que no resulten desconocidos para el lector. Puede conocerse al o m"s sobre los bucles for en Control del flu!o en P#P- 8ucles %%.
63
6s posible, por supuesto, ver estos archivos. Para abrirlos hay que ir al directorio C->indo3sCoo:ies para los usuarios de %6 GT o a C-...CetscapeIsersdefaultuser para usuarios de Cetscape. Como podris comprobar, en la mayora de los casos la informacin que se puede obtener es indescifrable. 0a utilidad principal de las coo:ies es la de poder identificar al nave ador una vez ste visita el sitio por se unda vez y as, en funcin del perfil del cliente dado en su primera visita, el sitio puede adaptarse din"micamente a sus preferencias Klen ua utilizada, colores de pantalla, formularios rellenados total o parcialmente, redireccin a determinadas p" inas...L. Para crear cookies con PHP, modificar o enerar una nueva coo:ie lo podemos hacer a partir de la funcin 5etCoo:iesetcoo;ie("no%5re$de$la$coo;ie"E*alorEexpiracion);
Pon amos un e!emplo sencillo. %ma inemos que queremos introducir en una variable coo:ie el nombre del visitante. 6l nombre ha podido ser previamente reco ido por un formulario tal y como hemos vistosetcoo;ie("persona"E8no%5reEti%e()M0/#11KL/2);
/e este modo hemos creado una coo:ie php llamada persona que tiene como valor el contenido de la variable \nombre y tendr" una duracin de ' a;o a partir de su creacin Kel tiempo timeKL actual en se undos sumado a un a;o en se undosL. 6s importante que la creacin de la coo:ie sea previa a la apertura del documento #4M0. 6n otras palabras, las llamadas a la funcin setcoo:ieKL deben ser colocadas antes de la etiqueta #4M0. Por otra parte, es interesante se;alar que el hecho de que definir una coo:ie ya e2istente implica el borrado de la anti ua. /el mismo modo, el crear una primera coo:ie conlleva la eneracin autom"tica del archivo te2to. Para utilizar el valor de la coo:ie en nuestros scripts tan slo tendremos que llamar la variable que define la coo:ie. E9ealmente sencillo? #ay que tener cuidado sin embar o de no definir variables en nuestro script con el mismo nombre que las coo:ies puesto que P#P privile iar" el contenido de la variable local con respecto a la coo:ie y no dar" un mensa!e de error. 6sto nos puede conducir a errores realmente difciles de detectar. 9ecordamos que es posible recopilar en una variable tipo array el con!unto de coo:ies almacenadas en el disco duro del internauta mediante la variable de servidor \#44PSC&&U%6SR,95 0as coo:ies son una herramienta fant"stica para personalizar nuestra p" ina pero hay que ser cautos ya que, por una parte, no todos los nave adores las aceptan y por otra, se puede deliberadamente impedir al nave ador la creacin de coo:ies. 6s por ello que resultan un complemento y no una fuente de variables infalible para nuestro sitio. Como has podido ver, las 3ookies son muy sencillas de utilizar en PHP. Puedes profundizar m"s en la creacin de coo:ies en el si uiente articulo- Coo:ies en P#P. ,dem"s, tambin te
64
Tu mejor ayuda para aprender a hacer webs www.desarrolloweb.com recomendamos ver el Rideotutorial sobre las Coo:ies en P#P.
Artculo por
Rubn Alvarez
C'A'( CooPies en H
E plicaciones completas sobre coo8ies en PHP , con todos los parmetros de la funcin setcoo8ie;< y el array =>C::?'E 6n este artculo del Manual de P#P vamos a demostraros que las cookies en PHP son muy f"ciles de utilizar. =a empezamos a e2plicar al unas claves interesantes sobre este asunto en el artculo utilizacin de cookies, anterior entre a del temario de /esarrollo>eb.com sobre la pro ramacin en P#P. 6n el presente artculo vamos a mostrar otros detalles que conviene saber para traba!ar con las coo:ies. 4anto los procesos de creacin como los de lectura, pero sobre todo vamos a realizar un estudio completo sobre los diferentes par"metros que tenemos disponibles a la hora de llamar a la funcin setcoo:ieKL, que sirve para dar de alta las alletitas en el nave ador del usuario que visita nuestra 3eb.
65
Tu mejor ayuda para aprender a hacer webs www.desarrolloweb.com La function setcookie:; de PHP genera y env$a la cookie al navegador y devuelve un boleano, si es true indica que se pudo incluir en el nave ador del usuario y si es false indica que no ha podido colocarla en el sistema. Pero este valor no indica que lue o el visitante la haya aceptado o no, puesto que el nave ador puede haberlo confi urado para no aceptar coo:ies y esto no lo puede detectar setcoo:ieKL directamente. Por e!emplo, estas seran diferentes llamadas a setcoo:ieKLsetcoo;ie("%i+alleta"E "%i*alor"); setcoo;ie("coo;ie'"E "%i*alor'"E ti%e() M L/11); setcoo;ie("otracoo;ie"E "*alorfinal"E ti%e() M L/11E "/"E ".%ido%inio.co%");
Pero atencin en un asunto- Para enviar una coo:ie al nave ador se debe hacer antes de haber enviado las cabeceras del http al cliente, es decir, antes de haber escrito cualquier te2to en la p" ina. 5i no, P#P podr" lanzar un error de headers already sent Kcabeceras ya enviadasL. +ecuperar cookies con PHP Por otra parte, para recibir las coo:ies que el nave ador del usuario pueda tener creadas en el sistema se utiliza el array asociativo \SC&&U%6. 6n este array est"n todas las coo:ies que tiene disponible la p" ina P#P en el dominio y el directorio donde est" colocado. Por medio del nombre de la coo:ie accedemos a su valor8$&TT]):?"%i+alleta"B; 8$&TT]):?"coo;ie'"B;
Para ver un e!emplo de uso de cookies PHP acceder al taller de P#P 6stilos C55 distintos a una p" ina con P#P y coo:ies o al Rideotutorial sobre las Coo:ies en P#P.
Artculo por
C'C'( <esiones )
@os introducimos al concepto de sesin y aprendemos su manejo y funcionamiento. 6n los pro ramas que hemos visto hasta ahora, hemos utilizado variables que slo e2istan en el archivo que era e!ecutado. Cuando car "bamos otra p" ina distinta, los valores de estas variables se perdan a menos que nos tom"semos la molestia de pasarlos por la I90 o inscribirlos en las coo:ies o en un formulario para su posterior e2plotacin. 6stos mtodos, aunque 7tiles, no son todo lo pr"cticos que podran en determinados casos en los que la variable que queremos conservar ha de ser utilizada en varios scripts diferentes y distantes los unos de los otros. Podramos pensar que ese problema puede quedar resuelto con las coo:ies ya que se trata de variables que pueden ser invocadas en cualquier momento. 6l problema, ya lo hemos dicho, es que las coo:ies no son aceptadas ni por la totalidad de los usuarios ni por la totalidad de los nave adores lo cual implica que una aplicacin que se sirviera de las coo:ies para pasar variables de un archivo a otro no sera '**X infalible. 6s importante a veces pensar en "la inmensa minora", sobre todo en aplicaciones de comercio electrnico donde debemos captar la mayor cantidad de clientes posibles y nuestros scripts deben estar preparados ante cualquier eventual deficiencia del nave ador del cliente. Cos resulta pues necesario el poder declarar ciertas variables que puedan ser reutilizadas tantas veces como queramos dentro de una misma sesin. %ma inemos un sitio multilin de en el que cada vez que queremos imprimir un mensa!e en cualquier p" ina necesitamos saber en qu idioma debe hacerse. Podramos introducir un script identificador de la len ua del nave ador en cada uno de los archivos o bien declarar una variable que fuese valida para toda la sesin y que tuviese como valor el idioma reconocido en un primer momento. Pensemos tambin en un carrito de la compra de una tienda virtual donde el cliente va nave ando por las p" inas del sitio y a;adiendo los artculos que quiere comprar a un carrito. 6ste carrito podra ser perfectamente una variable de tipo array KtablaL que almacena para cada referencia la cantidad de artculos contenidos en el carrito. 6sta variable debera
66
Tu mejor ayuda para aprender a hacer webs www.desarrolloweb.com ser obviamente conservada continuamente a lo lar o de todos los scripts. 6ste tipo de situaciones son solventadas a partir de las variables de sesin. Ina sesin es considerada como el intervalo de tiempo empleado por un usuario en recorrer nuestras p" inas hasta que abandona nuestro sitio o de!a de actuar sobre l durante un tiempo prolon ado o bien, sencillamente, cierra el nave ador. P#P nos permite almacenar variables llamadas de sesin que, una vez definidas, podr"n ser utilizadas durante este lapso de tiempo por cualquiera de los scripts de nuestro sitio. 6stas variables ser"n especificas del usuario de modo que varias variables sesin del mismo tipo con distintos valores pueden estar coe2istiendo para cada una de las sesiones que est"n teniendo lu ar simult"neamente. 6stas sesiones tienen adem"s su propio identificador de sesin que ser" 7nico y especfico. ,l unas me!oras referentes al empleo de sesiones han sido introducidas con P#PG. 6s a esta nueva versin a la que haremos referencia a la hora de e2plicar las funciones disponibles y la forma de operar. Para los pro ramadores de P#P+ la diferencia mayor es que est"n obli ados a estionar ellos mismos las sesiones definir sus propios identificadores de sesin. Reamos en el si uiente captulo la forma de plasmar esta necesidad tcnica en nuestros scripts a partir de las funciones que estionan las sesiones en P#P.
Artculo por
Rubn Alvarez
C'6'( <esiones en H ))
$escribimos los metodos de trabajo con sesiones en PHP , iniciali!ar sesin, crear variables de sesin o recuperarlas. 0as sesiones, en aplicaciones 3eb realizadas con P#P y en el desarrollo de p" inas 3eb en eneral, nos sirven para almacenar informacin que se memorizar" durante toda la visita de un usuario a una p" ina 3eb. /icho de otra forma, un usuario puede ver varias p" inas durante su paso por un sitio 3eb y con sesiones podemos almacenar variables que podremos acceder en cualquiera de esas p" inas. /i amos que las sesiones son una manera de uardar informacin, especfica para cada usuario, durante toda su visita. Cada usuario que entra en un sitio abre una sesin, que es independiente de la sesin de otros usuarios. 6n la sesin de un usuario podemos almacenar todo tipo de datos, como su nombre, productos de un hipottico carrito de la compra, preferencias de visualizacin o traba!o, p" inas por las que ha pasado, etc. 4odas estas informaciones se uardan en lo que denominamos variables de sesin. P#P dispone de un mtodo bastante cmodo de uardar datos en variables de sesin, y de un !ue o de funciones para el traba!o con sesiones y variables de sesin. 0o veremos en este artculo. Para cada usuario P#P internamente enera un identificador de sesin 7nico, que sirve para saber las variables de sesin que pertenecen a cada usuario. Para conservar el identificador de sesin durante toda la visita de un usuario a una p" ina P#P almacena la variable de sesin en una coo:ie, o bien la propa a a travs de la I90. 6sto se puede confi urar desde el archivo php.ini.
67
-ota" 5i en el php.ini se ha definido la variable session.autoSstart V ' se inicializa autom"ticamente la sesin en cada p" ina que visita un usuario, sin que se ten a que hacer el sessionSstartKL
Ina vez inicializada la sesin con sessionSstartKL podemos a partir de ahora utilizar variables de sesin, es decir, almacenar datos para ese usuario, que se conserven durante toda su visita o recuperar datos almacenados en p" inas que haya podido visitar. 0a sesin se tiene que inicializar antes de escribir cualquier te2to en la p" ina. 6sto es importante y de no hacerlo as corremos el ries o de recibir un error, porque al iniciar la sesin se deben leer las coo:ies del usuario, al o que no se puede hacer si ya se han enviado las cabeceras del #44P.
-ota" si se intenta abrir una sesin despus de haber enviado te2to de la p" ina al cliente se obtendr" el si uiente mensa!e>arnin - sessionSstartKL- Cannot send session cache limiter P headers already sent Koutput started at L
Ina vez iniciada la sesin podemos utilizar variables de sesin a travs de \S5655%&C, que es un array asociativo, donde se accede a cada variable a partir de su nombre, de este modo8$S:SS)TA?"no%5re$de$*aria5le"B -ota" \S5655%&C es una variable lobal que e2iste a partir de P#P G.'.*. 0o normal es que podamos acceder a esa variable normalmente, pero si nuestra versin de P#P no est" actualizada podemos intentarlo con \#44PS5655%&CSR,95, que es tambin un array asociativo, aunque no es de "mbito lobal. 5i \#44PS5655%&CSR,95 tampoco funciona tendremos que re istrar cada variable por separado con la funcin sessionSre isterKL, envi"ndo por par"metro los nombres de las variables de sesin que desea utilizar desde P#P.
62isten otras dos confi uraciones del php.ini que afectan al traba!o con variables de sesin, que son trac:Svars y re isterS lobals. Por defecto trac:Svars est" activado y re isterS lobals est" desactivado. 6ste es el caso normal y el que suponemos tendr" el servidor donde pro rames, pero si esas variables cambian podra cambiar al una cosita, como que las variables se ten an que re istrar e2plcitamente con sessionSre isterKL. 6!emplo de cdi o para definir una variable de sesin<? session$start(); ?> <ht%l> <head> <title>@enerar *aria5le de sesiRn</title> </head> <5ody> <? 8$S:SS)TA?"%i*aria5ledesesion"B G "<ola este es el *alor de la *aria5le de sesiRn"; ?> </5ody> </ht%l>
Como se puede ver, es importante inicializar la sesin antes de hacer otra cosa en la p" ina. 0ue o podremos definir variables de sesin en culquier lu ar del cdi o P#P de la p" ina. Para leer una variable de sesin se hace a travs del mismo array asociativo \S5655%&C. 6s tan sencillo como haramos para utilizar cualquier otra variable, lo 7nico es que tenemos que haber inicializado la sesin previamente. = por supuesto, que la variable que deseamos acceder e2ista previamente.
<? session$start(); ?> <ht%l> <head> <title> eo *aria5le se sesiRn</title> </head> <5ody> !"estro esa *aria5le: <?
68
Como se puede ver, al inicio del cdi o hemos inicializado la sesin y lue o en cualquier parte del cdi o podramos acceder a las variables de sesin que tuvisemos creadas.
-ota" si intentamos acceder a una variable de sesin con \S5655%&C que no ha sido creada obtendremos otro mensa!e de error- CoticeIndefined inde2- mivariabledesesion, que es el mismo que si intentamos acceder a cualquier elemento de un array que no e2iste.
(s sobre sesiones en PHP 0a si uiente informacin sobre sesiones de P#P tambin puede ser de 7til lectura. Co obstante lo e2presado hasta aqu es una informacin mucho m"s actualizada. 6n las pr2imas lneas se e2plican mecanismos para sesiones pero todos los que se comentan, aunque son v"lidos, no son actuales por tratarse de e2plicaciones para versiones de P#P m"s anti uas. #emos dicho en el captulo anterior que la variables de sesin se diferencian de las variables cl"sicas en que stas residen en el servidor, son especificas de un solo usuario definido por un identificador y pueden ser utilizadas en la lobalidad de nuestras p" inas. Para iniciar una sesin podemos hacerlo de dos formas distintasP/eclaramos abiertamente la apertura de sesin por medio de la funcin session#start$%. 6sta funcin crea una nueva sesin para un nuevo visitante o bien recupera la que est" siendo llevada a cabo. P/eclaramos una variable de sesin por medio de la funcin session#register$&variable&%. 6sta funcin, adem"s de crear o recuperar la sesin para la p" ina en la que se incluye tambin sirve para introducir una nueva variable de tipo sesin. 0as sesiones han de ser iniciadas al principio de nuestro script. ,ntes de abrir cualquier etiqueta o de imprimir cualquier cosa. 6n caso contrario recibiremos un error. Con lo visto, vamos a proponer el e!emplo cl"sico de utilizacin de una sesin- un contador. 6ste contador deber" aumentar de una unidad cada vez que recar amos la p" ina o apretamos al enlace<? session$re+ister(=contador=); ?> <<T! > <<:A(> <T)T :>contador.php</T)T :> </<:A(> <NT(D> <? )f (isset(8contador)GG1) Q8contadorG1;U MM8contador; echo "<a hrefG"contador.php"><as recar+ado esta p4+ina 8contador *eces</a>"; ?> </NT(D> </<T! >
.jecutar script 0a condicin if tiene en cuenta la posibilidad de que la variable contador no haya sido todava inicializada. 0a funcin isset se encar a de dar un valor cero cuando una variable no ha sido inicializada.
69
Tu mejor ayuda para aprender a hacer webs www.desarrolloweb.com &tras funciones 7tiles para la estin de sesiones son-
Descripcin )os de-uel-e el identi&icador de la sesi*n Da por abandonada la sesi*n eliminando -ariables e identi&icador.
Para aprender m"s sobre las sesiones, concretamente para ver una aplicacin que estiona un carrito de compra por medio de variables sesin visita nuestro articulo del taller de PHP. 5i buscas m"s funciones o informacin adicional sobre las sesiones, consulta el manual oficial de PHP.
Artculo por
Rubn Alvarez
Parte *:
70
Tu mejor ayuda para aprender a hacer webs www.desarrolloweb.com Ina de las principales venta!as que presenta el traba!ar con p" inas din"micas del lado del servidor es el poder traba!ar con contenidos que est"n alo!ados en bases de datos. /e esta forma, podemos or anizarlos, actualizarlos y buscarlos de una manera mucho m"s simple. 6l len ua!e P#P, ya hemos dicho, ofrece interfaces para el acceso a la mayora de las bases de datos e2istentes. Podr"s encontrar bases de datos de cdi o abierto, como My5D0, comerciales porpietarias como &racle y adem"s tiene libreras para acceso a datos por &/8C, lo que nos permite comunicar con todas las bases de datos posibles en sistemas Microsoft, como ,ccess o 5D0 5erver. @racias a los !ue os de funciones e2istentes para cada sistema estor de base de datos, podremos realizar cualquier accin con los datos que necesitemos para el desarrollo de la m"s variada ama de aplicacin 3eb. 6sta interaccin se realiza, por un lado, a partir de las funciones que P#P nos propone para cada tipo de base de datos y, por otro estableciendo un di"lo o a partir de un idioma universal- 5D0 K5tructured Duery 0an ua eL el cual es com7n a todas las bases de datos. 6ste len ua!e resulta, como veremos en el tutorial de %&L, muy potente y f"cil de aprender. , lo lar o del manual de P#P nos limitaremos a la utilizacin las instrucciones 5D0 b"sicas, que ser"n aprendidas a medida que e2plicamos las diferentes formas de actuar sobre una base de datos, de!ando para el tutorial de 5D0 los aspectos m"s avanzados de ese len ua!e de acceso a datos. Como base e!emplo de estos captulos hemos ele ido My5D0, sin duda la base de datos m"s e2tendida en combinacin con P#P. 5u ratuidad, eficiencia y simplicidad la han hecho una buena candidata. Co obstante, en caso de utilizar cualquier otra base compatible con P#P, las correcciones a llevar a cabo con respecto a nuestros e!emplos no son e2cesivamente randes y la lectura de esos captulos se uir" siendo de ran utilidad.
-ota" =a hemos e2plicado en captulos anteriores la instalacin de My5D0, a la vez que hemos presentado los comandos b"sicos que nos pueden permitir abordarla con una relativa facilidad.
6'&'&'( Con#igurar la base de datos !ue vamos a utilizar para los eFemplos de este manual
Ina vez instalado My5D0 y antes de poder comenzar con nuestros e!emplos, ser" necesario llevar a cabo las si uientes operacionesP%ntroducidos dentro de My5D0, crearemos la base de datos e!emplo con la si uiente sentenciacreate data5ase eHe%plo;
PCrearemos a continuacin la tabla clientes a partir de la si uiente sentenciacreate ta5le clientes ( no%5re *archar(-11)E telefono *archar(-11) );
,hora ya disponemos de nuestra tabla vaca. 5lo queda comenzar a llenarla con los datos que iremos insertando. 6l con!unto de scripts utilizados para el bloque de bases de datos puede ser descar ado a u$.
Tu mejor ayuda para aprender a hacer webs www.desarrolloweb.com Para completar todo aquello que debes saber sobre el acceso a bases de datos en P#P encontrar"s multitud de artculos pr"cticos en el 4aller de P#P, como son la 9ecepcin el 7ltimo %/ de una insercin con P#P y My5D0, la Pa inacin de resultados con P#P y My5D0, Pro ramar un buscador con P#P y My5D0, etc. ,dem"s, para los que prefieran verlo todo paso a paso en vivo, contamos con un videotutorial sobre las bases de datos en P#P que te ayudar" a entender me!or cmo traba!ar con las bases de datos en P#P.
Artculo por
Rubn Alvarez
0le ados a la p" ina destino del formulario Kinsertar"phpL, lo primero que habr" que hacer es establecer un vnculo entre el pro rama y la base de datos. 6sta cone2in se lleva a cabo con la funcin mysql#connect. , continuacin, deberemos enerar una orden de insercin del re istro en len ua!e 5D0. 6sta orden ser" e!ecutada por medio de la funcin mysql#db#query. 6n esta funcin especificaremos primeramente la base de datos sobre la que queremos actuar y a continuacin introduciremos la sentencia 5D0<<T! > <<:A(> <T)T :>)nsertar.php</T)T :> </<:A(> <NT(D> <? //&onexion con la 5ase %ys,l$connect("localhost"E"t"$"ser"E"t"$pass6ord"); //selecciRn de la 5ase de datos con la ,"e *a%os a tra5aHar %ys,l$select$d5("%i$5ase$datos"); //:Hec"cion de la sentencia S^ %ys,l$,"ery("insert into clientes (no%5reEtelefono) *al"es (=8no%5re=E=8telefono=)"); ?> <h-><di* ali+nG"center">7e+istro )nsertado</di*></h->
72
.jecutar ejemplo 0os parametros user y pass3ord son definidos por el creador de la base. 6s conveniente en un principio, al crear nuestras bases, traba!ar sin ellos con lo cual de!aremos las cadenas correspondientes vacias- "". ,dem"s de la propia insercin, el pro rama avisa de la introduccin del re istro y ofrece un enlace hacia una p" ina de lectura la cual ser" comentada a continuacin. Co entraremos en la descripcin de la orden 5D0, para comprender m"s acerca de cmo introducir re istros, refererirse al tutorial de %&L.
Artculo por
Rubn Alvarez
73
.jecutar script 0os pasos a realizar son, en un principio, los vistos para la insercin de un re istro- Cone2in a la base y e!ecucin de la sentencia. 6sta vez, la informacin de dicha e!ecucin ser" almacenada en una variable K resultL. 6l si uiente paso ser" plasmar en pantalla la informacin reco ida en \result. 6sto lo haremos mediante la funcin mysql#fetch#array que devuelve una variable array con los contenidos de un re istro a la vez que se posiciona sobre el si uiente. 6l bucle while nos permite leer e imprimir secuencialmente cada uno de los re istros. 0a funcin mysql#free#result se encar a de liberar la memoria utilizada para llevar a cabo la consulta. ,unque no es necesaria su utilizacin, resulta altamente aconse!able.
Artculo por
Rubn Alvarez
74
0a manera de operar para construir el men7 desple able es la misma que para visualizar la tabla. /e nuevo empleamos un bucle while en combinacin con la funcin mysql#fetch#array lo que nos permite mostrar cada una de las opciones. 6l script de actualizacin ser" muy parecido al de insercin-ota" Para quien desee una referencia completa sobre cmo se hacen las sentencias IP/,46 en el len ua!e 5D0, recomendamos leer el artculo ,ctualizacin de re istros con IP/,46 en 5D0. <<T! > <<:A(> <T)T :>Act"aliSar'.php</T)T :> </<:A(> <NT(D> <? //&onexion con la 5ase %ys,l$connect("localhost"E"t"$"ser"E"t"$pass6ord"); //selecciRn de la 5ase de datos con la ,"e *a%os a tra5aHar %ys,l$select$d5("%i$5ase$datos"); //&rea%os la sentencia S^ y la eHec"ta%os 8sS^ G"9pdate &lientes Set telefonoG=8telefono= Yhere no%5reG=8no%5re="; %ys,l$,"ery(8sS^ ); ?> <h-><di* ali+nG"center">7e+istro Act"aliSado</di*></h-> <di* ali+nG"center"><a hrefG"lect"ra.php">>is"aliSar el contenido de la 5ase</a></di*> </NT(D> </<T! >
Como habis podido comprobar, la operacin IP/,46 no tiene demasiada comple!idad. 5in embar o, para afianzar estos conocimientos recomendamos ver el vdeo sobre la actualizacin de re istros en My5D0 con P#P.
Artculo por
Rubn Alvarez
75
WNselectY WbrY W%CPI4 4=P6V"5I8M%4" valueV"8orrar"Y WNM&9MY WNdivY WN8&/=Y WN#4M0Y 6l si uiente paso es hacer efectiva la operacin a partir de la e!ecucin de la sentencia 5D0 que construimos a partir de los datos del formulario<<T! > <<:A(> <T)T :>Norrar'.php</T)T :> </<:A(> <NT(D> <? //&onexion con la 5ase %ys,l$connect("localhost"E"t"$"ser"E"t"$pass6ord"); //selecciRn de la 5ase de datos con la ,"e *a%os a tra5aHar %ys,l$select$d5("%i$5ase$datos");
NNCreamos la sentencia 5D0 y la e!ecutamos \s5D0V"/elete Mrom Clientes >here nombreVb\nombreb"Z mysqlSqueryK\s5D0LZ BY Wh'YWdiv ali nV"center"Y9e istro 8orradoWNdivYWNh'Y Wdiv ali nV"center"YWa hrefV"lectura.php"YRisualizar el contenido de la baseWNaYWNdivY WN8&/=Y WN#4M0Y
-ota" Rarios comentarios pre untan por el archivo lectura.php que est" enlazado en el cdi o del e!emplo. 4enemos que decir que ese archivo se coment en el artculo de la 5eleccin y lectura de re istros de la base de datos por medio de P#P.
Con este captulo cerramos el bloque de accesos a bases de datos con P#P. Para mas informacin relacionada podis referiros al taller de PHP donde podris encontrar al 7n que otro artculo interesante al respecto. ,simismo, para los que prefieran el vdeo como material did"ctico, recomendamos ver el Rideotutorial sobre las bases de datos con P#P.
76
Artculo por
Rubn Alvarez
P#P est" en constante evolucin y prueba de ello son las novedades que venimos a comentar en este artculo. 5e trata de las nuevas funciones de acceso a bases de datos My5D0 que est"n disponibles desde P#P (, con nombres diferentes a las funciones disponibles en el pasado y que tambin tienen al unos cambios en el modo de traba!ar. 0as nuevas funciones est"n creadas para dar respuesta a diversas me!oras que el sistema estor de bases de datos My5D0 ha incorporado recientemente.
6ste es un tema fundamental, sobre todo para las personas que conocen P#P desde hace tiempo, que como yo, est"bamos acostumbrados a usar un !ue o de funciones que a da de hoy se encuentra obsoleto y que no se recomienda utilizar. 9ealmente, en el momento de escribir este artculo las funciones de My5D0 anti uas todava, se pueden usar, pero la previsin es que se eliminen en P#P (.(, por lo que resulta imprescindible actualizar nuestros conocimientos. ,fortunadamente, es bastante sencillo el paso a las nuevas funciones de My5D0, puesto que el esquema de funcionamiento es pr"cticamente el mismo, as como los nuevos nombres de funciones, que tienen muy pocas variaciones. Por lo tanto, si te has ledo el Manual de P#P de /esarrollo>eb.com y has aprendido con nosotros a traba!ar con las bases de datos, no tendr"s realmente muchos problemas en aprender las novedades que paso a relatar a continuacin.
6'A'&'( Dos tipos de #unciones para acceso a las bases de datos M8<BL
Ina de las novedades que P#P nos ofrece en las recientes funciones de P#P es la incorporacin de dos tipos apro2imaciones al traba!o con My5D0, que ahora se puede hacer por procedimientos Kfunciones normales de toda la vidaL y por ob!etos.
-ota" ,ntes slo podamos acceder a My5D0 por funciones comunes, pero ahora tambin podemos acceder por medio de clases y ob!etos de pro ramacin orientada a ob!etos KP&&L. 0a incorporacin en el ,P% de mtodos basados en P&& hace patente que P#P est" teniendo muy presente este paradi ma de desarrollo dentro de su n7cleo y que la tendencia en las nuevas versiones de P#P ser" la de potenciarlo aun m"s.
5unciones basadas en procedimientos" Como venimos haciendo toda la vida con P#P. Munciones normales y corrientes, que reciben par"metros y que devuelven valores. 5unciones basadas en P22- 9ealmente son constructores para obtener ob!etos y mtodos a los que podemos acceder dentro de esos ob!etos para realizar las operaciones con la base de datos. #ay que aclarar que ambas apro2imaciones son perfectamente v"lidas y que no cambian las cosas que se pueden hacer desde una u otra. Por tanto, decantarnos por uno u otro modo no implicar" nin una venta!a en funcionalidad, ni tan siquiera de rendimiento. /e hecho, ambos modos de traba!o son el "mismo perro con distinto collar". Por tanto, es tan v"lida una eleccin como la otra y nuestra preferencia ser" m"s bien por ustos o costumbres a la hora de desarrollar.
-ota" 0o que no se recomienda es en un mismo proyecto cambiar de uno a otro estilo de acceso a base de datos My5D0 de manera arbitraria. /ebemos tener en cuenta que realmente esa recomendacin no es debido a que no te vaya a funcionar tu pro rama, o puedas tener al 7n problema determinado, sino m"s bien es una cuestin de estilo y claridad a la hora de mantener el cdi o de tu proyecto.
77
3one=in con la base de datos" mys li0connect:; ,hora indicamos tambin la base de datos a la que queremos conectarnos. = atencin, porque lo que nos devuelve la funcin no es un link o identificador de la cone2in con la base de datos, sino un ob!eto. Pero aunque no sepas P&&, no te preocupes por este detalle, pues poco nos importa a los desarrolladores, dado que vamos a usar ese ob!eto como si fuera simplemente el identificador de la cone2in, o sea, vamos a usarlo como hacamos anteriormente en P#P.
8conexion G %ys,li$connect("localhost"E ""s"ario"E "cla*e"E "%i$55dd");
3errar la cone=in" mys li0close:; 4enemos que pasarle como par"metro siempre el ob!eto que obtuvimos al iniciar la cone2in.
%ys,li$close(8conexion);
.jecutar una consulta" mys li0 uery:; 6sta funcin es e2actamente i ual, aunque en este caso recibe obli atoriamente como primer par"metro el ob!eto de cone2in a la base de datos que recibimos al conectarnos. 6l se undo par"metro es la sentencia 5D0 que se desea e!ecutar en My5D0.
8res"ltado G %ys,li$,"ery(8conexionE "select K fro% cliente");
&tra aspecto interesante es que nos devuelve un valor que puede ser, o bien un booleano para saber si la consulta se e!ecut con 2ito, como en el caso de un "insert" o "delete", o bien un ob!eto resultado con un con!unto de re istros en el caso de un "select". .=traer un registro del conjunto de resultados" mys li0fetch0array:; 6sta funcin es e2actamente i ual, recibe el con!unto de resultados del que queremos sacar un re istro. /evuelve en este caso un "array", pero est" i ualmente mysqliSfetchSob!ectKL que devolvera un ob!eto.
8fila G %ys,li$fetch$array(8res"ltado);
3ontar el n<mero de filas de un resultado" mys li0num0rows:; 4ambin es e2actamente i ual, simplemente le pasamos el ob!eto con!unto de re istros del que queremos saber el n7mero de filas o re istros que contiene.
8fila G %ys,li$n"%$ro6s(8res"ltado)
6'A','( Conclusin
6n eneral, como est"s pudiendo comprobar, el sistema no vara mucho de lo que ya conoces en el pasado. Cambian nombres de funciones mnimamente y al 7n par"metro suelto aqu y all. Creo que el paso para usar las nuevas funciones My5D0 es tan r"pido que no tiene sentido se uir usando las funciones anti uas y adem"s en breve el cambio ser" obli ado porque los accesos anti uos que hacamos a My5D0 de!ar"n de funcionar.
Artculo por
78
Parte ,:
79
+eferencia"por si al uien no sabe lo que es el M4P, hablamos m"s sobre ello en el manual de Publicar en %nternet, concretamente en el artculo 5ubir los archivos al servidor.
,l conectarnos al servidor con los datos del M4P, que deben ser proporcionados por nuestro proveedor, accederemos a un directorio. 6ste directorio podra ser el de publicacin, aunque eneralmente no es as, sino que suele ser un subdirectorio llamado "#4M0" o "docs" o al o similar, que cuel a del directorio de inicio en nuestra cone2in M4P. Como deca, este directorio puede tener nombres distintos en proveedores distintos, aunque, en cualquier caso, con una simple pre unta a nuestro proveedor resolveremos esa duda. 0os archivos se deben subir al directorio de publicacin, o a cualquier subdirectorio de este. 6n definitiva, los tendremos que alo!ar por ah dentro y para acceder a ellos bastara con escribir el nombre del dominio o I90 de nuestro alo!amiento, se uido del nombre del archivo. 5i tuvisemos un archivo llamado hola.php y nuestro alo!amiento se ha contratado para el dominio 333.midominio.com, deberamos subir ese archivo al directorio de publicacin y accederamos al archivo escribiendohttp-NN333.midominio.comNhola.php 5i creamos subdirectorios dentro del directorio de publicacin podremos acceder a ellos escribiendo el nombre del dominio o I90 de nuestro alo!amiento, se uido del nombre del directorio y el nombre del archivo. Por e!emplo, si creamos un subdirectorio llamado pa inas y tenemos dentro un archivo llamado pa '.php, podramos acceder a l de la si uiente manera. http-NN333.midominio.comNpa inasNpa '.php
+eferencia"hay otro concepto interesante que deberamos conocer lle ados a este punto, que es el "documento por defecto". aste no es m"s que el archivo que se enva al nave ador si en la I90 accedida no se especificaba nin 7n archivo. 5uele llamarse inde2.html o inde2.php Ko inde2.asp si nuestro servidor soporta pro ramacin en ,5PL, aunque puede variar de un proveedor a otro. #ablamos m"s sobre el documento por defecto en nuestro manual de Publicar en %nternet.
Artculo por
Co sera posible salir del directorio de publicacin con una I90 como esta, por mucho que utilicemos el operador .. Kque sirve para acceder al directorio padreL. http-NN333.midominio.comN..NfuncionesSphpNarchivoSinalcanzable.php 5in embar o, colocar al unos contenidos fuera del directorio de publicacin puede ser muy 7til. Por e!emplo, podramos colocar all copias de se uridad de al unos archivos o documentos que simplemente queremos uardar en el servidor para acceder a ellos desde cualquier parte y con nuestro pro rama de M4P.
80
Tu mejor ayuda para aprender a hacer webs www.desarrolloweb.com #ay otra utilidad m"s interesante sobre colocar archivos fuera del directorio de publicacin. 5e trata de que muchas veces utilizamos en nuestros pro ramas trozos de cdi o repetidamente, por e!emplo, para abrir y cerrar bases de datos, para mostrar la cabecera de nuestro portal, para comprobar que un email escrito en un formulario es correcto, etc. 6s muy 7til separar estos trozos de cdi o en un archivo a parte y llamar a este archivo con las funciones P#P includeKL o requireKL. ,s, si un da modificamos la cabecera de nuestro portal, slo lo tendremos que modificar en un archivo, o, si cambia la base de datos que utilizamos slo tendramos que modificar el archivo que hace la cone2in a la base de datos una vez, en lu ar de ir cambi"ndolo en todas las p" inas P#P que abran las bases de datos. 6stos archivos no son p" inas independientes, sino trozos. 5e uramente, si los e!ecutamos por separado no mostraran nin 7n resultado v"lido, incluso podran dar mensa!es de error. Por esta razn merece la pena colocarlos en un lu ar donde nadie pueda tener acceso- fuera del directorio de publicacin. Con P#P si que podremos acceder a ese directorio para incluir esos archivos. 5olamente deberamos utilizar las funciones P#P includeKL o requireKL indicando la ruta para acceder a los archivos. 6n el caso de que ten amos una p" ina llamada hola.php en el directorio de publicacin y un archivo, que se llama abreSbaseSdatos.php, en el directorio funcionesSphp, que est" fuera del directorio de publicacin, si quisiramos acceder Kdesde hola.phpL al archivo que abre la base de datos lo haramos as.
incl"de("../f"nciones$php/a5re$5ase$datos.php")
/esde P#P s que podemos acceder a los archivos que se encuentran fuera del directorio de publicacin. Para ello especificamos la ruta adecuada, en la que utilizamos el operador .. para ba!ar al directorio padre. Cada m"s que decir sobre la colocacin de los archivos- una vez situados en el directorio de publicacin se podr" acceder a ellos con nuestro nave ador y se deberan e!ecutar perfectamente. ,unque cabe se;alar que, tanto P#P como el servidor donde traba!emos, pueden tener confi uraciones distintas y puede que al 7n detalle de la pro ramacin de nuestras p" inas no funcione correctamente. Por e!emplo, nuestro P#P puede declarar o no autom"ticamente las variables que lle an a travs de un formulario. 5i en local si que estaba confi urado para hacer esto y en remoto no, deberamos localizar los lu ares donde reco emos las variables y utilizar las variables de entorno correctas Kmirar artculo sobre Procesar variables de formularios y los comentarios al pie para saber m"s de esta posible fuente de erroresL. ,unque este no es un caso habitual, podemos ponernos en contacto con nuestro proveedor de alo!amiento para ver si pueden ayudarnos confi urando el sistema o indicando los pasos a se uir para solventar en nuestros scripts el asunto.
3omentario" el si uiente script calcula el nivel de directorio de los scripts que queremos incluir en la p" ina actual. // <alla%os el ni*el de directorio en ,"e est4 "5icada la p4+ina -. Se hace "n rec"ento de los caracteres ,"e contiene el no%5re del script act"al. 8&hars G co"nt$chars(83<3$S: VE-); '. :xplora%os la ta5la de los caracteres de*"eltos 5"scando el car4cter (=/= &Rdi+o #Z ) de directorio (carpeta) ,"e de*"el*e Apache. foreach (8&hars as 8&harG>8n&hars)Q if (8&harGG#Z) Q8nG8n&hars;5rea;;U U L. @enera%os "na cadena de n-- *eces con la s"5candena "../" ,"e nos da el ni*el de directorio en ,"e se enc"entra el script. if (8nGG1) 83athStrin+G""; else 83athStrin+Gstr$pad(""E(8n--)KLE"../");
Artculo por
81
6s muy corriente que nuestro proveedor de hostin ofrezca !unto con P#P la base de datos My5D0, as que las notas para subir esa base de datos al servidor de este artculo van encaminadas a ofrecer soluciones para esa base de datos. 0a base de datos My5D0 no se puede subir por M4P, como que se haca con los archivos del cdi o P#P. Para subirla tendremos que utilizar otros mecanismos. Roy a distin uir entre tres casos distintos en los que nos podramos encontrar en este momento'. La base de datos ue pretendemos subir est vac$a. 4an slo hemos creado las tablas, pero no hemos introducido datos en ellas o, a lo sumo, tienen al 7n dato que hemos introducido de pruebas. ). La base de datos ue ueremos subir est completa y es una base de datos (y%&L. 6n este caso tenemos creada la base de datos en local y con toda la informacin dentro y, por supuesto, queremos que esa informacin quede tambin en la base de datos remota. +. 0a base de datos est" completa Kcomo el caso anteriorL, pero no es una base de datos (y%&L. 6n este caso estaramos haciendo una mi racin de la base de datos de un sistema estor a otro. Reremos los tres casos por separado en adelante, aunque, antes de ello, vamos a mostrar unas herramientas que nos servir"n de mucha ayuda para la administracin de cualquier base de datos remota. 0as herramientas en concreto se relatan en el manual 4aller de My5D0, son las si uientes Php(y#dmin. Ina aplicacin creada en P#P que podemos instalar en nuestro espacio de alo!amiento para administrar la base de datos. (ys l 3ontrol 3enter Ken adelante MyCCL. Ina aplicacin >indo3s que permite contectarse a m7ltiples bases de datos My5D0, que se encuentren en local o en remoto. #ccess. 4ambin permite administrar una base de datos My5D0 conectada en local o en remoto. 6n este caso se utiliza una interfaz que muchos ya conocen, como es ,ccess, para administrar una base de datos que nada tiene que ver con dicho pro rama.
6n los tres casos lo que nos permite realizar el soft3are de administracin son tareas sobre la base de datos de todo tipo, como pueden ser crear tablas, modificarlas, insertar datos, borrarlos, editarlos. Modificar o borrar tablas o campos de las mismas, etc. 0a eleccin de una herramieta o de otra pasa por los recursos que nos permitan utilizar en nuestro proveedor. 8"sicamente, lo que nos puede decantar a una opcin u otra, es si permiten o no conectar de manera remota la base de datos My5D0. Conozco alo!amientos donde se permite esa cone2in remota y donde no. 5i no permiten conectarnos remotamente nos decantaremos por PhpMy,dmin, pues es una aplicacin P#P que se conecta en local y a la que se accede desde una p" ina 3eb y eso lo permiten todos los proveedores, incluso hay muchos que tienen instalado ya este soft3are para administrar las bases de datos. 6n caso de que s nos permitan conectarnos remotamente con la base de datos, eli iremos MyCC o ,ccess, que son aplicaciones >indo3s mucho m"s potentes y r"pidas que las que utilizan interfaz 3eb, como PhpMy,dmin. 6s preferible utilizar MyCC porque est" especialmente desarrollado para conectar y operar con bases de datos My5D0.
Artculo por
82
#erramienta de bac:up de PhpMy,dmin. 6st" marcada la opcin de e2traer solamente la estructura de las tablas. 5i marcamos adem"s la casilla "5end", nuestro nave ador se descar ar" el bac:up en un fichero de te2to. 5i no lo pulsamos simplemente se visualizar".
0o que tenemos que hacer en este caso es un bac:up de la estructura de la base de datos, es decir, los "create tables" o sentencias 5D0 para crear las tablas. 5era un montn de sentencias con esta formaI -------------------------------------------------------I I Ta5le str"ct"re for ta5le =co%entario= I &7:AT: TAN : co%entario ( id$co%entario int(2) "nsi+ned ATT A9 id$artic"lo int(#) (:VA9 T =1= ATT A9 co%entario text ATT A9 E a"to$incre%entE E
83
);
Para restaurar estas sentencias tenemos opciones tanto dentro de PhpMy,dmin como de MyCC. 6n ambos casos lo que tenemos que hacer es e!ecutar estas sentencias en el servidor My5D0 remoto. 6n PhpMy,dmin tenemos un campo para introducir sentencias 5D0 y tambin otro campo para seleccionar un archivo de te2to con todas las sentencias 5D0, para e!ecutarlas una detr"s de otra. 6n MyCC tenemos un botn que nos permite abrir una consola donde introducir una o varias sentencias 5D0 y e!ecutarlas. Herramienta de backup y restauracin de Php(y#dmin
9epetimos, esto slo nos servir" para subir la estructura de la base de datos y no los datos que conten a. 5i deseamos subir tambin la informacin de la base de datos entonces debemos utilizar otras estrate ias, relatadas pr2imamente.
Artculo por
3'4'( <ubir una base de datos M8<BL con la estructura 8 los datos
Como transferir una base de datos My-.+ que tenemos en local a nuestro servidor remoto, incluyendo tanto la estructura de las tablas como sus datos. 5i la base de datos que deseamos subir est" llena de informacin y deseamos que se conserve una vez subida la base de datos a remoto, tenemos que realizar un bac:up de la base de datos y restaurarlo en remoto.
84
-ota" 6stas recomendaciones est"n pensadas para subir una base de datos My5D0 que podamos tener en local a una base de datos My5D0 que hayamos contratado en remoto. 5i la base ori en no es My5D0 estaramos hablando de una mi racin de bases de datos, pero esto lo veremos en un artculo m"s adelante.
6n este caso el procedimiento sera muy parecido al de subir una base de datos vaca, relatado anteriormente, con la salvedad de que ahora debemos e2traer no solo la estructura de la base de datos, sino tambin los re istros que contiene. Para ello podemos utilizar mysqldump, se 7n se relata en este artculo, o bien PhpMy,dmin, seleccionando la opcin que indica que el bac:up conten a la estructura y los datos K5tructure and data en versiones en in lsL. 0a estructura y los datos vendr"n en un fichero de te2to con una serie de sentencias 5D0 para crear las tablas y los insert necesarios para introducir cada uno de los datos. Para restaurar la base de datos lo haremos tal como se ha relatado para el caso de que la base de datos estuviera vaca, con la ayuda de una instalacin de PhpMy,dmin en remoto o un MyCC que se conecte a la base de datos contratada en el servidor de %nternet. 5i tenemos problemas para subir el fichero de bac:up de la base de datos es posible que en nuestro proveedor de alo!amiento nos pueda ayudar a subir el fichero y restaurarlo. Como el proveedor dispone de los servidores en sus propias instalaciones, tiene muchas m"s posibilidades que nosotros para traba!ar con las bases de datos, sin temor a que las lentas comunicaciones por %nternet arro!en errores en la restauracin de los datos. 5i nuestro proveedor no puede ayudarnos, se uramente dispon a y nos indique al 7n mecanismo para realizar la tarea sin lu ar a errores. Puede ocurrinos con al 7n proveedor que nos di a que se encar a de todo pero nos e2i!a el pa o de las horas de traba!o del inform"tico que va a restaurar el bac:up de la base de datos. 5i no pone facilidades ni siquiera en esto posiblemente sea me!or ir pidindoles que nos devuelvan el dinero invertido porque su servicio no sera muy bueno.
Artculo por
85
Tu mejor ayuda para aprender a hacer webs www.desarrolloweb.com permiten las cone2iones en remoto con la base de datos. 5i no tenemos disponible una cone2in en remoto con nuestro servidor de bases de datos vamos a tener que cambiar la estrate ia un poco. 0a idea en este 7ltimo caso es instalar My5D0 en local y realizar la mi racin desde ,ccess en local a My5D0 en local y lue o podramos hacer un bac:up de la base de datos local y subirla a remoto, tal y como se ha relatado antes.
,ccediendo a ese enlace podremos ver un formulario donde introducir las caractersticas del fichero de te2to, como el car"cter utilizado como separador de campos, o el terminador de lneas, etc, !unto con el propio archivo con los datos, y PhpMy,dmin se encar ar" de todo el traba!o de incluir esos datos en la tabla.
86
Como se habr" supuesto, es necesario tener creada la tabla en remoto para que podamos introducirle los datos del fichero de te2to.
87
Parte 1-:
88
6n este e!emplo se ha creado la clase Ca!a, indicando como atributos el ancho, alto y lar o de la ca!a, as como el color y el contenido. 5e han creado, para empezar, un par de mtodos, uno para introducir un elemento en la ca!a y otro para mostrar el contenido. 5i nos fi!amos, los atributos se definen declarando unas variables al principio de la clase. 0os mtodos se definen declarando funciones dentro de la clase. 0a variable \this, utilizada dentro de los mtodos la e2plicaremos un poco m"s aba!o.
Con esto hemos creado, o me!or dicho, instanciado, un ob!eto de la clase Ca!a llamado \mica!a.
8%icaHa->introd"ce("al+o"); 8%icaHa->%"estra$contenido();
Con estas dos sentencias estamos introduciendo "al o" en la ca!a y lue o estamos mostrando ese contendido en el te2to de la p" ina. Cos fi!amos que los mtodos de un ob!eto se llaman utilizando el cdi o "PY".
no%5re$del$o5Heto->no%5re$de$%etodo()
Para acceder a los atributos de una clase tambin se accede con el cdi o "PY". /e esta formano%5re$del$o5Heto->no%5re$del$atri5"to
89
Tu mejor ayuda para aprender a hacer webs www.desarrolloweb.com ese mtodo, se vuelca el valor que recibe por par"metro en el atributo contenido. 6n ese caso \thisPYcontenido hace referencia al atributo contenido del ob!eto \mica!a, que es sobre el que se invocaba el mtodo.
Artculo por
&;'*'( Constructores en H
4emos lo que es un constructor y cmo definirlos en programacin orientada a objetos en PHP . 0os constructores son funciones, o mtodos, que se encar an de realizar las tareas de inicializacin de los ob!etos al ser instanciados. 6s decir, cuando se crean los ob!etos a partir de las clases, se llama a un constructor que se encar a de inicializar los atributos del ob!eto y realizar cualquier otra tarea de inicializacin que sea necesaria. Co es obli atorio disponer de un constructor, pero resultan muy 7tiles y su uso es muy habitual. 6n el e!emplo de la ca!a, que coment"bamos en el anterior artculo de pro ramacin orientada a ob!etos en P#P, lo normal sera inicializar las variables como color o las relacionadas con las dimensiones y, adem"s, indicar que el contenido de la ca!a est" vaco. 5i no hay un constructor no se inicializan nin uno de los atributos de los ob!etos. 6l constructor se define dentro de la propia clase, como si fuera otro mtodo. 6l 7nico detalle es que el constructor debe tener el mismo nombre que la clase. ,tentos a P#P, que diferencia entre may7sculas y min7sculas. Para la clase Ca!a definida anteriormente, se podra declarar este constructorf"nction &aHa(8altoG-E8anchoG-E8lar+oG-E8colorG"ne+ro")Q 8this->altoG8alto; 8this->anchoG8ancho; 8this->lar+oG8lar+o; 8this->colorG8color; 8this->contenidoG""; U
6n este constructor recibimos por par"metro todos los atributos que hay que definir en una ca!a. 6s muy 7til definir unos valores por defecto en los par"metros que recibe el constructor, i ualando el par"metro a un valor dentro de la declaracin de par"metros de la funcin constructora, pues as, aunque se llame al constructor sin proporcionar par"metros, se inicializar" con los valores por defecto que se hayan definido. 6s importante se;alar que en los constructores no se tienen por qu recibir todos los valores para inicializar el ob!eto. #ay al unos valores que pueden inicializarse a vaco o a cualquier otro valor fi!o, como en este caso el contenido de la ca!a, que inicialmente hemos supuesto que estar" vaca.
Artculo por
&;','( Herencia en H
Hablaremos de esta peculiar caracter1stica para %acer copias independientes y personali!adas de clases ya construidas, propia de la programacin orientada a objetos. 0a pro ramacin orientada a ob!etos tiene un mecanismo llamado herencia por el que se pueden definir clases a partir de otras clases. 0as clases realizadas a partir de otra clase o me!or dicho, que e2tienden a otra clase, se llaman clases e2tendidas o clases derivadas. 0as clases e2tendidas heredan todos los atributos y mtodos de la clase base. ,dem"s, pueden tener tantos atributos y mtodos nuevos como se desee. Para ampliar el e!emplo que venimos desarrollando, la clase Ca!a, vamos a crear una clase e2tendida llamada
90
Tu mejor ayuda para aprender a hacer webs www.desarrolloweb.com Ca!aStematica. 6sta clase hereda de ca!a, pero adem"s tiene un "tema", que es la descripcin del tipo de cosas que metemos en la ca!a. Con esto podemos tener varias ca!as, cada una con cosas de un tema concreto.
class &aHa$te%atica extends &aHaQ *ar 8te%a;
function defineStemaK\nuevoStemaLe \thisPYtema V \nuevoStemaZ f f 6n esta clase heredamos de Ca!a, con lo que tenemos a nuestra disposicin todos los atributos y mtodos de la clase base. ,dem"s, se ha definido un nuevo atributo, llamado \tema, y un mtodo, llamado defineStemaKL, que recibe el tema con el que se desea etiquetar la ca!a. Podramos utilizar la clase Ca!aStematica de manera similar a como lo hacamos con la clase Ca!a ori inal.
8%icaHa$te%atica G ne6 &aHa$te%atica(); 8%icaHa$te%atica->define$te%a("&a5les y contectores"); 8%icaHa$te%atica->introd"ce("&a5le de red"); 8%icaHa$te%atica->introd"ce("&onector 7X#2"); 8%icaHa$te%atica->%"estra$contenido();
6n este caso, el resultado que se obtiene es parecido al que se obtiene para la clase base. 5in embar o, cuando se muestra el contenido de una ca!a, lo m"s interesante sera que se indicara tambin el tipo de ob!etos que contiene la ca!a tem"tica. Para ello, tenemos que redefinir el mtodo muestraScontenidoKL.
6n este e!emplo hemos codificado de nuevo el mtodo entero para mostrar los datos completos. 6n al unas ocasiones es muy 7til apoyarse en la definicin de un mtodo de la clase base para realizar las acciones de la clase e2tendida. Por e!emplo, para este e!emplo, tenemos que definir un constructor para la clase Ca!aStematica, en el que tambin se inicialice el tema de la ca!a. Como ya e2iste un mtodo constructor en la clase base, no merece la pena reescribir el cdi o de ste, lo me!or es llamar al constructor que haba definido en la clase Ca!a ori inal, con lo que se inicializar"n todos los datos de la clase base, y lue o realizar la inicializacin para los atributos de la propia clase e2tendida. Para llamar a un mtodo de la clase padre dentro del cdi o de un mtodo que estamos redefiniendo, utilizamos una sinta2is como estaf"nction &aHa$te%atica(8altoG-E8anchoG-E8lar+oG-E8colorG"ne+ro"E8te%aG"Sin clasificaciRn")Q parent::&aHa(8altoE8anchoE8lar+oE8color); 8this->te%aG8te%a; U
,qu vemos la redefinicin del constructor, de la clase Ca!a, para la clase Ca!aStematica. 6l constructor hace primero una llamada al constructor de la clase base, a travs de una referencia a "parent". 0ue o inicializa el valor del atributo \tema, que es especfico de la Ca!aStematica. 6n la misma lnea de traba!o, podemos redefinir el mtodo muestraScontenidoKL apoy"ndonos en el que fue declarado en la clase base. 6l cdi o quedara como si uef"nction %"estra$contenido()Q echo "&ontenido de la caHa de <5>" . 8this->te%a . "</5>: ";
91
Parte 11:
92
function etCombreKL e return \thisPYnombreZ f f function ,l oK\pL e \personaPYsetCombreK"/aniel"LZ f ' \persona V ne3 PersonaKLZ ) \personaPYsetCombreK"Pichon ol"LZ + ,l oK\personaLZ G echo \personaPY etCombreKLZ BY
0a variable \cadena pasada como ar umento a la funcin e!emplo, es copiada para su uso local dentro de dicha funcin. 6s lo que se conoce como paso de par"metros por valor. 6l <end 6n ine '.* hace e2actamente esto para todas las funciones, inclusive para las que est"n dentro de una clase, las cuales en ese caso act7an como mtodos<? f"nction Al+o(8persona) Q 8persona->setAo%5re("(aniel"); U ?>E
Rolviendo al e!emplo inicial de la clase persona, el mtodo ,l o recibe una copia Kun clonL del ob!eto Persona. 0a se unda razn viene empare!ada con la primera, siendo consecuencia de esta. Cualquier modificacin del ob!eto Persona que se produzca dentro del mtodo ,l o, solo tendr" alcance local, y no se ver" refle!ado cuando la funcin retorne.
<? Al+o(8persona); echo 8persona->+etAo%5re(); ?>
6n ese caso la modificacin del nombre que hace la funcin ,l o al ob!eto Persona no se ve refle!ada cuando hacemos
93
Tu mejor ayuda para aprender a hacer webs www.desarrolloweb.com echo \personaPY etCombreKL. 6n nuestro bro3ser veremos "Pichon ol". 6ste es solo un e!emplo del porque de la reestructuracin tan importante en el Core de P#P. 6s claro que toda reestructuracin barre con cuestiones de compatibilidad, para anar en otros s:illsZ en este caso claramente estamos anando en performance, al liberarnos del overhead que implica la constante copia de ob!etos que son ar umentos de mtodos y funciones. 6n artculos posteriores trataremos en mayor detalle y profundidad los distintos aspectos que fueron modificados, haciendo una comparativa entre como se lo ran en P#PG y como se lo ran en P#P(. ,dem"s de e2plicar profundamente las diferencias en el modelo de ob!etos nos quedan temas pendientes como &pciones de confi uracin Kphp.iniL, Cone2in a My5D0 KmysqliL, cambios en los mdulos, etc. #echa esta introduccin, estamos en condiciones de definir las distintas situaciones en las que se puede encontrar el desarrollador, y que aspectos !ue an a su favor o en contra se 7n la situacin en la que se encuentre.
&&'&'0'( "e2bie
6n el planteo de esta discusin, podramos decir que es la situacin ideal, o por lo menos la m"s beneficiosa. 5i eres una persona que quiere arrancar en P#P, no lo dudes, P#P( es para ti. 4us aplicaciones ozaran de las nuevas capacidades en &&P, obtendr"s el beneficio de una me!or performance de e!ecucin Kesta comprobado e2perimentalmente que P#P( corre un )(X m"s r"pido que P#PGL y tu cdi o estar" muy bien acondicionado en cuanto a la compatibilidad con el nuevo hi!o que asoma- P#PH. Por cierto, no todo es color de rosas. Ina de los mayores beneficios a la hora de ele ir P#P para traba!ar en nuestro proyecto es la ran cantidad de cdi o que podemos encontrar en %nternet, y utilizarlo para nuestros traba!os. 4enemos una ran probabilidad de que ante al una tarea que se nos plantea, podamos encontrar al 7n script que nos solucione la vida, obviamente adapt"ndolo a nuestras necesidades. ,hora bien, no todo el cdi o que vamos a encontrar es compatible con P#P(. /e hecho la ran mayora todava no se ha adaptado. 6s cierto que con al 7n settin en nuestro php.ini podemos ayudar a darle mayor compatibilidad, pero como contrapartida muchas de estas settin s se eliminaran en P#PH. ADu quedaB #acerlo compatible modificando el cdi o, una tarea que para un desarrollador que se inicia no siempre es sencillo. /e todas formas a no alarmarse, que los randes proyectos KP#PCu:e, P#P88, etc.L ofrecen compatibilidad.
&&'&'4'( 7>perimentado
6n este caso, el optar por quedarse con P#PG o pasar a P#P( depende de nuestra aplicacin. 0as interro antes que el desarrollador se puede plantear podran serP AMi aplicacin usa clases y ob!etosB P AMi motor de 8ase de datos es My5D0B P AItilizo un hostin e2ternoB P AMi aplicacin sufre modificaciones en cuanto a los requerimientos y l ica de ne ociosB Pasemos a discutir venta!as y desventa!as en cada uno de los interro antes-
94
Tu mejor ayuda para aprender a hacer webs www.desarrolloweb.com nomenclaturas hasta estrate ias de implementacin. 5eria un desperdicio no utilizar dicho esfuerzo, sobre todo si nuestra aplicacin hace un uso e2haustivo de clases y ob!etos.
&&'&'3'( TMi aplicacin su#re modi#icaciones en cuanto a los re!uerimientos 8 lgica de negociosS
Cuando las aplicaciones tienen requerimientos de cliente bastante cambiantes, y se emplean recursos para su mantenimiento, o utilizamos una metodolo a de desarrollo incremental Ksoft3are versionadoL, lo ideal es utilizar lo 7ltimo que nos proporciona nuestra plataforma de pro ramacin. @eneralmente lo que se busca es un cambio radual, modular, y sostenido. Por otro lado, si nuestras aplicaciones residen en produccin sin mayores modificaciones Kal 7n proceso batch, al una aplicacin depurada, al 7n al oritmo estableL y estamos conformes con su funcionamiento, quiz"s no sea de nuestro inters mi rar hacia una nueva versin. Cos queda analizar que hay de nuevo en P#PH y que cosas deberamos ir teniendo en cuenta si utilizamos P#PG o P#P(.
Artculo por
,aniel L*pez
95
Tu mejor ayuda para aprender a hacer webs www.desarrolloweb.com navegador para que no le llegue un H00P6C. &B& :?. #ay veces que con P#P queremos enviar un error G*G de p" ina no encontrada, para avisar al nave ador que una p" ina no e2iste. 6s sencillo enviar por las cabeceras del http un error G*G, pero hay que ase urarse que el cdi o de error est bien enviado para no dar informaciones ambi uas a los clientes que se conecten al servidor. 6sto es importante porque el cdi o G*G tambin sirve a los buscadores o motores de b7squeda, para informar que una p" ina no e2iste. 5i damos informaciones ambi uas a los buscadores puede que redunde ne ativamente en la clasificacin de nuestro sitio. 6l problema que queremos comentar ahora es el tpico error "G*G &U". 6sto es una ambi dedad- G*G es p" ina no encontrada y &U quiere decir que todo ha ido bien. Pero si no encontr la p" ina ACmo es que decimos que &UB 6so es al o que se puede evitar enviando el error correctamente en la cabecera del #44P. Para enviar un cdi o de error G*G por las cabeceras del #44P con P#P tenemos que hacer lo si uiente<? header("<TT3/-.1 #1# Aot Vo"nd"); ?>
Con la funcin headerKL de P#P enviamos informacin en la cabeceras del http. 6n este caso hemos enviado una cabecera G*G Cot Mound. ,tencin, porque la funcin headerKL debe invocarse antes de haber escrito nada en la p" ina, osea, antes de haber enviado nin una informacin al nave ador. Pero dependiendo de la confi uracin de nuestro servidor esto puede funcionar o no. 0a me!or manera de saber qu estamos enviando por las cabeceras del http es utilizar un pro rama que nos muestre las cabeceras que se eneran tanto en el cliente como en el servidor. 62isten varios pro ramas que nos podran servir, pero nosotros vamos a recomendar aqu una e2tensin de Mirefo2 que hemos comentado ya en otro artculo- Rer cabeceras #44P con 0ive#ttp#eaders. Reremos que en al unas ocasiones enviando esta cabecera el nave ador recibe un cdi o de error como este#44PN'.2 G*G &U 6so es al o que tenemos que evitar, porque es ambi uo. 0a cabecera deseable sera#44PN'.2 G*G Cot Mound Pues bien, cuando la cabecera que eneramos es #44PN'.2 G*G &U tenemos que hacer lo si uiente para conse uir el deseado #44PN'.2 G*G Cot Mound.
<? header("<TT3/-.1 #1# Aot Vo"nd"); header("Stat"s: #1# Aot Vo"nd"); ?>
Primero le indicamos la cabecera del http como G*G y lue o lanzamos otra cabecera indicando que el estatus que tiene que enviar es "Cot Mound". 6sto debera funcionar en todos los casos. 6s posible que con una sola de las dos cabeceras enviadas nos enve ya el error G*G Cot Mound, depende de la confi uracin de nuestro servidor que necesitemos una u otra. Pero si indicamos las dos en las pruebas que he hecho con varios servidores siempre he recibido el cdi o de error correcto. %nsisto en que lo bueno es que veamos qu cabeceras del #44P estamos enviando con un producto como 0ive#ttp#eaders . ,s podremos estar se uros de qu cabeceras tenemos que enviar y qu cdi o P#P es el correcto en nuestro caso.
96
Porque en al unos servidores P#P si enviamos slo esta cabecera<? header("Stat"s: #1# Aot Vo"nd"); ?>
Cos enva al nave ador el cdi o#44PN'.2 )** &U Por e!emplo, en este caso es todava peor, porque nosotros habamos querido enviar un error G*G y en realidad lo que ha lle ado al nave ador es un )** &U que quiere decir p" ina encontrada y correcta. 6n definitiva, cabe estudiar detalladamente este asunto para ase urarnos que estamos enviando la cabecera correcta y el error G*G es claro.
Artculo por
97
Tu mejor ayuda para aprender a hacer webs www.desarrolloweb.com tienen funciones para tratar con .5&C desde P#P. ? Pa uete @%2- de P.3L 6ste paquete, del repositorio de libreras P#P P6C0, es compatible con P#P G.+.* o superior. 6n versiones superiores a P#P (.) est" disponible por defecto. 6n versiones anteriores del len ua!e se tendra que instalar de manera separada. ? Librer$a @%2-?PHP 6s una librera de funciones que se conoce tambin con el nombre de "5ervicesS.5&C". &ri inariamente escrita por Michal Mi urs:i, en la actualidad se encuentra disponible dentro del frame3or: P#P P6,9http-NNpear.php.netNpac:a eN5ervicesS.5&C ? @%2- Lib en Aend 5ramework 6s una librera de funciones para tratamiento con .5&C que forma parte del frame3or: P#P <end. ? B(L?+P3 para PHP Por medio de una e2tensin para la librera phpP2mlrpc, tambin se puede tratar con notacin de ob!etos .5&C. 0as particularidades de cada sistema son li eramente distintas. Cabe decir que la m"s interesante sera la primera, que forma parte de P6C0, puesto que est" escrita en C y por tanto ser" m"s r"pida de e!ecutarse, al formar parte de los componentes nativos de P#P. Como decimos slo podremos disponer de ella a partir de P#P (.), pero en servidores anti uos tendramos que instalarla aparte, lo que a menudo ser" complicado, o incluso imposible para sitios 3eb en produccin y en un alo!amiento compartido. ,s que, si nuestro servidor P#P no dispone de las funciones .5&C por estar poco actualizado, nos costar" mucho menos esfuerzo y dolores de cabeza utilizar otra librera distinta a la b"sica de P6C0. 6n este caso, por la facilidad de instalacin, se recomendara la utilizacin de la librera que viene en P6,9, que se puede descar ar del propio sitio de P6,9, en la I90 http-NNpear.php.netNpac:a eN5ervicesS.5&C
-ota" #emos publicado en /esarrollo>eb.com en pasados artculos al unas referencias 7tiles para instalar P6,9 y utilizar al unos componentes de este frame3or: P#P.este frame3or: P#P.
62iste un artculo muy interesante, aunque en in ls, que compara las diversas libreras e2istentes para usar .5&C desde P#P, que contiene diversas informaciones tcnicas, requisitos y un an"lisis del desempe;o de cada una. 6n el pr2imo artculo e2plicaremos cmo utilizar las funciones .5&C en P#P por medio de las funciones nativas del len ua!e.
Artculo por
&&'0'( Code)gniter
Code'gniter es un frame"or8 PHP para la creacin rpida de aplicaciones "eb. Presentacin general del frame"or8 y primeras notas para empe!ar a usarlo. Probablemente ya sepamos que un frame3or: es un pro rama para desarrollar otros pro ramas, Code% niter, por tanto, es un pro rama o aplicacin 3eb desarrollada en P#P para la creacin de cualquier tipo de aplicacin 3eb ba!o P#P. 6s un producto de cdi o libre, libre de uso para cualquier aplicacin. Como cualquier otro frame3or:, Codei niter contiene una serie de libreras que sirven para el desarrollo de aplicaciones 3eb y adem"s propone una manera de desarrollarlas que debemos se uir para obtener provecho de la aplicacin. 6sto es, marca una manera especfica de codificar las p" inas 3eb y clasificar sus diferentes scripts, que sirve para que el cdi o est or anizado y sea m"s f"cil de crear y mantener. Code% niter implementa el proceso de desarrollo llamado Model Rie3 Controller KMRCL, que es un est"ndar de pro ramacin de aplicaciones, utilizado tanto para hacer sitios 3eb como pro ramas tradicionales. 6ste sistema tiene sus caractersticas, que veremos en artculos si uientes.
98
Tu mejor ayuda para aprender a hacer webs www.desarrolloweb.com Code% niter no es ma ia, pero contiene muchas ayudas para la creacin de aplicaciones P#P avanzadas, que hacen que el proceso de desarrollo m"s r"pido. , la vez, define una arquitectura de desarrollo que har" que pro ramemos de una manera m"s ordenada y contiene diversas herramientas que ayudan a hacer aplicaciones m"s vers"tiles y se uras. Code% niter y otros frame3or:s P#P pueden ayudarte a dar el salto definitivo como desarrollador P#P, creando aplicaciones 3eb m"s profesionales y con cdi o m"s reutilizable, con la diferencia que Code % niter est" creado para que sea f"cil de instalar en cualquier servidor y de empezar a usar que cualquier otro frame3or:. ,dem"s muchas de sus utilidades y modos de funcionamiento son opcionales, lo que hace que oces de mayor libertad a la hora de desarrollar sitios 3eb.
5acilidad de instalacin- Co es necesario m"s que una cuenta de M4P para subir Code% niter al servidor y su confi uracin se realiza con apenas la edicin de un archivo, donde debemos escribir cosas como el acceso a la base de datos. /urante la confi uracin no necesitaremos acceso a herramientas como la lnea de comandos, que no suelen estar disponibles en todos los alo!amientos. 5le=ibilidad- Code% niter es bastante menos r ido que otros frame3or:s. /efine una manera de traba!ar especfica, pero en muchos de los casos podemos se uirla o no y sus re las de codificacin muchas veces nos las podemos saltar para traba!ar como m"s a usto encontremos. ,l unos mdulos como el uso de plantillas son totalmente opcionales. 6sto ayuda muchas veces tambin a que la curva de aprendiza!e sea m"s sencilla al principio. Ligereza- 6l n7cleo de Code% niter es bastante li ero, lo que permite que el servidor no se sobrecar ue interpretando o e!ecutando randes porciones de cdi o. 0a mayora de los mdulos o clases que ofrece se pueden car ar de manera opcional, slo cuando se van a utilizar realmente. 8ocumentacin tutorializada- 0a documentacin de Code% niter es f"cil de se uir y de asimilar, porque est" escrita en modo de tutorial. 6sto no facilita mucho la referencia r"pida, cuando ya sabemos acerca del frame3or: y queremos consultar sobre una funcin o un mtodo en concreto, pero para iniciarnos sin duda se a radece mucho. 5in duda, lo m"s destacable de Code% niter es su accesibilidad, ya que podemos utilizarlo en la mayor ama de entornos. 6sta es la razn por la que en /esarrollo>eb.com hemos ele ido este frame3or: P#P para comenzar un manual que e2plicar" cmo utilizarlo para desarrollar nuestras propias aplicaciones 3eb. 6n si uientes artculos iremos contando diferentes aspectos de este frame3or: y lo utilizaremos para crear una primera aplicacin 3eb. Para continuar puedes leer el artculo %nstalacin y confi uracin de Code% niter. 4ambin puedes ir al Manual de Codei niter que estamos publicando.
Artculo por
99
/ebido a los avances en nuestro medio tecnol ico, nos encontramos con situaciones que nos amar an la e2istencia, como por e!emplo- cuando nuestras 3ebs se caen, in reso de virus a nuestro PC, spam en nuestros correos, etc.
6l trmino se empez a utilizar en el a;o )*** por 0uis von ,hn, Manuel 8lum y Cicholas .. #opper de la Carne ie Mellon Iniversity, y .ohn 0an ford de %8M. .l sistema 3aptcha tiene las siguientes caracter$sticas por definicin" 5on completamente automatizados, es decir, no es necesario nin 7n tipo de mantenimiento ni de intervencin humana para su realizacin. 6sto supone randes beneficios en cuanto a fiabilidad y coste. 6l algoritmo utilizado es p7blico. /e esta forma, la ruptura de un captcha pasa a ser un problema de inteligencia artificial y no la ruptura de un al oritmo secreto. Pues habiendo visto un poco lo que es captcha C3ompletely #utomated Public ' uring test to tell 3omputers and Humans #part :Prueba de 'uring p<blica y automtica para diferenciar a m uinas y humanos; . 6n este escenario, podramos encontrarnos con dos situaciones bien diferentes 4ener un sitio montado y tener que prote erlo. Pro ramar un sitio desde cero.
6scape de las entradas. Para muchos la manera ideal de prote er un site. Como ya hemos visto en al uno de los casos, no nos es 7til. 0os m"s habituales son el uso de addslashesKL N stripslashesKL htmlentitiesK\strin , 6C4SDI&465L htmlspecialcharsKL mysqlSrealSstrin KL
4eniendo activadas las magic0 uotes0gpc en nuestro phpDiniE ue nos pondr por defecto un slash en todos los strings :evitando los tediosos "addslashes:;";. 6n todo caso, el uso de dichos elementos nos podr" salvar de muchos de los ataques. 6vitar, salvo en casos necesarios, que los formularios P&54 se llamen desde otro dominio que no sea el del propio servidor. 6n este caso, nos evitaremos que un atacante avezado utilice un script a tal efecto para ir bloqueando nuestro servidor y llen"ndolo de datos in7tiles. Ramos a ver, F u! clase de configuracin ser$a la ptima para ue un sistema PHP fuera ms seguro contra todo tipo de ata uesG 6stas directivas seran2penbase0dir 6sta directiva bien confi urada evitar" los ataques "trasversal directories", debido a que limita e!ecucin de ficheros al entorno que esco!amos. #llow0furl0open off 6s importante que esta directiva est en &MM para evitar "9emote Mile %nclusion", ya que la inhabilitacin de esta directiva no permitir" a la aplicacin hacer include remotos. +egister0globals off Como ya hemos e2plicado, quiz" la m"s malfica Ky obsoletaL forma de que nuestros atacantes desplie uen todo su
100
Tu mejor ayuda para aprender a hacer webs www.desarrolloweb.com potencial es mediante esta directiva activada. 6s decir, cualquier par"metro que nos ven a por P2%' o 1.' puede ser una variable potencialmente peli rosa en nuestro aplicativo. ,s, cualquier par"metro e2terno se tratar" de forma cuidada con /01.'HIparamIJE /0P2%'HIparamIJE /05*L.%HIparamIJ para establecer qu tipo de variables son e2ternas y cu"les no. Co se recomienda, a no ser que se ten a muy claro qu se est" haciendo, el uso de /0+.&6.%', pues ah puede entrar bcualquier cosab que nos ven a e2ternamente, y f"cilmente podran introducirnos valores no esperados. %afe0mode on 6sta directiva activada evitar" la e!ecucin de al unos comandos potencialmente da;inos en nuestro sistema, adem"s del chequeo de ciertas funciones que puedan considerarse delicadas. Ina lista de dichas funciones puede encontrarse aquphp.netNmanualNenNfeatures.safePmode.functions.php 6special atencin merecen tambin las directivas gsafeSmode[h que componen la familia. safe modesafeSmodeS id safeSmodeSincludeSdir safeSmodeSe2ecSdir safeSmodeSallo3edSenvSvars safeSmodeSprotectedSenvSvars
Por 7ltimo, unas funciones que, se 7n la casustica de nuestro aplicativo pudiera evitarnos al 7n susto por la e!ecucin de comandos sensibles que no queremos Ky no debemosL utilizar disableSfunctions Wlista de funcionesY disableSclasses Wlista de clasesY
6scaneo de puertos Ina manera de evitar ataques a todo sistema operativo, ya sea mediante 3eb o mediante cualquier otro tipo de vulnerabilidad, sera mediante la e!ecucin de cdi o remoto o inyeccin de cdi o no deseado en servicios que puedan tener relacin con nuestro sistema. Para ello se recomienda e!ecutar un escaneo de puertos de nuestra m"quina Kno 7nicamente puerto Q*Phttp o GG+P550L para averi uar las posibles vulnerabilidades o e(ploits que puedan afectar a nuestro sistema y servidor 3eb0os m"s conocidos son nmap y nessus. 6l funcionamiento de nmap puede lle ar a ser sencillo, aunque tiene un desplie ue de opciones que, a buen se uro, mucha ente encontrar" interesante. Ina e!ecucin de este pro rama puede dar lu ar a un resultado como este%tarting -map KDLM : http">>insecureDorg ; at NOOPOQOM RN"OL 3.%' *nteresting ports on RSNDRQPDRDR" -ot shown" RTRR closed ports P2+' %'#'. %.+)*3. NR>tcp open ftp NM>tcp open telnet PO>tcp open http (#3 #ddress" OO"ON"35"PR"Q5"PS :Ay1ate 3ommunications; -essusE en cambio, nos ofrecer" una herramienta clienteNservidor que utilizar" una base de datos con las vulnerabilidades que estadsticamente han podido ocasionar gdesastresh y nos avisa mediante este escaneo. 0a interfaz, adem"s, es bastante m"s ami able y nos mostrar" unas estadsticas de los procesos e!ecutados.
101
M"s en consonancia con el ob!etivo de este artculo, est"n los escaneos de vulnerabilidades propiamente 3eb. 6stos escaneos se pueden basar en varias premisas, empleando sistemas de conocimiento, funciones heursticas e incluso tcnicas fu!!, que veremos m"s adelante. Ina buena combinacin de estos elementos puede darnos muchas pistas a la hora de prote er nuestro site y lle ar donde nosotros no alcanzamos. 6mpecemos por los escaneadores autom"ticos m"s empleados y populares.
&&'4'*'( Acuneti>
,cuneti2, que oza de una versin 5ree .dition :slo para H'(L *njection;, pero con una ran variante de sistemas de inyeccin, una base de datos amplia y una interfaz muy ami able. 0os procesos por los que puede gatacarseh pueden ser varios y los perfiles de ataque i si se tiene la versin de pa o i de los m"s variopintos, muchos de ellos ya los hemos visto aqu.
&&'4'4'( H )D<
P#PP%/5 es un sistema basado en P#P que act7a como %/5 K%ntrusion /etect 5ystemL y que se aplica a todos nuestros archivos buscando al 7n tipo de inyeccin o vulnerabilidad. Puede detectar desde J55, 5D0 %n!ection, 9M% y ataques 0/,P %n!ection y tiene incluso hasta mdulos especializados para distintos tipos de CM5.
102
&&'4'C'( Conclusin
Co es un caso trivial tener que prote er un site 3eb, tanto si ya est" hecho como si lo tenemos que desarrollar de nuevo. 0a 7nica forma de obstaculizar el e!ercicio de estos atacantes ser" conocer cu"les son sus tcnicas, mantenerse actualizado re ularmente de las vulnerabilidades de nuestro entorno :%istema 2perativoE LenguajeE base de datos y mdulos y librer$as asociados;E en caso de ser un programa conocido :como un ,ordPressE @oomlaUE Post-uke; mantenerse alerta a los bugs que, altruistamente, al unos atacantes publican en 3ebs. ,dem"s, con un sistema *8% que nos pueda ir comunicando qu pasa con nuestros logs, la evolucin de estos mismos y la constante evaluacin de las vulnerabilidades de nuestro sistema, !unto con un escaneo autom"tico, t!cnicas fuzz y una pro ramacin slida, y al 7n mdulo destinado a la se uridad har"n de nuestro servidor 3eb una fortaleza KcasiL ine2pu nable.
Artculo por
-rian .ern/n#ez
103