<?xml version="1.0" encoding="iso-8859-1" ?>
<rss version="0.92">
<channel>
	<title>colombia</title>
	<link>http://colombia.100foros.com//</link>
	<description>COLOMBIA</description>
	<managingEditor>jegt1234567890@yahoo.es</managingEditor>
	<webMaster>jegt1234567890@yahoo.es</webMaster>
	<lastBuildDate>Mon, 06 Oct 2008 20:07:31 GMT</lastBuildDate>
<item>
	<title>Off Topic :: me presento</title>
	<link>http://colombia.100foros.com/viewtopic.php?p=138#138</link>
	<description>Autor: &lt;a href=&quot;http://colombia.100foros.com//profile.php?mode=viewprofile&amp;u=8&quot; target=&quot;_blank&quot;&gt;Juancho&lt;/a&gt;&lt;br /&gt;
Asunto: me presento&lt;br /&gt;
Publicado: Dom Ago 24, 2008 8:20 am (GMT 0)&lt;br /&gt;
Tema Respuestas: 0&lt;br /&gt;&lt;br /&gt;
&lt;span class="postbody"&gt;Hola soyu Juancho y veo que el foro es nuevo pero esta interesante &lt;img src=&quot;http://colombia.100foros.com//images/smiles/icon_biggrin.gif&quot; alt=&quot;Very Happy&quot; border=&quot;0&quot; /&gt;  &lt;img src=&quot;http://colombia.100foros.com//images/smiles/icon_biggrin.gif&quot; alt=&quot;Very Happy&quot; border=&quot;0&quot; /&gt; 
&lt;br /&gt;

&lt;br /&gt;
seguire aqui mirando de vez en cuando
&lt;/span&gt;&lt;br /&gt;
</description>
</item>
<item>
	<title>Software :: Transformers (pelicula)</title>
	<link>http://colombia.100foros.com/viewtopic.php?p=137#137</link>
	<description>Autor: &lt;a href=&quot;http://colombia.100foros.com//profile.php?mode=viewprofile&amp;u=2&quot; target=&quot;_blank&quot;&gt;p1p3&lt;/a&gt;&lt;br /&gt;
Asunto: Transformers (pelicula)&lt;br /&gt;
Publicado: Dom Ago 05, 2007 2:05 am (GMT 0)&lt;br /&gt;
Tema Respuestas: 0&lt;br /&gt;&lt;br /&gt;
&lt;span class="postbody"&gt;&lt;img src=&quot;http://www.topetorrent.com/subidas/2/img/transformers_dvdscreener.%5Bwww.TopeTorrent.com%5D.topetorrent.jpg&quot; border=&quot;0&quot; /&gt;
&lt;br /&gt;

&lt;br /&gt;
Tamaño : 800 MB
&lt;br /&gt;
Comparte : ToPeTorrent
&lt;br /&gt;
Fecha : 27-07-2007
&lt;br /&gt;
Clicks : 1496
&lt;br /&gt;
Descargas : 850
&lt;br /&gt;
Idioma : Español
&lt;br /&gt;
Descripción:
&lt;br /&gt;

&lt;br /&gt;

&lt;br /&gt;
Reparto: Josh Duhamel, Kevin Dunn, Zack Ward, Michael Clarke Duncan, Megan Fox, Jon Voight, Shia Labeouf, Bernie Mac, Rachel Taylor, Trevis Van Winkle
&lt;br /&gt;
Director: Michael Bay
&lt;br /&gt;
Productor: Ian Bryce, Tom DeSanto, Alex Kurtzman, Roberto Orci, Lorenzo Bonaventura
&lt;br /&gt;
Estreno: miércoles 4 julio 2007
&lt;br /&gt;
Género: Acción
&lt;br /&gt;
País: EE.UU.
&lt;br /&gt;
Distribuidora: United International Pictures
&lt;br /&gt;
&lt;/span&gt;&lt;table width=&quot;90%&quot; cellspacing=&quot;1&quot; cellpadding=&quot;3&quot; border=&quot;0&quot; align=&quot;center&quot;&gt;&lt;tr&gt; 	  &lt;td&gt;&lt;span class=&quot;genmed&quot;&gt;&lt;b&gt;Cita:&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;	&lt;/tr&gt;	&lt;tr&gt;	  &lt;td class=&quot;quote&quot;&gt;
&lt;br /&gt;
&quot;TRANSFORMERS&quot; SINOPSIS
&lt;br /&gt;

&lt;br /&gt;
Producida por Steven Spielberg, y basada en una de las marcas de juguetes más populares jamás creadas, esta película de acción real narra la apasionante saga de los Transformers - unos gigantescos seres androides (robots con sentimientos) venidos de un lejano planeta que deben ocultar su identidad como coches, aviones y varios tipos de artefactos electrónicos de nuestro mundo mientras libran una épica batalla para salvar a la Humanidad. El director Michael Bay toma el mundo de los Transformers y lo rediseña hasta convertirlo en un super espectáculo de&lt;/td&gt;	&lt;/tr&gt;&lt;/table&gt;&lt;span class=&quot;postbody&quot;&gt;
&lt;br /&gt;

&lt;br /&gt;
&lt;a rel=&quot;nofollow&quot; href=&quot;http://www.topetorrent.com/descargas/estrenos_de_cartelera/des-transformers_dvdscreener.html&quot; target=&quot;_blank&quot; class=&quot;postlink&quot;&gt;DESCARGA AQUI&lt;/a&gt;
&lt;br /&gt;_________________&lt;br /&gt;&lt;img src=&quot;http://www.fotozone.es/foto/31,2007/fotozone_115880.jpg&quot; border=&quot;0&quot; /&gt;&lt;/span&gt;&lt;br /&gt;
</description>
</item>
<item>
	<title>Software :: SURFS UP (pelicula)</title>
	<link>http://colombia.100foros.com/viewtopic.php?p=136#136</link>
	<description>Autor: &lt;a href=&quot;http://colombia.100foros.com//profile.php?mode=viewprofile&amp;u=2&quot; target=&quot;_blank&quot;&gt;p1p3&lt;/a&gt;&lt;br /&gt;
Asunto: SURFS UP (pelicula)&lt;br /&gt;
Publicado: Dom Ago 05, 2007 1:59 am (GMT 0)&lt;br /&gt;
Tema Respuestas: 0&lt;br /&gt;&lt;br /&gt;
&lt;span class="postbody"&gt;&lt;img src=&quot;http://www.topetorrent.com/subidas/2/img/surfs_up_dvdscreener_latino.%5Bwww.TopeTorrent.com%5D.topetorrent.jpg&quot; border=&quot;0&quot; /&gt;
&lt;br /&gt;

&lt;br /&gt;
Tamaño : 700 MB
&lt;br /&gt;
Comparte : ToPeTorrent
&lt;br /&gt;
Fecha : 28-07-2007
&lt;br /&gt;
Clicks : 579
&lt;br /&gt;
Descargas : 335
&lt;br /&gt;
Idioma : Español Latino
&lt;br /&gt;
Descripción:
&lt;br /&gt;

&lt;br /&gt;

&lt;br /&gt;
&lt;/span&gt;&lt;table width=&quot;90%&quot; cellspacing=&quot;1&quot; cellpadding=&quot;3&quot; border=&quot;0&quot; align=&quot;center&quot;&gt;&lt;tr&gt; 	  &lt;td&gt;&lt;span class=&quot;genmed&quot;&gt;&lt;b&gt;Cita:&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;	&lt;/tr&gt;	&lt;tr&gt;	  &lt;td class=&quot;quote&quot;&gt;Ver fotos
&lt;br /&gt;
	Dirección: Ash Brannon y Chris Buck.
&lt;br /&gt;
País: USA.
&lt;br /&gt;
Año: 2007.
&lt;br /&gt;
Género: Animación, comedia.
&lt;br /&gt;
Doblaje original: Shia LaBeouf (Cody Maverick), Zooey Deschanel (Lani Aliikai), Jeff Bridges (The Geek), Jon Heder, James Woods (Reggie Belafonte), Mario Cantone (Mikey Abromowitz), Diedrich Bader (Tank), Jane Krakowski.
&lt;br /&gt;
Guión: Lisa Addario, Christian Darren, Don Rhymer y Joe Syracuse.
&lt;br /&gt;
Producción: Chris Jenkins.
&lt;br /&gt;
Música: Mychael Danna.
&lt;br /&gt;
Fotografía: Andres Martinez.
&lt;br /&gt;
Montaje: Ivan Bilancio.
&lt;br /&gt;
Diseño de producción: Paul Lasaine.
&lt;br /&gt;

&lt;br /&gt;
SINOPSIS
&lt;br /&gt;

&lt;br /&gt;
Esta historia de animación se basa en el surf como una práctica inventada originalmente por los pingüinos. La película transporta al público hasta los más espectaculares, peligrosos y competitivos escenarios del surf mientras se disputa la Copa Mundial de Surf de Pingüinos.&lt;/td&gt;	&lt;/tr&gt;&lt;/table&gt;&lt;span class=&quot;postbody&quot;&gt;
&lt;br /&gt;

&lt;br /&gt;
&lt;a rel=&quot;nofollow&quot; href=&quot;http://www.topetorrent.com/descargas/estrenos_de_cartelera/des-surfs_up_dvdscreener_latino.html&quot; target=&quot;_blank&quot; class=&quot;postlink&quot;&gt;DESCARGA AQUI&lt;/a&gt;
&lt;br /&gt;_________________&lt;br /&gt;&lt;img src=&quot;http://www.fotozone.es/foto/31,2007/fotozone_115880.jpg&quot; border=&quot;0&quot; /&gt;&lt;/span&gt;&lt;br /&gt;
</description>
</item>
<item>
	<title>Software :: PIRATAS DEL CARIBE (pelicula)</title>
	<link>http://colombia.100foros.com/viewtopic.php?p=135#135</link>
	<description>Autor: &lt;a href=&quot;http://colombia.100foros.com//profile.php?mode=viewprofile&amp;u=2&quot; target=&quot;_blank&quot;&gt;p1p3&lt;/a&gt;&lt;br /&gt;
Asunto: PIRATAS DEL CARIBE (pelicula)&lt;br /&gt;
Publicado: Dom Ago 05, 2007 1:51 am (GMT 0)&lt;br /&gt;
Tema Respuestas: 0&lt;br /&gt;&lt;br /&gt;
&lt;span class="postbody"&gt;&lt;img src=&quot;http://www.topetorrent.com/subidas/2/img/piratas_del_caribe_1__la_maldicion_de_la_perla_negra.%5Bwww.TopeTorrent.com%5D.topetorrent.jpg&quot; border=&quot;0&quot; /&gt;
&lt;br /&gt;

&lt;br /&gt;
amaño : 1400 MB
&lt;br /&gt;
Comparte : ToPeTorrent
&lt;br /&gt;
Fecha : 30-07-2007
&lt;br /&gt;
Clicks : 131
&lt;br /&gt;
Descargas : 69
&lt;br /&gt;
Idioma : Español
&lt;br /&gt;
Descripción:
&lt;br /&gt;
&lt;/span&gt;&lt;table width=&quot;90%&quot; cellspacing=&quot;1&quot; cellpadding=&quot;3&quot; border=&quot;0&quot; align=&quot;center&quot;&gt;&lt;tr&gt; 	  &lt;td&gt;&lt;span class=&quot;genmed&quot;&gt;&lt;b&gt;Cita:&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;	&lt;/tr&gt;	&lt;tr&gt;	  &lt;td class=&quot;quote&quot;&gt;
&lt;br /&gt;
Del productor Jerry Bruckheimer (Pearl Harbor) y el director Gore Verbinski (The Ring) llega la trepidante aventura en alta mar PIRATAS DEL CARIBE: LA MALDICIÓN DE LA PERLA NEGRA. La idílica vida del pícaro pero irresistible Capitán Jack Sparrow (Johnny Depp) da un vuelco cuando su enemigo, el capitán Barbossa (Geofrey Rush), le roba su barco, la Perla Negra y ataca la ciudad de Port Royal secuestrando a Elizabeth Swann (Keira Knightley) la hermosa hija del Gobernador. Will Turner (Orlando Bloom), el amigo de la infancia de Elizabeth decide unirse a Jack, en un acto de galantería para rescatar a la chica y de paso recuperar la Perla Negra. Lo que Will no sabe es que la maldición de un tesoro ha condenado a Barbossa y a su tripulación a convertirse eternamente en esqueletos vivientes. Will debe descubrir la clave que rompa con el maleficio para recuperar el magnífico tesoro. Una aventura llena de suspense y acción, repleta de combates con espada, misterio, humor y espectaculares efectos especiales que hacen de &quot;Piratas del Caribe&quot; una de las mejores películas de los últimos tiempos y que toda la familia disfrutará. &lt;/td&gt;	&lt;/tr&gt;&lt;/table&gt;&lt;span class=&quot;postbody&quot;&gt;
&lt;br /&gt;

&lt;br /&gt;
&lt;a rel=&quot;nofollow&quot; href=&quot;http://www.topetorrent.com/descargas/dvdrip/des-piratas_del_caribe_1__la_maldicion_de_la_perla_negra.html&quot; target=&quot;_blank&quot; class=&quot;postlink&quot;&gt;DESCARGA AQUI &lt;/a&gt;
&lt;br /&gt;_________________&lt;br /&gt;&lt;img src=&quot;http://www.fotozone.es/foto/31,2007/fotozone_115880.jpg&quot; border=&quot;0&quot; /&gt;&lt;/span&gt;&lt;br /&gt;
</description>
</item>
<item>
	<title>Software :: LA ULTIMA OPORTUNIDAD (pelicula)</title>
	<link>http://colombia.100foros.com/viewtopic.php?p=134#134</link>
	<description>Autor: &lt;a href=&quot;http://colombia.100foros.com//profile.php?mode=viewprofile&amp;u=2&quot; target=&quot;_blank&quot;&gt;p1p3&lt;/a&gt;&lt;br /&gt;
Asunto: LA ULTIMA OPORTUNIDAD (pelicula)&lt;br /&gt;
Publicado: Dom Ago 05, 2007 1:31 am (GMT 0)&lt;br /&gt;
Tema Respuestas: 0&lt;br /&gt;&lt;br /&gt;
&lt;span class="postbody"&gt;&lt;img src=&quot;http://www.topetorrent.com/subidas/2/img/la_ultima_oportunidad.%5Bwww.TopeTorrent.com%5D.topetorrent.jpg&quot; border=&quot;0&quot; /&gt;
&lt;br /&gt;

&lt;br /&gt;
Tamaño : 700 MB
&lt;br /&gt;
Comparte : Torrent
&lt;br /&gt;
Fecha : 02-08-2007
&lt;br /&gt;
Clicks : 392
&lt;br /&gt;
Descargas : 187
&lt;br /&gt;
Idioma : Español
&lt;br /&gt;
Descripción:
&lt;br /&gt;

&lt;br /&gt;
&lt;/span&gt;&lt;table width=&quot;90%&quot; cellspacing=&quot;1&quot; cellpadding=&quot;3&quot; border=&quot;0&quot; align=&quot;center&quot;&gt;&lt;tr&gt; 	  &lt;td&gt;&lt;span class=&quot;genmed&quot;&gt;&lt;b&gt;Cita:&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;	&lt;/tr&gt;	&lt;tr&gt;	  &lt;td class=&quot;quote&quot;&gt;En el despiadado mundo del comercio en la ciudad de Nueva York, Ted Riker (Michael Keaton) es el rey indiscutible. Es duro, escéptico y despiadado; justo lo contrario de Jamie (Brendan Fraser), su ingenuo nuevo compañero del Medio Oeste. Mientras Jamie fracasa una y otra vez, para intentar hacerse amigo de Ted le presenta a su bella prometida, Belisa (Amber Valletta, Hitch). Ella despierta algo en Ted, algo que pensaba que había perdido mucho tiempo atrás. Pero si quiere hacer caso a su recién recuperado corazón, va a tener que romperle a Jamie el suyo. Y con su compañero novato cada vez más alterado, aquélla puede ser una idea muy peligrosa. Una película cruda, de ritmo rápido y humor negro, LA ULTIMA OPORTUNIDAD reúne a un reparto excepcional en una historia de negocios que se vuelven demasiado personales.&lt;/td&gt;	&lt;/tr&gt;&lt;/table&gt;&lt;span class=&quot;postbody&quot;&gt;
&lt;br /&gt;

&lt;br /&gt;

&lt;br /&gt;
&lt;a rel=&quot;nofollow&quot; href=&quot;http://www.topetorrent.com/descargas/dvdrip/des-la_ultima_oportunidad.html&quot; target=&quot;_blank&quot; class=&quot;postlink&quot;&gt;descarga AQUI&lt;/a&gt;
&lt;br /&gt;_________________&lt;br /&gt;&lt;img src=&quot;http://www.fotozone.es/foto/31,2007/fotozone_115880.jpg&quot; border=&quot;0&quot; /&gt;&lt;/span&gt;&lt;br /&gt;
</description>
</item>
<item>
	<title>Software :: LOS SIMPSONS (pelicula)</title>
	<link>http://colombia.100foros.com/viewtopic.php?p=133#133</link>
	<description>Autor: &lt;a href=&quot;http://colombia.100foros.com//profile.php?mode=viewprofile&amp;u=2&quot; target=&quot;_blank&quot;&gt;p1p3&lt;/a&gt;&lt;br /&gt;
Asunto: LOS SIMPSONS (pelicula)&lt;br /&gt;
Publicado: Dom Ago 05, 2007 1:29 am (GMT 0)&lt;br /&gt;
Tema Respuestas: 0&lt;br /&gt;&lt;br /&gt;
&lt;span class="postbody"&gt;&lt;img src=&quot;http://www.topetorrent.com/subidas/3/img/los_simpsons__la_pelicula_tsscreener_spanish.%5Bwww.TopeTorrent.com%5D.topetorrent.jpg&quot; border=&quot;0&quot; /&gt;
&lt;br /&gt;

&lt;br /&gt;
Tamaño : 700 MB
&lt;br /&gt;
Comparte : ToPeTorrent
&lt;br /&gt;
Fecha : 30-07-2007
&lt;br /&gt;
Clicks : 1820
&lt;br /&gt;
Descargas : 1083
&lt;br /&gt;
Idioma : Español
&lt;br /&gt;
Descripción:
&lt;br /&gt;
&lt;/span&gt;&lt;table width=&quot;90%&quot; cellspacing=&quot;1&quot; cellpadding=&quot;3&quot; border=&quot;0&quot; align=&quot;center&quot;&gt;&lt;tr&gt; 	  &lt;td&gt;&lt;span class=&quot;genmed&quot;&gt;&lt;b&gt;Cita:&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;	&lt;/tr&gt;	&lt;tr&gt;	  &lt;td class=&quot;quote&quot;&gt;
&lt;br /&gt;
Dirección: David Silverman.
&lt;br /&gt;
País: USA.
&lt;br /&gt;
Año: 2007.
&lt;br /&gt;
Duración: 87 min.
&lt;br /&gt;
Género: Animación, comedia.
&lt;br /&gt;
Doblaje original: Dan Castellaneta (Homer Simpson), Julie Kavner (Marge Simpson), Nancy Cartwright (Bart Simpson), Yeardley Smith (Lisa Simpson), Harry Shearer (Sr. Burns), Hank Azaria (Moe), Marcia Wallace (Edna).
&lt;br /&gt;
Guión: James L. Brooks, Matt Groening, Mike Reiss, George Meyer, Ian Maxtone-Graham, John Swartzwelder, Matt Selman, David Mirkin, Al Jean, Mike Scully y Jon Vitti; basado en los personajes creados por Matt Groening.
&lt;br /&gt;
Producción: James L. Brooks, Matt Groening, Al Jean, Richard Sakai y Mike Scully.
&lt;br /&gt;
Música: Hans Zimmer.
&lt;br /&gt;
Dirección artística: Dima Malanitchev.
&lt;br /&gt;
Estreno en USA: 27 Julio 2007.
&lt;br /&gt;
Estreno en España: 26 Julio 2007. 
&lt;br /&gt;

&lt;br /&gt;
SINOPSIS
&lt;br /&gt;

