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;