<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8081123338261260081</id><updated>2011-07-28T14:46:25.316-03:00</updated><category term='Buenas costumbres'/><category term='PHP 5'/><category term='Iteración'/><category term='Array'/><category term='MySQL'/><category term='Juegos'/><category term='POO'/><category term='Idioma'/><category term='Fechas'/><category term='Datos'/><category term='locale'/><category term='SPL'/><category term='Ejemplo'/><category term='Seguridad'/><category term='Funciones'/><category term='String'/><category term='CodeIgniter'/><category term='Formularios'/><category term='ubuntu'/><category term='Estructuras de Control'/><category term='Optimización'/><category term='Enteros'/><category term='Archivos'/><title type='text'>Desarrollo PHP</title><subtitle type='html'>Recopilación de consejos y técnicas de programación en PHP</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://desarrollophp.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://desarrollophp.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>seppo0010</name><uri>http://www.blogger.com/profile/02504022684566719870</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/-MZycJmm2nSM/TcRjh31LGOI/AAAAAAAAAEM/-VPfMm21vQo/s220/avatar.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>34</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8081123338261260081.post-9216873294842266985</id><published>2010-02-22T11:32:00.001-03:00</published><updated>2010-02-22T11:32:42.913-03:00</updated><title type='text'>Charlas PHP</title><content type='html'>El Grupo PHP, comunidad de usuarios PHP de Argentina, se complace en ofrecer las primeras charlas organizadas en el marco de su ciclo de conferencias. En este evento, se ofrecerán una diversidad de tópicos con el objetivo de compartir conocimiento, y afianzar los lazos de la comunidad. La agenda de tópicos incluye charlas introductorias, intermedias, y avanzadas.&lt;br /&gt;&lt;br /&gt;La reunión se realizará el Sábado 6 de Marzo, de las 9:30 a las 15:00, en el Hotel Las Naciones, Corrientes 818, piso 2. La pre-inscripción al evento es obligatoria.&lt;br /&gt;&lt;br /&gt;Para ver la agenda detallada e inscribirse acceder a:&lt;br /&gt;&lt;br /&gt;http://grupophp1.eventbrite.com&lt;br /&gt;&lt;br /&gt;Más información sobre el Grupo PHP en:&lt;br /&gt;&lt;br /&gt;http://grupophp.com.ar&lt;br /&gt;&lt;br /&gt;¡Los esperamos!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8081123338261260081-9216873294842266985?l=desarrollophp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://grupophp1.eventbrite.com' title='Charlas PHP'/><link rel='replies' type='application/atom+xml' href='http://desarrollophp.blogspot.com/feeds/9216873294842266985/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8081123338261260081&amp;postID=9216873294842266985&amp;isPopup=true' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/9216873294842266985'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/9216873294842266985'/><link rel='alternate' type='text/html' href='http://desarrollophp.blogspot.com/2010/02/charlas-php.html' title='Charlas PHP'/><author><name>seppo0010</name><uri>http://www.blogger.com/profile/02504022684566719870</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/-MZycJmm2nSM/TcRjh31LGOI/AAAAAAAAAEM/-VPfMm21vQo/s220/avatar.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8081123338261260081.post-1525862266286326242</id><published>2009-12-09T10:59:00.004-03:00</published><updated>2009-12-09T11:05:48.673-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Idioma'/><category scheme='http://www.blogger.com/atom/ns#' term='locale'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Locale en Ubuntu</title><content type='html'>Usar setlocale no es fácil. Hay que saber el nombre exacto del paquete de idioma que queremos usar.&lt;br /&gt;&lt;br /&gt;En ubuntu, para ver la lista de opciones disponibles podemos hacer "locale -a". Para instalar un lenguaje nuevo, "apt-get install language-pack-**-base" y luego reiniciar el apache.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8081123338261260081-1525862266286326242?l=desarrollophp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://desarrollophp.blogspot.com/feeds/1525862266286326242/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8081123338261260081&amp;postID=1525862266286326242&amp;isPopup=true' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/1525862266286326242'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/1525862266286326242'/><link rel='alternate' type='text/html' href='http://desarrollophp.blogspot.com/2009/12/locale-en-ubuntu.html' title='Locale en Ubuntu'/><author><name>seppo0010</name><uri>http://www.blogger.com/profile/02504022684566719870</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/-MZycJmm2nSM/TcRjh31LGOI/AAAAAAAAAEM/-VPfMm21vQo/s220/avatar.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8081123338261260081.post-7342934887954923470</id><published>2008-06-05T11:40:00.000-03:00</published><updated>2008-06-05T11:41:33.919-03:00</updated><title type='text'></title><content type='html'>Buen sitio: &lt;a href="http://www.phpbench.com/"&gt;http://www.phpbench.com/&lt;/a&gt; (en inglés)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8081123338261260081-7342934887954923470?l=desarrollophp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://desarrollophp.blogspot.com/feeds/7342934887954923470/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8081123338261260081&amp;postID=7342934887954923470&amp;isPopup=true' title='5 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/7342934887954923470'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/7342934887954923470'/><link rel='alternate' type='text/html' href='http://desarrollophp.blogspot.com/2008/06/buen-sitio-httpwww.html' title=''/><author><name>seppo0010</name><uri>http://www.blogger.com/profile/02504022684566719870</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/-MZycJmm2nSM/TcRjh31LGOI/AAAAAAAAAEM/-VPfMm21vQo/s220/avatar.png'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8081123338261260081.post-6599310770423783048</id><published>2008-03-04T21:25:00.009-02:00</published><updated>2008-03-04T22:01:03.677-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ejemplo'/><category scheme='http://www.blogger.com/atom/ns#' term='CodeIgniter'/><title type='text'>Un ejemplo de modelos</title><content type='html'>En unas pocas horas creé una trivia en CodeIgniter que permite mandar preguntas y contestar las que otros usuarios envíaron.&lt;br /&gt;&lt;br /&gt;El código es simple, pero lo interesante que quiero mostrar es el funcionamiento de los modelos. En application/libraries/MY_Model.php se extiende la definición de los modelos. Ahí tenemos los métodos "get", "fetchlist" y "count" que reciben el tipo de objeto y después un array con los filtros que se quieren aplicar.&lt;br /&gt;&lt;br /&gt;¿Cómo se traducen los filtros?&lt;br /&gt;En general, los filtros son condiciones de base de datos. Pero también se permiten "limit", "start", "orderby" y "orderbydir" que son para limitar la cantidad de registro, cambiar el inicio (offset), la columna por la que se ordena y la forma (ASC/DESC), respectivamente.&lt;br /&gt;Y aún más, se pueden definir filtros propios en cada modelo. Con definir un método filter se pueden establecer condiciones propias. El método recibe tres argumentos: tipo de objeto, clave y valor. La función debe devolver TRUE en caso de que tenga un manejo propio del filtro o FALSE si no. En el ejemplo, se puede ver esto en el modelo "trivia".&lt;br /&gt;&lt;br /&gt;¿Qué otros métodos tenemos definidos para los modelos?&lt;br /&gt;Los métodos save, update, insert y delete reciben un objeto y lo guardan en la base de datos. Estos objetos deben ser objetos que extiendan a la clase Data_object, ser prefijados con "obj_" y llamarse como la tabla que le corresponde. Cada uno debe definir los atributos que se guardarán en las columnas de la base de datos.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://neonetsi.com.ar/seppo/desarrollophp/trivia.zip"&gt;Descargar ejemplo&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8081123338261260081-6599310770423783048?l=desarrollophp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://desarrollophp.blogspot.com/feeds/6599310770423783048/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8081123338261260081&amp;postID=6599310770423783048&amp;isPopup=true' title='6 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/6599310770423783048'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/6599310770423783048'/><link rel='alternate' type='text/html' href='http://desarrollophp.blogspot.com/2008/03/un-ejemplo-de-modelos.html' title='Un ejemplo de modelos'/><author><name>seppo0010</name><uri>http://www.blogger.com/profile/02504022684566719870</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/-MZycJmm2nSM/TcRjh31LGOI/AAAAAAAAAEM/-VPfMm21vQo/s220/avatar.png'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8081123338261260081.post-6175178606630488098</id><published>2008-02-26T23:43:00.003-02:00</published><updated>2008-02-26T23:45:21.773-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Optimización'/><title type='text'>Cacheando datos</title><content type='html'>Si estamos buscando la forma de mejorar la performance de nuestro sitio web, el caché es la clave.&lt;br /&gt;&lt;br /&gt;Hay muchas formas de hacerlo, lo más común es cachear páginas enteras, pero a veces esto no es posible. En estos casos, lo principal es localizar los procesos más lentos y tratar de guardar su resultado. Para ello, lo mejor es usar &lt;a href="http://www.php.net/manual/es/ref.memcache.php"&gt;memcache&lt;/a&gt; que nos permite guardar una variable (serializada, como string) y recuperarla muy rápidamente.&lt;br /&gt;&lt;br /&gt;Cómo solución más genérica se puede implementar una clase que reciba y guarde datos, permitiendo cambiar la forma de hacerlo (memcache, base de datos, archivos) por si es necesario migrar el código a un servidor que no cuenta con la tecnología necesaria.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8081123338261260081-6175178606630488098?l=desarrollophp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://desarrollophp.blogspot.com/feeds/6175178606630488098/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8081123338261260081&amp;postID=6175178606630488098&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/6175178606630488098'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/6175178606630488098'/><link rel='alternate' type='text/html' href='http://desarrollophp.blogspot.com/2008/02/cacheando-datos.html' title='Cacheando datos'/><author><name>seppo0010</name><uri>http://www.blogger.com/profile/02504022684566719870</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/-MZycJmm2nSM/TcRjh31LGOI/AAAAAAAAAEM/-VPfMm21vQo/s220/avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8081123338261260081.post-7951268853972065291</id><published>2008-02-24T16:02:00.004-02:00</published><updated>2008-02-24T16:08:55.010-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CodeIgniter'/><title type='text'>Sobreviviendo sin parámetros GET</title><content type='html'>CodeIgniter no permite el uso de variables GET por defecto, para permitir las "URLs amigables". Sin embargo, todavía se pueden pasar parámetros.&lt;br /&gt;&lt;br /&gt;Supongamos un foro, y queremos pasar el número de tema para mostrar los comentarios. En PHP clásico haríamos una URL ver_tema.php?tema_id=1234 pero en CI, en cambio, podemos hacer tema/ver/1234. Entonces el controller es tema, el método ver y un parámetro adicional es 1234.&lt;br /&gt;&lt;br /&gt;¿Cómo recuperamos el valor de este parámetro?&lt;br /&gt;Tenemos dos opciones. Podemos definirlo como parámetro del método ver o a través de la clase URI.&lt;br /&gt;La primer alternativa sería algo así&lt;br /&gt;&lt;br /&gt;function ver($id = 0)&lt;br /&gt;{&lt;br /&gt;  // y ya está definida $id&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;La segunda opción es&lt;br /&gt;&lt;br /&gt;function ver()&lt;br /&gt;{&lt;br /&gt;  $id = $this-&gt;uri-&gt;segment(3);&lt;br /&gt;  // y ya está definida $id&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;La primera parece más linda, ¿no? Quizás a alguien le llame la atención el = 0 en el parámetro... cómo el usuario define la URL que visita puede no enviar el parámetro y esto generaría un error fatal de PHP, irrecuperable. De esta forma podemos hacer que si el id es vacío, el usuario sea redirigido a una página de error o a la lista de temas... Básicamente, fallar con gracia.&lt;br /&gt;&lt;br /&gt;Este caso es simple. Sin embargo se complica más cuando los parámetros son múltiples. Por ejemplo, para paginar el tema que estamos mostrando, podemos agregar un cuarto parámetro, quedando&lt;br /&gt;&lt;br /&gt;function ver($id = 0, $pagina = 1)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Pero las cosas se pueden complicar todavía más, cuando hay múltiples parámetros y no necesariamente un orden de importancia (en el caso anterior, siempre se necesita un ID, pero no siempre un número de página).&lt;br /&gt;Supongamos un formulario de búsqueda avanzado, dentro del mismo foro. Además de palabras clave, podemos seleccionar un rango de fecha y un usuario en particular. Si tratamos de aplicar el mismo criterio, llegaríamos a algo tan confuso como&lt;br /&gt;&lt;br /&gt;function buscar($palabras_clave = '', $desde_fecha = '', $hasta_fecha = '', $usuario = 0)&lt;br /&gt;{&lt;br /&gt;  // ...&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Lo que parece más molesto que amigable. Hay varias posibles soluciones.&lt;br /&gt;&lt;br /&gt;Sesiones&lt;br /&gt;Una posible variante es envíar el formulario a una página que lo guarde en la sesión y luego poder navegar sabiendo que buscó a través de los datos de sesión. Contra: si un usuario hace dos búsquedas no las puede "navegar" (entrar a temas y volver, o utilizar la paginación) en forma simultanea. Contra II: no se puede compartir o guardar como favoritos la página de resultados de la búsqueda.&lt;br /&gt;&lt;br /&gt;Uri Assoc&lt;br /&gt;Si bien no podemos hacer resultados_busqueda.php?palabras_clave=...&amp;amp;desde_fecha=...&amp;amp;hasta_fecha=... podemos hacer una URI asociativa y utilizar busqueda/resultados/palabras_clave/.../desde_fecha/.../hasta_fecha/... y luego aprovechar el método uri_to_assoc de la clase URI para lograr un array asociativo simple.&lt;br /&gt;&lt;br /&gt;Hash&lt;br /&gt;Por último, podemos utilizar la URI para mandar un identificador de la búsqueda. Por ejemplo busqueda/resultados/bda90d48eda6d07d961b3ec26216fe05 y guardar en nuestra base de datos que criterios significan "bda90d48eda6d07d961b3ec26216fe05".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8081123338261260081-7951268853972065291?l=desarrollophp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://desarrollophp.blogspot.com/feeds/7951268853972065291/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8081123338261260081&amp;postID=7951268853972065291&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/7951268853972065291'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/7951268853972065291'/><link rel='alternate' type='text/html' href='http://desarrollophp.blogspot.com/2008/02/sobreviviendo-sin-parmetros-get.html' title='Sobreviviendo sin parámetros GET'/><author><name>seppo0010</name><uri>http://www.blogger.com/profile/02504022684566719870</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/-MZycJmm2nSM/TcRjh31LGOI/AAAAAAAAAEM/-VPfMm21vQo/s220/avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8081123338261260081.post-2389166758249077653</id><published>2008-02-16T12:53:00.000-02:00</published><updated>2008-02-16T12:54:04.801-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CodeIgniter'/><title type='text'>Lo primero que hay que saber</title><content type='html'>El objeto que se instancia como controlador, tiene referencias a todas las instancias de librerías y modelos que hayan cargadas como un atributo del mismo nombre de la clase.&lt;br /&gt;Así, si cargamos la librería Email, tenemos que $this-&gt;email es una instancia de la clase Email.&lt;br /&gt;&lt;br /&gt;El tema no termina ahí. Cada modelo, también, tiene esos mismos atributos cargados, entonces el código que tenemos en el controlador y en el módelo es similar, ya que accedemos a los mismos atributos. Entonces, si hacemos cierto código en el controlador y nos parece que es muy general y lo podemos necesitar en otro, es fácil pasarlo a un modelo.&lt;br /&gt;&lt;br /&gt;Pero... ¿Qué pasa si estamos en una librería?&lt;br /&gt;A las librerías no se les cargan los atributos, pero pueden necesitar acceso a otra librería, o a un modelo. Para eso, podemos acceder a la instancia del controlador a través de la función "get_instance".&lt;br /&gt;Por ejemplo, dentro de la clase Email queremos validar el mail con el método valid_email de la clase de Validación. Entonces:&lt;br /&gt;&lt;br /&gt;function valid_email($address)&lt;br /&gt;{&lt;br /&gt;    // (El &amp;amp; es importante para no crear una copia en PHP 4)&lt;br /&gt;    $CI =&amp;amp; get_instance();&lt;br /&gt;   &lt;br /&gt;    // Si no está cargada la librería, la cargamos nosotros&lt;br /&gt;    if (!isset($CI-&gt;validation))&lt;br /&gt;    {&lt;br /&gt;        $CI-&gt;load-&gt;library('validation');&lt;br /&gt;    }&lt;br /&gt;   &lt;br /&gt;    // Llamamos al método&lt;br /&gt;    return $CI-&gt;validation-&gt;valid_email($address);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Simple, no?&lt;br /&gt;&lt;br /&gt;Igualmente, esto sigue...&lt;br /&gt;¿Qué pasa si en la vista, queremos acceder a una librería o modelo, por ejemplo, a la de validación para recuperar los mensajes?&lt;br /&gt;&lt;br /&gt;Las views también pueden acceder como $this-&gt;validation al mismo objeto que el controlador o los modelos.&lt;br /&gt;Internamente, esto se logra asignandole estas instancias a la clase Loader, donde se cargan las vistas.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8081123338261260081-2389166758249077653?l=desarrollophp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://desarrollophp.blogspot.com/feeds/2389166758249077653/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8081123338261260081&amp;postID=2389166758249077653&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/2389166758249077653'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/2389166758249077653'/><link rel='alternate' type='text/html' href='http://desarrollophp.blogspot.com/2008/02/lo-primero-que-hay-que-saber.html' title='Lo primero que hay que saber'/><author><name>seppo0010</name><uri>http://www.blogger.com/profile/02504022684566719870</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/-MZycJmm2nSM/TcRjh31LGOI/AAAAAAAAAEM/-VPfMm21vQo/s220/avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8081123338261260081.post-2118685786581513506</id><published>2008-02-16T12:19:00.004-02:00</published><updated>2008-02-16T12:29:24.411-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CodeIgniter'/><title type='text'>Dos largos meses</title><content type='html'>Desde mi cambio de trabajo, mis tiempos libres se acortaron y el blog cayó al olvido.&lt;br /&gt;Últimamente le dedico mis ratos PHPeros a &lt;a href="http://codeigniter.com/"&gt;CodeIgniter&lt;/a&gt;, así que voy a empezar a postear al respecto.&lt;br /&gt;&lt;br /&gt;Lo básico. CodeIgniter es un Framework que funciona en PHP 4.3.2 en adelante. Es muy liviano y muy flexible. Inspirado en Ruby on rails. Utiliza el patrón MVC. Promueve las URLs amigables. La documentación es muy buena (sólo en inglés).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8081123338261260081-2118685786581513506?l=desarrollophp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://desarrollophp.blogspot.com/feeds/2118685786581513506/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8081123338261260081&amp;postID=2118685786581513506&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/2118685786581513506'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/2118685786581513506'/><link rel='alternate' type='text/html' href='http://desarrollophp.blogspot.com/2008/02/dos-largos-meses.html' title='Dos largos meses'/><author><name>seppo0010</name><uri>http://www.blogger.com/profile/02504022684566719870</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/-MZycJmm2nSM/TcRjh31LGOI/AAAAAAAAAEM/-VPfMm21vQo/s220/avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8081123338261260081.post-4809452029774190358</id><published>2007-12-16T13:23:00.000-03:00</published><updated>2007-12-16T13:59:24.731-03:00</updated><title type='text'>Reflection Class</title><content type='html'>Desde PHP 5 se cuenta con un conjunto de clases e interfaces que nos permiten obtener información sobre las clases, funciones, métodos, atributos y objetos. Este conjunto nos permite, por ejemplo, saber cuantos parámetros recibe una función, y cuantos son requeridos... Un ejemplo de cómo usar esto.&lt;br /&gt;&lt;br /&gt;&lt;?php&lt;br /&gt;/**&lt;br /&gt; * Esta funcion repite&lt;br /&gt; *&lt;br /&gt; * @param string $texto&lt;br /&gt; * @param integer $veces&lt;br /&gt; */&lt;br /&gt;function repeat($texto, $veces = 2) {&lt;br /&gt;    return str_repeat($texto, $veces);&lt;br /&gt;}&lt;br /&gt;$reflection = new ReflectionFunction('repeat');&lt;br /&gt;echo 'Definida por el usuario: ' , $reflection-&gt;isUserDefined() , "\r\n";&lt;br /&gt;echo 'Documentacion: ' , $reflection-&gt;getDocComment() , "\r\n";&lt;br /&gt;echo 'Cantidad de Parametros: ' , $reflection-&gt;getNumberOfParameters() , "\r\n";&lt;br /&gt;foreach ($reflection-&gt;getParameters() as $parametro)&lt;br /&gt;{&lt;br /&gt;    echo 'Parametro "' , $parametro-&gt;getName() , '" ' , ($parametro-&gt;isOptional() ? '' : 'no ') , 'es opcional' , "\n";&lt;br /&gt;    echo 'Por default: ' , ($parametro-&gt;isDefaultValueAvailable() ? $parametro-&gt;getDefaultValue() : 'no tiene') , "\n";&lt;br /&gt;}&lt;br /&gt;?&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8081123338261260081-4809452029774190358?l=desarrollophp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://desarrollophp.blogspot.com/feeds/4809452029774190358/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8081123338261260081&amp;postID=4809452029774190358&amp;isPopup=true' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/4809452029774190358'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/4809452029774190358'/><link rel='alternate' type='text/html' href='http://desarrollophp.blogspot.com/2007/12/reflection-class.html' title='Reflection Class'/><author><name>seppo0010</name><uri>http://www.blogger.com/profile/02504022684566719870</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/-MZycJmm2nSM/TcRjh31LGOI/AAAAAAAAAEM/-VPfMm21vQo/s220/avatar.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8081123338261260081.post-8763052121149004359</id><published>2007-12-09T22:55:00.000-03:00</published><updated>2007-12-09T23:07:53.054-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Datos'/><title type='text'>JSON</title><content type='html'>JSON es un formato de transmisión de datos muy útil para pasar de un código a otro.&lt;br /&gt;&lt;br /&gt;El ejemplo más común es pasar un objeto o un array de PHP a JavaScript y viceversa. Para esto PHP 5 ofrece dos funciones que hacen el transpaso: &lt;a href="http://www.php.net/json-encode"&gt;json_encode&lt;/a&gt; y &lt;a href="http://www.php.net/json-decode"&gt;json_decode&lt;/a&gt;. Existen clases que ofrecen un funcionamiento similar para PHP 4.&lt;br /&gt;&lt;br /&gt;La ventaja de esta notacion es la transparencia y facilidad con la que se transmiten los datos. XML es una alternativa que también presenta sus ventajas. Es preferible para una serie de datos, si se quieren hacer consultas con XQuery, pero para la transmisión de un dato en particular la sintaxis de JavaScript se presenta como más simple.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8081123338261260081-8763052121149004359?l=desarrollophp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://desarrollophp.blogspot.com/feeds/8763052121149004359/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8081123338261260081&amp;postID=8763052121149004359&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/8763052121149004359'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/8763052121149004359'/><link rel='alternate' type='text/html' href='http://desarrollophp.blogspot.com/2007/12/json.html' title='JSON'/><author><name>seppo0010</name><uri>http://www.blogger.com/profile/02504022684566719870</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/-MZycJmm2nSM/TcRjh31LGOI/AAAAAAAAAEM/-VPfMm21vQo/s220/avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8081123338261260081.post-5920437693348956899</id><published>2007-11-27T12:08:00.000-03:00</published><updated>2007-11-27T12:34:15.585-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Seguridad'/><title type='text'>Lista de permitidos vs Lista de prohibidos</title><content type='html'>Al momento de pensar en seguridad, validación y filtrado de datos, tenemos dos opciones: o decidimos que permitimos o que prohibimos.&lt;br /&gt;&lt;br /&gt;Por un lado, se puede usar un filtro para evitar ataques XSS que se base en buscar una expresion regular buscando código javascript (ya sea etiquetas script o atributos onload, onclick, onmouseover...). Esto sería usar "blacklist" es decir, poner código que no se puede usar.&lt;br /&gt;&lt;br /&gt;Por otro lado, se puede permitir etiquetas HTML del tipo b, i, u... y todas las otras etiquetas simplemente eliminarlas. Esto sería "whitelist", o sea, limitar al usuario en lo que sí puede hacer.&lt;br /&gt;&lt;br /&gt;¿Cuál es preferible?&lt;br /&gt;&lt;br /&gt;Al utlizar una "blacklist" uno tiene que pensar en todos los posibles "ataques" que pueda recibir. Esto es un riesgo, ya que si a nuestro atacante se le ocurre un método que a nosotros no se nos ocurrió, estaríamos en un grave problema. Pero, si en cambio, utilizamos un sistema de "whitelist", el usuario sólo podría acceder si cumple con nuestro patrón permitido, cuestión que sería mucho menos probable que pueda concretar un ataque.&lt;br /&gt;&lt;br /&gt;La desventaja, por otro lado, de la whitelist, es que podemos filtrar o no permitir información que es, realmente, válida.&lt;br /&gt;&lt;br /&gt;Entonces, con una blacklist tenemos mayor posibilidad de ser víctimas de ataques por parte de usuarios malintencionados, mientras que utilizando una whitelist podemos dejar a usuarios correctos sin la posibilidad de ingresar datos.&lt;br /&gt;&lt;br /&gt;Personalmente, la segunda opción me parece la mejor, ya que sus consecuencias son menos severas.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8081123338261260081-5920437693348956899?l=desarrollophp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://desarrollophp.blogspot.com/feeds/5920437693348956899/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8081123338261260081&amp;postID=5920437693348956899&amp;isPopup=true' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/5920437693348956899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/5920437693348956899'/><link rel='alternate' type='text/html' href='http://desarrollophp.blogspot.com/2007/11/lista-de-permitidos-vs-lista-de.html' title='Lista de permitidos vs Lista de prohibidos'/><author><name>seppo0010</name><uri>http://www.blogger.com/profile/02504022684566719870</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/-MZycJmm2nSM/TcRjh31LGOI/AAAAAAAAAEM/-VPfMm21vQo/s220/avatar.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8081123338261260081.post-1090443462213446489</id><published>2007-11-22T13:39:00.000-03:00</published><updated>2007-11-22T13:49:12.812-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP 5'/><category scheme='http://www.blogger.com/atom/ns#' term='Array'/><category scheme='http://www.blogger.com/atom/ns#' term='SPL'/><category scheme='http://www.blogger.com/atom/ns#' term='POO'/><title type='text'>Mezclar array con objetos</title><content type='html'>La extensión SPL nos permite tener objetos que actuan como array. Una forma de hacerlo es usar la clase predefinida ArrayObject. Otra forma es implementar una interfase ArrayAccess para poder acceder a nuestros datos como si fueran un array. Un ejemplo de esto&lt;br /&gt;&lt;br /&gt;class MyArray implements ArrayAccess {&lt;br /&gt;    private $data;&lt;br /&gt;&lt;br /&gt;    public function __construct($array = array())&lt;br /&gt;    {&lt;br /&gt;        $this-&gt;data = $array;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public function offsetGet($key)&lt;br /&gt;    {&lt;br /&gt;        return $this-&gt;data[$key];&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public function offsetSet($key, $value)&lt;br /&gt;    {&lt;br /&gt;        return $this-&gt;data[$key] = $value;&lt;br /&gt;    }&lt;br /&gt;    public function offsetExists($key)&lt;br /&gt;    {&lt;br /&gt;        return isset($this-&gt;data[$key]);&lt;br /&gt;    }&lt;br /&gt;    public function offsetUnset($key)&lt;br /&gt;    {&lt;br /&gt;        unset($this-&gt;data[$key]);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public function avg()&lt;br /&gt;    {&lt;br /&gt;        if (count($this-&gt;data) &gt; 0)&lt;br /&gt;        {&lt;br /&gt;            return array_sum($this-&gt;data) / count($this-&gt;data);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;$array = new MyArray(array(1, 2, 3, 4));&lt;br /&gt;echo (int)isset($array[0]);&lt;br /&gt;echo $array[0];&lt;br /&gt;&lt;br /&gt;unset($array[1]);&lt;br /&gt;echo (int)isset($array[1]); //throw an ugly notice&lt;br /&gt;echo $array[1];&lt;br /&gt;&lt;br /&gt;$array[1] = 4;&lt;br /&gt;echo (int)isset($array[1]);&lt;br /&gt;echo $array[1];&lt;br /&gt;&lt;br /&gt;echo $array-&gt;avg();&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8081123338261260081-1090443462213446489?l=desarrollophp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://desarrollophp.blogspot.com/feeds/1090443462213446489/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8081123338261260081&amp;postID=1090443462213446489&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/1090443462213446489'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/1090443462213446489'/><link rel='alternate' type='text/html' href='http://desarrollophp.blogspot.com/2007/11/mezclar-array-con-objetos.html' title='Mezclar array con objetos'/><author><name>seppo0010</name><uri>http://www.blogger.com/profile/02504022684566719870</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/-MZycJmm2nSM/TcRjh31LGOI/AAAAAAAAAEM/-VPfMm21vQo/s220/avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8081123338261260081.post-4986822147854726961</id><published>2007-11-13T22:38:00.000-03:00</published><updated>2007-11-13T22:42:33.596-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Funciones'/><title type='text'>Saber si se envió un parámetro con valor por defecto</title><content type='html'>Una función puede tener argumentos opcionales. Ellos se determinan dándole un valor por defecto al definirla. Por ejemplo&lt;br /&gt;&lt;br /&gt;function prueba($clave, $valor = null)&lt;br /&gt;&lt;br /&gt;pero cómo podemos diferenciar si se llama a esa función con un sólo parámetro, o si se usan dos y el segundo es igual al valor predeterminado?&lt;br /&gt;La solución es rebuscada, pero no difícil... Simplemente tenemos que buscar cuántos argumentos se pasaron a la función al llamarla&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;function prueba($clave, $valor = null)&lt;br /&gt;{&lt;br /&gt;    if (func_num_args() &gt; 1) {&lt;br /&gt;        echo '$valor se envió';&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;prueba('1', null);&lt;br /&gt;prueba('1');&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8081123338261260081-4986822147854726961?l=desarrollophp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://desarrollophp.blogspot.com/feeds/4986822147854726961/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8081123338261260081&amp;postID=4986822147854726961&amp;isPopup=true' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/4986822147854726961'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/4986822147854726961'/><link rel='alternate' type='text/html' href='http://desarrollophp.blogspot.com/2007/11/saber-si-se-envi-un-parmetro-con-valor.html' title='Saber si se envió un parámetro con valor por defecto'/><author><name>seppo0010</name><uri>http://www.blogger.com/profile/02504022684566719870</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/-MZycJmm2nSM/TcRjh31LGOI/AAAAAAAAAEM/-VPfMm21vQo/s220/avatar.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8081123338261260081.post-520558775719531069</id><published>2007-11-08T12:35:00.000-03:00</published><updated>2007-11-08T12:46:55.655-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Fechas'/><category scheme='http://www.blogger.com/atom/ns#' term='Idioma'/><title type='text'>Nombrar fechas (no en inglés)</title><content type='html'>Es muy común el problema de querer poner "8 de noviembre de 2007" y tener "8 de november de 2007"... En general se utiliza un switch para traducir el nombre del mes, pero hay una forma mucho más simple de hacerlo. PHP trae la posibilidad de configurar la localización, y de allí elegir configuración "regional" como idioma, moneda, números.&lt;br /&gt;&lt;br /&gt;Para ello, primero debemos fijar el ámbito con &lt;a href="http://us.php.net/manual/es/function.setlocale.php"&gt;setlocale&lt;/a&gt; y después podemos utilizar el formato de fecha con &lt;a href="http://us.php.net/strftime"&gt;strftime&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ejemplo&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8081123338261260081-520558775719531069?l=desarrollophp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://desarrollophp.blogspot.com/feeds/520558775719531069/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8081123338261260081&amp;postID=520558775719531069&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/520558775719531069'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/520558775719531069'/><link rel='alternate' type='text/html' href='http://desarrollophp.blogspot.com/2007/11/nombrar-fechas-no-en-ingls.html' title='Nombrar fechas (no en inglés)'/><author><name>seppo0010</name><uri>http://www.blogger.com/profile/02504022684566719870</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/-MZycJmm2nSM/TcRjh31LGOI/AAAAAAAAAEM/-VPfMm21vQo/s220/avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8081123338261260081.post-5288593472478619607</id><published>2007-11-05T15:09:00.000-03:00</published><updated>2007-11-05T15:15:38.115-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Optimización'/><category scheme='http://www.blogger.com/atom/ns#' term='Juegos'/><title type='text'>Juego de Estados</title><content type='html'>Juego:&lt;br /&gt;Tomar el nombre de dos estados de Estados Unidos, mezclarlos y luego reordenar las letras para formar el nombre de otros dos estados de Estados Unidos.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.neonetsi.com.ar/seppo/desarrollophp/states.zip"&gt;Mi solución&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;¿Alguna sugerencia?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8081123338261260081-5288593472478619607?l=desarrollophp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://desarrollophp.blogspot.com/feeds/5288593472478619607/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8081123338261260081&amp;postID=5288593472478619607&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/5288593472478619607'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/5288593472478619607'/><link rel='alternate' type='text/html' href='http://desarrollophp.blogspot.com/2007/11/juego-de-estados.html' title='Juego de Estados'/><author><name>seppo0010</name><uri>http://www.blogger.com/profile/02504022684566719870</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/-MZycJmm2nSM/TcRjh31LGOI/AAAAAAAAAEM/-VPfMm21vQo/s220/avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8081123338261260081.post-7951857917375287501</id><published>2007-10-30T20:43:00.000-03:00</published><updated>2007-10-30T20:44:58.156-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='Optimización'/><title type='text'>Mejorar paginación</title><content type='html'>Recientemente descubrí un método para poder mejorar el rendimiento de una paginación en MySQL. Generalmente se necesitan dos consultas a la base de datos, una para traer los datos y otra para saber que cantidad de datos hay en total. Lo nuevo, si bien no altera la cantidad de consultas, es que podemos hacer que el servidor MySQL sólo tenga que procesar una vez.&lt;br /&gt;&lt;br /&gt;¿Cómo funciona esto?&lt;br /&gt;En el primer pedido, además de pedirle los datos, le decimos al servidor que calcule la cantidad de filas totales de la consulta, y después hacemos una consulta para conseguir ese dato.&lt;br /&gt;&lt;pre class="programlisting"&gt;mysql&gt; SELECT SQL_CALC_FOUND_ROWS * FROM &lt;em class="replaceable"&gt;&lt;code&gt;tbl_name&lt;/code&gt;&lt;/em&gt;&lt;br /&gt;  -&gt; WHERE id &gt; 100 LIMIT 10;&lt;br /&gt;mysql&gt; SELECT FOUND_ROWS();&lt;/pre&gt;&lt;br /&gt;Esto es especialmente útil si utilizamos una cláusula ORDER BY, o una consulta compleja, con subqueries, múltiples JOIN o muchos cálculos.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://dev.mysql.com/doc/refman/5.0/es/information-functions.html#function_found-rows"&gt;Consultar el manual de MySQL&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8081123338261260081-7951857917375287501?l=desarrollophp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://desarrollophp.blogspot.com/feeds/7951857917375287501/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8081123338261260081&amp;postID=7951857917375287501&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/7951857917375287501'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/7951857917375287501'/><link rel='alternate' type='text/html' href='http://desarrollophp.blogspot.com/2007/10/mejorar-paginacin.html' title='Mejorar paginación'/><author><name>seppo0010</name><uri>http://www.blogger.com/profile/02504022684566719870</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/-MZycJmm2nSM/TcRjh31LGOI/AAAAAAAAAEM/-VPfMm21vQo/s220/avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8081123338261260081.post-707907872880472499</id><published>2007-10-25T14:43:00.000-03:00</published><updated>2007-10-25T14:57:38.111-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP 5'/><category scheme='http://www.blogger.com/atom/ns#' term='POO'/><title type='text'>Autocargar clases</title><content type='html'>Desde PHP 5, no es necesario cargar todas las clases al principio de cada script, sino que si existe una función __autoload es llamada cuando se quieren utilizar una clase que no existe. Esta función recibe el nombre de la la clase que se quiere cargar y tiene que encargarse de hacer que exista esa clase para evitar que se arroje un error porque no exista.&lt;br /&gt;&lt;br /&gt;Este es un buen avance de PHP 5, que desde la versión 5.1.2 también nos brinda la posibilidad de registrar múltiples funciones para hacer esto, en vez de limitarse sólo a una como era anteriormente, a través de &lt;a href="http://www.php.net/manual/en/function.spl-autoload-register.php"&gt;spl_autoload_register&lt;/a&gt; (la documentación sólo está disponible en inglés).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8081123338261260081-707907872880472499?l=desarrollophp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://desarrollophp.blogspot.com/feeds/707907872880472499/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8081123338261260081&amp;postID=707907872880472499&amp;isPopup=true' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/707907872880472499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/707907872880472499'/><link rel='alternate' type='text/html' href='http://desarrollophp.blogspot.com/2007/10/autocargar-classes.html' title='Autocargar clases'/><author><name>seppo0010</name><uri>http://www.blogger.com/profile/02504022684566719870</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/-MZycJmm2nSM/TcRjh31LGOI/AAAAAAAAAEM/-VPfMm21vQo/s220/avatar.png'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8081123338261260081.post-2886520494325556537</id><published>2007-10-18T12:37:00.000-03:00</published><updated>2007-10-18T12:52:36.141-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Estructuras de Control'/><title type='text'>Switch con expresiones</title><content type='html'>Los switch generalmente son muy útiles, pero al mismo tiempo muy limitados. Buscando la forma, podemos extender su uso, para poder evaluar expresiones, y llamar a funciones. Lo que tenemos que hacer es poner las expresiones en los case para que sea el argumento a comparar.&lt;br /&gt;&lt;br /&gt;Por ejemplo, podemos hacer lo siguiente&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;br /&gt;switch (true) {&lt;br /&gt;    case ($variable &gt;= 0 &amp;amp;&amp;amp; $variable &lt; 3):&lt;br /&gt;        echo '$variable está entre 0 y 3';&lt;br /&gt;        break;&lt;br /&gt;&lt;br /&gt;    case ($variable &gt;= 3 &amp;amp;&amp;amp; $variable &lt; 7):&lt;br /&gt;        echo '$variable está entre 3 y 7';&lt;br /&gt;        break;&lt;br /&gt;&lt;br /&gt;    case ($variable &gt;= 7):&lt;br /&gt;        echo '$variable es mayor a 7';&lt;br /&gt;        break;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;De esta forma, en vez de hacer tres IFs encadenados podemos recurrir a esta opción, para que nuestro código sea más legible.&lt;/span&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8081123338261260081-2886520494325556537?l=desarrollophp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://desarrollophp.blogspot.com/feeds/2886520494325556537/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8081123338261260081&amp;postID=2886520494325556537&amp;isPopup=true' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/2886520494325556537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/2886520494325556537'/><link rel='alternate' type='text/html' href='http://desarrollophp.blogspot.com/2007/10/switch-con-expresiones.html' title='Switch con expresiones'/><author><name>seppo0010</name><uri>http://www.blogger.com/profile/02504022684566719870</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/-MZycJmm2nSM/TcRjh31LGOI/AAAAAAAAAEM/-VPfMm21vQo/s220/avatar.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8081123338261260081.post-6014809013029207798</id><published>2007-10-16T21:08:00.001-03:00</published><updated>2007-10-16T21:25:19.087-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Optimización'/><category scheme='http://www.blogger.com/atom/ns#' term='String'/><title type='text'>Comillas simples y dobles</title><content type='html'>Para la mayoría, las comillas simples y dobles, en PHP, son iguales. Sin embargo presentan diferencias fundamentales. Usando comillas dobles existen más caracteres especiales: \n \r \t \\ \$ \" \[0-7]{1,3} \x[0-9A-Fa-f]{1,2} mientras que con comillas simples sólo tenemos \\ y \'.&lt;br /&gt;Sabiendo ya esto, podemos suponer que las comillas simples son más rápidas. Por otro lado, debemos agregar que dentro las comillas dobles se pueden utilizar variables sin concatenar, sino escribiéndolas directamente en su contenido.&lt;br /&gt;Más información pueden encontrar en el manual de PHP, en el apartado de &lt;a href="http://www.php.net/manual/es/language.types.string.php"&gt;Cadenas&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Por último, vamos a comparar los tiempos de cada uno, en varias circunstancias.&lt;br /&gt;&lt;a href="http://www.neonetsi.com.ar/seppo/desarrollophp/comillas-dobles-y-simples.php"&gt;Ver ejemplo&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8081123338261260081-6014809013029207798?l=desarrollophp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.neonetsi.com.ar/seppo/desarrollophp/comillas-dobles-y-simples.php' title='Comillas simples y dobles'/><link rel='replies' type='application/atom+xml' href='http://desarrollophp.blogspot.com/feeds/6014809013029207798/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8081123338261260081&amp;postID=6014809013029207798&amp;isPopup=true' title='32 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/6014809013029207798'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/6014809013029207798'/><link rel='alternate' type='text/html' href='http://desarrollophp.blogspot.com/2007/10/comillas-simples-y-dobles.html' title='Comillas simples y dobles'/><author><name>seppo0010</name><uri>http://www.blogger.com/profile/02504022684566719870</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/-MZycJmm2nSM/TcRjh31LGOI/AAAAAAAAAEM/-VPfMm21vQo/s220/avatar.png'/></author><thr:total>32</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8081123338261260081.post-6680357932799606081</id><published>2007-10-11T17:03:00.000-03:00</published><updated>2007-10-11T17:08:23.941-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Fechas'/><title type='text'>Manejar fechas</title><content type='html'>Es normal tener que modificar el formato de una fecha para adaptarlo a un tipo de base de datos, o para presentarlo a un usuario. En general, strtotime nos provee una buena herramienta para hacerlo, ya que soporta el formato tradicional de MySQL y muchos otros, pero el problema suele estar cuando queremos recibir una fecha en formato dd/mm/yy, ya que por defecto esta función toma el formato estadounidense mm/dd/yy y puede confundirse 01/07 con el 7 de enero, en vez del 1 de julio que esperábamos. La solución que ofrece PHP es con la función strptime, que nos permite indicar el formato de la fecha. Sin embargo, esta función es muy nueva (desde PHP 5.1.0) y no está implementada en Windows, con lo que es bastante limitada. Por lo tanto, podemos crear una pequeña función, con este propósito.&lt;br /&gt;&lt;br /&gt;function strtotime2($date)&lt;br /&gt;{&lt;br /&gt; if (preg_match('#^((0?[1-9])|([1-2]?[0-9])|(3[0-1]))/(0?[1-9]|(1[0-2]))/((19|20)?([0-9]{2}))$#', $date))&lt;br /&gt; {&lt;br /&gt;     list($day, $month, $year) = explode('/', $date);&lt;br /&gt;     return mktime(0, 0, 0, $month, $day, $year);&lt;br /&gt; } else&lt;br /&gt; {&lt;br /&gt;     return strtotime($date);&lt;br /&gt; }&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8081123338261260081-6680357932799606081?l=desarrollophp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://desarrollophp.blogspot.com/feeds/6680357932799606081/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8081123338261260081&amp;postID=6680357932799606081&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/6680357932799606081'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/6680357932799606081'/><link rel='alternate' type='text/html' href='http://desarrollophp.blogspot.com/2007/10/manejar-fechas.html' title='Manejar fechas'/><author><name>seppo0010</name><uri>http://www.blogger.com/profile/02504022684566719870</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/-MZycJmm2nSM/TcRjh31LGOI/AAAAAAAAAEM/-VPfMm21vQo/s220/avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8081123338261260081.post-4676569185693574388</id><published>2007-10-04T14:10:00.000-03:00</published><updated>2007-10-04T14:43:03.469-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Funciones'/><category scheme='http://www.blogger.com/atom/ns#' term='Buenas costumbres'/><title type='text'>Parametros flexibles, retornos duros</title><content type='html'>Al programar una función, o un método de una clase, siempre es lo mejor poder recibir cualquier tipo de parámetro. Ver si es más cómodo mezclar dos parámetros en uno, usando un array, o si un dato puede ser de varios tipos. Todas estas cosas hay que tenerlas en cuenta para que luego sea menos difícil trabajar con lo que ya está hecho. Otra cosa que debemos intentar es siempre devolver el mismo tipo de dato, incluso si no se pudo realizar lo que se esperaba, entonces si se debe devolver un array, pero hubo un error podemos devolver un array vacío en vez de false o null. Un ejemplo simple de esto&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br /&gt;&lt;br /&gt;function select($nombre, $valores = array(), $seleccionado = '', $atributos = array())&lt;br /&gt;{&lt;br /&gt;   if (!is_array($valores) || count($valores) == 0)&lt;br /&gt;   {&lt;br /&gt;       return '';&lt;br /&gt;   }&lt;br /&gt; &lt;br /&gt;   if (is_string($nombre))&lt;br /&gt;   {&lt;br /&gt;       if (is_array($atributos))&lt;br /&gt;       {&lt;br /&gt;           $atributos['name'] = $nombre;&lt;br /&gt;       } else&lt;br /&gt;       {&lt;br /&gt;           $atributos .= ' name="' . htmlentities($nombre) . '"';&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;   $out = '&amp;lt;select';&lt;br /&gt;   if (is_array($atributos))&lt;br /&gt;   {&lt;br /&gt;       foreach ($atributos as $atributo_nombre =&amp;gt; $atributo_valor)&lt;br /&gt;       {&lt;br /&gt;           $out .= ' ' . $atributo_nombre . '="' . htmlentities($atributo_valor) . '"';&lt;br /&gt;       }&lt;br /&gt;   } else&lt;br /&gt;   {&lt;br /&gt;       $out .= ' ' . $atributos;&lt;br /&gt;   }&lt;br /&gt;   $out .= '&amp;gt;';&lt;br /&gt;   foreach ((array)$valores as $valor_clave =&amp;gt; $valor_etiqueta)&lt;br /&gt;   {&lt;br /&gt;       $out .= '&amp;lt;option value="' . htmlentities($valor_clave) . '"' . ($valor_clave == $seleccionado || (is_array($seleccionado) &amp;amp;&amp;amp; in_array($valor_clave,$seleccionado)) ? 'selected="selected"' : '') . '&amp;gt;' . htmlentities($valor_etiqueta) . '&amp;lt;/option&amp;gt;';&lt;br /&gt;   }&lt;br /&gt;   return $out . '&amp;lt;/select&amp;gt;';&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;echo select('select',array('a' =&amp;gt; 'A', 'b' =&amp;gt; 'B','c' =&amp;gt; 'C','d' =&amp;gt; 'D'),array('a'),array('id' =&amp;gt; 'select', 'multiple' =&amp;gt; 'multiple'));&lt;br /&gt;echo PHP_EOL;&lt;br /&gt;echo select('select',array('a' =&amp;gt; 'A', 'b' =&amp;gt; 'B','c' =&amp;gt; 'C','d' =&amp;gt; 'D'),'a','id="select"');&lt;br /&gt;echo PHP_EOL;&lt;br /&gt;echo select('select');&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8081123338261260081-4676569185693574388?l=desarrollophp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://desarrollophp.blogspot.com/feeds/4676569185693574388/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8081123338261260081&amp;postID=4676569185693574388&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/4676569185693574388'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/4676569185693574388'/><link rel='alternate' type='text/html' href='http://desarrollophp.blogspot.com/2007/10/parametros-flexibles-retornos-duros.html' title='Parametros flexibles, retornos duros'/><author><name>seppo0010</name><uri>http://www.blogger.com/profile/02504022684566719870</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/-MZycJmm2nSM/TcRjh31LGOI/AAAAAAAAAEM/-VPfMm21vQo/s220/avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8081123338261260081.post-7248541548676439788</id><published>2007-09-30T11:14:00.000-03:00</published><updated>2007-09-30T11:52:20.166-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Formularios'/><category scheme='http://www.blogger.com/atom/ns#' term='Buenas costumbres'/><title type='text'>Procesamiento de formularios</title><content type='html'>Siempre, el mayor problema, es procesar datos que se envían. Vamos a hacer un seguimiento de que cosas hay que revisar para cada formulario. Como noción previa, tenemos que tener en cuenta que todos los datos que envía el client (POST, GET, COOKIE) poco confiable.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Revisar el permiso del usuario&lt;/span&gt;&lt;br /&gt;No todos los usuarios tienen permisos para todos los formularios, eso es claro. Hay que establecer si el usuario puede enviar ese formulario o no, o si sólo lo puede hacer en parte.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Validar todos los datos&lt;br /&gt;&lt;/span&gt;Significa que por cada formulario que se le pide, hay que establecer condiciones. En general, los campos de texto tienen que tener un largo máximo (lo más normal es establecerlo de acuerdo a la base de datos) o fijo (por ejemplo, los códigos de tarjetas de crédito). También hay que revisar el formato (usualmente para las direcciones de e-mail). Hay datos que sólo pueden ser numéricos, o fechas que pueden no ser válidas.&lt;br /&gt;Los checkbox, radio buttons y dropdowns tienen un rango de opciones prefijados y no se pueden salir de ellos.&lt;br /&gt;Todas estas cosas hay que tenerlas en cuenta, porque un dato erróneo puede hacer que se pierda información, pero se puede evitar si se le fuerza al usuario a corregir ese error.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Escapar datos&lt;br /&gt;&lt;/span&gt;Dependiendo el destino de los datos ingresados, hay que escapar los datos de la forma que corresponda. En general, vamos a guardarlos en bases de datos, por lo que las funciones *_escape_string nos proveen una forma fácil de escapar los datos de acuerdo al tipo de base de datos que usemos.&lt;br /&gt;En este punto, hay que tener cuidado con las "comillas mágicas" (magic_quotes_gpc), que si están habilitadas pueden hacer que los datos sean doblemente escapados. Lo mejor es quitar las comillas, si esta directiva está en funcionamiento.&lt;br /&gt;¿Por qué no nos olvidamos de escapar datos si tenemos magic_quotes_gpc?&lt;br /&gt;La idea de magic_quotes era no tener que escapar datos, y facilitarle la tarea al programador. El problema de esta función, es que escapa datos en forma arbitraría y sin tener en cuenta en donde se utilizan los mismos.&lt;br /&gt;Otro posible error es querer guardar datos que no envió el usuario, pero por tener magic_quotes_gpc On no escapamos, incorrectamente.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Guardar los resultados&lt;br /&gt;&lt;/span&gt;Los datos son válidos, están preparados... Lo único que queda es guardarlo, y hacer cualquier otro proceso que sea necesario.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Mostrar los resultados&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;Todavía no terminó nuestro trabajo. La información que guardamos, probablemente la queramos mostrar a alguien. En este punto es muy importante escapar los datos nuevamente. Anteriormente los guardamos tal cual lo mandó el usuario, pero a la hora de mostrarlo en una página, hay que evitar que se haya podido ingresar información malisiosa. En general, escapar las entidades HTML es suficiente para esto, pero sería mejor escapar todas las entidades, incluso las más "raras" para presentar correctamente la información.&lt;/li&gt;&lt;/ol&gt;Estos 5 puntos son necesarios para la mayoría de los procesamientos de datos. Parece engorroso y complicado, pero no lo es realmente.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8081123338261260081-7248541548676439788?l=desarrollophp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://desarrollophp.blogspot.com/feeds/7248541548676439788/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8081123338261260081&amp;postID=7248541548676439788&amp;isPopup=true' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/7248541548676439788'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/7248541548676439788'/><link rel='alternate' type='text/html' href='http://desarrollophp.blogspot.com/2007/09/procesamiento-de-formularios.html' title='Procesamiento de formularios'/><author><name>seppo0010</name><uri>http://www.blogger.com/profile/02504022684566719870</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/-MZycJmm2nSM/TcRjh31LGOI/AAAAAAAAAEM/-VPfMm21vQo/s220/avatar.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8081123338261260081.post-1778674040091820079</id><published>2007-09-25T22:25:00.000-03:00</published><updated>2007-09-25T22:31:23.320-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Optimización'/><title type='text'>Conexión por IP</title><content type='html'>Recientemente descubrí que es más rápido conectarse a un servidor utilizando su IP que su nombre. Por ejemplo, en vez de mysql_connect('localhost'); uno puede usar mysql_connect('127.0.0.1'); y termina mejorando la velocidad de conexión. Una pequeña optimización, pero frecuente.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8081123338261260081-1778674040091820079?l=desarrollophp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://desarrollophp.blogspot.com/feeds/1778674040091820079/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8081123338261260081&amp;postID=1778674040091820079&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/1778674040091820079'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/1778674040091820079'/><link rel='alternate' type='text/html' href='http://desarrollophp.blogspot.com/2007/09/conexin-por-ip.html' title='Conexión por IP'/><author><name>seppo0010</name><uri>http://www.blogger.com/profile/02504022684566719870</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/-MZycJmm2nSM/TcRjh31LGOI/AAAAAAAAAEM/-VPfMm21vQo/s220/avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8081123338261260081.post-8130810857362290484</id><published>2007-09-23T11:58:00.000-03:00</published><updated>2007-09-23T11:58:31.452-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Array'/><category scheme='http://www.blogger.com/atom/ns#' term='Optimización'/><title type='text'>Guardar elementos de un array en una variable</title><content type='html'>El otro día, me llamó la atención leer que es más lento acceder a un elemento de un array que a una variable. Decidí probar cuanta es la diferencia, y si vale la pena. Mi conclusión es que la diferencia existe y si se llama más de 10 veces al mismo indice, puede valer la pena crear una variable para eso, pero igualmente sólo es recomendable hacerlo dentro de una función, en un "alcance" cerrado para que no quede en la memoria todo el tiempo.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://neonetsi.com.ar/seppo/desarrollophp/guardar-elementos-de-array-en-una-variable.php"&gt;Ver ejemplo&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8081123338261260081-8130810857362290484?l=desarrollophp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://neonetsi.com.ar/seppo/desarrollophp/guardar-elementos-de-array-en-una-variable.php' title='Guardar elementos de un array en una variable'/><link rel='replies' type='application/atom+xml' href='http://desarrollophp.blogspot.com/feeds/8130810857362290484/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8081123338261260081&amp;postID=8130810857362290484&amp;isPopup=true' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/8130810857362290484'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/8130810857362290484'/><link rel='alternate' type='text/html' href='http://desarrollophp.blogspot.com/2007/09/guardar-elementos-de-un-array-en-una.html' title='Guardar elementos de un array en una variable'/><author><name>seppo0010</name><uri>http://www.blogger.com/profile/02504022684566719870</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/-MZycJmm2nSM/TcRjh31LGOI/AAAAAAAAAEM/-VPfMm21vQo/s220/avatar.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8081123338261260081.post-4046547134079313415</id><published>2007-09-20T01:06:00.000-03:00</published><updated>2007-09-20T01:11:54.282-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Buenas costumbres'/><title type='text'>Leer el manual</title><content type='html'>Tengo que leer el manual&lt;br /&gt;Tengo que leer el manual&lt;br /&gt;Tengo que leer el manual&lt;br /&gt;Tengo que leer el manual&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Sí, es aburrido, pero hay que tener en cuenta que PHP cuenta con muchísimas funciones que quizás uno ignora y podemos evitarnos redescubrir la rueda.&lt;br /&gt;También hay que leer los comentarios de los usuarios, muchos agujeros se tapan allí.&lt;br /&gt;&lt;br /&gt;La última función que descubrí: &lt;a href="http://www.php.net/manual/es/function.dl.php"&gt;dl&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8081123338261260081-4046547134079313415?l=desarrollophp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://desarrollophp.blogspot.com/feeds/4046547134079313415/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8081123338261260081&amp;postID=4046547134079313415&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/4046547134079313415'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/4046547134079313415'/><link rel='alternate' type='text/html' href='http://desarrollophp.blogspot.com/2007/09/leer-el-manual.html' title='Leer el manual'/><author><name>seppo0010</name><uri>http://www.blogger.com/profile/02504022684566719870</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/-MZycJmm2nSM/TcRjh31LGOI/AAAAAAAAAEM/-VPfMm21vQo/s220/avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8081123338261260081.post-4591290251858437381</id><published>2007-09-16T15:48:00.000-03:00</published><updated>2007-09-16T15:48:32.731-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Array'/><category scheme='http://www.blogger.com/atom/ns#' term='Iteración'/><category scheme='http://www.blogger.com/atom/ns#' term='Optimización'/><title type='text'>Recorrer un array</title><content type='html'>Quizás suene reiterativo al post for - while, pero ahora en vez de ejecutar un código N veces, quiero recorrer todas las posiciones de un array. ¿Cuál es la forma más conveniente?&lt;br /&gt;En primer lugar, tenemos el for optimizado.&lt;br /&gt;Por otra parte, podemos utilizar el foreach, que justamente recorre el array de datos.&lt;br /&gt;Una última alternativa es ir recorriendo el array utilizando su puntero interno.&lt;br /&gt;&lt;br /&gt;En este caso, la mejor alternativa es el foreach, especialmente dedicado para esto.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.neonetsi.com.ar/seppo/desarrollophp/recorrer-un-array.php"&gt;Ver ejemplo&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8081123338261260081-4591290251858437381?l=desarrollophp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.neonetsi.com.ar/seppo/desarrollophp/recorrer-un-array.php' title='Recorrer un array'/><link rel='replies' type='application/atom+xml' href='http://desarrollophp.blogspot.com/feeds/4591290251858437381/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8081123338261260081&amp;postID=4591290251858437381&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/4591290251858437381'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/4591290251858437381'/><link rel='alternate' type='text/html' href='http://desarrollophp.blogspot.com/2007/09/recorrer-un-array.html' title='Recorrer un array'/><author><name>seppo0010</name><uri>http://www.blogger.com/profile/02504022684566719870</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/-MZycJmm2nSM/TcRjh31LGOI/AAAAAAAAAEM/-VPfMm21vQo/s220/avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8081123338261260081.post-4662558155404568620</id><published>2007-09-13T17:02:00.000-03:00</published><updated>2007-09-13T17:09:46.290-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Buenas costumbres'/><title type='text'>Post o Get</title><content type='html'>¿Cuál es el criterio para elegir si un formulario debe ir por Post o por Get?&lt;br /&gt;La w3c nos da una &lt;a href="http://www.w3.org/2001/tag/doc/whenToUseGet.html#checklist"&gt;lista&lt;/a&gt; para decidir. Vamos a utilizar esa lista como base, y tratar de ampliarla un poco&lt;br /&gt;&lt;br /&gt;GET&lt;br /&gt;&lt;ul&gt;&lt;li&gt;    W3C: La interacción es más como una pregunta (?)&lt;/li&gt;&lt;li&gt;    Es un dato que sirve como guía para la presentación&lt;/li&gt;&lt;li&gt;    Se quiere poder ofrecer la posibilidad de copiar y pegar para guardarla, ingresarla en una página, pasarsela a otra persona&lt;/li&gt;&lt;/ul&gt; &lt;br /&gt;POST&lt;br /&gt;&lt;ul&gt;&lt;li&gt;W3C: La interacción es más bien una orden&lt;/li&gt;&lt;li&gt;W3C: La interacción cambia el estado del recurso en camino tal como lo percibió el usuario&lt;/li&gt;&lt;li&gt;    W3C: El usuario espera resultados de la interacción&lt;/li&gt;&lt;li&gt;    Resalto la segunda de la W3C como muy importante: tratar de mantener los procesamientos de formularios como Post&lt;/li&gt;&lt;li&gt;    Maneja datos "sensibles" como contraseñas&lt;/li&gt;&lt;li&gt;    Es mucha la información (la cantidad de caracteres de la URI puede ser limitado pro el servidor)&lt;/li&gt;&lt;/ul&gt; &lt;br /&gt;AMBOS&lt;br /&gt;&lt;ul&gt;&lt;li&gt;    Cuando se procesan datos, es buena costumbre realizar Post/Redirect/Get&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8081123338261260081-4662558155404568620?l=desarrollophp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://desarrollophp.blogspot.com/feeds/4662558155404568620/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8081123338261260081&amp;postID=4662558155404568620&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/4662558155404568620'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/4662558155404568620'/><link rel='alternate' type='text/html' href='http://desarrollophp.blogspot.com/2007/09/post-o-get.html' title='Post o Get'/><author><name>seppo0010</name><uri>http://www.blogger.com/profile/02504022684566719870</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/-MZycJmm2nSM/TcRjh31LGOI/AAAAAAAAAEM/-VPfMm21vQo/s220/avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8081123338261260081.post-7724309511384859779</id><published>2007-09-11T18:31:00.000-03:00</published><updated>2007-09-11T18:32:54.440-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Optimización'/><category scheme='http://www.blogger.com/atom/ns#' term='Buenas costumbres'/><title type='text'>Reporte de errores</title><content type='html'>Uno no programa en forma correcta, si existen errores. Y si estos errores se escapan de nuestra vista, será más difícil detectarlos y corregirlos. Un error que no provoca consecuencias negativas, sigue siendo un error. Lo más común, en este sentido, es comprobar el valor de variables que no están inicializadas, o no sabemos si lo están... Si probamos la diferencia entre&lt;br /&gt;&lt;br /&gt;1) if ($variable)&lt;br /&gt;2)  if (isset($variable))&lt;br /&gt;3)  if (!empty($variable))&lt;br /&gt;&lt;br /&gt;Lo primero que me llama la atención es cuanto más lento es la primera opción, si la variable no está definida, pero si está variable está definida es más rápida que empty y que isset, con lo que si se está seguro que la variable existe, esta es la mejor solución, pero ante la duda es preferible utilizar empty/isset.&lt;br /&gt;&lt;br /&gt;Volviendo al tema de los errores, siempre que se codifica es bueno ver los errores, por lo tanto siempre es bueno ejecutar&lt;br /&gt;&lt;br /&gt;error_reporting(E_ALL);&lt;br /&gt;&lt;br /&gt;mientras se está desarrollando, y reducir el nivel a E_NONE cuando se está en un sitio live, o eliminar el error_display&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.neonetsi.com.ar/seppo/desarrollophp/reporte-de-errores.php"&gt;Ver ejemplo&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8081123338261260081-7724309511384859779?l=desarrollophp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.neonetsi.com.ar/seppo/desarrollophp/reporte-de-errores.php' title='Reporte de errores'/><link rel='replies' type='application/atom+xml' href='http://desarrollophp.blogspot.com/feeds/7724309511384859779/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8081123338261260081&amp;postID=7724309511384859779&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/7724309511384859779'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/7724309511384859779'/><link rel='alternate' type='text/html' href='http://desarrollophp.blogspot.com/2007/09/reporte-de-errores.html' title='Reporte de errores'/><author><name>seppo0010</name><uri>http://www.blogger.com/profile/02504022684566719870</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/-MZycJmm2nSM/TcRjh31LGOI/AAAAAAAAAEM/-VPfMm21vQo/s220/avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8081123338261260081.post-6906390202949017319</id><published>2007-09-09T11:27:00.000-03:00</published><updated>2007-09-09T11:54:11.559-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Optimización'/><category scheme='http://www.blogger.com/atom/ns#' term='Archivos'/><title type='text'>Listar directorio</title><content type='html'>Es común la necesidad de buscar todos los archivos en una carpeta. Lo más común siempre es usar opendir, pero la funcion glob nos acerca al lado oscuro de la fuerza, ofreciendonos una alternativa más simple... Sin embargo, esta solución es más lenta.&lt;br /&gt;Otra alternativa es la funcion dir, que nos devuelve un objeto directorio, una solución más "elegante" si se quiere, pero no es más que un wrapper de lo mismo, por lo que no es más rápido.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.neonetsi.com.ar/seppo/desarrollophp/listar-directorio.php"&gt;Ver ejemplo&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8081123338261260081-6906390202949017319?l=desarrollophp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.neonetsi.com.ar/seppo/desarrollophp/listar-directorio.php' title='Listar directorio'/><link rel='replies' type='application/atom+xml' href='http://desarrollophp.blogspot.com/feeds/6906390202949017319/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8081123338261260081&amp;postID=6906390202949017319&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/6906390202949017319'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/6906390202949017319'/><link rel='alternate' type='text/html' href='http://desarrollophp.blogspot.com/2007/08/listar-directorio.html' title='Listar directorio'/><author><name>seppo0010</name><uri>http://www.blogger.com/profile/02504022684566719870</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/-MZycJmm2nSM/TcRjh31LGOI/AAAAAAAAAEM/-VPfMm21vQo/s220/avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8081123338261260081.post-3337665940576301057</id><published>2007-09-07T14:22:00.000-03:00</published><updated>2007-09-07T14:28:02.863-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Funciones'/><category scheme='http://www.blogger.com/atom/ns#' term='Optimización'/><title type='text'>Evitar dobles llamados a funciones</title><content type='html'>Se me ocurría que podía agarrar cualquier función y optimizarla mediante almacenar resultados ya calculados en una variable temporal.&lt;br /&gt;Por lo tanto, agarré una fórmula matemática común, la "cuadrática" que se utiliza para obtener las raíces de un polinomio de grado dos, y empecé a probar formas de mejorarla.&lt;br /&gt;&lt;br /&gt;Varios fueron los intentos, y la conclusión a la que llegué es que si bien es mejor almacenar resultados de llamados de funciones, no es lo mejor guardarlo de operatorias más simples como la multiplicacion.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.neonetsi.com.ar/seppo/desarrollophp/evitar-dobles-llamados-a-funciones.php"&gt;Ver ejemplo&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8081123338261260081-3337665940576301057?l=desarrollophp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.neonetsi.com.ar/seppo/desarrollophp/evitar-dobles-llamados-a-funciones.php' title='Evitar dobles llamados a funciones'/><link rel='replies' type='application/atom+xml' href='http://desarrollophp.blogspot.com/feeds/3337665940576301057/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8081123338261260081&amp;postID=3337665940576301057&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/3337665940576301057'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/3337665940576301057'/><link rel='alternate' type='text/html' href='http://desarrollophp.blogspot.com/2007/09/evitar-dobles-llamados-funciones.html' title='Evitar dobles llamados a funciones'/><author><name>seppo0010</name><uri>http://www.blogger.com/profile/02504022684566719870</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/-MZycJmm2nSM/TcRjh31LGOI/AAAAAAAAAEM/-VPfMm21vQo/s220/avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8081123338261260081.post-2117395831256650810</id><published>2007-09-05T12:29:00.000-03:00</published><updated>2007-09-05T12:23:08.943-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Optimización'/><category scheme='http://www.blogger.com/atom/ns#' term='Enteros'/><title type='text'>Par o impar</title><content type='html'>¿Cómo sabemos si un número entero es par o impar?&lt;br /&gt;Por supuesto que no es muy complicado.&lt;br /&gt;Cuando recién comenzaba, recuerdo haber buscado una forma de hacerlo, no muy práctica&lt;br /&gt;&lt;br /&gt;floor($a / 2) == $a / 2;&lt;br /&gt;&lt;br /&gt;El resultado es correcto, pero esto se podría facilitar aún más conociendo el operador %&lt;br /&gt;&lt;br /&gt;$a % 2 == 0;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Sin embargo, se puede hacer todavía más rápido, aunque no necesariamente fácil, verificando si el binario contiene al 1 o no.&lt;br /&gt;&lt;br /&gt;$a &amp;amp; 1 == 0&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.neonetsi.com.ar/seppo/desarrollophp/par-o-impar.php"&gt;Ver ejemplo&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8081123338261260081-2117395831256650810?l=desarrollophp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.neonetsi.com.ar/seppo/desarrollophp/par-o-impar.php' title='Par o impar'/><link rel='replies' type='application/atom+xml' href='http://desarrollophp.blogspot.com/feeds/2117395831256650810/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8081123338261260081&amp;postID=2117395831256650810&amp;isPopup=true' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/2117395831256650810'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/2117395831256650810'/><link rel='alternate' type='text/html' href='http://desarrollophp.blogspot.com/2007/09/par-o-impar.html' title='Par o impar'/><author><name>seppo0010</name><uri>http://www.blogger.com/profile/02504022684566719870</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/-MZycJmm2nSM/TcRjh31LGOI/AAAAAAAAAEM/-VPfMm21vQo/s220/avatar.png'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8081123338261260081.post-6834212818376479667</id><published>2007-09-01T16:32:00.000-03:00</published><updated>2007-09-08T12:49:32.042-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Optimización'/><category scheme='http://www.blogger.com/atom/ns#' term='String'/><title type='text'>str_replace - strtr</title><content type='html'>Estas dos funciones son muy parecidas. En general, str_replace es más famosa, pero ¿cuál conviene? Vamos a probar...&lt;br /&gt;&lt;br /&gt;str_replace('e','a','hello world');&lt;br /&gt;strtr('hello world','e','a');&lt;br /&gt;&lt;br /&gt;Vamos a comparar un reemplazo simple. En esta comparación, str_replace se lleva un punto.&lt;br /&gt;&lt;br /&gt;¿Qué pasa si se quiere reemplazar un texto que no se encuentra?&lt;br /&gt;Ambas funciones funcionan más rápido, pero str_replace sigue siendo más óptima. En esta instancia, ya parecería mejor esta opción, pero ambas funciones nos permiten reemplazar varios textos a la vez. Probemos.&lt;br /&gt;&lt;br /&gt;str_replace(array('o','e'),'a','hello world');&lt;br /&gt;strtr('hello world',array('o' =&gt; 'a','e' =&gt; 'a'));&lt;br /&gt;&lt;br /&gt;En este caso reemplazamos "o" y "e" por "a", y str_replace sigue siendo mejor... Vamos a darle una última oportunidad a strtr&lt;br /&gt;&lt;br /&gt;str_replace(array('o','e'),array('i','o'),'hello world');&lt;br /&gt;strtr('hello world',array('o' =&gt; 'i','e' =&gt; 'o'));&lt;br /&gt;&lt;br /&gt;En este caso, se reemplaza 'o' por 'i' y 'e' por 'a', y sorpresivamente strtr se lleva la victoria.&lt;br /&gt;&lt;br /&gt;Conclusión: en general, es preferible utilizar str_replace, pero cuando se quiere reemplazar un conjunto de caracteres por otro conjunto (y no un único valor) es mejor strtr.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.neonetsi.com.ar/seppo/desarrollophp/str_replace-strtr.php"&gt;Ver ejemplo&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8081123338261260081-6834212818376479667?l=desarrollophp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.neonetsi.com.ar/seppo/desarrollophp/str_replace-strtr.php' title='str_replace - strtr'/><link rel='replies' type='application/atom+xml' href='http://desarrollophp.blogspot.com/feeds/6834212818376479667/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8081123338261260081&amp;postID=6834212818376479667&amp;isPopup=true' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/6834212818376479667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/6834212818376479667'/><link rel='alternate' type='text/html' href='http://desarrollophp.blogspot.com/2007/08/strreplace-strtr.html' title='str_replace - strtr'/><author><name>seppo0010</name><uri>http://www.blogger.com/profile/02504022684566719870</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/-MZycJmm2nSM/TcRjh31LGOI/AAAAAAAAAEM/-VPfMm21vQo/s220/avatar.png'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8081123338261260081.post-8854848610814666920</id><published>2007-08-29T16:29:00.000-03:00</published><updated>2007-09-08T12:42:20.682-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Buenas costumbres'/><title type='text'>Nombres de variables</title><content type='html'>Es importante que nuestro código después pueda ser leído, ya sea por uno mismo o por otros, por lo tanto es muy recomendable que los nombres con los que designemos a las variables sea explicativo de que es lo que contiene.&lt;br /&gt;Personalmente, no estoy de acuerdo con incluir el tipo de dato en el nombre de la variable, sino lo que representa.&lt;br /&gt;Cómo excepción común a esta regla están las variables que no tienen un sentido real, sino que son útiles, cómo por ejemplo&lt;br /&gt;&lt;br /&gt;for ($i = 0; $i &lt; N; $i++) {&lt;br /&gt;  for ($j = 0; $j &lt; M; $j++) {&lt;br /&gt;&lt;br /&gt;  }&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8081123338261260081-8854848610814666920?l=desarrollophp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://desarrollophp.blogspot.com/feeds/8854848610814666920/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8081123338261260081&amp;postID=8854848610814666920&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/8854848610814666920'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/8854848610814666920'/><link rel='alternate' type='text/html' href='http://desarrollophp.blogspot.com/2007/09/nombres-de-variables.html' title='Nombres de variables'/><author><name>seppo0010</name><uri>http://www.blogger.com/profile/02504022684566719870</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/-MZycJmm2nSM/TcRjh31LGOI/AAAAAAAAAEM/-VPfMm21vQo/s220/avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8081123338261260081.post-7704271467809346497</id><published>2007-08-26T11:12:00.000-03:00</published><updated>2007-09-20T01:04:20.994-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Iteración'/><category scheme='http://www.blogger.com/atom/ns#' term='Optimización'/><title type='text'>for - while</title><content type='html'>Usualmente, para iterar un código N veces se hace&lt;br /&gt;&lt;br /&gt;for ($a = 0; $a &lt; N; $a++) {&lt;br /&gt;&lt;br /&gt;pero pensandolo un poco, este código se puede optimizar, ya que la segunda y tercer sentencia se pueden juntar, con lo que llegamos a lo siguiente&lt;br /&gt;&lt;br /&gt;for ($a = -1; ++$a &lt; N;) {&lt;br /&gt;&lt;br /&gt;También se podría encarar de esta forma&lt;br /&gt;&lt;br /&gt;$a = 0;&lt;br /&gt;while (++$a &lt; N) {&lt;br /&gt;&lt;br /&gt;pero la anterior parece (apenas) mejor, en la práctica.   Si bien esta optimización de código mejor muy poco la velocidad, hay que tener en cuenta que es una de las iteraciones más comunes y se puede repetir mucho a lo largo de nuestro trabajo.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.neonetsi.com.ar/seppo/desarrollophp/for-while.php"&gt;Ver ejemplo&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8081123338261260081-7704271467809346497?l=desarrollophp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.neonetsi.com.ar/seppo/desarrollophp/for-while.php' title='for - while'/><link rel='replies' type='application/atom+xml' href='http://desarrollophp.blogspot.com/feeds/7704271467809346497/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8081123338261260081&amp;postID=7704271467809346497&amp;isPopup=true' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/7704271467809346497'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8081123338261260081/posts/default/7704271467809346497'/><link rel='alternate' type='text/html' href='http://desarrollophp.blogspot.com/2007/08/for-while.html' title='for - while'/><author><name>seppo0010</name><uri>http://www.blogger.com/profile/02504022684566719870</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/-MZycJmm2nSM/TcRjh31LGOI/AAAAAAAAAEM/-VPfMm21vQo/s220/avatar.png'/></author><thr:total>2</thr:total></entry></feed>
