Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
postei isso em um topico agora a pouco e vou ter que utilizar no meu sistema de busca.
é correto fazer isso:
$palavra = explode(" ",$_POST["busca"]);
$palavra = removeArtigos($palavra);
$totalPalavras = count($palavra);
for($i = 0; $i < $totalPalavras; $i++){
if($i == 0)
$qry = " empresa LIKE '%$palavra[$i]%' OR endereco LIKE '%$palavra[$i]%' OR bairro LIKE '%$palavra[$i]%'";
else
$qry .= " OR empresa LIKE '%$palavra[$i]%' OR endereco LIKE '%$palavra[$i]%' OR bairro LIKE '%$palavra[$i]%'";
}
$query = "SELECT * FROM tab_search WHERE".$qry;
onde removeArtigos() eu retiro da busca coisas como: "e", "a", "o", "de" .. etc.etc..etc para evitar uma busca muitoo abrangente.
então no caso de $_POST["busca"] ser igual a: "Busca de Teste", o sistema busca apenas: "Busca" e "Teste";
Mas a logica acima está correta?
Tem um jeito mais "economico" de fazer?
Valeu.
http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif
acredito q dah pra você fazer direto com foreach.. ai você não precisa utilizar a função count()
não sei se vai ter grande impacto na performance..
mas diminui uma linha..
já é um começo
uahuhauahuha
>
você está aplicando essa função num array. Isso não faz sentido a não ser que você use array_walk (acho que é essa função, que aplica uma função a cada índice).
Faça assim:
$palavra = explode(" ", removeArtigos($_POST["busca"]));
é isso eu já mudei, foi mais pra ilustrar mesmo, o lance é o laço, se é a melhor forma de se fazer isso, porque no final das contas a query vai ficar por exemplo:
Valor buscado: "Viagem para o Hopi Hari"
quando passar pela função remove artigo, vai ficar apenas: "Viagem Hopi Hari";
e a query vai ficar:
$query = "SELECT * FROM tab_search WHERE empresa LIKE '%viagem%' OR endereco LIKE '%viagem%' OR bairro LIKE '%viagem%' OR empresa LIKE '%hopi%' OR endereco LIKE '%hopi%' OR bairro LIKE '%hopi%' OR empresa LIKE '%hari%' OR endereco LIKE '%hari%' OR bairro LIKE '%hari%' ORDER BY empresa";
ah, desconsiderem os campos hehehe é só pra ilustrar, é um site de agência de viagens, é que tinha respondido isso ai em um topico pro cara e copiei http://forum.imasters.com.br/public/style_emoticons/default/assobiando.gif
Pra chegar no resultado acima então minha lógica está correta?
um if dentro de um loop pode prejudicar um pouco a execução do script. Uma gambiarra é colocar um 1=1 no Where e sempre colcoar OR. Por exemplo:
$busca = "viagem hopi hari";
$palavra = explode(" ", $busca);
$sql = "SELECT ... WHERE 1=1";
$tam = count($palavra);
for ( $i = 0; $i < $tam; $i++ )
{
$sql .= " OR empresa LIKE '%$palavra[$i]%' OR endereco LIKE '%$palavra[$i]%' OR bairro LIKE '%$palavra[$i]%'";
}
echo $sql;
Não sei se isso afetará muito o que tage À consulta no banco. Para ter certeza, só testando, mesmo, com esse 1=1 e com o if, comparando os tempos de execução>
um if dentro de um loop pode prejudicar um pouco a execução do script. Uma gambiarra é colocar um 1=1 no Where e sempre colcoar OR. Por exemplo:
$busca = "viagem hopi hari";
$palavra = explode(" ", $busca);
$sql = "SELECT ... WHERE 1=1";
Não sei se isso afetará muito o que tage À consulta no banco. Para ter certeza, só testando, mesmo, com esse 1=1 e com o if, comparando os tempos de execução
o problema de fazer isso é que vai retornar todos os resultados sempre.
porque sempre vai contemplar a condição, 1 vai ser igual a 1 sempre.
Então isso vai exibir todos os resultados da tabela e as outras consultas serão inuteis
ou não?
De fato, coloquei OR, mas é só trocar por AND, ficando assim:
... WHERE 1=1 AND (todos os OR's aqui)
você está aplicando essa função num array. Isso não faz sentido a não ser que você use array_walk (acho que é essa função, que aplica uma função a cada índice).
Faça assim:
$palavra = explode(" ", removeArtigos($_POST["busca"]));