<?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>Sebastián Barría &#187; PHP</title>
	<atom:link href="http://www.sebastianbarria.com/category/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.sebastianbarria.com</link>
	<description>Desarrollo web y multimedia</description>
	<lastBuildDate>Wed, 11 Jan 2012 18:17:05 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Largo de elementos para insertar en mysql</title>
		<link>http://www.sebastianbarria.com/web/largo-de-elementos-para-insertar-en-mysql/</link>
		<comments>http://www.sebastianbarria.com/web/largo-de-elementos-para-insertar-en-mysql/#comments</comments>
		<pubDate>Sun, 18 Sep 2011 06:03:10 +0000</pubDate>
		<dc:creator>Sebastian Barria</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.sebastianbarria.com/?p=142</guid>
		<description><![CDATA[Muchas veces planificamos y creamos bases de datos en las cuales tendremos que almacenar varios datos, pero en la práctica no sabemos la cantidad real de caracteres que tendrá cada uno. En ese caso generalmente ponemos un valor cualquiera con el que nos aseguremos que va a caber la información.
Por ejemplo, si hacemos una aplicacación que se conecte con twitter, vamos a recibir ciertos datos que vienen en una enorme cadena de texto, pero la pregunta es: ¿cuántos caracteres recibiremos?&#8230; si no sabemos le pondremos algo así como 255, y probablemente estemos ocupando espacio adicional en el base de&#8230;]]></description>
			<content:encoded><![CDATA[<p>Muchas veces planificamos y creamos bases de datos en las cuales tendremos que almacenar varios datos, pero en la práctica no sabemos la cantidad real de caracteres que tendrá cada uno. En ese caso generalmente ponemos un valor cualquiera con el que nos aseguremos que va a caber la información.</p>
<p>Por ejemplo, si hacemos una aplicacación que se conecte con twitter, vamos a recibir ciertos datos que vienen en una enorme cadena de texto, pero la pregunta es: ¿cuántos caracteres recibiremos?&#8230; si no sabemos le pondremos algo así como 255, y probablemente estemos ocupando espacio adicional en el base de datos.</p>
<p>Bueno&#8230; a mi me pasó eso&#8230; y voy a compartir la información que investigué y que deduje para que se les haga más fácil la tarea XD.</p>
<p><strong>ID = 10 caracteres</strong> (hablando de ID&#8217;s numéricos con auto-increment y &#8220;unsigned&#8221;)<strong><br />
Email</strong> =256 caracteres (64 antes de la @, y un máximo de 256)<br />
<strong>Passwords</strong> = 32 caracteres si se almacenan en formato MD5 (recomendado)<br />
<strong>Nombres</strong> = 100 (generalmente con eso alcanza&#8230; sino se puede ocupar un varchar de 255 o un tinytext)<br />
<strong>ID de Facebook</strong> =64 caracteres (pues cambiaron hace poco el largo de la cadena en vista de que tienen muchos registrados)<br />
<strong>Twitter Oauth Token</strong> = 50 caracteres<br />
<strong>Twitter Oauth Token Secret</strong> = 50 caracteres<br />
<strong>Twitter Username</strong> = 15 caracteres<br />
<strong>RUT</strong> (chileno) = 12 caracteres (si se almacena con puntos y guión) o 9 caracteres (si se almacena sin puntos ni guión, que es lo más óptimo)<br />
<strong>URL</strong> = Se supone que no hay un largo máximo definido, sin embargo leí por ahí que IE6 acepta un máximo de 2047 caracteres si la escribo en el navegador&#8230; raro, pero en verdad no sabría que largo (maxlength) recomendar. De todas formas yo generalmente pongo 255 ó 500 caracteres&#8230; DUDO que alguien tenga un sitio web con más qu eso (los 2047 caracteres probablemente se apliquen a un post en un blog, pero no a la URL de un sitio personal).</p>
<p>BuenoHay muchos otros tipos de datos, y por supuesto que pueden preguntar en los comentarios o aportar si tienen otros datos.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sebastianbarria.com/web/largo-de-elementos-para-insertar-en-mysql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Usar registros SPF en tu servidor para evitar ser catalogado como SPAM</title>
		<link>http://www.sebastianbarria.com/web/usar-registros-spf-en-tu-servidor-para-evitar-ser-catalogado-como-spam/</link>
		<comments>http://www.sebastianbarria.com/web/usar-registros-spf-en-tu-servidor-para-evitar-ser-catalogado-como-spam/#comments</comments>
		<pubDate>Mon, 31 May 2010 15:10:23 +0000</pubDate>
		<dc:creator>Sebastian Barria</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Seguridad]]></category>
		<category><![CDATA[Servidor]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.sebastianbarria.com/?p=106</guid>
		<description><![CDATA[Uf!&#8230; ese fue el título más específico que se me ocurrió&#8230; porque literalmente es eso. Acá les voy a plantear cual fue mi situación:
En <a href="http://www.geekbox.cl" target="_blank">GEEKBOX</a> estuvimos haciendo las primeras pruebas de registro para el juego <a href="http://www.brooksbrothers.cl/mundial/" target="_blank">Brooks Brothers Mundial</a>, y parte de este proceso correspondía a enviar correos a los usuarios que se registraban para poder validar sus cuentas. Estos correos se autogeneraban vía PHP y se enviaban con la típica funcion <em>mail()&#8230;</em>.
Resulta que extrañamente los correos dirigidos a cuentas de hotmail no llegaban (ni siquiera al spam), pues el sistema interno de hotmail los bloqueaba al]]></description>
			<content:encoded><![CDATA[<p>Uf!&#8230; ese fue el título más específico que se me ocurrió&#8230; porque literalmente es eso. Acá les voy a plantear cual fue mi situación:</p>
<p>En <a href="http://www.geekbox.cl" target="_blank">GEEKBOX</a> estuvimos haciendo las primeras pruebas de registro para el juego <a href="http://www.brooksbrothers.cl/mundial/" target="_blank">Brooks Brothers Mundial</a>, y parte de este proceso correspondía a enviar correos a los usuarios que se registraban para poder validar sus cuentas. Estos correos se autogeneraban vía PHP y se enviaban con la típica funcion <em>mail()</em>.</p>
<p>Resulta que extrañamente los correos dirigidos a cuentas de hotmail no llegaban (ni siquiera al spam), pues el sistema interno de hotmail los bloqueaba al ser generados por programación. La duda que le da a este servicio de correo (por la cual no quería aceptar los correos) era que éstos se enviaban desde una dirección IP xxx.xxx.xxx.xxx (la de los servidores del servicio de alojamiento), pero no era necesariamente la misma IP que la que utiliza el sitio en cuestión (que tiene una de las tantas direcciones IP de los servidores). Esto quiere decir que estos correos le producían &#8220;desconfianza&#8221; porque no sabía con certeza si eran enviados por terceros utilizando una dirección falsa o si eran enviados REALMENTE por el sitio. Asique, &#8220;ante la duda abstente&#8221; y ellos lo rechazan.</p>
<p>En resumidas cuentas no llegaban los correos y necesitaba una solución.</p>
<h2>La solución!</h2>
<p>Buscando y buscando logré entender como se tiene que hacer para que esto no ocurra: el concepto principal es asociarle a nuestro servidor un dato que defina cuales son las direcciones IP válidas para enviar correos &#8220;autorizados&#8221; por el sitio. Este &#8220;dato&#8221; es un &#8220;registro&#8221; (como los típicos registros A o CNAME) del tipo TXT que define los valores (IPs) para que los sistemas de correo (como Hotmail) puedan consultarle. Este &#8220;dato&#8221; es el llamado registro SPF o <em>SPF record </em>(<em>Sender Policy Framework</em>).</p>
<p>En resumidas cuentas, si Hotmail ve que le están enviando un correo desde la IP xxx.xxx.xxx.xxx diciendo que viene desde <em>tusitio.com</em>, se conectará <em>tusitio.com</em> y consultará si dentro de sus registros del tipo TXT hay alguno que tenga la información de los SPF. Si la encuntra, consultará cuales son las direcciones IP autorizadas desde las cuales el sitio enviará correos. Si todo está en orden (la IP desde donde se envía el correo calza con la autorizada por el servidor) recibirá el correo sin problemas; si no, lo rechazará y probablemente asumirá como que el correo nunca existió.</p>
<p>Un ejemplo de registro TXT que contiene esta información es el siguiente (para Dreamhost):</p>
<pre>v=spf1 ip4:64.111.100.0/24 ip4:66.33.201.0/24 ip4:66.33.216.0/24 ip4:208.97.132.0/24
ip4:208.97.187.0/24 ip4:208.113.200.0/24 ip4:208.113.244.0/24 ip4:208.113.175.0/24 mx -all</pre>
<p>Este dato se le asocia al servidor y listo. Luego de un rato todo debería funcionar normalmente.</p>
<blockquote><p>Hay que tener en consideración que los SPF son independientes para cada subdominio. Es decir, que si los aplicas en <em>tudominio.com</em>, no van a ser considerados para <em>tusubdominio.tudominio.com</em>. Hotmail no los considera el mismo sitio (pues no lo son).</p>
<p>Para saber si tu servidor tiene asociado algún registro SPF puedes visitar <a href="http://www.microsoft.com/mscorp/safety/content/technologies/senderid/wizard/" target="_blank">este sitio de microsoft</a> donde revisa los registros A, MX y SPF de tu servidor. Si encuentra algún SPF te lo muestra, sino, te muestra los registros MX para que puedas crear (con su <em>wizard</em>) los registros que necesitas.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.sebastianbarria.com/web/usar-registros-spf-en-tu-servidor-para-evitar-ser-catalogado-como-spam/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Algunos trucos en PHP</title>
		<link>http://www.sebastianbarria.com/php/algunos-trucos-en-php/</link>
		<comments>http://www.sebastianbarria.com/php/algunos-trucos-en-php/#comments</comments>
		<pubDate>Sun, 07 Mar 2010 19:21:54 +0000</pubDate>
		<dc:creator>Sebastian Barria</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.sebastianbarria.com/?p=83</guid>
		<description><![CDATA[En todos los lenguajes de programación, es conocido que cada programador trabaja a su manera, y muchas veces (sobre todo cuando algo es programado por alguien &#8220;avanzado&#8221;) no entendemos el código que hacen las demás personas. ¿Será porque usan &#8220;trucos&#8221;?.
En este caso, vamos a ver algunas formas de optimizar el código para trabajar más rápido y de pasadita poder entender cuando vemos que alguien programa así.
<h3>Resumir los <em>if&#8230;else</em></h3>
La sentencia if&#8230;else está compuesta de tres partes escenciales:
<ol>
<li><strong><em>if ( xxx )</em></strong> (xxx es lo que estamos condicionando)</li>
<li><strong><em>{ yyy }</em></strong> (yyy es lo que deseamos que suceda si </li>&#8230;</ol>]]></description>
			<content:encoded><![CDATA[<p>En todos los lenguajes de programación, es conocido que cada programador trabaja a su manera, y muchas veces (sobre todo cuando algo es programado por alguien &#8220;avanzado&#8221;) no entendemos el código que hacen las demás personas. ¿Será porque usan &#8220;trucos&#8221;?.</p>
<p>En este caso, vamos a ver algunas formas de optimizar el código para trabajar más rápido y de pasadita poder entender cuando vemos que alguien programa así.</p>
<h3>Resumir los <em>if&#8230;else</em></h3>
<p>La sentencia if&#8230;else está compuesta de tres partes escenciales:</p>
<ol>
<li><strong><em>if ( xxx )</em></strong> (xxx es lo que estamos condicionando)</li>
<li><strong><em>{ yyy }</em></strong> (yyy es lo que deseamos que suceda si el if anterior es positivo)</li>
<li><strong><em>else { zzz }</em></strong> (zzz es lo que deseamos que suceda en caso contrario)</li>
</ol>
<p>En base a estos tres elementos, podemos utilizar una sola línea para &#8220;resumir&#8221; la sentencia:</p>
<pre>xxx?yyy:zzz;</pre>
<p>La línea anterior quiere decir que &#8220;si <em>xxx </em>es correcto, entonces haz <em>yyy</em>; si no, haz <em>zzz</em>&#8220;. Veamos un ejemplo práctico:</p>
<p>Supongamos que estamos dentro de un <em>for</em>. Tenemos un contador en la variable <em>$count</em> y queremos mostrarlo en pantalla. Sería algo así:</p>
<pre>if($count&gt;0){ $miVariable="mayor a cero"; }
else{ $miVariable="cero"; }
echo $miVariable;</pre>
<p>Esto se puede resumir en:</p>
<pre>$miVariable=$count&gt;0?"mayor a cero":"cero";
echo $miVariable;</pre>
<h3>Ahorrar líneas de <em>echo</em></h3>
<p>Muchas veces se define una variable y luego se imprime en pantalla el resultado. Generalmente se hace así:</p>
<pre>$miVariable="xxx";
echo $miVariable;</pre>
<p>Esto se podría resumir así:</p>
<pre>echo $miVariable="xxx";</pre>
<p>Como ven, no es necesario volver a escribir la variable en una nueva línea. Se puede hacer el <em>echo</em> en el mismo momento en que se define la variable. La idea de esto no es &#8220;ahorrar KB&#8221; sino que ahorrar tiempo.</p>
<p>El ejemplo del punto anterior podría escribirse así:</p>
<pre>echo $miVariable=$count&gt;0?"mayor a cero":"cero";</pre>
<p>O incluso así, si no es necesario guardar los datos en una variable:</p>
<pre>echo $count&gt;0?"mayor a cero":"cero";</pre>
<p>Por ahora les dejo sólo estas&#8230;cuando me acuerde de otras las iré agregando <img src='http://www.sebastianbarria.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.sebastianbarria.com/php/algunos-trucos-en-php/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Como ocultar sitios mientras se desarrollan</title>
		<link>http://www.sebastianbarria.com/web/como-ocultar-sitios-mientras-se-desarrollan/</link>
		<comments>http://www.sebastianbarria.com/web/como-ocultar-sitios-mientras-se-desarrollan/#comments</comments>
		<pubDate>Sun, 07 Mar 2010 18:55:10 +0000</pubDate>
		<dc:creator>Sebastian Barria</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Servidor]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.sebastianbarria.com/?p=69</guid>
		<description><![CDATA[Al momento de querer publicar un sitio que hemos estado preparando por meses, generalmente queremos que sea una gran sorpresa para los demás, y por lo mismo, intentamos mantenerlo oculto hasta el momento del lanzamiento oficial.
Acá veremos algunas formas de tener los sitios en el servidor y URL final y que sólo podamos verlo nosotros para desarrollar lo que falte y configurar los últimos detalles antes de hacerlo público.
<h3>Redireccionar por IP&#8230;</h3>
Una de las maneras más simples es redireccionar a todos los otros visitantes a alguna dirección específica mientras se desarrolla el sitio. Para esto, utilizaremos nuestra IP,]]></description>
			<content:encoded><![CDATA[<p>Al momento de querer publicar un sitio que hemos estado preparando por meses, generalmente queremos que sea una gran sorpresa para los demás, y por lo mismo, intentamos mantenerlo oculto hasta el momento del lanzamiento oficial.</p>
<p>Acá veremos algunas formas de tener los sitios en el servidor y URL final y que sólo podamos verlo nosotros para desarrollar lo que falte y configurar los últimos detalles antes de hacerlo público.</p>
<h3>Redireccionar por IP</h3>
<p>Una de las maneras más simples es redireccionar a todos los otros visitantes a alguna dirección específica mientras se desarrolla el sitio. Para esto, utilizaremos nuestra IP, para que el sitio nos reconozca y a los demás usuarios los envíe a la dirección especificada.</p>
<blockquote><p>La dirección IP es el número único que asigna la red a cada conexión de internet.</p>
<p>Para reconocer una IP, hay que fijarse en su formato: xxx.xxx.xxx.xxx (por ejemplo, 200.20.50.125).</p>
<p>Para saber tu IP puedes utilizar <a href="http://www.thegeektoolbox.com/" target="_blank">una de las tantas herramientas que hay en internet</a>.</p></blockquote>
<p>Para utilizar este sistema, es necesario escribir este código en la primera línea de la página principal:</p>
<pre>&lt;?php if($_SERVER['REMOTE_ADDR']!="xxx.xxx.xxx.xxx"){
    header("Location: http://www.sitio-alternativo.com/");
} ?&gt;</pre>
<p>El código utilizado dice básicamente lo siguiente: <em>si(la IP del visitante es distinta a &#8220;xxx.xxx.xxx.xxx&#8221;) entonces { llévalo a http://www.sitio-alternativo.com/ }</em>.</p>
<p>Por supuesto que en esta línea hay que cambiar <em>xxx.xxx.xxx.xxx</em> por tu IP y <em>http://www.sitio-alternativo.com/</em> por el sitio al que quieres que sean reenviados.</p>
<p>Como el código utilizado es PHP debemos tener claro que el archivo debe ser algo así como <em>index.php</em> (.html no servirá) y que el servidor debe soportar PHP.</p>
<p>Otra alternativa es que, en vez de que redirija a algúna otra URL, muestre una trozo de código HTML, que puede ser un mensaje o una página completa:</p>
<pre>&lt;?php if($_SERVER['REMOTE_ADDR']!="xxx.xxx.xxx.xxx"){
    include("aviso.html");
    exit();
} ?&gt;</pre>
<p>De esta manera, si no es la IP especificada, le mostrará el contenido del archivo <em>aviso.html</em> (que debe estar en el mismo servidor). El <em>exit()</em> que viene al final de esa línea es para que no se haga nada más que mostrar el archivo <em>aviso.html</em>.</p>
<p>Hay que tener cuidado porque como el número es asignado por conexión y no por computador, si tienes una conexión compartida (por ejemplo en tu oficina o casa), todos los demás usuarios de esa misma conexión podrán ver tu sitio.</p>
<h3>.htaccess</h3>
<p>Esta es otra manera de conseguir lo mismo: utilizar el archivo <em>.htaccess</em> que está en la raíz del servidor (si no está en tu servidor lo puedes crear).<br />
Para poder realizar la redirección con este archivo es necesario utilizar el siguiente código:</p>
<pre>ErrorDocument 403 http://www.sitio-alternativo.com/
Order deny,allow
Deny from all
Allow from xxx.xxx.xxx.xxx</pre>
<p>De esta manera, le diremos al servidor que solo le muestre a la página a los visitantes de la IP <em>xxx.xxx.xxx.xxx</em> y al resto que los reenvíe a la URL especificada.</p>
<h3>Nombre de usuario y contraseña</h3>
<p>Este sistema requiere de dos archivos: <em>.htaccess</em> y <em>.htpasswd</em> (ambos en la raíz de nuestro sitio). Si queremos utilizar este sistema necesitaremos de mucha más paciencia (a menos que ya tengamos experiencia), pues es un poco más complejo.</p>
<p>Mi idea no es generar un post enorme, y creo que con las dos opciones anteriores basta y sobra. Sin embargo, para los que quieran averiguar como hacerlo, <a href="http://www.cristalab.com/tutoriales/proteger-carpetas-con-.htaccess-y-.htpasswd-c213l/" target="_blank">acá les dejo un buen tutorial</a>.</p>
<p>Otro dato que se debe tener en cuenta en que muchas veces los servidores (a través del panel de control), permiten automatizar la tarea de crear estos dos archivos. Basta con configurar unas cuantas cosas y listo, asique les recomiendo que partan por ahí primero.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sebastianbarria.com/web/como-ocultar-sitios-mientras-se-desarrollan/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mostrar último tweet en una página web</title>
		<link>http://www.sebastianbarria.com/php/mostrar-ultimo-tweet-en-una-pagina-web/</link>
		<comments>http://www.sebastianbarria.com/php/mostrar-ultimo-tweet-en-una-pagina-web/#comments</comments>
		<pubDate>Sun, 07 Mar 2010 18:33:10 +0000</pubDate>
		<dc:creator>Sebastian Barria</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://www.sebastianbarria.com/?p=60</guid>
		<description><![CDATA[Esta es una de las cosas que encuentro que son bastante útiles para ofrecerle a nuestros clientes en un sitio web. Sobre todo porque ahora está de moda <a href="http://twitter.com/peivem_com" target="_blank">twitter</a>.
Entonces: vamos al grano. Lo primero es saber que es lo que queremos: Publicar el último tweet de algún usuario de twitter en un sitio web.
Para esto, tenemos que tener alguna manera de recibir los datos del usuario, y que mejor que el RSS que ofrece twitter. Este archivo está linkeado en la página de cada usuario y su URL es algo similar a la siguiente:
<pre>http://twitter.com/statuses/user_timeline/14057420.rss&#8230;</pre>
El ID]]></description>
			<content:encoded><![CDATA[<p>Esta es una de las cosas que encuentro que son bastante útiles para ofrecerle a nuestros clientes en un sitio web. Sobre todo porque ahora está de moda <a href="http://twitter.com/peivem_com" target="_blank">twitter</a>.</p>
<p>Entonces: vamos al grano. Lo primero es saber que es lo que queremos: Publicar el último tweet de algún usuario de twitter en un sitio web.</p>
<p>Para esto, tenemos que tener alguna manera de recibir los datos del usuario, y que mejor que el RSS que ofrece twitter. Este archivo está linkeado en la página de cada usuario y su URL es algo similar a la siguiente:</p>
<pre>http://twitter.com/statuses/user_timeline/14057420.rss</pre>
<p>El ID de usuario corresponde al número que aparece antes de &#8220;.rss&#8221;.</p>
<p>Por lo tanto, ahora tenemos que leer el XML de la siguiente manera:</p>
<pre>&lt;?
$url="http://twitter.com/statuses/user_timeline/14057420.rss";
$xmlstr = file_get_contents($url);
$xml = simplexml_load_string($xmlstr);
$tweet = $xml-&gt;channel-&gt;item[0]-&gt;title;
echo str_replace("peivem_com: ","",utf8_decode($tweet));
$fecha = $xml-&gt;channel-&gt;item[0]-&gt;pubDate;
$fecha = strtotime($fecha);
?&gt;</pre>
<p>En este caso, el usuario es &#8220;peivem_com&#8221;. Por lo mismo, en la línea 6 del código anterior reemplazamos &#8220;peivem_com: &#8221; por &#8220;&#8221; (nada). Esto lo hacemos porque cada tweet del RSS viene con el nombre de usuario seguido de &#8220;: &#8220;. De esta manera, sólo dejaremos el tweet del usuario.</p>
<p>En esta misma línea, está la función <em>str_replace()</em>, que recibe 3 datos: el texto a buscar, el texto a reemplazar y el texto original. En este último, pasamos el valor <em>$tweet</em>, pero dentro de la función <em>utf8_decode()</em>, que nos servirá para decodificar los caracteres &#8220;raros&#8221; que vengan en la cadena, producto de la distinta codificación.</p>
<p>En la línea 7 recibimos la fecha y en la 8 la transformamos a un valor &#8220;universal&#8221; por así decirlo. De esta manera, donde queramos mostrar la fecha escribiremos la siguiente línea:</p>
<pre>&lt;? echo date('d/m/Y',$fecha); ?&gt;</pre>
<p>Y eso es todo. Es algo simple y que puede ser modificado fácilmente.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sebastianbarria.com/php/mostrar-ultimo-tweet-en-una-pagina-web/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Exportar a Excel desde PHP</title>
		<link>http://www.sebastianbarria.com/php/exportar-a-excel-desde-php/</link>
		<comments>http://www.sebastianbarria.com/php/exportar-a-excel-desde-php/#comments</comments>
		<pubDate>Sun, 07 Mar 2010 17:59:24 +0000</pubDate>
		<dc:creator>Sebastian Barria</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.sebastianbarria.com/?p=55</guid>
		<description><![CDATA[Aveces, cuando se desarrollan sitios web con bases de datos, es necesario poder exportar el contenido de una de las bases de datos a un archivo para que se pueda descargar.
En este caso, explicaré como se puede exportar información en un archivo de excel.
<h3>Como generar el archivo</h3>
Primero, deberás crear un archivo PHP en blanco. Llamémoslo <em>usuarios.php&#8230;</em>.
Dentro de este archivo, se debe leer el contenido de la base de datos y mostrarlo en formato de tabla. Algo como esto:
Una vez que tengamos nuestra página (una página en blanco que contiene solamente una tabla de excel),]]></description>
			<content:encoded><![CDATA[<p>Aveces, cuando se desarrollan sitios web con bases de datos, es necesario poder exportar el contenido de una de las bases de datos a un archivo para que se pueda descargar.</p>
<p>En este caso, explicaré como se puede exportar información en un archivo de excel.</p>
<h3>Como generar el archivo</h3>
<p>Primero, deberás crear un archivo PHP en blanco. Llamémoslo <em>usuarios.php</em>.</p>
<p>Dentro de este archivo, se debe leer el contenido de la base de datos y mostrarlo en formato de tabla. Algo como esto:</p>
<p>Una vez que tengamos nuestra página (una página en blanco que contiene solamente una tabla de excel), se debe agregar la cabecera de php, a través de este código:</p>
<pre>&lt;?php
header("Content-Type: application/vnd.ms-excel");
header("content-disposition: attachment;filename=NOMBRE_DEL_ARCHIVO.xls");
?&gt;
</pre>
<p>Esta cabecera le dice al archivo que le diga al navegador &#8220;yo soy un archivo de excel&#8221;, por lo cual el navegador lo reconocerá como tal, independiente de que su extensión sea &#8220;php&#8221;.</p>
<p>Como verán, en la segunda línea de la cabecera se define que el archivo será un attachment, por lo que el navegador intentará descargarlo. En la misma línea, también se define el nombre con que se desarcargará el archivo (filename). En este caso, el archivo se llamará NOMBRE_DEL_ARCHIVO.xls.</p>
<p>&#8220;XLS&#8221; es la extensión de excel, por lo tanto no debemos cambiarla. Lo que si podemos cambiar es &#8220;NOMBRE_DEL ARCHIVO&#8221;, en el cual podemos poner lo que queramos. Hay que tener cuidado de utilizar solo caracteres simples (numeros, letras y guiones). Si se utilizan espacios, el nombre del archivo se cortará al primer espacio.</p>
<p>Lo que podemos hacer, para que quien descargue el archivo siempre sepa que versión está descargando, es utilizar un nombre de archivo como el siguiente:</p>
<pre>...NOMBRE_DEL_ARCHIVO_".date('d_m_Y').".xls...</pre>
<p>En este caso, el nombre de archivo incluirá el día, mes y año antes de la extensión.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sebastianbarria.com/php/exportar-a-excel-desde-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Revisar el correo de Gmail utilizando XML y PHP</title>
		<link>http://www.sebastianbarria.com/web/revisar-el-correo-de-gmail-utilizando-xml-y-php/</link>
		<comments>http://www.sebastianbarria.com/web/revisar-el-correo-de-gmail-utilizando-xml-y-php/#comments</comments>
		<pubDate>Sun, 07 Mar 2010 17:34:33 +0000</pubDate>
		<dc:creator>Sebastian Barria</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://www.sebastianbarria.com/?p=41</guid>
		<description><![CDATA[<img title="rss" src="http://www.sebastianbarria.com/wp-content/uploads/2010/03/rss.jpg" alt="" width="612" height="461" />
<h3>Introducción</h3>
Entre muchos de los servicios que ofrece Gmail, está la posibilidad de recibir un feed con los correos no leídos de nuestra bandeja de entrada <a href="http://mail.google.com/support/bin/answer.py?hl=en&#38;answer=13474" target="_blank">(más información aquí)</a>.
Basándonos en la información que encontré en <a href="http://taek.com.ar/blog/index.php?option=com_content&#38;task=view&#38;id=17" target="_blank">este post</a>, y utilizando la librería <em>simpleXml</em> de PHP, podremos crear fácilmente un notificador de correos nuevos en nuestra bandeja de entrada.
Lo primero que debemos hacer es crear la conexión con el servicio de feed RSS de Gmail. Para esto, utilizaremos la librería <em>curl&#8230;</em> de PHP:
Esta vez no publicaré el código, pues está el archivo de ejemplo para descargar, que]]></description>
			<content:encoded><![CDATA[<p><img title="rss" src="http://www.sebastianbarria.com/wp-content/uploads/2010/03/rss.jpg" alt="" width="612" height="461" /></p>
<h3>Introducción</h3>
<p>Entre muchos de los servicios que ofrece Gmail, está la posibilidad de recibir un feed con los correos no leídos de nuestra bandeja de entrada <a href="http://mail.google.com/support/bin/answer.py?hl=en&amp;answer=13474" target="_blank">(más información aquí)</a>.</p>
<p>Basándonos en la información que encontré en <a href="http://taek.com.ar/blog/index.php?option=com_content&amp;task=view&amp;id=17" target="_blank">este post</a>, y utilizando la librería <em>simpleXml</em> de PHP, podremos crear fácilmente un notificador de correos nuevos en nuestra bandeja de entrada.</p>
<p>Lo primero que debemos hacer es crear la conexión con el servicio de feed RSS de Gmail. Para esto, utilizaremos la librería <em>curl</em> de PHP:</p>
<blockquote><p>Esta vez no publicaré el código, pues está el archivo de ejemplo para descargar, que contiene el código completo en un archivo PHP.</p></blockquote>
<p>Con esta conexión creada, recibiremos de vuelta (en la variable <em>$data</em>), un XML con la lista de los últimos correos.</p>
<p>Con esta información en nuestro poder, ya podemos utilizar <em>simpleXml</em> para mostrar los datos en pantalla.</p>
<p><a href="/wp-content/uploads/2010/03/gmail.zip">Descargar el ejemplo completo</a></p>
<h3>Limitaciones</h3>
<p>El RSS que entrega Gmail, sólo muestra la cabecera de los mails, igual como lo vemos en la bandeja de entrada de Gmail. No permite ver el cuerpo del mensaje (sólo el resumen), por lo tanto tendremos que utilizarlo para poder ver la lista y cantidad de nuevos correos, y utilizar el link que viene en cada entrada del RSS para redirigir a la página de Gmail donde se podrá ver el correo completo.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sebastianbarria.com/web/revisar-el-correo-de-gmail-utilizando-xml-y-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Seguridad con PHP / MySQL</title>
		<link>http://www.sebastianbarria.com/web/seguridad-con-php-mysql/</link>
		<comments>http://www.sebastianbarria.com/web/seguridad-con-php-mysql/#comments</comments>
		<pubDate>Sat, 06 Mar 2010 18:50:30 +0000</pubDate>
		<dc:creator>Sebastian Barria</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Seguridad]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.sebastianbarria.com/?p=22</guid>
		<description><![CDATA[Al montar un servidor o programar un sitio web basado en PHP y MySQL, hay que tener en consideración algunos conceptos de seguridad. En esta ocasión, hablaré de 3 problemas de seguridad básicos:
<ul>
<li>Los usuarios y sus privilegios (en MySQL)</li>
<li>La configuración de apache</li>
<li>El filtrado de formularios y URL&#8217;s</li>
</ul>
Este post está enfocado, principalmente, a quienes pretenden montar un servidor en su computador (localhost) pues, por lo menos en los servidores pagados, la seguridad con los privilegios de MySQL está implementada.
<h3>Los problemas de seguridad</h3>
<h4>Los usuarios y sus privilegios (en MySQL)&#8230;</h4>
El principal problema de montar un servidor]]></description>
			<content:encoded><![CDATA[<p>Al montar un servidor o programar un sitio web basado en PHP y MySQL, hay que tener en consideración algunos conceptos de seguridad. En esta ocasión, hablaré de 3 problemas de seguridad básicos:</p>
<ul>
<li>Los usuarios y sus privilegios (en MySQL)</li>
<li>La configuración de apache</li>
<li>El filtrado de formularios y URL&#8217;s</li>
</ul>
<blockquote><p>Este post está enfocado, principalmente, a quienes pretenden montar un servidor en su computador (localhost) pues, por lo menos en los servidores pagados, la seguridad con los privilegios de MySQL está implementada.</p></blockquote>
<h3>Los problemas de seguridad</h3>
<h4>Los usuarios y sus privilegios (en MySQL)</h4>
<p>El principal problema de montar un servidor en casa (localhost), es que los software que se utilizan para esto &#8211; <a rel="external" href="http://www.easyphp.org/">EasyPHP</a>, <a rel="external" href="http://www.appservnetwork.com/">Appserv</a>, etc &#8211; vienen con usuarios por defecto&#8230; el famoso <strong>&#8220;_root&#8221; sin contraseña</strong>. Esto implica que cualquier persona con un poco de conocimientos de hackeo, pueda botar la base de datos u obtener información de ella si es que el usuario por defecto no se cambia (ya que el hacker sabría que el nombre de usuario es &#8220;_root&#8221; y no tiene contraseña).</p>
<h4>La configuración de apache</h4>
<p>Además de eso, está el problema de configuración de apache, pues appserv, por ejemplo, establece todas las variables como globales por defecto (por ejemplo, si recibo una variable por el metodo &#8220;POST&#8221;, simplemente escribo &#8220;echo $nombre_de_la_variable&#8221; para mostrarla en pantalla). Si bien las variables globales son más cómodas, implican riesgos en seguridad y confusión, porque si se necesita recibir la variable &#8220;admin_pass&#8221; por el método POST y el &#8220;hacker&#8221; escribe una url como &#8220;<em>&#8230;index.php?admin_pass=miclave</em>&#8220;, se estaría recibiendo la variable por otro método y poniendo en riesgo la seguridad del sitio.</p>
<h4>El filtrado de formularios y URL&#8217;s</h4>
<p>Otro problema es la seguridad con PHP, pues si no se filtra la información recibida a través de formularios o de la URL, se esta dando pie para que gente mal intencionada ejecute scripts que pongan en riesgo la seguridad de nuestro sitio.</p>
<h3>Las soluciones</h3>
<p>Antes que nada, se debe definir el software a utilizar. Por mi parte, y por conceptos de seguridad, yo recomiendo <a rel="external" href="http://www.easyphp.org/">EasyPHP</a>, pues es mucho mas &#8220;paranoico&#8221; que Appserv, y viene mucho más limitado en conceptos de seguridad y mensajes de error; es decir, que viene &#8220;mejor configurado&#8221; (en conceptos de seguridad) por defecto, y no hay que preocuparse de cambiar muchas cosas.</p>
<p>Por esto, la siguiente solución la veremos específicamente para EasyPHP (aunque también se aplica para Appserv).</p>
<h4>Los usuarios y sus privilegios (en MySQL)</h4>
<p>Lo primero que se debería hacer, al montar un servidor en casa, es definir un usuario que tenga todos los privilegios necesarios para administrar nuestro sitio.</p>
<p>Para esto, hay que realizar las siguientes operaciones:</p>
<ol>
<li>Ir a PhpMyAdmin (la administración de MySQL) y crear un nuevo usuario (o modificar &#8220;_root&#8221;) con un username y un password que no sea tan obvio.</li>
<li>Abrir el archivo de configuración llamado &#8220;<em>config.inc.php</em>&#8221; (ubicado en &#8230;EasyPHP1-8\phpmyadmin\), las variables <em>$cfg['Servers'][$i]['user'] = &#8216;_root&#8217;; y $cfg['Servers'][$i]['password'] = &#8221;;</em>, y poner ahí el username y password definido para el administrador de MySQL en el paso anterior.</li>
<li>Eliminar el usuario &#8220;_root&#8221; (en el caso de haber creado otro usuario para la administración), pues si se deja, el sitio seguirá siendo inseguro.</li>
</ol>
<p>A partir de este punto, si se quiere, se puede crear otro usuario con menos privilegios (por ejemplo que no pueda crear o eliminar tablas), que sea con el que nos conectemos desde el sitio y, de esta manera, correr menos riesgos.</p>
<h4>La configuración de apache</h4>
<p>El tema de la configuración pasa, primero, por elegir el servidor adecuado. En el caso de <a rel="external" href="http://www.easyphp.org/">EasyPHP</a>, la configuración por defecto es bastante buena si hablamos de seguridad, pero hay que fijarse bien (a la hora de programar) en solucionar todos los errores y en los mensajes de error que devuelve, pues aveces dice &#8220;imposible conectar a la base de datos MiBase&#8221;, por lo que estaríamos entregando información privada el importante.</p>
<p>Hay otros conceptos que son más técnicos (y que no serán abordados en este post), como la cantidad de usuarios máximos conectados a la base de datos, y que hacer cuando se sobrepasan los límites; los tamaños de los archivos que se pueden subir; los privilegios de las carpetas, etc que se deben tener en cuenta a la hora de configurar el servidor.</p>
<h4>El filtrado de formularios y URL&#8217;s</h4>
<p>Personalmente, he ido creando mis propias funciones de seguridad para filtrar las entradas por cookies, formularios, y los métodos GET y POST.</p>
<p>Las funciones, las almaceno en un archivo validar.php y luego, simplemente, las inserto al principio de cada uno de mis archivos donde necesite validar variables (a través del comando include(&#8220;validar.php&#8221;);).</p>
<p>La manera de utilizarlas, es definiendo las variables de la manera:</p>
<pre>$mi_variable=varpost("nombre_de_la_variable_a_recibir" , "valor en caso de no encontrarse la variable" , largo en caracteres);</pre>
<p>Después de eso, solo queda utilizar $mi_variable en mi archivo php. Esto asegura que la variable quedará definida (y no aparecerán mensajes de error por variables no definidas). También asegura recibir la variable por el método especificado (y no por otro) y definirle un tamaño máximo (para no recibir, por ejemplo, mensajes de 12404502345023 caracteres).</p>
<p>Las funciones son las siguientes:</p>
<pre>function validar( $variable, $tam ){
 $va=htmlentities($variable,ENT_QUOTES,"UTF-8");
 mysql_escape_string($va);
 $va=substr ($va, 0, $tam);
 return $va;
}

function varget($valor, $vacio, $tam){
 if (empty($_GET[$valor])) { $res=$vacio; }
 else { $res=validar($_GET[$valor],$tam); }
 return $res;
}

function varpost($valor, $vacio, $tam){
 if (empty($_POST[$valor])) { $res=$vacio; }
 else { $res=validar($_POST[$valor],$tam); }
 return $res;
}

function varcookie($valor, $vacio, $tam){
 if (empty($_COOKIE[$valor])) { $res=$vacio; }
 else { $res=validar($_COOKIE[$valor],$tam); }
 return $res;
}

function varsess($valor, $vacio, $tam){
 if (empty($_SESSION[$valor])) { $res=$vacio; }
 else { $res=validar($_SESSION[$valor],$tam); }
 return $res;
}</pre>
<h3>Conclusión</h3>
<p>Estas son algunas de las medidas de seguridad básicas para no pasar por inculto a la hora de diseñar un sitio y de montar un servidor casero.</p>
<p>Espero que quien las lea las tome en cuenta, las aproveche; mejoren las funciones de seguridad y las adecuen para satisfacer las necesidades de su sitio.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sebastianbarria.com/web/seguridad-con-php-mysql/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

