<?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>Coders.me &#187; PHP</title>
	<atom:link href="http://www.coders.me/lang/en/category/php/feed" rel="self" type="application/rss+xml" />
	<link>http://www.coders.me/</link>
	<description>Blog de Informática y Programación</description>
	<lastBuildDate>Mon, 07 Dec 2009 18:48:23 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.2</generator>
		<item>
		<title>Sistema de Logueo de Usuarios en PHP &amp; MySQL</title>
		<link>http://www.coders.me//lang/en/php/sistema-de-logueo-de-usuarios-en-php-mysql</link>
		<comments>http://www.coders.me//lang/en/php/sistema-de-logueo-de-usuarios-en-php-mysql#comments</comments>
		<pubDate>Thu, 01 Oct 2009 03:00:18 +0000</pubDate>
		<dc:creator>Eduardo</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[codeflyer]]></category>
		<category><![CDATA[login]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.coders.me/?p=463</guid>
		<description><![CDATA[<img src="http://www.coders.me/wp-content/uploads/2008/08/php-48x48.jpg" width="48" height="48" alt="" title="PHP" /><br/><p>En esta oportunidad les traigo una clase perteneciente al futuro framework PHP CodeFlyer, que nos permitirá autentificar usuarios de manera rápida y segura.</p>
<p>Es una clase que construí hace tiempo y que vengo usando hace varios años, pero la he ajustado…</p>]]></description>
			<content:encoded><![CDATA[<img src="http://www.coders.me/wp-content/uploads/2008/08/php-48x48.jpg" width="48" height="48" alt="" title="PHP" /><br/><p>En esta oportunidad les traigo una clase perteneciente al futuro framework PHP CodeFlyer, que nos permitirá autentificar usuarios de manera rápida y segura.</p>
<p>Es una clase que construí hace tiempo y que vengo usando hace varios años, pero la he ajustado para que todo el mundo pueda usarla.</p>
<p>Este artículo se basa en el logueo y autentificación de usuarios y no en la creación o registro de usuarios.</p>
<h2>1. Instalando</h2>
<p>Primeramente debemos crear la tabla en donde se almacenarán todos los usuarios de nuestro sitio. Para esto basta con ejecutar la siguiente consulta en tu base de datos:</p>
<pre class="brush: sql;">
CREATE TABLE `login` (
  `id` int(11) NOT NULL auto_increment,
  `username` varchar(50) NOT NULL,
  `password` varchar(32) NOT NULL,
  `privilege` int(6) NOT NULL default '0',
  `cookie` binary(32) NOT NULL,
  `session` binary(32) NOT NULL,
  `lastactive` date NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
</pre>
<p>Para usos prácticos podemos crear nuestro usuario desde MySQL:<br />
Usuario: admin<br />
Contraseña: admin</p>
<pre class="brush: sql;">
INSERT INTO `login` VALUES (1, 'admin', '21232f297a57a5a743894a0e4a801fc3', 1,'','','');
</pre>
<p><em>(El md5 de &#8220;admin&#8221; es &#8220;21232f297a57a5a743894a0e4a801fc3&#8243;)</em></p>
<p>Una vez creada la tabla &#8220;login&#8221; debes copiar el archivo login.php a tu carpeta de proyectos.</p>
<h2>2. Inicializando la clase</h2>
<p>El siguiente paso será crear un archivo llamado &#8220;config.php&#8221; en donde iniciaremos la clase login, y luego incluiremos este config.php en todos nuestros archivos del proyecto. Completa los campos &#8216;database&#8217;, &#8216;username&#8217; y &#8216;password&#8217; con los datos de acceso de tu base de datos MySQL:</p>
<p>config.php:</p>
<pre class="brush: php;">
&lt;?PHP
  include('login.php');

  $login = new login(array(
    'database' =&gt; 'dbexample',
    'table'    =&gt; 'login',
    'username' =&gt; 'root',
    'password' =&gt; '1234'
  ));
?&gt;
</pre>
<h2>3. Autentificando usuarios</h2>
<p>Para loguear a un usuario usamos la función login:</p>
<pre class="brush: php;">
    if($login-&gt;login('usuario', 'contraseña'))
    {
       // Welcome!
    }
</pre>
<p>Entonces de esta manera podemos crear nuestro formulario de inicio de sesión, al que llamaremos index.php</p>
<p>La idea es mostrar el formulario a los usuarios &#8216;no logueados&#8217;, y redirigir hacia &#8220;protected.php&#8221; a los usuarios correctamente logueados:</p>
<p>index.php:</p>
<pre class="brush: php; html-script: true;">
&lt;?PHP
  include('config.php');

  if ($_POST['submit'])
  {
    if($login-&gt;login($_POST['usn'], $_POST['pwd']))
    {
      header('location: protected.php');
    }
    else
    {
      echo &quot;&lt;strong&gt;Login error&lt;/strong&gt;&quot;;
    }
  }

  if (!$login-&gt;logged()) : ?&gt;
    &lt;form method=&quot;post&quot;&gt;
      &lt;p&gt;&lt;label&gt;Username: &lt;input type=&quot;text&quot;     name=&quot;usn&quot; value=&quot;&quot; /&gt;&lt;/label&gt;&lt;/p&gt;
      &lt;p&gt;&lt;label&gt;Password: &lt;input type=&quot;password&quot; name=&quot;pwd&quot; value=&quot;&quot; /&gt;&lt;/label&gt;&lt;/p&gt;
      &lt;p&gt;&lt;input type=&quot;submit&quot; name=&quot;submit&quot; /&gt;&lt;/p&gt;
    &lt;/form&gt;
  &lt;?PHP
  else:
    header('location: protected.php');
  endif;
?&gt;
</pre>
<p>Entonces ya tenemos una manera para autentificar usuarios, pero ahora debemos proteger aquellas páginas que sólo deben ser vistas por usuarios registrados. Para ello vamos a crear una página protegida llamada &#8220;protected.php&#8221;:</p>
<p>protected.php:</p>
<pre class="brush: php;">
&lt;?PHP
  include('config.php');
  if (!$login-&gt;logged())
  {
    header(&quot;location: index.php&quot;);
    die();
  }
?&gt;

&lt;strong&gt;Este contenido es privado&lt;/strong&gt; &lt;a href=&quot;logout.php&quot;&gt;Salir de mi cuenta&lt;/a&gt;
</pre>
<p>La función <strong>logged()</strong> nos devuelve <strong>true</strong> si el usuario está autentificado, o <strong>false</strong> si el usuario intenta ingresar con una sesión inválida.</p>
<p>Tán sólo nos falta un archivo más llamado &#8220;logout.php&#8221; que usaremos para destruir la sesión:</p>
<p>logout.php:</p>
<pre class="brush: php;">
&lt;?PHP
  include('config.php');

  $login-&gt;logout();
  header(&quot;location: index.php&quot;);
?&gt;
</pre>
<h2>4. Resumen de funciones</h2>
<p>Entonces a modo de resumen podemos usar las siguientes funciones:</p>
<pre class="brush: php;">
// Creamos la clase, enviando los datos de acceso a la base de datos MySQL:
$login = new login(array(
    'database' =&gt; 'dbexample',
    'table'    =&gt; 'login',
    'username' =&gt; 'root',
    'password' =&gt; '1234'
));

// Logueamos al usuario &quot;username&quot; con la contraseña &quot;password&quot;
$login-&gt;login(&quot;username&quot;, &quot;password&quot;);

// Opcionalmente se puede utilizar un tercer parámetro bool, para utilizar cookies
// y recordar la visita del usuario, aún después de cerrar el navegador:
$login-&gt;login(&quot;username&quot;, &quot;password&quot;, true);

// Preguntar si el usuario está correctamente autentificado. Devuelve false en caso de haber error:
$login-&gt;logged();

// Cerrar y destruir la sesión:
$login-&gt;logout();
</pre>
<h2>5. Download</h2>
<p>Haremos cosas interesantes con esta clase mas adelante <img src='http://www.coders.me/wp-includes/images/smilies/icon_rolleyes.gif' alt=':roll:' class='wp-smiley' /><br />
<div class="download" id="download">

      <p>Este artículo contiene los siguientes archivos:</p>
      <ul>
      <ul><li><a href='http://www.coders.me/wp-content/themes/coders-social/donar.php?modal=1&width=500&height=175&url=http%3A%2F%2Fwww.coders.me%2Fwp-content%2Fuploads%2F2009%2F09%2Flogin-examples.zip&titulo=Sistema+de+Logueo+de+Usuarios+en+PHP+%26%23038%3B+MySQL' rel='sexylightbox'>http://www.coders.me/wp-content/uploads/2009/09/login-examples.zip</a></li></ul>
      </ul>

    </div></p>
]]></content:encoded>
			<wfw:commentRss>http://www.coders.me//lang/en/php/sistema-de-logueo-de-usuarios-en-php-mysql/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>¿Cómo saber si una dirección Email existe? Desde PHP</title>
		<link>http://www.coders.me//lang/en/php/como-saber-si-una-direccion-email-existe</link>
		<comments>http://www.coders.me//lang/en/php/como-saber-si-una-direccion-email-existe#comments</comments>
		<pubDate>Tue, 26 Aug 2008 03:00:45 +0000</pubDate>
		<dc:creator>Amir</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación Web]]></category>
		<category><![CDATA[ajax]]></category>

		<guid isPermaLink="false">http://www.coders.me/?p=267</guid>
		<description><![CDATA[<img src="http://www.coders.me/wp-content/uploads/2008/08/php-48x48.jpg" width="48" height="48" alt="" title="PHP" /><br/><p>En otra entrada anterior &#8211;<a href="http://www.coders.me/php/validar-e-mails-con-php">Validar E-mails con PHP</a>&#8211; hablé de una clase (programada por mí) que permite saber si una dirección email es válida y existe. Ahora veremos su aplicación en linea y la forma de validar correos con xajax.</p>
<p>Básicamente…</p>]]></description>
			<content:encoded><![CDATA[<img src="http://www.coders.me/wp-content/uploads/2008/08/php-48x48.jpg" width="48" height="48" alt="" title="PHP" /><br/><p>En otra entrada anterior &#8211;<a href="http://www.coders.me/php/validar-e-mails-con-php">Validar E-mails con PHP</a>&#8211; hablé de una clase (programada por mí) que permite saber si una dirección email es válida y existe. Ahora veremos su aplicación en linea y la forma de validar correos con xajax.</p>
<p>Básicamente lo que haremos, será introducir una dirección de correo en un campo de texto, el cual obtendremos y via xajax se la pasaremos a la clase en PHP, que se encargará de enviar los comandos al servidor mail correspondiente y devolver el resultado.</p>
<p><strong>Nota: La clase, por el momento, no funciona con servidores SSL, tipo Gmail/Yahoo.</strong></p>
<h2>Resultado final</h2>
<p><em>Validando email&#8230;</em> <img src="http://www.coders.me/wp-content/uploads/2008/08/validando.jpg" alt="" title="validando" width="318" height="27" class="size-full wp-image-268" /><br />
<em>E-mail válido</em> <img src="http://www.coders.me/wp-content/uploads/2008/08/valido.jpg" alt="" title="valido" width="318" height="27" class="size-full wp-image-269" /><br />
<em>E-mail inválido</em> <img src="http://www.coders.me/wp-content/uploads/2008/08/invalido.jpg" alt="" title="invalido" width="318" height="27" class="size-full wp-image-270" /></p>
<h2>Ejemplo online</h2>
<p>Podemos apreciar el ejemplo funcionando <a href="http://www.coders.me/ejemplos/validarmails/" title="Validar E-mails">aquí</a>.</p>
<p><strong>Descargar ejemplo</strong><br />
Si lo prefieres, puedes <a href="http://www.coders.me/ejemplos/validarmails/validarmail.zip">descargar el ejemplo&#8230;</a></p>
<h2>Implementación.</h2>
<p>Primero <a href="http://www.coders.me/ejemplos/validarmails/validarmail.zip">descargaremos</a> la clase y descompactaremos el zip dentro de un directorio, en el cual incluiremos también el <a href="http://xajaxproject.org/" target="_blank">xajax</a>. </p>
<p><em>Nota: La versión de xajax que yo uso es la 0.2.4, algo vieja pero servirá para los propósitos de demostración.</em></p>
<h2>Modulo que usa clase de validacion</h2>
<pre class="brush: php;">&lt;?
/**
  *	Modulo para usar clase validmail y validar correos
  *	@author: Amir oswaldo Canto
  * 	@date 23/08/08
  */
  require($_SERVER[DOCUMENT_ROOT].&quot;/xajax/xajax.inc.php&quot;);
  require(&quot;class.validmail.php&quot;);

  /*
    Declaramos xajax....
  */
  $xajax = new xajax();
  $xajax-&gt;registerFunction(&quot;isValidMail&quot;);
  $xajax-&gt;processRequests();

  function isValidMail($email)
  {
    $objResponse = new xajaxResponse();
    {/*	Comprobamos que el parámetro email se encuentre seteado con algun valor*/
      if(isset($email) &amp;&amp; $email != &quot;&quot;)
      {
        $validMail = new ValidEmail($email); // llamamos a la clase
        if(!$validMail-&gt;validString()  || !$validMail-&gt;validate() )
	 // comprobamos ahora sí el email
        {

          $objResponse-&gt;addAssign(&quot;verificacion&quot;,&quot;innerHTML&quot;,&quot;&lt;img src='images/cross.png' alt='' /&gt; El Email no es v&amp;aacute;lido&quot;);
          $objResponse-&gt;addScript(&quot;document.getElementById('verificacion').className = 'redbox';&quot;);
        }
        else
        {
          $objResponse-&gt;addAssign(&quot;verificacion&quot;,&quot;innerHTML&quot;,&quot;&lt;img src='images/accept.png' alt='' /&gt; Email V&amp;aacute;lido &quot;);
          $objResponse-&gt;addScript(&quot;document.getElementById('verificacion').className = 'greenbox';&quot;);
        }
        $objResponse-&gt;addScript(&quot;document.getElementById('email').disabled = false;&quot;);
      }

    }
    return $objResponse;
  }
?&gt;</pre>
<p>
Este código lo incluiremos dentro de un fichero llamado mod.valid.php o dentro de nuestro script donde se encuentra nuestro formulario y será el responsable de llamar a la clase de validación y procesar los requests y devolver el resultado.
</p>
<h2>Script JS</h2>
<pre class="brush: js;">function isValidMail(email){

	if(email.value != &quot;&quot;)
	{
		var htmlCode = &quot;&lt;img src='images/ajax-loader.gif' alt='' /&gt; Validando E-mail...&quot;;
		var verificacion = document.getElementById('verificacion');
		verificacion.innerHTML = &quot;&quot;;
		verificacion.innerHTML = htmlCode;
		verificacion.className = '';
		email.disabled = true;

		xajax_isValidMail(email.value);
	}
}</pre>
<h2>Implementación en el formulario</h2>
<pre class="brush: php;">&lt;?php
require(&quot;mod.valid.php&quot;);
?&gt;
&lt;html&gt;
&lt;head&gt;
	&lt;title&gt;Validando email&lt;/title&gt;
	&lt;link rel=&quot;stylesheet&quot; href=&quot;estilo.css&quot; type=&quot;text/css&quot; /&gt;
	&lt;script language=&quot;javascript&quot; type=&quot;text/javascript&quot; src=&quot;mail.js&quot;&gt;&lt;/script&gt;
	&lt;?php

		if(isset($xajax) &amp;&amp; is_object($xajax))
		{
			$xajax-&gt;printJavascript(&quot;http://&quot;.$_SERVER[SERVER_NAME].&quot;/xajax/&quot;);
		}

	?&gt;
&lt;/head&gt;
&lt;body&gt;

&lt;form&gt;
&lt;label for=&quot;email&quot;&gt;
	E-mail &lt;input type=&quot;text&quot; value=&quot;&quot; onblur=&quot;isValidMail(this)&quot; name=&quot;email&quot; id=&quot;email&quot; /&gt; &lt;span id=&quot;verificacion&quot; /&gt;
&lt;/label&gt;

&lt;/form&gt;

&lt;/body&gt;
&lt;/html&gt;</pre>
<h2>El Campo mail</h2>
<p>
Despues de agregar los scripts CSS, JS y PHP en nuestro fichero donde se encuentra nuestro formulario, agregaremos el campo &#8220;email&#8221; como sigue:
</p>
<pre class="brush: html;">&lt;label for=&quot;email&quot;&gt;
	E-mail &lt;input type=&quot;text&quot; value=&quot;&quot; onblur=&quot;isValidMail(this)&quot; name=&quot;email&quot; id=&quot;email&quot; /&gt; &lt;span id=&quot;verificacion&quot; /&gt;
&lt;/label&gt;</pre>
<p>
Notese que el nombre e id son iguales &#8220;email&#8221; y no deben cambiarse por ningún motivo, la funcion isValidMail envia al accionarse el evento onblur el mail al script PHP que comprobará y validará nuestro mail en tiempo real.
</p>
<p><strong>Descargar</strong><br />
Descarga la clase y el ejemplo <a href="http://www.coders.me/ejemplos/validarmails/validarmail.zip">aqui</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.coders.me//lang/en/php/como-saber-si-una-direccion-email-existe/feed</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Errores: ¿Dónde? ¿Cúando? y ¿Porqué?</title>
		<link>http://www.coders.me//lang/en/php/errores-donde-cuando-y-porque</link>
		<comments>http://www.coders.me//lang/en/php/errores-donde-cuando-y-porque#comments</comments>
		<pubDate>Thu, 21 Aug 2008 03:00:18 +0000</pubDate>
		<dc:creator>Eduardo</dc:creator>
				<category><![CDATA[Errores de Programación]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.coders.me/?p=264</guid>
		<description><![CDATA[<img src="http://www.coders.me/wp-content/uploads/2008/09/errores-48x48.jpg" width="48" height="48" alt="" title="Errores de Programación" /><br/><p>La programación es 50% <strong>construir</strong> &#8211; 50% <strong>arreglar</strong>. El arte de construir es algo maravilloso y lo que nos produce mayor satisfacción&#8230; Por el contrario, arreglar los errores (que nosotros mismos construimos) puede tornarse un trabajo más difícil que programar, puede…</p>]]></description>
			<content:encoded><![CDATA[<img src="http://www.coders.me/wp-content/uploads/2008/09/errores-48x48.jpg" width="48" height="48" alt="" title="Errores de Programación" /><br/><p>La programación es 50% <strong>construir</strong> &#8211; 50% <strong>arreglar</strong>. El arte de construir es algo maravilloso y lo que nos produce mayor satisfacción&#8230; Por el contrario, arreglar los errores (que nosotros mismos construimos) puede tornarse un trabajo más difícil que programar, puede hacer de tu vida un infierno, hasta el punto en que te haría dudar sobre si elegiste bien tu profesión o debiste ser veterinario (si lo sé, exagero <img src='http://www.coders.me/wp-includes/images/smilies/icon_rolleyes.gif' alt=':roll:' class='wp-smiley' />  ).</p>
<p>Arreglar errores es todo un tema aparte, pero&#8230; ¿Cómo poder arreglar algo que no sabemos <strong>por qué</strong> se produce, <strong>cuando</strong> se produce y <strong>dónde</strong> se produce?</p>
<p>Para eso se inventaron las <strong>descripciones de errores</strong> (junto con un número de identificación). Aunque algunas veces esas descripciones son <em>tan útiles como un destornillador para zurdos</em>. Es algo que yo llamo &#8220;errores ciegos&#8221;, errores que no dicen nada, errores que no aportan nada a la resolución y estorban o confunden. </p>
<p>Por ejemplo, errores como los que el WordPress da:<br />
<img src="http://www.coders.me/wp-content/uploads/2008/08/identifica_el_puto_error.jpg" alt="" title="Identifica el maldito error!" width="600" height="272" class="alignnone size-full wp-image-265" /></p>
<p>&#8220;Ha ocurrido un error sin identificar.&#8221; ¿que rayos ha pasado? Algunos podrían decir que &#8220;por lo menos me lo ha dicho en mi idioma&#8221;. Pero esta descripción de &#8220;sin identificar&#8221; no ayuda en nada, y simplemente deja una única opción al usuario: <strong>resignarse</strong>, <del datetime="2008-08-20T21:44:58+00:00">y empezar a rezar para que no ocurra de nuevo.</del></p>
<h2>Errores en PHP</h2>
<p>Gracias a una función encontrada en los <a rel="nofollow" href="http://ar2.php.net/manual/es/function.set-error-handler.php#74881">comentarios</a> de la documentación de PHP, podemos conseguir que los errores mostrados digan algo más que un simple &#8220;ha ocurrido un error, jodete!&#8221; y así poder cercarlo y solucionarlo <img src='http://www.coders.me/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>La función en cuestión es la siguiente:</p>
<pre class="brush: php;">function my_error_handler($errno, $errstr, $errfile, $errline){
  $errno = $errno &amp; error_reporting();
  if($errno == 0) return;
  if(!defined('E_STRICT'))            define('E_STRICT', 2048);
  if(!defined('E_RECOVERABLE_ERROR')) define('E_RECOVERABLE_ERROR', 4096);
  print &quot;&lt;pre&gt;\n&lt;b&gt;&quot;;
  switch($errno){
    case E_ERROR:               print &quot;Error&quot;;                  break;
    case E_WARNING:             print &quot;Warning&quot;;                break;
    case E_PARSE:               print &quot;Parse Error&quot;;            break;
    case E_NOTICE:              print &quot;Notice&quot;;                 break;
    case E_CORE_ERROR:          print &quot;Core Error&quot;;             break;
    case E_CORE_WARNING:        print &quot;Core Warning&quot;;           break;
    case E_COMPILE_ERROR:       print &quot;Compile Error&quot;;          break;
    case E_COMPILE_WARNING:     print &quot;Compile Warning&quot;;        break;
    case E_USER_ERROR:          print &quot;User Error&quot;;             break;
    case E_USER_WARNING:        print &quot;User Warning&quot;;           break;
    case E_USER_NOTICE:         print &quot;User Notice&quot;;            break;
    case E_STRICT:              print &quot;Strict Notice&quot;;          break;
    case E_RECOVERABLE_ERROR:   print &quot;Recoverable Error&quot;;      break;
    default:                    print &quot;Unknown error ($errno)&quot;; break;
  }
  print &quot;:&lt;/b&gt; &lt;i&gt;$errstr&lt;/i&gt;\n&quot;;
  if(function_exists('debug_backtrace')){
    //print &quot;backtrace:\n&quot;;
    $backtrace = debug_backtrace();
    array_shift($backtrace);
    foreach($backtrace as $i=&gt;$l){
      print &quot;[$i] in function &lt;b&gt;{$l['class']}{$l['type']}{$l['function']}&lt;/b&gt;&quot;;
      if($l['file']) print &quot; in &lt;b&gt;{$l['file']}&lt;/b&gt;&quot;;
      if($l['line']) print &quot; on line &lt;b&gt;{$l['line']}&lt;/b&gt;&quot;;
      print &quot;\n&quot;;
    }
  }
  print &quot;\n&lt;/pre&gt;&quot;;
  if(isset($GLOBALS['error_fatal'])){
    if($GLOBALS['error_fatal'] &amp; $errno) die('fatal');
  }
}

function error_fatal($mask = NULL){
  if(!is_null($mask)){
      $GLOBALS['error_fatal'] = $mask;
  }elseif(!isset($GLOBALS['die_on'])){
      $GLOBALS['error_fatal'] = 0;
  }
  return $GLOBALS['error_fatal'];
}</pre>
<h2>¿Como se usa?</h2>
<p>Muy fácil:</p>
<pre class="brush: php;">set_error_handler('my_error_handler');</pre>
<p><strong>set_error_handler</strong> se encarga de enviar todos los errores a la función <strong>my_error_handler</strong>, la cual parsea, formatea e imprime en pantalla los errores.</p>
<p>Veamos la diferencia:</p>
<p><strong>Sin la función de errores:</strong></p>
<pre class="brush: php;">Fatal error: Un extraño error ha ocurrido. No le daré más información. in C:\AppServ\www\errores\db.php on line 9</pre>
<p><strong>Con la función de errores:</strong></p>
<pre class="brush: php;">User Error: Un extraño error ha ocurrido. No le daré más información.
[0] in function trigger_error in C:\AppServ\www\errores\db.php on line 9
[1] in function tierno_y_jugueton in C:\AppServ\www\errores\db.php on line 4
[2] in function dulce_conejito in C:\AppServ\www\errores\index.php on line 8</pre>
<p>Los números iniciales, significan el grado de &#8220;profundidad&#8221; del error. En este ejemplo, <strong>trigger_error</strong> está dentro de la función <strong>tierno_y_jugueton</strong>, que a su vez está dentro de la función <strong>dulce_conejito</strong>, que fué llamada desde index.php en la línea 8.</p>
<p>Puedes <a rel="nofollow" href="http://www.coders.me/ejemplos/errores-php/errores.zip">descargar el ejemplo</a> y comprobarlo tu mismo!</p>
<p>Realmente esto es muy útil de tener en cuenta para <strong>debuguear</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.coders.me//lang/en/php/errores-donde-cuando-y-porque/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Validar E-mails con PHP</title>
		<link>http://www.coders.me//lang/en/php/validar-e-mails-con-php</link>
		<comments>http://www.coders.me//lang/en/php/validar-e-mails-con-php#comments</comments>
		<pubDate>Fri, 15 Aug 2008 19:40:18 +0000</pubDate>
		<dc:creator>Amir</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[validar]]></category>
		<category><![CDATA[validar email]]></category>
		<category><![CDATA[validar mails]]></category>

		<guid isPermaLink="false">http://www.coders.me/?p=245</guid>
		<description><![CDATA[<img src="http://www.coders.me/wp-content/uploads/2008/08/php-48x48.jpg" width="48" height="48" alt="" title="PHP" /><br/><p>Muchas veces en nuestros desarrollos nos toca validar campos y uno de los más importantes es el campo de &#8220;Email&#8221;.</p>
<h2>La típica forma &#8220;expresiones&#8221;</h2>
<p>
La típica forma de realizar esto es buscando caracteres inválidos dentro de la cadena&#8230;<br />
Hace poco tiempo, salió en…</p>]]></description>
			<content:encoded><![CDATA[<img src="http://www.coders.me/wp-content/uploads/2008/08/php-48x48.jpg" width="48" height="48" alt="" title="PHP" /><br/><p>Muchas veces en nuestros desarrollos nos toca validar campos y uno de los más importantes es el campo de &#8220;Email&#8221;.</p>
<h2>La típica forma &#8220;expresiones&#8221;</h2>
<p>
La típica forma de realizar esto es buscando caracteres inválidos dentro de la cadena&#8230;<br />
Hace poco tiempo, salió en la red el sitio emailvalido.com, dentro del cual colocabas tu e-mail  y te decía si era valido o no.
</p>
<p>
Me llamó mucho la atención, ¿Cómo hace esto?, estuve investigando y me acordé que los servidores smtp tienen dos comandos &#8220;vrfy&#8221; y &#8220;expn&#8221; pero por seguridad estos se encuentran deshabilitados, ¿entonces cómo verificar un mail?
</p>
<p>
mediante RCPT TO, cuando se introduce un email valido que existe en el sistema este responde con un código numérico (250).
</p>
<p>
Por eso me he montado una clase, que espero que les pueda ser útil a la hora de checar mails
</p>
<pre class="brush: php;">
/**
 * Clase para validar mails (http://www.coders.me - Coders community)
 *
 * Esta clase corre unicamente sobre Linux y  PHP5
 * (siempre  y cuando esté activado el modulo de sockets en PHP)
 * para más información relativa a este código visite: http://www.coders.me
 * http://www.rfc-es.org/rfc/rfc1869-es.txt
 *

 * @author 	Amir Canto Palomo &lt;amircanto@hotmail.com&gt;
 * @copyright  validEmail Class  2008-02-23
 * @version 1.3
 * @todo Hacer que la clase pueda contactar con servidores SMTP que soporten SSL
 * @license MIT

  The MIT License
  Copyright (c) 2008 www.coders.me 

  Permission is hereby granted, free of charge, to any person
  obtaining a copy of this software and associated documentation
  files (the &quot;Software&quot;), to deal in the Software without
  restriction, including without limitation the rights to use,
  copy, modify, merge, publish, distribute, sublicense, and/or sell
  copies of the Software, and to permit persons to whom the
  Software is furnished to do so, subject to the following
  conditions:

  The above copyright notice and this permission notice shall be
  included in all copies or substantial portions of the Software.

  THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND,
  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
  OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
  HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
  WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  OTHER DEALINGS IN THE SOFTWARE.
 */

define(&quot;CRLF&quot;,&quot;\r\n&quot;);		// [ENTER]
define(&quot;PORT&quot;,&quot;25&quot;);  		// SMTP PORT.

Class ValidEmail
{
	private $mail;
	private $user;
	private $domain;

	public function validate()
	{
		if($sock = $this-&gt;connectSMTP())
		{
			if($this-&gt;getResponse($sock) == &quot;220&quot;)
			{
				$this-&gt;writeData($sock,&quot;EHLO &quot;.$this-&gt;domain.CRLF);
				// echo &quot;Mandando helo $this-&gt;domain\n&quot;;
				if($this-&gt;getResponse($sock) == &quot;250&quot;)
				{
					$this-&gt;writeData($sock,&quot;HELO &quot;.$this-&gt;domain.CRLF);
					if($this-&gt;getResponse($sock) == &quot;250&quot;)
					{
						$this-&gt;writeData($sock,&quot;MAIL FROM: $this-&gt;user@&quot;.$this-&gt;domain.CRLF);
						if($this-&gt;getResponse($sock) == &quot;250&quot;)
						{

							$this-&gt;writeData($sock,&quot;RCPT TO: &quot;.$this-&gt;user.&quot;@&quot;.$this-&gt;domain.CRLF);
							if($this-&gt;getResponse($sock) == &quot;250&quot;)
							{
								// echo &quot;email valido\n&quot;;
								$this-&gt;writeData($sock,&quot;QUIT&quot;.CRLF);
								$this-&gt;socketClose($sock);
								return 1; // valid email
							}
						}
					}
				}
			}
		}
		return 0;
	}

	private function socketClose($socket)
	{
		socket_close($socket);
	}

	private function writeData($socket,$data)
	{
		if($socket)
		{
			if(socket_write($socket,$data,strlen($data)))
			{
				return 1;
			} 

		}
		return 0;
	}
	private function getResponse($socket)
	{
		if($socket)
		{
			// echo &quot;Esperando respuesta\n&quot;;
			$response = socket_read($socket,2048);
			// echo &quot;respuesta: $response\n&quot;;
			if(strlen($response) &gt; 0 )
			{

				//echo $response;
				$rescode = $response[0].$response[1].$response[2];

				return $rescode;
			}
		}
	}
	private function connectSMTP()
	{

		if( function_exists(&quot;socket_create&quot;) &amp;&amp; function_exists('socket_connect') )  //Ok.. existen las funciones..
		{

			if( empty($this-&gt;domain) || ($this-&gt;domain == &quot;&quot;) ) $this-&gt;extractData();
			if($sock = socket_create(AF_INET,SOCK_STREAM,SOL_TCP))
			{

				$mxrecords = $this-&gt;getMxRecords();
				/*echo count($mxrecords).&quot;\n&quot;;
				echo &quot;records:&quot;.(int)$mxrecords.&quot;\n&quot;;
				print_r($mxrecords);*/
				if(isset($mxrecords) &amp;&amp; (int)$mxrecords &gt; 0 )
				{
					if($this-&gt;validString() )
					{
						foreach($mxrecords as $records)
						{
							if(isset($records) &amp;&amp; $records != &quot;&quot;)
							{
								// echo &quot;Conectando con: $records \n&quot;;
								$address = gethostbyname($records);
								if($address != $records)
								{

									if(socket_connect($sock,$address,PORT))
									{
										// echo &quot;conectado&quot;;
										return  $sock; //Conected <img src='http://www.coders.me/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  devolvemos el handle
									}
								}
							}

							}
					} else return 0;
				} else return 0;
			}

		}
		return 0; // no logramos conectar / something has failed.. we cannot connect.
	}
	public function validString()
	{

		$email = $this-&gt;mail;
		if( eregi( &quot;^([a-z0-9._]+)@([a-z0-9.-_]+).([a-z]{2,4})$&quot;, $email) )
		{
			return 1;
		}
		return 0;
	}

	public function getMxRecords()
	{
		$dominio = $this-&gt;domain;
		if( isset($dominio) &amp;&amp; ($dominio != &quot;&quot;) )
		{
			if(getmxrr($dominio,$records))
			{
				if(count($records) &gt; 0)	// hay mx records...
				{
					return $records;
				}
				else 	// NO hay MX records.. entonces usamos el dominio para conectar.
				{
					return $dominio; // retornamos el dominio tal cual..
				}
			} else
			{
				return 0; // algo fallo... no pudimos conectar
			}
		}
		return 0; // de nueva cuenta algo falló...
	}
	private function extractData()
	{
		$data = explode(&quot;@&quot;,strtolower($this-&gt;mail));
		$this-&gt;user = $data[0];
		$this-&gt;domain = $data[1];
	}

	function __construct($email)
	{
		$this-&gt;mail = $email;
		$this-&gt;extractData();
	}
}
</pre>
<h2>Pequeña explicación de la clase</h2>
<p>
Lo que hace esta clase es al crear el objeto y pasarle el mail para despues llamar a las funciones correspondientes es:
</p>
<ul>
<li>
Validar la cadena y verificar si tiene caracteres invalidos
</li>
<li>Buscar el servidor smtp usando los registros mx obtenidos mediante el dominio del mail.</li>
<li>Conectar al servidor smtp si no puede intenta con el siguiente registor MX.</li>
<li>Una vez conectado comienza a interactuar con el servidor y le manda el mail usando RCPT TO: y espera la respuesta con el código 250 (que significa que el servidor validó correctamente el e-mail)</li>
</ul>
<h2>Uso de la clase</h2>
<pre class="brush: php;">
$validar = new ValidEmail(&quot;correo@micorreo.com&quot;);
if($validar-&gt;validString())	 // el email tiene caracteres validos
{
	echo &quot;el email tiene caracteres validos&quot;;
	if($validar-&gt;validate())	// Ahora comprobamos que exista la cuenta en el servidor.
	{
		echo &quot;el dominio es valido&quot;;
	}
}
</pre>
<p>
Las dos funciones aquí importantes son &#8220;validString()&#8221; y &#8220;validate()&#8221;
 </p>
<h2>validString()</h2>
<p>Si queremos validar solamente los caracteres del mail podemos usar unicamente esta funcion, si la cadena esta limpia devuelve true y si tiene caracteres invalidos devuelve false.
</p>
<h2>validate()</h2>
<p>La función <strong>validate()</strong> será la forma de validar mediante el servidor smtp, devuelve true si el mail es invalido, false en caso contrario.</p>
<h2>¿Por qué no usar la función validString() dentro de validate()?</h2>
<p>
Por que no todos vamos a querer validar mails de las dos formas de una sola vez, habrá quien solo quiera verificar los caracteres.
</p>
<h2>Errores</h2>
<p>
Hasta ahora solo he testeado la clase 2 o 3 veces. Por lo que si alguien encuentra algún error sería bueno que nos lo comente.
</p>
<h2>Errores conocidos</h2>
<p>
Por el momento la clase solo puede validar mails en los cuales los servidores smtp no estén configurados para usar SSL.
</p>
<h2>Descargar</h2>
<p>Si quieres descargar el código fuente y los archivos de ejemplo puedes hacerlo <a href="http://www.coders.me/ejemplos/validmail/validmail.zip">aqui</a>.</p>
<h2>Actualizaciones:</h2>
<p>Bugs fixeados:</p>
<ul>
<li> MX Records, cuando el dominio es invalido y no hay records devuelve 0 y el parámetro es pasado al foreach y por lo tanto falla</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.coders.me//lang/en/php/validar-e-mails-con-php/feed</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>Introducción a los Sockets BSD en PHP.</title>
		<link>http://www.coders.me//lang/en/general/introduccion-a-los-sockets-bsd-en-php</link>
		<comments>http://www.coders.me//lang/en/general/introduccion-a-los-sockets-bsd-en-php#comments</comments>
		<pubDate>Fri, 28 Mar 2008 16:13:36 +0000</pubDate>
		<dc:creator>Amir</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[sockets]]></category>

		<guid isPermaLink="false">http://www.algoritmatica.com/general/introduccion-a-los-sockets-bsd-en-php</guid>
		<description><![CDATA[<img src="http://www.coders.me/wp-content/uploads/2008/09/general-48x48.jpg" width="48" height="48" alt="" title="General" /><br/><h3>¿Qué es un socket?</h3>
<p>Un socket es un punto de comunicación entre dos máquinas.</p>
<h3>Modelo Cliente-Servidor</h3>
<p align="center"> <a href="http://www.coders.me/general/introduccion-a-los-sockets-bsd-en-php/attachment/cliente-servidor/" rel="attachment wp-att-142" title="Cliente-servidor"></a><br />
Tipicamente los sockets BSD consisten en dos niveles de procesos de aplicación separados; un proceso (el cliente) realiza una conexión mientras que el segundo proceso (servidor) las…</p>]]></description>
			<content:encoded><![CDATA[<img src="http://www.coders.me/wp-content/uploads/2008/09/general-48x48.jpg" width="48" height="48" alt="" title="General" /><br/><h3>¿Qué es un socket?</h3>
<p>Un socket es un punto de comunicación entre dos máquinas.</p>
<h3>Modelo Cliente-Servidor</h3>
<p align="center"> <a href="http://www.coders.me/general/introduccion-a-los-sockets-bsd-en-php/attachment/cliente-servidor/" rel="attachment wp-att-142" title="Cliente-servidor"><img src="http://www.coders.me/wp-content/uploads/2008/03/cliente-servidor.gif" alt="Cliente-servidor" border="0" /></a><br />
Tipicamente los sockets BSD consisten en dos niveles de procesos de aplicación separados; un proceso (el cliente) realiza una conexión mientras que el segundo proceso (servidor) las acepta, a esto se le conoce como Modelo Cliente – Servidor.</p>
<p><span id="more-143"></span></p>
<h3>Tipos de Sockets</h3>
<ul>
<li>Sockets STREAM<br />
<blockquote><p>Este tipo de socket permite trabajar realizando/esperando conexiones  a puertos TCP.</p></blockquote>
</li>
<li>DATAGRAM<br />
<blockquote><p>Lo mismo que el anterior pero trabajando con paquetes UDP</p></blockquote>
</li>
<li>RAW<br />
<blockquote><p>O mejor conocidos como de bajo nivel, permiten trabajar con las cabeceras IP, TCP, UDP, construir nuestros propios packetes etc.. Por desgracia no veremos su implementación.</p></blockquote>
</li>
</ul>
<h3>Implementación en PHP.</h3>
<p>PHP no sólo nos ofrece la función <em>“fsockopen”</em> para tratar con sockets, también nos permite trabajar con <strong>Sockets BSD</strong>, del cuál he visto muy poca información.</p>
<h3>Instalación en Linux</h3>
<p>Por fortuna para los usuarios de Linux los sockets BSD ya vienen habilitados, y si no, tendremos que recompilar nuestro php con la opción <em>“—socket”</em>.</p>
<h3>Instalación en Windows</h3>
<p>Para los usuarios de Windows  PHP no trae la extensión habilitada.<br />
Para habilitar los sockets bsd seguir los siguientes 4 pasos:</p>
<ol>
<li> Ir a la carpeta donde está instalado php y abrir el fichero “php.ini”.</li>
<li> Buscar la línea ;extension=php_sockets.dll y remover el punto y coma que tiene al principio.</li>
<li> Buscar la línea que contiene el directorio de extensiones php “extension_dir” y verificar que en la ruta declarada se encuentre la librería “php_sockets.dll”.</li>
<li> Salvar los cambios en el php.ini.</li>
</ol>
<p>Ya que tenemos habilitados los sockets en PHP sea en Windows o Linux nos dedicaremos ahora a su implementación! (Lo que tanto hemos esperado muchachos!)</p>
<h3>Ejemplo de Cliente.</h3>
<p>Me pondría a explicar cada una de las funciones con sus prototipos para que todos pudieramos entender pero  sería  muy aburrido y pienso que es más fácil comprender/aprender con un buen  código por lo tanto aquí les dejo un ejemplo de cómo conectar con  algoritmatica</p>
<pre class="brush: php;"> $sock = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
// Creamos un socket con socket_create, le pasamos como primer parámetro la constante del tipo de dominio a utilizar, luego el tipo de socket (SOCK_STREAM, SOCK_DGRAM, SOCK_RAW) y por ultimo el protocolo
$result = socket_connect($sock,gethostbyname(“www.algoritmatica.com”),80);
// Pasamos como primer parámetro el descriptor del socket creado, usamos gethostbyname para resolver el nombre de dominio (host) y por último indicamos que queremos conectar al puerto 80
// Creamos la petición HTTP
$header .= “HEAD / HTTP/1.0\r\n”;
$header .= “Host: www.algoritmatica.com”;
$header .= “Connection:Close”;
socket_write($sock,$header,strlen($header));
// Pasamos como primer parámetro el descriptor de socket, la petición http y su tamaño en bytes usando la función strlen.
while($respuesta = socket_read($sock,2048))
// Esperamos la respuesta  y los datos.
{
echo $respuesta;
}
socket_close($sock);
// Cerramos socket y conexión.
</pre>
<h3>Ejemplo de servidor</h3>
<p>Este ejemplo está extraído de la referencia de PHP <img src='http://www.coders.me/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  (que todos deberíamos tener a la hora de programar&#8230; agradezco el código!)</p>
<pre class="brush: php;">
set_time_limit(0);
ob_implicit_flush();

$address = '192.168.1.3';
$port = 10000;

if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) &lt; 0) {
  echo &quot;socket_create() failed: reason: &quot; . socket_strerror($sock) . &quot;\n&quot;;
}

if (($ret = socket_bind($sock, $address, $port)) &lt; 0) {
  echo &quot;socket_bind() failed: reason: &quot; . socket_strerror($ret) . &quot;\n&quot;;
}

if (($ret = socket_listen($sock, 5)) &lt; 0) {
  echo &quot;socket_listen() failed: reason: &quot; . socket_strerror($ret) . &quot;\n&quot;;
}

do {
  if (($msgsock = socket_accept($sock)) &lt; 0) {
    echo &quot;socket_accept() failed: reason: &quot; . socket_strerror($msgsock) . &quot;\n&quot;;
    break;
  }
  /* Send instructions. */
  $msg = &quot;\nWelcome to the PHP Test Server. \n&quot; .
  &quot;To quit, type 'quit'. To shut down the server type 'shutdown'.\n&quot;;
  socket_write($msgsock, $msg, strlen($msg));

  do {
    if (false === ($buf = socket_read($msgsock, 2048, PHP_NORMAL_READ))) {
      echo &quot;socket_read() failed: reason: &quot; . socket_strerror($ret) . &quot;\n&quot;;
      break 2;
    }
    if (!$buf = trim($buf)) {
      continue;
    }
    if ($buf == 'quit') {
      break;
    }
    if ($buf == 'shutdown') {
      socket_close($msgsock);
      break 2;
    }
    $talkback = &quot;PHP: You said '$buf'.\n&quot;;
    socket_write($msgsock, $talkback, strlen($talkback));
    echo &quot;$buf\n&quot;;
  } while (true);
  socket_close($msgsock);

} while (true);

socket_close($sock);
</pre>
<h3>Fin</h3>
<p>He dado una pequeña introducción a los sockets, el modelo cliente-servidor y sockets en PHP, sería interesante que para una próxima entrada escriba sobre sockets pero en C y su implementación en windows (winsockets).</p>
<blockquote><p><strong> ¿Algún comentario o sugerencia? cualquier cosa será bienvenida! no dejes de comentar!<br />
gracias.</strong></p></blockquote>
<p>Para mayor información:<br />
<a href="http://www.php.net/manual/es/ref.sockets.php">http://www.php.net/manual/es/ref.sockets.php</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.coders.me//lang/en/general/introduccion-a-los-sockets-bsd-en-php/feed</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>Código más bonito</title>
		<link>http://www.coders.me//lang/en/php/codigo-mas-bonito</link>
		<comments>http://www.coders.me//lang/en/php/codigo-mas-bonito#comments</comments>
		<pubDate>Wed, 26 Dec 2007 22:51:19 +0000</pubDate>
		<dc:creator>Eduardo</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[programacion]]></category>

		<guid isPermaLink="false">http://www.algoritmatica.com/general/codigo-mas-bonito</guid>
		<description><![CDATA[<img src="http://www.coders.me/wp-content/uploads/2008/08/php-48x48.jpg" width="48" height="48" alt="" title="PHP" /><br/><h3>Estilo de programación</h3>
<p>¿Te imaginas el código fuente de Linux, sin comentar, con lineas y espacios a mansalva, y usando funciones que solo Dios sabe que hacen?<br />
Proyectos grandes, y más los pequeños, se hacen difíciles de continuar por otras personas si…</p>]]></description>
			<content:encoded><![CDATA[<img src="http://www.coders.me/wp-content/uploads/2008/08/php-48x48.jpg" width="48" height="48" alt="" title="PHP" /><br/><h3>Estilo de programación</h3>
<p>¿Te imaginas el código fuente de Linux, sin comentar, con lineas y espacios a mansalva, y usando funciones que solo Dios sabe que hacen?<br />
Proyectos grandes, y más los pequeños, se hacen difíciles de continuar por otras personas si el código no está lo suficientemente bonito como para leerlo. No hablamos de comentar el código, ya que he visto la exageración de comentar cada linea de código lo cual se torna en un infierno para leer xD.</p>
<p>Hablamos de crear &#8220;código para lectura&#8221;, no sólo hacer que funcione sino también hacer que pueda ser leido fácilmente por los programadores.</p>
<p>A veces nos acostumbramos a programar y a hacer código a la ligera, olvidando la <strong>importancia de mantener un orden inteligente</strong> a través de las tabulaciones, los espacios y los saltos de línea. Este orden debe hacerse costumbre para aquellos programadores que deseen alcanzar la perfección (juaz).<br />
<span id="more-25"></span></p>
<p><script type="text/javascript"><!--
google_ad_client = "pub-6896919298908258";
/* Post Abajo Patrocinado Por (Grande) */
google_ad_slot = "5751554033";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></p>
<p>En este artículo hablaré exclusivamente de PHP ya que es uno de los lenguajes en el que más me molesta ver código mal formateado. Aunque como bien ustedes saben, se puede (se debe)(y frecuentemente es aplicado ) a otros lenguajes de programación similares como C y sus descendientes.</p>
<h3>Haciendo código más bonito?</h3>
<p>¿Por qué deberías embellecer tus creaciones?<br />
Sin duda es un paso importante para entender tu código y poder leerlo a &#8220;simple vista&#8221;. No hablamos sólo comentar el código, sino también de crear una correcta indentación y formateo de nuestro código.</p>
<p>Los buenos codes se leen tan fácilmente como si fueran un libro para niños. (creo que estoy exagerando <img src='http://www.coders.me/wp-includes/images/smilies/icon_biggrin.gif' alt=':grin:' class='wp-smiley' />  )</p>
<p>Embellecer el código es tan importante como escribirlo. Es más útil aún cuando trabajas en grupo, sobre todo cuando necesitas que algún compañero (más experto) &#8220;pueda ver tu código&#8221; y decirte donde está el error.</p>
<p>Se trata sobre todo de entender una manía que nos afecta a la mayoria de los programadores (incluyendome). No podemos leer un código (que no es nuestro) sin antes empezar a darle una indentacion correcta.</p>
<p>Es importante destacar, por si no sabias, que la indentación no es obligatoria ni necesaria para que un código funcione, ya que los compiladores rara vez le dan importancia a esto. Pero no por eso es menos importante.</p>
<h3>¿Que es la indentación?</h3>
<p>Según la wikipedia:</p>
<blockquote><p>Por indentación se entiende mover un bloque de texto hacia la derecha insertando espacios o tabuladores para separarlo del texto adyacente.</p></blockquote>
<p>Para dar un ejemplo, veamos un código no indentado, y uno correctamente indentado:</p>
<pre class="brush: php;">if(a == b){
echo &quot;a y b son iguales&quot;;
}</pre>
<p>El mismo código, pero aplicando indentación:</p>
<pre class="brush: php;">
if(a == b){
    echo &quot;a y b son iguales&quot;;
}
</pre>
<p>Se han creado &#8220;reglas&#8221; o &#8220;estándares&#8221; de código para &#8220;insertar esos espacios&#8221; en la derecha del código fuente ya que, si indentar supone solo agregar espacios a la derecha, cualquier diablo agregaria espacios a mansalva haciendo aún mas dificil la lectura de un código &#8220;indentado&#8221;.</p>
<p>Existen varios estilos mundialmente reconocidos, y propongo navegar por algunos de ellos para resaltar sus diferencias y poder elegir el que más nos guste.</p>
<h3>Estilo K&amp;R y BSD KNF</h3>
<p>El estilo K&amp;R es el más usado en el lenguaje C y PHP. Se trata de abrir la llave en la misma línea de declaración de la orden, indentando los siguientes pasos al mismo nivel que la llave y cerrando la llave en el mismo nivel que la declaración. Normalmente las tabulaciones en windows son de 4 espacios, cuando las tabulaciones tienen 8 espacios se trata del estilo BSD o KNF, muy usado en Linux.</p>
<p>Se entiende mejor con el siguiente ejemplo:</p>
<pre class="brush: php;">function saludar($val){
    if($val == 1) {
        echo &quot;Hola!&quot;;
    } else {
        echo &quot;Chau!&quot;;
    }
}
</pre>
<p>El código fuente del kernel de Unix y Linux está escrito en este estilo.</p>
<p>La <strong>ventaja</strong> de usar este estilo es que las llaves iniciales no necesitan ninguna línea extra para ellas solas, por lo que se ahorra espacio vertical de lectura.<br />
La desventaja de este estilo es que las llaves de cierre si necesitan una línea exclusiva para ellas.<br />
Resulta difícil identificar el comienzo de las llaves de un bloque. Sin embargo es fácil identificar el comienzo de un bloque debido a la indentación a la derecha.</p>
<h3>Estilo Allman</h3>
<p>Se trata de crear una nueva línea para las llaves, e identar el código debajo de ellas. La llave de cierre tiene el mismo identado que la de inicio.</p>
<pre class="brush: php;">function saludar($val)
{
    if($val == 1)
    {
        echo &quot;Hola!&quot;;
    }
    else
    {
        echo &quot;Chau!&quot;;
    }
}
</pre>
<p>Este estilo mantiene un código limpio y claro. Las llaves de inicio y fin coinciden en la misma columna, haciendo más fácil la identificación de cada bloque. Además, es más difícil olvidarse cerrar una llave cuando se identifica claramente la llave inicial.<br />
Personalmente uso este estilo en mis creaciones <img src='http://www.coders.me/wp-includes/images/smilies/icon_cool.gif' alt='8)' class='wp-smiley' /> .</p>
<p>La desventaja de este estilo, es que las llaves ocupan enteramente una línea, ocupando más espacio vertical de lectura. En monitores con resoluciones bajas (24 líneas) resulta difícil leer código fuente con este estilo aunque esto poco afecta en monitores con resoluciones mas grandes.</p>
<h3>Estilo GNU</h3>
<p>Parecido al estilo Allman, se trata de poner las llaves en una nueva línea. La diferencia es que las llaves, deben estar indentadas por 2 espacios, y el código dentro de ellas debe estarlo por 2 espacios más.</p>
<pre class="brush: php;">function saludar($val)
{
    if($val == 1)
      {
        echo &quot;Hola!&quot;;
      }
    else
      {
        echo &quot;Chau!&quot;;
      }
}
</pre>
<p>Algunas aplicaciones (como GNU Emacs) formatean el código a este estilo automáticamente. Es usado por los proyectos de software GNU debido a que se ha declarado un estándar dentro de esta comunidad.</p>
<h3>¿Y tu, que estilo usas?</h3>
<p>Comentanos cual es el estilo que usas para tu proyectos, y si tienes la mania (como yo) de indentar el código de otros a nuestro estilo <img src='http://www.coders.me/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  .</p>
<h3>Herramienta de indentación automática</h3>
<p><script type="text/javascript"><!--
google_ad_client = "pub-6896919298908258";
/* Post Abajo Patrocinado Por (Grande) */
google_ad_slot = "5751554033";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></p>
<p>Por suerte disponemos de una herramienta gratuita y online para indentar código en el estilo que más nos guste. Esta herramienta se puede encontrar en el siguiente enlace:<br />
<a href="http://formatter.gerbenvv.nl/version3/index.php">http://formatter.gerbenvv.nl/version3/index.php</a></p>
<p>Además de separar los bloques en nuestro estilo preferido, formatea el código agregando color, quitando comentarios y líneas vacías. Una herramienta que sin duda merece estar en nuestros favoritos.</p>
<p>Las opciones son muy intuitivas, aunque en breve voy a explicar que significa la opción &#8220;Comment after control structures&#8221;.</p>
<p>Otra herramienta para indentar código online, pero esta vez para HTML y CSS, puedes encontrarla aqui:<br />
<a href="http://tools.arantius.com/tabifier">http://tools.arantius.com/tabifier</a></p>
<h3>Cierres de bloques</h3>
<p>En ocasiones tenemos estructuras de control muy grandes (verticalmente) tanto es asi que al leer el final de ellas, perdemos de vista el principio obligándonos a tener que subir y bajar la página para poder leer el código.<br />
Por ello una buena costumbre es la de comentar al final de cada bloque, escribiendo en el comentario la misma declaración del inicio.</p>
<pre class="brush: php;">function saludar($val)
{
    if($val == 1)
    {
        echo &quot;Hola!&quot;;
    }
    else
    {
        echo &quot;Chau!&quot;;
    }//($val == 1)
}//function saludar($val)</pre>
<p>Aunque esto es exagerado para bloques pequeños, es de extrema utilidad para bloques con un tamaño considerablemente grande.<br />
La desventaja es que nos obliga a escribir el código dos veces (pero repito, solo es a modo de lectura, no afecta en nada el funcionamiento).</p>
<p>La opción &#8220;Comment after control structures&#8221; del indentador online, justamente realiza esta operación automáticamente con todas las estructuras de control.</p>
<p>Personalmente hago uso de estos comentarios cuando los if o bucles, son muy grandes y muy complicados.</p>
<h3>¿Indentar seteo de variables?</h3>
<p>Esto no es un estandar, mas bien es una recomendación personal, ustedes pueden decirme que les parece <img src='http://www.coders.me/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  .</p>
<p>Antes:</p>
<pre class="brush: php;">$nombre_temporal = $_FILES['Filedata']['tmp_name'];
$tamano_de_archivo = $_FILES['Filedata']['size'];
$realname = $_FILES['Filedata']['name'];
</pre>
<p>Despues [Indentado]:</p>
<pre class="brush: php;">$nombre_temporal    = $_FILES['Filedata']['tmp_name'];
$tamano_de_archivo  = $_FILES['Filedata']['size'];
$realname           = $_FILES['Filedata']['name'];
</pre>
<p>Sin duda se lee mejor de la segunda manera, queda más bonito, y se distinguen mejor las variables.<br />
También podemos hacer lo mismo con los parametros de funciones, cuando las lineas se repiten:</p>
<pre class="brush: php;">$site-&gt;set(&quot;descripcion&quot;, $descripcion);
$site-&gt;set(&quot;titulo&quot;     , $titulo);
$site-&gt;set(&quot;enabled&quot;    , $enabled);
$site-&gt;set(&quot;notenabled&quot; , $notenabled);
</pre>
<h3>Creando bloques de código</h3>
<p>Otra recomendación mia, es la de usar bloques de código para identificar rápidamente el significado de unas lineas de proceso. En el siguiente ejemplo, se verifica si el usuario tiene los permisos para acceder a la pagina. Nótese como se han encerrado las lineas entre corchetes {} sin pertenecer estas, a un condicional.</p>
<pre class="brush: php;">
{//Login Check
    if(!$login-&gt;logged() &amp;&amp; !$login-&gt;isadmin())
    {
        $site-&gt;template('login');
        exit(0);
    }
}//End Login Check
</pre>
<p>Recomiendo hacer uso de esta técnica siempre que se pueda, ayuda bastante a la hora de leer el código. <img src='http://www.coders.me/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h3>¿Y tu como mejoras tu código?</h3>
<p>Cúentanos que haces para poder leer mejor tus códigos, y si tienes sugerencias o manías como nosotros xD.</p>
<h3>Bibliografía</h3>
<p>Indentación automática (autotabulacion de código php): <a href="http://formatter.gerbenvv.nl/version3/index.php">http://formatter.gerbenvv.nl/version3/index.php</a><br />
<a href="http://en.wikipedia.org/wiki/Indent_style">http://en.wikipedia.org/wiki/Indent_style</a><br />
<a href="http://es.wikipedia.org/wiki/Estilo_de_programación">http://es.wikipedia.org/wiki/Estilo_de_programación</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.coders.me//lang/en/php/codigo-mas-bonito/feed</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
	</channel>
</rss>

