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.
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.
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 deju
.
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
.
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.
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:
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
.
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.
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.
Hoy te voy a presentar un creador de credenciales que acabo de programar y que…
Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…
En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…
En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…
Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…
En este artículo te voy a enseñar cómo usar un "top level await" esperando a…
Esta web usa cookies.
Ver comentarios
Excelente ayuda amigo, te invito un cafe. pude resolver una busqueda con like, enviando los datos con un array a execute() mil gracias.
Gracias por sus comentarios. Saludos!
Felicidades uno de los pocos que explique con tanto lujo de detalles
Gracias por los comentarios. Invito a compartir el contenido y suscribirse.
Saludos :)