php

Búsqueda en MySQL con PHP y PDO: con like y coincidencia exacta

Esta es la tercera parte de los tutoriales sobre cómo consumir una base de datos de MySQL desde PHP usando PDO para ejecutar las consultas.

Puedes ver la primera parte aquí, y la segunda aquí. Lo que nos reúne en esta ocasión es la búsqueda en tablas desde PHP.

Para hacer una búsqueda usando comodines se usará la sentencia LIKE de MySQL, y para buscar de manera exacta un simple where.

Ejercicios de SQL y requisitos

Antes que nada, te invito a ver algunos ejercicios de consultas con SQL. Van a servirte para darte una idea de cómo funcionan las consultas independientemente del lenguaje con el que se haga.

Si no tienes MySQL o PHP mira aquí cómo se instalan. Oh, por cierto, igualmente puedes configurar MySQL en Android y Apache con PHP igualmente en Android.

Recuerda ver los tutoriales anteriores, pues aquí explicaré tomando en cuenta que ya los has leído. Como siempre, el código actualizado está en mi GitHub.

Ahora sí, comencemos.

Un poco de teoría con LIKE

Like (su traducción sería como o parecido a, así como cuando lo aplicamos a “eres como mi abuelo”) es la solución cuando quieres buscar pero tomando en cuenta parte del campo. Tenemos por ejemplo los campos con nombres: Juan, Julián, Juan Carlos, Luis.

Si buscas con "%ju%" te devolverá a Juan, Julián y Juan Carlos. Si buscas "%u%" te devuelve a los 4. Esto es gracias a que usamos los comodines de %, que quieren decir “lo que sea” así que al usar "%ju%" le decimos a MySQL:

Busca en donde tenga cualquier cosa antes de ju, y cualquier cosa después de ju.

En idioma SQL la consulta queda algo así:

select * from personas where nombre like "%ju%";

Nota: también existe RLIKE y por cierto, LIKE funciona en otros motores. Cabe mencionar que LIKE es una sentencia más de SQL, así que no solamente sirve para seleccionar sino también para eliminar, actualizar y otras operaciones.

Nota 2: podrías usar otros comodines con like, o usar un solo signo de porcentaje. Por ejemplo LIKE "%ju" devolverá aquellos campos en donde termine con ju, y "ju%" aquellos en donde empiecen con ju.

Búsqueda exacta o estricta

Si quieres buscar en donde el valor sea exactamente a la búsqueda hay que usar where. Por ejemplo:

select * from personas where nombre = "Luis";

Esta búsqueda es exacta, casi no es usada con cadenas pero no viene mal conocerla.

Hablar es de mal gusto, muéstrame el código

Búsqueda desde PHP con LIKE

Ahora que ya explicamos a like y todo eso de las búsquedas veamos cómo se aplica a PHP con PDO. Tomaremos la búsqueda de un parámetro GET y a partir del mismo ejecutaremos la consulta al motor.

Queda así:

<?php
# Por defecto hacemos la consulta de todas las personas
$consulta = "SELECT * FROM personas";

# Vemos si hay búsqueda
$busqueda = null;
if (isset($_GET["busqueda"])) {
    # Y si hay, búsqueda, entonces cambiamos la consulta
    # Nota: no concatenamos porque queremos prevenir inyecciones SQL
    $busqueda = $_GET["busqueda"];
    $consulta = "SELECT * FROM personas WHERE nombre LIKE ?";
}
# Preparar sentencia e indicar que vamos a usar un cursor
$sentencia = $base_de_datos->prepare($consulta, [
    PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL,
]);
# Aquí comprobamos otra vez si hubo búsqueda, ya que tenemos que pasarle argumentos al ejecutar
# Si no hubo búsqueda, entonces traer a todas las personas (mira la consulta de la línea 5)
if ($busqueda === null) {
    # Ejecutar sin parámetros
    $sentencia->execute();
} else {
    # Ah, pero en caso de que sí, le pasamos la búsqueda
    # Un arreglo que nomás llevará la búsqueda con % al inicio y al final
    $parametros = ["%$busqueda%"];
    $sentencia->execute($parametros);
}

