<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>El cajón desastre &#187; PHP</title>
	<atom:link href="http://www.dubasdey.com/category/programacion/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.dubasdey.com</link>
	<description></description>
	<lastBuildDate>Tue, 02 Jun 2009 14:25:02 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Diccionario Asturiano (Bable) Español (Castellano)</title>
		<link>http://www.dubasdey.com/2008/06/01/diccionario-asturiano-bable-espanol-castellano/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=diccionario-asturiano-bable-espanol-castellano</link>
		<comments>http://www.dubasdey.com/2008/06/01/diccionario-asturiano-bable-espanol-castellano/#comments</comments>
		<pubDate>Sun, 01 Jun 2008 10:55:10 +0000</pubDate>
		<dc:creator>Kuroneko</dc:creator>
				<category><![CDATA[Bases de datos]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://www.dubasdey.com/2008/06/01/diccionario-asturiano-bable-espanol-castellano/</guid>
		<description><![CDATA[Pos eso, me puse ha realizar unas pruebas de como usar el FULLTEXT Search de MySQL, y me dio por crear un pequeño y simplón buscador para un diccionario &#8220;ficticio&#8221; (la base de datos es real, pero muy simple)
Podeis consultarlo en http://dev.dubasdey.com/dic_es_as/
]]></description>
			<content:encoded><![CDATA[<p>Pos eso, me puse ha realizar unas pruebas de como usar el <a href="http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html">FULLTEXT Search</a> de MySQL, y me dio por crear un pequeño y simplón buscador para un diccionario &#8220;ficticio&#8221; (la base de datos es real, pero muy simple)</p>
<p>Podeis consultarlo en <a href="http://dev.dubasdey.com/dic_es_as/">http://dev.dubasdey.com/dic_es_as/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.dubasdey.com/2008/06/01/diccionario-asturiano-bable-espanol-castellano/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Asunto (subject) de emails con caracteres especiales</title>
		<link>http://www.dubasdey.com/2007/05/31/asunto-subject-de-emails-con-caracteres-especiales/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=asunto-subject-de-emails-con-caracteres-especiales</link>
		<comments>http://www.dubasdey.com/2007/05/31/asunto-subject-de-emails-con-caracteres-especiales/#comments</comments>
		<pubDate>Thu, 31 May 2007 11:07:10 +0000</pubDate>
		<dc:creator>Kuroneko</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://www.dubasdey.com/2007/05/31/asunto-subject-de-emails-con-caracteres-especiales/</guid>
		<description><![CDATA[Muchas veces pasa que en nuestras aplicaciones requerimos el env&#237;o de eMails, y muy posiblemente en el subject del mismo queramos poner textos con acentos u otros caracteres, y nos encontramos con la sorpresa de que esos caracteres no sale correctamente.
El error es debido a que las cabeceras de coreo se procesan como datos de [...]]]></description>
			<content:encoded><![CDATA[<p>Muchas veces pasa que en nuestras aplicaciones requerimos el env&iacute;o de eMails, y muy posiblemente en el subject del mismo queramos poner textos con acentos u otros caracteres, y nos encontramos con la sorpresa de que esos caracteres no sale correctamente.</p>
<p>El error es debido a que las cabeceras de coreo se procesan como datos de 7 bits. Para corregir esto hemos de codificar la linea subject para usar otra codificaci&oacute;n, la mas t&iacute;pica es la Base64 (&#8220;B&#8221;). </p>
<p>Para la codificaci&oacute;n del subject en Base 64 debemos simplemente de crear una nueva cadena de Subject con el formato</p>
<p><code><br />
=?<strong>CHARSET</strong>?<strong>B</strong>?<strong>CODIGOBASE64</strong>=?=<br />
</code></p>
<p>donde <strong>CHARSET</strong>  es la codificaci&oacute;n de la cadena (Ej: UTF-8 o ISO-8859-1) la <strong>B</strong> indica que la cadena ira codificada en Base64 y en el espacio donde eta <strong>CODIGOBASE64</strong> ira la cadena del subject codificada.</p>
<p>de modo que quedar&iacute;a algo tal que as&iacute; en la cabecera (para la cadena &#8220;Acentos &aacute; &eacute; &iacute; &oacute; &&uacute;acute; &ntilde; &ntilde; &aacute; &eacute; &iacute; &oacute; &&uacute;acute;&#8221; y con codificaci&oacute;n UTF-8 usando Base64):</p>
<p><code><br />
Subject: Acentos =?UTF-8?B?w6Egw6kgw60gw7Mgw7ogw7Egw5Egw4Egw4kgw40gw5Mgw5o=?=<br />
</code></p>
<p>Otra cosa que podemos ver en este ejemplo es que no todo el Subject esta codificado, la palabra &#8220;Acentos&#8221; esta fuera de la codificaci&oacute;n, se pueden codificar solo partes del Subject y no el Subject entero.</p>
<p>Esto es muy &&uacute;acute;til especialmente en <a href="http://www.php.net">PHP </a>, donde el env&iacute;o de email se realiza a bajo nivel y no codifica autom&aacute;ticamente la cabecera.</p>
<p>Para realizar la codificaci&oacute;n en Base64 en <a href="http://www.php.net">PHP </a> tenemos la funci&oacute;n <code>base64_encode</code> lo que nos hace el proceso mucho mas sencillo.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dubasdey.com/2007/05/31/asunto-subject-de-emails-con-caracteres-especiales/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Reemplazar Patrones con PHP y Regex</title>
		<link>http://www.dubasdey.com/2007/05/30/reemplazar-patrones-con-php-y-regex/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=reemplazar-patrones-con-php-y-regex</link>
		<comments>http://www.dubasdey.com/2007/05/30/reemplazar-patrones-con-php-y-regex/#comments</comments>
		<pubDate>Wed, 30 May 2007 13:11:44 +0000</pubDate>
		<dc:creator>Manuel Cernuda</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://www.dubasdey.com/2007/05/30/reemplazar-patrones-con-php-y-regex/</guid>
		<description><![CDATA[
Tras una peque&#241;a iniciaci&#243;n a las Expresiones Regulares,  vamos a ver su aplicaci&#243;n en un contexto espec&#237;fico. Para ello utilizaremos PHP y las funciones ereg($expresion, $cadena) y ereg_replace($expresion ,$sustituci&#243;n, $cadena).
Como ya me comentaron en men&#233;ame acerca del anterior articulo, tambi&#233;n existen otras funciones basadas en PERL , que son m&#225;s potentes, pero no son [...]]]></description>
			<content:encoded><![CDATA[<p><img src='http://www.dubasdey.com/wp-content/uploads/2007/04/logophp.png' alt='PHP' /><br />
Tras una peque&ntilde;a iniciaci&oacute;n a las <a href="http://es.wikipedia.org/wiki/Expresiones_regulares" target="_blank" title="Expresiones Regulares en la Wikipedia">Expresiones Regulares</a>,  vamos a ver su aplicaci&oacute;n en un contexto espec&iacute;fico. Para ello utilizaremos <abbr lang="en" title="PHP: Hypertext Preprocessor">PHP</abbr> y las funciones <code>ereg($expresion, $cadena)</code> y <code>ereg_replace($expresion ,$sustituci&oacute;n, $cadena)</code>.</p>
<p>Como ya <a href="http://meneame.net/story/expresiones-regulares-explicacion-para-dummies/" target="_blank" title="melkorcete en Meneame.net">me comentaron en men&eacute;ame</a> acerca del anterior articulo, tambi&eacute;n existen otras funciones basadas en <a href="http://es.wikipedia.org/wiki/PERL" target="_blank" title="PERL en la Wikipedia">PERL </a>, que son m&aacute;s potentes, pero no son tan compatibles como las pintan, ya que la mayor&iacute;a de los servidores traen desactivada la compatibilidad con ellas. Por ello decid&iacute; usar solo las funciones nativas de <abbr lang="en" title="PHP: Hypertext Preprocessor">PHP</abbr>.</p>
<p>El ejemplo que vamos a usar es el de eliminar <abbr lang="en" title="Hyper Text Markup Language">HTML</abbr> de unos ficticios comentarios de cara a su almacenamiento en una <abbr lang="en" title="Data Base">DB</abbr>. Para ello ya existe la funci&oacute;n <code>strip_tags($cadena,[excepciones])</code>, pero haremos como si no existiera para probar las <a href="http://es.wikipedia.org/wiki/Expresiones_regulares" target="_blank" title="Expresiones Regulares en la Wikipedia">Expresiones Regulares</a>. </p>
<p>Lo primero que tenemos que tener claro es que patr&oacute;n debemos simular: Buscamos una cadena de caracteres &quot;encerrada&quot; entre unas posibles etiquetas de <abbr lang="en" title="Hyper Text Markup Language">HTML</abbr> (que pueden ser reales o no). Por ejemplo: <code>&lt;b&gt;Texto&lt;/b&gt;</code> &oacute; <code>&lt;melkorcete&gt;Texto&lt;/melkorcete&gt;</code>. Pero tambi&eacute;n vamos a poder eliminar etiquetas de <abbr lang="en" title="eXtensible Hyper Text Markup Language">XHTML</abbr> como <code>&lt;img src=&quot;ola&quot; /&gt;</code>. Con esto lograremos una <a href="http://es.wikipedia.org/wiki/Expresiones_regulares" target="_blank" title="Expresiones Regulares en la Wikipedia">Expresi&oacute;n Regular</a> bastante completa. </p>
<p>Vamos a desglosarla por partes para ir poco a poco.</p>
<p><code><br />
// Por definici&oacute;n, debe comenzar por < seguido de cualquier caracter distinto a<br />
// < y que se puede repetir de una a infinitas veces. Se cierra con > o sin &eacute;l<br />
// (de cara al XHTML se usa ? y no *)<br />
$expresion = "<[^>]+>?";</p>
<p>// Ahora el contenido de la etiqueta que debe ser cualquier caracter distinto de los corchetes<br />
// y que puede o no existir (de cara al XHTML). Esta vez entre par&eacute;ntesis para capturarlo despu&eacute;s.<br />
$expresion .= "([^>|^<]*)";</p>
<p>// Ahora el cierre del HTML con la opcion de XHTML incluida<br />
$expresion.= "<?\\/[^>]*>";</p>
<p>// Lo que nos deja en total:<br />
$expresion = "<[^>]+>?([^>|^<]*)<?\\/[^>]*>";<br />
</code></p>
<p>Una vez conseguido el patr&oacute;n, ahora vamos a crear nuestra funci&oacute;n en <abbr lang="en" title="PHP: Hypertext Preprocessor">PHP</abbr>. Esta debe tener un comportamiento recurrente para solventar un posible anidamiento de etiquetas. Es decir, que tambi&eacute;n reemplace <code>&lt;b&gt;&lt;i&gt;hola&lt;/i&gt;&lt;/b&gt;</code> o casos parecidos: </p>
<p><code><br />
// Limpiar HTML de una funcion<br />
// $opcion define si la cadena de salida usara previamente un htmlentities();<br />
function limpiarHTML($cadena,$opcion) {<br />
   $expresion = "<[^>]+>?([^>|^<]*)<?\\/[^>]*>";</p>
<p>    while (ereg($expresion,$cadena) == true) {<br />
        $cadena = ereg_replace($expresion,\’\\\\1\’,$cadena);<br />
    }</p>
<p>    if ($opcion) {<br />
        return htmlentities($cadena);<br />
    } else {<br />
        return $cadena;<br />
    }<br />
</code></p>
<p>Con esta funci&oacute;n ya tendr&iacute;amos lo que necesitamos, que mientras que <code>ereg()</code> devuelva <code>true</code> (encontr&oacute; una etiqueta) vaya reemplazando toda la etiqueta por solo el contenido. </p>
<p>Con esto creo que ya pod&eacute;is haceros una idea del uso de las <a href="http://es.wikipedia.org/wiki/Expresiones_regulares" target="_blank" title="Expresiones Regulares en la Wikipedia">Expresiones Regulares</a> , no obstante, pr&oacute;ximamente pondr&eacute; un art&iacute;culo relacionado con <a href="http://es.wikipedia.org/wiki/.NET" target="_blank" title="dotNET en la Wikipedia">.NET</a> y las <a href="http://es.wikipedia.org/wiki/Regex" target="_blank" title="Regex en la Wikipedia">Regex</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dubasdey.com/2007/05/30/reemplazar-patrones-con-php-y-regex/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Convertir saltos de l&#237;nea</title>
		<link>http://www.dubasdey.com/2007/05/16/convertir-saltos-de-lnea/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=convertir-saltos-de-lnea</link>
		<comments>http://www.dubasdey.com/2007/05/16/convertir-saltos-de-lnea/#comments</comments>
		<pubDate>Wed, 16 May 2007 11:46:47 +0000</pubDate>
		<dc:creator>Manuel Cernuda</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://www.dubasdey.com/2007/05/16/convertir-saltos-de-lnea/</guid>
		<description><![CDATA[
Por lo general, si guardas los datos de tu p&#225;gina en una Base de Datos como MySQL, te habr&#225;s percatado de que al volcar los datos directamente con un print $fila[&#34;Columna&#34;], no respetaba los saltos de carro (tecla enter) que no fueran creados en XHTML con &#60;br /&#62;. 
A partir de ahora no tendras ese [...]]]></description>
			<content:encoded><![CDATA[<p><img src='http://www.dubasdey.com/wp-content/uploads/2007/04/logophp.png' alt='PHP' /></p>
<p>Por lo general, si guardas los datos de tu p&aacute;gina en una Base de Datos como <a href="http://www.mysql.com" title="Get MySQL">MySQL</a>, te habr&aacute;s percatado de que al volcar los datos directamente con un <code>print $fila[&quot;Columna&quot;]</code>, no respetaba los saltos de carro (tecla enter) que no fueran creados en <abbr lang="en" title="eXtensible Hypertext Markup Language">XHTML</abbr> con <code>&lt;br /&gt;</code>. </p>
<p>A partir de ahora no tendras ese problema, s&oacute;lo tienes que usar esta funci&oacute;n: </p>
<pre name="code" class="php:nocontrols">
// Creamos la consulta y la ejecutamos
 $resultado = mysql_query("select * from posts where idpost = 2") or die (mysql_error());
 $fila = mysql_fetch_array($resultado);

 // Si solo quereis convertir el /n en  :
 print nl2br( $fila["POST"]);

// Si ademas quereis convertir el XHTML para evitar que se interprete:
 print nl2br(htmlentities($fila["POST"]));
</pre>
<p>
A los que os preocupe un posible fallo de validaci&oacute;n de <abbr lang="en" title="eXtensible Hypertext Markup Language">XHTML</abbr>, no os preocupeis, se renderiza con <code>&lt;br /&gt;</code> no con <code>&lt;br&gt;</code> as&iacute; que es perfectamente v&aacute;lido. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.dubasdey.com/2007/05/16/convertir-saltos-de-lnea/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Enlaces para enviar a las Comunidades</title>
		<link>http://www.dubasdey.com/2007/05/12/enlaces-para-enviar-a-las-comunidades/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=enlaces-para-enviar-a-las-comunidades</link>
		<comments>http://www.dubasdey.com/2007/05/12/enlaces-para-enviar-a-las-comunidades/#comments</comments>
		<pubDate>Sat, 12 May 2007 11:43:22 +0000</pubDate>
		<dc:creator>Manuel Cernuda</dc:creator>
				<category><![CDATA[Blogs]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[web2.0]]></category>

		<guid isPermaLink="false">http://www.dubasdey.com/2007/05/12/enlaces-para-enviar-a-las-comunidades/</guid>
		<description><![CDATA[
Ahora que en la Web 2.0 se han puesto de moda las comunidades de promoci&#243;n de noticias, todos tenemos que dejar de una manera accesible al usuario la posibilidad de enviar el permalink de nuestra web.

Por l&#243;gica tambi&#233;n seria &#250;til poder situarlos en nuestro RSS as&#237; que crearemos una funci&#243;n que genere el acceso a [...]]]></description>
			<content:encoded><![CDATA[<p><img src='http://www.dubasdey.com/wp-content/uploads/2007/04/logophp.png' alt='PHP' /></p>
<p>Ahora que en la <a href="http://es.wikipedia.org/wiki/Web_2.0" target="_blank" title="Web 2.0">Web 2.0</a> se han puesto de moda las comunidades de promoci&oacute;n de noticias, todos tenemos que dejar de una manera accesible al usuario la posibilidad de enviar el permalink de nuestra web.<br />
<br />
Por l&oacute;gica tambi&eacute;n seria &uacute;til poder situarlos en nuestro <abbr lang="en" title="Really Simple Syndication">RSS</abbr> as&iacute; que crearemos una funci&oacute;n que genere el acceso a estos servicios sin repetir c&oacute;digo. </p>
<pre>
<textarea name="code" class="php:nocontrols">
 // Comunidades
 function getComunities($postid) {
     $posturl = "http://www.melkorcete.com/index.php?p="; // Tu web hasta la variable $_GET
     $url = htmlentities( $posturl.$postid);                               // De cara a validacion
     ?>
         <a href="http://del.icio.us/post?url=<?= $url ?>" target="_blank">
             <img src="icos/delicious_s.gif" alt="Add to del.icio.us" />
         </a>
         <a href="http://meneame.net/submit.php?url=<?= $url ?>" target="_blank">
             <img src="icos/menealo.png" alt="Men&eacute;alo" />
         </a>
         <a href="http://digg.com/submit?phase=2&#038;url=<?= $url ?>" target="_blank">
             <img src="icos/digg.png" alt="Digg" />
         </a>
         <a href="http://tec.fresqui.com/post?url=<?= $url ?>" target="_blank">
             <img src="icos/fresqui.png" alt="Fresqui" />
         </a>
         <a href="http://www.blogmemes.com/post.php?url=<?= $url ?>" target="_blank">
             <img src="icos/blogmemes.png" alt="BlogMemes" />
         </a>
         <a href="http://furl.net/storeIt.jsp?&#038;u=<?= $url ?>" target="_blank">
             <img src="icos/toonfuse.png" alt="Furl" />
         </a>
         <a href="http://www.neodiario.net/submit.php?url=<?= $url ?>" target="_blank">
             <img src="icos/neodiario.png" alt="NeoDiario" />
         </a>
         <a href="http://www.melkorcete.com/index.php?p=<?= $postid ?>" target="_blank">
             <img src="icos/permalink.png" alt="Permalink" />
         </a>
     <?
 }
</textarea>
</pre>
<p>
Ahora solo faltar&iacute;a hace la llamada a esa funci&oacute;n donde quer&aacute;is que se incluyan nuestros enlaces. Estos ya est&aacute;n preparados para enviar correctamente, y los iconos pod&eacute;is copiarlos de esta misma web, con click derecho / guardar imagen como&#8230; </p>
<p>Espero que os sea de utilidad. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.dubasdey.com/2007/05/12/enlaces-para-enviar-a-las-comunidades/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Como crear un Random-Post</title>
		<link>http://www.dubasdey.com/2007/04/25/como-crear-un-random-post/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=como-crear-un-random-post</link>
		<comments>http://www.dubasdey.com/2007/04/25/como-crear-un-random-post/#comments</comments>
		<pubDate>Wed, 25 Apr 2007 10:36:53 +0000</pubDate>
		<dc:creator>Manuel Cernuda</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://www.dubasdey.com/2007/04/25/como-crear-un-random-post/</guid>
		<description><![CDATA[
Otro de los &#34;servicios&#34; que se han puesto de moda &#250;ltimamente es el &#161;Salta!. Este no es m&#225;s que un enlace a una entrada de la web pero escogida de forma aleatoria.



Despu&#233;s de esto solo quedar&#237;a explicar que significa lastPostID() y postExist(). Son dos funciones simples que utilizaremos para obtener el ultimo ID de nuestros [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.melkorcete.com/logos/howto.png" alt="HowTo" class="imagenpost" /><br />
Otro de los &quot;servicios&quot; que se han puesto de moda &uacute;ltimamente es el &iexcl;Salta!. Este no es m&aacute;s que un enlace a una entrada de la web pero escogida de forma aleatoria.<br />
<br />
<br /<br />
Si tu <abbr lang="en" title="Content Management System">CMS</abbr> no tiene un plugin que sirva para ello, o quieres hacerlo por ti mismo, hay una manera no intrusiva de hacerlo. No tienes m&aacute;s que crear un archivo <abbr lang="en" title="PHP: Hypertext Preprocessor">PHP</abbr> que calcule el random y genere un enlace a un post aleatorio existente, y que luego redireccione la pagina actual a ese enlace.</p>
<p><code><br />
<?php<br />
     $random = rand(1,lastPostID());<br />
     while (!postExist($random)) {<br />
         $random = rand(1,lastPostID());<br />
     }<br />
     header("Location: http://www.web.com/index.php?p=".$random);<br />
?><br />
</code></p>
<p>Despu&eacute;s de esto solo quedar&iacute;a explicar que significa <code>lastPostID()</code> y <code>postExist()</code>. Son dos funciones simples que utilizaremos para obtener el ultimo ID de nuestros posts de cara a saber la longitud m&aacute;xima del random, y para saber si el random en cuesti&oacute;n existe o no. Mientras no exista seguir&aacute; recalcul&aacute;ndose y volviendo a generar un random. Cuando una exista, lanzara el header y redireccionar&aacute; la p&aacute;gina. Aqu&iacute; os dejo las funciones.</p>
<p><code><br />
// Comprobar si un post existe<br />
function postExist($idpost) {<br />
    if (is_numeric($idpost)) {<br />
       $resultado = mysql_query("select * from posts where idpost=".$idpost);<br />
        while ($fila=mysql_fetch_array($resultado)) {<br />
            return true;<br />
        }<br />
    }<br />
    return false;<br />
}</p>
<p>// Obtener el ultimo POSTID<br />
function lastPostID() {<br />
    $resultado = mysql_query("select max(IDPOST) as IDPOST from posts");<br />
    $fila=mysql_fetch_array($resultado);<br />
    return $fila["IDPOST"];<br />
}<br />
</code></p>
<p>Sencillo &iquest;verdad? Ya no hay excusa para no estar a la &uacute;ltima <img src='http://www.dubasdey.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.dubasdey.com/2007/04/25/como-crear-un-random-post/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Como crear un RSS para tu p&#225;gina (y II)</title>
		<link>http://www.dubasdey.com/2007/04/24/como-crear-un-rss-para-tu-pgina-y-ii/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=como-crear-un-rss-para-tu-pgina-y-ii</link>
		<comments>http://www.dubasdey.com/2007/04/24/como-crear-un-rss-para-tu-pgina-y-ii/#comments</comments>
		<pubDate>Tue, 24 Apr 2007 09:12:04 +0000</pubDate>
		<dc:creator>Manuel Cernuda</dc:creator>
				<category><![CDATA[Blogs]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[RSS]]></category>
		<category><![CDATA[Sindicacion]]></category>

		<guid isPermaLink="false">http://www.dubasdey.com/2007/04/24/como-crear-un-rss-para-tu-pgina-y-ii/</guid>
		<description><![CDATA[
Ahora solo falta saber como generar&#237;amos este c&#243;digo XML desde nuestra web de manera autom&#225;tica. Para ello utilizaremos PHP conectado a nuestra base de datos de MySQL (Voy a ponerlo lo mas gen&#233;rico posible, cada uno, incluido yo, tenemos nuestras funciones de acceso a base de datos, pero as&#237; todo el mundo podr&#225; verlo de [...]]]></description>
			<content:encoded><![CDATA[<p><img src='http://www.dubasdey.com/wp-content/uploads/2007/04/rss.png' alt='RSS' /><br />
Ahora solo falta saber como generar&iacute;amos este c&oacute;digo <abbr lang="en" title="eXtensible Markup Language">XML</abbr> desde nuestra web de manera autom&aacute;tica. Para ello utilizaremos <abbr lang="en" title="PHP: Hypertext Preprocessor">PHP</abbr> conectado a nuestra base de datos de <a href="http://www.mysql.com" title="Get MySQL">MySQL</a> (Voy a ponerlo lo mas gen&eacute;rico posible, cada uno, incluido yo, tenemos nuestras funciones de acceso a base de datos, pero as&iacute; todo el mundo podr&aacute; verlo de manera clara). </p>
<p>\r\n			Para empezar, el archivo ser&aacute; un .php para que el servidor ejecute nuestro c&oacute;digo, pero para ello necesitamos enga&ntilde;ar al navegador cambiando el content type del archivo, para que una vez ejecutado se interprete como <abbr lang="en" title="eXtensible Markup Language">XML</abbr> y no como <abbr lang="en" title="eXtensible Hypertext Markup Language">XHTML</abbr> o <abbr lang="en" title="Hypertext Markup Language">HTML</abbr>.</p>
<p><code><br />
<?php<br />
header("Content-type: text/xml; charset=ISO-8859-1",true);<br />
print "<?xml version=\\"1.0\\" encoding=\\"ISO-8859-1\\" ?>";<br />
?><br />
</code></p>
<p>Inmediatamente despu&eacute;s, comenzar&iacute;amos rellenando la informaci&oacute;n del channel manualmente excepto el <code>&lt;pubDate&gt;</code> que puede automatizarse. La parte interesante llega con los <code>&lt;item&gt;</code>. Haremos una consulta que nos devuelva las ultimas 25 entradas de nuestra p&aacute;gina (esta os toca hacerla a vosotros, ya que cada modelo de datos es diferente, y no funcionaria una en general). Ser&aacute; del estilo a esta:</p>
<p><code><br />
SELECT * FROM POSTS ORDER BY POSTID DESC LIMIT 0,25<br />
</code>	</p>
<p>Ahora utilizaremos esa consulta para recorrer los resultados generando un <code>&lt;item&gt;</code> por cada fila que nos devuelva. Para ello usaremos la conexi&oacute;n entre <abbr lang="en" title="PHP: Hypertext Preprocessor">PHP</abbr> y <a href="http://www.mysql.com" title="Get MySQL">MySQL</a>.\r\n	</p>
<p><code><br />
<?php</p>
<p>     // Objeto de Conexi&oacute;n<br />
      $conexion = mysql_pconnect(\’RUTA_SERVIDOR\’,\’USUARIO\’,\’CONTRASE&ntilde;A\’);<br />
      mysql_select_db(\’NOMBRE_BD\’,$conexion) or die(mysql_error());</p>
<p>    // Ejecutar la consulta ($consulta contiene la consulta SQL citada anteriormente)</p>
<p>    $resultado = mysql_query($consulta) or die(mysql_error());<br />
    // Mientras $resultado siga devolviendo filas creamos un <item><br />
    while ($fila=mysql_fetch_array($resultado)) {<br />
        ?><br />
            <item></p>
<link>http://www.web.com/index.php?p=<?= $fila["POSTID"] ?></link>
<pubDate><?= date("r",makeDate($fila["FECHA"])) ?></pubDate>
                <dc:creator>AUTOR&lt;AUTORl@web.com&gt;</dc:creator><br />
                <guid isPermaLink="true">http://web.com/index.php?p=<?=$fila["IDPOST"] ?></guid></p>
<p>                <description><![CDATA[ <?=$fila["POST"] ?>]]&gt;</description><br />
             </item><br />
         <?<br />
     }</p>
<p>?><br />
</code></p>
<p>Como ya avise antes, hay que tener cuidado con las con las fechas del <code>&lt;pubDate&gt;</code>, para eso utilizo una funci&oacute;n que me paso <a href="http://dubasdey.com/rss.php" title="RSS" target="_blank"><img src="http://www.melkorcete.com/icos/feed.png" alt="Feed" border="0" /></a><a href="http://dubasdey.com" target="_blank" title="El Caj&oacute;n Desastre">dubas</a> que soluciona ese problemilla convirtiendo la fecha al formato de <a href="http://asg.web.cmu.edu/rfc/rfc822.html" target="_blank" title="RFC 822">RFC 822</a> v&aacute;lido. </p>
<p><code><br />
 function makeDate($date) {<br />
      $dm=explode(\’ \’,$date);<br />
      $f=explode(\’-\’,$dm[0]);<br />
      $h=explode(":",$dm[1]);<br />
      return mktime($h[0],$h[1],$h[2],$f[1],$f[2],$f[0]);<br />
 }<br />
</code></p>
<p>Con esto ya tendr&iacute;ais la base de vuestro <abbr lang="en" title="Really Simple Syndication">RSS</abbr>, otras cosas que pod&eacute;is a&ntilde;adirle, es controlar si se introducen valores por <code>$_GET</code> (rss.php?c=1) para tener <abbr lang="en" title="Really Simple Syndication">RSS</abbr> que filtre por categor&iacute;as. Eso ya os lo dejo a vuestro criterio. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.dubasdey.com/2007/04/24/como-crear-un-rss-para-tu-pgina-y-ii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP : Identificar la IP Real del Usuario</title>
		<link>http://www.dubasdey.com/2007/04/16/php-identificar-la-ip-real-del-usuario/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=php-identificar-la-ip-real-del-usuario</link>
		<comments>http://www.dubasdey.com/2007/04/16/php-identificar-la-ip-real-del-usuario/#comments</comments>
		<pubDate>Mon, 16 Apr 2007 18:44:03 +0000</pubDate>
		<dc:creator>Manuel Cernuda</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://www.dubasdey.com/2007/04/16/php-identificar-la-ip-real-del-usuario/</guid>
		<description><![CDATA[
Cuando estaba haciendo el sistema de estad&#237;sticas de la web, me vino a la mente que muchos usuarios de los que tengo constancia que visitan o iban a visitar en un futuro la p&#225;gina navegan habitualmente tras un proxy. Yo quer&#237;a almacenar las IPs de cara a una futura ampliaci&#243;n de las estad&#237;sticas en las [...]]]></description>
			<content:encoded><![CDATA[<p><img src='http://www.dubasdey.com/wp-content/uploads/2007/04/logophp.png' alt='PHP' /></p>
<p>Cuando estaba haciendo el sistema de estad&iacute;sticas de la web, me vino a la mente que muchos usuarios de los que tengo constancia que visitan o iban a visitar en un futuro la p&aacute;gina navegan habitualmente tras un <a href="http://es.wikipedia.org/wiki/Proxy" target="_blank" title="Proxy en Wikipedia">proxy</a>. Yo quer&iacute;a almacenar las <abbr lang="en" title="Internet Protocol">IP</abbr>s de cara a una futura ampliaci&oacute;n de las estad&iacute;sticas en las que a&ntilde;adiera una localizaci&oacute;n geogr&aacute;fica, adem&aacute;s de distinguir y eliminar mis propias visitas para una mayor transparencia dichas estad&iacute;sticas.</p>
<p>Buscando informaci&oacute;n acerca de obtener la <abbr lang="en" title="Internet Protocol">IP</abbr> real (en los casos en los que fuera posible) me tropec&eacute; con <a href="http://www.eslomas.com/index.php/archives/2005/04/26/obtencion-ip-real-php/" title="Obtenci&oacute;n de una IP real" target="_blank">un art&iacute;culo interesante</a> sobre como los distintos <a href="http://es.wikipedia.org/wiki/Proxy" target="_blank" title="Proxy en Wikipedia">proxies</a> alteran los datos del navegador para enmascarar su propia <abbr lang="en" title="Internet Protocol">IP</abbr>.</p>
<p>Por lo general el navegador env&iacute;a la cabecera <code>$_SERVER[\'REMOTE_ADDR\']</code> al servidor con la <abbr lang="en" title="Internet Protocol">IP</abbr> original del usuario. Si este no estuviera detr&aacute;s de un <a href="http://es.wikipedia.org/wiki/Proxy" target="_blank" title="Proxy en Wikipedia">proxy</a>, esa ser&iacute;a la <abbr lang="en" title="Internet Protocol">IP</abbr> deseada, pero&#8230; &#191;C&oacute;mo altera el <a href="http://es.wikipedia.org/wiki/Proxy" target="_blank" title="Proxy en Wikipedia">proxy</a> esta cabecera para ocultar los datos reales?</p>
<p>Todo depende del tipo de <a href="http://es.wikipedia.org/wiki/Proxy" target="_blank" title="Proxy en Wikipedia">proxy</a> que se est&eacute; utilizando. Un <a href="http://es.wikipedia.org/wiki/Proxy" target="_blank" title="Proxy en Wikipedia">proxy</a> Transparente, copia el contenido de <code>$_SERVER[\'REMOTE_ADDR\']</code> en la cabecera <code>$_SERVER[\'HTTP_X_FORWARDED_FOR\']</code> para justo a continuaci&oacute;n colocar la suya propia en el <code>$_SERVER[\'REMOTE_ADDR\']</code> confundiendo en el mayor de los casos a las p&aacute;ginas visitadas.</p>
<p>El resto de <a href="http://es.wikipedia.org/wiki/Proxy" target="_blank" title="Proxy en Wikipedia">proxies</a> son bastante m&aacute;s seguros, y no dan lugar a la obtenci&oacute;n de la <abbr lang="en" title="Internet Protocol">IP</abbr> original (lo que en principio es l&oacute;gico, ya que la mayor&iacute;a de la gente los utiliza para ello). Los <a href="http://es.wikipedia.org/wiki/Proxy" target="_blank" title="Proxy en Wikipedia">proxies</a> An&oacute;nimos pueden ser de varios tipos, y cada uno de ellos oculta la informaci&oacute;n de una manera caracter&iacute;stica. Los simples, a&ntilde;aden su <abbr lang="en" title="Internet Protocol">IP</abbr> en ambas cabeceras, los ruidosos van un paso mas lejos, tratan de enga&ntilde;ar a&uacute;n m&aacute;s generando de forma aleatoria una <abbr lang="en" title="Internet Protocol">IP</abbr> para el <code>\'HTTP_X_FORWARDED_FOR\'</code> y ponen la suya en el <code>\'REMOTE_ADDR\'</code> ergo a los ojos de la p&aacute;gina seria dif&iacute;cil discernir de un <a href="http://es.wikipedia.org/wiki/Proxy" target="_blank" title="Proxy en Wikipedia">proxy</a> de tipo transparente.</p>
<p>Los mas complejos son los de alta anonimicidad, ya que &uacute;nicamente cambian la cabecera <code>\'REMOTE_ADDR\'</code> con su propia <abbr lang="en" title="Internet Protocol">IP</abbr> y dejan <code>\'HTTP_X_FORWARDED_FOR\'</code> en blanco, por lo que es pr&aacute;cticamente imposible determinar si se esta usando un <a href="http://es.wikipedia.org/wiki/Proxy" target="_blank" title="Proxy en Wikipedia">proxy</a> o no.</p>
<p>Despu&eacute;s de esto ya estamos listos para enfrentarnos al c&oacute;digo que comparte con nosotros <a href="http://www.eslomas.com/index.php/acerca-de/patxi-echarte" title="Paxti Echarte" target="_blank">Patxi Echarte</a> en su <a href="http://www.eslomas.com" title="Eslomas.com" target="_blank">p&aacute;gina</a> y que en encontrado de lo m&aacute;s &uacute;til.</p>
<p>function getRealIP&#40;&#41;<br />				{<br />				&nbsp;&nbsp;&nbsp;&nbsp;				&nbsp;&nbsp;&nbsp;&nbsp;<span class="marino">if</span> &#40;<span class="rojo"> &#36;_SERVER</span>[<span class="cadena">&#39;HTTP_X_FORWARDED_FOR&#39;</span>] &#33;= <span class="cadena">&#39;&#39;</span> &#41;<br />				&nbsp;&nbsp;&nbsp;&nbsp;{<br />				&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="rojo">&nbsp;&#36;client_ip</span> =<br />				&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#40; &#33;<span class="azul">empty</span>&#40;<span class="rojo">&#36;_SERVER</span>[<span class="cadena">&#39;REMOTE_ADDR&#39;</span>]&#41; &#41; &#63;<br />				&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="rojo">&#36;_SERVER</span>[<span class="cadena">&#39;REMOTE_ADDR&#39;</span>]<br />				&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:<br />				&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#40; &#40; &#33;<span class="azul">empty</span>&#40;<span class="rojo">&#36;_ENV</span>[<span class="cadena">&#39;REMOTE_ADDR&#39;</span>]&#41; &#41; &#63;<br />				&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="rojo">&#36;_ENV</span>[<span class="cadena">&#39;REMOTE_ADDR&#39;</span>]<br />				&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:<br />				&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="cadena">&nbsp;&#34;unknown&#34;</span> &#41;;<br />				&nbsp;&nbsp;&nbsp;&nbsp;<br />				<span class="comentario">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#47;&#47; los proxys van a&ntilde;adiendo al final de esta cabecera<br />				&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#47;&#47; las direcciones ip que van &#34;ocultando&#34;. Para localizar la ip real<br />				&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#47;&#47; del usuario se comienza a mirar por el principio hasta encontrar<br />				&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#47;&#47; una direcci&oacute;n ip que no sea del rango privado. En caso de no<br />				&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#47;&#47; encontrarse ninguna se toma como valor el REMOTE_ADDR</span><br />				&nbsp;&nbsp;&nbsp;&nbsp;<br />				&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="rojo">&nbsp;&#36;entries</span> = <span class="azul">split</span>&#40;<span class="cadena">&#39;[, ]&#39;</span>,<span class="rojo"> &#36;_SERVER</span>[<span class="cadena">&#39;HTTP_X_FORWARDED_FOR&#39;</span>]&#41;;<br />				&nbsp;&nbsp;&nbsp;&nbsp;<br />				&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="azul">&nbsp;reset</span>&#40;<span class="rojo">&#36;entries</span>&#41;;<br />				&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="marino">while</span> &#40;<span class="azul">list</span>&#40;, <span class="rojo">&#36;entry</span>&#41; = <span class="azul">each</span>&#40;<span class="rojo">&#36;entries</span>&#41;&#41;<br />				&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />				&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="rojo">&#36;entry</span> =<span class="azul"> trim</span>&#40;<span class="rojo">&#36;entry</span>&#41;;<br />				&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="marino">&nbsp;&nbsp;if</span> &#40; <span class="azul">preg_match</span>&#40;<span class="cadena">&#34;&#47;^&#40;[0-9]+&#92;.[0-9]+&#92;.[0-9]+&#92;.[0-9]+&#41;&#47;&#34;</span>, <span class="rojo">&#36;entry</span>, <span class="rojo">&#36;ip_list</span>&#41; &#41;<br />				&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />				&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comentario">&nbsp;&#47;&#47; http:&#47;&#47;www.faqs.org&#47;rfcs&#47;rfc1918.html</span><br />				&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="rojo">&#36;private_ip</span> = <span class="azul">array</span>&#40;<br />				&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="cadena">&nbsp;&#39;&#47;^0&#92;.&#47;&#39;</span>,<br />				&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="cadena">&nbsp;&#39;&#47;^127&#92;.0&#92;.0&#92;.1&#47;&#39;</span>,<br />				&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="cadena">&nbsp;&#39;&#47;^192&#92;.168&#92;..*&#47;&#39;</span>,<br />				&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="cadena">&#39;&#47;^172&#92;.&#40;&#40;1[6-9]&#41;|&#40;2[0-9]&#41;|&#40;3[0-1]&#41;&#41;&#92;..*&#47;&#39;</span>,<br />				&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="cadena">&nbsp;&#39;&#47;^10&#92;..*&#47;&#39;</span>&#41;;<br />				&nbsp;&nbsp;&nbsp;&nbsp;<br />				&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="rojo">&nbsp;&#36;found_ip</span> =<span class="azul"> preg_replace</span>&#40;<span class="rojo">&#36;private_ip</span>, <span class="rojo">&#36;client_ip</span>,<span class="rojo"> &#36;ip_list</span>[<span class="cadena">1</span>]&#41;;<br />				&nbsp;&nbsp;&nbsp;&nbsp;<br />				&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="marino">&nbsp;&nbsp;if</span> &#40;<span class="rojo">&#36;client_ip</span> &#33;= <span class="rojo">&#36;found_ip</span>&#41;<br />				&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />				&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="rojo">&nbsp;&#36;client_ip</span> = <span class="rojo">&#36;found_ip</span>;<br />				&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="marino">break</span>;<br />				&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />				&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />				&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />				&nbsp;&nbsp;&nbsp;&nbsp;}<br />				&nbsp;&nbsp;&nbsp;&nbsp;<span class="marino">else</span><br />				&nbsp;&nbsp;&nbsp;&nbsp;{<br />				&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="rojo">&#36;client_ip</span> =<br />				&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#40; &#33;<span class="azul">empty</span>&#40;<span class="rojo">&#36;_SERVER</span>[<span class="cadena">&#39;REMOTE_ADDR&#39;</span>]&#41; &#41; &#63;<br />				&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="rojo">&#36;_SERVER</span>[<span class="cadena">&#39;REMOTE_ADDR&#39;</span>]<br />				&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:<br />				&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#40; &#40; &#33;<span class="azul">empty</span>&#40;<span class="rojo">&#36;_ENV</span>[<span class="cadena">&#39;REMOTE_ADDR&#39;</span>]&#41; &#41; &#63;<br />				&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="rojo">&#36;_ENV</span>[<span class="cadena">&#39;REMOTE_ADDR&#39;</span>]<br />				&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:<br />				&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="cadena">&nbsp;&#34;unknown&#34;</span> &#41;;<br />				&nbsp;&nbsp;&nbsp;&nbsp;}<br />				&nbsp;&nbsp;&nbsp;&nbsp;<br />				&nbsp;&nbsp;&nbsp;&nbsp;<span class="marino">return</span> <span class="rojo">&#36;client_ip</span>;<br />				&nbsp;&nbsp;&nbsp;&nbsp;<br />				}			</div>
<p>Espero que os sea de utilidad y gracias de nuevo a <a href="http://www.eslomas.com/index.php/acerca-de/patxi-echarte" title="Paxti Echarte" target="_blank">Patxi</a> por su art&iacute;culo.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dubasdey.com/2007/04/16/php-identificar-la-ip-real-del-usuario/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HowTo : Instalaci&#243;n de AMP</title>
		<link>http://www.dubasdey.com/2007/04/14/howto-instalacin-de-amp/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=howto-instalacin-de-amp</link>
		<comments>http://www.dubasdey.com/2007/04/14/howto-instalacin-de-amp/#comments</comments>
		<pubDate>Sat, 14 Apr 2007 18:29:59 +0000</pubDate>
		<dc:creator>Manuel Cernuda</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Bases de datos]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Redes]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://www.dubasdey.com/2007/04/14/howto-instalacin-de-amp/</guid>
		<description><![CDATA[Para los no iniciados, AMP se le denomina al conjunto que forman Apache, PHP y MySQL. La instalaci&#243;n es muy sencilla, no nos llevara m&#225;s de unos minutos. Para empezar os dejo los links de descarga (Yo utilizo estas versiones, no uso a&#250;n Apache2, PHP5 ni MySQL5).
Apache : descarga gratuita.

PHP : descarga gratuita.

MySQL : descarga [...]]]></description>
			<content:encoded><![CDATA[<p>Para los no iniciados, <abbr lang="es" title="Apache + MySQL + PHP">AMP</abbr> se le denomina al conjunto que forman <a href="http://www.apache.org/" target="_blank" title="Apache">Apache</a>, <a href="http://www.php.net/" target="_blank" title="PHP">PHP</a> y <a href="http://www.mysql.com/" target="_blank" title="MySQL">MySQL</a>. La instalaci&oacute;n es muy sencilla, no nos llevara m&aacute;s de unos minutos. Para empezar os dejo los links de descarga (Yo utilizo estas versiones, no uso a&uacute;n Apache2, PHP5 ni MySQL5).</p>
<p><strong>Apache :</strong> <a href="http://archive.apache.org/dist/httpd/binaries/win32/apache_1.3.37-win32-x86-src.msi" target="_blank" title="Apache 1.3.x">descarga gratuita</a>.<br />
<br />
<strong>PHP :</strong> <a href="http://www.php.net/get/php-4.4.3-Win32.zip/from/a/mirror" target="_blank" title="PHP 4.x">descarga gratuita</a>.<br />
<br />
<strong>MySQL :</strong> <a href="http://dev.mysql.com/get/Downloads/MySQL-4.0/mysql-4.0.26-win32.zip/from/http://mysql.rediris.es/" target="_blank" title="MySQL 4.x">descarga gratuita</a>.</p>
<p><strong>Instalaci&oacute;n PHP:</strong></p>
<p><img src='http://www.dubasdey.com/wp-content/uploads/2007/04/logophp.png' alt='PHP' /><br />
Con diferencia la m&aacute;s sencilla de las tres instalaciones. Se descarga el archivo comprimido, mismamente en <code>c:\\php\\</code>, se  copia el archivo <code>php4ts.dll</code> de <code>c:\\php\\</code> a <code>c:\\%SYSTEMROOT%\\SYSTEM32</code> (ya sea WINNT o WINDOWS), y finalmente se renombra el <code>php.ini-dist</code> a <code>php.ini</code> y se coloca en <code>c:\\%SYSTEMROOT%\\</code> . Y listo, aunque como a&ntilde;adido tambi&eacute;n deb&eacute;is saber que para conectar PHP con algunas <abbr lang="en" title="Support Data Base">SBD</abbr>\&#8217;s es necesario descomentar en el <code>php.ini</code> la <abbr lang="en" title="Dynamic Link Library">dll</abbr> de conexi&oacute;n. Por ejemplo en <a href="http://es.wikipedia.org/wiki/Oracle" target="_blank" title="ORACLE">ORACLE</a>: <code>extension=php_oci8.dll</code></p>
<p><strong>Instalaci&oacute;n Apache:</strong></p>
<p><img src='http://www.dubasdey.com/wp-content/uploads/2007/04/logoapache.png' alt='Apache' /><br />
Esta vez dispondremos de un ejecutable (tras descomprimir si estuviera comprimido), solo tendremos que ejecutarlo y rellenar tres casillas. <code>Network Domain -&gt; 127.0.0.1</code> ; <code>Server Name -&gt; 127.0.0.1</code> ; <code>Administrator\'s Email -&gt; sumail@suproveedor.com</code>. Despu&eacute;s seleccionamos la instalaci&oacute;n completa y listo. Por defecto os quedar&aacute; instalado como un serv&iacute;cio y con arranque autom&aacute;tico. Para modificar esto <code>Inicio / Ejecutar / services.msc</code> , seleccion&aacute;is el <a href="http://www.apache.org/" target="_blank" title="Apache">Apache</a> y doble click. Y pon&eacute;is la configuraci&oacute;n que quer&aacute;is. Adem&aacute;s del <a href="http://www.apache.org/" target="_blank" title="Apache">Apache</a> os agrega un acceso directo a Arrancar, Reiniciar y Parar el servicio de <a href="http://www.apache.org/" target="_blank" title="Apache">Apache</a>. El de reiniciar es muy &uacute;til, ya que cada cambio que se haga en la configuraci&oacute;n requerir&aacute; un reinicio.</p>
<p>El primero de estos cambios ser&aacute; a&ntilde;adirle la carga del m&oacute;dulo de <a href="http://www.php.net/" target="_blank" title="PHP">PHP</a> (para que el <a href="http://www.apache.org/" target="_blank" title="Apache">Apache</a> pueda ejecutar el c&oacute;digo <a href="http://www.php.net/" target="_blank" title="PHP">PHP</a>). Basta con abrir desde el men&uacute; de inicio el archivo <code>httpd.conf</code> que viene con el propio <a href="http://www.apache.org/" target="_blank" title="Apache">Apache</a> y a&ntilde;adir abajo del todo estas dos l&iacute;neas:</p>
<p><code><br />
LoadModule php4_module c:/php/sapi/php4apache.dll<br />
AddType application/x-httpd-php .php<br />
</code></p>
<p>Tambi&eacute;n es recomendable crear una carpeta para el contenido del server (por ejemplo: &quot;c:\\apache&quot;), y cambiar el par&aacute;metro <code>DocumentRoot "c:\\apache\\".</code></p>
<p>Ahora reiniciar el Servidor <a href="http://www.apache.org/" target="_blank" title="Apache">Apache</a> con el acceso directo mismamente y aseguraros de tener abierto el puerto 80 (a no ser que quer&aacute;is cambiarlo, tambi&eacute;n en el <code>php.ini</code>, la opci&oacute;n <code>Listen: 80</code>) para que tengan acceso a vuestro server desde fuera de la red local.</p>
<p>Para hacer una prueba pod&eacute;is usar cualquiera de los cl&aacute;sicos:</p>
<p><code><br />
&lt;?php<br />
phpinfo();<br />
?&gt;</p>
<p>&lt;?php<br />
echo &quot;Hello World!&quot;;<br />
?&gt;<br />
</code></p>
<p>Si entr&aacute;is al <a href="http://es.wikipedia.org/wiki/Localhost" target="_blank" title="Localhost">localhost</a> directamente deber&iacute;a deciros el ya m&iacute;tico mensaje:</p>
<p><strong>&#8220;&iexcl;Funcion&oacute;! &iexcl;El Servidor de Red Apache ha sido instalado en ese sitio!&quot;</strong>, y luego si ejecut&aacute;is el c&oacute;digo, deber&aacute; mostraros el mensaje de <a href="http://es.wikipedia.org/wiki/Hello_world" target="_blank" title="Hello World!">Hola Mundo</a>, o la informaci&oacute;n del sistema.</p>
<p><strong>Instalaci&oacute;n MySQL:</strong></p>
<p><img src="http://www.melkorcete.com/logos/logomysql.png" class="imagenpost" alt="MySQL" /></p>
<p>Ahora nos toca finalizar con la instalaci&oacute;n del <abbr lang="es" title="Apache + MySQL + PHP">AMP</abbr>, y es el turno del <abbr lang="en" title="Support Data Base">SBD</abbr> <a href="http://www.mysql.com/" target="_blank" title="MySQL">MySQL</a>. Para la instalaci&oacute;n, descomprimimos el archivo descargado, ejecutamos el setup.exe y les decimos que instale mismamente en <code>c:\\mysql\\</code> (sobre todo de cara a evitar posteriores cambios en la configuraci&oacute;n). Tras la instalaci&oacute;n, lo m&aacute;s &uacute;til para su posterior manejo, es convertir el servidor en un servicio de windows. Para ello basta con ejecutar: <code>c:\\mysql\\bin\\mysqld --install</code> . As&iacute; pues, pod&eacute;is crearos unos bat para manejarlo simplemente con las &oacute;rdenes <code>net start mysql</code> para arrancarlo y <code>net stop mysql</code> para detenerlo.</p>
<p>Pues solo con estos sencillos pasos tendr&eacute;is instalado todo lo necesario para empezar a programar en <a href="http://www.php.net/" target="_blank" title="PHP">PHP</a> sobre <a href="http://www.apache.org/" target="_blank" title="Apache">Apache</a> con bases de datos de <a href="http://www.mysql.com/" target="_blank" title="MySQL">MySQL</a>. A disfrutar y no os perd&aacute;is algunos trucos que pondre por aqu&iacute;.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dubasdey.com/2007/04/14/howto-instalacin-de-amp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Serializaci&#243;n de clases en PHP4</title>
		<link>http://www.dubasdey.com/2007/03/28/serializacion-de-clases-en-php4/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=serializacion-de-clases-en-php4</link>
		<comments>http://www.dubasdey.com/2007/03/28/serializacion-de-clases-en-php4/#comments</comments>
		<pubDate>Wed, 28 Mar 2007 17:42:25 +0000</pubDate>
		<dc:creator>Kuroneko</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://www.dubasdey.com/2007/03/28/serializacion-de-clases-en-php4/</guid>
		<description><![CDATA[Anteriormente ya hab&#237;a hablado de la programaci&#243;n orientada a objetos en  PHP4, ahora vamos a ir complementado con la serializaci&#243;n de clases.
En PHP las clases se pueden serializar en una cadena de datos mediante la funci&#243;n serialize de PHP, la cual convierte los datos de nuestra clase en una cadena de valores. 
As&#237; mismo [...]]]></description>
			<content:encoded><![CDATA[<p>Anteriormente ya hab&iacute;a hablado de la <a href="http://www.dubasdey.com/2006/10/14/programacion-orientada-a-objetos-poo-en-php4/">programaci&oacute;n orientada a objetos en  PHP4</a>, ahora vamos a ir complementado con la serializaci&oacute;n de clases.</p>
<p>En PHP las clases se pueden serializar en una cadena de datos mediante la funci&oacute;n <strong>serialize</strong> de PHP, la cual convierte los datos de nuestra clase en una cadena de valores. </p>
<p>As&iacute; mismo las clases serializadas se pueden volver a recuperar con la funci&oacute;n <strong>unserialize</strong> devolviendo los valores de la clase otra vez a la misma para recuperar su estado.</p>
<p>Hasta  aqu&iacute; todo bien, pero que pasa si queremos realizar alguna funci&oacute;n extra, o por ejemplo que nuestra clase se conecte con una base de datos y queramos restaurar el recurso de la conexi&oacute;n, ya que aunque tengamos la variable que indica el recurso del enlace de conexi&oacute;n este no seguir&aacute; activo. Pues bien, que no cunda el p&aacute;nico, ya que hay unas funciones &#8220;m&aacute;gicas&#8221; para ello en PHP que nos permiten hacer operaciones antes de serializar y despu&eacute;s de serializar, con las que podemos guardar informaci&oacute;n a las variables globales y preparar nuestra clase para serializarse con todos los par&aacute;metros que necesitemos, y para despu&eacute;s volver a restaurar correctamente la clase.</p>
<p>Antes de serializar usando la clase con <strong>serialize</strong>, si se trata de una clase, PHP llamara a la funci&oacute;n m&aacute;gica <strong>__sleep()</strong> de nuestra clase (que nosotros crearemos), en ella haremos todas las operaciones que necesitemos grabando los datos en variables de la clase, y posteriormente se serializara dicha clase.</p>
<p>Por el contrario al restaurar la clase con <strong>unserialize</strong>, este restaurara primero los valores de las variables y proceder&aacute; a llamar (si existe) a la funci&oacute;n <strong>__wakeup()</strong> para que realice el proceso que se requiera para la restauraci&oacute;n de la clase.</p>
<p>Un ejemplo de una clase de conexi&oacute;n serializable.<br />
<code><br />
class Connection {<br />
    var $link;<br />
    var $server;<br />
    var $username;<br />
    var $password;<br />
    var $db;</p>
<p>    public function Connection($server, $username, $password, $db){<br />
        $this->server = $server;<br />
        $this->username = $username;<br />
        $this->password = $password;<br />
        $this->db = $db;<br />
        $this->connect();<br />
    }</p>
<p>    private function connect(){<br />
        $this->link = mysql_connect($this->server, $this->username, $this->password);<br />
        mysql_select_db($this->db, $this->link);<br />
    }</p>
<p>    public function __sleep(){<br />
        mysql_close($this->link);<br />
    }</p>
<p>    public function __wakeup(){<br />
        $this->connect();<br />
    }<br />
}<br />
</code></p>
<p>Un ejemplo de la serializaci&oacute;n y guardado en un archivo de una clase<br />
<code><br />
// Creamos nuestra clase de conexion<br />
$con = new Conexion("localhost","root","root","test");</p>
<p>// Serializamos nuestra clase<br />
$miClaseparaGuardar = serialize($con);</p>
<p>// guardamos en un archivo la clase<br />
$gestor = fopen("clase.txt", 'a'));<br />
fwrite($gestor, $miClaseparaGuardar );<br />
fclose($gestor);<br />
</code></p>
<p>Y un ejemplo de como recuperamos la clase anteriormente serializada<br />
<code><br />
// Recuperamos los datos de la clase<br />
$gestor = fopen("clase.txt", 'r'));<br />
$contenido = fread($gestor, filesize("clase.txt"));<br />
fclose($gestor);</p>
<p>// Volvemos a su estado la clase. (debe existir la definici&oacute;n de la clase l&oacute;gicamente  xD)<br />
$con = unserialize($con);<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.dubasdey.com/2007/03/28/serializacion-de-clases-en-php4/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