&lt;br /&gt;
Homer debe salvar al mundo de una catástrofe que él mismo ha provocado. Todo comienza con Homer, su nueva mascota, un cerdo, y un silo lleno de excrementos que tiene una fuga, una combinación que desencadena un desastre distinto a todo lo que Springfield haya experimentado jamás. Mientras Marge está indignada por la monumental metedura de pata de Homer, una turba vengativa cae sobre el hogar de los Simpson. La familia se escapa por los pelos pero no tarda en quedar dividida por el conflicto, además de separada físicamente. A la ciudadanía de Springfield le sobran motivos para pedir la cabeza de Simpson. La calamidad provocada por Homer ha llamado la atención del presidente de los EE.UU. Arnold Schwarzenegger y del jefe de la Agencia de Protección Medioambiental, Russ Cargill. Mientras el destino de Springfield y el del mundo permanecen indecisos, Homer emprende una odisea personal de redención, buscando el perdón de Marge, la reunión de su dividida familia y la salvación de la ciudad donde vive.&lt;/td&gt;	&lt;/tr&gt;&lt;/table&gt;&lt;span class=&quot;postbody&quot;&gt;
&lt;br /&gt;

&lt;br /&gt;
&lt;a rel=&quot;nofollow&quot; href=&quot;http://www.topetorrent.com/descargas/estrenos_de_cartelera/des-los_simpsons__la_pelicula_tsscreener_spanish.html&quot; target=&quot;_blank&quot; class=&quot;postlink&quot;&gt;DESCARGA AQUI &lt;/a&gt;
&lt;br /&gt;_________________&lt;br /&gt;&lt;img src=&quot;http://www.fotozone.es/foto/31,2007/fotozone_115880.jpg&quot; border=&quot;0&quot; /&gt;&lt;/span&gt;&lt;br /&gt;
</description>
</item>
<item>
	<title>Videos :: Reglas para postear este apartado¡¡¡¡</title>
	<link>http://colombia.100foros.com/viewtopic.php?p=132#132</link>
	<description>Autor: &lt;a href=&quot;http://colombia.100foros.com//profile.php?mode=viewprofile&amp;u=2&quot; target=&quot;_blank&quot;&gt;p1p3&lt;/a&gt;&lt;br /&gt;
Asunto: Reglas para postear este apartado¡¡¡¡&lt;br /&gt;
Publicado: Sab Ago 04, 2007 3:08 pm (GMT 0)&lt;br /&gt;
Tema Respuestas: 0&lt;br /&gt;&lt;br /&gt;
&lt;span class="postbody"&gt;1) estan rotundamente prohibidos los videos xxx.
&lt;br /&gt;
2) no se permiten links que lleven a paginas xxx.
&lt;br /&gt;
3) el usuario que incumpla alguna de estas reglas puede ser causal de ban.
&lt;br /&gt;_________________&lt;br /&gt;&lt;img src=&quot;http://www.fotozone.es/foto/31,2007/fotozone_115880.jpg&quot; border=&quot;0&quot; /&gt;&lt;/span&gt;&lt;br /&gt;
</description>
</item>
<item>
	<title>Videos :: ¡Videos de rissa!</title>
	<link>http://colombia.100foros.com/viewtopic.php?p=131#131</link>
	<description>Autor: &lt;a href=&quot;http://colombia.100foros.com//profile.php?mode=viewprofile&amp;u=6&quot; target=&quot;_blank&quot;&gt;HINKA&lt;/a&gt;&lt;br /&gt;
Asunto: ¡Videos de rissa!&lt;br /&gt;
Publicado: Sab Ago 04, 2007 2:52 pm (GMT 0)&lt;br /&gt;
Tema Respuestas: 0&lt;br /&gt;&lt;br /&gt;
&lt;span class="postbody"&gt;Hola..! aqui vereis diferentes tipos de videos muy divertidos,
&lt;br /&gt;

&lt;br /&gt;
&lt;a href=&quot;http://es.youtube.com/watch?v=92TwkNhMh5w&quot; target=&quot;_blank&quot;&gt;http://es.youtube.com/watch?v=92TwkNhMh5w&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
&lt;a href=&quot;http://es.youtube.com/watch?v=1bpk0SlSdPg&amp;amp;mode=related&amp;amp;search=&quot; target=&quot;_blank&quot;&gt;http://es.youtube.com/watch?v=1bpk0SlSdPg&amp;amp;mode=related&amp;amp;search=&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
&lt;a href=&quot;http://es.youtube.com/watch?v=ax8ZgCovknU&amp;amp;mode=related&amp;amp;search=&quot; target=&quot;_blank&quot;&gt;http://es.youtube.com/watch?v=ax8ZgCovknU&amp;amp;mode=related&amp;amp;search=&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
&lt;a href=&quot;http://es.youtube.com/watch?v=Vp74-azKA5k&amp;amp;mode=related&amp;amp;search=&quot; target=&quot;_blank&quot;&gt;http://es.youtube.com/watch?v=Vp74-azKA5k&amp;amp;mode=related&amp;amp;search=&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
Espero que os gusten  &lt;img src=&quot;http://colombia.100foros.com//images/smiles/icon_lol.gif&quot; alt=&quot;Laughing&quot; border=&quot;0&quot; /&gt;  &lt;img src=&quot;http://colombia.100foros.com//images/smiles/icon_lol.gif&quot; alt=&quot;Laughing&quot; border=&quot;0&quot; /&gt; &lt;span style=&quot;font-style: italic&quot;&gt;&lt;span style=&quot;color: red&quot;&gt;&lt;/span&gt;[/b]&lt;/span&gt;
&lt;br /&gt;_________________&lt;br /&gt;&lt;img src=&quot;http://www.fotozone.es/foto/31,2007/fotozone_115870.jpg&quot; border=&quot;0&quot; /&gt;&lt;/span&gt;&lt;br /&gt;
</description>
</item>
<item>
	<title>Manuales Utiles para hacker :: RECOMENDACIONES¡¡¡¡¡¡</title>
	<link>http://colombia.100foros.com/viewtopic.php?p=130#130</link>
	<description>Autor: &lt;a href=&quot;http://colombia.100foros.com//profile.php?mode=viewprofile&amp;u=2&quot; target=&quot;_blank&quot;&gt;p1p3&lt;/a&gt;&lt;br /&gt;
Asunto: RECOMENDACIONES¡¡¡¡¡¡&lt;br /&gt;
Publicado: Sab Ago 04, 2007 5:26 am (GMT 0)&lt;br /&gt;
Tema Respuestas: 0&lt;br /&gt;&lt;br /&gt;
&lt;span class="postbody"&gt;1) cuidado con lo que ustedes puedan llegar a hacer con esta informacion.
&lt;br /&gt;
2) no nos hacemor responsables por daños a terceros.
&lt;br /&gt;
2) la responsabilidad se la adjudican ustedes con lo que pueda pasar.
&lt;br /&gt;_________________&lt;br /&gt;&lt;img src=&quot;http://www.fotozone.es/foto/31,2007/fotozone_115880.jpg&quot; border=&quot;0&quot; /&gt;&lt;/span&gt;&lt;br /&gt;
</description>
</item>
<item>
	<title>Seguridad :: NEW VIRUS</title>
	<link>http://colombia.100foros.com/viewtopic.php?p=129#129</link>
	<description>Autor: &lt;a href=&quot;http://colombia.100foros.com//profile.php?mode=viewprofile&amp;u=2&quot; target=&quot;_blank&quot;&gt;p1p3&lt;/a&gt;&lt;br /&gt;
Asunto: NEW VIRUS&lt;br /&gt;
Publicado: Sab Ago 04, 2007 5:22 am (GMT 0)&lt;br /&gt;
Tema Respuestas: 0&lt;br /&gt;&lt;br /&gt;
&lt;span class="postbody"&gt;en la siguiente pagina podras encontrar los virus que salen a diario con su respectiva caracteristica &lt;a href=&quot;http://alerta-antivirus.red.es/portada/&quot; target=&quot;_blank&quot;&gt;http://alerta-antivirus.red.es/portada/&lt;/a&gt;
&lt;br /&gt;_________________&lt;br /&gt;&lt;img src=&quot;http://www.fotozone.es/foto/31,2007/fotozone_115880.jpg&quot; border=&quot;0&quot; /&gt;&lt;/span&gt;&lt;br /&gt;
</description>
</item>
<item>
	<title>  	 Php :: RE: capitulo 1 al 20 de porogramacion PHP</title>
	<link>http://colombia.100foros.com/viewtopic.php?p=128#128</link>
	<description>Autor: &lt;a href=&quot;http://colombia.100foros.com//profile.php?mode=viewprofile&amp;u=2&quot; target=&quot;_blank&quot;&gt;p1p3&lt;/a&gt;&lt;br /&gt;

