Sep
27

No es la primera ni será la última vez que yo o gente que conozca, tenga problemas con los acentos en aplicaciones web que usen tecnologías PHP y MySQL. Realmente solucionar este problema no es tan complicado y, por ello, vamos a intentar abordar dos soluciones que se pueden usar por separado o unidas según nuestras necesidades.

Pero antes de proponer cada una de las soluciones por separado, vamos a ver un ejemplo de lo que estamos hablando: Supongamos que en nuestra página web hay un campo de entrada de datos, y en ella el usuario escribe:

Café Roma

Acto seguido pulsa el botón “Aceptar” para guardar ese texto en la base de datos. Todo parece ir bien, pero al recuperarlo de la base de datos y mostrarlo por pantalla vemos que escribe algo parecido a lo siguiente:

Café Roma

O, incluso

Caf� Roma

A grosso modo, esto ocurre porque estamos mezclando codificaciones uno o más sitios (navegador del usuario, servidor Apache con PHP instalado y la base de datos MySQL). Esto es un problema muy común y del que, mucha gente pregunta en foros todos los días y, por ello vamos a proponer soluciones para, en un principio mostrarlo en un navegador de forma correcta.

Conversión a caracteres HTML

HTML tiene una serie de caracteres especiales y reservados que tienen una función especial, un claro ejemplo son los caracteres mayor > y menor <, ya que, por ejemplo, estos caracteres se utilizan para delimitar las etiquetas XML en las que está basada la especificación HTML. Por ello, HTML especifica una serie de códigos llamados “Entidades HTML” que nos permiten codificar estos caracteres especiales. Por ello si queremos poner el símbolo <, realmente deberíamos escribir &lt; o bien &#60;. En el primer caso estaríamos indicando ese carácter usando un código alfanumérico y, en el segundo, estamos indicando el valor de dicho carácter en ASCII.

Como hacer esta conversión manualmente no siempre es posible y, en el caso de que si que lo sea, es bastante tedioso escribir usando esos códigos, PHP nos brinda una función que hará el trabajo sucio por nosotros: htmlentities; de manera que con invocar la función:

$str = htmlentities($str);

De manera que ahora en nuestra variable $str en lugar de tener, por ejemplo, “Camión”, que podría darnos problemas al guardarlo en una base de datos si el sistema está mal configurado (más adelante veremos como configurarlo bien), tendríamos una variable que contiene “Cami&oacute;n”, es decir, un string compuesto únicamente por caracteres ASCII que no debería darnos problema a la hora de persistirlo en cualquier base de datos; tenga el cotejamiento que tenga.

Finalmente, si vamos a mostrar el código por pantalla, tenemos dos opciones:

  1. Si vamos a mostrarlo en una web, no hace falta que tratemos el string para volver al formato original, ya que los navegadores son capaces de interpretar estos “caracteres codificados”.
  2. En caso de que no se coloque dentro de un fichero con formato (X)HTML, nos bastará con llamar al método html_entities_decode.

Almacenamiento directo

Lo que hemos visto en el apartado anterior, no deja de ser una chapuza (para la mayor parte de los casos) y que se puede solucionar de una forma bastante sencilla y, es que, si configuramos bien nuestro servidor Apache con PHP, nuestra base de datos MySQL y la conexión entre ambas, podemos ahorrarnos todo este tratamiento de datos; y no solo eso, sino que además, nos permitirá consultar cómodamente los datos almacenados desde cualquier otro sistema sin tener que perocuparnos de deshacer la codificación de caracteres extraños.

