Búsquedas con LIKE en bases de datos.

Resumen.

Cuando nuestro sitio Web alcanza un cierto volumen de contenidos se hace necesario un buen buscador. Esto no solo nos facilita el acceso a contenidos específicos, también, y como consecuencia directa, se reduce la tasa de rebote, un factor SEO muy importante. Por otro lado, no todo son los contenidos propiamente dichos, un sitio Web también es un sistema de gestión, lo cual implica poder localizar, por ejemplo, usuarios rápidamente.

Artículo.

Como es obvio, un sitio Web, cuanto más pequeño sea, más fácil resulta acceder a los contenidos específicos, es fácil saber lo que hay en ese sitio Web y dónde está. Se podría decir que en términos generales un sitio Web con menos de 10 páginas no precisa un buscador. Pero claro, como somos ambiciosos nuestros sitios Web no paran de ampliarse, y estas ampliaciones, ya sea en número de publicaciones, o bien en secciones, puede hacer que el contenido resulte complicado de encontrar, sin olvidar, por supuesto, que si tenemos una tienda online, precisamos poder encontrar rápidamente clientes, artículos, pedidos… Vamos a presentar dos métodos de búsqueda, bueno, más bien una, ya que el primero, más que un método de búsqueda es un filtrado de datos.

La primera y mas sencilla forma de “búsqueda” es el filtrado de datos por un cierto valor, que tomando como referencia este artículo, podríamos resumir en la siguiente consulta:

SELECT * FROM $tb1 WHERE usuario = 'pepe27'

De esta forma siempre que en el campo usuario aparezca “pepe27” tendremos resultados. Este tipo de consulta resulta perfecta, por ejemplo, para ver todos los datos de un usuario a partir de un listado pasando como variable por URL el nombre de usuario, tal y como puede verse en el artículo de referencia:

<a href=\"ficha_usuario.php?us=".$registro['usuario']."\" title=\"Ver ficha del usuario\">".$registro['usuario']."</a>

La variable la recibiríamos de la siguiente forma:

$usuario = $_GET['us'];

Este método de “búsqueda” para una tabla de registro de usuarios no resulta muy apropiado, pero sí podría ser válido para una tabla que recogiera, por ejemplo, los pedidos de los clientes. La ventaja de este método es la precisión, el “inconveniente” es que tenemos que introducir el valor exacto. Veamos:

SELECT * FROM $tb1 WHERE usuario = 'pepe2'

Un simple error al teclear haría que nuestra consulta no diera ningún resultado. Es decir este tipo de consulta funciona haciendo una búsqueda exacta, idénticos caracteres, idéntico orden e idéntico número de caracteres. Esto lo podemos solucionar con otro tipo de consulta, como la siguiente:

SELECT * FROM $tb1 WHERE usuario LIKE '%$busca%'

El operador LIKE nos permite realizar la búsqueda de una cadena exacta dentro de otra más amplia siempre y cuando los caracteres buscados estén en el mismo orden.

Como podemos ver, este tipo de consulta se construye de una manera un poco diferente a las anteriores vistas, ahora desaparece el signo igual “=” que se sustituye por LIKE y el valor a buscar entre %, siendo este el esquema general:

campo LIKE '%$buscar%'

donde el signo de porcentaje “%” puede indicar a la consulta uno u otro comportamiento, veamos:

Si omitimos el primer porcentaje 'pepe%' nos daría todos los usuarios cuyo nombre comience por “pepe”.

Si omitimos el segundo porcentaje '%27' nos daría todos los usuarios cuyo nombre finalice en “27”.

Podemos decir que el signo de porcentaje indica a la consulta que puede existir algo antes o después de la cadena buscada, si tenemos los dos, significa que podrá existir otros caracteres antes y después de la cadena buscada. Otros ejemplos quizás más claro:

'j%' nos daría como resultados todos los usuarios que comenzasen por j, como javier, julio, jaime, juan, etc.

'%o' nos daría como resultado los usuarios que terminen en “o” como antonio o mario.

Un problema que puede surgir es que LIKE pueda diferenciar entre mayúsculas y minúsculas. Este problema tiene fácil solución es el convertir la cadena a buscar, por ejemplo, a minúsculas, y el contenido del campo también pasarlo a minúsculas. Para lo cual podemos usar las siguientes funciones:

- Para convertir la cadena:
Con strtolower() convertimos la cadena a minúsculas.
Con strtoupper() convertimos la cadena a mayúsculas.
Por ejemplo: strtolower($busca)

- Para convertir el campo MySQL:
Con LOWER() pasamos el contenido del campo a minúsculas.
Con UPPER() pasamos el contenido del campo a mayúsculas.
Por ejemplo: LOWER(usuario)

Así, nuestra consulta quedaría de la siguiente forma:

SELECT * FROM $tb1 WHERE LOWER(usuario) LIKE '%".strtolower($busca)."%'

También puede ocurrir que deseemos buscar en más de un campo de nuestra tabla, en tal caso debemos concatenar los campos a consultar mediante CONCAT_WS(), quedando ahora la consulta:

SELECT * FROM $tb1 WHERE CONCAT_WS(lower(usuario), lower(email)) LIKE '%".strtolower($busca)."%'

Para ir cerrando este capitulo, creo importante mencionar que rompiendo el esquema habitual de presentación de cada artículo, en este no vamos a presentar el código completo, el motivo, muy simple, si tomamos en artículo de referencia al que hicimos mención al comienzo, solo tenemos que modificar la consulta, todo lo demás quedaría idéntico.

Vasta con cambiar el contenido de la variable $_pagi_sql ya hemos convertido nuestra página en un buscador paginado. Ahora quedaría de esta forma:

$_pagi_sql = "SELECT * FROM $tb1 WHERE CONCAT_WS(lower(usuario), lower(email)) LIKE '%".strtolower($busca)."%'";

Por lo demás, todo idéntico. Lo mismo podemos decir del artículo relacionado con la lectura de datos, solo tenemos que modificar la variable $_Leer_SQL para convertirlo en un buscador.

Ahora solo nos quedaría hablar de cómo le enviamos la cadena a buscar, y como ya se comento en el artículo dedicado al envio de variables, el método adecuado para esto es GET, $_GET['busca'].

Sobre el operador LIKE se puede hablar mucho, tiene muchas más cosas que descubrir, pero el objetivo de este artículo solo es tratar de introducirnos en su conocimiento. En posteriores publicaciones le dedicaremos una atención más profunda.
Tags: Buscador || LIKE || consultas || filtro || paginación

Comentarios.

Sin comentarios, publica el tuyo.