Publicado: Sab Ago 04, 2007 4:35 am (GMT 0)&lt;br /&gt;
Tema Respuestas: 9&lt;br /&gt;&lt;br /&gt;
&lt;span class="postbody"&gt;Capítulo 9: Persistencia.
&lt;br /&gt;
Uno de los problemas clásicos en el desarrollo de web sites y aplicaciones web es la perdida de persistencia
&lt;br /&gt;
cuando el usuario pasa de una página a otra. Debido a las características de diseño del protocolo HTTP que
&lt;br /&gt;
fuerza una nueva conexión y desconexión por cada request no es posible saber quien está accediendo a que
&lt;br /&gt;
página o en que lugar esta cada usuario del site. Mantener persistencia a lo largo de la navegación del sitio ha
&lt;br /&gt;
sido uno de los temas más complejos e importantes en el desarrollo de aplicaciones web, en este capítulo
&lt;br /&gt;
ilustraremos distintos métodos que pueden usarse en PHP para mantener persistencia.
&lt;br /&gt;
Sesiones:
&lt;br /&gt;
Se suele definir como una sesión al tiempo en el que un usuario determinado se encuentra navegando en el
&lt;br /&gt;
site, dependiendo de la definición podemos decir que si el usuario no navega por el site durante una cierta
&lt;br /&gt;
cantidad de minutos ha terminado su sesión en el sitio y a partir de allí cuando vuelve a ingresar lo hace en
&lt;br /&gt;
una nueva sesión. El concepto de sesión es útil porque es posible asociar a cada sesión un identificador único
&lt;br /&gt;
de forma tal de registrar la actividad del usuario en el site y mantener persistencia utilizando únicamente este
&lt;br /&gt;
identificador, el problema pasa a ser como mantener la persistencia del identificador de sesión (SID) de ahora
&lt;br /&gt;
en adelante, y las posibilidades son las que detallamos a continuación:
&lt;br /&gt;
1. Cookies
&lt;br /&gt;
Uno de los mecanismos más usados para mantener persistencia es el mecanismo de cookies, inventado por
&lt;br /&gt;
Netscape y hoy en día aceptado por casi todos los browsers, en especial los más populares. El concepto es que
&lt;br /&gt;
mediante un header del protocolo HTTP el server pueda almacenar información en el cliente. A esta
&lt;br /&gt;
información que el server guarda en el cliente se la denomina “cookie”. Las cookies pueden habilitarse o
&lt;br /&gt;
deshabilitarse desde el browser por lo que algunos usuarios no lo soportan, son de uso bastante general en
&lt;br /&gt;
muchos web sites a punto tal que en sites de la importancia de yahoo si el usuario no tiene habilitadas las
&lt;br /&gt;
cookies prácticamente no puede utilizar la mayoría de los servicios del site. Cuando el server envía un header
&lt;br /&gt;
con un cookie el browser, si acepta cookies, guarda la información enviada en un archivo de texto con un
&lt;br /&gt;
formato especial. Cada vez que el browser solicita una página del dominio que envió la cookie re-envia la
&lt;br /&gt;
cookie al site, de esta forma es posible mantener persistencia. La información que puede guardarse en una
&lt;br /&gt;
cookie esta limitada por lo que habitualmente se utiliza la misma para mantener el identificador de sesión del
&lt;br /&gt;
usuario almacenándose el resto de los datos necesarios en el servidor usando el session-id de la cookie como
&lt;br /&gt;
clave.
&lt;br /&gt;
Para crear un cookie en PHP se utiliza la función setcookie cuya sintaxis es la siguiente:
&lt;br /&gt;
int=setcookie(nombre, valor, expiración, path, dominio);
&lt;br /&gt;
Nombre : Nombre de la cookie a setear por ejemplo “sesion”
&lt;br /&gt;
Valor : Valor que contendrá la cookie, como por ejemplo “khdhkfdh47”
&lt;br /&gt;
Expiracion : Fecha de vencimiento de la cookie (fecha en la cual el browser la borra del disco del
&lt;br /&gt;
usuario), debe estar en formato Unix. En general el uso más practico es time()+tiempo
&lt;br /&gt;
donde tiempo es la cantidad de segundos de vida de la cookie.
&lt;br /&gt;
Path : En general no se usa, suele setearse en “/”
&lt;br /&gt;
Dominio : Dominio para el cual el cookie es valido eje mplo “.prueba.com” en cuyo caso sirve para
&lt;br /&gt;
algo.prueba.com, site1.prueba.com, site2.prueba.com y todos los de la misma forma.
&lt;br /&gt;
La función devuelve verdadero si pudo setearse la cookie o falso en caso contrario (por ejemplo si el browser
&lt;br /&gt;
no acepta cookies)
&lt;br /&gt;
Ejemplo:
&lt;br /&gt;
$val=setcookie(“sesion”,”1”,time()+3600,”/”,”.prueba.com”);
&lt;br /&gt;
Para recuperar el valor de una cookie se debe usar el vector de PHP $HTTP_COOKIE_VARS que es u
&lt;br /&gt;
vector asociativo indexado por nombre de cookie.
&lt;br /&gt;
Ejemplo:
&lt;br /&gt;
$ck=$HTTP_COOKIE_VARS[“sesion”];
&lt;br /&gt;
Con lo cual se recupera el valor de la cookie.
&lt;br /&gt;
Las cookies son sumamente practicas para manejar sesiones, en cada página se verifica si el usuario tiene
&lt;br /&gt;
seteada la cookie con nombre “session” si la tiene se recupera el valor de la sesión, si no la tiene se crea un
&lt;br /&gt;
identificador de sesión nuevo y único y se setea la cookie correspondiente con el vencimiento que
&lt;br /&gt;
corresponde según la duración que uno considere necesaria. Luego el identificador de sesión es accesible en
&lt;br /&gt;
cada página para almacenar valores por ejemplo en la base de datos como el nombre del usuario, preferencias
&lt;br /&gt;
de la sesión y otros valores. La recuperación de la cookie y su creación en caso de no existir se puede colocar
&lt;br /&gt;
en un modulo php que luego se incluye en cada página por ejemplo mod_session.php solo hay que recordar
&lt;br /&gt;
en cada página hacer un include(“mod_session.php”); y luego se puede usar la variable $session_id (o el
&lt;br /&gt;
nombre que se le haya dado en el modulo) para guardar y recuperar valores correspondientes a la sesión
&lt;br /&gt;
actual.
&lt;br /&gt;
2. URL
&lt;br /&gt;
Otro método posible para pasar información desde una página a otra es mediante el URL de la página en
&lt;br /&gt;
cuestión, usando el URL se pueden pasar datos de una página a otra usando el query string de la forma:
&lt;br /&gt;
&lt;a href=&quot;http://dominio/path?query_string&quot; target=&quot;_blank&quot;&gt;http://dominio/path?query_string&lt;/a&gt;
&lt;br /&gt;
Donde query_string es de la forma: variable=valor&amp;amp;variable2=valor2&amp;amp;variable3=valor3 … etc…
&lt;br /&gt;
De esta forma podríamos hacer un manejo similar al anterior pero pasando el session_id usando el url en
&lt;br /&gt;
lugar de usando cookies, la desventaja de este método es que todos los links deben generarse dinámicamente
&lt;br /&gt;
en PHP para agregar a la dirección del link el valor del cookie de la forma:
&lt;br /&gt;
&amp;lt;a href=”http://dominio/path?session=&amp;lt;?print(“$session_id”);?&amp;gt;”&amp;gt;
&lt;br /&gt;
El funcionamiento es similar, no requiere que el browser tenga habilitados cookies pero altera la forma en
&lt;br /&gt;
que se escriben los links y afea un poco la forma en la cual se muestra la URL de la página actual, podría por
&lt;br /&gt;
ejemplo tener consecuencias como entorpecer la tarea de generar el bookmark de una determinada página.
&lt;br /&gt;
3. Sesiones en PHP
&lt;br /&gt;
PHP soporta en forma nativa desde el lenguaje el concepto de sesiones, en PHP se pueden manejar sesiones
&lt;br /&gt;
en forma transparente al usuario, el lenguaje define una constante PHPSESSID con el identificador de cada
&lt;br /&gt;
sesión y se encarga de propagar el mismo usando cookies o bien el URL de la página en caso de que los
&lt;br /&gt;
cookies estén deshabilitados.
&lt;br /&gt;
Para usar cookies en PHP es necesario invocar la función session_start(); en el comienzo del script, esta
&lt;br /&gt;
función se encarga de recuperar el session_id en la constante $PHPSESSID y si la sesión no existe crea una
&lt;br /&gt;
nueva.
&lt;br /&gt;
Si PHP esta compilado con la opción –enable-trans-sid el interprete se encarga de re-escribir dinámicamente
&lt;br /&gt;
las URLs agregando el session_id en caso de que el usuario no tenga cookies, en caso contrario hay que
&lt;br /&gt;
modificar los links de la forma:
&lt;br /&gt;
&amp;lt;a href=”/lugar?PHPSESSID=&amp;lt;?echo “$PHPSESSID”?&amp;gt;”&amp;gt;
&lt;br /&gt;
PHP dispone además de funciones para “registrar” variables dentro de una sesión, esto se hace llamando a la
&lt;br /&gt;
función session_register(); Por ejemplo:
&lt;br /&gt;
&amp;lt;?
&lt;br /&gt;
session_start();
&lt;br /&gt;
$x=”hola”;
&lt;br /&gt;
session_register(“x”);
&lt;br /&gt;
?&amp;gt;
&lt;br /&gt;
Notar que session_register recibe el “nombre” de la variable a registrar sin “$”. Una vez registrada una
&lt;br /&gt;
variable la misma estará disponible en todas las páginas que usen session_start durante la sesión actual, es
&lt;br /&gt;
decir que si desde la página donde hicimos el session_register el usuario se traslada a otra página que usa
&lt;br /&gt;
session_start entonces la variable $x automáticamente estará definida y con el valor “hola” ya que es una
&lt;br /&gt;
variable registrada dentro de la sesión. Cualquier tipo de variable de PHP puede registrarse con este método,
&lt;br /&gt;
incluyendo objetos (sólo las propiedades del objeto se registran, no los métodos!)
&lt;br /&gt;
Otras funciones de manejo de sesiones:
&lt;br /&gt;
Función Descripción
&lt;br /&gt;
session_id(); Devuelve el id de la sesión actual, si se le pasa como
&lt;br /&gt;
parámetro un string cambia el id de la sesión al string
&lt;br /&gt;
pasado, esta función hace lo mismo que la consulta
&lt;br /&gt;
directa a la variable $PHPSESSID
&lt;br /&gt;
session_destroy(); Destruye la sesión actual y todas las variables
&lt;br /&gt;
registradas.
&lt;br /&gt;
session_name(); Devuelve el nombre de la sesión actual
&lt;br /&gt;
(PHPSESSID), si se le pasa como parámetro un string
&lt;br /&gt;
cambia el nombre de la sesión y por consiguiente de
&lt;br /&gt;
la variable que contiene el id de la sesión al valor
&lt;br /&gt;
pasado.
&lt;br /&gt;
session_unregister(variable_name); Elimina de la sesión una variable registrada con
&lt;br /&gt;
session_register
&lt;br /&gt;
session_is_registered(variable_name); Dice si una variable esta o no registrada en la sesión
&lt;br /&gt;
actual (devuelve true/false), notar que es equivalente
&lt;br /&gt;
a la función isset pero tomando en cuenta la sesión.
&lt;br /&gt;
Manejo avanzado de sesiones en PHP.
&lt;br /&gt;
Una pregunta interesante relativa al manejo de sesiones en PHP es como se almacenan los datos de la sesión
&lt;br /&gt;
(las variables registradas y demás), en PHP por omisión los datos sobre las sesiones se almacenan en archivos
&lt;br /&gt;
en el directorio /tmp, este método funciona correctamente pero tiene 2 inconvenientes:
&lt;br /&gt;
1. No es fácil compartir sesiones entre servers.
&lt;br /&gt;
Dado que los datos se almacenan en un file-system una variable “registrada” en un server no puede ser
&lt;br /&gt;
visible en otro ya que el mismo no tiene forma de recuperar el contenido de la misma. (Podría hacerse si
&lt;br /&gt;
se cambia el directorio /tmp a un directorio compartido entre maquinas usando NFS pero este no es el
&lt;br /&gt;
tema aquí)
&lt;br /&gt;
2. Dada una cantidad de usuarios realmente elevada el método no es eficiente.
&lt;br /&gt;
Estamos hablando de cantidades de usuarios realmente muy grandes simultáneos, dados los cuales hay
&lt;br /&gt;
demasiadas sesiones por mantener y el file-system se torna lento en la búsqueda y recuperación de los
&lt;br /&gt;
archivos con los datos.
&lt;br /&gt;
Afortunadamente en PHP es posible redefinir los métodos de almacenamiento que el lenguaje utiliza para
&lt;br /&gt;
almacenar las sesiones. Esto se hace con la función session_set_save_handler
&lt;br /&gt;
Ejemplo:
&lt;br /&gt;
session_set_save_handler (&quot;open&quot;, &quot;close&quot;, &quot;read&quot;, &quot;write&quot;, &quot;destroy&quot;, &quot;gc&quot;);
&lt;br /&gt;
Que recibe como parámetros los “nombres” de 6(seis) funciones, cuyos prototipos y funcionalidad son los
&lt;br /&gt;
siguientes:
&lt;br /&gt;
Función Descripción
&lt;br /&gt;
function open ($save_path, $session_name) Se llama luego de cada session_start, recibe un path y
&lt;br /&gt;
un nombre de sesión que por omisión es
&lt;br /&gt;
PHPSESSID.
&lt;br /&gt;
function close() Cierra la sesión.
&lt;br /&gt;
function read ($key) Dada una clave “key” recupera para la sesión actual el
&lt;br /&gt;
valor de la clave pasada.
&lt;br /&gt;
function write ($key, $val) Guarda un par clave-valor para la sesión actual.
&lt;br /&gt;
function destroy ($key) Destruye la clave pasada como parámetro.
&lt;br /&gt;
Function gc($maxlifetime) Garbage collection, se encarga de destruir los datos de
&lt;br /&gt;
las sesiones vencidas.
&lt;br /&gt;
En general en open no es necesario hacer nada ya que todo el manejo de Registración de variables esta dado
&lt;br /&gt;
por read y write. Write recibirá como clave el identificador de la sesión y como datos una estructura interna
&lt;br /&gt;
de php que contiene la representación de todos los datos a almacenar para la sesión. De la misma forma read
&lt;br /&gt;
debe ,dada la clave (session_id), recuperar todos los datos de la sesión y luego php en forma interna setea las
&lt;br /&gt;
variables correspondientes para que sean visibles.
&lt;br /&gt;
Todas las funciones deben devolver “true” para que el manejo de sesiones funcione.
&lt;br /&gt;
A continuación dos módulos de Zing Yiang ilustrando como hacer un manejador de sesiones usando DBM y
&lt;br /&gt;
otro usando MySQL y un ejemplo de test.
&lt;br /&gt;
&amp;lt;?
&lt;br /&gt;
/* ------------------------------------------------------------------------
&lt;br /&gt;
* session_dbm.php
&lt;br /&gt;
* ------------------------------------------------------------------------
&lt;br /&gt;
* PHP4 DBM Session Handler
&lt;br /&gt;
* Version 1.00
&lt;br /&gt;
* by Ying Zhang (ying@zippydesign.com)
&lt;br /&gt;
* Last Modified: May 21 2000
&lt;br /&gt;
*
&lt;br /&gt;
* ------------------------------------------------------------------------
&lt;br /&gt;
* TERMS OF USAGE:
&lt;br /&gt;
* ------------------------------------------------------------------------
&lt;br /&gt;
* You are free to use this library in any way you want, no warranties are
&lt;br /&gt;
* expressed or implied. This works for me, but I don't guarantee that it
&lt;br /&gt;
* works for you, USE AT YOUR OWN RISK.
&lt;br /&gt;
*
&lt;br /&gt;
* While not required to do so, I would appreciate it if you would retain
&lt;br /&gt;
* this header information. If you make any modifications or improvements,
&lt;br /&gt;
* please send them via email to Ying Zhang &amp;lt;ying@zippydesign.com&amp;gt;.
&lt;br /&gt;
*
&lt;br /&gt;
* ------------------------------------------------------------------------
&lt;br /&gt;
* DESCRIPTION:
&lt;br /&gt;
* ------------------------------------------------------------------------
&lt;br /&gt;
* This library tells the PHP4 session handler to write to a DBM file
&lt;br /&gt;
* instead of creating individual files for each session.
&lt;br /&gt;
*
&lt;br /&gt;
* ------------------------------------------------------------------------
&lt;br /&gt;
* INSTALLATION:
&lt;br /&gt;
* ------------------------------------------------------------------------
&lt;br /&gt;
* Make sure you have DBM support compiled into PHP4. Then copy this
&lt;br /&gt;
* script to a directory that is accessible by the rest of your PHP
&lt;br /&gt;
* scripts.
&lt;br /&gt;
*
&lt;br /&gt;
* ------------------------------------------------------------------------
&lt;br /&gt;
* USAGE:
&lt;br /&gt;
* ------------------------------------------------------------------------
&lt;br /&gt;
* Include this file in your scripts before you call session_start(), you
&lt;br /&gt;
* don't have to do anything special after that.
&lt;br /&gt;
*/
&lt;br /&gt;
$SESS_DBM = &quot;&quot;;
&lt;br /&gt;
$SESS_LIFE = get_cfg_var(&quot;session.gc_maxlifetime&quot;);
&lt;br /&gt;
function sess_open($save_path, $session_name) {
&lt;br /&gt;
global $SESS_DBM;
&lt;br /&gt;
$SESS_DBM = dbmopen(&quot;$save_path/$session_name&quot;, &quot;c&quot;);
&lt;br /&gt;
return ($SESS_DBM);
&lt;br /&gt;
}
&lt;br /&gt;
function sess_close() {
&lt;br /&gt;
global $SESS_DBM;
&lt;br /&gt;
dbmclose($SESS_DBM);
&lt;br /&gt;
return true;
&lt;br /&gt;
}
&lt;br /&gt;
function sess_read($key) {
&lt;br /&gt;
global $SESS_DBM, $SESS_LIFE;
&lt;br /&gt;
$var = &quot;&quot;;
&lt;br /&gt;
if ($tmp = dbmfetch($SESS_DBM, $key)) {
&lt;br /&gt;
$expires_at = substr($tmp, 0, strpos($tmp, &quot;|&quot;));
&lt;br /&gt;
if ($expires_at &amp;gt; time()) {
&lt;br /&gt;
$var = substr($tmp, strpos($tmp, &quot;|&quot;) + 1);
&lt;br /&gt;
}
&lt;br /&gt;
}
&lt;br /&gt;
return $var;
&lt;br /&gt;
}
&lt;br /&gt;
function sess_write($key, $val) {
&lt;br /&gt;
global $SESS_DBM, $SESS_LIFE;
&lt;br /&gt;
dbmreplace($SESS_DBM, $key, time() + $SESS_LIFE . &quot;|&quot; . $val);
&lt;br /&gt;
return true;
&lt;br /&gt;
}
&lt;br /&gt;
function sess_destroy($key) {
&lt;br /&gt;
global $SESS_DBM;
&lt;br /&gt;
dbmdelete($SESS_DBM, $key);
&lt;br /&gt;
return true;
&lt;br /&gt;
}
&lt;br /&gt;
function sess_gc($maxlifetime) {
&lt;br /&gt;
global $SESS_DBM;
&lt;br /&gt;
$now = time();
&lt;br /&gt;
$key = dbmfirstkey($SESS_DBM);
&lt;br /&gt;
while ($key) {
&lt;br /&gt;
if ($tmp = dbmfetch($SESS_DBM, $key)) {
&lt;br /&gt;
$expires_at = substr($tmp, 0, strpos($tmp, &quot;|&quot;));
&lt;br /&gt;
if ($now &amp;gt; $expires_at) {
&lt;br /&gt;
sess_destroy($key);
&lt;br /&gt;
}
&lt;br /&gt;
}
&lt;br /&gt;
$key = dbmnextkey($SESS_DBM, $key);
&lt;br /&gt;
}
&lt;br /&gt;
}
&lt;br /&gt;
session_set_save_handler(
&lt;br /&gt;
&quot;sess_open&quot;,
&lt;br /&gt;
&quot;sess_close&quot;,
&lt;br /&gt;
&quot;sess_read&quot;,
&lt;br /&gt;
&quot;sess_write&quot;,
&lt;br /&gt;
&quot;sess_destroy&quot;,
&lt;br /&gt;
&quot;sess_gc&quot;);
&lt;br /&gt;
?&amp;gt;
&lt;br /&gt;
&amp;lt;?
&lt;br /&gt;
/* ------------------------------------------------------------------------
&lt;br /&gt;
* session_mysql.php
&lt;br /&gt;
* ------------------------------------------------------------------------
&lt;br /&gt;
* PHP4 MySQL Session Handler
&lt;br /&gt;
* Version 1.00
&lt;br /&gt;
* by Ying Zhang (ying@zippydesign.com)
&lt;br /&gt;
* Last Modified: May 21 2000
&lt;br /&gt;
*
&lt;br /&gt;
* ------------------------------------------------------------------------
&lt;br /&gt;
* TERMS OF USAGE:
&lt;br /&gt;
* ------------------------------------------------------------------------
&lt;br /&gt;
* You are free to use this library in any way you want, no warranties are
&lt;br /&gt;
* expressed or implied. This works for me, but I don't guarantee that it
&lt;br /&gt;
* works for you, USE AT YOUR OWN RISK.
&lt;br /&gt;
*
&lt;br /&gt;
* While not required to do so, I would appreciate it if you would retain
&lt;br /&gt;
* this header information. If you make any modifications or improvements,
&lt;br /&gt;
* please send them via email to Ying Zhang &amp;lt;ying@zippydesign.com&amp;gt;.
&lt;br /&gt;
*
&lt;br /&gt;
* ------------------------------------------------------------------------
&lt;br /&gt;
* DESCRIPTION:
&lt;br /&gt;
* ------------------------------------------------------------------------
&lt;br /&gt;
* This library tells the PHP4 session handler to write to a MySQL database
&lt;br /&gt;
* instead of creating individual files for each session.
&lt;br /&gt;
*
&lt;br /&gt;
* Create a new database in MySQL called &quot;sessions&quot; like so:
&lt;br /&gt;
*
&lt;br /&gt;
* CREATE TABLE sessions (
&lt;br /&gt;
* sesskey char(32) not null,
&lt;br /&gt;
* expiry int(11) unsigned not null,
&lt;br /&gt;
* value text not null,
&lt;br /&gt;
* PRIMARY KEY (sesskey)
&lt;br /&gt;
* );
&lt;br /&gt;
*
&lt;br /&gt;
* ------------------------------------------------------------------------
&lt;br /&gt;
* INSTALLATION:
&lt;br /&gt;
* ------------------------------------------------------------------------
&lt;br /&gt;
* Make sure you have MySQL support compiled into PHP4. Then copy this
&lt;br /&gt;
* script to a directory that is accessible by the rest of your PHP
&lt;br /&gt;
* scripts.
&lt;br /&gt;
*
&lt;br /&gt;
* ------------------------------------------------------------------------
&lt;br /&gt;
* USAGE:
&lt;br /&gt;
* ------------------------------------------------------------------------
&lt;br /&gt;
* Include this file in your scripts before you call session_start(), you
&lt;br /&gt;
* don't have to do anything special after that.
&lt;br /&gt;
*/
&lt;br /&gt;
$SESS_DBHOST = &quot;localhost&quot;; /* database server hostname */
&lt;br /&gt;
$SESS_DBNAME = &quot;sessions&quot;; /* database name */
&lt;br /&gt;
$SESS_DBUSER = &quot;phpsession&quot;; /* database user */
&lt;br /&gt;
$SESS_DBPASS = &quot;phpsession&quot;; /* database password */
&lt;br /&gt;
$SESS_DBH = &quot;&quot;;
&lt;br /&gt;
$SESS_LIFE = get_cfg_var(&quot;session.gc_maxlifetime&quot;);
&lt;br /&gt;
function sess_open($save_path, $session_name) {
&lt;br /&gt;
global $SESS_DBHOST, $SESS_DBNAME, $SESS_DBUSER, $SESS_DBPASS, $SESS_DBH;
&lt;br /&gt;
if (! $SESS_DBH = mysql_pconnect($SESS_DBHOST, $SESS_DBUSER, $SESS_DBPASS))
&lt;br /&gt;
{
&lt;br /&gt;
echo &quot;&amp;lt;li&amp;gt;Can't connect to $SESS_DBHOST as $SESS_DBUSER&quot;;
&lt;br /&gt;
echo &quot;&amp;lt;li&amp;gt;MySQL Error: &quot;, mysql_error();
&lt;br /&gt;
die;
&lt;br /&gt;
}
&lt;br /&gt;
if (! mysql_select_db($SESS_DBNAME, $SESS_DBH)) {
&lt;br /&gt;
echo &quot;&amp;lt;li&amp;gt;Unable to select database $SESS_DBNAME&quot;;
&lt;br /&gt;
die;
&lt;br /&gt;
}
&lt;br /&gt;
return true;
&lt;br /&gt;
}
&lt;br /&gt;
function sess_close() {
&lt;br /&gt;
return true;
&lt;br /&gt;
}
&lt;br /&gt;
function sess_read($key) {
&lt;br /&gt;
global $SESS_DBH, $SESS_LIFE;
&lt;br /&gt;
$qry = &quot;SELECT value FROM sessions WHERE sesskey = '$key' AND expiry &amp;gt; &quot; .
&lt;br /&gt;
time();
&lt;br /&gt;
$qid = mysql_query($qry, $SESS_DBH);
&lt;br /&gt;
if (list($value) = mysql_fetch_row($qid)) {
&lt;br /&gt;
return $value;
&lt;br /&gt;
}
&lt;br /&gt;
return false;
&lt;br /&gt;
}
&lt;br /&gt;
function sess_write($key, $val) {
&lt;br /&gt;
global $SESS_DBH, $SESS_LIFE;
&lt;br /&gt;
$expiry = time() + $SESS_LIFE;
&lt;br /&gt;
$value = addslashes($val);
&lt;br /&gt;
$qry = &quot;INSERT INTO sessions VALUES ('$key', $expiry, '$value')&quot;;
&lt;br /&gt;
$qid = mysql_query($qry, $SESS_DBH);
&lt;br /&gt;
if (! $qid) {
&lt;br /&gt;
$qry = &quot;UPDATE sessions SET expiry = $expiry, value = '$value' WHERE
&lt;br /&gt;
sesskey = '$key' AND expiry &amp;gt; &quot; . time();
&lt;br /&gt;
$qid = mysql_query($qry, $SESS_DBH);
&lt;br /&gt;
}
&lt;br /&gt;
return $qid;
&lt;br /&gt;
}
&lt;br /&gt;
function sess_destroy($key) {
&lt;br /&gt;
global $SESS_DBH;
&lt;br /&gt;
$qry = &quot;DELETE FROM sessions WHERE sesskey = '$key'&quot;;
&lt;br /&gt;
$qid = mysql_query($qry, $SESS_DBH);
&lt;br /&gt;
return $qid;
&lt;br /&gt;
}
&lt;br /&gt;
function sess_gc($maxlifetime) {
&lt;br /&gt;
global $SESS_DBH;
&lt;br /&gt;
$qry = &quot;DELETE FROM sessions WHERE expiry &amp;lt; &quot; . time();
&lt;br /&gt;
$qid = mysql_query($qry, $SESS_DBH);
&lt;br /&gt;
return mysql_affected_rows($SESS_DBH);
&lt;br /&gt;
}
&lt;br /&gt;
session_set_save_handler(
&lt;br /&gt;
&quot;sess_open&quot;,
&lt;br /&gt;
&quot;sess_close&quot;,
&lt;br /&gt;
&quot;sess_read&quot;,
&lt;br /&gt;
&quot;sess_write&quot;,
&lt;br /&gt;
&quot;sess_destroy&quot;,
&lt;br /&gt;
&quot;sess_gc&quot;);
&lt;br /&gt;
?&amp;gt;
&lt;br /&gt;
Y el script de testing es:
&lt;br /&gt;
&amp;lt;?
&lt;br /&gt;
/* ------------------------------------------------------------------------
&lt;br /&gt;
* test.php
&lt;br /&gt;
* ------------------------------------------------------------------------
&lt;br /&gt;
* PHP4 Customer Session Handler Test Script
&lt;br /&gt;
* Version 1.00
&lt;br /&gt;
* by Ying Zhang (ying@zippydesign.com)
&lt;br /&gt;
* Last Modified: May 21 2000
&lt;br /&gt;
*/
&lt;br /&gt;
/* default to DBM handler */
&lt;br /&gt;
if (! isset($handler)) {
&lt;br /&gt;
$handler = &quot;dbm&quot;;
&lt;br /&gt;
}
&lt;br /&gt;
/* default action is increment */
&lt;br /&gt;
if (! isset($action)) {
&lt;br /&gt;
$action = &quot;increment&quot;;
&lt;br /&gt;
}
&lt;br /&gt;
/* load up the appropriate session handling script, depending on the handler */
&lt;br /&gt;
if ($handler == &quot;dbm&quot;) {
&lt;br /&gt;
include(&quot;session_dbm.php&quot;);
&lt;br /&gt;
} elseif ($handler == &quot;mysql&quot;) {
&lt;br /&gt;
include(&quot;session_mysql.php&quot;);
&lt;br /&gt;
} else {
&lt;br /&gt;
echo &quot;&amp;lt;li&amp;gt;Unrecognized handler ($handler)&quot;;
&lt;br /&gt;
die;
&lt;br /&gt;
}
&lt;br /&gt;
/* start the session and register a simple counter */
&lt;br /&gt;
session_start();
&lt;br /&gt;
session_register(&quot;count&quot;);
&lt;br /&gt;
/* figure out what we should do, depending on the action */
&lt;br /&gt;
switch ($action) {
&lt;br /&gt;
case &quot;increment&quot; :
&lt;br /&gt;
$count = isset($count) ? $count + 1 : 0;
&lt;br /&gt;
break;
&lt;br /&gt;
case &quot;destroy&quot; :
&lt;br /&gt;
session_destroy();
&lt;br /&gt;
break;
&lt;br /&gt;
case &quot;gc&quot; :
&lt;br /&gt;
$maxlife = get_cfg_var(&quot;session.gc_maxlifetime&quot;);
&lt;br /&gt;
sess_gc($maxlife);
&lt;br /&gt;
break;
&lt;br /&gt;
default:
&lt;br /&gt;
echo &quot;&amp;lt;li&amp;gt;Unknown action ($action)&quot;;
&lt;br /&gt;
break;
&lt;br /&gt;
}
&lt;br /&gt;
?&amp;gt;
&lt;br /&gt;
&amp;lt;h1&amp;gt;Session Test Script&amp;lt;/h1&amp;gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Handler: &amp;lt;b&amp;gt;&amp;lt;?=$handler?&amp;gt;&amp;lt;/b&amp;gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Action: &amp;lt;b&amp;gt;&amp;lt;?=$action?&amp;gt;&amp;lt;/b&amp;gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Count: &amp;lt;b&amp;gt;&amp;lt;?=$count?&amp;gt;&amp;lt;/b&amp;gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;
&lt;br /&gt;
&amp;lt;hr size=1&amp;gt;
&lt;br /&gt;
&amp;lt;form&amp;gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;
&lt;br /&gt;
&amp;lt;td&amp;gt;Handler:&amp;lt;/td&amp;gt;
&lt;br /&gt;
&amp;lt;td&amp;gt;
&lt;br /&gt;
&amp;lt;select name=&quot;handler&quot;&amp;gt;
&lt;br /&gt;
&amp;lt;option value=&quot;dbm&quot;&amp;gt;DBM&amp;lt;/option&amp;gt;
&lt;br /&gt;
&amp;lt;option value=&quot;mysql&quot;&amp;gt;MySQL&amp;lt;/option&amp;gt;
&lt;br /&gt;
&amp;lt;/select&amp;gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;
&lt;br /&gt;
&amp;lt;/tr&amp;gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;
&lt;br /&gt;
&amp;lt;td&amp;gt;Action:&amp;lt;/td&amp;gt;
&lt;br /&gt;
&amp;lt;td&amp;gt;
&lt;br /&gt;
&amp;lt;select name=&quot;action&quot;&amp;gt;
&lt;br /&gt;
&amp;lt;option value=&quot;increment&quot;&amp;gt;Increment&amp;lt;/option&amp;gt;
&lt;br /&gt;
&amp;lt;option value=&quot;destroy&quot;&amp;gt;Session Destroy&amp;lt;/option&amp;gt;
&lt;br /&gt;
&amp;lt;option value=&quot;gc&quot;&amp;gt;Force Garbage Collection&amp;lt;/option&amp;gt;
&lt;br /&gt;
&amp;lt;/select&amp;gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;
&lt;br /&gt;
&amp;lt;/tr&amp;gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;
&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;
&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;br&amp;gt;&amp;lt;input type=&quot;submit&quot;&amp;gt;&amp;lt;/td&amp;gt;
&lt;br /&gt;
&amp;lt;/tr&amp;gt;
&lt;br /&gt;
&amp;lt;/table&amp;gt;
&lt;br /&gt;
&amp;lt;/form&amp;gt;
&lt;br /&gt;
Capítulo 8: Manejo de vectores.
&lt;br /&gt;
En el capítulo introductorio al lenguaje se estudiaron los vectores como tipos de datos en PHP, se vio como
&lt;br /&gt;
crear y utilizar vectores y vectores asociativos, en este capítulo se estudian funciones nativas de PHP que
&lt;br /&gt;
facilitan la manipulación de vectores y matrices.
&lt;br /&gt;
Colas y Pilas usando vectores en PHP.
&lt;br /&gt;
PHP cuenta con instrucciones nativas para manipular vectores que permiten utilizar los mismos como pilas o
&lt;br /&gt;
colas, las instrucciones son:
&lt;br /&gt;
variable=array_pop(array);
&lt;br /&gt;
Elimina del vector el último elemento y lo devuelve en una variable.
&lt;br /&gt;
array_push(array, variable);
&lt;br /&gt;
Agrega un elemento al final del vector con el valor de la variable que se le pasa como segundo parámetro.
&lt;br /&gt;
variable=array_shift(array);
&lt;br /&gt;
Elimina del vector el primer elemento y lo devuelve en la variable.
&lt;br /&gt;
array_unshift(array,variable);
&lt;br /&gt;
Agrega el elemento pasado al principio del vector desplazando todos los valores.
&lt;br /&gt;
Usando array_shift y array_pop se pueden implementar colas, usando array_push y array_pop tenemos una
&lt;br /&gt;
pila mientras que usando las 4 instrucciones podemos manejar facilmente una cola doble.
&lt;br /&gt;
Funciones de sort
&lt;br /&gt;
PHP dispone de varias modalidades de sort para vectores, las funciones son:
&lt;br /&gt;
sort(array);
&lt;br /&gt;
Ordena un vector según los valores de sus elementos, si es un vector asociativo considera claves y valores
&lt;br /&gt;
como elementos comunes (no los distingue). Ordena en orden ascendiente.
&lt;br /&gt;
rsort(array);
&lt;br /&gt;
Idem anterior pero ordena en orden descendiente.
&lt;br /&gt;
asort(array);
&lt;br /&gt;
Ordena un vector según los valores de sus elementos pero manteniendo las asociaciones clave-valor. Ordena
&lt;br /&gt;
los pares ordenados clave-valor según “valor”
&lt;br /&gt;
arsort(array);
&lt;br /&gt;
Idem anterior pero en orden descendiente.
&lt;br /&gt;
ksort(array);
&lt;br /&gt;
Ordena un vector asociativo por los valores de sus “claves” teniendo en cuenta las asociaciones clave-valor.
&lt;br /&gt;
krsort(array);
&lt;br /&gt;
Idem anterior pero en orden descendiente.
&lt;br /&gt;
usort(array,funcion);
&lt;br /&gt;
Dado un array y una función de comparación ordena los “valores” del array usando la funcion provista para
&lt;br /&gt;
comparar elementos. La función debe recibir dos elementos y devolver 1 si el primero es mayor, -1 si el
&lt;br /&gt;
segundo es mayor o bien 0 si los elementos son iguales. Ejemplo:
&lt;br /&gt;
function cmp ($a, $b) {
&lt;br /&gt;
if ($a == $b) return 0;
&lt;br /&gt;
return ($a &amp;gt; $b) ? -1 : 1;
&lt;br /&gt;
}
&lt;br /&gt;
$a = array (3, 2, 5, 6, 1);
&lt;br /&gt;
usort ($a, cmp);
&lt;br /&gt;
uksort(array,funcion);
&lt;br /&gt;
Ordena un vector asociativo por “clave” usando para comparar las claves la función pasada como parámetro.
&lt;br /&gt;
uasort(array,funcion);
&lt;br /&gt;
Ordena un vector por los “valores” de sus elementos preservando la relación clave-valor de un array
&lt;br /&gt;
asociativo usando para ordenar la funcion provista por el usuario.
&lt;br /&gt;
Ejemplos:
&lt;br /&gt;
$vector=array(“d”=&amp;gt;”banana”, “a”=&amp;gt;”limon”,”c”=&amp;gt;”pera”, “b”=&amp;gt;”anana”);
&lt;br /&gt;
Función Resultado
&lt;br /&gt;
sort($vector) “a”,“anana”,”b”,”banana”,”c”,”d”,”limon”,”pera”
&lt;br /&gt;
rsort($vector) “pera”,”limon”,”d”,”c”,”banana”,”b”,”anana”,”a”
&lt;br /&gt;
asort($vector) “b”,”anana”,”d”,”banana”,”a”,”limon”,”c”,”pera”
&lt;br /&gt;
arsort($vector) “c”,”pera”,”a”,”limon”,”d”,”banana”,”b”,”anana”
&lt;br /&gt;
ksort($vector) “a”,”limon”,”b”,”anana”,”c”,”pera”,”d”,”banana”
&lt;br /&gt;
krsort($vector) “d”,”banana”,”c”,”pera”,”b”,”anana”,”a”,”limon”
&lt;br /&gt;
Funciones para manipular vectores:
&lt;br /&gt;
Padding:
&lt;br /&gt;
array=array_pad(array,pad_size,pad_value);
&lt;br /&gt;
Completa el array pasado con pad_value hasta que el vector tenga pad_size elementos, si pad_size es positivo
&lt;br /&gt;
completa agregando elementos hacia la derecha, si es negativo completa hacia la izquierda. El vector no es
&lt;br /&gt;
modificado, devuelve el vector resultado.
&lt;br /&gt;
$input = array (12, 10, 9);
&lt;br /&gt;
$result = array_pad ($input, 5, 0); // result is array (12, 10, 9, 0, 0)
&lt;br /&gt;
$result = array_pad ($input, -7, -1); // result is array (-1, -1, -1, -1, 12, 10, 9)
&lt;br /&gt;
$result = array_pad ($input, 2, &quot;noop&quot;); // not padded
&lt;br /&gt;
List:
&lt;br /&gt;
List en realidad no es una instrucción sino una construcción especial del lenguaje que permite asignar a un
&lt;br /&gt;
grupo de variables los elementos de un vector.
&lt;br /&gt;
Ejemplo:
&lt;br /&gt;
$vector=array(1,2);
&lt;br /&gt;
list($a,$b)=$vector; //$a=1, $b=2
&lt;br /&gt;
Si el vector tiene más elementos que las variables que se usan en list entonces el último elemento de list será
&lt;br /&gt;
un vector con todos los elementos que quedaban en el array (la asignación se hace de izquierda a derecha).
&lt;br /&gt;
Merge:
&lt;br /&gt;
array=array_merge(array1,array2,....);
&lt;br /&gt;
Si los vectores son asociativos hace un merge de los vectores en donde si 2 o más vectores tienen la misma
&lt;br /&gt;
clave sólo una queda en el vector resultado. Si los vectores no son asociativos (indexados por número)
&lt;br /&gt;
entonces el resultado tiene todos los elementos de los “n” vectores pasados concatenados.
&lt;br /&gt;
Sub-Vectores:
&lt;br /&gt;
array=array_slice(array,offset[,cantidad]);
&lt;br /&gt;
Devuelve un sub-vector del vector pasado a partir del offset indicado y con la cantidad de elementos indicada,
&lt;br /&gt;
si cantidad no se especifica devuelve todos los elementos desde offset hasta el fin del vector.
&lt;br /&gt;
$vec=array(10,6,7,8,23);
&lt;br /&gt;
$res=array_slice($vec,1,3); //deja en la variable $res 6,7,8
&lt;br /&gt;
Count:
&lt;br /&gt;
$cantidad=count($vector);
&lt;br /&gt;
Devuelve la cantidad de elementos de un vector.
&lt;br /&gt;
Splice:
&lt;br /&gt;
array=array_splice(array,offset,[cantidad,array_reemplazo]);
&lt;br /&gt;
Si array_reemplazo no se pasa como parámetro entonces elimina del vector pasado la cantidad de elementos
&lt;br /&gt;
indicada a partir del offset indicado, si array_reemplazo existe dichos elementos son reemplazados por
&lt;br /&gt;
aquellos del vector array_reemplazo.
&lt;br /&gt;
Si no se pasa cantidad se eliminan o reemplazan todos los elementos desde el offset indicado hasta el fin del
&lt;br /&gt;
vector.
&lt;br /&gt;
Shuffle:
&lt;br /&gt;
shuffle(array);
&lt;br /&gt;
Desordena en forma aleatoria los elementos de un vector.
&lt;br /&gt;
Pertenencia:
&lt;br /&gt;
Boolean = in_array(variable,array);
&lt;br /&gt;
Devuelve true/false según el elemento pasado pertenezca o no al vector.
&lt;br /&gt;
Range:
&lt;br /&gt;
array=range(low,high);
&lt;br /&gt;
Crea un vector con los números correspondientes desde low hasta high.
&lt;br /&gt;
Ejemplo:
&lt;br /&gt;
$vec=range(6,12); //$vec=(6,7,8,9,10,11,12);
&lt;br /&gt;
Reverse:
&lt;br /&gt;
array=array_reverse(array);
&lt;br /&gt;
Devuelve el vector revertido.
&lt;br /&gt;
Compact:
&lt;br /&gt;
array=compact(nombre_var1,nombre_var2,....,nombre_varn);
&lt;br /&gt;
Crea un vector asociativo con las variables y sus valores donde las claves son los nombres de las variables y
&lt;br /&gt;
los valores el contenido de las mismas.
&lt;br /&gt;
Ejemplo:
&lt;br /&gt;
$ciudad=”miami”;
&lt;br /&gt;
$edad=”23”;
&lt;br /&gt;
$vec=compact(“ciudad”,”edad”);
&lt;br /&gt;
Es equivalente a:
&lt;br /&gt;
$vec=array(“ciudad”=&amp;gt;”miami”,”edad”,”23”);
&lt;br /&gt;
Funcion Alfa:
&lt;br /&gt;
PHP soporta una función muy usada en programación funcional que es conocida como función alfa, en php se
&lt;br /&gt;
denomina array_walk y permite aplicar una función a todos y cada uno de los elementos de un vector. La
&lt;br /&gt;
sintaxis es:
&lt;br /&gt;
array_walk(array,funcion,variable_extra);
&lt;br /&gt;
variable_extra es opcional, se aplica la función pasada como parámetro a cada uno de los elementos del
&lt;br /&gt;
vector, la función recibirá como parámetro en primer lugar el “valor” del elemento del array y en segundo
&lt;br /&gt;
lugar la “clave”, si el vector no es asociativo la clave es el numero de índice (0,1,2...). Si se pasa
&lt;br /&gt;
variable_extra que puede ser cualquier tipo de PHP incluyendo un objeto la función recibe dicha variable
&lt;br /&gt;
como tercer parámetro.
&lt;br /&gt;
Funciones especiales para vectores asociativos:
&lt;br /&gt;
array=array_keys(array)
&lt;br /&gt;
Devuelve un vector con todas las claves de un vector asociativo.
&lt;br /&gt;
array=array_values(array)
&lt;br /&gt;
Devuelve un vector con todos los valores de un vector asociativo.
&lt;br /&gt;
Funciones para recorrer vectores:
&lt;br /&gt;
En PHP cada vector tiene asociado un puntero interno que apunta a un elemento del vector y que puede ser
&lt;br /&gt;
usado para recorrer vectores y otras operaciones, las funciones que operan con el puntero interno son:
&lt;br /&gt;
reset(array);
&lt;br /&gt;
Resetea el puntero interno al principio del array.
&lt;br /&gt;
end(array);
&lt;br /&gt;
Setea el puntero interno apuntando al último elemento del array
&lt;br /&gt;
next(array);
&lt;br /&gt;
Mueve el puntero al proximo elemento del array
&lt;br /&gt;
prev(array);
&lt;br /&gt;
Mueve el puntero al último elemento del array
&lt;br /&gt;
current(array);
&lt;br /&gt;
Devuelve el elemento apuntado actualmente por el puntero interno del array.
&lt;br /&gt;
key(array);
&lt;br /&gt;
Devuelve la clave (índice) del elemento apuntado actualmente por el puntero interno del array, si es un vector
&lt;br /&gt;
asociativo devuelve la clave del elemento actual. Si es un vector común devuelve el numero de índice del
&lt;br /&gt;
elemento actual.
&lt;br /&gt;
array=each(array)
&lt;br /&gt;
Devuelve un vector clave-valor con los valores correspondientes al elemento actual del array y además mueve
&lt;br /&gt;
el puntero al elemento siguiente, si es un vector asociativo devuelve clave-valor, si es un vector común
&lt;br /&gt;
devuelve indice-valor.
&lt;br /&gt;
Each suele usarse en conjunto con list para recorrer un vector:
&lt;br /&gt;
Ejemplo:
&lt;br /&gt;
while(list($clave,$valor)=each($vector)) {
&lt;br /&gt;
//Hacer algo
&lt;br /&gt;
}
&lt;br /&gt;
Capitulo 9: Manejo de Strings y expresiones regulares.
&lt;br /&gt;
A continuación se describe un resumen de las funciones mas importantes de PHP para manejo de strings.
&lt;br /&gt;
Mayúsculas y minúsculas:
&lt;br /&gt;
string=strtoupper(string);
&lt;br /&gt;
Pasa un string a mayúsculas.
&lt;br /&gt;
string=strtolower(string);
&lt;br /&gt;
Pasa un string a minúsculas.
&lt;br /&gt;
string=ucfirst(string);
&lt;br /&gt;
Pasa a mayúscula el primer carácter de un string
&lt;br /&gt;
string=ucwords(string);
&lt;br /&gt;
Pasa a mayúsculas el primer carácter de cada palabra de un string (separadas por blancos, tabulaciones y
&lt;br /&gt;
saltos de línea)
&lt;br /&gt;
Trimming:
&lt;br /&gt;
string=chop(string);
&lt;br /&gt;
Elimina blancos y saltos de línea a la derecha de un string dado.
&lt;br /&gt;
string=ltrim(string);
&lt;br /&gt;
Elimina blancos y saltos de línea a la izquierda de un string.
&lt;br /&gt;
string=trim(string);
&lt;br /&gt;
Elimina blancos y saltos de línea a derecha e izquierda de un string.
&lt;br /&gt;
Comparaciones:
&lt;br /&gt;
int=strpos(string1,string2);
&lt;br /&gt;
Devuelve la posición de la primera ocurrencia de string 2 dentro de string1.
&lt;br /&gt;
int=strspn(string1,string2);
&lt;br /&gt;
Devuelve la longitud en caracteres de s1 contando desde el principio hasta que aparece un caracter en s1 que
&lt;br /&gt;
no esta en s2.
&lt;br /&gt;
int=strcmp(string1,string2);
&lt;br /&gt;
Compara dos strings y devuelve 1, 0 o –1 según sea mayor el primero, iguales o el segundo.
&lt;br /&gt;
int=strcasecmp(string1,string2);
&lt;br /&gt;
Idem anterior pero case-insesitive (no distingue mayúsculas y minúsculas)
&lt;br /&gt;
int=strcspn(string1,string2);
&lt;br /&gt;
Devuelve la longitud de s1 desde el principio hasta que aparece un caracter que pertenece a s2.
&lt;br /&gt;
int=strstr(string1,string2);
&lt;br /&gt;
Devuelve todos los caracteres de s1 desde la primera ocurrencia de s2 hasta el final.
&lt;br /&gt;
int=stristr(string1,string2);
&lt;br /&gt;
Idem anterior pero case-insensitive (no distingue mayúsculas de minúsculas)
&lt;br /&gt;
int=similar_text(string1,string2,referencia);
&lt;br /&gt;
Analiza la semejanza entre dos strings, devuelve la cantidad de caracteres iguales en los dos strings, si se pasa
&lt;br /&gt;
como tercer parámetro una referencia a una variable devuelve en la misma el porcentaje de similitud entre
&lt;br /&gt;
ambos strings de acuerdo al algoritmo de Oliver (1993).
&lt;br /&gt;
Ejemplo:
&lt;br /&gt;
similar_text($st1,$st2,&amp;amp;$porcentaje);
&lt;br /&gt;
Funciones de Parsing:
&lt;br /&gt;
array=explode(separator,string);
&lt;br /&gt;
Devuelve un vector donde cada elemento del vector es un substring del string pasado particionado de acuerdo
&lt;br /&gt;
a un cierto caracter separador.
&lt;br /&gt;
Ejemplo:
&lt;br /&gt;
$st=”hola,mundo,como,estan”
&lt;br /&gt;
$vec=explode(“,”,$st); //$vec=(“hola”,”mundo”,”como”,”estan”);
&lt;br /&gt;
string=implode(separator,array);
&lt;br /&gt;
Genera un string concatenando todos los elementos del vector pasado e intercalando separator entre ellos.
&lt;br /&gt;
string=chunk_split(string,n,end);
&lt;br /&gt;
end es opcional y por default es “\r\n”, devuelve un string en donde cada “n” caracteres del string original se
&lt;br /&gt;
intercala el separador “end”.
&lt;br /&gt;
Ejemplo:
&lt;br /&gt;
$st=”hola mundo”;
&lt;br /&gt;
$st2=chunk_split($st,2,”,”);
&lt;br /&gt;
//$st2=”ho,la, m,un,do”;
&lt;br /&gt;
array=count_chars(string);
&lt;br /&gt;
Devuelve un vector de 256 posiciones donde cada posición del vector indica la cantidad de veces que el
&lt;br /&gt;
caracter de dicho orden aparece en el vector.
&lt;br /&gt;
string=nl2br(string);
&lt;br /&gt;
Devuelve un string en donde todos los saltos de línea se han reemplazado por el tag &amp;lt;BR&amp;gt; de html.
&lt;br /&gt;
string=strip_tags(string,string_tags_validos);
&lt;br /&gt;
Devuelve un string eliminando del string original todos los tags html, si se pasa el segundo parámetro
&lt;br /&gt;
opcional es posible especificar que tags no deben eliminarse (solo hace falta pasar los tags de apertura)
&lt;br /&gt;
ejemplo:
&lt;br /&gt;
$st2=strip_tags($st1,”&amp;lt;br&amp;gt; &amp;lt;table&amp;gt;”);
&lt;br /&gt;
Elimina todos los tags html de $st1 excepto &amp;lt;br&amp;gt; , &amp;lt;table&amp;gt; y &amp;lt;/table&amp;gt;
&lt;br /&gt;
string=metaphone(string);
&lt;br /&gt;
Devuelve una representación metafónica (similar a soundex) del string de acuerdo a las reglas de
&lt;br /&gt;
pronunciación del idioma ingles.
&lt;br /&gt;
string=strtok(separador,string);
&lt;br /&gt;
Dado un separador obtiene el primer “token” de un string, sucesivas llamadas a strtok pasando solamente el
&lt;br /&gt;
separador devuelven los tokens en forma sucesiva o bien falso cuando ya no hay mas tokens.
&lt;br /&gt;
Ejemplo:
&lt;br /&gt;
$tok=strtok($st,”/”);
&lt;br /&gt;
while($tok) {
&lt;br /&gt;
//Hacer algo
&lt;br /&gt;
$tok=strtok(“/”);
&lt;br /&gt;
}
&lt;br /&gt;
parse_string(string);
&lt;br /&gt;
Dado un string de la forma “nombre=valor&amp;amp;nombre2=valor2&amp;amp;nombre3=valor3”, setea las variables
&lt;br /&gt;
correspondientes con los valores indicados, ejemplo:
&lt;br /&gt;
parse_string(“v1=hola&amp;amp;v2=mundo”);
&lt;br /&gt;
//Seteta $v1=”hola” y $v2=”mundo”
&lt;br /&gt;
Codificación y decodificación ASCII.
&lt;br /&gt;
char=chr(int);
&lt;br /&gt;
Devuelve el caracter dado su número ascii.
&lt;br /&gt;
int=ord(char);
&lt;br /&gt;
Dado un caracter devuelve su código Ascii.
&lt;br /&gt;
Substrings:
&lt;br /&gt;
string=substr(string,offset,longitud);
&lt;br /&gt;
Devuelve el substring correspondiente al string pasado desde la posición indicada por offset y de la longitud
&lt;br /&gt;
indicada como tercer parámetro, si no se pasa el tercer parámetro se toman todos los caracteres hasta el final
&lt;br /&gt;
del string.
&lt;br /&gt;
string=substr_replace(string,string_reemplazo,offset, longitud);
&lt;br /&gt;
Idem anterior pero el substring seleccionado es reemplazado por string_reemplazo, si string_reemplazo es “”
&lt;br /&gt;
entonces sirve para eliminar una porción de un string.
&lt;br /&gt;
Búsquedas y Reemplazos.
&lt;br /&gt;
str_replace(string1,string2,string3);
&lt;br /&gt;
Reemplaza todas las ocurrencias de string1 en string3 por string2. Esta función no admite expresiones
&lt;br /&gt;
regulares como parámetros.
&lt;br /&gt;
string=strtr(string1,string_from,string_to);
&lt;br /&gt;
Reemplaza en string1 los caracteres en string_from por su equivalente en string_to (se supone que
&lt;br /&gt;
string_from y string_to son de la misma longitud, si no lo son los caracteres que sobran en el string mas largo
&lt;br /&gt;
se ignoran)
&lt;br /&gt;
Ejemplo:
&lt;br /&gt;
$st=”hola mundo”
&lt;br /&gt;
strtr($st,”aeiou”,”12345”);
&lt;br /&gt;
//$st=”h4la m5nd4”
&lt;br /&gt;
array=split(pattern,string);
&lt;br /&gt;
Idem a explode pero el separador puede ser ahora una expresión regular.
&lt;br /&gt;
boolean=ereg(pattern,string,regs);
&lt;br /&gt;
Devuelve true o false según si el string matchea o no una expresión regular dada, el tercer parámetro es
&lt;br /&gt;
opcional y debe ser el nombre de un vector en donde se devolverán los matches de cada paréntesis de la
&lt;br /&gt;
expresion regular si es que la misma tiene paréntesis.
&lt;br /&gt;
boolean=eregi(pattern,string,regs);
&lt;br /&gt;
Idem anterior pero case-insensitive.
&lt;br /&gt;
ereg_replace(pattern_from,string_to,string);
&lt;br /&gt;
Reemplaza todas las ocurrencias de una expresión regular en string por el contenido de string_to.
&lt;br /&gt;
eregi_replace(pattern_from,string_to,string);
&lt;br /&gt;
Idem anterior pero no considera mayúsculas y minúsculas para la búsqueda de la expresión regular en el
&lt;br /&gt;
string.
&lt;br /&gt;
Sintaxis básica de una expresión regular:
&lt;br /&gt;
Los símbolos especiales “^” y “$” se usan para matchear el principio y el final de un string respectivamente.
&lt;br /&gt;
Por ejemplo:
&lt;br /&gt;
“^el” Matchea strings que empiezan con “el”
&lt;br /&gt;
“colorin colorado$” Matchea strings que terminan en “colorin colorado”
&lt;br /&gt;
“^abc$” String que empieza y termina en abc, es decir solo “abc” matchea
&lt;br /&gt;
“abc” Un string que contiene “abc” por ejemplo “abc” ,”gfabc”, “algoabcfgeh”, etc...
&lt;br /&gt;
Los símbolos “*” , “+” y “?” denotan la cantidad de veces que un caracter o una secuencia de caracteres
&lt;br /&gt;
puede ocurrir. Y denotan 0 o más, una o más y cero o una ocurrencias respectivamente.
&lt;br /&gt;
Por ejemplo:
&lt;br /&gt;
“ab*” Matchea strings que contienen una “a” seguida de cero o mas “b”
&lt;br /&gt;
Ej: “a”, “ab”, “cabbbb”, etc
&lt;br /&gt;
“ab+” Matchea strings que contienen una “a” seguida de una o mas “b”
&lt;br /&gt;
“ab?” Matchea strings que contienen una “a” seguida o no de una “b” pero no mas de 1.
&lt;br /&gt;
“a?b+$” Matchea “a” seguida de una o mas “b” terminando el string.
&lt;br /&gt;
Para indicar rangos de ocurrencias distintas pueden especificarse la cantidad máxima y mínima de
&lt;br /&gt;
ocurrencias usando llaves de la forma {min,max}
&lt;br /&gt;
“ab{2}” Una “a” seguida de exactamente 2 “b”
&lt;br /&gt;
“ab{2,}” Una “a” seguida de 2 o mas “b”
&lt;br /&gt;
“ab{3,5}” Una “a” seguida de 3 a 5 “b” (“abbb”, “abbbb”, ”abbbbb”)
&lt;br /&gt;
Es obligatorio especificar el primer número del rango pero no el segundo. De esta forma
&lt;br /&gt;
+ equivale a {1,}. * equivale a {0,} y ? equivale a {0,1}
&lt;br /&gt;
Para cuantificar una secuencia de caracteres basta con ponerla entre paréntesis.
&lt;br /&gt;
“a(bc)*” Matchea una “a” seguida de cero o mas ocurrencias de “bc” ej: “abcbcbc”
&lt;br /&gt;
El símbolo “|” funciona como operador “or”
&lt;br /&gt;
“hola|Hola” Matchea strings que contienen “hola” u “Hola”
&lt;br /&gt;
“(b|cd)ef” Strings que contienen “bef” o “cdef”
&lt;br /&gt;
“(a|b)*c” Secuencias de “a” o “b” y que termina en “c”
&lt;br /&gt;
El carácter “.” matchea a cualquier otro caracter.
&lt;br /&gt;
“a.[0-9]” Matchea “a” seguido de cualquier caracter y un dígito.
&lt;br /&gt;
“^.{3}$” Cualquier string de exactamente 3 caracteres.
&lt;br /&gt;
Los corchetes se usan para indicar que caracteres son validos en una posición única del string.
&lt;br /&gt;
“[ab]” Matchea strings que contienen “a” o “b”
&lt;br /&gt;
“[a-d]” Matchea strings que contienen “a”, “b” , “c” o “d”
&lt;br /&gt;
“^[a-zA-Z]” Strings que comienzan con una letra.
&lt;br /&gt;
“[0-9]%” Un dígito seguido de un signo %
&lt;br /&gt;
También puede usarse una lista de caracteres que no se desean agregando el símbolo “^” dentro de los
&lt;br /&gt;
corchetes, no confundir con “^” afuera de los corchetes que matchea el principio de línea.
&lt;br /&gt;
“[^abg]” Strings que NO contienen “a” , “b” o “g”
&lt;br /&gt;
“[^0-9]” Strings que no contienen dígitos
&lt;br /&gt;
Los caracteres “^.[$()|*+?{\” deben escaparse si forman parte de lo que se quiere buscar con una barra
&lt;br /&gt;
invertida adelante. Esto no es válido dentro de los corchetes donde todos los caracteres no tienen significado
&lt;br /&gt;
especial.
&lt;br /&gt;
Ejemplos:
&lt;br /&gt;
Validar una suma monetaria en formato: “10000.00”, “10,000.00” .,“10000” o “10,000” es decir con o sin
&lt;br /&gt;
centavos y con o sin una coma separando tres dígitos.
&lt;br /&gt;
^[1-9][0-9]*$
&lt;br /&gt;
Esto valida cualquier número que no empieza con cero, lo malo es que “0” no pasa el test. Entonces:
&lt;br /&gt;
^(0|[1-9][0-9]*)$
&lt;br /&gt;
Un cero o cualquier número que no empieza con cero. Aceptemos también un posible signo menos delante.
&lt;br /&gt;
^(0|-?[1-9][0-9]*)$
&lt;br /&gt;
O sea cero o cualquier número con un posible signo “-“ delante.
&lt;br /&gt;
En realidad podemos admitir que un número empiece con cero para una cantidad monetaria y supongamos
&lt;br /&gt;
que el signo “-“ no tiene sentido, agreguemos la posibilidad de decimales:
&lt;br /&gt;
^[0-9]+(\.[0-9]+)?$
&lt;br /&gt;
Si viene un “.” debe esta seguido de un dígito, 10 es válido pero “10.” no
&lt;br /&gt;
Especifiquemos uno o dos dígitos decimales:
&lt;br /&gt;
^[0-9]+(\.[0-9]{1,2})?$
&lt;br /&gt;
Ahora tenemos que agregar las comas para separar de a miles.
&lt;br /&gt;
^[0-9]{1,3}(,[0-9]{3})*(\.[0-9]{1,2})?$
&lt;br /&gt;
O sea un conjunto de 1 a 3 dígitos seguido de uno más conjuntos de “,” seguido de tres dígitos. Ahora
&lt;br /&gt;
hagamos que la coma sea opcional.
&lt;br /&gt;
^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(\.[0-9]{1,2})?$
&lt;br /&gt;
Y de esta forma podemos validar números con los 4 formatos validos en una sola expresión.
&lt;br /&gt;
Capítulo 10: Generación dinámica de imágenes.
&lt;br /&gt;
PHP provee la posibilidad de generar imágenes dinámicamente y de incluir estas imágenes en una página
&lt;br /&gt;
web, esto se hace utilizando funciones de una biblioteca denominada “GD” que viene compilada en forma
&lt;br /&gt;
default en php4, según la versión de GD la biblioteca permita generar imágenes GIF o PNG.
&lt;br /&gt;
Una vez generada dinámicamente la imagen es posible transmitirla directamente al browser o guardarla en
&lt;br /&gt;
disco para luego levantarla usando un tag &amp;lt;IMG&amp;gt; de html.
&lt;br /&gt;
Creación de una Imagen.
&lt;br /&gt;
image_handler=ImageCreate($x,$y);
&lt;br /&gt;
Crea una Imagen de tamaño X por Y pixels y devuelve un handler a la imagen en $IM (se maneja el handler a
&lt;br /&gt;
la imagen en el resto de las funciones que manipulan la imagen, como si fuera un archivo).
&lt;br /&gt;
Una vez creada la imagen PHP provee funciones para dibujar rectángulos, arcos, texto y demás elementos en
&lt;br /&gt;
la imagen:
&lt;br /&gt;
Otras variantes para crear una imagen consisten en crear la imagen a partir de una imagen existente en el
&lt;br /&gt;
disco de forma tal de poder modificarla:
&lt;br /&gt;
int=imagecreatefromgif(path);
&lt;br /&gt;
int=imagecreatefrompng(path);
&lt;br /&gt;
int=imagecreatefromjpg(path);
&lt;br /&gt;
Al igual que ImageCreate estas funciones devuelven un ImageHandler.
&lt;br /&gt;
Creación y alocación de colores.
&lt;br /&gt;
Para utilizar colores en una imagen es necesario en primer lugar crear el color y alocarlo en la imagen, esto se
&lt;br /&gt;
hace con ImageColorAllocate de la siguiente forma:
&lt;br /&gt;
color_handler=ImageColorAllocate(image_handler,int_rojo,int_verde,int_azul);
&lt;br /&gt;
La función recibe una image_handler en donde alocar el color y los valores decimales de la cantidad de rojo,
&lt;br /&gt;
verde y azul del color (0 a 255), devuelve un color_handler que puede ser usado en cualquiera de las
&lt;br /&gt;
funciones que veremos a continuación y utilizan colores.
&lt;br /&gt;
Funciones para creación de objetos en la imagen.
&lt;br /&gt;
ImageRectangle(image_handler, x1,y1,x2,y2,color_handler);
&lt;br /&gt;
Dibuja un rectángulo desde la coordenada x1,y1 (0,0 es la esquina superior izquierda de la imagen) hasta la
&lt;br /&gt;
coordenada x2,y2 del color indicado por color_handler (previamente alocado con ImageColorAllocate).
&lt;br /&gt;
ImageFilledRectangle(image_handler, x1,y1,x2,y2,color_handler);
&lt;br /&gt;
Idem anterior pero dibuja el rectángulo relleno con el color indicado.
&lt;br /&gt;
int imagearc (image_handler, cx, cy, ancho, alto, angulo_comienzo, angulo_fin, color_handler)
&lt;br /&gt;
Dibuja un arco de elipse centrado en cx,cy con el ancho y alto especificado (sin son iguales la elipse es una
&lt;br /&gt;
circunferencia) y desde el ángulo de comienzo al ángulo de fin (en grados 0 a 360). El arco se dibuja con el
&lt;br /&gt;
color indicado.
&lt;br /&gt;
ImageDashedLine(image_handler, x1,y1,x2,y2,color_handler);
&lt;br /&gt;
Dibuja una línea puntuada entre las coordenadas especificadas y con el color indicado.
&lt;br /&gt;
ImageFill(image_handler,x,y,color_handler);
&lt;br /&gt;
Pinta con el color indicado a partir de la coordenada x,y y con el color indicado, llena con el color indicado.
&lt;br /&gt;
ImagePolygon(image_handler,array_puntos,cantidad_puntos,color_handler);
&lt;br /&gt;
Dibuja un polígono usando un vector de puntos de la forma (x0,y0,x1,y1,x2,y2,....etc) el parámetro
&lt;br /&gt;
cantidad_puntos indica cuantos puntos considerar para crear el polígono.
&lt;br /&gt;
ImageFilledPolygon(image_handler,array_puntos,cantidad_puntos,color_handler);
&lt;br /&gt;
Idem anterior pero el polígono además se rellena con el color indicado.
&lt;br /&gt;
ImageLine(image_handler, x1,y1,x2,y2,color_handler);
&lt;br /&gt;
Dibuja una línea desde x1,y2 hasta x2,y2 con el color indicado.
&lt;br /&gt;
Manejo de Colores:
&lt;br /&gt;
color_handler=ImageColorAt(iamge_handler,x,y);
&lt;br /&gt;
Devuelve el color handler correspondiente al color del pixel especificado.
&lt;br /&gt;
color_handler=imagecolorclosest (image_handler, int_rojo,int_verde, int_azul)
&lt;br /&gt;
Devuelve el color alocado más cercano al color indicado en RGB por las cantidades de rojo, verde y azul (en
&lt;br /&gt;
decimal)
&lt;br /&gt;
color_handler=imagecolorexact (image_handler, int_rojo,int_verde, int_azul)
&lt;br /&gt;
Idem anterior pero devuelve el color_handler del color pasado si el color no esta alocado en la imagen
&lt;br /&gt;
devuelve –1.
&lt;br /&gt;
color_handler=imagecolorresolve (image_handler, int_rojo,int_verde, int_azul)
&lt;br /&gt;
Es una mezcla de las dos anteriores, esta función siempre devuelve un color_handler, o bien el color exacto
&lt;br /&gt;
alocado en la imagen o bien el color más cercano.
&lt;br /&gt;
int=ImageColorsTotal(image_handler)
&lt;br /&gt;
Devuelve la cantidad total de colores de la imagen.
&lt;br /&gt;
imagecolortransparent(image_handler,color_handler)
&lt;br /&gt;
Setea el color indicado por el handler como transparente para la imagen.
&lt;br /&gt;
ImageCopy (image_handler_dest,image_handler_origen,x_dest, y_dest, origen_x,origen_y, ancho,alto)
&lt;br /&gt;
Copia una porción de imagen desde la coordenada origen_x, origen_y con el ancho y alto especificado desde
&lt;br /&gt;
image_handler_origen hacia image_handler_dest en la coordenada x_dest, y_dest.
&lt;br /&gt;
imagecopyresized (image_handler_dest, image_handler_origen,dest_x,dest_y,origen_x,origen_y,dest_ancho,
&lt;br /&gt;
dest_alto, origen_ancho, origen_alto)
&lt;br /&gt;
Copia con opción de achicar o agrandar una porción de la imagen hay que especificar la imagen origen, la
&lt;br /&gt;
imagen destino, la coordenada desde donde copiar en la imagen origen, la coordenada a donde copiar en la
&lt;br /&gt;
imagen destino, y el ancho y alto tanto en el origen como en el destino.
&lt;br /&gt;
Manejo de texto.
&lt;br /&gt;
imagestring(image_handler,font_number, x, y, string, color_handler)
&lt;br /&gt;
Coloca un string en la imagen, si font=0 se usa el font default, si font es 1,2,3,4, o 5 se usa un font
&lt;br /&gt;
predefinido.X e Y son las coordenadas donde dibujar el string y especifican la esquina superior izquierda del
&lt;br /&gt;
string.
&lt;br /&gt;
imagestringup(image_handler,font_number, x, y, string, color_handler)
&lt;br /&gt;
Idem anterior pero el string se dibuja en forma vertical.
&lt;br /&gt;
array imagettftext (image_handler,size, angulo,x, y, color_handler, font_path, string)
&lt;br /&gt;
Dibuja un string en la imagen usando un font treu-type, el font en formato nombre.ttf debe guardarse en algún
&lt;br /&gt;
lugar del file-system que se especifica con font_path (ej.: /fonts/arial.ttf). X e Y son las coordenadas de la
&lt;br /&gt;
esquina inferior izquierda del string. Angulo es el ángulo con el cual se dibuja el string (0=de izquierda a
&lt;br /&gt;
derecha en forma horizontal). Size indica el tamaño en puntos del texto a usar. Devuelve un vector de 8
&lt;br /&gt;
elementos representando los 4 puntos que delimitan al string de la forma:
&lt;br /&gt;
izquierda_arriba, derecha_arriba, abajo_izquierda, abajo_derecha. (cada esquina esta representada por dos
&lt;br /&gt;
coordenadas: x e y)
&lt;br /&gt;
array imagettfbbox (size, ángulo, font_path, string )
&lt;br /&gt;
Determina el tamaño que ocupara el string en la imagen y devuelve un vector de 8 elementos con el mismo
&lt;br /&gt;
formato descripto en la función anterior.
&lt;br /&gt;
Generación de la Imagen.
&lt;br /&gt;
ImageInterlace(image_handler,boolean)
&lt;br /&gt;
Determina si la imagen será interlazada o no 1=interlazada, 0=no interlazada.
&lt;br /&gt;
imagegif (image_handler, path)
&lt;br /&gt;
Dado un image_handler genera un archivo gif con la imagen correspondiente, el archivo puede luego incluirse
&lt;br /&gt;
con un tag &amp;lt;IMG&amp;gt; para mostrarse en una página.
&lt;br /&gt;
Si no es necesario almacenar la imagen es posible llamar a imagegif de la forma:
&lt;br /&gt;
imagegif (image_handler)
&lt;br /&gt;
En cuyo caso la imagen generada es transmitida directamente al browser, para ello antes es necesario enviar al
&lt;br /&gt;
browser un header indicando que se va a recibir un gif.
&lt;br /&gt;
Ejemplo:
&lt;br /&gt;
header(&quot;Content-Type: image/gif&quot;);
&lt;br /&gt;
ImageGIF($IM);
&lt;br /&gt;
Ejemplo 1:
&lt;br /&gt;
&amp;lt;?php
&lt;br /&gt;
Header (&quot;Content-type: image/gif&quot;);
&lt;br /&gt;
$im = imagecreate (400, 30);
&lt;br /&gt;
$black = ImageColorAllocate ($im, 0, 0, 0);
&lt;br /&gt;
$white = ImageColorAllocate ($im, 255, 255, 255);
&lt;br /&gt;
ImageTTFText ($im, 20, 0, 10, 20, $white, &quot;/path/arial.ttf&quot;,&quot;Testing...
&lt;br /&gt;
Omega: &amp;#937;&quot;);
&lt;br /&gt;
ImageGif ($im);
&lt;br /&gt;
ImageDestroy ($im);
&lt;br /&gt;
?&amp;gt;
&lt;br /&gt;
Este ejemplo genera un gif con un texto usando un font true-type y lo transmite directamente al browser. Es
&lt;br /&gt;
importante que antes y después de los tags &amp;lt;? y ?&amp;gt; no existan espacios en blanco o saltos de línea ya que en
&lt;br /&gt;
ese caso PHP transmitirá al browser estos caracteres y la imagen recibida se vera rota, o sea que debe
&lt;br /&gt;
asegurarse que lo único que recibe el browser es el código de la imagen.
&lt;br /&gt;
Ejemplo 2:
&lt;br /&gt;
El siguiente script recibe como parámetros un tamaño x (x), un tamaño y (y), un porcentaje (per), un color de
&lt;br /&gt;
fondo (bg), un color de frente (fg) y dibuja una barra de porcentaje con el porcentaje indicado. Los colores se
&lt;br /&gt;
pasan en hexadecimal. Si no se indica algún parámetro se toman valores default.
&lt;br /&gt;
&amp;lt;?
&lt;br /&gt;
//Parámetros:
&lt;br /&gt;
//Tamaño x, tamaño y, porcentaje de la barra,
&lt;br /&gt;
//colores ( en notación #FFFFFF)
&lt;br /&gt;
//En las variables: $x,$y,$per,$bg,$fg
&lt;br /&gt;
if(!isset($x)){$x=140;}
&lt;br /&gt;
if(!isset($y)){$y=20;}
&lt;br /&gt;
if(!isset($per)){$per=75;}
&lt;br /&gt;
if(!isset($bg)){$bg=&quot;#FF0000&quot;;}
&lt;br /&gt;
if(!isset($fg)){$fg=&quot;#0000FF&quot;;}
&lt;br /&gt;
$rb=base_convert(substr($bg,1,2),16,10);
&lt;br /&gt;
$gb=base_convert(substr($bg,3,2),16,10);
&lt;br /&gt;
$bb=base_convert(substr($bg,5,2),16,10);
&lt;br /&gt;
$rf=base_convert(substr($fg,1,2),16,10);
&lt;br /&gt;
$gf=base_convert(substr($fg,3,2),16,10);
&lt;br /&gt;
$bf=base_convert(substr($fg,5,2),16,10);
&lt;br /&gt;
$xp=round(($per/100)*$x);
&lt;br /&gt;
$IM=ImageCreate($x,$y);
&lt;br /&gt;
$colbg=ImageColorAllocate($IM,$rb,$gb,$bb);
&lt;br /&gt;
$colfg=ImageColorAllocate($IM,$rf,$gf,$bf);
&lt;br /&gt;
//$f=ImageLoadFont(&quot;fonts/ARIAL.TTF&quot;);
&lt;br /&gt;
$blanco=ImageColorAllocate($IM,255,255,255);
&lt;br /&gt;
ImageFilledRectangle($IM,0,0,$x,$y,$colbg);
&lt;br /&gt;
ImageFilledRectangle($IM,0,0,$xp,$y,$colfg);
&lt;br /&gt;
ImageString($IM,0,5,5,&quot;$per%&quot;,$blanco);
&lt;br /&gt;
header(&quot;Content-Type: image/gif&quot;);
&lt;br /&gt;
ImageGIF($IM);
&lt;br /&gt;
?&amp;gt;
&lt;br /&gt;
La forma de llamar al script es por ejemplo:
&lt;br /&gt;
&amp;lt;IMG src=”barra.php?x=200&amp;amp;y=30&amp;amp;per=65&amp;amp;bg=#FF4356&amp;amp;fg=#456890”&amp;gt;
&lt;br /&gt;
Y el resultado es:
&lt;br /&gt;
Como puede verse la llamada es mediante un tag &amp;lt;IMG&amp;gt; con la salvedad de que la imagen que se llama no
&lt;br /&gt;
existe en el disco sino que es un script php que genera dinámicamente la imagen y la entrega al browser.
&lt;br /&gt;
Utilizando estas funciones de PHP es posible crear gráficos estadísticos en función de datos de la base,
&lt;br /&gt;
modificar imágenes agregando texto, sobreimpresos y realizar varios efectos en función de datos ingresados
&lt;br /&gt;
por el usuario como por ejemplo mapas dinámicos, gráficos de torta, etc...
&lt;br /&gt;

&lt;br /&gt;
Capítulo 11: Manejo de fechas
&lt;br /&gt;
PHP provee varias funciones para manipulación, validación y formateo de fechas, el formato interno para
&lt;br /&gt;
representar una fecha en PHP es el usado por Unix o sea una cantidad de segundos a partir de una fecha
&lt;br /&gt;
definida como EPOCH. Las funciones más importantes son las que describimos a continuación:
&lt;br /&gt;
Date:
&lt;br /&gt;
string=date(string_formato,time);
&lt;br /&gt;
El segundo parámetro es opcional, si se pasa debe ser una fecha en formato de representación interna, si no se
&lt;br /&gt;
pasa se toma como fecha la fecha actual. El formato es un string de formato libre en el cual ciertos caracteres
&lt;br /&gt;
tienen un significado especial y son reemplazados por ciertos valores:
&lt;br /&gt;
· a - &quot;am&quot; o &quot;pm&quot;
&lt;br /&gt;
· A - &quot;AM&quot; o &quot;PM&quot;
&lt;br /&gt;
· d – día del mes en dos dígitos con cero adelante si es necesario
&lt;br /&gt;
· D – día de la semana en ingles en formato de tres letras Ej: “fri”
&lt;br /&gt;
· F – Nombre del mes en ingles Ej: “January”
&lt;br /&gt;
· h – Hora en formato de 12 horas: 01 a 12
&lt;br /&gt;
· H – Hora en formato de 24 horas: 00 a 23
&lt;br /&gt;
· g – Hora en formato de 12 horas sin ceros adelante: 1 a 12
&lt;br /&gt;
· G – Hora en formato de 24 horas sinc ceros adelante: 0 a 23
&lt;br /&gt;
· i – Minutos en dos dígitos: 00 a 59
&lt;br /&gt;
· j – día del mes sin ceros adelante: 1 a 12
&lt;br /&gt;
· l - día de la semana en ingles completo Ej: “Friday”
&lt;br /&gt;
· L – Boolean que indica si el año es bisiesto (true=es, false=no)
&lt;br /&gt;
· m – Número de mes 01 a 12
&lt;br /&gt;
· n – Número de mes sin ceros adelante 1 a 12
&lt;br /&gt;
· M – Nombre del mes en ingles en tres letras Ej: “Jan”
&lt;br /&gt;
· s – Segundos 00 a 59
&lt;br /&gt;
· S – Sufijo ordinal en ingles para el número de día (th,nd,st)
&lt;br /&gt;
· t – Número de días para el mes actual 1 a 31
&lt;br /&gt;
· U – Segundos pasados desde EPOCH (formato de representación interno)
&lt;br /&gt;
· w – día de la semana en formato numérico (0=domingo)
&lt;br /&gt;
· Y – Año en 4 dígitos
&lt;br /&gt;
· y – Año en 2 dígitos
&lt;br /&gt;
· z – Día del año 1 a 365
&lt;br /&gt;
Ejemplo:
&lt;br /&gt;
date(“Hoy es d/m/Y y la hora es: H:i:s”)
&lt;br /&gt;
Queda algo de la forma “Hoy es 10/05/2000 y la hora es 15:06:29”
&lt;br /&gt;
Para obtener la representación interna de una fecha dado el día, mes, año, horas, minutos y segundos se usa la
&lt;br /&gt;
función mktime:
&lt;br /&gt;
int=mktime (hora, minutos, segundos, mes, día, año)
&lt;br /&gt;
Devuelve la cantidad de segundos pasados desde el epoch, luego puede usarse este valor devuelto como
&lt;br /&gt;
segundo parámetro de “Date” para formatear la fecha en el formato que se desee.
&lt;br /&gt;
Otras funciones:
&lt;br /&gt;
boolean=checkdate(mes, día, año)
&lt;br /&gt;
string=microtime()
&lt;br /&gt;
Devuelve una representación de la hora actual incluyendo microsegundos, el string que devuelve tiene el
&lt;br /&gt;
formato “microsegundos segundos” y luego puede hacerse un explode del mismo tomando el espacio como
&lt;br /&gt;
separador para obtener los microsegundos.
&lt;br /&gt;
La siguiente clase implementa timers con precisión de microsegundos que pueden usarse para medir
&lt;br /&gt;
duraciones de tiempo con gran precisión, lo cual es útil por ejemplo para realizar un “profile” de un script en
&lt;br /&gt;
php4 midiendo la duración de distintas partes del mismo (consultas a la base de datos, etc...)
&lt;br /&gt;
// start('name') inicializa el timer con o sin nombre.
&lt;br /&gt;
// stop('name') para el timer
&lt;br /&gt;
// current('name') para el timer y devuelve el tiempo transcurrido
&lt;br /&gt;
//
&lt;br /&gt;
class Timer {
&lt;br /&gt;
var $ss_timing_start_times;
&lt;br /&gt;
var $ss_timing_stop_times;
&lt;br /&gt;
function start($name='default'){
&lt;br /&gt;
$this-&amp;gt;ss_timing_start_times[$name]=explode(' ',microtime());
&lt;br /&gt;
}
&lt;br /&gt;
function stop($name='default'){
&lt;br /&gt;
$this-&amp;gt;ss_timing_stop_times[$name]=explode(' ',microtime());
&lt;br /&gt;
}
&lt;br /&gt;
function current($name='default') {
&lt;br /&gt;
if(!isset($this-&amp;gt;ss_timing_start_times[$name])){
&lt;br /&gt;
return 0;
&lt;br /&gt;
}
&lt;br /&gt;
if(!isset($this-&amp;gt;ss_timing_stop_times[$name])){
&lt;br /&gt;
$stop_time=explode(' ',microtime());
&lt;br /&gt;
} else {
&lt;br /&gt;
$stop_time=$this-&amp;gt;ss_timing_stop_times[$name];
&lt;br /&gt;
}
&lt;br /&gt;
$current=$stop_time[1]-$this-&amp;gt;ss_timing_start_times[$name][1];
&lt;br /&gt;
$current+=$stop_time[0]-$this-&amp;gt;ss_timing_start_times[$name][0];
&lt;br /&gt;
return $current;
&lt;br /&gt;
}
&lt;br /&gt;
}
&lt;br /&gt;
?&amp;gt;
&lt;br /&gt;
Ejemplo de uso:
&lt;br /&gt;
$tim=new Timer();
&lt;br /&gt;
$tim-&amp;gt;start();
&lt;br /&gt;
//codigo.
&lt;br /&gt;
$tiempo=$tim-&amp;gt;current();
&lt;br /&gt;
Si se quieren usar múltiples timers simultáneos puede pasarse un “nombre” de timer a las funciones start, stop
&lt;br /&gt;
y current para diferenciar distintos timers y usarlos en forma independiente.
&lt;br /&gt;
Capítulo 12: Archivos DBM
&lt;br /&gt;
El formato DBM de archivos permite implementar una pseudo base de datos usando archivos planos, el
&lt;br /&gt;
formato que es standard tiene la ventaja de que los archivos DBM creados pueden ser fácilmente compartidos
&lt;br /&gt;
por otras aplicaciones que soporten el formato DBM (por ejemplo “C”, “Perl”,”Python” y otros lenguajes
&lt;br /&gt;
tienen bibliotecas para manipular DBMs).
&lt;br /&gt;
Básicamente una archivo DBM es un archivo común en el cual mediante un formato interno es posible
&lt;br /&gt;
almacenar pares de tipo “clave”-“valor”. En palabras mas simples cada archivo DBM puede verse como una
&lt;br /&gt;
tabla de solo 2 columnas de una base de datos.
&lt;br /&gt;
Las funciones de PHP para manejo de archivos DBM son:
&lt;br /&gt;
dbm_handler=dbmopen(path,modo);
&lt;br /&gt;
Abre un archivo dbm cuyo path recibe como parámetro, devuelve un handler al archivo (a ser usado por las
&lt;br /&gt;
demás funciones de dbm). Modo puede ser:
&lt;br /&gt;
· “r” – Lectura solamente
&lt;br /&gt;
· “w” – Lectura – escritura
&lt;br /&gt;
· “n” – Lectura escritura, si existe el archivo lo trunca, si no existe lo crea
&lt;br /&gt;
· “c” – Lectura escritura, si existe lo usa, si no existe lo crea
&lt;br /&gt;
boolean=dbmexists(dbm_handler, clave);
&lt;br /&gt;
Devuelve true/false según una clave exista o no en un archivo dbm.
&lt;br /&gt;
boolean=dbminsert(dbm_handler,clave,valor);
&lt;br /&gt;
Devuelve 0 si el insert fue exitoso (false!), 1 si la clave ya existía y –1 si no se puede escribir en el archivo.
&lt;br /&gt;
string=dbmfetch(dbm_handler, clave);
&lt;br /&gt;
Devuelve el valor asociado con la clave pasada, es conveniente antes usar dbmexists para chequear que la
&lt;br /&gt;
clave exista en el archivo dbm.
&lt;br /&gt;
dbmreplace(dbm_handler, clave, valor);
&lt;br /&gt;
Si la clave ya existe reemplaza su valor en el archivo dbm por el valor pasado, si la clave no existe la crea
&lt;br /&gt;
con el valor pasado. (Funciona como un insert que no da error si la clave ya existe)
&lt;br /&gt;
boolean=dbmdelete(dbm_handler, clave);
&lt;br /&gt;
Elimina un registro “clave”-“valor” de un archivo dbm. Devuelve falso si la clave no existía en el archivo
&lt;br /&gt;
DBM.
&lt;br /&gt;
string=dbmfirstkey(dbm_handler);
&lt;br /&gt;
Devuelve la primera clave de un archivo dbm.
&lt;br /&gt;
string=dbmnextkey(dbm_handler);
&lt;br /&gt;
Devuelve la próxima clave de un archivo dbm, en conjunto con dbmfirstkey puede usarse para recorrer todos
&lt;br /&gt;
los registros de un archivo dbm. Devuelve falso cuando no quedan más registros en el archivo.
&lt;br /&gt;
Capítulo 13: Funciones matemáticas.
&lt;br /&gt;
Constantes predefinidas:
&lt;br /&gt;
Tabla 1. Constantes Matemáticas
&lt;br /&gt;
Constante Valor Descripción
&lt;br /&gt;
M_PI 3.14159265358979323846 Pi
&lt;br /&gt;
M_E 2.7182818284590452354 e
&lt;br /&gt;
M_LOG2E 1.4426950408889634074 log_2 e
&lt;br /&gt;
M_LOG10E 0.43429448190325182765 log_10 e
&lt;br /&gt;
M_LN2 0.69314718055994530942 log_e 2
&lt;br /&gt;
M_LN10 2.30258509299404568402 log_e 10
&lt;br /&gt;
M_PI_2 1.57079632679489661923 pi/2
&lt;br /&gt;
M_PI_4 0.78539816339744830962 pi/4
&lt;br /&gt;
M_1_PI 0.31830988618379067154 1/pi
&lt;br /&gt;
M_2_PI 0.63661977236758134308 2/pi
&lt;br /&gt;
M_2_SQRTPI 1.12837916709551257390 2/sqrt(pi)
&lt;br /&gt;
M_SQRT2 1.41421356237309504880 sqrt(2)
&lt;br /&gt;
M_SQRT1_2 0.70710678118654752440 1/sqrt(2)
&lt;br /&gt;
Funciones:
&lt;br /&gt;
Función Descripción
&lt;br /&gt;
var=abs(var); Valor absoluto.
&lt;br /&gt;
var=acos(var); Arco coseno
&lt;br /&gt;
var=atan(var); Arco tangente
&lt;br /&gt;
var=asin(var); Arco seno
&lt;br /&gt;
string=base_convert(string,base_from,base_to); Realiza el pasaje de base correspondiente
&lt;br /&gt;
var=bindec(string_binario); Pasa de base 2 a decimal
&lt;br /&gt;
int=ceil(float); Redondea hacia arriba un número decimal (función
&lt;br /&gt;
techo)
&lt;br /&gt;
var=cos(var); Coseno
&lt;br /&gt;
string=decbin(var); Pasa de base 10 a base 2
&lt;br /&gt;
string=dechex(var); Pasa de base 10 a hexadecimal.
&lt;br /&gt;
string=decoct(var)l Pasa de base 10 a octal
&lt;br /&gt;
var=deg2rad(var); Pasa de grados (degrees) a radianes
&lt;br /&gt;
var=exp(var); Devuelve e^var (función exponencial)
&lt;br /&gt;
var=floor(var); Redondea un número decimal hacia abajo (función
&lt;br /&gt;
piso)
&lt;br /&gt;
var=hexdec(string); Pasa de hexadecimal a base 10
&lt;br /&gt;
var=log(var); Logaritmo natural (base e)
&lt;br /&gt;
var=log10(var); Logaritmo en base 10
&lt;br /&gt;
var=octdec(string); Pasa de octal a base 10
&lt;br /&gt;
var=max(array); Devuelve el elemento máximo de un vector
&lt;br /&gt;
var=max(var1,var2,...,varn); Devuelve el elemento máximo
&lt;br /&gt;
var=min(array); Devuelve el elemento mínimo de un vector
&lt;br /&gt;
var=min(var1,var2,.....,varn); Devuelve el elemento mínimo
&lt;br /&gt;
var=pow(base,exponente); Devuelve base^exponente
&lt;br /&gt;
var=rad2deg(var); Convierte radianes en grados (degrees)
&lt;br /&gt;
var=round(var); Redondea un número no entero a su valor entero más
&lt;br /&gt;
cercano
&lt;br /&gt;
var=rand(min,max); Genera un número random entre los valores pasados
&lt;br /&gt;
srand(var); Inicializa la semilla del algoritmo de generación de
&lt;br /&gt;
números al azar.
&lt;br /&gt;
En general:
&lt;br /&gt;
srand((double)microtime()*1000000);
&lt;br /&gt;
var=sin(var); Función seno
&lt;br /&gt;
var=tan(var); Función tangente
&lt;br /&gt;
var=sqrt(var); Devuelve la raíz cuadrada de un número
&lt;br /&gt;
Capítulo 14: Ejecución de programas externos y scripting.
&lt;br /&gt;
Es posible desde PHP invocar a un programa externo de forma tal de utilizar algún script externo para obtener
&lt;br /&gt;
resultados que luego sean utilizados en un script php.
&lt;br /&gt;
string=escapeshellcmd(string)
&lt;br /&gt;
Escapea todos los caracteres que puedan resultar peligrosos en un comando que va a pasarse al shell. En
&lt;br /&gt;
varias ocasiones un cierto input ingresado por el usuario es pasado a un programa externo para cumplir una
&lt;br /&gt;
determinada función. Supongamos que el usuario ingresa un nombre y password y un script php debe pasarle
&lt;br /&gt;
esos datos a un programa externo para cierta validación. El comando podría ser:
&lt;br /&gt;
$comando=”/usr/bin/validator $user $password”;
&lt;br /&gt;
Pero que pasa si el usuario ingresa como password: “pepe;rm – rf /*”; Entonces el comando quedaría:
&lt;br /&gt;
“/usr/bin/validator nombre pepe;rm –rf/*””
&lt;br /&gt;
Y al ejecutarse además de hacer lo que el script debe hacer el shell eliminara todos los archivos del disco
&lt;br /&gt;
(ugh!), la función escapeshellcmd evita esto anulando todos los casos peligrosos para la llamada a un
&lt;br /&gt;
comando.
&lt;br /&gt;
Las funciones de ejecución de comandos son:
&lt;br /&gt;
string=exec(command, array, var);
&lt;br /&gt;
Los dos últimos parámetros son opcionales. Ejecuta un comando pasándoselo al shell y devuelve la última
&lt;br /&gt;
línea devuelta por el comando en su standard otuput, si se pasa un nombre de vector como segundo parámetro
&lt;br /&gt;
devuelve cada línea de salida del comando en un elemento del vector. Si se pasa una variable como tercer
&lt;br /&gt;
parámetro devuelve alli el resultado del comando al shell.
&lt;br /&gt;
passthru(command,var);
&lt;br /&gt;
La variable es opcional y recibe el valor de retorno del comando, passthru ejecuta el comando y redirecciona
&lt;br /&gt;
su salida al browser en forma directa. Esto es útil por ejemplo para programas externos que generan una
&lt;br /&gt;
imagen o algo similar (antes hay que enviar el header correspondiente).
&lt;br /&gt;
Uso de php como lenguaje de scripting:
&lt;br /&gt;
PHP puede usarse tanto como un modulo del webserver como también como lenguaje de scripting
&lt;br /&gt;
interpretado desde la línea de comandos (en cuyo caso funciona con cualquier web server que soporte el
&lt;br /&gt;
protocolo CGi aun cuando no soporte php como modulo). Para usar php desde la línea de comandos basta con
&lt;br /&gt;
compilar una versión de php en la cual no se le pasa la opción de compilarse como modulo de Apache, de esta
&lt;br /&gt;
forma se generara un binario “php” que es el interprete php.
&lt;br /&gt;
Un script php se puede escribir entonces de la forma:
&lt;br /&gt;
#!/usr/bin/php
&lt;br /&gt;
&amp;lt;?
&lt;br /&gt;
print(“Hola mundo\n”);
&lt;br /&gt;
?&amp;gt;
&lt;br /&gt;
La primera línea es la que se conoce en Unix como sheebang line e indica el path del interprete para el código
&lt;br /&gt;
que sigue a continuación, en nuestro caso el binario php reside en /usr/bin/ pero podría estar en otro lado.
&lt;br /&gt;
Luego escribimos un script standard, manteniendo el código php entre &amp;lt;? y ?&amp;gt;, todo lo que no este entre estos
&lt;br /&gt;
símbolos pasa directamente al standard output del script.
&lt;br /&gt;
El script se invoca desde la línea de comandos como un programa ejecutable normal (dándole permiso de
&lt;br /&gt;
ejecución), también puede usarse la línea de comandos para probar un script que no tiene la línea sheebang,
&lt;br /&gt;
por ejemplo un script normal que usamos en un web site:
&lt;br /&gt;
/usr/bin/php /path/nombre.php
&lt;br /&gt;
Esto es muchas veces útil para chequear cual es la salida de un script que no esta funcionando bien en un web
&lt;br /&gt;
server la salida por la línea de comando al standard output es útil para análisis y debug ya que no pasa por la
&lt;br /&gt;
interpretación del browser.
&lt;br /&gt;
Es posible pasarle a un script php parámetros por la línea de comandos, por ejemplo:
&lt;br /&gt;
script.php hola mundo
&lt;br /&gt;
Estos parámetros serán recibidos por el script en el vector $argv, el elemento [0] de $argv es el nombre
&lt;br /&gt;
mismo del script por lo que los dos parámetros en este caso estarán en $argv[1] y $argv[2].
&lt;br /&gt;
En algunos casos queremos probar desde la línea de comandos un script que recibe parámetros desde un
&lt;br /&gt;
formulario html, es decir usando método GET o POST. Para ello no sirve el formato anterior ya que el script
&lt;br /&gt;
desconoce la existencia de $argv. Lo que hay que hacer es poner los parámetros en la variable de ambiente
&lt;br /&gt;
“QUERY_STRING” de la forma: “nombre=valor&amp;amp;nombre2=valor2....” y luego invocar al script. Usando
&lt;br /&gt;
bash como shell esto es de la forma:
&lt;br /&gt;
[path] $QUERY_STRING=”hola=mundo&amp;amp;nombre=juan”
&lt;br /&gt;
[path] $ export QUERY_STRING
&lt;br /&gt;
[path] $ /usr/bin/php /path/script.php
&lt;br /&gt;
Automáticamente el interprete de php se encarga de parsear la variable de ambiente QUERY_STRING y
&lt;br /&gt;
convertirla en variables de php por lo que el resultado del script será el mismo que el que produciría si lo
&lt;br /&gt;
llamáramos desde un form html con esas variables seteadas.
&lt;br /&gt;
Capítulo 15: Manejo de HTTP en PHP.
&lt;br /&gt;
Uno de los temas más importantes en todo lenguaje de scripting usado para generación dinámica de sitios web
&lt;br /&gt;
y aplicaciones web es el manejo del protocolo HTTP, conexiones, métodos GET y POST, uploads, headers,
&lt;br /&gt;
cache y demás alternativas. Todas estas funciones están bien soportadas en php de forma tal de tener desde el
&lt;br /&gt;
lneguaje un control completo sobre la forma en que el server interactua con el browser.
&lt;br /&gt;
Headers.
&lt;br /&gt;
Una de las funciones más importantes de PHP es la función “header” que sirve para enviar al browser un
&lt;br /&gt;
determinado header HTTP, por default en cuanto un script PHP usa una función de salida o transmite algo al
&lt;br /&gt;
browser php envía el header “Content-Type: text/html” al browser. Por eso es importante destacar que la
&lt;br /&gt;
funcion header solo puede usarse ANTES de realizar cualquier tipo de salida al browser.
&lt;br /&gt;
Ejemplos:
&lt;br /&gt;
header(“Location: &lt;a href=&quot;http://lugar/pepe.php”);&quot; target=&quot;_blank&quot;&gt;http://lugar/pepe.php”);&lt;/a&gt;
&lt;br /&gt;
Este es un header http que sirve para redireccionar al browser a otra página, script o URL, es muy util para
&lt;br /&gt;
scripts php que procesan datos recibidos desde un formulario o similar y luego en funcion de los datos
&lt;br /&gt;
redireccionan al browser a una página que por ejemplo puede mostrar errores en el ingreso de datos, aceptar
&lt;br /&gt;
los datos o simplemente volver a la página que llamo al script.
&lt;br /&gt;
Este tipo de redirección sólo puede usarse si no se emitió ninguna salida al browser, si ya se emitió una salida
&lt;br /&gt;
al browser y es necesario redireccionar la página debemos generar desde PHP código JavaScript que
&lt;br /&gt;
transmitimos al browser y el browser si es capaz de interpretar JavaScript podrá redireccionarse a la página
&lt;br /&gt;
pasada, por ejemplo:
&lt;br /&gt;
&amp;lt;?
&lt;br /&gt;
print(“Cosas anteriores”);
&lt;br /&gt;
if($redireccionar) {
&lt;br /&gt;
?&amp;gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;
&lt;br /&gt;
location.href=&amp;lt;?print($URL);?&amp;gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;
&lt;br /&gt;
?&amp;lt;
&lt;br /&gt;
}
&lt;br /&gt;
?&amp;gt;
&lt;br /&gt;
El browser recibe por ejemplo:
&lt;br /&gt;
&amp;lt;script&amp;gt;
&lt;br /&gt;
location..href=http://www.yahoo.com
&lt;br /&gt;
&amp;lt;/script&amp;gt;
&lt;br /&gt;
Y automaticamente se redirecciona al URL pasado, el uso de JavaScript desde PHP es importante (ver el
&lt;br /&gt;
capítulo de programacion en el cliente desde el server)
&lt;br /&gt;
Otro header importante que ya vimos es el de imagen que enviamos antes de pasarle al browser una imagen
&lt;br /&gt;
generada dinámicamente.
&lt;br /&gt;
Una de las funciones importantes de los headers HTPP es controlar el comportamiento del cache del browser,
&lt;br /&gt;
en numerosas ocasiones tendremos que codificar scripts que generan una cierta salida que no es deseable que
&lt;br /&gt;
sea cacheable, si no impedimos que el browser cachee el resultado del script el usuario tendrá que refrescar
&lt;br /&gt;
manualmente la página desde el browser para ver el nuevo resultado. Los siguientes headers http impiden que
&lt;br /&gt;
el browser cachee una página y sirven tanto para Internet Explorer como para Netscape Navigator:
&lt;br /&gt;
header(&quot;Cache-Control: no-cache, must-revalidate&quot;);
&lt;br /&gt;
header(&quot;Pragma: no-cache&quot;);
&lt;br /&gt;
header(&quot;Expires: Mon,26 Jul 1997 05:00:00 GMT&quot;);
&lt;br /&gt;
El protocolo HTTP dispone de un mecanismo de autorización básico mediante el cual puede pedirse al
&lt;br /&gt;
browser que promptee al usuario por un usuario y password, luego estos datos se transmiten al web-server y el
&lt;br /&gt;
mismo debe encargarse de autorizar al usuario o no según corresponda. Desde PHP podemos generar los
&lt;br /&gt;
headers correspondientes para que el browser pida al usuario un usuario y password y luego validar estos
&lt;br /&gt;
datos desde el script php (usando una base de datos o lo que corresponda):
&lt;br /&gt;
&amp;lt;?php
&lt;br /&gt;
if(!isset($PHP_AUTH_USER)) {
&lt;br /&gt;
Header(&quot;WWW-Authenticate: Basic realm=\&quot;My Realm\&quot;&quot;);
&lt;br /&gt;
Header(&quot;HTTP/1.0 401 Unauthorized&quot;);
&lt;br /&gt;
echo &quot;Text to send if user hits Cancel button\n&quot;;
&lt;br /&gt;
exit;} else {
&lt;br /&gt;
echo &quot;Hello $PHP_A
&lt;br /&gt;_________________&lt;br /&gt;&lt;img src=&quot;http://www.fotozone.es/foto/31,2007/fotozone_115880.jpg&quot; border=&quot;0&quot; /&gt;&lt;/span&gt;&lt;br /&gt;
</description>
</item>
<item>
	<title>  	 Php :: RE: capitulo 1 al 20 de porogramacion PHP</title>
	<link>http://colombia.100foros.com/viewtopic.php?p=127#127</link>
	<description>Autor: &lt;a href=&quot;http://colombia.100foros.com//profile.php?mode=viewprofile&amp;u=2&quot; target=&quot;_blank&quot;&gt;p1p3&lt;/a&gt;&lt;br /&gt;

Publicado: Sab Ago 04, 2007 4:31 am (GMT 0)&lt;br /&gt;
Tema Respuestas: 9&lt;br /&gt;&lt;br /&gt;
&lt;span class="postbody"&gt;Capitulo 7: Programación Orientada a Objetos en PHP
&lt;br /&gt;
Para comenzar a hablar de programación orientada a objetos (OOP – Object Oriented Programming) es necesario
&lt;br /&gt;
recordar los conceptos de la programación orientada a objetos. Estos conceptos varían entre los distintos autores,
&lt;br /&gt;
pero podemos mencionar algunos que son básicos y necesarios para cualquier lenguaje del cual pueda decirse que
&lt;br /&gt;
es orientado a objetos:
&lt;br /&gt;
- Tipos de datos abstractos e información encapsulada
&lt;br /&gt;
- Herencia
&lt;br /&gt;
- Polimorfismo
&lt;br /&gt;
La encapsulación en PHP se codifica utilizando clases:
&lt;br /&gt;
&amp;lt;?php
&lt;br /&gt;
class Algo {
&lt;br /&gt;
// En OOP se utilizan generalmente nombres comenzados con mayúscula.
&lt;br /&gt;
var $x;
&lt;br /&gt;
function setX($v) {
&lt;br /&gt;
// Para los métodos se utilizan generalmente nombres en minúscula y sólo
&lt;br /&gt;
// se utiliza mayúscula para separar las palabras, por ej. getValueOfArea()
&lt;br /&gt;
$this-&amp;gt;x=$v;
&lt;br /&gt;
}
&lt;br /&gt;
function getX() {
&lt;br /&gt;
return $this-&amp;gt;x;
&lt;br /&gt;
}}
&lt;br /&gt;
?&amp;gt;
&lt;br /&gt;
Obviamente está nomenclatura es sólo a valor de recomendación para mantener un standard entre el código de los
&lt;br /&gt;
distintos programadores, y puede no ser respetado. Lo importante es acordar una nomenclatura standard que todos
&lt;br /&gt;
respeten.
&lt;br /&gt;
Las propiedades de los objetos son definidas en PHP utilizando la declaración “var” dentro de la clase. Cuando se
&lt;br /&gt;
declara una propiedad la misma no tiene tipo alguno asignado, hasta que nosotros la asignemos algún valor en
&lt;br /&gt;
particular. Una propiedad puede ser un entero, un vector, un vector asociativo, e inclusive puede ser otro objeto.
&lt;br /&gt;
Los métodos son definidos como funciones, también dentro de la clase,. Y para acceder a las propiedades de la
&lt;br /&gt;
instancia de esa clase es necesario referirse a las propiedades como $this-&amp;gt;name. En caso de no utilizar el “$this-&amp;gt;”
&lt;br /&gt;
la variable será local al método y una vez terminada la ejecución del mismo se perderá su valor.
&lt;br /&gt;
Para crear una instancia de un objeto debemos ejecutar el operador “new”, que nos devuelve en una variable un
&lt;br /&gt;
objeto de la clase que le estamos indicando.
&lt;br /&gt;
$obj = new Something;
&lt;br /&gt;
Una vez instanciado el objeto podemos utilizar sus métodos:
&lt;br /&gt;
$obj-&amp;gt;setX(5);
&lt;br /&gt;
$see=$obj-&amp;gt;getX();
&lt;br /&gt;
El método setX ejecutado en el objeto $obj hizo que se asigne un 5 a la propiedad “x” de dicha instancia. Notemos
&lt;br /&gt;
en este punto que podríamos haber seteado la propiedad “x” con cualquier tipo de variables, por ejemplo un string.
&lt;br /&gt;
Para asignarle 5 a la propiedad “x” de nuestro objeto $obj podríamos haber puesto en nuestro código directamente
&lt;br /&gt;
“$obj-&amp;gt;x=5;”, sin la necesidad de llamar a ningún método, pero el problema radicaría en que en que estaríamos
&lt;br /&gt;
violando la regla de encapsulamiento de los objetos. Una buena práctica de la programación orientada a objetos es
&lt;br /&gt;
acceder a las propiedades solamente mediante métodos propios de la clase y jamás acceder a ellos de otra forma.
&lt;br /&gt;
Lamentablemente PHP no ofrece la posibilidad de declarar las propiedades privadas, por lo que el programar en
&lt;br /&gt;
forma “encapsulada” se torna más una filosofia de programación que una obligación.
&lt;br /&gt;
La herencia en PHP se realiza utilizando la sentencia “extends”:
&lt;br /&gt;
&amp;lt;?php
&lt;br /&gt;
class Another extends Something {
&lt;br /&gt;
var $y;
&lt;br /&gt;
function setY($v) {
&lt;br /&gt;
// Para los métodos se utilizan generalmente nombres en minúscula y sólo
&lt;br /&gt;
// se utiliza mayúscula para separar las palabras, por ej. getValueOfArea()
&lt;br /&gt;
$this-&amp;gt;y=$v;
&lt;br /&gt;
}
&lt;br /&gt;
function getY() {
&lt;br /&gt;
return $this-&amp;gt;y;
&lt;br /&gt;
}}
&lt;br /&gt;
?&amp;gt;
&lt;br /&gt;
Los objetos de la clase “Another” poseen todas las propiedades y métodos de su clase padre “Something”, más las
&lt;br /&gt;
propiedades y métodos propios. Ahora podemos ejecutar por ejemplo los siguientes comandos:
&lt;br /&gt;
$obj2=new Another;
&lt;br /&gt;
$obj2-&amp;gt;setX(6);
&lt;br /&gt;
$obj2-&amp;gt;setY(7);
&lt;br /&gt;
En PHP una única clase de objetos no puede ser “hija” de más de un “padre”, lo que es conocido como múltiple
&lt;br /&gt;
herencia.
&lt;br /&gt;
En PHP se pueden reescribir métodos de la clase padre en la clase hijo (overriding). Para esto sólo hace falta volver
&lt;br /&gt;
a definir la función en el objeto hijo. Por ejemplo si queremos redefinir el método getX para la clase “Another”
&lt;br /&gt;
simplemente definimos la función en la clase “Another”. Una vez hecho esto no es posible para los objetos de la
&lt;br /&gt;
clase “Another” acceder al método getX de “Something”.
&lt;br /&gt;
En caso de declararse una propiedad en la clase “hija” con el mismo nombre que en la clase padre, la propiedad de la
&lt;br /&gt;
clase padre se encontraría “oculta”.
&lt;br /&gt;
En las clases se pueden definir constructores. Los constructores son métodos que se ejecutan al momento de
&lt;br /&gt;
instanciar la clase (cuando se ejecuta la sentencia new). La característica para que un método sea el constructor de
&lt;br /&gt;
una clase es que debe tener el mismo nombre que la clase.
&lt;br /&gt;
&amp;lt;?php
&lt;br /&gt;
class Something {
&lt;br /&gt;
var $x;
&lt;br /&gt;
function Something($y) {
&lt;br /&gt;
$this-&amp;gt;x=$y;
&lt;br /&gt;
}
&lt;br /&gt;
function setX($v) {
&lt;br /&gt;
$this-&amp;gt;x=$v;
&lt;br /&gt;
}
&lt;br /&gt;
function getX() {
&lt;br /&gt;
return $this-&amp;gt;x;
&lt;br /&gt;
}}
&lt;br /&gt;
?&amp;gt;
&lt;br /&gt;
Entonces, se puede crear el objeto de la siguiente manera:
&lt;br /&gt;
$obj=new Something(6);
&lt;br /&gt;
Automáticamente el constructor asigna 6 a la propiedad “x”.
&lt;br /&gt;
Todos los métodos, incluyendo los constructores, son funciones normales de php, por lo que se le pueden asignar
&lt;br /&gt;
valores por omisión.
&lt;br /&gt;
Supongamos que tenemos el constructor definido de la siguiente manera:
&lt;br /&gt;
function Something($x=&quot;3&quot;,$y=&quot;5&quot;)
&lt;br /&gt;
En este caso podemos crear el objeto de la siguiente manera:
&lt;br /&gt;
$obj = new Something(); // x=3 y y=5
&lt;br /&gt;
$obj = new Something(&lt;img src=&quot;http://colombia.100foros.com//images/smiles/icon_cool.gif&quot; alt=&quot;Cool&quot; border=&quot;0&quot; /&gt;; // x=8 y y=5
&lt;br /&gt;
$obj = new Something(8,9); // x=8 y y=9
&lt;br /&gt;
Los argumentos por omisión son utilizados en C++ y son una vía para cuando no hay valores para pasar por
&lt;br /&gt;
parámetro a las funciones. Cuando el parámetro no es encontrado por la función que es llamada, toma el valor por
&lt;br /&gt;
omisión que le es especificada en su definición.
&lt;br /&gt;
Cuando es creado un objeto de una clase que deriva de otra, se ejecuta sólo el constructor de la misma clase, y no la
&lt;br /&gt;
del padre. Este es un defecto del PHP, ya que es clásico en los lenguajes orientados a objetos que exista lo que se
&lt;br /&gt;
llama encadenamiento de constructores. Para hacer esto en PHP es necesario llamar explícitamente el constructor de
&lt;br /&gt;
la clase padre dentro del constructor de la clase heredera. Esto funciona porque todos los métodos de la clase padre
&lt;br /&gt;
se encuentran disponibles en la clase heredera.
&lt;br /&gt;
&amp;lt;?php
&lt;br /&gt;
function Another() {
&lt;br /&gt;
$this-&amp;gt;y=5;
&lt;br /&gt;
$this-&amp;gt;Something(); //Llamada explícita al constructor de la clase padre.
&lt;br /&gt;
}
&lt;br /&gt;
?&amp;gt;
&lt;br /&gt;
Un buen mecanismo en OOP es usar clases abstractas. Clases abstractas son aquellas clases que no son instanciables
&lt;br /&gt;
y están hechas para el único propósito de definir una interface para otras clases derivadas. Los diseñadores
&lt;br /&gt;
usualmente utilizan estas clases para forzar a los programadores a derivar clases desde ciertas bases clases de forma
&lt;br /&gt;
tal de asegurarse que cada clase tiene una cierta funcionalidad predefinida. No hay una forma standard de hacer esto
&lt;br /&gt;
en PHP pero: Si se necesita esta metodologia puede definirse una clase base y poner una sentencia “die” en el
&lt;br /&gt;
constructor, de esta forma nos aseguramos que la clase no es instanciable luego definimos los metodos interface
&lt;br /&gt;
poniendo una sentencia “die” en cada uno de ellos, de esta forma los programadores deben sobreescribir estos
&lt;br /&gt;
metodos para poder utilizarlos.
&lt;br /&gt;
No hay destructores en PHP.
&lt;br /&gt;
La sobrecarga (overloading) de metodos que es diferente a la redefinicion (overriding) no esta soportada en PHP. En
&lt;br /&gt;
OOP se dice que un metodo esta sobrecargado cuando hay mas de un metodo con el miusmo nombre pero diferentes
&lt;br /&gt;
tipos o cantidad de parametros. PHP es un lenguaje debilmente tipado por lo que la sobrecarga por tipos no
&lt;br /&gt;
funcionaria, por consistencia la sobrecarga por cantidad de parametros tampoco funciona.
&lt;br /&gt;
En OOP es agradable muchas veces sobrecargar constructores de forma tal que una clase permita construir un objeto
&lt;br /&gt;
de muchas formas diferentes, podemos simular esto en PHP de la forma:
&lt;br /&gt;
&amp;lt;?php
&lt;br /&gt;
class Myclass {
&lt;br /&gt;
function Myclass() {
&lt;br /&gt;
$name= &quot;Myclass&quot;.func_num_args();
&lt;br /&gt;
$this-&amp;gt;$name();
&lt;br /&gt;
//Notar que $this-&amp;gt;$name() es susualmente erroneo porque aquí
&lt;br /&gt;
//$name es un string con el nombre del método a llamar.
&lt;br /&gt;
}
&lt;br /&gt;
function Myclass1($x) {
&lt;br /&gt;
code;
&lt;br /&gt;
}
&lt;br /&gt;
function Myclass2($x,$y) {
&lt;br /&gt;
code;
&lt;br /&gt;
}}
&lt;br /&gt;
?&amp;gt;
&lt;br /&gt;
Con éste trabajo extra podemos trabajar con la clase de un modo transparente para el usuario:
&lt;br /&gt;
$obj1=new Myclass('1'); //Will call Myclass1
&lt;br /&gt;
$obj2=new Myclass('1','2'); //Will call Myclass2
&lt;br /&gt;
Polimorfismo
&lt;br /&gt;
Polimorfismo se define como la habilidad de un objeto de determinar que método debe invocar para un objeto
&lt;br /&gt;
pasado como argumento en tiempo de ejecución. Por ejemplo si tenemos una clase figura que tiene un método
&lt;br /&gt;
“dibujar” y sus clases derivadas circulo y rectángulo, cuando reemplazamos el método “dibujar” podemos tener una
&lt;br /&gt;
función que cuente con un argumento “x” y después llamar a $x-&amp;gt;dibujar(). Si tenemos polimorfismo el método
&lt;br /&gt;
“dibujar” llamado dependerá del tipo de objeto que pasemos a la función. El polimorfismo es muy fácil de aplicar y
&lt;br /&gt;
utilizar en lenguajes interpretados como PHP, pero no es tan secillo en lenguajes compilados, ya que no sabemos
&lt;br /&gt;
que método deberemos llamar de antemano.
&lt;br /&gt;
&amp;lt;?php
&lt;br /&gt;
function niceDrawing($x) {
&lt;br /&gt;
//Supongamos que este es un método de la clase Board.
&lt;br /&gt;
$x-&amp;gt;draw();
&lt;br /&gt;
}
&lt;br /&gt;
$obj=new Circle(3,187);
&lt;br /&gt;
$obj2=new Rectangle(4,5);
&lt;br /&gt;
$board-&amp;gt;niceDrawing($obj); //Podemos llamar al método draw de circulo.
&lt;br /&gt;
$board-&amp;gt;niceDrawing($obj2); //Podemos llamar al método draw de rectángulo.
&lt;br /&gt;
?&amp;gt;
&lt;br /&gt;
Programación Orientada a Objetos en PHP
&lt;br /&gt;
Algunos puristas pueden decir que PHP no es un verdadero lenguaje orientado a objetos. PHP es un lenguaje hibrido
&lt;br /&gt;
donde se puede utilizar OOP o procedimientos de programación procedural tradicional. Para largos proyectos usted
&lt;br /&gt;
pude querer o necesitar usar OOP “puro” en PHP declarando clases y utilizando sólo objetos y clases para su
&lt;br /&gt;
proyecto. Mientras más largo es el proyecto más puede ayudar la programación orientada a objetos, ya que código es
&lt;br /&gt;
más fácil de mantener, entender y reutilizar. Estos son los principios básicos de la Ingeniería de Software- Aplicar
&lt;br /&gt;
estos conceptos a proyectos basados en la web será la llave de acceso para exitosos sites en el futuro.
&lt;br /&gt;
Técnicas avanzadas de programación orientada a objetos.
&lt;br /&gt;
Luego de haber visto los conceptos básicos de la OOP, vamos a ver algunas técnicas más avanzadas:
&lt;br /&gt;
Serialización
&lt;br /&gt;
PHP no soporta la persistencia de objetos. En OOP los objetos persistentes son objetos que mantienen su estado y
&lt;br /&gt;
funcionalidad a través de múltiples invocaciones de la aplicación. Esto puede resolverse salvando el objeto en un
&lt;br /&gt;
archivo o en una base de datos y restaurando los datos cada vez que se ejecuta dicha aplicación. El mecanismo es
&lt;br /&gt;
conocido como serialización. PHP provee un método de serialización que puede ser llamado por los objetos . El
&lt;br /&gt;
método de serialización devuelve un string representando el objeto. La serialización guarda las propiedades del
&lt;br /&gt;
objeto pero no sus métodos.
&lt;br /&gt;
En PHP4 si se serializa un objeto al string $s, se destruye el objeto, y entonces utilizando la desserialización de
&lt;br /&gt;
objeto en $obj se puede mantener el acceso a las propiedades del objeto. Esto no es recomendado por dos razones: la
&lt;br /&gt;
primera es porque no se garantiza que en futuras versiones esto siga funcionando. La segunda es porque si se
&lt;br /&gt;
serializa un objeto, se guarda a disco el string y se sale del script, al correr en el futuro dicho script no nos
&lt;br /&gt;
aseguramos que los métodos del objeto sean los mismos, ya que en la serialización sólo se guardaron las
&lt;br /&gt;
propiedades. Concluyendo, serialización sólo sirve en PHP para guardar las propiedades de un objeto nada más (se
&lt;br /&gt;
puede serializar un vector asociativo para salvarlos a disco por ejemplo).
&lt;br /&gt;
NOTA: La version 4.0.1 de PHP4 soporta serializacion de objetos en forma completa!!!
&lt;br /&gt;
Ejemplo: &amp;lt;?php
&lt;br /&gt;
$obj=new Classfoo();
&lt;br /&gt;
$str=serialize($obj);
&lt;br /&gt;
// Se salva $str al disco
&lt;br /&gt;
//...algunos meses más tarde
&lt;br /&gt;
//Se recupera str del disco
&lt;br /&gt;
$obj2=unserialize($str)
&lt;br /&gt;
?&amp;gt;
&lt;br /&gt;
En este caso tenemos las propiedades recuperadas pero no podemos utilizar los métodos. Esto hace que la forma de
&lt;br /&gt;
recuperar $obj2-&amp;gt;x el valor de “x” sea la única forma posible (no tenemos métodos!), por lo que esta práctica no es
&lt;br /&gt;
recomendada.
&lt;br /&gt;
Estas son algunas maneras para arreglar el problema, las que veremos muy por encima, ya que son formas muy
&lt;br /&gt;
enmarañadas de resolverlo. Full serialización será uno de los agregados más esperados en PHP.
&lt;br /&gt;
Nota: Enhorabuena, PHP 4.0.1 soporta “full serialization” de objetos.
&lt;br /&gt;
Usando clases para manipular información almacenada
&lt;br /&gt;
Una de las cosas útiles de PHP y OOP que se pueden definir fácilmente clases para manejar ciertas cosas y llamar a
&lt;br /&gt;
la clase apropiada cuando queramos. Supongamos que tenemos un formulario html donde un usuario selecciona un
&lt;br /&gt;
producto por medio de su producto ID. Supongamos también que tenemos los datos del producto en una base de
&lt;br /&gt;
datos y queremos mostrar el producto en sí, el precio y demás características. Si tenemos productos de diferentes
&lt;br /&gt;
tipos, y en la misma acción tenemos diferentes maneras para diferentes familias de productos. Por ejemplo para
&lt;br /&gt;
algunos porductos debemos reproducir un sonido mientras que para otros productos debemos mostrar una foto del
&lt;br /&gt;
mismo guardada en la base de datos. En este caso podemos utilizar OOP y PHP para realizar menos y mejor código
&lt;br /&gt;
fuente:
&lt;br /&gt;
Podemos definir una clase Producto, definimos que métodos la clase debe tener (por ejemplo “display”), y entonces
&lt;br /&gt;
definimos clases para cada tipo de producto como una extensión (extends) la clase producto (por ejemplo clase
&lt;br /&gt;
ItemSonoro,. ItemVisible, etc.) redefiniendo los métodos que ya definimos en Producto en cada una de las clases
&lt;br /&gt;
que necesitemos. Lo que resulta conveniente en este caso es nombrara las clases de acuerdo con los tipos de
&lt;br /&gt;
“columna” que guardamos en la base de datos por cada tipo de producto que tenemos (id, tipo, precio, etc.).
&lt;br /&gt;
Entonces cuando procesamos el script podemos pedir el tipo desde la base de datos e instanciar un objeto de la clase
&lt;br /&gt;
del tipo de producto:
&lt;br /&gt;
&amp;lt;?php
&lt;br /&gt;
$obj=new $type(); // type has the name of the class to instanciate!
&lt;br /&gt;
$obj-&amp;gt;action();
&lt;br /&gt;
?&amp;gt;
&lt;br /&gt;
Esto es una buena propiedad de PHP que permite llamar al método “display” por ejemplo del tipo de objeto que
&lt;br /&gt;
tenemos. Con esta técnica no necesitamos tocar el script de proceso (el formulario) cuando agregamos un nuevo tipo
&lt;br /&gt;
de objetos, solamente agregamos la clase y listo. Esto es poderoso, lo único qu debemos definir son los métodos que
&lt;br /&gt;
todos los objetso deben tener de acuerdo a los tipos que tenemos, generando las diferentes maneras para los
&lt;br /&gt;
diferentes tipos.
&lt;br /&gt;
Si ud. Lidera un grupo de programandores es fácil dividir tareas, cada uno responsable por cada tipo de objetos y las
&lt;br /&gt;
clases que dependen de él. Con estos métodos la internacionalización de un site puede ser muy fácil aplicando los
&lt;br /&gt;
métodos correspondientes de acuerdo al lenguaje que seleccionó el usuario.
&lt;br /&gt;
Copiando y Clonando
&lt;br /&gt;
Cuando creamos un objeto $obj se puede copiar un objeto usando $obj2=$obj. El nuevo objeto es una copia del
&lt;br /&gt;
objeto $obj, es decir que tiene el estado que $obj tenia en el momento que se realizó la asignación. Algunas veces no
&lt;br /&gt;
necesitamos esto, sólo queremos crear un nuevo objeto de la misma clase que $obj, llamando al contructor en el
&lt;br /&gt;
momento de la creación del nuevo objeto. Esto es posible utilizando la serialización y una clase que todas las otras
&lt;br /&gt;
clases sean extensión de la misma.
&lt;br /&gt;
Entrando a una zona difícil
&lt;br /&gt;
Cuando serializamos un objeto obtenemos un string de un formato propio. Podemos investigas (siendo curiosos)
&lt;br /&gt;
cada una de las cosas que tiene dicho string. Una cosa curiosa es que esta guardado en el el nombre de la clase que
&lt;br /&gt;
debemos utilizar para desserializar el objeto:
&lt;br /&gt;
&amp;lt;?php
&lt;br /&gt;
$herring=serialize($obj);
&lt;br /&gt;
$vec=explode( ':',$herring);
&lt;br /&gt;
$nam=str_replace( &quot;\&quot;&quot;, '',$vec[2]);
&lt;br /&gt;
?&amp;gt;
&lt;br /&gt;
Entonces supongamos que creamos una clase “Universe” y forzamos que todas las clases sean extensión de
&lt;br /&gt;
universo, podemos definir un método que clone Universe como:
&lt;br /&gt;
&amp;lt;?php
&lt;br /&gt;
class Universe {
&lt;br /&gt;
function clone() {
&lt;br /&gt;
$herring=serialize($this);
&lt;br /&gt;
$vec=explode( ':',$herring);
&lt;br /&gt;
$nam=str_replace( &quot;\&quot;&quot;, '',$vec[2]);
&lt;br /&gt;
$ret=new $nam;
&lt;br /&gt;
return $ret;
&lt;br /&gt;
//Entonces:
&lt;br /&gt;
$obj=new Something();
&lt;br /&gt;
//Algo extensión de universo !!
&lt;br /&gt;
$other=$obj-&amp;gt;clone();
&lt;br /&gt;
?&amp;gt;
&lt;br /&gt;
Se obtiene un objeto nuevo de la clase “Something” creado de la misma forma que llamando a New, se invoca al
&lt;br /&gt;
constructor etc. Distintas aplicaciones del uso de la clase universal permiten varios manejos curiosos de objetos en
&lt;br /&gt;
PHP, el unico limite es la imaginacion!
&lt;br /&gt;_________________&lt;br /&gt;&lt;img src=&quot;http://www.fotozone.es/foto/31,2007/fotozone_115880.jpg&quot; border=&quot;0&quot; /&gt;&lt;/span&gt;&lt;br /&gt;
</description>
</item>
<item>
	<title>  	 Php :: RE: capitulo 1 al 20 de porogramacion PHP</title>
	<link>http://colombia.100foros.com/viewtopic.php?p=126#126</link>
	<description>Autor: &lt;a href=&quot;http://colombia.100foros.com//profile.php?mode=viewprofile&amp;u=2&quot; target=&quot;_blank&quot;&gt;p1p3&lt;/a&gt;&lt;br /&gt;

Publicado: Sab Ago 04, 2007 4:31 am (GMT 0)&lt;br /&gt;
Tema Respuestas: 9&lt;br /&gt;&lt;br /&gt;
&lt;span class="postbody"&gt;Generacion de web sites dinamicos con PHP.
&lt;br /&gt;
Capitulo 6: Manejo de Archivos.
&lt;br /&gt;
1. Apertura de un archivo.
&lt;br /&gt;
La función utilizada para abrir un archivo en PHP es fopen, la sintaxis.
&lt;br /&gt;
fp_handler=fopen(“path”,”modo”);
&lt;br /&gt;
Parh es la ruta completa del archivo a abrir, si el path comienza con “http://” se realiza una conexión a la URL
&lt;br /&gt;
indicada y se abre la página como si fuera un archivo (con las limitaciones lógicas, por ejemplo no es posible
&lt;br /&gt;
escribir).
&lt;br /&gt;
Los modos en los que se puede abrir un archivo son:
&lt;br /&gt;
r Sólo lectura
&lt;br /&gt;
r+ Lectura y escritura
&lt;br /&gt;
w Sólo escritura, si no existe el archivo lo crea, si existe lo trunca
&lt;br /&gt;
w+ Lectura y escritura, si existe lo trunca, si no existe lo crea
&lt;br /&gt;
a Modo append sólo escritura si no existe lo crea
&lt;br /&gt;
a+ Modo append lectura y escritura si no existe lo crea
&lt;br /&gt;
La función devuelve un file_handler que luego debe ser usado en todas las funciones de tipo
&lt;br /&gt;
fnombre_funcion, como por ejemplo fgets, fputs, fclose, fread, fwrite, etc.
&lt;br /&gt;
2. Lectura desde un archivo.
&lt;br /&gt;
Las funciones que pueden usarse para leer un archivo son:
&lt;br /&gt;
string=fgets(file_handler, longitud)
&lt;br /&gt;
Lee una línea de texto hasta el fin de línea o bien hasta que se cumpla la longitud indicada, devuelve el
&lt;br /&gt;
resultado en la variable pasada. El archivo debe estar abierto con fopen.
&lt;br /&gt;
var=fread(file_handler, cantidad)
&lt;br /&gt;
Lee la cantidad de bytes indicados ignorando saltos de línea y deja el resultado en la variable var.
&lt;br /&gt;
Ejemplo
&lt;br /&gt;
$buffer=fread($fp, 1024); //Lee 1Kb desde el archivo cuyo handler es $fp
&lt;br /&gt;
string=fgetss(file_handler, longitud)
&lt;br /&gt;
Idéntica a fgets con la diferencia de que los tags html son eliminados del archivo a medida que se lee el
&lt;br /&gt;
mismo. Opcionalmente puede pasarse una lista de tags que no deben ser eliminados.
&lt;br /&gt;
Ejemplo:
&lt;br /&gt;
$string=fgetss($fp,999999,”&amp;lt;b&amp;gt; &amp;lt;i&amp;gt; &amp;lt;table&amp;gt; &amp;lt;tr&amp;gt; &amp;lt;td&amp;gt;”);
&lt;br /&gt;
Lee una línea (de cualquier longitud) eliminando los tags html excepto los indicados como segundo
&lt;br /&gt;
parámetro. Los tags que cierran los tags especificados en la lista de tags permitidos tampoco son eliminados.
&lt;br /&gt;
3. Escritura a un archivo
&lt;br /&gt;
fwrite(file_handler, variable, longitud);
&lt;br /&gt;
Generacion de web sites dinamicos con PHP.
&lt;br /&gt;
Escribe la variable al archivo indicado por file_handler. Si esta indicado el parámetro “longitud” (que es
&lt;br /&gt;
opcional) se escribirán tantos bytes como la longitud indicada por dicho parámetro o como la longitud de la
&lt;br /&gt;
variable, en aquellos casos en que el parámetro longitud es mayor que la longitud de la variable.
&lt;br /&gt;
La función devuelve la cantidad de bytes escritos en el archivo.
&lt;br /&gt;
Ejemplo:
&lt;br /&gt;
$q = fwrite($fp,$buffer,999999);
&lt;br /&gt;
fputs es idéntico a fwrite y funciona de la misma manera. (es un alias).
&lt;br /&gt;
4. Cierre de archivos
&lt;br /&gt;
fclose(file_handler)
&lt;br /&gt;
Cierra un archivo abierto con fopen.
&lt;br /&gt;
5. Fin de archivo
&lt;br /&gt;
boolean = feof(file_handler);
&lt;br /&gt;
Devuelve verdadero si no quedan más bytes para leer en el archivo o si se produce algún tipo de error al leer.
&lt;br /&gt;
Ejemplo:
&lt;br /&gt;
$fp=fopen(“/usr/luis/archivo.txt”,”r”);
&lt;br /&gt;
while(!feof($fp)) {
&lt;br /&gt;
$s=fgets($fp,999999);
&lt;br /&gt;
print(“$s”);
&lt;br /&gt;
}
&lt;br /&gt;
6. Manejo de archivos.
&lt;br /&gt;
PHP provee funciones para copiar, renombrar, mover y borrar archivos y directorios, las funciones son:
&lt;br /&gt;
Función Descripción
&lt;br /&gt;
rename(path_origen, path_destino); Renombra un archivo.
&lt;br /&gt;
Ejemplo:
&lt;br /&gt;
$newname=”/usr/eduardo/file.txt”;
&lt;br /&gt;
Rename(“/usr/eduardo/archivo.txt”,”$newname”);
&lt;br /&gt;
unlink(path_a_borrar); Elimina un archivo.
&lt;br /&gt;
rmdir(directorio_a_borrar); Elimina un directorio (debe estar vacío)
&lt;br /&gt;
mkdir(path_a_crear); Crea un directorio Nuevo.
&lt;br /&gt;
copy(path_origen, path_destino); Copia un archivo o varios.