Vamos a ver los pasos para realizar esta configuración directamente:

  • El cotejamiento de la tabla (el de la base de datos también debería estarlo), debería de estar configurado en utf8, en mi caso, voy a utilizar utf8_unicode_ci. Esto podemos configurarlo, si usamos phpmyadmin, desde las opciones de la tabla.

  • Apache (con PHP instalado) y MySQL son dos servidores completamente separados y que, no tienen por qué usar el mismo idioma, de hecho, a no ser que tengamos instalado en PHP el conector de MySQL, no seremos capaces de comunicarnos entre ambos servidores. Por ello, es interesante configurar la conexión, en este caso, el idioma en el que van a hablar; para ello, tenemos que decirle a MySQL que queremos todos los campos en UTF-8 ejecutando la siguiente query:
 SET NAMES 'utf8'&amp;nbsp;
  • En caso de querer mostrar los datos en un fichero (X)HTML, deberíamos indicar el cotejamiento de la página añadiendo la siguiente etiqueta <meta> en el header de la página.
&amp;nbsp;&amp;lt;meta http-equiv=&quot;Content-type&quot; content=&quot;text/html; charset=utf-8&quot; /&amp;gt;&amp;nbsp;
Categoría Manuales, PHP | 1 Comentario »
May
30

http://diary.dipler.org

Seguimos con el desarrollo de la modesta aplicación que nos permite llevar un diario mientras nos facilita la vida para llevar un listado de tareas e ideas de forma completamente privada, y es que después de un tiempo sin actualizaciones oficiales, me complace presentar Diary 2.3, esta versión viene con las siguientes novedades que, espero les parezcan interesantes:

  • Corrección de errores puntuales en la edición de entradas categorizadas con un flag distinto al de Diario.
  • Corregido el error al pulsar el botón more después de haber realizado una búsqueda.
  • Corregido el error al codificar los signos +.
  • Mejora de los estilos para mejorar su compatibilidad con Firefox 4 e Internet Explorer 9.
  • Añadida la función de crecimiento automático del area de texto en función del contenido para mensajes nuevos.
  • Añadida la función de crecimiento automático del area de texto en función del contenido para el modo de edición de mensajes.
  • Añadidos hastags al estilo de los tags de Twitter, en los que al pulsar en ellos se realiza automáticamente una búsqueda con dchos tags.
  • Por defecto cuando llegamos a la parte final de la lista de elementos cargados, s

http://diary.dipler.org

Tags:
Categoría PHP, Producción propia | Sé el primero en comentar!
Mar
4

http://diary.dipler.org

Llevabamos ya un tiempo sin añadirle mejoras a la aplicación Diary, así que he creido oportuno lanzar una actualización en estas fechas. Si bien la actualización no tiene grandes mejoras abre paso a un nuevo ámbito de desarrollo. Para futuras versiones se pretende añadir notificaciones por email, planificar tareas para fechas seleccionadas y la integración de la aplicación con redes sociales como Facebook y/o Twitter.

