LIKE PDO MySQL PHP. Para hacer una búsqueda usando comodines se usará la sentencia LIKE de MySQL, y para buscar de manera exacta un simple con where.
¿Qué es LIKE en MySQL?
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.
a) Si buscas con «%ju%» te devolverá a (Juan, Julián y Juan Carlos).
b) Si buscas «%u%» te devuelve a los 4. Esto es gracias a que usamos los comodines dé %, 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.
La consulta SQL queda algo así:
select * from personas where nombre like "%ju%";
LIKE PDO MySQL PHP: Tipos de consulta
Nos basaremos en el sitio oficial de MySQL, todo depende de la necesidad del proyecto. Estos son ejemplos a una tabla de (PERSONAL)
A) Comodín derecha
Con esta consulta puedes encontrar los nombres (name) que comiencen por la letra b.
SELECT * FROM personal WHERE nombre LIKE 'b%';
+--------+--------+---------+------+------------+
| nombres|ape | edad | sex | birth |
+--------+--------+---------+------+------------+
| Buffy | Harold | 23 | f | 1989-05-13 |
| Bowser | Diane | 34 | m | 1989-08-31 |
+--------+--------+---------+------+------------+
Consulta en PDO:
$query = $db->prepare('SELECT * FROM personal WHERE column LIKE ?'); $query->bindValue(1, "%fy", PDO::PARAM_STR); $query->execute();
B) Comodín izquierda
Con la siguiente consulta puedes buscar con los nombres que terminen con la letra o palabra fy
SELECT * FROM personal WHERE nombre LIKE '%fy';
+--------+--------+---------+------+----------+
| nombre |apellidos| edad | sex | birth |
+--------+---------+---------+------+---------+
| Fluffy | Harold | 23 | f | 1993-02-04 |
| Buffy | Harold | 34 | f | 1989-05-13 |
+--------+--------+---------+------+----------+
C) Comodín izquierda y derecha
La siguiente consulta es para buscar los nombres que contengan en alguna parte la letra W:
SELECT * FROM personal WHERE nombre LIKE '%w%';
+----------+-------+---------+------+----------------+
| nombre | apellidos | species | sex | birth |
+----------+-------+---------+------+----------------+
| Claws | Gwen | cat | m | 1994-03-17 |
| Bowser | Diane | dog | m | 1989-08-31 |
| Whistler | Gwen | bird | NULL | 1997-12-09 |
+----------+-------+---------+------+----------------+
D) Limite de caracteres en búsqueda
Para encontrar nombres que contengan exactamente un número exacto de caracteres, use instancias del _
carácter de patrón, por ejemplo, que tenga solo 5 caracteres:
SELECT * FROM personal WHERE nombre LIKE '_____';
+-------+--------+---------+--------+------------+
| nombre | apellidos | edad| sex| birth |
+-------+--------+---------+------+--------------+
| Claws | Gwen | 23 | m | 1994-03-17 |
| Buffy | Harold | 34 | f | 1989-05-13 |
+---------+--------+---------+------+------------+
Como te dije todo depende de tu necesidad, sin embargo, aquí te dejo la documentación oficial:
Mas información
Búsqueda con PDO ejercicio completo
Haremos uso de un formulario y un fichero llamado (listarPersonas.php) pero ahora la búsqueda se hace usando Like. El código de la consulta quedaría así:
1.- Script del buscador
<?php include_once "base_de_datos.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); } # Sin importar si hubo búsqueda o no, se nos habrá devuelto un cursor que iteramos más abajo... ?> <!--Recordemos que podemos intercambiar HTML y PHP como queramos--> <!DOCTYPE html> <html lang="es"> <head> <meta charset="UTF-8"> <title>Tabla de ejemplo</title> <style> table, th, td { border: 1px solid black; } </style> </head> <body> <form action="listarPersonasConBusquedaExacta.php" method="GET"> <input type="text" placeholder="Buscar por nombre" name="busqueda"> <br> <br> <button type="submit">Buscar</button> <br> <br> </form> <table> <thead> <tr> <th>ID</th> <th>Nombre</th> <th>Apellidos</th> <th>Género</th> <th>Editar</th> <th>Eliminar</th> </tr> </thead> <tbody> <?php while ($persona = $sentencia->fetchObject()) {?> <tr> <td><?php echo $persona->id ?></td> <td><?php echo $persona->nombre ?></td> <td><?php echo $persona->apellidos ?></td> <td><?php echo $persona->sexo ?></td> <td><a href="<?php echo "editar.php?id=" . $persona->id ?>">Editar</a></td> <td><a href="<?php echo "eliminar.php?id=" . $persona->id ?>">Eliminar</a></td> </tr> <?php }?> </tbody> </table> </body> </html>
2. Base de datos
Vamos a usar una base de datos con su respectiva tabla llamado personas, aquí el script que pueden ejecutar bajo el entorno de PHPMyAdmin u otro gestor.
CREATE TABLE `personas` ( `id` bigint(20) UNSIGNED NOT NULL, `nombre` varchar(255) NOT NULL, `apellidos` varchar(255) NOT NULL, `sexo` char(1) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; INSERT INTO `personas` (`id`, `nombre`, `apellidos`, `sexo`) VALUES (3, 'Lucia', 'Pino', 'F'), (4, 'Carlos', 'Rosales', 'M'), (5, 'Lucrecia', 'Benito', 'F'), (6, 'Luis', 'Castro', 'M'), (7, 'Carmen', 'Loyola', 'F'), (8, 'Guillermo', 'Cotrina', 'M'); ALTER TABLE `personas` ADD PRIMARY KEY (`id`); ALTER TABLE `personas` MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=9;
CONCLUSION
Hemos aprendido a usar la cláusula Like en varias perspectivas según el uso que se le quiere dar.
Haciendo uso de un par de formularios podemos buscar de manera estática o dinámica con partes de la palabra clave haciendo uso de comodines.
Les dejare el script completo para que lo puedan implementar y ver cómo funciona en nuestro servidor local o de producción.
Hola,
Es genial el ejemplo, si queremos buscar dos o mas palabras a la vez como podríamos hacerlo?
Gracias
Hola Maria
Para buscar con mas palabras te recomendaria este articulo que detallo sobre lo que deseas.
https://www.baulphp.com/buscador-avanzado-con-php-y-mysql/
Me ha quedado todo muy claro. Muchas gracias por el post!