<?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>JoelConty.com &#187; PHP</title>
	<atom:link href="http://www.joelconty.com/wp/category/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.joelconty.com/wp</link>
	<description>Blog de Joel, el de Conty</description>
	<lastBuildDate>Thu, 19 Aug 2010 02:17:21 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Obtener dia de la semana dada una fecha dd/mm/yyyy</title>
		<link>http://www.joelconty.com/wp/2008/08/obtener-dia-de-la-semana-dada-una-fecha-ddmmyyyy/</link>
		<comments>http://www.joelconty.com/wp/2008/08/obtener-dia-de-la-semana-dada-una-fecha-ddmmyyyy/#comments</comments>
		<pubDate>Sat, 09 Aug 2008 01:33:19 +0000</pubDate>
		<dc:creator>Joel</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[dia de la semana]]></category>

		<guid isPermaLink="false">http://www.joelconty.com/wp/?p=45</guid>
		<description><![CDATA[Hace rato en el canal de #linux_mx  alguien me preguntó como hacer en PHP para obtener el día de la semana dada una fecha. Es algo muy sencillo. Aquí esta como se haría a traves de una función: #!/usr/bin/php -q &#60;? function getDayOfWeek($day, $month, $year){ return date(&#8216;l&#8217;, mktime(0, 0, 0, $month, $day, $year)); } $month [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_49" class="wp-caption alignright" style="width: 160px"><a href="http://www.joelconty.com/wp/wp-content/uploads/2008/08/garfield_monday.jpg"><img class="size-thumbnail wp-image-49" title="garfield_monday" src="http://www.joelconty.com/wp/wp-content/uploads/2008/08/garfield_monday-150x150.jpg" alt="monday" width="150" height="150" /></a><p class="wp-caption-text">monday</p></div>
<p>Hace rato en el canal de #linux_mx  alguien me preguntó como hacer en PHP para obtener el día de la semana dada una fecha.</p>
<p>Es algo muy sencillo. Aquí esta como se haría a traves de una función:</p>
<p>#!/usr/bin/php -q<br />
&lt;?<br />
function getDayOfWeek($day, $month, $year){<br />
return date(&#8216;l&#8217;, mktime(0, 0, 0, $month, $day, $year));<br />
}</p>
<p>$month = 8;<br />
$year = 2008;<br />
$day = 11;</p>
<p>print getDayOfWeek($day, $month, $year);<br />
// imprimiría &#8220;Monday&#8221;</p>
<p>?&gt;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.joelconty.com/wp/2008/08/obtener-dia-de-la-semana-dada-una-fecha-ddmmyyyy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Recorrer un rango de fechas mediante php.</title>
		<link>http://www.joelconty.com/wp/2008/04/recorrer-un-rango-de-fechas-mediante-php/</link>
		<comments>http://www.joelconty.com/wp/2008/04/recorrer-un-rango-de-fechas-mediante-php/#comments</comments>
		<pubDate>Tue, 08 Apr 2008 22:20:46 +0000</pubDate>
		<dc:creator>Joel</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[fechas]]></category>

		<guid isPermaLink="false">http://www.joelconty.com/wp/archives/33</guid>
		<description><![CDATA[El amigo Montecristo, del canal de Linux, me preguntó como hacer en PHP para recorrer un rango de fechas. Como no hay una función nativa en php para eso, le hice un pequeño script que aquí muestro. Espero le sirva a alguien más: #!/usr/bin/php -q &#60;? //Configurar aqui ////////// //inicio $year_start = 2007; $month_start = [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.joelconty.com/wp/wp-content/uploads/2008/04/calendario-azteca3.gif"><img class="alignright size-thumbnail wp-image-35" style="float: right;" title="calendario-azteca3" src="http://www.joelconty.com/wp/wp-content/uploads/2008/04/calendario-azteca3-150x150.gif" alt="calendario" width="150" height="150" /></a>El amigo Montecristo, del canal de Linux, me preguntó como hacer en PHP para recorrer un rango de fechas. Como no hay una función nativa en php para eso, le hice un pequeño script que aquí muestro. Espero le sirva a alguien más:<span id="more-33"></span></p>
<pre>#!/usr/bin/php -q
&lt;?
//Configurar aqui //////////
//inicio
$year_start = 2007;
$month_start = 11;
$day_start = 1;

//fin
$year_end = 2008;
$month_end = 3;
$day_end = 10;
///////////////////////////////

if( ! checkdate($month_start, $day_start, $year_start)){
     print "invalid start date";
     exit;
}

if( ! checkdate($month_end, $day_end, $year_end)){
     print "invalid end date";
     exit;
}

//obtener el dia siguiente a la fecha final indicada
$day_end++;
if (! checkdate($month_end, $day_end, $year_end)){
     $day_end = 1;
     $month_end++;
     if (! checkdate($month_end, $day_end, $year_end)){
          $month_end = 1;
          $year_end++;
     }
}

//no editar abajo
$year = $year_start;
$month = $month_start;
$day = $day_start;

$finish = 0;
while ( ! $finish &amp;&amp; checkdate($month, $day, $year)) {
     $date = $month . '-' . $day . '-' . $year;
     //////////////////////////////////////
     //hacer algo con la fecha aqui
     print  $date; print "\n";
     //////////////////////////////////////

     $day++;
     if (! checkdate($month, $day, $year)){
          $day = 1;
          $month++;
          if (! checkdate($month, $day, $year)){
               $month = 1;
               $day = 1;
               $year++;
          }
     }

     if( $year == $year_end &amp;&amp; $month == $month_end &amp;&amp; $day == $day_end){
          $finish = true;
     }
}
?&gt;</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.joelconty.com/wp/2008/04/recorrer-un-rango-de-fechas-mediante-php/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Automatizar la creación de vhosts en apache2 en ubuntu.</title>
		<link>http://www.joelconty.com/wp/2008/03/automatizar-la-creacion-de-vhosts-en-apache2-en-ubuntu/</link>
		<comments>http://www.joelconty.com/wp/2008/03/automatizar-la-creacion-de-vhosts-en-apache2-en-ubuntu/#comments</comments>
		<pubDate>Wed, 26 Mar 2008 07:46:12 +0000</pubDate>
		<dc:creator>Joel</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[apache2]]></category>
		<category><![CDATA[scripts]]></category>
		<category><![CDATA[vhost]]></category>

		<guid isPermaLink="false">http://www.joelconty.com/wp/archives/26</guid>
		<description><![CDATA[Como parte de mi trabajo como desarrollador, con frecuencia tengo que probar diferentes sistemas o scripts (escritos generalmente en PHP), tales como CMS, blogs, galerías, shopping carts, etc. por lo cual, me veo en la necesidad de instalarlos en mi pc. Trabajo en una máquina con Ubuntu Gutsy, con apache2, mysql 5, y php 5. [...]]]></description>
			<content:encoded><![CDATA[<p><a title="apache" href="http://www.joelconty.com/wp/wp-content/uploads/2008/03/apache_painting_headdress.gif"><img src="http://www.joelconty.com/wp/wp-content/uploads/2008/03/apache_painting_headdress.thumbnail.gif" alt="apache" align="right" /></a>Como parte de mi trabajo como desarrollador, con frecuencia tengo que probar diferentes sistemas o scripts (escritos generalmente en PHP), tales como CMS, blogs, galerías, shopping carts, etc. por lo cual, me veo en la necesidad de instalarlos en mi pc. Trabajo en una máquina con Ubuntu Gutsy, con apache2, mysql 5, y php 5.<span id="more-26"></span></p>
<p>Acostumbro tener cada script en un directorio dedicado y crear un host virtual en apache para cada script. Estos scripts están accesibles localmente en mi pc. Mi preferencia es inventar un nombre de dominio ficticio el cual configuro localmente en mi pc,  creando una entrada en el archivo de hosts ( /etc/hosts ) de mi pc, para no trabajar con el típico localhost. He venido usando nombres de dominio con la extension .us (por ningun motivo en especial, simplemente se me ocurrió).</p>
<p>Un buen día, se me hizo tedioso el proceso que tenia que hacer para configurar uno de estos hosts en mi pc, tarea repetitiva, y como todo buen programador decidí escribir un pequeño script para automatizar esta tarea.</p>
<p>El script es sencillo, está escrito en bash. Y a continuación lo pongo a disposición de todo aquel que guste leerlo, usarlo y/o modificarlo. La advertencia que hago es que solo esta probado bajo ubuntu con apache2 como webserver.</p>
<p>Como se usa? muy facil:</p>
<p>sudo create_vhost  nombredeldomino.extension [caracter opcional extra]</p>
<p><strong>Ejemplo: </strong></p>
<p><strong>sudo create_vhost midominio.us 2</strong></p>
<p>Nota: el  argumento &#8217;2&#8242; que pongo en el ejemplo es opcional. Acostumbro nombrar mis dominios de prueba de la forma www2.midominio.us, el caracter &#8217;2&#8242; es para eso, pero si omites el 2, el vhost se creara como www.midominio.us.</p>
<p>El script hara lo siguiente:</p>
<p>-Crear el archivo del vhost en tu /etc/apache2/sites-available</p>
<p>-Crear el enlace simbólico requerido en /etc/apache2/sites-enabled apuntando al archivo mencionado en la linea anterior.</p>
<p>-Crear una entrada en el archivo /etc/hosts para crear el dominio ficticio que estará disponible solo localmente apuntando a la ip local 127.0.0.1</p>
<p>-Crear el directorio donde se instalará el script en /var/www[2]/midominio.us</p>
<p>-En mi caso particular, también copia la librería de depuración que utilizo para mis scripts php en ese directorio&#8230; pero eso no lo incluyo aquí, ya que eso es tema aparte. Esas líneas las exclui del script que aqui publico.</p>
<p>-Por ultimo, reinicia el servidor web apache.</p>
<p>Nota: es importante correr el comando con sudo, ya que de otra manera el script no podrá realizar los cambios necesarios en el sistema, dado que el usuario normal no tiene privilegios suficientes. Para mayor facilidad, yo recomiendo ponerlo en /bin/ para que esté disponible siempre sin proveer la ruta, y luego darle la propiedad de ejecutable  (  sudo chmod a+x /bin/create_vhost ).</p>
<p>Para descargar el código hacer <a title="create_vhost" href="http://www.joelconty.com/wp/wp-content/uploads/2008/03/create_vhost.zip">click aquí</a></p>
<p>El código es este:</p>
<pre>#!/bin/sh    

#get domain name from parameter
domain=$1;    

#if no domain provided, die
if [ -z $domain ] ; then
	echo "missing domain name"
	exit
fi     

#if second parameter provided use it
alt_www=$2;    

#get count of sites in apache
site_count=`find /etc/apache2/sites-enabled/ -type l |wc -l`    

#figure out number format depending of count
if [ $site_count -lt 10 ] ; then
	site_count_formatted="00${site_count}"
elif [ $site_count -lt 100 ] ; then
	site_count_formatted="0${site_count}"
else
	site_count_formatted=$site_count
fi    

#set some variables
adminemail="user@domain.com"
sites_available_dir="/etc/apache2/sites-available"
sites_enabled_dir="/etc/apache2/sites-enabled"
sites_available_file="${sites_available_dir}/${domain}"
sites_enabled_file="${sites_enabled_dir}/${site_count_formatted}-${domain}"
document_root="/var/www${alt_www}/${domain}/"    

#create vhost for apache
touch $sites_available_file
echo "" &gt; $sites_available_file
echo "        ServerName www${alt_www}.${domain}" &gt;&gt; $sites_available_file
echo "        ServerAdmin ${adminemail}" &gt;&gt; $sites_available_file
echo "        DocumentRoot /var/www${alt_www}/${domain}" &gt;&gt; $sites_available_file
echo "        ErrorLog /var/log/apache2/${domain}.error.log" &gt;&gt; $sites_available_file
echo "        CustomLog /var/log/apache2/${domain}.access.log combined" &gt;&gt; $sites_available_file
echo "" &gt;&gt; $sites_available_file
echo "        " &gt;&gt; $sites_available_file
echo "                Options FollowSymLinks" &gt;&gt; $sites_available_file
echo "                AllowOverride None" &gt;&gt; $sites_available_file
echo "        " &gt;&gt; $sites_available_file
echo "" &gt;&gt; $sites_available_file
echo "        " &gt;&gt; $sites_available_file
echo "                Options Indexes FollowSymLinks MultiViews" &gt;&gt; $sites_available_file
echo "                AllowOverride All" &gt;&gt; $sites_available_file
echo "                Order allow,deny" &gt;&gt; $sites_available_file
echo "                allow from all" &gt;&gt; $sites_available_file
echo "        " &gt;&gt; $sites_available_file
echo "        LogLevel warn" &gt;&gt; $sites_available_file
echo "        ServerSignature Off" &gt;&gt; $sites_available_file
echo "" &gt;&gt; $sites_available_file
ln -s $sites_available_file $sites_enabled_file    

#create entry in the hosts file
echo "127.0.0.1	www${alt_www}.${domain}" &gt;&gt; /etc/hosts    

#create the directories
mkdir -p ${document_root}    

#restart apache
/etc/init.d/apache2 restart</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.joelconty.com/wp/2008/03/automatizar-la-creacion-de-vhosts-en-apache2-en-ubuntu/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>HTML Widgets</title>
		<link>http://www.joelconty.com/wp/2007/12/html-widgets/</link>
		<comments>http://www.joelconty.com/wp/2007/12/html-widgets/#comments</comments>
		<pubDate>Sat, 29 Dec 2007 22:40:06 +0000</pubDate>
		<dc:creator>Joel</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[widgets]]></category>

		<guid isPermaLink="false">http://www.joelconty.com/wp/archives/21</guid>
		<description><![CDATA[En mi trabajo tengo la necesidad de escribir código HTML, cosa que me resulta tediosa. En muchas ocasiones prefiero usar Dreamweaver para generar trozos de html como por ejemplo una tabla, la creo, la lleno con el contenido necesario, luego la selecciono y en la ventana donde se ve el codigo HTML corto el código [...]]]></description>
			<content:encoded><![CDATA[<p><a title="Write" href="http://www.joelconty.com/wp/wp-content/uploads/2007/12/write.gif"><img class="alignright" style="float: right;" src="http://www.joelconty.com/wp/wp-content/uploads/2007/12/write.thumbnail.gif" alt="Write" align="left" /></a>En mi trabajo tengo la necesidad de escribir código HTML, cosa que me resulta tediosa. En muchas ocasiones prefiero usar Dreamweaver para generar trozos de html como por ejemplo una tabla, la creo, la lleno con el contenido necesario, luego la selecciono y en la ventana donde se ve el codigo HTML corto el código y lo pego en mi editor.</p>
<p>Para evitar este proceso y hacerlo programáticamente en PHP, escribí algo de codigo, que aquí pongo a disposición del que le interese, el cual sirve para generar algunos elementos HTML en forma fácil y sencilla.  Es un conjunto de clases, donde cada clase sirve para generar un elemento HTML. Trae las siguientes clases:  table, form, radio, radioset, checkbox, checkboxset, select, anchor, paragraphp, textbox, textarea,  hiddenbox, heading, y algun otro elemento que se me escapa por ahorita.  Conforme vaya creando mas los ire agregando ahi mismo.</p>
<p>Si te interesa checar esta libreria, ver ejemplos y código, <a title="Codigo html widgets" href="http://www.joelconty.com/htmlwidgets/" target="_blank">clickea aquí</a>.</p>
<p>Para descargarla <a title="libreria htmlwidgets" href="http://joelconty.com/htmlwidgets.zip" target="_blank">clickea aquí</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.joelconty.com/wp/2007/12/html-widgets/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Clase para manejar MySql evitando inyecciones de SQL</title>
		<link>http://www.joelconty.com/wp/2007/03/clase-para-manejar-mysql-evitando-inyecciones-de-sql/</link>
		<comments>http://www.joelconty.com/wp/2007/03/clase-para-manejar-mysql-evitando-inyecciones-de-sql/#comments</comments>
		<pubDate>Sat, 24 Mar 2007 01:26:09 +0000</pubDate>
		<dc:creator>Joel</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[injection]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://www.joelconty.com/wp/archives/17</guid>
		<description><![CDATA[Al escribir scripts para la web en php-mysql, una de las fallas más comunes en que la mayoría de la gente incurre es no validar apropiadamente la información proporcionada por el usuario del sistema, haciendo así vulnerable el sistema a lo que se conoce como ¨inyeccion de sql¨. Tomemos un ejemplo: Una consulta tipica creada [...]]]></description>
			<content:encoded><![CDATA[<p><a title="Injyeccion" href="http://www.joelconty.com/wp/wp-content/uploads/2007/03/injection.gif"><img class="alignright" style="float: right;" src="http://www.joelconty.com/wp/wp-content/uploads/2007/03/injection.thumbnail.gif" alt="Injyeccion" /></a>Al escribir scripts para la web en php-mysql, una de las fallas más comunes en que la mayoría de la gente incurre es no validar apropiadamente la información proporcionada por el usuario del sistema, haciendo así vulnerable el sistema a lo que se conoce como ¨inyeccion de sql¨. Tomemos un ejemplo: Una consulta tipica creada por un usuario poco precavido para la autentificación de usuarios sería formada por concatenación y sería algo así como:<span id="more-17"></span></p>
<pre>

$sql = "select count(1)
from usuarios
where username = '" . $_POST["username"] . "'
and password = '" . $_POST["password"] . "'";
</pre>
<p>Aquí vemos que la información enviada por el usuario es tomada tal cual y pasada por concatenación a la variable $sql , que almacena la consulta que se va a enviar hacia la base de datos. El usuario no se da cuenta que al hacer esto está dejando la puerta abierta al sistema.  Definitivamente no es una buena idea. Veamos por que: supongamos que el usuario malicioso introduce como password &#8220;<strong>cualquier-password&#8217; or 1=1; &#8211;</strong>&#8220;. El resultado de la concatenación seria</p>
<pre>
$sql = "select count(1) as count
from usuarios
where username = "cualquier-user'
and password = 'cualquier-password' or 1=1;"
</pre>
<p>Notese que el incluir la condición  <strong>or 1=1</strong>; hara que las condiciones especificadas sean evaluadas en su conjunto como verdaderas y la autenticación procederá. Después el usuario termina su sentencia con <strong>&#8211;</strong> para indicar que cualquier otra cosa más que siga sea considerada como comentario o ignorada.</p>
<p>La consulta resultará exitoso y dará entrada al sistema al usuario malicioso. Imagina las consecuencias que esto puede tener. Eso es solo un ejemplo de lo malo que puede resultar el no validar apropiadamente la información proveida por el usuario.</p>
<p>El canal de #php-es de la red FreeNode de IRC, canal en el cual asisto con regularidad, he visto que con frecuencia llega gente preguntando como evitar inyecciones de SQL en su sistema. En mi actividad como programador he tenido oportunidad de ver algunas clases escritas en PHP para facilitar la interacción con bases de datos (wrappers) para PostgreSQL y para Oracle. Esto me llevo a la idea de adaptar dicha funcionalidad en una clase en PHP para MySQL que permita contrarestar con facilidad el peligro de las inyecciones de SQL.</p>
<p>Dicha clase la puedes <a title="download" href="http://www.joelconty.com/clsDb.zip" target="_blank">bajar aqui</a>.</p>
<p>MODO DE USO</p>
<p>Usando el mismo ejemplo citado al principio tendriamos que hacer lo siguiente:</p>
<pre>

&lt;?
include_once("clsDb.php"); //incluyendo la clase en cuestion
$db = new clsDb('localhost', 3306, 'midatabase', 'username', 'password', 0); //instanciando clase
$sql = "select count(1) as count from usuarios where username = :usuario and password = :password";
$r = $db-&gt;Parse($sql);
$r-&gt;BindByName(":username", $_POST["username"]);
$r-&gt;BindByName(":password", $_POST["password"]);
$r-&gt;Execute();
$row = $r-&gt;GetRow();
if ( $row-&gt;count == 1){
//se encontro un usuario con esa informacion de acceso.
} else {
//no se encontro ningun usuario con esa informacion de acceso
}
?&gt;
</pre>
<p>En este ejemplo, vemos que la sentencia sql no es formada por concatenación como en el caso anterior, sino que ya viene completa, aunque viene escrita con un par de &#8220;marcadores&#8221; los cuales van a ser sustituidos con los valores apropiados, pero antes seran pasados por un proceso de sanitación que previene que el usuario malicioso del sistema pueda inyectar sql y hacer que el sistema haga otras cosas diferentes a las que fue diseñado.</p>
<p>Asi como se usan estos marcadores en combinacion con la funcion  &#8220;BindByName&#8221; en una sentencia tipo select, se usan de igual manera para sentencias insert, update o delete. Es bastante sencillo. El chiste de esto es no confiar en que el usuario está dandonos un valor inofensivo, sino tomarlo como una potencial amenaza, y desactivar el peligro pasandolo por bindbyname. Espero le sea de utilidad a alguien.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.joelconty.com/wp/2007/03/clase-para-manejar-mysql-evitando-inyecciones-de-sql/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
