| |

Crear un buscador simple para tu página mediante PHP

Algo fundamental para una página web es el uso de un buscador para acceder al contenido deseado de forma sencilla. Hace tiempo que andaba buscando este artículo y gracias a dzone lo he encontrado.
Se trata de crear un script en PHP para crear un buscador en nuestro sitio web. Para ello primero tendremos que crear un estructura en la base de datos para almacenar la relación entre palabras y páginas. Se crearán tres tablas, una para almacenar las páginas, otra para almacenar las palabras y otra para almacenar la relación entre páginas y palabras.
En segundo lugar deberemos indexar las páginas, usando un script que pasándole una URL, se la baje, le elimine todas las etiquetas HTML, la separe en palabras y guarde todos los datos en las tablas.
Por último crear una página para realizar la búsqueda, un sencillo formulario y una consulta a la BD nos devolverá una lista de páginas que contiene dicha palabra.
La verdad es que más simple no puede ser, y lógicamente no parece muy óptimo. Se le podrían hacer varios ajustes al script, como por ejemplo crear una lista de palabras “tabú”, las cuales no indexará (preposiciones, artículos). También en la tabla de relaciones entre páginas-palabras se le podría incluir la posición de la palabra, así si queremos buscar dos palabras seguidas, poder localizar mejor estos casos. Otra opción sería localizar las etiquetas HTML de cabeceras (h1, h2, …) de la página, las etiquetas para resaltar texto (strong, em, b, i, u) y darle una mayor importancia o prioridad a esas palabras en la tabla de relaciones, así los resultados que nos devuelva la consulta, los podemos ordenar por prioridad, y no tener que encontrarnos entre los primeros resultados páginas que poco tienen que ver con lo que buscamos simplemente porque contienen la palabra. Y por último, se me ocurre que en la tabla de páginas se le podría añadir un campo que indicara el número de visitas que recibe, priorizando las busquedas en páginas más visitadas.
Este método no creo que sea el mejor, y seguro que hay algoritmos más optimos, pero creo que motores de búsqueda implementados en algunos CMS como por ejemplo WordPress son peores aún. Por ejemplo WordPress busca la palabra en cada post escrito y almacenado en la BD. Y si el CMS ya usa expresiones regulares peor aún, porque aún lo mucho que me gustan, si que es cierto que consumen muchos recursos. Así les ha podido pasar a algunos blogs que han tenido que usar la búsqueda mediante Google en vez de la que incluye su CMS.
Algo que también estaría muy bien sería dotar al motor de la capacidad de ignorar acentos, así si buscamos “cancion” nos debería devolver los mismos resultados que si buscamos “canción”. Con el método explicado sería relativamente sencillo, ya que solo habría que almacenar las palabras en la tabla de palabras sin acento y luego al ser enviada por el buscador, quitarle los acentos para que se busque sin ellos.
Building a Simple Search Engine with PHP
Vía / dzone

| |

Convirtiendo XML a JSON con PHP5 DOM y XSL

JSON es un formato de datos de intercambio de Javascript que el auge de AJAX ha hecho muy popular. En javascript es mucho más cómodo trabajar con JSON frente a XML ya que podemos analizarlo rápidamente utilizando eval().

Cuando queremos trabajar con API´s como las de Amazon, Technorati, del.icio.us o Ficrk vía REST nos encontramos con que todas ellas devuelven los datos en XML. Gracias a PHP5 y utilizando sus extensiones DOM y XSL podemos transformar un documento XML en JSON de forma muy sencilla.

Veamos un ejemplo de cómo hacer esto con una consulta a la API de Technorati:

En primer lugar vamos a componer la URL con la que haremos nuestra consulta:


$technoratiApiKey = "introduceTuAPIdeTechnorati";
$url = "http://api.technorati.com/tag";
$tag = "usabilidad";
$request=$url."?key=".$technoratiApiKey."&tag=".urlencode($tag);

Y ahora creamos un nuevo objeto DOM y cargamos nuestro el fichero XML que nos devuelve la consulta:


$inputdom = new DomDocument();
$inputdom->load($request);

Para transformar los datos utilizaremos un xml2json.xsl, un fichero XSLT que tiene las instrucciones para transformar XML en JSON. Lo cargamos en un nuevo objeto DOM:


$xslt = "xml2json.xsl";
$xsl = new DomDocument();
$xsl->load($xslt);

¿Qué nos falta? pues: crear un procesador de XSLT en PHP, cargar nuestra xslt, realizar la transformación y generar el documento:


$proc = new XsltProcessor();
$xsl = $proc->importStylesheet($xsl);
$newdom = $proc->transformToDoc($inputdom);
print $newdom->saveHTML();

Próximamente veremos cómo utilizar esta técnica para procesar información de diversas API´s REST mediante AJAX.

|

EditThisPagePHP: herramienta colaborativa

etpp.pngEditThisPagePHP es una herramienta que nos permite modificar el contenido de una página de forma colaborativa uniendo el concepto de wiki, blog y CMS.
Cuando se quiere modificar contenido de forma colaborativa y llevar el control de los cambios se usa un wiki, en los blogs se permiten comentarios y feeds, y un CMS el tratamiento de roles y usuarios. Esta aplicación combina los tres conceptos para la modificación de páginas.
etpp2.png
Inicialmente se realizó para una única página, pero actualizaciones posteriores permiten hacerlo en diversas páginas. Permite editar páginas, comparar diferencias entre versiones, comentarios, feeds, integración con otros sistemas, filtros en los comentarios para evitar el spam, instalación web, notificación mediante pings y muchas otras opciones.
EditThisPagePHP
Vía / Linux.com

PHPMaker: automatiza la generación de PHP

phpmaker.pngPHPMaker es una aplicación para Windows que automatiza la generación de scripts para PHP. A partir de una base de datos MySQL, genera los scrips necesarios para ver, buscar, editar y borrar registros de las tablas.
phpmaker2.png
Diseñado para ofrecer gran flexibilidad, dispone de muchas opciones que consiguen diseñar tu aplicación según tus necesidades. La generación de código es limpio y fácil de personalizar, pudiendo ser ejecutado en distintos tipos de máquinas.
PHPMaker
Vía / DirTik

10 errores que suelen cometer los programadores de PHP

Algo que nos pasa a los que aprendemos PHP por nuestra cuenta es coger fallos por malas costumbres, otras veces la gente tiene fallos por falta de conocimiento. Aquí os paso resumida una lista de los errores más comunes que se comenten a la hora de programar en PHP.

  • No escapar lo que nos llegar por parámetro: para evitar el cross-site scripting es necesario escapar las posibles entradas HTML que nos lleguen por parámetro. Si al introducir el usuario nos metieran:
    <script>...$lt/script$gt;

    sería necesario escapar las entidades HTML para evitar ataques. Para ello se usaría el siguiente código:

    htmlspecialchars($_GET['username'], ENT_QUOTES)
  • No escapar las entradas de consultas SQL: para evitar SQL-injections es necesario escapar antes el contenido de las entradas que pasamos a nuestras consultas SQL. Por ejemplo, tendríamos que crearnos una función que escapara las comillas simples.
  • Uso incorrecto de las funciones para la cabecera HTTP (header(), session_start() y setcookie()): muchas veces cuando desarrollanos nos encontramos con un mensaje de error que dice que ya se ha mandado la cabecera y que no se puede añadir más información. Esto es debido a que las funciones de cabecera (header(), session_start(), setcookie()) se tienen que usar al principio del script, antes de mandar nada a la salida.
  • No controlar lo que añades mediante require o include: se trata de no comenter el error de incluir un fichero cuya ruta se pasa por parámetro, ya que aunque nosotros seamos quienes pongan ese valor en el parámetro, puede llegar alguien y cambiar la ruta y pasar otro fichero que no sea de fiar.
  • Errores de sintaxis: bueno, aquí el autor del artículo, se ha quedado un tanto agusto. Todo el mundo comete errores de sintaxis cuando programa, ya sea en PHP, C, .NET o cualquier otro lenguaje de programación. Yo si que comentaria un error que suelo cometer, que es el escribir mal una variable y que el script no falle (como ocurriría en Java), pero que se obtengan datos incorrectos.
  • No usar la orientación a objetos: desde la versión 4 los objetos se admiten en PHP, en PHP5 se mejoró su utilización. Debemos aprovecharnos de esas posibilidades.
  • No usar frameworks: no reinventemos la rueda, si ya hay un framework que nos gestiona la base de datos, los errores y otras cosas, no pierdas el tiempo en implementarlo tu mismo.
  • Desconocer funcionalidades: PHP dispone de muchas funcionalidades en su core o en su librerías, cuantas más funcionalidades conozcas, menos tiempo perderas en el desarrollo.
  • Usar versiones antiguas de PHP: tiene dos inconvenientes, que desaprovechas nuevas funcionalidades y corres el peligro de no tener todos los bugs parcheados.
  • Doble escapado de comillas: es posible encontrar en código PHP algo así: \’ o \”. Esto suele ocurrir cuando se desarrolla con magic_quotes off y se instala en un servidor con magic_quotes on.

