Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá pessoal,
Antes de mais nada gostaria de pedir perdão quanto à indentação do códígo que vou postar aqui. Estou aprendendo.
Eu fiz um sistema de busca, na realidade eu aprendi com um tutorial, está dando tudo certo, exceto por uma coisa, existem 4 situações:
1- Não digito nada no campo de busca e clico no botão. Resultado: o sistema da a mensagem correta.
2- Digito uma palavra ou misturas de letras que eu sei que não estão no banco. Resultado: o sistema da a mensagem correta.
3- Eu digito 2 ou mais palavras que eu sei que estão no banco. Resultado: o sistema exibe o reultado corretamente.
4- Eu digito 1 palavra que eu sei que está no banco e 1 palavra que eu sei que não está no banco. Resultado: o sistema desconsidera a palavra que está no banco e dá a mensagem de "Nenhum resultado encontrado" ao invés de considerar a palavra que está no banco e exibir o resultado.
A palavra que não existe está impedindo de o resultado para a palavra que existe aparecer. Eu preciso que o resultado apareça mesmo que o usuário digite 10 palavras ou mais e apenas uma constar no banco.
Peço aos colegas que me ajudem a resolver esse problema por gentileza, valeu!
Segue o código:
<?php
if(isset($_POST['botao'])){
$busca = $_POST['busca'];
if($busca == "" or $busca == " "){
header('location:http://www.meudominio.com.br/digitealgoparaabusca.php');
}else{
$busca_dividida = explode(' ',$busca);
$quant = count($busca_dividida);
$id_mostrado = array("");
for($i=0;$i<$quant;$i++){
$pesquisa = $busca_dividida[$i];
$sql = mysql_query("SELECT * FROM busca WHERE conteudo LIKE '%$pesquisa%'");
$quant_campos = mysql_num_rows($sql);
if($quant_campos == 0){
header('location:http://www.meudominio.com.br/nenhumresultado.php');
}else{
while($linha = mysql_fetch_array($sql)){
$id = $linha['id'];
$titulo = $linha['titulo'];
$conteudo = $linha['conteudo'];
if(!array_search($id, $id_mostrado)){
echo "<div class='resultado'>
<p>".$conteudo."</p>
</div>
<br />
";
array_push($id_mostrado, $id);
}
}
}//do else
//for($i;$i<count($id_mostrado);$i++){
//echo $id_mostrado[$i]."<br />";
//}
}//do for
}//so else campo vazio
}//do if botão pressionado
?>
Atenciosamente,
Phil
Essa é uma consulta básica com LIKE. Todo o like deve corresponder para que encontre um resultado correto.
Apenas com like, o que você pode fazer, é abranger a consulta para que permita mais "conteúdo" entre as palavras digitadas, como:
WHERE coluna LIKE '%palavra1%palavra2%palavra3%'
Mas para achar algum resultado, deve possuir as 3 palavras acima, em qualquer lugar do texto, mas na mesma ordem...
Para quando deve possuir as mesmas três palavras, mas em qualquer ordem:
WHERE
coluna LIKE '%palavra1%'
AND coluna LIKE '%palavra2%'
AND coluna LIKE '%palavra3%'
Para localizar quando possuir ao menos uma das três:
WHERE
coluna LIKE '%palavra1%'
OR coluna LIKE '%palavra2%'
OR coluna LIKE '%palavra3%'
Entretanto, da última forma, não é possível mensurar o quão relevante foi a sua busca. Ou seja, o quão próximo foi a busca que você digitou com o conteúdo do texto em si.
Para buscas mais complexas e poder calcular a relevância, deve começar a estudar o Full Text Search (se possível, com lógica fuzzy). O texto abaixo pode ser útil para entender:
http://rachbelaid.com/postgres-full-text-search-is-good-enough/
Gente,
Eu demorei para ver os posts devido à correira, mas no dia eu consegui resolver o problema, mas não me lembro agora como, porém mesmo assim vim aqui agradecer os colegas alex carvalho e Gabriel Heming.
Quanto às soluções eu não testarei elas agora mas com certeza agregaram conhecimento. Caso necessário eu implemetarei elas.
Grato!
Phil
Sobre indentar, uso o Netbeans, ele faz isso automaticamente pressionando "Shift" "Alt" "F". Verifique a IDE que você usa.
Sobre a verificação que está fazendo, para verificar se está vazio, faça com empty.
if( empty($busca) ){