<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" version="2.0">

<channel>
	<title>¡No Quiero Programar!</title>
	
	<link>http://www.noquieroprogramar.com</link>
	<description>PHP, CodeIgniter y otros frameworks!</description>
	<lastBuildDate>Fri, 26 Aug 2011 09:11:05 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/noquieroprogramar" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="noquieroprogramar" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Migrando de MySQL a Oracle para PHP (problemas!)</title>
		<link>http://www.noquieroprogramar.com/migrando-de-mysql-a-oracle-para-php-problemas/</link>
		<comments>http://www.noquieroprogramar.com/migrando-de-mysql-a-oracle-para-php-problemas/#comments</comments>
		<pubDate>Fri, 26 Aug 2011 09:08:56 +0000</pubDate>
		<dc:creator>Lagarto</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[base de datos]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[problemas]]></category>
		<category><![CDATA[sql]]></category>
		<category><![CDATA[sql developer]]></category>
		<category><![CDATA[string blob]]></category>

		<guid isPermaLink="false">http://www.noquieroprogramar.com/?p=133</guid>
		<description><![CDATA[Bueno, hacía tiempo que no escribía por aquí, la verdad es que me cuesta mantener un ritmo constante, puesto que ahora que tengo un trabajo fijo (bien!?) a veces vuelvo a casa y lo último que me apetece es seguir escribiendo sobre programación, pero que os voy a contar ¿no? En fin, volviendo al tema [...]]]></description>
			<content:encoded><![CDATA[<p><img alt="" src="http://img.feus.org/images/oraclemysq.jpg" title="Oralce y MySQL" class="alignnone" width="431" height="215" /></p>
<p>Bueno, hacía tiempo que no escribía por aquí, la verdad es que me cuesta mantener un ritmo constante, puesto que ahora que tengo un trabajo fijo (bien!?) a veces vuelvo a casa y lo último que me apetece es seguir escribiendo sobre programación, pero que os voy a contar ¿no?</p>
<p>En fin, volviendo al tema importante, hace unos días nos propusieron actualizar una aplicación hecha enteramente en PHP (nativo, sin ningún framework), para que soportase oracle. Bien la cosa no parecía difícil, porque esa aplicación, tenía una librería con las funciones de MySQL, por lo que sería tan fácil como duplicar esa librería y substituir las funciones por las de Oracle. Después de ver lo que había, decidimos usar la OCI8 de PHP (<a title="Documentación para OCI8" href="http://php.net/manual/es/book.oci8.php">documentación</a>).</p>
<p>Bien, este artículo no es para haceros un tutorial sobre como migrar de MySQL a Oracle, pero si que quería comentar algunos de los problemas que nos hemos ido encontrando, tanto a nivel de funciones en PHP como al migrar con SQL de una a la otra. <em>Y ojo! Yo tuve que aprender Oracle a marchas forzadas, por lo que me considero un usuario de este gestor totalmente novato, seguramente los errores expuestos a continuación se pueden solventar de una manera quizá mas compleja y profesional, pero al menos os daré un punto de partida si estáis en los mismos problemas que yo.</em></p>
<p>Para empezar, la migración la hicimos "automaticamente" mediante SQL Developer (<a title="Más información sobre SQL Developer" href="http://www.oracle.com/technetwork/developer-tools/sql-developer/overview/index.html">enlace</a>) y estos fueron algunos de los problemas y consideraciones que nos encontramos:</p>
<p><strong>1)</strong> los campos TEXT de MySQL pasan a ser objetos LOB de Oracle, por lo que a posteriori, será diferente tratarlos, ya que las consultas no nos devolverán una "string", sino que te devuelven un objeto OCILOB (<a href="http://php.net/manual/en/function.oci-lob-load.php">documentación</a>), que para leerlo se tendrá que hacer algo así como:</p>
<pre class="brush: php">
//$cad sería el valor del campo de la base de datos tipo CLOB
$cad = (string)$blob-&gt;read($blob-&gt;size());
</pre>
<p><span id="more-133"></span><br />
<strong>2)</strong> los campos DATE de MySQL pasan a ser TIMESTAMP con la migración automática. Remarcar que en el proceso de migración automática, estos campos fueron definidos como DATE_TIME, pero no servían dado que no guardaban la hora/minuto/segundo. Por ese motivo nos vimos obligados a realizar un script para modificar este campo en toda la base de datos.</p>
<p><strong>3)</strong> en el proceso de migración no se reflejaron los valores por defecto en toda la base de datos, proceso que se ha tenido que hacer manualmente.</p>
<p>&nbsp;</p>
<p>Tambien tuvimos algunas consideraciones y cambios sobres el conjunto de <em>queries</em> para el nuevo entorno Oracle:</p>
<p><strong>1)</strong> no hay una función equivalente a <em>mysql_insert_id</em>, por lo que nosotros lo reemplazamos por una consulta a la id "MAX" para saber la última inserción. Avisaros que esta solución es realmente mala y no contempla la atomicidad de la base de datos (ni la integridad).</p>
<p><strong>2)</strong> para escapar las variables, usamos algo así</p>
<pre class="brush: php">
//function db_escape($str) {return mysql_real_escape_string($str);}
function db_escape($str) {
	// fucntion that simulates mysql_real_escape_string
	if(is_array($str))
        return array_map(__METHOD__, $str);

    if(!empty($str) &amp;&amp; is_string($str)) {
        return str_replace(array(&#039;\\&#039;, &quot;\0&quot;, &quot;\n&quot;, &quot;\r&quot;, &quot;&#039;&quot;, &#039;&quot;&#039;, &quot;\x1a&quot;), array(&#039;\\\\&#039;, &#039;\\0&#039;, &#039;\\n&#039;, &#039;\\r&#039;, &quot;\\&#039;&quot;, &#039;\\&quot;&#039;, &#039;\\Z&#039;), $str);
    }

    return $str;
}
</pre>
<p><strong>3)</strong> Oracle no devuelve un objeto de donde se puede sacar el número total de resultados, esto ha sido resuelto realizando una nueva query con un COUNT(*) de la última query realizada.</p>
<p><strong>4)</strong> Problemas con el DISTINCT: Oracle no soporta un <em>DISTINCT * FROM</em>, si soporta un <em>DISTINCT campo1,campo2,.. FROM</em></p>
<p><strong>5)</strong> Palabras reservadas : Existen una serie de palabras reservadas en Oracle, que al realizar la migración les ha añadido una barra baja detrás, p.ej : start ⇒ start_</p>
<p><strong>6)</strong> Insertar secuencias: En cada inserción de datos en la base de datos se requiere la llamada para obtener el siguiente id / número de la secuencia incremental. P.ej. <em>INSERT INTO TABLA(ID, …) VALUES (TABLA_ID_SEQ.NEXTVAL, …)</em></p>
<p><strong>7)</strong> Tratamiento LOB : tal y como se explica mas arriba, al hacer la migración, automáticamente se convirtieron los campos TEXT en CLOB's, que son unos objetos en oracle, por lo que antes de tratarlos como una simple string habrá que tratarlos con las funciones propias de PL*/<acronym title="Structured Query Language">SQL</acronym> de la clase OCI-Lob <a title="http://php.net/manual/en/function.oci-lob-load.php" href="http://php.net/manual/en/function.oci-lob-load.php" rel="nofollow">Documentación de OCI-Lob</a></p>
<p><strong>8)</strong> Concat : la función <code>CONCAT</code> de Oracle solo soporta dos parámetros, así que se usará esta sintaxis para más parámetros: <em><code>SELECT region_name || ' ' || store_name FROM Geography WHERE store_name = 'Boston';</code></em></p>
<p><strong>9)</strong> Limites: no existe LIMIT en Oracle, pero proporciona una variable en <acronym title="Structured Query Language">SQL</acronym> llamada <code>ROWNUM</code> con la cual se pueden filtrar como el limit con unas comparaciones basicas, ejemplo: <code>ROWNUM ⇐ 1</code> es lo mismo que <code>LIMIT 1</code></p>
<p>&nbsp;</p>
<p>Bueno y eso es todo un poco por encima de los "grandes" problemas que nos hemos encontrado.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/4DJrgwTjhBGStzVWrPLRqZHpM1U/0/da"><img src="http://feedads.g.doubleclick.net/~a/4DJrgwTjhBGStzVWrPLRqZHpM1U/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/4DJrgwTjhBGStzVWrPLRqZHpM1U/1/da"><img src="http://feedads.g.doubleclick.net/~a/4DJrgwTjhBGStzVWrPLRqZHpM1U/1/di" border="0" ismap="true"></img></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.noquieroprogramar.com/migrando-de-mysql-a-oracle-para-php-problemas/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Creando nuestro Foro (Cuarta Parte): Los posts</title>
		<link>http://www.noquieroprogramar.com/creando-nuestro-foro-cuarta-parte-los-posts/</link>
		<comments>http://www.noquieroprogramar.com/creando-nuestro-foro-cuarta-parte-los-posts/#comments</comments>
		<pubDate>Fri, 25 Feb 2011 19:29:16 +0000</pubDate>
		<dc:creator>Lagarto</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Estructura web]]></category>
		<category><![CDATA[Formulario de contacto]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación web]]></category>
		<category><![CDATA[Talleres]]></category>
		<category><![CDATA[XHTML]]></category>
		<category><![CDATA[array]]></category>
		<category><![CDATA[base de datos]]></category>
		<category><![CDATA[formulario]]></category>
		<category><![CDATA[foro]]></category>
		<category><![CDATA[load model]]></category>
		<category><![CDATA[post]]></category>
		<category><![CDATA[sistema de usuarios]]></category>
		<category><![CDATA[taller]]></category>

		<guid isPermaLink="false">http://www.noquieroprogramar.com/?p=127</guid>
		<description><![CDATA[Bueno, ahora la parte mas importante, tenemos que mostrar los posts, la idea es la misma que en los tutoriales anteriores. Primero de todo necesitaremos una "ruta" arriba de todo que nos indique el nombre del tema, así como la categoría de la que deriva, importante para que los usuarios no pierdan la pista de [...]]]></description>
			<content:encoded><![CDATA[<p>Bueno, ahora la parte mas importante, tenemos que mostrar los posts, la idea es la misma que en los tutoriales anteriores. Primero de todo necesitaremos una "ruta" arriba de todo que nos indique el nombre del tema, así como la categoría de la que deriva, importante para que los usuarios no pierdan la pista de dónde están (obviamente serán links para volver atrás).</p>
<p>Pero vayamos por partes, primero de todo nueva función en el controller, que manejara los temas, al igual que lo hacía con las categorías:</p>
<pre class="brush: php">
		function tema($id = 0)
		{
			if((int)$id&lt; =0)
			{
				echo &quot;Error, no existe una tema con esta id.&quot;;
			}
			else
			{
				$this-&gt;load-&gt;model(&quot;foros_model&quot;, &quot;foros&quot;);
				$this-&gt;load-&gt;model(&quot;usuarios_model&quot;, &quot;usuarios&quot;);							

				$vars[&#039;query&#039;] = $this-&gt;foros-&gt;getPosts($id);
				$this-&gt;load-&gt;view(&quot;header&quot;);
				$this-&gt;load-&gt;view(&quot;foros/tema&quot;, $vars);
				$this-&gt;load-&gt;view(&quot;footer&quot;);
			}
		}
</pre>
<p>Ahora pasaremos al view, que tiene bastante chicha:</p>
<pre class="brush: php">
&lt; ?php
	echo &#039;&lt;h2&gt;&lt;a href=&quot;index.php/foros/index&quot;&gt;Foros&lt;/a&gt; &amp;raquo; &lt;a href=&quot;index.php/foros/categoria/&#039;.$this-&gt;foros-&gt;getPostsTemaParam((int)$this-&gt;uri-&gt;segment(3), &quot;cat_id&quot;).&#039;&quot;&gt;&#039;.$this-&gt;foros-&gt;getNombreCategoria($this-&gt;foros-&gt;getPostsTemaParam((int)$this-&gt;uri-&gt;segment(3), &quot;cat_id&quot;)).&#039;&lt;/a&gt;: &quot;&#039;.$this-&gt;foros-&gt;getPostsTemaParam((int)$this-&gt;uri-&gt;segment(3), &quot;titulo&quot;).&#039;&quot;&#039;;

	if($query-&gt;num_rows() &gt; 0)
	{
		foreach($query-&gt;result() as $row)
		{
			echo &#039;&lt;h4&gt;&#039;.$this-&gt;usuarios-&gt;getName($row-&gt;usuario_id).&#039; dice:&lt;/h4&gt;&#039;;
			echo &#039;&lt;p&gt;&#039;.$row-&gt;cuerpo.&#039;&lt;/p&gt;&#039;;
		}
	}
	else
	{
		echo &#039;&lt;p&gt;No hay ninguna tema creado&lt;/p&gt;&#039;;
	}
?&gt;
</pre>
<p>La primera linea, que es muy larga es para lo que os comentaba al principio. Como véis hago uso repetidamente de una función que he creado en el model, que nos dará toda la información que queramos del tema (titulo, id, categoría a la que pertenece).</p>
<p>Como veis la función es muy simple, jugamos con los parámetros que nos pasan y hacemos que la función sea genérica para nuestros propósitos, así la podemos reutilizar sin necesidad de crear una función especifica para cada cosa.</p>
<pre class="brush: php">
		function getPosts($tema_id = 0)
		{
			$this-&gt;db-&gt;where(&quot;tema_id&quot;, $tema_id);
			$this-&gt;db-&gt;order_by(&quot;id&quot;, &quot;ASC&quot;);
			$q = $this-&gt;db-&gt;get(&quot;forum_posts&quot;);
			return $q;
		}

		function getPostsTemaParam($id, $param)
		{
			$this-&gt;db-&gt;where(&quot;id&quot;, $id);
			$this-&gt;db-&gt;select($param);
			$q = $this-&gt;db-&gt;get(&quot;forum_temas&quot;);
			$r = $q-&gt;row_array();
			return $r[$param];
		}
</pre>
<p>Y bueno el trabajo está casi listo, esto ya tiene pinta de foro (cutre y sin estilos, pero eso es lo de menos ahora mismo). Lo que haría falta tanto en temas como en posts es un botón que nos lleve a un formulario para poder crear nuevos temas y nuevos posts. Pero eso es muy sencillo y seguro que todos sabréis hacerlo me imagino, ya que simplemente se trata de insertar información a la base de datos. Esto ya lo hemos visto en un tutorial anterior: <a title="Gestor de Noticias" href="http://www.noquieroprogramar.com/category/talleres/gestor-de-noticias/">Gestor de noticias</a>.</p>
<p>También comentar que para un foro, obviamente necesitáis un sistema de usuarios, así que echadle un vistazo al que ya hicimos hace tiempo: <a title="Sistema de Usuarios" href="http://www.noquieroprogramar.com/category/talleres/sistema-de-usuarios-talleres/">Sistema de Usuarios</a>.</p>
<p>La cosa ha quedado algo así:</p>
<p>----------</p>
<p><img src="http://img.feus.org/images/foro3.jpg" alt="Como quedó el foro" width="366" height="204" /></p>
<p>----------</p>
<p>Cualquier duda que tengáis podéis dejar un comentario o pasaros por el <a title="Nuestro foro" href="http://foro.noquieroprogramar.com/">foro</a>, quizá creéis que debería seguir el tutorial con la parte de añadir comentarios o tenéis alguna sugerencia para algún tema nuevo que os gustaría que hablase.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/KZFcqpQ6-8-RHrbgDUVSqUAqW1A/0/da"><img src="http://feedads.g.doubleclick.net/~a/KZFcqpQ6-8-RHrbgDUVSqUAqW1A/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/KZFcqpQ6-8-RHrbgDUVSqUAqW1A/1/da"><img src="http://feedads.g.doubleclick.net/~a/KZFcqpQ6-8-RHrbgDUVSqUAqW1A/1/di" border="0" ismap="true"></img></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.noquieroprogramar.com/creando-nuestro-foro-cuarta-parte-los-posts/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Creando nuestro Foro (Tercera parte): Los temas</title>
		<link>http://www.noquieroprogramar.com/creando-nuestro-foro-tercera-parte-los-temas/</link>
		<comments>http://www.noquieroprogramar.com/creando-nuestro-foro-tercera-parte-los-temas/#comments</comments>
		<pubDate>Tue, 22 Feb 2011 11:49:57 +0000</pubDate>
		<dc:creator>Lagarto</dc:creator>
				<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Estructura web]]></category>
		<category><![CDATA[Foro]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación web]]></category>
		<category><![CDATA[Talleres]]></category>
		<category><![CDATA[XHTML]]></category>
		<category><![CDATA[base de datos]]></category>
		<category><![CDATA[errores]]></category>
		<category><![CDATA[foro]]></category>
		<category><![CDATA[forum posts]]></category>
		<category><![CDATA[load model]]></category>
		<category><![CDATA[post]]></category>

		<guid isPermaLink="false">http://www.noquieroprogramar.com/?p=125</guid>
		<description><![CDATA[Bueno, ahora ya teníamos el listado de categorías funcionando, así que profundizaremos un nivel mas, los temas. Para que nos entendamos veamos que profundidades tendremos en el foro: Foro &#62; Categorías &#62; Temas &#62; Posts Empezando a programar me di cuenta que harían falta unos retoques en la base de datos, pues necesito una tabla para los [...]]]></description>
			<content:encoded><![CDATA[<p>Bueno, ahora ya teníamos el listado de categorías funcionando, así que profundizaremos un nivel mas, los temas. Para que nos entendamos veamos que profundidades tendremos en el foro:</p>
<p><strong>Foro &gt; Categorías &gt; Temas &gt; Posts</strong></p>
<p>Empezando a programar me di cuenta que harían falta unos retoques en la base de datos, pues necesito una tabla para los "temas" que no había creado. Como el tutorial lo voy haciendo poco a poco a medida que lo hago, también me doy cuenta de errores y cosas que me olvido, y como ya os avisé, la base de datos siempre hay que adaptarla.</p>
<p>Veamos la nueva tabla "forum_temas", de momento tendrá estos campos (y de paso una fila de ejemplo):</p>
<p><img src="http://img.feus.org/images/ejemplotem.jpg" alt="Tabla de los temas" width="382" height="51" /></p>
<p>Como suponéis, <em>cat_id</em> hará referencia a la id de la categoría.</p>
<p>Luego también necesitaremos unos cambios en la tabla "forum_posts", pues añadiendo la anterior hay algunos campos que ya no necesitamos.</p>
<p><img src="http://img.feus.org/images/foroposts.jpg" alt="nueva tabla de posts" width="148" height="139" /></p>
<p>Hemos incorporado el <em>tema_id</em>, sustituyendo a padre, para que quede mas claro hacía donde es la referencia. También hemos quitado el titulo, porque ya lo lleva la tabla anterior.</p>
<p>Ahora ya pasamos a la programación en PHP y CodeIgniter.</p>
<p><span id="more-125"></span>En el controlador <em>foros.php</em>, añadiremos una nueva función:</p>
<pre class="brush: php">
&lt; ?php 

	if (!defined(&#039;BASEPATH&#039;))
		exit(&#039;No direct script access allowed&#039;);

	class Foros extends CI_Controller
	{

		function __construct()
		{
			parent::__construct();
		}

		function index()
		{
			$this-&gt;load-&gt;model(&quot;foros_model&quot;, &quot;foros&quot;);

			$vars[&#039;query&#039;] = $this-&gt;foros-&gt;getCategorias();
			$this-&gt;load-&gt;view(&quot;header&quot;);
			$this-&gt;load-&gt;view(&quot;foros/index&quot;, $vars);
			$this-&gt;load-&gt;view(&quot;footer&quot;);
		}

		function categoria($id = 0)
		{
			if((int)$id&lt; =0)
			{
				echo &quot;Error, no existe una categoría con esta id.&quot;;
			}
			else
			{
				$this-&gt;load-&gt;model(&quot;foros_model&quot;, &quot;foros&quot;);			

				$vars[&#039;query&#039;] = $this-&gt;foros-&gt;getTemas($id);
				$this-&gt;load-&gt;view(&quot;header&quot;);
				$this-&gt;load-&gt;view(&quot;foros/categoria&quot;, $vars);
				$this-&gt;load-&gt;view(&quot;footer&quot;);
			}
		}

	}

?&gt;
</pre>
<p>Si os fijáis es casi idéntica a la del apartado anterior. Veamos que hemos incorporado una nueva función del model, para que nos dé los resultados y también creamos otra para una cosa que veremos mas adelante. El <em>foros_model.php</em> quedará con 2 nuevas funciones:</p>
<pre class="brush: php">
&lt; ?php
	class Foros_model extends CI_Model
	{
		function __construct()
		{
			parent::__construct();
		}

		function getCategorias($padre = 0)
		{
			$this-&gt;db-&gt;where(&quot;padre&quot;, $padre);
			$q = $this-&gt;db-&gt;get(&#039;forum_cat&#039;);
			return $q;
		}

		function getNombreCategoria($id = 0)
		{
			$this-&gt;db-&gt;where(&quot;id&quot;, $id);
			$this-&gt;db-&gt;select(&quot;nombre&quot;);
			$q = $this-&gt;db-&gt;get(&quot;forum_cat&quot;);
			$r = $q-&gt;row();
			return $r-&gt;nombre;
		}

		function getTemas($cat_id = 0)
		{
			$this-&gt;db-&gt;where(&quot;cat_id&quot;, $cat_id);
			$q = $this-&gt;db-&gt;get(&quot;forum_temas&quot;);
			return $q;
		}
	}
?&gt;
</pre>
<p>La segunda es idéntica a la que ya hicimos en el tutorial anterior, la primer lo que hará es que nos devolverá un nombre de la categoría a partir de la id que nosotros le demos.</p>
<p>Y ahora ya solo nos quedará crear el view para esta nueva sección vi<em>ews/foros/categoria.php</em>:</p>
<pre class="brush: php">
&lt; ?php
	echo &#039;&lt;h2&gt;&lt;a href=&quot;index.php/foros/index&quot;&gt;Foros&lt;/a&gt; &amp;raquo; &#039;.$this-&gt;foros-&gt;getNombreCategoria((int)$this-&gt;uri-&gt;segment(3)).&#039;&#039;;

	if($query-&gt;num_rows() &gt; 0)
	{
		echo &#039;&lt;ul&gt;&#039;;
		foreach($query-&gt;result() as $row)
		{
			echo &#039;&lt;li&gt;&lt;a href=&quot;index.php/foros/temas/&#039;.$row-&gt;id.&#039;&quot;&gt;&#039;.$row-&gt;titulo.&#039;&lt;/a&gt;&lt;/li&gt;&#039;;
		}
		echo &#039;&lt;/ul&gt;&#039;;
	}
	else
	{
		echo &#039;&lt;p&gt;No hay ninguna tema creado&lt;/p&gt;&#039;;
	}
?&gt;
</pre>
<p>En la primera linea, pondremos una ruta del foro, con el nombre de la categoría en la que nos encontramos (cosa que sabemos recogiendo la id de la URL y pasándola a nuestra función). Luego haremos un listado de los temas que hay en esa categoría.</p>
<p><img src="http://img.feus.org/images/estadoforo.jpg" alt="como va quedando la cosa.." width="233" height="83" /></p>
<p>Bueno esto es todo por hoy, como veis poco a poco va cogiendo forma :)</p>

<p><a href="http://feedads.g.doubleclick.net/~a/ZnNX44jKPW0AmviVIYUccZinWsA/0/da"><img src="http://feedads.g.doubleclick.net/~a/ZnNX44jKPW0AmviVIYUccZinWsA/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/ZnNX44jKPW0AmviVIYUccZinWsA/1/da"><img src="http://feedads.g.doubleclick.net/~a/ZnNX44jKPW0AmviVIYUccZinWsA/1/di" border="0" ismap="true"></img></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.noquieroprogramar.com/creando-nuestro-foro-tercera-parte-los-temas/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Creando nuestro Foro (Segunda parte): Las categorías</title>
		<link>http://www.noquieroprogramar.com/creando-nuestro-foro-segunda-parte-las-categorias/</link>
		<comments>http://www.noquieroprogramar.com/creando-nuestro-foro-segunda-parte-las-categorias/#comments</comments>
		<pubDate>Sat, 19 Feb 2011 22:44:58 +0000</pubDate>
		<dc:creator>Lagarto</dc:creator>
				<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Estructura web]]></category>
		<category><![CDATA[Foro]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación web]]></category>
		<category><![CDATA[Talleres]]></category>
		<category><![CDATA[XHTML]]></category>
		<category><![CDATA[base de datos]]></category>
		<category><![CDATA[crear]]></category>
		<category><![CDATA[foro]]></category>
		<category><![CDATA[load model]]></category>
		<category><![CDATA[models]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.noquieroprogramar.com/?p=123</guid>
		<description><![CDATA[Bueno ha llegado el momento de ponerse a programar en CodeIgniter, pues ya tenemos las bases de datos creadas. Para empezar pondremos algunos valores en la base de datos, en la tabla de categorías, por ejemplo estas: Os podéis fijar, tal y como os comenté en el post anterior como funciona el tema del "padre", [...]]]></description>
			<content:encoded><![CDATA[<p>Bueno ha llegado el momento de ponerse a programar en CodeIgniter, pues ya tenemos las bases de datos creadas. Para empezar pondremos algunos valores en la base de datos, en la tabla de categorías, por ejemplo estas:</p>
<p><img src="http://img.feus.org/images/categorias.jpg" alt="categorías en la base de datos" width="261" height="192" /></p>
<p>Os podéis fijar, tal y como os comenté en el post anterior como funciona el tema del "padre", simplemente hace referencia a la ID a la cual pertenece. En este caso tenemos la categoría padre (definida por padre=0) "General" y sus hijos son "Noticias" y "Off-topic", de todas maneras luego lo veréis mas claro.</p>
<p>Ahora necesitaremos las 3 partes fundamentales del modelo MVC que son: la vista, el controlador y el modelo, asi que lo vamos a crear.</p>
<ol>
<li>El controlador: <em>controllers/foros.php</em></li>
<li>El modelo:<em> models/foros_models.php</em></li>
<li>Las vistas irán dentro de la carpeta <em>views/foros</em>, y crearemos<em> index.php</em></li>
</ol>
<p>Una vez tenemos creados estos 3 archivos empezaremos a hilar un poco todo para empezar a mostrar las categorías. Empezaremos por el modelo, es el que nos ayudara a comunicarnos con la base de datos, el código será este de momento:<br />
<span id="more-123"></span></p>
<pre class="brush: php">
&lt; ?php 

	if (!defined(&#039;BASEPATH&#039;))
		exit(&#039;No direct script access allowed&#039;);

	class Foros extends CI_Controller
	{

		function __construct()
		{
			parent::__construct();
		}

		function index()
		{
			$this-&gt;load-&gt;model(&quot;foros_model&quot;, &quot;foros&quot;);

			$vars[&#039;query&#039;] = $this-&gt;foros-&gt;getCategorias();
			$this-&gt;load-&gt;view(&quot;header&quot;);
			$this-&gt;load-&gt;view(&quot;foros/index&quot;, $vars);
			$this-&gt;load-&gt;view(&quot;footer&quot;);
		}

	}

?&gt;
</pre>
<p>Si os fijáis básicamente cree una función que consulta las categorías, según la id de "padre" que especifiquemos. Es decir sin a la función le pasamos un 0 (o nada en su defecto) nos devolverá las categorías padre. En nuestro ejemplo sería "General" y "Temas". Si le pasamos la id=1 nos devolvería las subcategorias de "General" que son "Noticias" y "Off-topic". ¿Fácil no?</p>
<p>Ahora pasaremos al controlador, que se encargara de coordinarlo todo. El código de momento será este:</p>
<pre class="brush: php">
&lt; ?php
	class Foros_model extends CI_Model
	{
		function __construct()
		{
			parent::__construct();
		}

		function getCategorias($padre = 0)
		{
			$this-&gt;db-&gt;where(&quot;padre&quot;, $padre);
			$q = $this-&gt;db-&gt;get(&#039;forum_cat&#039;);
			return $q;
		}
	}
?&gt;
</pre>
<p>Primero de todo, cargamos el modelo, luego cargamos las vistas (header y footer, con la cabecera y el pie de la página; es una buena practica para ahorrarnos repetir código). Le pasaremos el resultado de la función del model (que nos devuelve la consulta) hacía la vista, donde la trataremos y le daremos forma.</p>
<p>La vista tendrá este código:</p>
<pre class="brush: php">
&lt; ?php
	if($query-&gt;num_rows() &gt; 0)
	{
		foreach($query-&gt;result() as $row)
		{
			echo &#039;&lt;h2&gt;&#039;.$row-&gt;nombre.&#039;&lt;/h2&gt;&#039;;
			$sub = $this-&gt;foros-&gt;getCategorias($row-&gt;id);
			foreach($sub-&gt;result() as $row2)
			{
				echo &#039;&lt;h4&gt;&lt;a href=&quot;index.php/foros/categoria/&#039;.$row2-&gt;id.&#039;&quot;&gt;&#039;.$row2-&gt;nombre.&#039;&lt;/a&gt;&lt;/h4&gt;&#039;;
			}
		}
	}
	else
	{
		echo &#039;&lt;p&gt;No hay ninguna categor&amp;iacute;a creada&lt;/p&gt;&#039;;
	}
?&gt;
</pre>
<p>Esto lo haremos en 3 pasos. Primero comprobamos que existe categorías, sino mostraremos un mensaje de error. En caso afirmativo cargaremos las categorías padre, que es la que nos venían del resultado anterior, y luego por cada una de ellas, buscaremos a sus hijos, que simplemente será buscar aquellas categorías que sus id corresponda con el padre. Nos quedará algo así:</p>
<p><img src="http://img.feus.org/images/cats2.jpg" alt="como queda" width="331" height="294" /></p>
<p>Fijaros que ya he puesto que cada categoría (hija) tenga ya un enlace para acceder a los posts de cata una de ellas (en los siguientes tutoriales). Obviamente esto es muy básico, que se puede ordenar con las típicas tablas que nos muestran el total de post, la última respuesta y todo eso, pero al fin y al cabo son detalles y no entraremos de momento.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/pNzOV9OoVGhhscsIGX6FQoae5Pc/0/da"><img src="http://feedads.g.doubleclick.net/~a/pNzOV9OoVGhhscsIGX6FQoae5Pc/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/pNzOV9OoVGhhscsIGX6FQoae5Pc/1/da"><img src="http://feedads.g.doubleclick.net/~a/pNzOV9OoVGhhscsIGX6FQoae5Pc/1/di" border="0" ismap="true"></img></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.noquieroprogramar.com/creando-nuestro-foro-segunda-parte-las-categorias/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Creando nuestro Foro (Primera parte): La base de datos</title>
		<link>http://www.noquieroprogramar.com/creando-nuestro-foro-primera-parte-la-base-de-datos/</link>
		<comments>http://www.noquieroprogramar.com/creando-nuestro-foro-primera-parte-la-base-de-datos/#comments</comments>
		<pubDate>Wed, 16 Feb 2011 22:48:18 +0000</pubDate>
		<dc:creator>Lagarto</dc:creator>
				<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Estructura web]]></category>
		<category><![CDATA[Foro]]></category>
		<category><![CDATA[JQuery]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación web]]></category>
		<category><![CDATA[Talleres]]></category>
		<category><![CDATA[XHTML]]></category>
		<category><![CDATA[base de datos]]></category>
		<category><![CDATA[crear]]></category>
		<category><![CDATA[foro]]></category>
		<category><![CDATA[MyISAM]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[post]]></category>
		<category><![CDATA[sql]]></category>
		<category><![CDATA[tablas]]></category>
		<category><![CDATA[taller]]></category>

		<guid isPermaLink="false">http://www.noquieroprogramar.com/?p=119</guid>
		<description><![CDATA[Bueno abro este nuevo taller, para crear un foro en CodeIgniter. Obviamente no será tan completo como aquellos que circulan por Internet (phpBB y sucedaneos), pero si será una sencilla base para que por un lado aprendáis a usar CodeIgniter y por otro lado podáis ampliarlo para adaptarlo a vuestro gusto. Como siempre empezaremos poco a poco [...]]]></description>
			<content:encoded><![CDATA[<p>Bueno abro este nuevo taller, para crear un foro en CodeIgniter. Obviamente no será tan completo como aquellos que circulan por Internet (phpBB y sucedaneos), pero si será una sencilla base para que por un lado aprendáis a usar CodeIgniter y por otro lado podáis ampliarlo para adaptarlo a vuestro gusto.</p>
<p>Como siempre empezaremos poco a poco y con buena letra. Lo primero será crear las tablas necesarias para la base de datos. Mantendremos el asunto sencillo y empezaremos con la estructura mas básica de todas.</p>
<p>Vamos a las categorías que tendrá el foro, ahora mismo se me ocurren estos campos</p>
<ul>
<li>id</li>
<li>nombre</li>
<li>padre</li>
</ul>
<p>Simple y sencillo. Padre simplemente hará referencia de si es una categoría que dependa de otras o es una principal. Este es el código SQL:</p>
<pre class="brush: sql">
CREATE TABLE IF NOT EXISTS `forum_cat` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `nombre` varchar(100) NOT NULL,
  `padre` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
</pre>
<p>Luego la tabla de posts quedaría con estos campos:</p>
<ul>
<li>id</li>
<li>titulo</li>
<li>cuerpo</li>
<li>fecha</li>
<li>usuario_id</li>
<li>padre</li>
</ul>
<p>Tampoco descarto que a mitad de la programación de este foro me de cuenta que falta algún campo, pues tened en cuenta que voy escribiendo esto a medida que lo voy a ir programando. Así quedaría el código SQL:</p>
<pre class="brush: sql">
CREATE TABLE IF NOT EXISTS `forum_posts` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `titulo` varchar(100) NOT NULL,
  `cuerpo` text NOT NULL,
  `fecha` datetime NOT NULL,
  `usuario_id` int(11) NOT NULL,
  `padre` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
</pre>
<p>Y bueno para empezar creo que es todo lo que nos hará falta. Si creéis que me puedo dejar algún campo <span style="text-decoration: underline;">básico</span> para el funcionamiento, comentad o pasaros por el foro y lo discutimos ;)</p>
<p>El próximo post mas y mejor.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/e9ZM523-8jLJnre0bNRmeMlpDak/0/da"><img src="http://feedads.g.doubleclick.net/~a/e9ZM523-8jLJnre0bNRmeMlpDak/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/e9ZM523-8jLJnre0bNRmeMlpDak/1/da"><img src="http://feedads.g.doubleclick.net/~a/e9ZM523-8jLJnre0bNRmeMlpDak/1/di" border="0" ismap="true"></img></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.noquieroprogramar.com/creando-nuestro-foro-primera-parte-la-base-de-datos/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Formulario de contacto (Tercera parte): Enviando emails</title>
		<link>http://www.noquieroprogramar.com/formulario-de-contacto-tercera-parte-enviando-emails/</link>
		<comments>http://www.noquieroprogramar.com/formulario-de-contacto-tercera-parte-enviando-emails/#comments</comments>
		<pubDate>Mon, 14 Feb 2011 20:06:07 +0000</pubDate>
		<dc:creator>Lagarto</dc:creator>
				<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[Estructura web]]></category>
		<category><![CDATA[Formulario de contacto]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación web]]></category>
		<category><![CDATA[Talleres]]></category>
		<category><![CDATA[XHTML]]></category>
		<category><![CDATA[contacto]]></category>
		<category><![CDATA[email class]]></category>
		<category><![CDATA[formulario]]></category>

		<guid isPermaLink="false">http://www.noquieroprogramar.com/?p=117</guid>
		<description><![CDATA[Bueno esta es la ultima parte de este sencillo tutorial, seguimos con la creación de un formulario de contacto en CodeIgniter, basicamente lo que vamos a hacer ahora es utilizar la libreria Email Class. Como tenemos las variables de "nombre, "email" y "texto" simplemente tendremos que introducirlas en las funciones correspondientes, algo así como: &#60; [...]]]></description>
			<content:encoded><![CDATA[<p>Bueno esta es la ultima parte de este sencillo tutorial, seguimos con la creación de un formulario de contacto en CodeIgniter, basicamente lo que vamos a hacer ahora es utilizar la libreria <a href="http://codeigniter.com/user_guide/libraries/email.html">Email Class</a>.</p>
<p>Como tenemos las variables de "nombre, "email" y "texto" simplemente tendremos que introducirlas en las funciones correspondientes, algo así como:</p>
<pre class="brush: php">
&lt; ?php
if(!defined(&#039;BASEPATH&#039;))
	exit(&#039;No direct script access allowed&#039;);

class Contacto extends CI_Controller
{
	function __construct()
	{
		parent::__construct();
	}

	function index()
	{

		$this-&gt;load-&gt;library(&#039;form_validation&#039;);

		$this-&gt;form_validation-&gt;set_rules(&#039;nombre&#039;, &#039;Nombre&#039;, &#039;trim|required|xss_clean&#039;);
		$this-&gt;form_validation-&gt;set_rules(&#039;email&#039;, &#039;Email&#039;, &#039;required|valid_email&#039;);
		$this-&gt;form_validation-&gt;set_rules(&#039;texto&#039;, &#039;Texto&#039;, &#039;xss_clean&#039;);	

		if($this-&gt;form_validation-&gt;run())
		{
			//print_r($_POST);	

			$this-&gt;load-&gt;library(&#039;email&#039;);

			$this-&gt;email-&gt;from(&#039;webmaster@noquieroprogramar.com&#039;, &#039;Lagarto&#039;);
			$this-&gt;email-&gt;to($_POST[&#039;email&#039;]);

			$this-&gt;email-&gt;subject(&#039;Contacto de tu web&#039;);
			$this-&gt;email-&gt;message($_POST[&#039;nombre&#039;]. &quot;, se ha puesto en contacto contigo y te ha dicho: &quot;.$_POST[&#039;texto&#039;]);

			$this-&gt;email-&gt;send();

			echo $this-&gt;email-&gt;print_debugger();
		}
		else
		{
			$this-&gt;load-&gt;view(&#039;contacto&#039;);
		}
	}
}
?&gt;
</pre>
<p>Veréis como he dejado la función "debug" para que comprobéis que todo ha ido correctamente, obviamente esto no lo tendríais que incluir en vuestra aplicación sino un "redirect" hacía alguna página que ponga "Has enviado correctamente el formulario" o algo parecido.</p>
<p>Aquí la prueba:</p>
<p><img src="http://img.feus.org/images/contacto.jpg" alt="Prueba del envío de email" width="497" height="134" /></p>
<p>A partir de aquí, lo podéis complicar como queráis, pero esta es la base mas simple para empezar a trabajar.</p>
<p>Para cualquier duda que tengáis sobre esto u otra cosa no olvidéis pasaros por el foro. (tenéis en enlace por la derecha y arriba de la web).</p>

<p><a href="http://feedads.g.doubleclick.net/~a/llIEadiPYY9u69bnvAjJLwh8w6w/0/da"><img src="http://feedads.g.doubleclick.net/~a/llIEadiPYY9u69bnvAjJLwh8w6w/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/llIEadiPYY9u69bnvAjJLwh8w6w/1/da"><img src="http://feedads.g.doubleclick.net/~a/llIEadiPYY9u69bnvAjJLwh8w6w/1/di" border="0" ismap="true"></img></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.noquieroprogramar.com/formulario-de-contacto-tercera-parte-enviando-emails/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Formulario de contacto (Segunda Parte): Validación</title>
		<link>http://www.noquieroprogramar.com/formulario-de-contacto-segunda-parte-validacion/</link>
		<comments>http://www.noquieroprogramar.com/formulario-de-contacto-segunda-parte-validacion/#comments</comments>
		<pubDate>Thu, 10 Feb 2011 16:41:10 +0000</pubDate>
		<dc:creator>Lagarto</dc:creator>
				<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[Estructura web]]></category>
		<category><![CDATA[Formulario de contacto]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación web]]></category>
		<category><![CDATA[Talleres]]></category>
		<category><![CDATA[XHTML]]></category>
		<category><![CDATA[formulario]]></category>
		<category><![CDATA[guía]]></category>
		<category><![CDATA[post]]></category>
		<category><![CDATA[taller]]></category>
		<category><![CDATA[validation]]></category>

		<guid isPermaLink="false">http://www.noquieroprogramar.com/?p=113</guid>
		<description><![CDATA[Bueno siguiendo el taller/tutorial del otro dia, voy a proceder con la validación del formulario. Si recordáis, teníamos el formulario creado y usamos la función print_r para ver que recibíamos correctamente las variables. Hoy basicamente lo que haremos es comprobar que esas variables que recibimos son lo que nosotros queremos, es decir vamos a validar [...]]]></description>
			<content:encoded><![CDATA[<p>Bueno siguiendo el taller/tutorial del otro dia, voy a proceder con la validación del formulario. Si recordáis, teníamos el formulario creado y usamos la función <em>print_r </em> para ver que recibíamos correctamente las variables. Hoy basicamente lo que haremos es comprobar que esas variables que recibimos son lo que nosotros queremos, es decir vamos a validar que el usuario ha introducido lo que nosotros buscamos.</p>
<ul>
<li><strong>Nombre</strong>: tiene que ser requerido para enviar el formulario</li>
<li><strong>Email</strong>: tiene que ser requerido y ser un email valido.</li>
<li><strong>Texto</strong>: opcional.</li>
</ul>
<p>Para empezar, iremos a ver la guía en la documentación de CodeIgniter y veremos como se utiliza la librería: <a href="http://codeigniter.com/user_guide/libraries/form_validation.html">Form Validation</a>. Siguiendo los sencillos pasos del principio tendremos este código en el controlador <strong>contacto.php</strong>:</p>
<p><span id="more-113"></span></p>
<pre class="brush: php">
&lt; ?php
if(!defined(&#039;BASEPATH&#039;))
	exit(&#039;No direct script access allowed&#039;);

class Contacto extends CI_Controller
{
	function __construct()
	{
		parent::__construct();
	}

	function index()
	{

		$this-&gt;load-&gt;library(&#039;form_validation&#039;);

		$this-&gt;form_validation-&gt;set_rules(&#039;nombre&#039;, &#039;Nombre&#039;, &#039;trim|required|xss_clean&#039;);
		$this-&gt;form_validation-&gt;set_rules(&#039;email&#039;, &#039;Email&#039;, &#039;required|valid_email&#039;);
		$this-&gt;form_validation-&gt;set_rules(&#039;texto&#039;, &#039;Texto&#039;, &#039;xss_clean&#039;);	

		if($this-&gt;form_validation-&gt;run())
		{
			print_r($_POST);
		}
		else
		{
			$this-&gt;load-&gt;view(&#039;contacto&#039;);
		}
	}
}
?&gt;
</pre>
<p>Aqui hay dos elementos a destacar. La primera parte vemos como definimos unas reglas con la funcion <em>$this-&gt;form_validation-&gt;set_rules</em>. El primer campo definiremos el atributo "name" del formulario, en el segundo campo pondremos una definición de que elemento es, puesto que lo utilizará para dar los errores. El tercer campo especificamos que reglas de validación queremos poner, separados por un "|". En el link que os puse antes de la librería (en la documentación de CodeIgniter) hay una tabla con todas las reglas posibles, yo os describo las que he usado:</p>
<ul>
<li><strong>trim</strong>: cortara espacios vacuos por delante y por detrás, mera estética</li>
<li><strong>required</strong>: será un campo requerido, no se podrá dejar vacío.</li>
<li><strong>valid_email</strong>: verificara que nos entran un email y no cualquier chorrada.</li>
<li><strong>xss_clean</strong>: nos limpiara de posible código malicioso</li>
</ul>
<p>La segunda parte es simplemente un "if" condicional, que ejecutará el código que tiene dentro cuando haya recibido y validado correctamente las variables del formulario. Sino valida o simplemente es la primera vez que aparece el formulario, se ejecutará el "else".</p>
<hr style="width: 200px; color: #ffffff; border: 1px solid #CCCCCC;" noshade="noshade" />
<p>Luego tenemos el código del formulario. Podemos destacar dos cosas. Primero de todo hemos puesto el codigo &lt;?php echo validation_errors(); ?&gt;, que básicamente mostrará los errores de validación. Lo segundo y creo yo que es muy útil, es "repoblar" los formularios, pues imaginamos que tenemos uno con 5 o 6 campos, solo que falle una vez, el usuario debería añadir de nuevo todos los campos, en cambio de esta manera, solo tendrá que añadir los que no sean validados, los demás los "recordaremos".</p>
<pre class="brush: php">
&lt;html&gt;
	&lt;head&gt;
    	&lt;title&gt;NoQuieroProgramar.com - Formulario de contacto&lt;/title&gt;
    &lt;/head&gt;
    &lt;body&gt;
    	&lt;div id=&quot;contacto&quot;&gt;

			&lt; ?php echo validation_errors(); ?&gt;        

        	&lt;fieldset&gt;
            	&lt;legend&gt;Formulario de contacto&lt;/legend&gt;

                &lt;form action=&quot;&quot; method=&quot;post&quot;&gt;
                	&lt;label for=&quot;f_nombre&quot;&gt;Nombre&lt;/label&gt;
                    &lt;input type=&quot;text&quot; name=&quot;nombre&quot; id=&quot;f_nombre&quot; value=&quot;&lt;?php echo set_value(&#039;nombre&#039;); ?/&gt;&quot; /&gt;
                    &lt;br /&gt;
                    &lt;label for=&quot;f_email&quot;&gt;Email&lt;/label&gt;
                    &lt;input type=&quot;text&quot; name=&quot;email&quot; id=&quot;f_email&quot; value=&quot;&lt;?php echo set_value(&#039;email&#039;); ?/&gt;&quot; /&gt;
                    &lt;br /&gt;
                    &lt;label for=&quot;f_texto&quot;&gt;Texto&lt;/label&gt;
                    &lt;textarea name=&quot;texto&quot; id=&quot;f_texto&quot;&gt;&lt; ?php echo set_value(&#039;texto&#039;); ?&gt;&lt;/textarea&gt;
                    &lt;br /&gt;
                    &lt;label for=&quot;f_enviar&quot;&gt;&lt;/label&gt;
                    &lt;input type=&quot;submit&quot; id=&quot;f_enviar&quot; /&gt;
                &lt;/form&gt;
            &lt;/fieldset&gt;
        &lt;/div&gt;
    &lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Y bueno eso es todo por hoy, en el próximo capitulo veremos como enviar el email y acabar unos cuantos detalles mas.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/o4PZf6NLtNKvmtmuRkewYGYh2-s/0/da"><img src="http://feedads.g.doubleclick.net/~a/o4PZf6NLtNKvmtmuRkewYGYh2-s/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/o4PZf6NLtNKvmtmuRkewYGYh2-s/1/da"><img src="http://feedads.g.doubleclick.net/~a/o4PZf6NLtNKvmtmuRkewYGYh2-s/1/di" border="0" ismap="true"></img></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.noquieroprogramar.com/formulario-de-contacto-segunda-parte-validacion/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Formulario de contacto (Primera Parte): Código básico</title>
		<link>http://www.noquieroprogramar.com/formulario-de-contacto-primera-parte-codigo-basico/</link>
		<comments>http://www.noquieroprogramar.com/formulario-de-contacto-primera-parte-codigo-basico/#comments</comments>
		<pubDate>Tue, 08 Feb 2011 16:36:44 +0000</pubDate>
		<dc:creator>Lagarto</dc:creator>
				<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Estructura web]]></category>
		<category><![CDATA[Formulario de contacto]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación web]]></category>
		<category><![CDATA[Talleres]]></category>
		<category><![CDATA[XHTML]]></category>
		<category><![CDATA[formulario]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[libreria]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[post]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.noquieroprogramar.com/?p=108</guid>
		<description><![CDATA[Bueno tal y comenté, hace días abrí el foro para que todos los usuarios con dudas y sugerencias pudieran participar activamente en el blog. Ayer el usuario jarruego me comentó que podría hacer un pequeño tutorial de cómo hacer un modulo que es básico y común en la mayoría de webs: un formulario de contacto. [...]]]></description>
			<content:encoded><![CDATA[<p>Bueno tal y comenté, hace días <a href="http://foro.noquieroprogramar.com/index.php">abrí el foro</a> para que todos los usuarios con dudas y sugerencias pudieran participar activamente en el blog. Ayer <a href="http://foro.noquieroprogramar.com/viewtopic.php?f=2&amp;t=16">el usuario jarruego me comentó</a> que podría hacer un pequeño tutorial de cómo hacer un modulo que es básico y común en la mayoría de webs: un formulario de contacto. Nos servirá para introducir a aquellos que sean nuevos en esto con un sencillo ejemplo.</p>
<p>Para esta pequeña aplicación utilizaré la última versión de CodeIgniter (que hay por el momento) que es la 2.0.0.</p>
<hr style="width: 100px; color: #ffffff; border: 1px solid #CCCCCC;" noshade="noshade" />
<p>Un formulario de contacto nos ayudará a que cualquier persona interesada en nuestra web, ya sea un negocio, portafolio o cualquier otra cosa. Se puede ampliar tanto como queráis pero como esto es un tutorial haremos los campos mas básicos: nombre, email, mensaje.</p>
<p>Voy a dividir este tutorial en 2 o quizá 3 posta, empezaré con el código básico, tanto HTML como PHP (en CodeIgniter). Luego seguiré con la libreria de validación para poder comprobar que han entrado los campos correctamente. Acabaré usando la librería para mandar emails fácilmente, así nos llegará al correo este formulario básico de contacto en CodeIgniter.</p>
<p>Primero de todo empezaremos creando el código HTML para el formulario. Usaré etiquetas que no se suelen usar pero que deberíais hacerlo, como fieldset, legend y label, eso ayudará a la visibilidad y usabilidad del mismo. Cabe decir que no voy a "diseñar", así que lo dejaré tal cual salga aunque todos sabemos que el html sin css es feo, pero ahora lo que nos interesa es el código php.</p>
<p><span id="more-108"></span></p>
<pre class="brush: html">
&lt;html&gt;
	&lt;head&gt;
    	&lt;title&gt;NoQuieroProgramar.com - Formulario de contacto&lt;/title&gt;
    &lt;/head&gt;
    &lt;body&gt;
    	&lt;div id=&quot;contacto&quot;&gt;
        	&lt;fieldset&gt;
            	&lt;legend&gt;Formulario de contacto&lt;/legend&gt;

                &lt;form action=&quot;&quot; method=&quot;post&quot;&gt;
                	&lt;label for=&quot;f_nombre&quot;&gt;Nombre&lt;/label&gt;
                    &lt;input type=&quot;text&quot; name=&quot;nombre&quot; id=&quot;f_nombre&quot; /&gt;
                    &lt;br /&gt;
                    &lt;label for=&quot;f_email&quot;&gt;Email&lt;/label&gt;
                    &lt;input type=&quot;text&quot; name=&quot;email&quot; id=&quot;f_email&quot; /&gt;
                    &lt;br /&gt;
                    &lt;label for=&quot;f_texto&quot;&gt;Texto&lt;/label&gt;
                    &lt;textarea name=&quot;texto&quot; id=&quot;f_texto&quot;&gt;&lt;/textarea&gt;
                    &lt;br /&gt;
                    &lt;label for=&quot;f_enviar&quot;&gt;&lt;/label&gt;
                    &lt;input type=&quot;submit&quot; id=&quot;f_enviar&quot; /&gt;
                &lt;/form&gt;
            &lt;/fieldset&gt;
        &lt;/div&gt;
    &lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Luego crearemos nuestro "controller" que se llamará contacto, de momento tendrá este código:</p>
<pre class="brush: php">
&lt; ?php
if(!defined(&#039;BASEPATH&#039;))
	exit(&#039;No direct script access allowed&#039;);

class Contacto extends CI_Controller
{
	function __construct()
	{
		parent::__construct();
	}

	function index()
	{
		print_r($_POST);
		$this-&gt;load-&gt;view(&#039;contacto&#039;);
	}
}
?&gt;
</pre>
<p>Si probáis esto veréis como recibimos correctamente las variables $_POST cuando enviamos el formulario.</p>
<p>En el próximo capítulo empezaremos con la validación del formulario, estad atentos.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/wSMfqqh3a_YZcMbCet3NsZIhIyY/0/da"><img src="http://feedads.g.doubleclick.net/~a/wSMfqqh3a_YZcMbCet3NsZIhIyY/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/wSMfqqh3a_YZcMbCet3NsZIhIyY/1/da"><img src="http://feedads.g.doubleclick.net/~a/wSMfqqh3a_YZcMbCet3NsZIhIyY/1/di" border="0" ismap="true"></img></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.noquieroprogramar.com/formulario-de-contacto-primera-parte-codigo-basico/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ha salido CodeIgniter 2.0.0 !!!</title>
		<link>http://www.noquieroprogramar.com/ha-salido-codeigniter-2-0-0/</link>
		<comments>http://www.noquieroprogramar.com/ha-salido-codeigniter-2-0-0/#comments</comments>
		<pubDate>Sat, 29 Jan 2011 16:28:20 +0000</pubDate>
		<dc:creator>Lagarto</dc:creator>
				<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[Programación web]]></category>
		<category><![CDATA[base de datos]]></category>
		<category><![CDATA[formularios]]></category>
		<category><![CDATA[helper]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[login]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.noquieroprogramar.com/?p=102</guid>
		<description><![CDATA[Bueno después de mucho tiempo y muchos interrogantes por la situación por la que pasa CodeIgniter, ayer anunciaron de forma oficial la versión 2.0! La verdad que hay muchisimos cambios que os animo a que los descubráis en la documentación, pero aquí van algunos: Al fin ya no soportan PHP4, ahora PHP5 es un requisito. Mejora de seguridad en [...]]]></description>
			<content:encoded><![CDATA[<p>Bueno después de mucho tiempo y muchos interrogantes por la situación por la que pasa CodeIgniter, ayer anunciaron de forma oficial la versión 2.0! La verdad que hay muchisimos cambios que os animo a que los descubráis en la documentación, pero aquí van algunos:</p>
<ul>
<li>Al fin ya no soportan PHP4, ahora PHP5 es un requisito.</li>
<li>Mejora de seguridad en formularios</li>
<li>Ahora han creado "Drivers", que básicamente engloba base de datos, javascript, etc..</li>
<li>Plugins han desaparecido en detrimento de los Helpers</li>
<li>Han añadido una gran utilidad para poder crear fácilmente tu pagina de error 404</li>
<li>Han arreglado muchísimos bugs.</li>
</ul>
<p>Bueno os animo a todos los lectores que os actualicéis a la ultima versión. Además nos han dejado unas pistas de lo que nos deparará sus futuras actualizaciones.</p>
<ul>
<li>Harán la documentación mas del estilo PHP, para que participen los usuarios.</li>
<li>Quieren crear un sistema de Authentication (login y todo eso) genérico ya que es algo muy basico que todas las webs necesitan. (os recuerdo que aquí hicimos <a href="http://www.noquieroprogramar.com/category/talleres/sistema-de-usuarios-talleres/">un tutorial</a> para crear uno).</li>
<li>Mejoras en el active-record para poder trabajar mejor con los "models".</li>
</ul>
<p>Fuente: <a href="http://codeigniter.com/news/codeigniter_2.0.0_released/">codeigniter.com</a></p>

<p><a href="http://feedads.g.doubleclick.net/~a/Z2AGQrxC0m-uCFWu0PV-m1QpZWw/0/da"><img src="http://feedads.g.doubleclick.net/~a/Z2AGQrxC0m-uCFWu0PV-m1QpZWw/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/Z2AGQrxC0m-uCFWu0PV-m1QpZWw/1/da"><img src="http://feedads.g.doubleclick.net/~a/Z2AGQrxC0m-uCFWu0PV-m1QpZWw/1/di" border="0" ismap="true"></img></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.noquieroprogramar.com/ha-salido-codeigniter-2-0-0/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Foro!!</title>
		<link>http://www.noquieroprogramar.com/foro/</link>
		<comments>http://www.noquieroprogramar.com/foro/#comments</comments>
		<pubDate>Sat, 07 Aug 2010 01:02:53 +0000</pubDate>
		<dc:creator>Lagarto</dc:creator>
				<category><![CDATA[Blog]]></category>

		<guid isPermaLink="false">http://www.noquieroprogramar.com/?p=88</guid>
		<description><![CDATA[Ya se que hace mucho tiempo que no escribo por aqui. Las razones, pues supongo que las tipicas: mucho trabajo, estudios a la vez, proyectos personales, etc.. y poco a poco se va dejando el habito de escribir algún que otro articulo. Pero espero que en breves esto cambie y vuelva a cargar con fuerza con nuevos artículos y [...]]]></description>
			<content:encoded><![CDATA[<p>Ya se que hace mucho tiempo que no escribo por aqui. Las razones, pues supongo que las tipicas: mucho trabajo, estudios a la vez, proyectos personales, etc.. y poco a poco se va dejando el habito de escribir algún que otro articulo. Pero espero que en breves esto cambie y vuelva a cargar con fuerza con nuevos artículos y nuevas ideas.</p>
<p>Pero de momento, he estado viendo que hay actividad en cuanto a comentarios con dudas y ayudas de algunas entradas y he pensado en proporcionar un lugar mas adecuado para tratar estos temas: <strong>un foro</strong>.</p>
<p>Teneis el link arriba, en la barra principal. Poco a poco ire retocando el foro para que sea bonito y util, pero de momento es funcional!</p>
<h2><a href="http://foro.noquieroprogramar.com/">Entrar en el foro</a></h2>

<p><a href="http://feedads.g.doubleclick.net/~a/RT3M1PJ50POYXB20N7h5CY3VlN8/0/da"><img src="http://feedads.g.doubleclick.net/~a/RT3M1PJ50POYXB20N7h5CY3VlN8/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/RT3M1PJ50POYXB20N7h5CY3VlN8/1/da"><img src="http://feedads.g.doubleclick.net/~a/RT3M1PJ50POYXB20N7h5CY3VlN8/1/di" border="0" ismap="true"></img></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.noquieroprogramar.com/foro/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