The PHP coder’s top 10 mistakes and problems

Vía / dzone

|

AJAX Locking: bloquea el acceso a AJAX

AJAX Locking es una librería de PHP que nos permite bloquear el acceso a los recursos del servidor a las peticiones AJAX. Ocurre con frecuencia que cuando una aplicación usa AJAX se efectuen muchas llamadas al servidor, accediendo todos a los mismos recuersos, pudiendo obtener resultados no muy deseados.
En estos casos, esta libería es lo más adecuado, ya que bloquea recursos del servidor, previniendo estos errores.
AJAX Locking
Vía / PHP Classes

|

Laboratorio: ejemplo de CAPTCHA

El otro día ví en Rapidshare un ejemplo de CAPTCHA que parecía fácil de desarrollar. Se trata de las letras (tres en este caso), giradas ángulos aleatorios, pero no demasiado para que se pueda leer con facilidad, sobre un fondo de letras de tonalidad parecida, de menor tamaño y también giradas aleatoriamente.

Un ejemplo dinámico es el siguiente:

CAPTCHA

El método es muy sencillo, usamos una cadena de texto con todas las letras que queremos que aparezcan, para poder acceder aleatoriamente a cada una de ellas. Después nos crearemos el fondo de la imagen, siendo un gris claro y unas letras pequeñas, de un gris un poco más oscuro sobre ellas, que llenan toda la imagen. Y por último, creamos las tres letras del CAPTCHA para mostrarlas en el centro de la imagen y de un tamaño considerable.

En este caso he cogido la fuente de daFont, pero se puede usar la que se quiera. Yo recomiendo usar alguna que esté distorsionada para que la lectura para nosotros no presente complicaciones, pero si para algún proceso automático.

El script sería el siguiente, teniendo en cuenta que no se trata el almacenamiento en sesión de las letras del CAPTCHA para luego poder compararlas.

<?php
// Juego de letras para usar
$letras = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
// Configuración tamaño imagen y tamaño fuente
$ancho_caja = 200;
$alto_caja = 100;
$tam_letra = 16;
$tam_letra_grande = 60;
// angulo máximo que rota (izq y der) cada letra
$angmax = 20;
// Establecer el tipo de contenido
header("Content-type: image/png");
// Creamos una imagen
$im = imagecreate($ancho_caja, $alto_caja);
// Creo el color del texto, del texto del fondo y del fondo de la imagen
$gris = ImageColorAllocate($im, 200, 200, 200);
$colorLetra = ImageColorAllocate($im, 175, 175, 175);
$colorLetraFondo = ImageColorAllocate($im, 180, 180, 180);
// tipo de letra obtenido en dafont.net
$fuente = './Hotel Coral Essex.ttf';
// Calculo el número de líneas que entran
$caja_texto = imagettfbbox($tam_letra, 0, $fuente , $letras);
$alto_linea = abs($caja_texto[7]-$caja_texto[1]);
$num_lineas = intval($alto_caja / $alto_linea)+1;
// Dibujo las letras del fondo
// Cada letra de escribe de una en una para poder
// darle una rotación independiente al resto
$pos = 0;
for ($i = 0; $i<$num_lineas; $i++) {
$x = 0;
for ($j = 0; $j<30; $j++) {
$texto_linea = $letras[rand(0, strlen($letras)-1)].' ';
$caja_texto = imagettfbbox($tam_letra, 0, $fuente , $texto_linea);
imagettftext($im, $tam_letra, rand(-$angmax, $angmax), $x, $alto_linea*$i, $colorLetraFondo, $fuente , $texto_linea);
// Posicion x de la siguiente letra
$x += $caja_texto[2] - $caja_texto[0];
}
}
// Escribo las tres letras del CAPTCHA
$res = $letras[rand(0, strlen($letras)-1)];
$ang1 = rand(-$angmax, $angmax);
$caja_texto = imagettfbbox($tam_letra_grande, $ang1, $fuente , $res);
$y1 = abs($caja_texto[7]-$caja_texto[1]);
$x1 = abs($caja_texto[2]-$caja_texto[0]);
$res .= $letras[rand(0, strlen($letras)-1)];
$ang2 = rand(-$angmax, $angmax);
$caja_texto = imagettfbbox($tam_letra_grande, $ang2, $fuente , $res[1]);
$y2 = abs($caja_texto[7]-$caja_texto[1]);
$x2 = abs($caja_texto[2]-$caja_texto[0]);
$res .= $letras[rand(0, strlen($letras)-1)];
$ang3 = rand(-$angmax, $angmax);
$caja_texto = imagettfbbox($tam_letra_grande, $ang3, $fuente , $res[2]);
$y3 = abs($caja_texto[7]-$caja_texto[1]);
$x3 = abs($caja_texto[2]-$caja_texto[0]);
imagettftext($im, $tam_letra_grande, $ang1, ($ancho_caja/2)-(($x1+$x2+$x3)/2), $y1+($alto_caja-$y1)/2, $colorLetra, $fuente , $res[0]);
imagettftext($im, $tam_letra_grande, $ang2, ($ancho_caja/2)-(($x1+$x2+$x3)/2)+($x1), $y2+($alto_caja-$y2)/2, $colorLetra, $fuente , $res[1]);
imagettftext($im, $tam_letra_grande, $ang3, ($ancho_caja/2)-(($x1+$x2+$x3)/2)+($x1+$x2), $y3+($alto_caja-$y3)/2, $colorLetra, $fuente , $res[2]);
imagepng($im);
imagedestroy($im);
imagedestroy($im2);
?> 

