tutorial query preparadas espaƱol ejemplos consultas consulta php mysql search like

query - PHP PDO consulta MySQL LIKE-> varias palabras clave



pdo query fetch (3)

Por favor, compruebe el siguiente código.

<?php $search = isset($_GET[''q'']) ? $_GET[''q''] : ''''; $search = strtoupper($search); $search = strip_tags($search); $search = trim($search); $split_words = explode(" ", $search); $query = "SELECT * FROM `users`"; if(count($split_words) > 0){ $query .= " WHERE " for($i=0 ; $i < $split_words; $i++){ $query .= " name LIKE ? OR "; } $query = substr($query , 0, -3); //Remove last 3 characters OR with space array_walk($split_words,"addPercentage"); $query->execute($split_words); }else{ $query->execute(); } $result = $query->rowCount(); echo $result; function addPercentage(&$value,$key) { $value = "%".$value."%" ; } ?>

Tengo una tabla de usuarios en MySQL y me gustaría buscar por nombre. En este momento tengo el siguiente código:

<?php $search = @$_GET[''q'']; $search = strtoupper($search); $search = strip_tags($search); $search = trim($search); $query = $con->prepare(''SELECT * FROM `users` WHERE name LIKE ?''); $query->execute(array(''%''.$search.''%'')); $result = $query->rowCount(); echo $result; ?>

El problema es que quiero tener varias palabras clave. Digamos que alguien escribe "Aquí debería haber un buen nombre de una persona", luego buscaría "aquí", "debería", "ser", etc. y mostrar los resultados de cada fila donde hay palabras en la columna "nombre". Busqué en la web y leí que es posible hacer "¿O NOMBRE COMO?" tantas veces como las palabras clave, pero realmente no pude hacerlo funcionar y no estoy seguro de si está lo suficientemente optimizado con ~ 20 palabras (en caso de que busquen con tantas palabras). Si se debe utilizar, ¿puede ayudarme a cambiar mi código para que busque cada palabra de forma independiente?

¡Gracias!

EDITAR:

Pude solucionar este problema por un chico que publicó en este hilo. La siguiente solución funciona para mí:

<?php $search = isset($_POST[''q'']) ? $_POST[''q''] : ''''; $search = strtoupper($search); $search = strip_tags($search); $search = trim($search); $split_words = explode(" ", $search); if(count($split_words) > 0) { $sql = "SELECT * FROM `users` WHERE "; for($i=0 ; $i < count($split_words); $i++){ $sql .= " name LIKE ? OR"; } $sql = substr($sql , 0, -3); //Remove last 3 characters OR with space array_walk($split_words, "addPercentage"); $query = $con->prepare($sql); $query->execute($split_words); } function addPercentage(&$value, $key) { $value = ''%''.$value.''%''; } ?>


$words = explode(" ", $search); $i = 0; while($words[i] != null) { //Query where name LIKE words[i] }


No debe usar @ para silenciar errores, es una mala práctica, verifique si el valor está establecido. El siguiente ejemplo debería funcionar, pero los resultados podrían no ser tan relevantes.

$search = isset($_GET[''q'']) ? $_GET[''q''] : ''''; $search = strtoupper($search); $search = strip_tags($search); $search = trim($search); $words = explode('' '', $search); $words_condition = array(); $arguments = array(); foreach ($words as $word) { $words_condition[] = ''name LIKE ?''; $arguments[] = ''%''.$word.''%''; } $query = $con->prepare(''SELECT * FROM `users` WHERE ''.implode('' OR '', $words_condition)); $query->execute($arguments); $result = $query->rowCount(); echo $result;