En resúmen, las mejoras añadidas y los errores corregidos en esta versión son los siguientes:

  • Mejorado el rendimiento interno de alguna de las funciones del núcleo de la aplicación.
  • Se permite el borrado de entradas.
  • Se permite la edición de entradas (en caso de ser una tarea, esta estará marcada como no terminada por defecto.
  • Cambios leves en las estrucutras de datos que almacenan la información relativa a las entradas.
  • Añadidos efectos de transiciones en la barra de notificaciones.
  • Movida a la parte inferior la barra de notifiaciones.
  • Corregido el error al introducir en una entrada la barra inclinada “”.
  • Si una tarea está finalizada se mostrará el borde de color verde.
  • Mejorada la notificación de cargando.
  • Leve cambio en la hoja de estilos en lo relevante a enlaces,…
Tags:
Categoría PHP, Programas | Sé el primero en comentar!
Feb
10

http://diary.dipler.org

Como ya sabréis, las versiones de Diary 0.2.x están girando en torno a los diferentes tipos de entradas que podemos tener, así como en una mejora del rendimiento y de la seguridad que presenta la aplicación para permitir al usuario utilizar de una forma sencilla y práctica la aplicación sin tener que preocuparse de nada en absoluto. Dentro de las mejoras podemos diferenciar las de dos tipos:

  • De usuario (mejora la experiencia del usuario para con la aplicación)
    • Nueva interfaz de usuario
    • Nueva interfaz de búsqueda con nuevos filtros
    • Nuevo estilo de marcado de tareas pendientes y terminadas (imágenes en lugar de chekbox)
  • De servicio (mejora la calidad del servicio de forma transparente al usuario)
    • Ajax combinado con XML
    • Mayor seguridad a la hora de intentar replicar sesiones

Por el momento la aplicación está optimizada, como ya hemos dicho, para navegadores modernos, es decir, últimas versiones de Chrome y Firefox, en este último caso, y para sacarle el máximo jugo a la interfaz, será necesario el uso de Firefox 4.0

http://diary.dipler.org

Tags:
Categoría PHP, Producción propia, Programas | 1 Comentario »
Feb
3

http://diary.dipler.org

Como ya comenté en el post de introducción de Diary 0.1.2, esa versión no era nada más que un aperitivo de la que estaba desarrollando en ese momento y, dado que algunas personas me recordaron lo incómodo que era el cambio de hora en los artículos escritos hice una pre-versión estable y la subí, pero no traía grandes cambios; esta sí:

  • Las tareas pueden marcarse como terminadas o no utilizando el checkbox que hay a la izquierda del texto que hemos introducido (más tarde se añadirá búsqueda según el estado de las mismas)
  • Mejorados los logs internos de funcionamiento
  • Coloreadas las entradas de contenido en función del tipo
    • Diario: borde gris
    • Tarea: borde rojo
    • Idea: borde azul
  • Mejorado el sistema de funcionamiento de ajax, basándose ahora en el intercambio de ficheros xml sencillos, permitiendo así gestionar varias partes de la ventana con una sola petición y por ende, mejorando la experiencia de usuario
  • Añadido panel oculto en la parte superior que muestra mensajes de estado de la aplicación, estos pueden ser de tres tipos
    • OK
    • Alerta
    • Error

http://diary.dipler.org

Tags:
Categoría PHP, Producción propia, Programas | 1 Comentario »
Feb
1

http://diary.dipler.org

Me complace presentarles la versión 0.1.2 de Diary. Esta versión ya mencionada se ha adelantado un poco a lo que estaba previsto por los comentarios de algunas de las personas que utilizan la herramienta, entre sus mejoras tenemos:

  • Muestra de la hora local de Madrid por el momento en lugar de la costa oeste de Estados Unidos (fecha que se estaba mostrando hasta ahora)
  • Posibilidad de guardar y buscar entradas por tipo, en un futuro no muy lejano se pretende permitir al usuario marcar las tareas como terminadas y las ideas con estados.
    • Log: función de diario
    • Idea: nos permite almacenar fácilmente las ideas que vamos teniendo
    • Tarea: nos permite almacenar las tareas que debemos hacer en un futuro y no queramos olvidarnos

http://diary.dipler.org

Tags:
Categoría PHP, Producción propia, Programas | Sé el primero en comentar!
Jan
8

http://diary.dipler.org

Hace ya un tiempo, un amigo me preguntó acerca del día en el que había hecho una determinada actividad y no fui capaz de responderle, no suelo fijarme en las fechas en las que hago las cosas; el problema quedaría ahí de no ser porque si te roban una cuenta de correo electrónico te preguntan sobre la fecha aproximada en la que creaste la cuenta y así en muchos otros ámbitos; también cabe la posibilidad de que hayas establecido por sistema llevar un diario o simplemente que desees empezar a llevar uno.

Si la respuesta a alguna de estas preguntas es sí, eres un perfecto candidato para utilizar Diary, una aplicación muy sencilla que llevo desarrollando ya unos meses para uso exclusivamente personal pero que, después de que un amigo me dijese que le parecía una idea interesante y que quería usarlo también, hoy he abierto al público general para que pueda ser utilizada por aquellas personas que piensen que es una aplicación interesante para ellos.

¿Qué es Diary?

Diary es una aplicación escrita íntegramente en HTML5, PHP y Javascript apoyándose en hojas de estilo CSS3 y una base de datos MySQL, por lo que para poder visualizarlo perfectamente hará falta un navegador que soporte HTML5 y CSS3 (lo cual, sinceramente, no es muy complicado, todos los navegadores modernos deberían visualzarlo sin problema alguno.

¿Porqué no es compatible con todos los navegadores de la “historia”?

Muy sencillo, nació como una aplicación personal, y por ahora sigue siéndolo, si veo que a la gente le interesa y se va registrando gente, la aplicación irá creciendo, entre otras cosas, en compatibilidad con navegadores.

¿En qué se diferencia de un blog, Facebook o Twitter?

Es una aplicación de uso privado para el usuario registrado, el usuario que escribe algo podrá verlo de varias maneras, pero nadie más tendrá ese privilegio, por así decirlo es un diario en toda regla para el usuario que lo utilice con la ventaja de que está en la nube y puede ser accedido desde cualquier navegador moderno para insertar entradas nuevas a nuestra lista.

Es una aplicación muy simple ¿alguna mejora futura?

Yo soy de los que utilizan infinidad de aplicaciones de la web para escribir y leer cosas, así que una de las ideas que podrían ser interesantes en esta aplicación es permitir publicar (mediante un botón especial dentro del diario) una entrada determinada en redes sociales como Facebook o Twitter.

Otra mejora que se me había ocurrido es no solo utilizarlo como diario de cosas hechas, sino como lista de tareas pendientes.

Manual de uso

Continue reading “Diary 0.1” »

Tags:
Categoría PHP, Producción propia, Programas, Web | Sé el primero en comentar!
Oct
12

Can’t speak spanish? you can also read this article in english, click here.

Hace ya un tiempo, publiqué una clase para conectar desde PHP con MySQL, dicha clase, si bien cumplía perfectamente con su función, no era eficiente y tampoco le daba mucho juego al programador, así que cuando empecé a desarrollar Keopens, un CMS que empecé a desarrollar con el fin de que fuese un núcleo muy minimalista y adecuado a las nuevas tecnologías que están surgiendo. Por desgracia, no tengo tiempo suficiente para seguir con el desarrollo del mismo, pero algunas clases, si bien forman parte de dicho proyecto, las he sacado del mismo y continuado desarrollando ya que para los pequeños proyectos en PHP que tengo que ir haciendo son muy útiles.

Esta es una de esas clases que han ido creciendo poco a poco y según iban surgiendo necesidades se le iba incrementando las funcionalidades. En general se ha intentado seguir una POO correcta, pero con el fin de compartir la clase aislada, he decidido incluir dos funciones que no deberían estar en dicha clase, una de ellas es la de validar un e-mail y la otra es la de enviarlo.

La clase consta de dos modos de trabajo, un primer modo de debug o testing y un modo de producción, para cambiar entre ambos modos tan sólo hay que cambiarle el valor a una variable, además en el modo testing, la clase nos mostrará, al destruir el objeto o bajo demanda, el número de consultas ejecutadas y el tiempo total entre la creación de la instancia de la clase hasta que esta ha sido borrada. Si ocurre un error grave, y se dan una serie de condiciones (hemos inicializado la clase con un correo electrónico y no estamos en modo testing) se enviará por correo electrónico el fallo, esto es muy útil para tener constancia de los errores e incluso detectar en ocasiones la SQL-Injection en el caso de que se genere una sentencia que no haya podido ser ejecutada debido a errores de sintaxis.

Otras características interesantes:

  • Funciona tanto con conexiones persistentes como no persistentes.
  • Permite la creación de una copia de seguridad de la base de datos escribiendo una única línea de código (MySQL dump desde PHP).
  • Nos permite monitorizar las sentencias, controlando en qué fichero y línea del mismo se ejecuta.
  • Envío de emails cuando sucede un error grave.
  • Conteo de tiempo de ejecución.
  • Conteo de memoria utilizada por el script.
  • Conteo del número de sentencias ejecutadas.
  • Previsualización automática de los datos de salida de una sentencia (modo testing).
  • En bases de datos InnoDB permite el uso de transacciones.
  • Los mensajes extras mostrados en el modo testing tienen asociados una serie de estilos que indican visualmente si la ejecución ha sido correcta o, por el contrario, se ha producido un error.

He aquí una serie de ejemplos muy sencillos para mostrar rápidamente el potencial de la clase.

Para conectar con la base de datos, nos bastará con escribir dos líneas en nuestro programa y ya estaremos listos para trabajar:


$db = new MyMysqli($db_host, $db_uname, $db_pword, $db_name, $debugging, $contactMail, 'MYSQLI_ASSOC');
$db->connect(false);

Para ejecutar una consulta nos basta con escribir una sola directiva.

$query = 'SELECT * FROM text';
$db->execute($query, __LINE__, __FILE__);

Las constantes __FILE__ y __LINE__ nos sirven para indicar, en caso de error, el lugar en el que se encuentra dicha consulta a la base de datos.

El método ejecutado devuelve un resultSet, pero la clase mantiene una referencia al último resultSet dado que es muy probable que nos interese trabajar con él en breves, por lo que devuelve el resultSet para utilizarlo en casos muy específicos, como por ejemplo en el caso de que necesitemos trabajar con dos a la vez.

Para recorrer un resultSet de una consulta nos basta con ir llamando al método fetch(), si no se le pasa como parámetro un resultSet, ejecutará la acción sobre el obtenido en la última petición a la base de datos

if($db->numRows() > 0){
 while($result = $db->fetch()){
//TODO
 }
}

Si somos un poco “vagos” o simplemente vamos a consultar muchas veces los datos, la clase proporciona un método para pasar los datos obtenidos a una tabla.


$db->getTable();

Al igual que en el ejemplo anterior, si no se le pasa como parámetro otro resultSet, formará la tabla partiendo del último restulSet obtenido.

Por último mencionar que, en las primeras lineas de la clase, podrá observar que hay unas líneas comentadas que citan lo siguiente:


//Access control
if(!defined('IN_APP')) exit('Access Forbidden');

Estas líneas están comentadas por una sencilla razón, en PHP es posible acceder a cualquer archivo por URL si el servidor no está bien configurado, esto hace que si la página cargada imprime algo por pantalla, no se muestre, ya que la constante IN_APP no está definida con anterioridad. Por ende para que funcione, antes de incluir el archivo en la ejecución, deberíamos declarar la constante IN_APP. Obviamente el nombre de la constante puede ser cualquiera, en este caso, la que yo usaba en Keopens era IN_APP.

Descarga: [download id=”3″]

Categoría PHP, Producción propia, Programación, Web | Sé el primero en comentar!
Feb
4

A día de hoy PHP es uno de los lenguajes web más utilizados y que cuenta con una comunidad más grande de desarrolladores, esto es así por varias razones, entre las que se encuentran:

  • OpenSource.
  • Fácil de aprender.
  • Se pueden cumplir (desarrollar) la mayor parte de los caprichos que tenga el desarrollador/cliente para una página web.

Pero, como no es oro todo lo que reluce, PHP es un lenguaje muy poco eficiente si lo comparamos con sus competidores, y esto es así, porque es un lenguaje interpretado, es decir, cada vez que se solicita una página web el servidor tiene que coger el archivo, interpretarlo y después ejecutarlo, lo que hace que la rapidez del script creado merme considerablemente, y esta es la razón de ser de HipHop.

HipHop es un compilador de PHP cuya tarea es realizar la conversión de PHP a C++, un lenguaje mucho más eficiente que el primero, ya que este es compilado.

HipHop ha sido desarrollado por Facebook durante los dos últimos años, y esto es así por una sencilla razón, Facebook es una de las páginas más grandes y con más tráfico que existen en la actualidad y que han sido desarrolladas en PHP (no en su totalidad pero sí la parte web, para más información puedes leer ¿Cómo funciona facebook? ), lo cual les está obligando a invertir grandes cantidades de dinero en servidores que podrían haberse ahorrado, de hecho, según los datos que proporcionan en la página del proyecto en, aproximadamente un 50%, lo cual, siendo claros es una auténtica barbaridad hablando en términos económicos para la empresa.

A mi modo de ver, este es un gran avance para PHP que tenía que ocurrir tarde o temprano, dado que si hasta el momento PHP era el lenguaje idóneo para crear proyectos pequeños e incluso medianos, con este compilador (una vez que funcione perfectamente), podrá ser utilizado, sin grandes problemas para realizar grandes proyectos, eso sí, teniendo siempre en cuenta que ha de haber alguna manera de interactuar con C++ desde PHP sin tener que utilizar aplicaciones como Thrift, así que tiempo al tiempo, habrá que ir viendo como va evolucionando el proyecto.

Por último os dejo un esquema con su funcionamiento:

Fuente: Facebook Developers

Tags:
Categoría PHP, Programación, Programas | 2 Comentarios »
Oct
1

phpLa optimización de código es algo que ha preocupado a los programadores desde hace mucho tiempo, aunque por suerte o por desgracia, esta preocupación está decrementando día a día dado que los ordenadores con cada vez más potentes y por lo tanto importa menos el malgaste de ciclos de CPU.

Esta preocupación por el tiempo de ejecución de un programa viene dado sobre todo por el desarrollo de proyectos grandes (muchas visitas simultáneas) en los que sea crucial la velocidad de ejecución del algoritmo, por otro lado para aquellos proyectos que dada su escalabilidad pudiesen aumentar su complejidad de una forma un tanto brusca, es importante que el núcleo sea tan eficiente como sea posible además de, obviamente, tener el mínimo número de errores como sea posible, y por último puede que se dé el caso que en el caso de que tengas un servidor compartido, tu hosting te haya dado un toque porque haces uso de demasiados ciclos de CPU a la vez que te instan a migrarte a un plan de hosting más avanzado y que por consiguiente posea más recursos para tu script.

En este artículo vamos a intentar dar algunos consejos que permitan mejorar el rendimiento de nuestras aplicaciones web escritas en PHP con relativamente poco esfuerzo.

1.- Versión de PHP

Si estás utilizando una versión antigua de PHP será conveniente que hicieses una actualización de la misma en tu servidor, esto es así porque con cada versión, el equipo desarrollador de PHP ha ido implementando nuevas funciones así como optimizando partes de código, llegando a, reducir notablemente el tiempo de ejecución y la memoria consumida por determinados scrips y funciones de las que vienen por defecto.

A día de hoy, las últimas versiones estables de PHP son la 5.3.0 y la 5.2.11, eso sí, en ningún caso recomiendo instalar en un servidor en producción una versión que no sea estable.

2.- Utilizar algún sistema de Cacheado

En lenguajes interpretados, como es PHP, cada vez que se desea ejecutar un script, éste ha de ser interpretado, lo que hace que el consumo de CPU se incremente más que si se tratase de un lenguaje compilado, además de que ha de ejecutar todas las operaciones y funciones cada vez que se ejecute, lo que hace que si éstas son complejas, el script se ralentice considerablemente; un ejemplo de estas funciones son las llamadas a la base de datos.

A pesar de que no es recomendable cachear todas las páginas en algunos proyectos, en ocasiones es bastante recomendable utilizar aplicaciones como Memcache para así evitar que se ejecute el script siempre que se hace una petición de una página.

Otra opción es hacer uso de sistemas de templates, como es Smarty, que hace un cacheado de la página pero ejecutando siempre las consultas a la base de datos.

3.- Optimizar el código

3.1.- Strings

En PHP las cadenas de caracteres (Strings) pueden, al contrario que en lenguajes como C o Java, ir rodeados, tanto de comillas dobles () como de comillas simples (), pero a pesar de que el resultado pueda llegar a ser el mismo, el comportamiento de una cadena delimitada por uno u otro de estos caracteres se comporta de manera diferente. Continue reading “20+ Consejos para optimizar tus programas PHP” »

Tags:
Categoría Manuales, Open Source, PHP, Programación | 11 Comentarios »