Un ejemplo lo podéis ver en la misma imagen que aparece arriba, ya que es dinámica y se modifica al recargar la página.

Código

Instalar PHP 5 en tu propio servidor

Un buen artículo que nos enseña cómo instalar PHP 5.2 en nuestro servidor, cuando el hosting no nos lo ofrece. En este caso se trata de DreamHost, pero como bien dice el autor, se puede usar para otros como Site5 Hositng o TextDrive.
En este caso, el autor necesita de PHP 5.2 por necesidades con la librería GD y Freetype y aunque el hosting ofrece un script que debería realizarnos la instalación, no funciona correctamente.
El script que nos ofrece nos descargará los archivos necesarios mediante FTP y HTTP, descomprimirá lo obtenido y lo instalará.
Espero que sea de utilidad para aquellos que se encuentren con el mismo problema.
Install Your Own PHP 5 on Your Web Host

ffmpeg-php: obten información de tus videos y sonidos mediante PHP

ffmpeg-php es una librería para acceder y recuperar información de ficheros de video y audio.
Con esta librería se pueden obtener frames de los ficheros de video como imágenes para luego manipularlas con las funciones GD de PHP. Muy útil para crear thumbnails de los videos que poseemos. De los ficheros audio se puede obtener la duración y el bitrate. Son varios los formatos de audio (mp3, wma, …) y de video (mov, avi, mpg, wmv, …) los que admite esta librería.
Entre las características que nos ofrece, nos encontramos con lo siguiente: orientado a objetos, obtener imágenes de los frames de un video, crear GIFs animados de los frames de un video o de imágenes GD, utiliza las características de ffmpeg para redimensionar y recortar los frames obtenidos, obtener de los ficheros mp3 la información meta de los archivos.
Para utilizar esta librería es necesario ffmpeg-0.4.9_pre1, php-4.3.0 y gd-2.0.
ffmpeg-php

| | | |

Cómo destacar en el menú de navegación el acceso en que nos encontramos

Imaginemos que tenemos un menú de navegación y queremos diferenciar la opción de Home, el About, el Contacto… ya que en esos momentos estamos en uno de ellos.

¿Cómo hacerlo? En Babblative nos enlazan algunos métodos para hacerlo:

Method 1 – WordPress: WordPress actually has this feature built-in. WP-List-Pages

Method 2 – PHP: Jem’s Trendy Active CSS Tabs or Matt’s Intelligent Menu’s. I’ve personally had middling success with PHP on a manually maintained site and little success with it on Textpattern.

Method 3 – Textpattern: You can either muck around with multiple templates, which is bloated and unnecessary, or you can use this method. If you choose to use the multiple templates then you’ll need to read how do I use a different page layout for each section?

Method 4 – Manually Maintained Sites: Use Hicksdesigns method to highlighting current page with CSS

Keep Reading: Keeping a ‘current state’ on navigation, Keeping Navigation Current With PHP, EasyNav, Setting the Current Menu State with CSS

Vía / Babblative