<?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>Codigo Manso &#187; PHP</title>
	<atom:link href="http://www.codigomanso.com/es/category/programacion/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.codigomanso.com</link>
	<description>Programación, informática y tecnología</description>
	<lastBuildDate>Sun, 21 Aug 2011 10:54:29 +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>Truco Manso: Detectar el sistema operativo en PHP</title>
		<link>http://www.codigomanso.com/es/2010/04/truco-manso-detectar-el-sistema-operativo-en-php/</link>
		<comments>http://www.codigomanso.com/es/2010/04/truco-manso-detectar-el-sistema-operativo-en-php/#comments</comments>
		<pubDate>Thu, 08 Apr 2010 09:36:39 +0000</pubDate>
		<dc:creator>Pau Sanchez</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[truco manso]]></category>
		<category><![CDATA[sistema operativo]]></category>
		<category><![CDATA[so]]></category>

		<guid isPermaLink="false">http://www.codigomanso.com/es/?p=779</guid>
		<description><![CDATA[Los motivos pueden ser diversos, y se podría abrir un debate. En cualquier caso yo no voy a entrar en los porqués, pero a veces resulta útil saber el sistema operativo en el que corre la web, ya que dependiendo de éste, se pueden realizar algunas optimizaciones, o ejecutar algunos u otros comandos, o símplemente [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Los motivos pueden ser diversos, y se podría abrir un debate. En cualquier caso yo no voy a entrar en los porqués, pero a veces resulta útil saber el sistema operativo en el que corre la web, ya que dependiendo de éste, se pueden realizar algunas optimizaciones, o ejecutar algunos u otros comandos, o símplemente puede resultar interesante a nivel informativo, en cualquier caso, lo normal es que no te haga falta jamás saber el sistema operativo en el que está ejecutandose tu código PHP.</p>
<p style="text-align: justify;">Suponiendo que te hace falta, hay dos formas de saber el sistema operativo. La primera, y más completa, es mediante la función <a href=" http://php.net/manual/en/function.php-uname.php" target="_blank"><em>php_uname</em></a>. La función php_uname es similar al comando uname de linux, y con esta podemos saber el sistema operativo y la versión del mismo, el número de release del SO, el nombre del host y la arquitectura del ordenador. Completito completito.</p>
<p style="text-align: justify;">Por otra parte, si no queremos calentarnos la cabeza, y sólo queremos saber el sistema operativo, se puede usar la constante <em>PHP_OS</em>. Más sencillo, pero en la mayoría de los casos será suficiente (el equivalente sería <em><strong>php_uname(&#8217;s&#8217;)</strong></em>).</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">echo</span> <span style="color: #990000;">php_uname</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #009900; font-weight: bold;">PHP_OS</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.codigomanso.com/es/2010/04/truco-manso-detectar-el-sistema-operativo-en-php/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>TCPDF excelente libreria para generar PDFs en PHP</title>
		<link>http://www.codigomanso.com/es/2009/12/tcpdf-excelente-libreria-para-generar-pdfs-en-php/</link>
		<comments>http://www.codigomanso.com/es/2009/12/tcpdf-excelente-libreria-para-generar-pdfs-en-php/#comments</comments>
		<pubDate>Mon, 07 Dec 2009 09:10:55 +0000</pubDate>
		<dc:creator>Pau Sanchez</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[pdf]]></category>
		<category><![CDATA[php-pdf]]></category>

		<guid isPermaLink="false">http://www.codigomanso.com/es/?p=797</guid>
		<description><![CDATA[El otro día estuve investigando el tema de generar PDFs con PHP.
Lo primero que me vino a la cabeza fué la extensión de PDFlib que incluye PHP desde la versión 4. El problema de esta versión es que me parecía muy a bajo nivel, y tampoco tenía ni idea de por donde empezar.
La lista de [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">El otro día estuve investigando el tema de generar PDFs con PHP.</p>
<p style="text-align: justify;">Lo primero que me vino a la cabeza fué la <a href="http://php.net/manual/en/book.pdf.php">extensión de PDFlib</a> que incluye PHP desde la versión 4. El problema de esta versión es que me parecía muy a bajo nivel, y tampoco tenía ni idea de por donde empezar.</p>
<p style="text-align: justify;">La <a href="http://www.php.net/manual/en/ref.pdf.php">lista de funciones de PDFlib que incorpora PHP</a> es bastante extensa, y seguramente se puede hacer de todo, pero no quería estar escribiendo cientos de lineas para hacer una chorrada de PDF, símplemente quería ponerle un fondo y escribir cuatro cosas.</p>
<p style="text-align: justify;">En fin, que buscando más información, acabé encontrándome con la librería <a href="http://www.tcpdf.org">TCPDF</a> que parecía muchísimo más completa, y más sencilla de usar. Realmente no se si es más sencilla o no, porque al final no he hecho nada con la extensión de PDFlib, pero <a href="http://www.tecnick.com/public/code/cp_dpage.php?aiocp_dp=tcpdf_examples">TCPDF tiene muchos ejemplos.</a> Hay ejemplos supersencillos de muchas cosas, con lo que hacer un PDF se convierte prácticamente en copiar y pegar de aquí y allá.</p>
<p style="text-align: justify;">La verdad es que con esta librería hice un prototipo de lo que quería hacer en 15 minutos. Puedes pasarle el código en formato HTML y luego la librería lo formatea internamente en el documento. Esto hace que no te tengas que calentar mucho la cabeza.</p>
<p style="text-align: justify;">La única &#8220;pega&#8221; que le veo, es que ocupa unos 10MB comprimida en zip, lo que son unos 16 megas una vez descomprimida.  En cualquier caso, la mayor parte del tamaño no es por la librería en sí, si no por que dentro lleva ya fuentes tipográficas, la documentación, y ejemplos. Si eliminamos las fuentes que no nos hacen falta y la documentación, se puede quedar en poco más de 1 megabyte descomprimida. Vamos, de lujo.</p>
<p style="text-align: justify;">Más información sobre esta librería en <a href="http://www.tcpdf.org">www.tcpdf.org</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.codigomanso.com/es/2009/12/tcpdf-excelente-libreria-para-generar-pdfs-en-php/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>Emular short tags en PHP cuando short_open_tag = off</title>
		<link>http://www.codigomanso.com/es/2009/11/emulate-short-tags-php-when-short_open_tag-is-disabled/</link>
		<comments>http://www.codigomanso.com/es/2009/11/emulate-short-tags-php-when-short_open_tag-is-disabled/#comments</comments>
		<pubDate>Sat, 21 Nov 2009 08:00:44 +0000</pubDate>
		<dc:creator>Pau Sanchez</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[emulate short tags]]></category>
		<category><![CDATA[php parser]]></category>
		<category><![CDATA[php tokenizer]]></category>
		<category><![CDATA[short tags]]></category>

		<guid isPermaLink="false">http://www.codigomanso.com/es/?p=781</guid>
		<description><![CDATA[Ayer estuve trasteando con PHP 5.3. Resulta que en la configuración por defecto está deshabilitada la opción de short_open_tag.
Esta opción es la que permite escribir código php tal que &#60;?=&#8221;algo&#8221;?&#62;  en vez de tener que escribirlo como &#60;?php echo &#8220;algo&#8221;?&#62;. Vamos, algo MUY deseable desde mi punto de vista.
Creo que la gente de PHP ha [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Ayer estuve trasteando con PHP 5.3. Resulta que en la configuración por defecto está deshabilitada la opción de <strong>short_open_tag</strong>.</p>
<p style="text-align: justify;">Esta opción es la que permite escribir código php tal que &lt;?=&#8221;algo&#8221;?&gt;  en vez de tener que escribirlo como &lt;?php echo &#8220;algo&#8221;?&gt;. Vamos, algo MUY deseable desde mi punto de vista.</p>
<p style="text-align: justify;">Creo que la gente de PHP ha metido un tanto la pata aquí, ya que todo viene por la ambiguedad al parsear documentos xml que empiezan con &lt;?xml. En fin, lo voy a dejar, porque esta es otra historia.</p>
<p style="text-align: justify;">Resulta que tengo una clase llamada <strong>jview</strong> que se encarga de manejar y cargar las vistas, y quería que se puedan seguir usando los short tags en esas vistas. Al final las vistas que maneja jview son templates PHP. Te puedes hacer una idea si piensas que al final es como un template en WordPress.</p>
<p style="text-align: justify;">Por poner un ejemplo rápido, dado el siguiente código en PHP</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;hello&quot;</span><span style="color: #000000; font-weight: bold;">?&gt;</span> <span style="color: #000000; font-weight: bold;">&lt;?=</span> <span style="color: #0000ff;">&quot;world&quot;</span><span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p style="text-align: justify;">Cuando short_open_tags está habilitado, la salida que produce PHP es:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">hello world</pre></div></div>

<p style="text-align: justify;">Sin embargo si short_open_tags=&#8221;Off&#8221;, entonces PHP produce la siguiente salida:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">hello <span style="color: #000000; font-weight: bold;">&lt;?=</span> <span style="color: #0000ff;">&quot;world&quot;</span><span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p style="text-align: justify;">En fin, que tenía dos alternativas para solucionar mi problema:</p>
<ul style="text-align: justify;">
<li> Copiar el archivo de vista que se intenta cargar a un fichero temporal, reemplazando los &#8216;&lt;?=&#8217; por &#8216;&lt;?php &#8216;, ejecutando el fichero modificado, borrar el fichero</li>
<li>Hacer un parser de código PHP en PHP que previamente reemplace los &#8216;&lt;?=&#8217; por &#8216;&lt;?php &#8216;</li>
</ul>
<p style="text-align: justify;">Como uno es como es, he hecho el parser ;D</p>
<p style="text-align: justify;">Lo mejor de todo es que han sido sólo 20 minutos!! Menos de lo que me esperaba!</p>
<p style="text-align: justify;">Aquí está el código:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">  function include_emulating_short_tags ($viewFile)
  {
    // Alternate method for making <span style="color: #000000; font-weight: bold;">&lt;?=</span> valid
    <span style="color: #000088;">$raw</span> <span style="color: #339933;">=</span> <span style="color: #990000;">file_get_contents</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$viewFile</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$raw</span> <span style="color: #339933;">=</span> <span style="color: #990000;">str_replace</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'&lt;?='</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'&lt;?php echo '</span><span style="color: #339933;">,</span> <span style="color: #000088;">$raw</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
&nbsp;
    <span style="color: #000088;">$html</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$phptokens</span> <span style="color: #339933;">=</span> <span style="color: #339933;">@</span><span style="color: #990000;">token_get_all</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$raw</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000088;">$mode</span>    <span style="color: #339933;">=</span> <span style="color: #0000ff;">'text'</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$phpcode</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$phptokens</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$ptoken</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
      <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$mode</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'text'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #990000;">is_array</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$ptoken</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$ptoken</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">===</span> T_OPEN_TAG<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$mode</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'php'</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">continue</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
&nbsp;
      <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$mode</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'php'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #990000;">is_array</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$ptoken</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$ptoken</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">===</span> T_CLOSE_TAG<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #990000;">ob_start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #990000;">eval</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$phpcode</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">';'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$html</span> <span style="color: #339933;">.=</span> <span style="color: #990000;">ob_get_contents</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #990000;">ob_end_clean</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000088;">$mode</span>    <span style="color: #339933;">=</span> <span style="color: #0000ff;">'text'</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$phpcode</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">continue</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
&nbsp;
      <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$mode</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'text'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
        <span style="color: #000088;">$html</span> <span style="color: #339933;">.=</span> <span style="color: #990000;">is_array</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$ptoken</span><span style="color: #009900;">&#41;</span> ? <span style="color: #000088;">$ptoken</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">:</span> <span style="color: #000088;">$ptoken</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
      <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$phpcode</span> <span style="color: #339933;">.=</span> <span style="color: #990000;">is_array</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$ptoken</span><span style="color: #009900;">&#41;</span> ? <span style="color: #000088;">$ptoken</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">:</span> <span style="color: #000088;">$ptoken</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$mode</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'php'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$phpcode</span> <span style="color: #339933;">!==</span> <span style="color: #0000ff;">''</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #990000;">ob_start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #990000;">eval</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$phpcode</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #000088;">$html</span> <span style="color: #339933;">.=</span> <span style="color: #990000;">ob_get_contents</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #990000;">ob_end_clean</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> <span style="color: #000088;">$html</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span></pre></div></div>

<p style="text-align: justify;">Al final, la variable <b>$html</b> que se devuelve, es la que contiene el supuesto código HTML que se mostraría.</p>
<p style="text-align: justify;">Si hicieramos un include_emulating_short_tags con el código inicial y short_open_tags=0, seguiría saliendo &#8220;hello world&#8221;. El único inconveniente que le veo a esta forma, es que las variables de PHP tipo __FILE__, no sacarían el valor esperado. Aunque de todos modos esto tendría fácil arreglo, con otro str_replace <img src='http://www.codigomanso.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.codigomanso.com/es/2009/11/emulate-short-tags-php-when-short_open_tag-is-disabled/feed/</wfw:commentRss>
		<slash:comments>26</slash:comments>
		</item>
		<item>
		<title>Soporte multi-idioma para WordPress: Mejorado!</title>
		<link>http://www.codigomanso.com/es/2009/10/improved-multi-lingual-support-for-wordpress/</link>
		<comments>http://www.codigomanso.com/es/2009/10/improved-multi-lingual-support-for-wordpress/#comments</comments>
		<pubDate>Thu, 29 Oct 2009 09:03:15 +0000</pubDate>
		<dc:creator>Pau Sanchez</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[i18n]]></category>
		<category><![CDATA[zdmultilang]]></category>

		<guid isPermaLink="false">http://www.codigomanso.com/es/?p=738</guid>
		<description><![CDATA[Hace tiempo que uso el plugin de wordpress ZdMultilang para escribir en varios idiomas.
La verdad es que el plugin va de lujo, el único inconveniente que le veía desde hace ya tiempo es que los comentarios que la gente hiciera  en un idioma, eran visibles desde los demás idiomas. Esto no me parecía lógico, teniendo [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Hace tiempo que uso el plugin de wordpress <a href="http://blog.zen-dreams.com/en/wordpress/zdmultilang/" target="_blank">ZdMultilang</a> para <a href="http://www.codigomanso.com/es/2008/12/wordpress-27-y-soporte-multi-idioma/" target="_self">escribir en varios idiomas</a>.</p>
<p style="text-align: justify;">La verdad es que el plugin va de lujo, el único inconveniente que le veía desde hace ya tiempo es que los comentarios que la gente hiciera  en un idioma, eran visibles desde los demás idiomas. Esto no me parecía lógico, teniendo en cuenta que si tu entras a leer un blog en Inglés, si ves comentarios en Español, pues seguramente no te van a decir nada, e incluso más, es posible que hasta te bloqueen a la hora de dejar un comentario.</p>
<p style="text-align: justify;">Como era algo que no me gustaba, ya<a href="http://blog.zen-dreams.com/en/wordpress/zdmultilang/#comment-2488" target="_blank"> le pedí hace tiempo a Anthony Petitbois</a>, el creador original del plugin, a ver si podría incluir un par de mejoras en el plugin.</p>
<p style="text-align: justify;">Como de eso hace ya cerca de 10 meses, y es algo que quería si o si para otro blog, pues pensé:</p>
<p style="padding-left: 30px; text-align: justify;">&#8220;Nunca he hecho ningún plugin de wordpress, pero no debe de ser muy complicado, sobretodo si cojo este como base&#8221;</p>
<p style="text-align: justify;">Unas 4 horas y media más tarde, ya tenía el plugin actualizado en este blog, y después de las pruebas que he hecho, parece que todo funciona perfectamente, al menos para WordPress &gt;= 2.8.x</p>
<p style="text-align: justify;">Qué mejoras he incluido?</p>
<ul>
<li><strong>zd_multilang_get_locale():</strong> es una función que nos devuelve el idioma actual del blog (Inglés, Español, &#8230;)</li>
<li>La posibilidad de <strong>mantener los comentarios separados</strong> para cada idioma</li>
<li>La posibilidad de <strong>mantener un único hilo de comentarios</strong>, tal y como se hacía ahora</li>
</ul>
<p style="text-align: justify;">Nótese, que TODOS los comentarios previos a la instalación de esta actualización serán mostrados en TODOS los idiomas. No tiene sentido no mostrar comentarios si uno no sabe en qué idioma estan.</p>
<p style="text-align: justify;">Nótese también que he añadido una opción para que el usuario pueda escoger cómo desea que se comporte el blog (manteniendo los comentarios separados, o manteniendolos todos juntos). Independientemente de la opción escogida, TODOS los comentarios son visibles desde el panel de administración, así se simplifica la administración de los comentarios <img src='http://www.codigomanso.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p style="text-align: justify;">La única modificación que tendreis que hacer en vuestro site, para que esto funcione perfectamente, será en el theme que esteis usando, en el archivo comments.php, teneis que cambiar el formulario donde pone:</p>
<p style="text-align: justify; padding-left: 30px;"><em>action=&#8221;&lt;?php echo get_option(&#8217;siteurl&#8217;); ?&gt;/wp-comments-post.php&#8221;</em></p>
<p style="text-align: justify; padding-left: 30px;">por</p>
<p style="text-align: justify; padding-left: 30px;"><em>action=&#8221;&lt;?php echo get_option(&#8217;siteurl&#8217;); ?&gt;/wp-comments-post.php<strong>?lang=&lt;?=zd_multilang_get_locale()?&gt;</strong>&#8220;</em></p>
<p style="text-align: justify;">Para concluir, en el siguiente enlace os podeis descargar el diff de los cambios con respecto a ZdMultilang 1.2.4, el archivo zdmultilang.php ya modificado, así como el readme.txt:</p>
<ul>
<li><a href="http://www.codigomanso.com/archives/zd_multilang-1.2.5-keep_separate_comments.tgz" target="_self"><strong>Descargar ZdMultilang que mantiene los comentarios separados</strong></a></li>
</ul>
<p style="text-align: justify;">Nótese que he incrementado el número de versión a la 1.2.5, sin embargo esto puede producir &#8220;problemas&#8221; futuros, a no ser que convenza a Anthony para que lo incluya en la siguiente versión <img src='http://www.codigomanso.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p style="text-align: justify;">De momento, este parche no es oficial, pero es open source.</p>
<p style="text-align: justify;">
]]></content:encoded>
			<wfw:commentRss>http://www.codigomanso.com/es/2009/10/improved-multi-lingual-support-for-wordpress/feed/</wfw:commentRss>
		<slash:comments>163</slash:comments>
		</item>
		<item>
		<title>Detectar en PHP si un gif es animado</title>
		<link>http://www.codigomanso.com/es/2009/06/detect-an-animated-gif-in-php/</link>
		<comments>http://www.codigomanso.com/es/2009/06/detect-an-animated-gif-in-php/#comments</comments>
		<pubDate>Sun, 28 Jun 2009 19:50:33 +0000</pubDate>
		<dc:creator>Pau Sanchez</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[animado]]></category>
		<category><![CDATA[gif]]></category>

		<guid isPermaLink="false">http://www.codigomanso.com/es/?p=679</guid>
		<description><![CDATA[La siguiente función sirve para detectar si un GIF es animado o no (tiene más de 1 frame).

  function isAnimatedGif&#40;$filename&#41;
  &#123;
    $filecontents=file_get_contents&#40;$filename&#41;;
&#160;
    $str_loc=0;
    $count=0;
&#160;
    # There is no point in continuing after we find a 2nd frame
    while [...]]]></description>
			<content:encoded><![CDATA[<p>La siguiente función sirve para detectar si un GIF es animado o no (tiene más de 1 frame).</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">  <span style="color: #000000; font-weight: bold;">function</span> isAnimatedGif<span style="color: #009900;">&#40;</span><span style="color: #000088;">$filename</span><span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$filecontents</span><span style="color: #339933;">=</span><span style="color: #990000;">file_get_contents</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$filename</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000088;">$str_loc</span><span style="color: #339933;">=</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$count</span><span style="color: #339933;">=</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;"># There is no point in continuing after we find a 2nd frame
</span>    <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$count</span> <span style="color: #339933;">&lt;</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span> 
    <span style="color: #009900;">&#123;</span>
      <span style="color: #000088;">$where1</span><span style="color: #339933;">=</span><span style="color: #990000;">strpos</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$filecontents</span><span style="color: #339933;">,</span><span style="color: #0000ff;">&quot;<span style="color: #660099; font-weight: bold;">\x00</span><span style="color: #660099; font-weight: bold;">\x21</span><span style="color: #660099; font-weight: bold;">\xF9</span><span style="color: #660099; font-weight: bold;">\x04</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$str_loc</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$where1</span> <span style="color: #339933;">===</span> <span style="color: #009900; font-weight: bold;">FALSE</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
&nbsp;
      <span style="color: #000088;">$str_loc</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$where1</span><span style="color: #339933;">+</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
      <span style="color: #000088;">$where2</span>  <span style="color: #339933;">=</span> <span style="color: #990000;">strpos</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$filecontents</span><span style="color: #339933;">,</span><span style="color: #0000ff;">&quot;<span style="color: #660099; font-weight: bold;">\x00</span><span style="color: #660099; font-weight: bold;">\x2C</span>&quot;</span><span style="color: #339933;">,</span><span style="color: #000088;">$str_loc</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$where2</span> <span style="color: #339933;">===</span> <span style="color: #009900; font-weight: bold;">FALSE</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
      <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$where1</span><span style="color: #339933;">+</span><span style="color: #cc66cc;">8</span> <span style="color: #339933;">==</span> <span style="color: #000088;">$where2</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
          <span style="color: #000088;">$count</span><span style="color: #339933;">++;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #000088;">$str_loc</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$where2</span><span style="color: #339933;">+</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// gif is animated when it has two or more frames</span>
    <span style="color: #b1b100;">return</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$count</span> <span style="color: #339933;">&gt;=</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
  <span style="color: #009900;">&#125;</span></pre></div></div>

<p>También está la siguiente alternativa, más compacta que la anterior:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> isAnimatedGif<span style="color: #009900;">&#40;</span><span style="color: #000088;">$filename</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #009900;">&#40;</span>bool<span style="color: #009900;">&#41;</span><span style="color: #990000;">preg_match</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'#(\x00\x21\xF9\x04.{4}\x00\x2C.*){2,}#s'</span><span style="color: #339933;">,</span> <span style="color: #990000;">file_get_contents</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$filename</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>El código lo he modificado minimamente a partir de lo que he encontrado en los comentarios de <a href="http://es2.php.net/manual/en/function.imagecreatefromgif.php">http://es2.php.net/manual/en/function.imagecreatefromgif.php</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.codigomanso.com/es/2009/06/detect-an-animated-gif-in-php/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Prevenir ataques XSS con HTML Purifier</title>
		<link>http://www.codigomanso.com/es/2009/03/prevenir-ataques-xss-con-html-purifier/</link>
		<comments>http://www.codigomanso.com/es/2009/03/prevenir-ataques-xss-con-html-purifier/#comments</comments>
		<pubDate>Sun, 08 Mar 2009 22:50:53 +0000</pubDate>
		<dc:creator>Pau Sanchez</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[ataques xss]]></category>
		<category><![CDATA[cross site scripting]]></category>
		<category><![CDATA[filtrar html]]></category>
		<category><![CDATA[xss]]></category>

		<guid isPermaLink="false">http://www.codigomanso.com/es/?p=605</guid>
		<description><![CDATA[
Que son los ataques XSS (cross site scripting) y por qué hay que evitarlos es algo esencial que merece un post a parte.
La idea con la que hay que tienes que quedarte, es que si tienes o planeas realizar una página web donde permites que otros usuarios editen o publiquen contenido HTML (ya sea en [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://www.htmlpurifier.com/"><img class="size-full wp-image-607 aligncenter" title="HTML Purifier" src="http://www.codigomanso.com/wp-content/uploads/2009/03/html-purifier.png" alt="HTML Purifier" width="497" height="178" /></a></p>
<p style="text-align: justify;">Que son los ataques <a href="http://en.wikipedia.org/wiki/Cross-site_scripting" target="_blank">XSS (cross site scripting)</a> y por qué hay que evitarlos es algo esencial que merece un post a parte.</p>
<p style="text-align: justify;">La idea con la que hay que tienes que quedarte, es que si tienes o planeas realizar una página web donde permites que otros usuarios editen o publiquen contenido HTML (ya sea en forma de páginas, comentarios, etc&#8230;), debes de alguna manera validar que el contenido HTML que están generando es seguro.</p>
<p style="text-align: justify;">Hay muchas librerias que se encargan de filtrar y validar estos contenidos HTML para asegurarse que la gente que sube contenidos no va a hacer nada malo. Yo por mi parte he estado mirando hace un rato, porque tampoco iba a ponerme a hacer la mía (no es mi objetivo en la vida  sacrificar dos semanas de trabajo si puedo usar algo que ya existe y funciona), y me he encontrado con <a href="http://www.htmlpurifier.com/">HTML Purifier</a>, una librería de PHP bastante extensa y con muchisima funcionalidad que se encarga de filtrar codigo maligno.</p>
<p style="text-align: justify;">Utilizarla es muy muy sencillo. Sólo requiere dos lineas (una vez incluido el archivo base).</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">require_once</span> <span style="color: #0000ff;">'/path/to/htmlpurifier/library/HTMLPurifier.auto.php'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$purifier</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> HTMLPurifier<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$clean_html</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$purifier</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>purify<span style="color: #009900;">&#40;</span><span style="color: #000088;">$dirty_html</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p style="text-align: justify;">Lo bueno de esta libreria, es que se pueden configurar muchisimas cosas, como limitar el número de tags, los atributos por tag, etc&#8230; e incluso es capaz de reformatear código html inválido y convertirlo en código válido (tal y como pueden hacen otras librerias como <a href="http://www.crummy.com/software/BeautifulSoup/">BeautifulSoup</a> en Python o como <a href="http://tidy.sourceforge.net/">Tidy HTML</a> para C/C++)</p>
<p style="text-align: justify;">También cabe destacar que en principio esta libreria NO REFORMATEA el código HTML, simplemente se encarga de eliminar o reformatear las partes peligrosas o inválidas.</p>
<p style="text-align: justify;">Seguramente en el futuro vuelva a hacer algún otro post sobre el tema, sin embargo, si teneis ocasion, recomiendo echarle un vistazo al libro <strong>Building scalable web sites</strong> de Cal Henderson. Aunque seguramente en la wikipedia y googleando un poco encontrareis bastante información.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codigomanso.com/es/2009/03/prevenir-ataques-xss-con-html-purifier/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Convertir una cadena UTF-8 en un array en PHP</title>
		<link>http://www.codigomanso.com/es/2009/02/convert-utf8-string-to-array-in-php/</link>
		<comments>http://www.codigomanso.com/es/2009/02/convert-utf8-string-to-array-in-php/#comments</comments>
		<pubDate>Sun, 22 Feb 2009 10:19:10 +0000</pubDate>
		<dc:creator>Pau Sanchez</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[i18n]]></category>
		<category><![CDATA[internacionalización]]></category>
		<category><![CDATA[utf-8]]></category>

		<guid isPermaLink="false">http://www.codigomanso.com/es/?p=578</guid>
		<description><![CDATA[Mientras llega y no llega PHP 6, con esas mejoras entre las que se encuentra el soporte nativo de UTF-8, algunos tenemos que seguir programando.
Creo que próximamente compartiré la clase de manejo de cadenas que estoy desarrollando, y que soporta 100% utf-8.
De momento voy a compartir una función, que si bien no es la más [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Mientras llega y no llega PHP 6, con esas mejoras entre las que se encuentra el soporte nativo de UTF-8, algunos tenemos que seguir programando.</p>
<p style="text-align: justify;">Creo que próximamente compartiré la clase de manejo de cadenas que estoy desarrollando, y que soporta 100% utf-8.</p>
<p style="text-align: justify;">De momento voy a compartir una función, que si bien no es la más aconsejable puesto que los arrays en PHP consumen MUCHOS recursos, creo que facilita el uso de cadenas UTF-8, pues se les puede dar el mismo tratamiento que a una cadena normal.</p>
<p style="text-align: justify;">Convertir una cadena UTF-8 a un array tiene 2 grandes ventajas:</p>
<ul style="text-align: justify;">
<li>cada elemento del array representa un único caracter</li>
<li><strong>count</strong> sobre el array será equivalente a <strong>mb_strlen</strong> sobre la cadena</li>
</ul>
<p style="text-align: justify;">La gran destventaja son los tiempos de conversión y el consumo de memoria, al estar usando un array.</p>
<p style="text-align: justify;">Ayer básicamente programé 2 funciones y <a href="http://uk3.php.net/manual/en/function.mb-split.php#80046" target="_blank">cojí prestado un ejemplo</a> que había puesto un usuario en la documentación de PHP.</p>
<p style="text-align: justify;">Las tres versiones de estas funciones las podeis ver a continuación:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> getCharArray1 <span style="color: #009900;">&#40;</span><span style="color: #000088;">$jstring</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #000088;">$len</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mb_strlen</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$jstring</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'UTF-8'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">mb_strlen</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$jstring</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'UTF-8'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #000088;">$ret</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">&lt;</span> <span style="color: #000088;">$len</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$char</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mb_substr</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$jstring</span><span style="color: #339933;">,</span> <span style="color: #000088;">$i</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'UTF-8'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #990000;">array_push</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$ret</span><span style="color: #339933;">,</span> <span style="color: #000088;">$char</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #b1b100;">return</span> <span style="color: #000088;">$ret</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// code from: http://uk3.php.net/manual/en/function.mb-split.php#80046</span>
<span style="color: #000000; font-weight: bold;">function</span> getCharArray2 <span style="color: #009900;">&#40;</span><span style="color: #000088;">$jstring</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #000088;">$len</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mb_strlen</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$jstring</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'UTF-8'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">mb_strlen</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$jstring</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'UTF-8'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$len</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$ret</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span>  <span style="color: #339933;">=</span> <span style="color: #990000;">mb_substr</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$jstring</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span><span style="color: #0000ff;">&quot;UTF-8&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$jstring</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mb_substr</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$jstring</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span><span style="color: #000088;">$len</span><span style="color: #339933;">,</span><span style="color: #0000ff;">&quot;UTF-8&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$len</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mb_strlen</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$jstring</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #b1b100;">return</span> <span style="color: #000088;">$ret</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// using mb_check_encoding instead of mb_substr ;)</span>
<span style="color: #000000; font-weight: bold;">function</span> getCharArray3 <span style="color: #009900;">&#40;</span><span style="color: #000088;">$jstring</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">mb_strlen</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$jstring</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'UTF-8'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #000088;">$ret</span>  <span style="color: #339933;">=</span> <span style="color: #990000;">array</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$alen</span> <span style="color: #339933;">=</span> <span style="color: #990000;">strlen</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$jstring</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$char</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">&lt;</span> <span style="color: #000088;">$alen</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$char</span> <span style="color: #339933;">.=</span> <span style="color: #000088;">$jstring</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">mb_check_encoding</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$char</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'UTF-8'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #990000;">array_push</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$ret</span><span style="color: #339933;">,</span> <span style="color: #000088;">$char</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #000088;">$char</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #b1b100;">return</span> <span style="color: #000088;">$ret</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p style="text-align: justify;">La función más rápida es la última, que utiliza un pequeño truco que se me ocurrió.</p>
<p style="text-align: justify;">La gráfica representa los tiempos de ejecución de cada una de estas funciones para una serie de iteraciones sobre una cadena notablemente larga.
</p>
<p><script type="text/javascript" src="http://www.codigomanso.com/archives/open-flash-chart/swfobject.js"></script><br />
<script type="text/javascript">
  swfobject.embedSWF(
    "http://www.codigomanso.com/archives/open-flash-chart/open-flash-chart.swf",
    "performance_chart", 
    "512", "384",
    "9.0.0",
    "expressInstall.swf",
    {"data-file":"http://www.codigomanso.com/archives/phpscripts/bench_getCharArray.txt"}
  );
</script></p>
<div id="performance_chart"></div>
<p><strong> Leyenda:</strong></p>
<ul>
<li><strong style="color:red;">getCharArray1:</strong> en rojo</li>
<li><strong style="color:green;">getCharArray2:</strong> en verde</li>
<li><strong style="color:blue;">getCharArray3:</strong> en azul</li>
</ul>
<p>Como se puede comprobar, <b>getCharArray3</b> es la más rápida (sobre 4x más que getCharArray1 y 6x más que getCharArray2).</p>
<p>Finalmente, aquí teneis el <a href="http://www.codigomanso.com/archives/phpscripts/bench_getCharArray.php.txt">enlace al script de benchmark</a> que he usado para obtener esa gráfica.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codigomanso.com/es/2009/02/convert-utf8-string-to-array-in-php/feed/</wfw:commentRss>
		<slash:comments>73</slash:comments>
		</item>
		<item>
		<title>Truco Manso: Actualizar el orden de una fila sin tocar el resto</title>
		<link>http://www.codigomanso.com/es/2009/01/update-order-of-a-row-keeping-the-rest-untouched/</link>
		<comments>http://www.codigomanso.com/es/2009/01/update-order-of-a-row-keeping-the-rest-untouched/#comments</comments>
		<pubDate>Sat, 31 Jan 2009 10:55:24 +0000</pubDate>
		<dc:creator>Pau Sanchez</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[Add new tag]]></category>
		<category><![CDATA[fila]]></category>
		<category><![CDATA[orden]]></category>
		<category><![CDATA[tabla]]></category>
		<category><![CDATA[truco manso]]></category>

		<guid isPermaLink="false">http://www.codigomanso.com/es/?p=506</guid>
		<description><![CDATA[Por salirme un poco de javascript y PHP, ahora una de bases de datos.
Este artículo trata sobre como cambiar el orden de un elemento dentro de una tabla, manteniendo el orden relativo de todos los demás elementos y actualizando únicamente un campo. Como esta descripcción es un poco densa, vayamos por partes.
Por simplificar el ejemplo, [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Por salirme un poco de javascript y PHP, ahora una de bases de datos.</p>
<p style="text-align: justify;">Este artículo trata sobre como cambiar el orden de un elemento dentro de una tabla, manteniendo el orden relativo de todos los demás elementos y actualizando únicamente un campo. Como esta descripcción es un poco densa, vayamos por partes.</p>
<p style="text-align: justify;">Por simplificar el ejemplo, digamos que estoy haciendo un sitio web relacionado con el mundo del motor, y como todo sitio web que se precie, tengo una base de datos. En esa base de datos hay dos tablas, una tabla <strong>marcas</strong> y otra tabla <strong>modelos.</strong> En la tabla <strong>marcas</strong> hay una fila por cada marca de coches (Toyota, Honda, Hyunday, Mercedes, Chrysler, BMW, Audi, &#8230;), y en la tabla de <strong>modelos</strong> de coches, pues hay una serie de modelos para cada tipo de coche. Por ejemplo, para Audi, estaría el modelo A6 2.0 TDIe , A5 2.0 TDI, A4, TT &#8230;, y la lista sigue hasta donde uno quiera y más para cada marca. Creo que con esto uno ya se hace una idea de las tablas que hay.</p>
<p style="text-align: justify;">El tema es que en mi sitio web, yo quiero que cuando el usuario haga click en una marca, le salga una lista ordenada de los modelos disponibles para esa marca, pero no quiero un orden cualquiera, no quiero que salgan ni por nombre, ni por votos, ni por precio, quiero que por defecto salga por el orden específico que yo haya definido.</p>
<p style="text-align: justify;">Pensareis, pues fácil, simplemente hay que añadir un campo <strong>orden</strong> dentro de la tabla <strong>modelos</strong>, o si os gusta tener las tablas normalizadas al máximo, pues creariais una tabla extra donde meteriais dos claves ajenas, una a <strong>modelos </strong>y otra a <strong>marcas</strong> y luego pondriais el campo<strong> orden.</strong></p>
<p style="text-align: justify;">Se haga de la forma A o de la forma B, el concepto final es que hay un campo que se llama orden, y que para lo que me sirve es para definir manualmente el orden en el que quiero que salgan los modelos en la página principal.</p>
<table style="float: left; width: auto;">
<tr>
<th>Marca</td>
</tr>
<tr>
<td>Nombre</td>
</tr>
<tr>
<td>Descripción</td>
</tr>
<tr>
<td>Imagen</td>
</tr>
<tr>
<td>&#8230;</td>
</tr>
</table>
<table style="float: left; margin-left: 2em;  width: auto;">
<tr>
<th>Modelo</td>
</tr>
<tr>
<td>Nombre</td>
</tr>
<tr>
<td>Descripción</td>
</tr>
<tr>
<td>Imagen</td>
</tr>
<tr>
<td>&#8230;</td>
</tr>
<tr>
<td><b>Orden</b></td>
</tr>
<tr>
<td>&#8230;</td>
</tr>
</table>
<div style="clear:both;"></div>
<p style="text-align: justify;">Hasta aquí sólo es introducción al artículo, lo bueno viene ahora.</p>
<p style="text-align: justify;">Imaginad que en marcas sólo está Audi (por decir una), y que sólo hay 4 modelos en la base de datos A3, A4, A5 y TT. A partir de aquí vamos a hacer como si las marcas no existieran (por simplificar aún más). Así que se nos queda una tabla de modelos como sigue:</p>
<table style="width: auto;">
<tr>
<th>Nombre</th>
<th>Descripción</th>
<th>&#8230;</th>
<th><b>Orden</b></th>
<th>&#8230;</th>
</tr>
<tr>
<td>A3</td>
<td>El A3 mola</td>
<td>&#8230;</td>
<td><b>1</b></td>
<td>&#8230;</td>
</tr>
<tr>
<td>A4</td>
<td>El A4 mola más</td>
<td>&#8230;</td>
<td><b>2</b></td>
<td>&#8230;</td>
</tr>
<tr>
<td>A5</td>
<td>El A5 mola mucho más</td>
<td>&#8230;</td>
<td><b>3</b></td>
<td>&#8230;</td>
</tr>
<tr>
<td>TT</td>
<td>Sin duda es el mejor</td>
<td>&#8230;</td>
<td><b>4</b></td>
<td>&#8230;</td>
</tr>
</table>
<p style="text-align: justify;">Ahora, si yo en mi sitio web, hago un select, y ordeno por el campo <b>orden</b>, pues como es lógico, viendo esa tabla, primero saldrá el A3, luego el A4, luego el A5 y seguidamente el Audi TT.</p>
<h5>El problema:</h5>
<p style="text-align: justify;"><b>¿Cómo hago ahora, si quiero que el Audi TT salga el primero?</b></p>
<p style="text-align: justify;">Se debe tener en cuenta, que yo sólo quiero mover el Audi TT a la primera posición, pero quiero que el A3, A4 y A5 no cambien su orden relativo. Y he dicho la primera posición por decir algo, pero también podría querer que el TT apareciera entre el A3 y el A4.</p>
<p style="text-align: justify;">
<h5>Solución 1: la fácil</h5>
<p style="text-align: justify;">Bueno, pues lo primero que a uno le viene a la cabeza (al menos a mi), es básicamente incrementar en 1 todos los campos cuyo orden sea mayor al que yo voy a poner para TT, y luego actualizar el orden del TT.</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">UPDATE</span> modelo <span style="color: #993333; font-weight: bold;">SET</span> <span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #66cc66;">=</span> <span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #66cc66;">+</span> <span style="color: #cc66cc;">1</span> <span style="color: #993333; font-weight: bold;">WHERE</span> <span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #66cc66;">&gt;=</span> <span style="color: #cc66cc;">1</span>;
<span style="color: #993333; font-weight: bold;">UPDATE</span> modelo <span style="color: #993333; font-weight: bold;">SET</span> <span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">1</span> <span style="color: #993333; font-weight: bold;">WHERE</span> name <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'TT'</span>;</pre></div></div>

<p style="text-align: justify;">Básicamente arriba he utilizado 2 queries, uno de complejidad lineal que modifica una ristra de filas, y otro que sólo toca una tabla.</p>
<p style="text-align: justify;">Como esta solución no me convencía demasiado, no era muy bonita, pues me puse a pensar y se me ocurrió otra.</p>
<p style="text-align: justify;">
<h5>Solución 2: la magia de los float</h5>
<p style="text-align: justify;"><b>¿Y si en vez de un entero, se usa un número real?</b></p>
<p style="text-align: justify;">Si el campo <b>orden</b> fuera real, entonces podría saber cual es el orden de los elementos inmediatamente anterior y posterior (puesto que los he cargado en el interfaz de usuario de mi web), y podría actualizar sólo el campo del TT sin tocar ningún otro elemento de la tabla.</p>
<p style="text-align: justify;">Es decir, si tenemos la configuración inicial (A3, A4, A5, TT), y quiero que el TT esté entre A3 y A4, como A3 tiene el valor de orden igual a 1.0, y A4 tiene el valor de orden de 2.0, y quiero que TT esté enmedio, el tema quedará de la siguiente manera.</p>
<table style="width: auto;">
<tr>
<th>Nombre</th>
<th>Descripción</th>
<th>&#8230;</th>
<th><b>Orden</b></th>
<th>&#8230;</th>
</tr>
<tr>
<td>A3</td>
<td>El A3 mola</td>
<td>&#8230;</td>
<td><b>1</b></td>
<td>&#8230;</td>
</tr>
<tr>
<td>TT</td>
<td>Sin duda es el mejor</td>
<td>&#8230;</td>
<td><b>1.5</b></td>
<td>&#8230;</td>
</tr>
<tr>
<td>A4</td>
<td>El A4 mola más</td>
<td>&#8230;</td>
<td><b>2</b></td>
<td>&#8230;</td>
</tr>
<tr>
<td>A5</td>
<td>El A5 mola mucho más</td>
<td>&#8230;</td>
<td><b>3</b></td>
<td>&#8230;</td>
</tr>
</table>
<p style="text-align: justify;">Básicamente lo que he hecho es calcular el valor intermedio entre A3 y A4, vease (1.0 + 2.0) / 2</p>
<p style="text-align: justify;">Nótese que esto se puede hacer tantas veces como se quiera, que siempre habrá un orden entre los elementos y <em>&#8220;jamás&#8221;</em> habrá dos elementos con el mismo orden. Por ejemplo, si ahora quermos que el A4 esté entre el A3 y el TT, actualizaríamos el orden de A4 a <b>(1.0 + 1.5)/2 = 1.25</b>.</p>
<table style="width: auto;">
<tr>
<th>Nombre</th>
<th>Descripción</th>
<th>&#8230;</th>
<th><b>Orden</b></th>
<th>&#8230;</th>
</tr>
<tr>
<td>A3</td>
<td>El A3 mola</td>
<td>&#8230;</td>
<td><b>1</b></td>
<td>&#8230;</td>
</tr>
<tr>
<td>A4</td>
<td>El A4 mola más</td>
<td>&#8230;</td>
<td><b>1.25</b></td>
<td>&#8230;</td>
</tr>
<tr>
<td>TT</td>
<td>Sin duda es el mejor</td>
<td>&#8230;</td>
<td><b>1.5</b></td>
<td>&#8230;</td>
</tr>
<tr>
<td>A5</td>
<td>El A5 mola mucho más</td>
<td>&#8230;</td>
<td><b>3</b></td>
<td>&#8230;</td>
</tr>
</table>
<p style="text-align: justify;">Como veis, el procedimiento está chupado, y sólo hay que tocar un campo.</p>
<p style="text-align: justify;">Claro, ahora surgen varias preguntas. Me direis, que bonito, <b>¿y que pasa si quieres ponerlo en la primera posición?</b> Fácil, si desde el principio se asume que el orden de los elementos que insertamos empieza en 1.0, entonces el elemento posterior será el que ya exista en la base de datos, y el elemento anterior será cero (0.0)</p>
<p style="text-align: justify;"><b>¿Y que pasa si ahora quieres insertar el A6?</b> Pues pasa que si hay 4 elementos, el A6 habrá que insertarlo con el valor 5.0 (nunca habrá colisión si se hace como <b>número de elementos + 1</b>).</p>
<p style="text-align: justify;">Y la pregunta estrella es: &#8220;<i>oye, los números de punto flotante tenían un límite, ¿no?</i> <b>¿que pasa si se desbordan?</b>&#8221; Ah, amigo Sancho ¡Con la iglesia hemos topado!</p>
<p style="text-align: justify;">Si os fijais, hacer que se desborde es tan fácil como ir moviendo todos los elementos siempre a la misma posición. Por ejemplo, si está el orden 1 y 2 inicialmente, y movemos el 3 a la segunda posición, ahora será 1, 1.5 y 2, luego si movemos el 2 a la segunda posición será 1, 1.25 y 1.5, si volvemos a mover el 1.5 a la segunda posición será 1, 1.125 y 1.25, y así sucesivamente hasta que el punto flotante diga hasta aquí (que puede ser mas o menos despues de unas 20 veces, según el número de bits que se usen para decimales).</p>
<p style="text-align: justify;">Lo cual nos lleva a la solución 3</p>
<h5>Solución 3: tapando agujeros</h5>
<h6>Solución 3.1: proceso en background</h6>
<p style="text-align: justify;">Una solución podría ser tener un proceso que una vez al día, a la semana o al mes, actualice todos los elementos de la tabla a números enteros respetando su orden actual. Aunque para eso casi mejor implementar la solución 1 que es más mantenible. Lo cual nos lleva a buscar otra alternativa.</p>
<h6>Solución 3.2: actualización entera </h6>
<p style="text-align: justify;">Básicamente es igual que la solución 2 (no me repetiré), pero con una salvedad, y es que cuando se mueva un elemento a una posición, si no hay ningún número entero en esa posición se tratará de redondear al número entero hacia abajo (o hacia arriba, o ambos), para mitigar esa degradación de los flotantes que van teniendo cada vez más decimales.</p>
<p style="text-align: justify;">Vease un ejemplo. Imaginemos que el tema se ha degradado un poco y parto de la siguiente configuración:</p>
<table style="width: auto;">
<tr>
<th>Nombre</th>
<th>Descripción</th>
<th>&#8230;</th>
<th><b>Orden</b></th>
<th>&#8230;</th>
</tr>
<tr>
<td>A3</td>
<td>El A3 mola</td>
<td>&#8230;</td>
<td><b>1.125</b></td>
<td>&#8230;</td>
</tr>
<tr>
<td>TT</td>
<td>Sin duda es el mejor</td>
<td>&#8230;</td>
<td><b>1.0394</b></td>
<td>&#8230;</td>
</tr>
<tr>
<td>A4</td>
<td>El A4 mola más</td>
<td>&#8230;</td>
<td><b>1.7628</b></td>
<td>&#8230;</td>
</tr>
<tr>
<td>A5</td>
<td>El A5 mola mucho más</td>
<td>&#8230;</td>
<td><b>3.78</b></td>
<td>&#8230;</td>
</tr>
</table>
<p style="text-align: justify;">Si ahora muevo el A3, entre el A4 y el A5, de normal haría lo siguiente: (1.7628 + 3.78)/2 = 2.7714. Pero oh magia, si redondeo el 2.7714 hacia abajo me da 2, y resulta que el sigue estando entre 1.7628 y 3.78, por lo tanto en vez de actualizar a 2.7714 actualizaría a 2. De esta manera, si más tarde moviera el TT entre el A3 y el A5, en vez de hacer esta operación <b>(2.7714 + 3.78) / 2</b>, tendría que hacer esta <b>(2 + 3.78) / 2</b>, que obviamente tiene menos decimales.</p>
<p style="text-align: justify;">Nótese que para esta solución símplemente hay que mirar si el número entero sigue estando entre el número anterior y el posterior (que son conocidos) y no es igual a ninguno de ambos.</p>
<p style="text-align: justify;">Además, si se asume que movimiento de los elementos se hará de forma aleatoria, de esta manera es poco probable (aunque sigue siendo posible) que al final el punto flotante se desborde.</p>
<p style="text-align: justify;">Por cierto, esta solución ahora mismo la he presentado con números reales, pero se pueden usar perfectamente números enteros, aunque siguiendo otro esquema.</p>
<h5>Conclusión</h5>
<p style="text-align: justify;">Si quieres robustez, usa la solución 1 para mantener el orden de todos los elementos; si quieres actualizar un único elemento cada vez, porque es una operación que se va a realizar miles de veces por miles de personas al día lo recomendable es la solución 3.2, aunque tendría problemas si hay varias personas concurrentemente actualizando campos.
<p style="text-align: justify; font-weight: bold;">Finalmente, aunque en el artículo se han visto un par de soluciones (con sus parches), me encantaría saber si alguien conoce otras soluciones o sabe que problemas tienen en la práctica las que yo he puesto.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codigomanso.com/es/2009/01/update-order-of-a-row-keeping-the-rest-untouched/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>La función empty de PHP está mal</title>
		<link>http://www.codigomanso.com/es/2009/01/la-funcion-empty-de-php-esta-mal/</link>
		<comments>http://www.codigomanso.com/es/2009/01/la-funcion-empty-de-php-esta-mal/#comments</comments>
		<pubDate>Wed, 14 Jan 2009 16:45:01 +0000</pubDate>
		<dc:creator>Pau Sanchez</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programacion]]></category>

		<guid isPermaLink="false">http://www.codigomanso.com/es/?p=440</guid>
		<description><![CDATA[Cuando te pasas 20 minutos depurando código (por cierto, que gran herramienta los debuggers), y descubres que el bug que se manifiesta en A no viene ni de A, ni de B, ni de C, si no de mucho más lejos, más tirando a Z, te das cuenta, como otras tantas veces, la de efectos [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Cuando te pasas 20 minutos depurando código (por cierto, que gran herramienta los debuggers), y descubres que el bug que se manifiesta en A no viene ni de A, ni de B, ni de C, si no de mucho más lejos, más tirando a Z, te das cuenta, como otras tantas veces, la de efectos colaterales que puede tener un &#8220;bug&#8221; en un sitio remoto.</p>
<p style="text-align: justify;">El caso es que después de 20 minutos he descubierto un bug en una web en PHP que estoy haciendo, y cuando me he dado cuenta de que era un problema de concepto de lo que se supone que hace la función &#8220;<strong>empty</strong>&#8221; y lo que realmente hace (tal y como dice en la especificación), pues me he dicho, ui, va a ser que es un bug, pero la implementación de <strong>empty</strong> no debería ser la que es. No es que quiera llevar la razón en todo, y pensar que los bugs no son culpa mía, obviamente lo son, incluso este, pero hay que tener en cuenta que cuando reconozco que un bug es mi culpa no hago un post sobre ello.</p>
<p style="text-align: justify;">A ver, el caso es el siguiente, en un sitio remoto tenía un condicional, en plan si empty ($str) haz X, y si no es empty, pues haz Y. Fácil.</p>
<p>El problema conceptual viene en que según el manual de PHP: <strong>empty(&#8220;0&#8243;) es true!! </strong></p>
<p style="text-align: center;"><strong> Por el amor de Dios! ¿en que estaría pensando el programador que hizo eso?</strong></p>
<p>No lo digo por decir, lo digo porque no es muy consecuente con <a href="http://uk3.php.net/manual/en/function.empty.php" target="_blank">la definición del propio manual</a>:</p>
<p class="refpurpose" style="padding-left: 30px;"><span class="refname">empty</span> — <span class="dc-title">Determine whether a variable is empty</span></p>
<p class="para" style="padding-left: 30px;">The following things are considered to be empty:</p>
<blockquote>
<ul class="simplelist" style="padding-left: 30px;">
<li class="member"><em>&#8220;&#8221; (an empty string)</em></li>
<li class="member"><em>0 (0 as an integer)</em></li>
<li class="member"><strong><em>&#8220;0&#8243; (0 as a string)</em></strong></li>
<li class="member"><tt>NULL</tt></li>
<li class="member"><tt>FALSE</tt></li>
<li class="member"><em>array() (an empty array)</em></li>
<li class="member"><em>var $var; (a variable declared, but without a value in a class)</em></li>
</ul>
</blockquote>
<p class="refpurpose" style="text-align: justify;"><span class="dc-title">Entiendo entonces, que una variable <strong>NULL</strong> se considere como vacía, que un <strong>array()</strong> se considere como vacio, que la cadena <strong>&#8221;</strong> se considere como vacía, que el valor FALSE se considere como vacío. Incluso entiendo que el número <strong>0</strong> se considere como vacío. Hasta aquí tiene sentido, <strong>tiene sentido que cada tipo de datos</strong> (booleano, cadena, array, referencia) <strong>tenga un único valor que se considere como vacío</strong>.</span></p>
<p class="refpurpose" style="text-align: justify;"><span class="dc-title">Lo que no entiendo es porqué las cadenas tienen dos valores que se consideran vacías,<em> una cadena vacía es<strong> &#8221;</strong> y ya está</em>.<br />
</span></p>
<p class="refpurpose" style="text-align: justify;"><span class="dc-title">Imagino que la explicación de por qué &#8220;0&#8243; es considerado como vacío viene a ser porque en PHP puedes hacer 322 + &#8220;17&#8243; e internamente transforma la cadena &#8220;17&#8243; en el número 17 y hace la suma numérica. Siguiendo esta premisa, cuando empty recive &#8220;0&#8243; a priori no se puede diferenciar si el programador está pasando una cadena porque quiere o el programador pretendía pasar el número 0 pero se le ha olvidado hacer un cast a int.</span></p>
<p class="refpurpose" style="text-align: justify;"><span class="dc-title"><strong>Conclusión: </strong>la función <strong>empty</strong> debería devolver false con &#8216;0&#8242;, pues asumir que el programador puede estar queriendo pasar 0 en vez de &#8220;0&#8243; es imponer una restricción al programador, se le debería dejar que hiciera un cast si es que es un número lo que está evaluando con el empty, al no hacerlo <em>lo que se consigue es que paguen justos por pecadores&#8230; argh!!!!</em><br />
</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.codigomanso.com/es/2009/01/la-funcion-empty-de-php-esta-mal/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Extensión jQuery para serializar formularios</title>
		<link>http://www.codigomanso.com/es/2008/12/extension-jquery-para-serializar-formularios/</link>
		<comments>http://www.codigomanso.com/es/2008/12/extension-jquery-para-serializar-formularios/#comments</comments>
		<pubDate>Thu, 11 Dec 2008 09:42:44 +0000</pubDate>
		<dc:creator>Pau Sanchez</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[checkbox]]></category>
		<category><![CDATA[form]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[send]]></category>
		<category><![CDATA[serialize]]></category>
		<category><![CDATA[unchecked]]></category>

		<guid isPermaLink="false">http://www.codigomanso.com/?p=257</guid>
		<description><![CDATA[jQuery ya dispone de un método llamado serialize, que básicamente transforma un formulario en una cadena típica de un POST o un GET, bastante útil para enviar un formulario con una petición al más puro estilo AJAX tal cual lo hace el navegador.
El problema es que a mi no me gusta lo que hace el [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">jQuery ya dispone de un método llamado <strong>serialize</strong>, que básicamente transforma un formulario en una cadena típica de un POST o un GET, bastante útil para enviar un formulario con una petición al más puro estilo AJAX tal cual lo hace el navegador.</p>
<p style="text-align: justify;">El problema es que a mi no me gusta lo que hace el navegador con los &#8220;checkboxes&#8221;.</p>
<p style="text-align: justify;">Como cualquier otro input, los checkboxes tienen un valor asociado (por defecto &#8220;on&#8221;, aunque no estoy seguro de si esto varía según el navegador). Lo que uno esperaría de value, es que sea &#8220;on&#8221; si está checked y &#8220;off&#8221; si está unchecked. Pero no señores, no se confundan, siempre es &#8220;on&#8221;, igual que si le dices que value=&#8221;pepito&#8221;, value siempre será &#8220;pepito&#8221; independientemente de si el checkbox está checkeado o no.</p>
<p style="text-align: justify;">Entonces (se preguntará el lector avispado que aún no haya tenido el placer de programar en HTML), ¿como sabe el servidor si el checkbox está checked o unchecked? Elemental mi querido Watson. El navegador sólo envia esa información si está checked y no la envia si está unchecked. ¿Que putada, no? Porque hay veces que parece que esto rompe algunos flujos típicos con otros datos.</p>
<p style="text-align: justify;">No es que este comportamiento de los navegadores sea muy problematico, pero a veces a uno le interesa que funcione de otra manera.</p>
<p style="text-align: justify;">Sea como fuere, aquí pongo una extensión para jQuery, que básicamente lo que hace es lo mismo que &#8220;serialize&#8221; pero pone siempre los checkboxes, de tal forma que pone &#8220;<strong>nombre=1</strong>&#8221; cuando el checkbox está activado, y &#8220;<strong>nombre=0</strong>&#8221; cuando no está activado.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">jQuery.<span style="color: #660066;">fn</span>.<span style="color: #660066;">jserialize</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #003366; font-weight: bold;">var</span> serialized <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">serialize</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  $<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">find</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">':checkbox'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">each</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #003366; font-weight: bold;">var</span> tofind    <span style="color: #339933;">=</span> $<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">attr</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'name'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">&quot;=&quot;</span> <span style="color: #339933;">+</span> $<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">val</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #003366; font-weight: bold;">var</span> toreplace <span style="color: #339933;">=</span> $<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">attr</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'name'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">&quot;=&quot;</span> <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">checked</span> <span style="color: #339933;">?</span> <span style="color: #3366CC;">'1'</span> <span style="color: #339933;">:</span> <span style="color: #3366CC;">'0'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">checked</span><span style="color: #009900;">&#41;</span>   <span style="color: #009900;">&#123;</span> serialized <span style="color: #339933;">=</span> serialized.<span style="color: #660066;">replace</span> <span style="color: #009900;">&#40;</span>tofind<span style="color: #339933;">,</span> toreplace<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span>
    <span style="color: #000066; font-weight: bold;">else</span>                <span style="color: #009900;">&#123;</span> serialized <span style="color: #339933;">+=</span> <span style="color: #3366CC;">&quot;&amp;amp;&quot;</span> <span style="color: #339933;">+</span> toreplace<span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #000066; font-weight: bold;">return</span> serialized<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p><strong>Enlaces de interés:</strong></p>
<ul>
<li><a href="http://www.codigomanso.com/2008/12/resetear-un-formulario-con-jquery/" target="_blank">Resetear un formulario con jQuery</a></li>
<li><a href="http://groups.google.com/group/jquery-en/browse_thread/thread/a73638a11636299d/ed6a56666cc8347a?#ed6a56666cc8347a" target="_blank">Pregunta de Badtant sobre porque serialize no envia los unchecked checkboxes</a></li>
<li><a href="http://www.jquery.com" target="_blank">Página oficial de jQuery</a></li>
<li><a href="http://docs.jquery.com/Ajax/serialize" target="_blank">Método jQuery.serialize</a></li>
<li><a href="http://docs.jquery.com/Ajax/serializeArray" target="_blank">Método jQuery.serializeArray</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.codigomanso.com/es/2008/12/extension-jquery-para-serializar-formularios/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
	</channel>
</rss>

