<?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>Quenerapú &#187; PHP</title>
	<atom:link href="http://quenerapu.com/categorias/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://quenerapu.com</link>
	<description>Sentado delante de un ordenador desde 1982. ¿De qué voy a hablar, si no?</description>
	<lastBuildDate>Thu, 19 Jan 2012 13:02:00 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Construir formularios (casi) automáticamente con PHP</title>
		<link>http://quenerapu.com/php/construir-formularios-casi-automaticamente-con-php/</link>
		<comments>http://quenerapu.com/php/construir-formularios-casi-automaticamente-con-php/#comments</comments>
		<pubDate>Mon, 26 Oct 2009 09:49:22 +0000</pubDate>
		<dc:creator>Quenerapú</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[arrays]]></category>
		<category><![CDATA[función]]></category>
		<category><![CDATA[input]]></category>
		<category><![CDATA[label]]></category>
		<category><![CDATA[select]]></category>
		<category><![CDATA[textarea]]></category>

		<guid isPermaLink="false">http://quenerapu.com/?p=129</guid>
		<description><![CDATA[Una función sencilla (y fácilmente escalable) para construir formularios html con php, basándose en simples arrays.]]></description>
			<content:encoded><![CDATA[<p>Construir formularios <strong>html</strong> es una tarea bastante monótona y en la que es fácil cometer algún error tonto y puñetero así que tenía que haber una forma de hacerlos automáticamente (o casi).</p>
<p>Como tengo la costumbre de convertir en <strong>arrays</strong> todo lo que saco de las bases de datos antes de combinarlo con el <strong>html</strong>, una buena parte del camino ya la tenía hecha.</p>
<p>El método que voy a proponer a continuación no es nada del otro mundo y sólo pretende ser un punto de partida para que cada cual lo adapte y complique a su gusto.</p>
<p>Cuando me di cuenta de que un array como este:</p>
<pre class="brush: php; title: ; notranslate">
$a = array(
	type=&gt;&quot;text&quot;,
	name=&gt;&quot;nombre&quot;,
	value=&gt;&quot;Pepe&quot;,
	)
</pre>
<p>era fácilmente convertible, vía <strong>php</strong>, en un <strong>html</strong> como este:</p>
<pre class="brush: php; title: ; notranslate">
&lt;input
	type=&quot;&lt;?=$a[type];?&gt;&quot;
	name=&quot;&lt;?=$a[name];?&gt;&quot;
	value=&quot;&lt;?=$a[value];?&gt;&quot;
/&gt;
</pre>
<p>Decidí hacer una función que resolviera la construcción de cualquier formulario simplemente recibiendo los datos necesarios en forma de arrays.</p>
<p>Antes de nada traté de agrupar más o menos los diferentes elementos que componen un formulario: Los <strong>&lt;input&gt;</strong> tipo text, password y hidden tienen una sintaxis muy parecida. A <strong>&lt;textarea&gt;</strong> hay que darle de comer aparte y lo mismo con los <strong>&lt;select&gt;</strong>. Los <strong>&lt;input&gt;</strong> tipo radio y checkbox se portan de una manera muy similar, y luego quedan los <strong>&lt;input&gt;</strong> tipo submit.</p>
<p>En el ejemplo de este artículo presento la <strong>función f</strong>, que resuelve los <strong>&lt;input&gt;</strong> tipo text, password, hidden y submit, los <strong>&lt;textarea&gt;</strong> y los <strong>&lt;select&gt;</strong> y los botones de submit. El resto lo dejo para una pŕoxima ocasión.</p>
<p>El ejemplo resuelve de paso los <strong>&lt;label&gt;</strong> y permite aplicar <strong>class</strong> o <strong>style</strong> particulares a cada elemento. Por cierto: Tengo la costumbre en los formularios de utilizar siempre el mismo valor en <strong>name</strong> y en <strong>id</strong>. No sé si eso es bueno o malo (al menos el validador del W3C no protesta), pero si a alguien no le gusta eso no tiene más que crear una nueva variable para uno de ellos.</p>
<p>Ah! La parte en la que se construye el menú desplegable tipo <strong>&lt;select&gt;</strong> es la que ya presenté en el artículo <a href="http://quenerapu.com/php/construir-un-menu-select/">Construir un menú Select con PHP</a> publicado el 25|09|2009.</p>
<p>Bueno, probadlo y a ver qué os parece. <a href="http://quenerapu.com/ejemplos/f.php">En este link he colgado una demo con CSS y todo</a>.</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
$colores = array( // Array de valores para el select
		1=&gt;Azul,
		2=&gt;Negro,
		3=&gt;Naranja,
		4=&gt;Violeta,
		5=&gt;Granate,
		);

$qq=array(
	f=&gt;array( // Datos generales del formulario
		fN=&gt;&quot;loginForm&quot;, // name
		fM=&gt;&quot;post&quot;, // method
		fA=&gt;&quot;form.php&quot;, // action
		fB=&gt;&quot;Enviar&quot;, // texto del botón submit
		),
	ff=&gt;array(
			array( // Datos del input id
				fN=&gt;&quot;id&quot;,
				fV=&gt;123,
				fT=&gt;&quot;hidden&quot;, // Tipo hidden
				),
			array( // Datos del input nombre
				fN=&gt;&quot;nombre&quot;, // Variable
				fV=&gt;&quot;Perico&quot;, // Valor
				fL=&gt;&quot;Nombre&quot;, // Texto para el label
				fT=&gt;&quot;text&quot;, // Tipo text
				fC=&gt;&quot;special&quot;, // Class CSS (dato opcional)
				fS=&gt;&quot;width:100px;&quot;, // Style CSS (dato opcional)
				),
			array( // Datos del input apellidos
				fN=&gt;&quot;apellidos&quot;,
				fV=&gt;&quot;Los Palotes&quot;,
				fL=&gt;&quot;Apellidos&quot;,
				fT=&gt;&quot;text&quot;,
				fC=&gt;&quot;readonly&quot;, // Class CSS (dato opcional)
				fS=&gt;&quot;width:200px;&quot;,
				rO=&gt;true, // queremos que sea 'readonly'
				),
			array( // Datos del input contrasena
				fN=&gt;&quot;contrasena&quot;,
				fV=&gt;&quot;123456&quot;,
				fL=&gt;&quot;Contraseña&quot;,
				fT=&gt;&quot;password&quot;, // Tipo password
				),
			array( // Datos del textarea direccion
				fN=&gt;&quot;direccion&quot;,
				fV=&gt;&quot;Calle de Los Desamparados s/n&quot;,
				fL=&gt;&quot;Dirección&quot;,
				fT=&gt;&quot;textarea&quot;, // Tipo textarea
				fC=&gt;&quot;login&quot;,
				fW=&gt;&quot;10|3&quot;, // Width | Height
				fS=&gt;&quot;width:200px;height:100px;&quot;,
				),
			array( // Datos del select desplegable color
				fN=&gt;&quot;color&quot;,
				fV=&gt;3, // Valor (numérico en este caso)
				fL=&gt;&quot;Color favorito&quot;,
				fT=&gt;&quot;select&quot;, // Tipo select (desplegable)
				fC=&gt;&quot;login&quot;,
				fZ=&gt;$colores, // Array de valores
				),
		),
	);

function f($x)
	{
	extract($x);
	$r=&quot;&lt;form name=\&quot;{$f[fN]}\&quot; id=\&quot;{$f[fN]}\&quot; method=\&quot;{$f[fM]}\&quot; action=\&quot;{$f[fA]}\&quot;&gt;\n&quot;;
	for($i=0;$i&lt;count($ff);++$i)
		{
		if(in_array($ff[$i][fT],array(&quot;text&quot;,&quot;password&quot;,&quot;hidden&quot;,))){$r.=&quot;\t&quot;.($ff[$i][fT]!=&quot;hidden&quot;?&quot;&lt;label for=\&quot;{$ff[$i][fN]}\&quot;&gt;{$ff[$i][fL]}&lt;/label&gt;&quot;:&quot;&quot;).&quot;&lt;input type=\&quot;{$ff[$i][fT]}\&quot; name=\&quot;{$ff[$i][fN]}\&quot; id=\&quot;{$ff[$i][fN]}\&quot; value=\&quot;{$ff[$i][fV]}\&quot;&quot;.($ff[$i][fT]!=&quot;hidden&quot;?($ff[$i][fC]?&quot; class=\&quot;{$ff[$i][fC]}\&quot;&quot;:&quot;&quot;).($ff[$i][fS]?&quot; style=\&quot;{$ff[$i][fS]}\&quot;&quot;:&quot;&quot;):&quot;&quot;).($ff[$i][rO]?&quot; readonly=\&quot;readonly\&quot;&quot;:&quot;&quot;).&quot; /&gt;&quot;.($ff[$i][fT]!=&quot;hidden&quot;?&quot;&lt;br /&gt;&quot;:&quot;&quot;).&quot;\n&quot;;}
		if(in_array($ff[$i][fT],array(&quot;textarea&quot;,))){$r.=&quot;\t&lt;label for=\&quot;{$ff[$i][fN]}\&quot;&gt;{$ff[$i][fL]}&lt;/label&gt;&lt;textarea name=\&quot;{$ff[$i][fN]}\&quot; id=\&quot;{$ff[$i][fN]}\&quot;&quot;;$w=explode('|',$ff[$i][fW]);$r.=&quot; cols=\&quot;{$w[0]}\&quot; rows=\&quot;{$w[1]}\&quot;&quot;.($ff[$i][fC]?&quot; class=\&quot;{$ff[$i][fC]}\&quot;&quot;:&quot;&quot;).($ff[$i][fS]?&quot; style=\&quot;{$ff[$i][fS]}\&quot;&quot;:&quot;&quot;).&quot;&gt;{$ff[$i][fV]}&lt;/textarea&gt;&lt;br /&gt;\n&quot;;}
		if(in_array($ff[$i][fT],array(&quot;select&quot;,))){$r.=&quot;\t&lt;label for=\&quot;{$ff[$i][fN]}\&quot;&gt;{$ff[$i][fL]}&lt;/label&gt;&lt;select name=\&quot;{$ff[$i][fN]}\&quot; id=\&quot;{$ff[$i][fN]}\&quot;&gt;&quot;;foreach($ff[$i][fZ] as $x=&gt;$v){$r.=&quot;&lt;option value=\&quot;$i\&quot;&quot;;$r.=$ff[$i][fV]==$x?&quot; selected=\&quot;selected\&quot;&quot;:&quot;&quot;;$r.=&quot;&gt;&quot;.$v.&quot;&lt;/option&gt;&quot;;}$r.=&quot;&lt;/select&gt;&lt;br /&gt;\n&quot;;}
		}
	$r.=&quot;&lt;input type=\&quot;submit\&quot; value=\&quot;{$f[fB]}\&quot; /&gt;&quot;;
	$r.=&quot;&lt;/form&gt;&quot;;
	return $r;
	}

echo f($qq);
?&gt;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://quenerapu.com/php/construir-formularios-casi-automaticamente-con-php/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Construir un menú Select con PHP</title>
		<link>http://quenerapu.com/php/construir-un-menu-select/</link>
		<comments>http://quenerapu.com/php/construir-un-menu-select/#comments</comments>
		<pubDate>Fri, 25 Sep 2009 01:42:44 +0000</pubDate>
		<dc:creator>Quenerapú</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[arrays]]></category>
		<category><![CDATA[función]]></category>
		<category><![CDATA[select]]></category>

		<guid isPermaLink="false">http://quenerapu.com/?p=123</guid>
		<description><![CDATA[Función PHP que permite construir dinámicamente un menú desplegable tipo select partiendo de un array.]]></description>
			<content:encoded><![CDATA[<p>Esta sencilla función PHP permite construir dinámicamente un menú desplegable tipo select, partiendo de un array con los datos del desplegable.</p>
<p>la función permite que uno de los elementos del desplegable ya esté seleccionado previamente.</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
$dias = array(
		1=&gt;Lunes,
		2=&gt;Martes,
		3=&gt;Miércoles,
		4=&gt;Jueves,
		5=&gt;Viernes,
		6=&gt;Sábado,
		7=&gt;Domingo
		);

function doSelect($n,$d,$s=null)
	{
	$doSelect = &quot;&lt;select name=\&quot;$n\&quot;&gt;\n&quot;;
	foreach($d as $i=&gt;$v)
		{
		$doSelect.=&quot;\t&lt;option value=\&quot;$i\&quot;&quot;;
		$doSelect.=$s==$i?&quot; selected&quot;:&quot;&quot;;
		$doSelect.=&quot;&gt;&quot;.$v.&quot;&lt;/option&gt;\n&quot;;
		}
	$doSelect.=&quot;&lt;/select&gt;&quot;;
	return $doSelect;
	}

// El miércoles, pre-seleccionado
echo doSelect(&quot;dias&quot;,$dias,3);
?&gt;
</pre>
<p>La función devuelve el siguiente html:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;select name=&quot;dias&quot;&gt;
	&lt;option value=&quot;1&quot;&gt;Lunes&lt;/option&gt;
	&lt;option value=&quot;2&quot;&gt;Martes&lt;/option&gt;
	&lt;option value=&quot;3&quot; selected&gt;Miércoles&lt;/option&gt;
	&lt;option value=&quot;4&quot;&gt;Jueves&lt;/option&gt;
	&lt;option value=&quot;5&quot;&gt;Viernes&lt;/option&gt;
	&lt;option value=&quot;6&quot;&gt;Sábado&lt;/option&gt;
	&lt;option value=&quot;7&quot;&gt;Domingo&lt;/option&gt;
&lt;/select&gt;
</pre>
<p>Si no quisiéramos ningún elemento pre-seleccionado en el desplegable, sólo tenemos que omitir el tercer parámetro de la función.</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
// Ningún día pre-seleccionado
echo doSelect(&quot;dias&quot;,$dias);
?&gt;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://quenerapu.com/php/construir-un-menu-select/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Constantes dentro de una cadena de texto</title>
		<link>http://quenerapu.com/php/constantes-dentro-de-una-cadena-de-texto/</link>
		<comments>http://quenerapu.com/php/constantes-dentro-de-una-cadena-de-texto/#comments</comments>
		<pubDate>Tue, 23 Jun 2009 14:13:31 +0000</pubDate>
		<dc:creator>Quenerapú</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[clase]]></category>
		<category><![CDATA[constantes]]></category>

		<guid isPermaLink="false">http://quenerapu.com/?p=117</guid>
		<description><![CDATA[Del mismo modo que puedo utilizar variables dentro de una cadena de texto, he buscado la manera de hacer lo mismo con las constantes.]]></description>
			<content:encoded><![CDATA[<p>Buscaba hoy la manera de resolver esto:</p>
<p>Del mismo modo que puedo utilizar variables <strong>dentro</strong> de una cadena de texto:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
	$nombre = &quot;Manolo&quot;;
	$alias = &quot;El del bombo&quot;;
	echo &quot;Me llamo $nombre ($alias)&quot;;

//	Bien: Devuelve 'Me llamo Manolo (El del bombo)'
?&gt;
</pre>
<p>Hasta donde yo sé, no es posible hacer nada parecido con las constantes:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
	define(&quot;NOMBRE&quot;, &quot;Manolo&quot;);
	define(&quot;ALIAS&quot;, &quot;El del bombo&quot;);
	echo &quot;Me llamo NOMBRE (ALIAS)&quot;;

//	Mal: Devuelve 'Me llamo NOMBRE (ALIAS)'
?&gt;
</pre>
<p>El único modo posible sería este:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
	echo &quot;Me llamo &quot;.NOMBRE .&quot;(&quot;.ALIAS.&quot;)&quot;;

//	Bien: Devuelve 'Me llamo Manolo (El del bombo)'
?&gt;
</pre>
<p>Pero a mi siempre me resultó bastante incómoda esta sintaxis:</p>
<p><strong>&#8221;texto &#8221;.$variable_o_CONSTANTE.&#8221; siguiente texto&#8221;</strong></p>
<p>Así que hoy decidí apartar un poco de tiempo para buscar un modo de incluir constantes <strong>dentro</strong> de una cadena de texto con misma libertad que tengo cuando uso variables. Y creo que lo encontré <img src='http://quenerapu.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Para empezar, <strong>define()</strong> no es la única manera de definir una constante. En <a href="http://php.net/manual/en/function.constant.php">php.net</a> he visto que las constantes se pueden definir dentro de clases, y que lo hacen con una sintaxis un poco diferente:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
	class constantes
	{
	const NOMBRE = &quot;Manolo&quot;;
	const ALIAS = &quot;El del bombo&quot;;
	}
?&gt;
</pre>
<p>Y a estas constantes puedes llamarlas así:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php echo constantes::NOMBRE; ?&gt;
</pre>
<p>Hasta ahí, estupendo, pero el problema viene cuando quiero llamar a la constante desde una instancia:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
	$c = new constantes();
	echo &quot;Me llamo $c::NOMBRE ($c::ALIAS)&quot;;

//	Mal: Devuelve 'Me llamo ()'
?&gt;
</pre>
<p>Tirando de Google, encontré en <a href="http://www.cristalab.com/">cristalab.com</a> una solución que me ha parecido elegante. Ellos publicaron en marzo de 2007 el artículo <strong><a href="http://www.cristalab.com/tips/como-usar-y-acceder-a-constantes-en-clases-de-php-c35762l/">Cómo usar y acceder a constantes en clases de PHP</a></strong> y en él proponían añadir una función privada que permitiera llamar a cualquiera de esas constantes. La cosa queda así</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
	class constantes
	{
	const NOMBRE = &quot;Manolo&quot;;
	const ALIAS = &quot;El del bombo&quot;;

	private function __get($name)
		{
		if(defined(&quot;self::$name&quot;))
			{
			return constant(&quot;self::$name&quot;);
			}
		trigger_error(&quot;$name isn't defined&quot;);
		}
	}
?&gt;
</pre>
<p>De modo que ahora ya puedo hacer esto:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
	$c = new constantes();
	echo &quot;Me llamo $c-&gt;NOMBRE ($c-&gt;ALIAS)&quot;;

//	Bien: Devuelve 'Me llamo Manolo (El del bombo)'
?&gt;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://quenerapu.com/php/constantes-dentro-de-una-cadena-de-texto/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Me encanta SELECT FOUND_ROWS()</title>
		<link>http://quenerapu.com/mysql/me-encanta-select-found_rows/</link>
		<comments>http://quenerapu.com/mysql/me-encanta-select-found_rows/#comments</comments>
		<pubDate>Mon, 22 Jun 2009 10:51:17 +0000</pubDate>
		<dc:creator>Quenerapú</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[found_rows()]]></category>
		<category><![CDATA[select]]></category>
		<category><![CDATA[sql_calc_found_rows]]></category>

		<guid isPermaLink="false">http://quenerapu.com/?p=116</guid>
		<description><![CDATA[La mejor forma de obtener el total de registros resultado de un SELECT sin tener que hacer un SELECT COUNT() previo.]]></description>
			<content:encoded><![CDATA[<p>Muchas veces necesito paginar el resultado de una consulta mySQL.</p>
<pre class="brush: sql; title: ; notranslate">
SELECT * FROM tapas WHERE meGusta=true
</pre>
<p>Esto daría más de 200 resultados (soy un goloso)</p>
<p>Tengo una función para paginar (ya escribiré sobre ella más adelante) pero hoy quiero rendir homenaje a la imprescindible función de mySQL <strong>SELECT FOUND_ROWS()</strong>.</p>
<p>Supongamos que quiero paginar un listado de más de 200 resultados. Ya tengo claro que quiero mostrar 25 registros por página así que añado a la consulta SELECT la cláusula LIMIT</p>
<pre class="brush: sql; title: ; notranslate">
SELECT * FROM tapas WHERE meGusta=true ORDER BY importancia LIMIT 0,25
</pre>
<p>Y así, vale, listo los 25 primeros y luego con</p>
<pre class="brush: sql; title: ; notranslate">
SELECT * FROM tapas WHERE meGusta=true ORDER BY importancia LIMIT 25,25
</pre>
<p>listo los 25 siguientes y así consecutivamente, pero: ¡quiero paginarlo! Quiero saber de antemano cuántos van a ser en total y poder calcular así cuántas páginas necesitaré.</p>
<p>A priori parece inevitable hacer antes de nada una consulta con SELECT COUNT para hacer el recuento y luego la consulta SELECT &#8216;oficial&#8217;, pero advierto: *este no es el camino*.</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
// Primer SELECT sólo para contar el total
$q = mysql_query(&quot;SELECT COUNT(*) AS rt FROM tapas WHERE meGusta=true&quot;);
$r = mysql_fetch_array($q);
$rp = 25; // Resultados por página
$rt = $r[rt]; // Total de registros
$tp = $rt/$rp; // Total de páginas

// Segundo SELECT para generar el listado
$p = isset($_GET['p'] &amp;&amp; $_GET['p']&lt;=$tp)?$_GET['p']:0; // A qué página vamos
$q = mysql_query(&quot;SELECT * FROM tapas WHERE meGusta=true ORDER BY importancia LIMIT &quot;.$p*$rp.&quot;,&quot;.$rp);
while($r=mysql_fetch_array($q))
	{
//	bla, bla, bla...
	}
?&gt;
</pre>
<p><strong>Pero NO. No debemos hacerlo así</strong>. Estaríamos consumiendo recursos inútilmente. Para esto tenemos el dúo <strong>SELECT SQL_CALC_FOUND_ROWS</strong> y <strong>SELECT FOUND_ROWS()</strong></p>
<p>Este SÍ es el camino</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
// Todo con un único SELECT
$rp = 25; // Resultados por página
$p = (isset($_GET['p']) &amp;&amp; $_GET['p']&lt;=$tp)?$_GET['p']:0; // A qué página vamos
$q = mysql_query(&quot;SELECT SQL_CALC_FOUND_ROWS * FROM tapas WHERE meGusta=true ORDER BY importancia LIMIT &quot;.$p*$rp.&quot;,&quot;.$rp);
$rt = mysql_fetch_row(mysql_query(&quot;SELECT FOUND_ROWS()&quot;)); // Total de registros
$tp = $rt[0]/$rp; // Total de páginas
echo &quot;&lt;ul&gt;&quot;;
while($r=mysql_fetch_array($q))
	{
	echo &quot;&lt;li&gt;$r[tapa]&lt;/li&gt;;
	}
echo &quot;&lt;/ul&gt;&quot;;
?&gt;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://quenerapu.com/mysql/me-encanta-select-found_rows/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Web multilingüe</title>
		<link>http://quenerapu.com/php/web-multingue/</link>
		<comments>http://quenerapu.com/php/web-multingue/#comments</comments>
		<pubDate>Mon, 09 Mar 2009 16:48:15 +0000</pubDate>
		<dc:creator>Quenerapú</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[arrays]]></category>
		<category><![CDATA[función]]></category>
		<category><![CDATA[i18n]]></category>

		<guid isPermaLink="false">http://quenerapu.local/?p=96</guid>
		<description><![CDATA[Una función PHP pequeña y sencilla (nada del otro mundo, está basada en arrays) que facilita el desarrollo de páginas web multingües.]]></description>
			<content:encoded><![CDATA[<p>Me planteo hacer una web en 3 idiomas: Supongamos español, inglés y alemán.</p>
<p>Todo en esta web es exactamente igual en los tres idiomas salvo naturalmente, los textos. Así que vamos a ser organizados desde el principio y no caeremos en aquello de &#8216;hacer la misma web tres veces&#8217;.</p>
<p>Esta simple función devuelve el texto en el idioma correspondiente para cada palabra o cadena de texto solicitada.</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
function l($t,$i=&quot;es&quot;)
	{
	$l = array();
	$l['enviar'] =	array(
					&quot;es&quot;=&gt;&quot;Enviar&quot;,
					&quot;en&quot;=&gt;&quot;Send&quot;,
					&quot;de&quot;=&gt;&quot;Senden&quot;,
					);
	$l['cancelar'] = array(
					&quot;es&quot;=&gt;&quot;Cancelar&quot;,
					&quot;en&quot;=&gt;&quot;Cancel&quot;,
					&quot;de&quot;=&gt;&quot;Abbrechen&quot;,
					);
	$l['despedida'] = array(
					&quot;es&quot;=&gt;&quot;Hasta luego&quot;,
					&quot;en&quot;=&gt;&quot;See you later&quot;,
					&quot;de&quot;=&gt;&quot;Tschüs&quot;,
					);
	return $l[$t][$i];
	}

$i = &quot;de&quot;; // El idioma elegido.
?&gt;
&lt;p&gt;&lt;?=l(&quot;despedida&quot;,$i);?&gt;&lt;/p&gt;
&lt;input type=&quot;submit&quot; value=&quot;&lt;?=l(&quot;enviar&quot;,$i);?&gt;&quot;&gt;
&lt;input type=&quot;button&quot; value=&quot;&lt;?=l(&quot;cancelar&quot;,$i);?&gt;&quot;&gt;
</pre>
<p>La <strong>función l($t,$i)</strong> es muy fácil de manejar. Sin complicación podemos incorporar palabras o frases nuevas, o añadir un idioma más. Lo de dar en la función un valor predeterminado a <strong>$i</strong> es simplemente para tener un idioma por defecto, mientras el usuario no elige el suyo.</p>
]]></content:encoded>
			<wfw:commentRss>http://quenerapu.com/php/web-multingue/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Hojas de estilo CSS dinámicas</title>
		<link>http://quenerapu.com/css/hojas-de-estilo-css-dinamicas/</link>
		<comments>http://quenerapu.com/css/hojas-de-estilo-css-dinamicas/#comments</comments>
		<pubDate>Fri, 06 Mar 2009 11:52:08 +0000</pubDate>
		<dc:creator>Quenerapú</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[heredoc]]></category>
		<category><![CDATA[switch]]></category>

		<guid isPermaLink="false">http://quenerapu.local/?p=72</guid>
		<description><![CDATA[Del mismo modo que generamos páginas HTML con PHP podemos generar páginas CSS dinámicas. Este artículo explica cómo hacerlo.]]></description>
			<content:encoded><![CDATA[<p>Es posible generar hojas de estilo dinámicas con PHP. El siguiente artículo sólo pretende mostrar la idea, pero naturalmente se puede &#8216;complicar&#8217; todo lo que uno quiera para obtener mejores resultados.</p>
<p>Supongamos que tengo una web en la que utilizo <a href="2009/02/26/el-sistema-de-plantillas-mas-simple-del-mundo-probablemente/">el sistema de plantillas más simple del mundo (probablemente)</a>. Mediante ese sistema podemos generar diferente HTML en cada plantilla, pero ¿cómo aplicaríamos una hoja de estilos propia para cada plantilla?.</p>
<p>Una solución sin complicarnos mucho sería crear diferentes hojas de estilo y llamar a la que corresponda en cada caso. Supongamos que la variable <strong>$tpl</strong> contiene el nombre de la plantilla:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
$tpl = &quot;moderna&quot;;
echo &quot;
&lt;link rel='stylesheet'
type='text/css'
href='&quot;.$tpl.&quot;.css' /&gt;&quot;;
?&gt;
</pre>
<p>Pero a mi no me gusta la idea de tener varios archivos CSS esperando en una carpeta y elegir &#8216;el que toca&#8217; en cada caso. Me recuerda a aquellos tiempos feos (pre-PHP o pre-ASP) en que hacíamos sitios web estáticos, con decenas o incluso cientos de documentos HTML prácticamente iguales. ¿Si ahora creamos HTML dinámicamente, por qué no estamos creando también CSS dinámicamente? Esta es mi propuesta:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
$tpl = &quot;moderna&quot;;
echo &quot;
&lt;link rel='stylesheet'
type='text/css'
href='estilos.php?tpl=$tpl' /&gt;&quot;;
?&gt;
</pre>
<p>LLama la atención que nuestra página de estilos ya no lleva la extensión .css, sino que se trata de un archivo PHP en toda regla. Este es el archivo <strong>estilos.php</strong>:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
header('Content-type:text/css');
switch ($_GET['tpl'])
{
case &quot;clasica&quot; :$f=&quot;'Times New Roman'&quot;;$c=&quot;#0000cc&quot;;break;
case &quot;moderna&quot; :$f=&quot;Verdana&quot;;          $c=&quot;#cc0000&quot;;break;
default        :$f=&quot;Arial&quot;;            $c=&quot;#00cc00&quot;;break;
}
print &lt;&lt;&lt;_CSS
h1{font-family:{$f};color:{$c};}
_CSS;
?&gt;
</pre>
<p>Así, con un simple <strong>switch</strong> ajustamos el valor de las variables <strong>$f</strong> (para font-family) o <strong>$c</strong> (para color) en este sencillo ejemplo, de modo que los estilos para <strong>h1</strong> se construyen dinámicamente en función de la plantilla elegida.</p>
]]></content:encoded>
			<wfw:commentRss>http://quenerapu.com/css/hojas-de-estilo-css-dinamicas/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>El sistema de plantillas más simple del mundo (probablemente)</title>
		<link>http://quenerapu.com/php/el-sistema-de-plantillas-mas-simple-del-mundo-probablemente/</link>
		<comments>http://quenerapu.com/php/el-sistema-de-plantillas-mas-simple-del-mundo-probablemente/#comments</comments>
		<pubDate>Thu, 26 Feb 2009 04:23:11 +0000</pubDate>
		<dc:creator>Quenerapú</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[arrays]]></category>
		<category><![CDATA[función]]></category>
		<category><![CDATA[template]]></category>

		<guid isPermaLink="false">http://quenerapu.local/?p=42</guid>
		<description><![CDATA[Un método muy sencillo de separar forma de contenido, con lo que el diseñador web y el programador podrán trabajar simultáneamente.]]></description>
			<content:encoded><![CDATA[<p>Supongamos que acabo de diseñar en HTML una ficha tipo (voy a hacer algo muy básico, sólo para ilustrar):</p>
<pre class="brush: xml; title: ; notranslate">
&lt;html&gt;
&lt;head&gt;[NOMBRE] [APELLIDO]&lt;/head&gt;
&lt;body&gt;
	&lt;h1&gt;Ficha número    [ID]&lt;/h1&gt;
	&lt;p&gt;&lt;b&gt;Nombre:&lt;/b&gt;   [NOMBRE] [APELLIDO]&lt;/p&gt;
	&lt;p&gt;&lt;b&gt;Edad:&lt;/b&gt;     [EDAD] años&lt;/p&gt;
	&lt;p&gt;&lt;b&gt;Teléfono:&lt;/b&gt; [TELÉFONO]&lt;/p&gt;
	&lt;p&gt;&lt;b&gt;eMail:&lt;/b&gt;    &lt;a href=&quot;mailto:[EMAIL]&quot;&gt;[EMAIL]&lt;/a&gt;&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Y ahora convierto las variables a sintaxis PHP básica, manteniendo el HTML intacto:</p>
<pre class="brush: php; title: ; notranslate">
&lt;html&gt;
&lt;head&gt;&lt;?=$nombre.' '.$apellido;?&gt;&lt;/head&gt;
&lt;body&gt;
	&lt;h1&gt;Ficha número    &lt;?=$id;?&gt;&lt;/h1&gt;
	&lt;p&gt;&lt;b&gt;Nombre:&lt;/b&gt;   &lt;?=$nombre.' '.$apellido;?&gt;&lt;/p&gt;
	&lt;p&gt;&lt;b&gt;Edad:&lt;/b&gt;     &lt;?=$edad;?&gt; años&lt;/p&gt;
	&lt;p&gt;&lt;b&gt;Teléfono:&lt;/b&gt; &lt;?=$telefono;?&gt;&lt;/p&gt;
	&lt;p&gt;&lt;b&gt;eMail:&lt;/b&gt;    &lt;a href=&quot;mailto:&lt;?=$eMail;?&gt;&quot;&gt;&lt;?=$eMail;?&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>LLamo a esta plantilla «ficha.php» y la guardo en una carpeta «plantillas», por ejemplo. A continuación, en un documento nuevo (que llamaré «index.php», para ser original) declaro la función que sirve para crear contenidos en base a plantillas.</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
function tpl($p,$d=array())
	{
	extract($d);
	ob_start();
	require('plantillas/'.$p.'.php');
	return ob_get_clean();
	}
?&gt;
</pre>
<p>Y ya está: No tengo más que llamar a esa función con la info obtenida de la base de datos cada vez que quiera volcarla en pantalla utilizando esa plantilla.</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
echo tpl('ficha',
			array(
				'id'=&gt;      123,
				'nombre'=&gt;  'Juan',
				'apellido'=&gt;'Gómez',
				'edad'=&gt;    33,
				'telefono'=&gt;'987654321',
				'eMail'=&gt;   'foo@bar.es'
				)
		);
?&gt;
</pre>
<p>Con ese PHP generamos este HTML:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;html&gt;
&lt;head&gt;Juan Gómez&lt;/head&gt;
&lt;body&gt;
	&lt;h1&gt;Ficha número    123&lt;/h1&gt;
	&lt;p&gt;&lt;b&gt;Nombre:&lt;/b&gt;   Juan Gómez&lt;/p&gt;
	&lt;p&gt;&lt;b&gt;Edad:&lt;/b&gt;     33 años&lt;/p&gt;
	&lt;p&gt;&lt;b&gt;Teléfono:&lt;/b&gt; 987654321&lt;/p&gt;
	&lt;p&gt;&lt;b&gt;eMail:&lt;/b&gt;    &lt;a href=&quot;mailto:foo@bar.es&quot;&gt;foo@bar.es&lt;/a&gt;&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>La principal ventaja que presenta este método es que estoy separando en la medida de lo posible la forma del contenido. El documento «ficha.php» es fácilmente editable por un diseñador web sin conocimientos de programación PHP (Tan sólo ha de comprender la sintaxis <strong>&lt;?=$variable;?&gt;</strong>, que no es mucho pedir), mientras que el documento «index.php» sólo contiene programación PHP, sin una sola etiqueta HTML molestando por medio, de modo que el programador se centra exclusivamente en la programación.</p>
]]></content:encoded>
			<wfw:commentRss>http://quenerapu.com/php/el-sistema-de-plantillas-mas-simple-del-mundo-probablemente/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Argumentos por defecto en funciones javaScript</title>
		<link>http://quenerapu.com/javascript/argumentos-por-defecto-en-funciones-javascript/</link>
		<comments>http://quenerapu.com/javascript/argumentos-por-defecto-en-funciones-javascript/#comments</comments>
		<pubDate>Wed, 25 Feb 2009 02:15:13 +0000</pubDate>
		<dc:creator>Quenerapú</dc:creator>
				<category><![CDATA[javaScript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[función]]></category>
		<category><![CDATA[variables]]></category>

		<guid isPermaLink="false">http://quenerapu.local/?p=32</guid>
		<description><![CDATA[En PHP es sencillo declarar parámetros por defecto en las funciones. En javaScript también se puede, aunque de un modo menos directo]]></description>
			<content:encoded><![CDATA[<p>En PHP es posible (y sencillo) declarar parámetros por defecto en las funciones.</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
function qq($a,$b=2)
	{
	return $a+$b;
	}

echo qq(3);		// Devuelve 5
echo qq(3,3);	// Devuelve 6
?&gt;
</pre>
<p>Vemos que si no asignamos un valor a <strong>$b</strong>, la función tiene reservado para <strong>$b</strong> un valor por defecto.</p>
<p>Lamentablemente en javaScript no es posible declarar un argumento por defecto en una función de un modo tan directo. El siguiente ejemplo **<strong>no funciona</strong>**:</p>
<pre class="brush: jscript; title: ; notranslate">
&lt;script type=&quot;text/javascript&quot;&gt;
function qq(a,b=2)	// Esto no va a funcionar
	{
    return a+b;
	}
&lt;/script&gt;
</pre>
<p>¿Cómo podemos conseguirlo? Pues con un poco de ingenio es posible expresar la idea de «argumento por defecto en funciones javaScript» de la siguiente manera:</p>
<pre class="brush: jscript; title: ; notranslate">
&lt;script type=&quot;text/javascript&quot;&gt;
function qq(a,b)
	{
	if(!b){var b=2;} // Si no hay b, b=2
	return a+b;
	}

document.write(qq(3));		// Devuelve 5
document.write(qq(3,3));	// Devuelve 6
&lt;/script&gt;
</pre>
<p>¿Fácil, no?</p>
<p><strong>Actualización</strong><br />
Como muy bien apunta Jonathan en el primer comentario, la función no devuelve el valor correcto si usamos por ejemplo <strong>qq(3,3)</strong>. La razón es <strong>!b</strong> sólo comprueba si b es true o false, y entiende que el valor cero es false. Para subsanarlo, retocamos la línea 4 de la función de este modo:</p>
<pre class="brush: jscript; first-line: 4; title: ; notranslate">
	if(b==null){var b=2;} // Si no hay b, b=2
</pre>
]]></content:encoded>
			<wfw:commentRss>http://quenerapu.com/javascript/argumentos-por-defecto-en-funciones-javascript/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>UTF-8 a minúsculas o mayúsculas</title>
		<link>http://quenerapu.com/php/utf-8-minusculas-mayusculas/</link>
		<comments>http://quenerapu.com/php/utf-8-minusculas-mayusculas/#comments</comments>
		<pubDate>Thu, 19 Feb 2009 05:03:31 +0000</pubDate>
		<dc:creator>Quenerapú</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[función]]></category>
		<category><![CDATA[mayúsculas]]></category>
		<category><![CDATA[minúsculas]]></category>
		<category><![CDATA[utf-8]]></category>

		<guid isPermaLink="false">http://quenerapu.local/?p=15</guid>
		<description><![CDATA[Una pequeña función que convierte una cadena de texto UTF-8 a minúsculas o mayúsculas sin que tildes o eñes se resientan por ello.]]></description>
			<content:encoded><![CDATA[<p>Esta función convierte una cadena de texto en formato UTF-8 a minúsculas o mayúsculas sin que las tildes o las eñes se resientan por ello.</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
function utfChCase($s,$u=false)
	{
	$s=utf8_decode($s);
	$s=$u?strtoupper($s):strtolower($s);
	$s=utf8_encode($s);
	return $s;
	}
?&gt;
</pre>
<p>Así, para hacer minúsculas:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?= utfChCase(&quot;Hola&quot;); ?&gt;
</pre>
<p>Y para hacer mayúsculas:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?= utfChCase(&quot;Hola&quot;,true); ?&gt;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://quenerapu.com/php/utf-8-minusculas-mayusculas/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Segundos a H:i:s</title>
		<link>http://quenerapu.com/php/segundos-a-his/</link>
		<comments>http://quenerapu.com/php/segundos-a-his/#comments</comments>
		<pubDate>Sun, 08 Feb 2009 18:37:25 +0000</pubDate>
		<dc:creator>Quenerapú</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[función]]></category>
		<category><![CDATA[horas]]></category>
		<category><![CDATA[minutos]]></category>
		<category><![CDATA[segundos]]></category>

		<guid isPermaLink="false">http://quenerapu.local/?p=3</guid>
		<description><![CDATA[Sencilla función que convierte un número de segundos a la notación H:i:s (horas:minutos:segundos) con dos dígitos para cada elemento.]]></description>
			<content:encoded><![CDATA[<p>Esta función convierte un número de segundos a la notación H:i:s (horas:minutos:segundos) con dos dígitos para cada elemento.</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
function s2His($s)
	{
	$r=sprintf(&quot;%02d&quot;,intval(intval($s)/3600)).&quot;:&quot;.
	sprintf(&quot;%02d&quot;,bcmod((intval($s)/60),60)).&quot;:&quot;.
	sprintf(&quot;%02d&quot;,bcmod(intval($s),60));
	return $r;
	}
?&gt;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://quenerapu.com/php/segundos-a-his/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