Estamos protegiendo nuestro código y evitando inyecciones SQL usando un “placeholder”, es decir, un signo de interrogación, Luego, al ejecutar la sentencia, le ponemos a la búsqueda los signos de porcentaje.

No lo intentes hacer así:

select * from personas where nombre like "%?%";

Porque no funcionará. Tienes que poner los comodines en la cadena. Y nunca concatenes, pues estarías vulnerable a un ataque de inyección SQL.

Sin importar la consulta, al final se traen los resultados y se dibujan los datos. Por cierto, he agregado un formulario en donde se pone la búsqueda:

Like de SQL con PHP y PDO

El formulario se envía al mismo archivo de PHP. Para dibujarlo se crea una etiqueta form con el método en GET y al campo de búsqueda se le pone el nombre busqueda para que se concatene a la URL automáticamente.

    <!--
        Un formulario que únicamente permite buscar. Se envía
        a este mismo script y se hace con GET
    -->
    <form action="listarPersonasConBusqueda.php" method="GET">
    <!--
        Fíjate en el atributo name="busqueda", pues esa variable
        la estamos obteniendo de $_GET allá arriba

    -->
        <input type="text" placeholder="Buscar por nombre" name="busqueda">
        <br>
        <br>
        <button type="submit">Buscar</button>
        <br>
        <br>
    </form>

De esta manera se hace la búsqueda y se muestran los resultados de manera fácil. El código está en el archivo listarPersonasConBusqueda.php.

Búsqueda exacta con PDO

Tenemos el mismo formulario y casi el mismo script (ahora se llama listarPersonasConBusquedaExacta.php) pero ahora la búsqueda se hace de manera exacta. El código de la consulta queda así:

<?php
# Por defecto hacemos la consulta de todas las personas
$consulta = "SELECT * FROM personas";

# Vemos si hay búsqueda
$busqueda = null;
if (isset($_GET["busqueda"])) {
    # Y si hay, búsqueda, entonces cambiamos la consulta
    # Nota: no concatenamos porque queremos prevenir inyecciones SQL
    $busqueda = $_GET["busqueda"];
    $consulta = "SELECT * FROM personas WHERE nombre = ?";
}
# Preparar sentencia e indicar que vamos a usar un cursor
$sentencia = $base_de_datos->prepare($consulta, [
    PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL,
]);
# Aquí comprobamos otra vez si hubo búsqueda, ya que tenemos que pasarle argumentos al ejecutar
# Si no hubo búsqueda, entonces traer a todas las personas (mira la consulta de la línea 5)
if ($busqueda === null) {
    # Ejecutar sin parámetros
    $sentencia->execute();
} else {
    # Ah, pero en caso de que sí, le pasamos la búsqueda
    # Un arreglo que nomás llevará la búsqueda con % al inicio y al final
    $parametros = [$busqueda];
    $sentencia->execute($parametros);
}

Ahora usamos where e igualmente un placeholder, pero al ejecutar la sentencia no ponemos los signos de porcentaje porque debemos pasar la cadena limpia.

Nota: el motor de MySQL no distingue mayúsculas y minúsculas al menos que lo indiquemos. Por lo tanto, si buscamos “Luis” o “luis” dará lo mismo, es decir, traerá los resultados.

Poniendo todo junto

Como ya lo dije anteriormente, todo el código está en mi GitHub. Puedes descargarlo, ponerlo en tu carpeta pública y probar los ejemplos.

Te invito a leer más sobre PHP, MySQL y Bases de datos en mi blog.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Ver comentarios

Entradas recientes

Creador de credenciales web – Aplicación gratuita

Hoy te voy a presentar un creador de credenciales que acabo de programar y que…

2 semanas hace

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

2 semanas hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

2 semanas hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

2 semanas hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

2 semanas hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

2 semanas hace

Esta web usa cookies.