Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Klaudin

Busca - Função LIKE

Recommended Posts

Olá amigos, estou utilizando o seguinte codigo para efetuar buscas em meu bd

 

<?php require_once('Connections/conexao.php'); ?><form method="POST"> Palavra: <input type="text" name="palavra"> <input type="submit" value="Buscar"></form><? mysql_select_db($database_conexao);if(!empty($HTTP_POST_VARS[palavra])) { $palavra = str_replace(" ", "%", $HTTP_POST_VARS[palavra]);$qr = "SELECT * FROM noticias WHERE conteudo LIKE '%".$palavra."%' ORDER BY id DESC"; $sql = mysql_query($qr); $total = mysql_num_rows($sql); echo "Sua busca retornou <b>'$total'</b> resultados.<br>\n"; while($r = mysql_fetch_array($sql)) { echo "<hr>\n"; echo $r[conteudo]."<br>\n";    }  }?>

 

Gostaria de saber como implementar esse LIKE para que ele busque apenas por palavras completas.

 

Desde já obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não funcionou :(

Ele para de dar resultados, independente se é palavra completa ou não.

 

 

Vou dar um exemplo do meu problema:

 

Quando o usuário busca por digital, ele além de buscar por digital, resulta em digitalização

 

Parece ser algo bem simples" :(

Compartilhar este post


Link para o post
Compartilhar em outros sites

O % funciona como um coringa..

imagina que

 

$palavra = "digital"

 

se você fizer

WHERE conteudo LIKE ".$palavra."

você terá as respostas exatamente como "digital"

 

se o % vier depois da palavra

WHERE conteudo LIKE ".$palavra." %

você terá as respostas como "digitalização" além de "digital"

 

o mesmo funciona para

WHERE conteudo LIKE %".$palavra."

e

WHERE conteudo LIKE %".$palavra." %

Compartilhar este post


Link para o post
Compartilhar em outros sites

use

"SELECT * FROM noticias where (conteudo LIKE '% $palavra %') OR (conteudo LIKE '$palavra %') OR (conteudo LIKE '% $palavra') OR (conteudo LIKE '% $palavra.') OR (conteudo LIKE '% $palavra,') OR (conteudo LIKE '% $palavra;') OR (conteudo LIKE '% $palavra!') OR (conteudo LIKE '% $palavra?') OR (conteudo LIKE '% $palavra:') ORDER BY id DESC"
Não sei se há uma forma melhor de fazer, mas se houver, tomara que alguem poste aí... Porque dessa forma que eu fiz, é meio falho e trabalhoso né?...

Compartilhar este post


Link para o post
Compartilhar em outros sites

corrigindo um pequeno erro (adicionando % após os pontos de pontuação)

"SELECT * FROM noticias where (conteudo LIKE '% $palavra %') OR (conteudo LIKE '$palavra %') OR (conteudo LIKE '% $palavra') OR (conteudo LIKE '% $palavra.%') OR (conteudo LIKE '% $palavra,%') OR (conteudo LIKE '% $palavra;%') OR (conteudo LIKE '% $palavra!%') OR (conteudo LIKE '% $palavra?%') OR (conteudo LIKE '% $palavra:%') ORDER BY id DESC"

A explicação -

Aquele exército de WHERE buscam:

 

1)Pela palafra entre 2 espaços (conteudo LIKE '% $palavra %')

 

2)Pela palavra no começo do campo conteudo com um espaço após(conteudo LIKE '$palavra %')

 

3)Pela palavra no fim do campo conteudo com um espaço antes(conteudo LIKE '% $palavra')

 

4)Pela palavra no fim de uma frase com um ponto final(conteudo LIKE '% $palavra. %').

 

5) etc

 

Acho que agora deu pra entender né?

 

 

Funcionou essa loucura acima aí?? Pelamordedeus!!! alguém mais experiente consiga uma solução melhor pra este problema...

Compartilhar este post


Link para o post
Compartilhar em outros sites

faz o seguinte...

 

crie um script de detectar a maneira de pesquisa igual o google faz...

 

ex:

 

você quer pesquisar "Digital" só que no banco de dados temos o "Digitalizar"; para que você possa localizar somente o "Digital" vamos usar um meio legal que é o (") aspa simples. ex.

 

$busca = '"digital"';	(ereg ("\"(.*)\"", $busca, $b))? $busca= strtoupper($b[1]):$busca = strtoupper("%".$busca."%");$select = mysql_query("select * from tabela where upper(conteudo) like $busca");

ai ele busca somente a palavra ... e se você colocar sem tar entre (") ele busca digital, digitalizar e assim vai ;)

 

Fabão tou aprendende a diminuir os codigo, logo logo chego a 1 linha igual a você :P

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aí perfect. Não sou bom com Expressoes regulares. Me explica aí o que esta linha faz por favor:

(ereg ("\"(.*)\"", $busca, $b))? $busca= strtoupper($b[1]):$busca = strtoupper("%".$busca."%");

Compartilhar este post


Link para o post
Compartilhar em outros sites

micox -> opa eu tbm num sou bom mais consigo entender :P

 

bem vamos lá..

 

a sintexa do ereg() é o seguinte:

 

ereg ( string expressao, string variavel [, array registros] );

onde expressão é uma maneira dele interpreta a pesquisa em uma string, variavel a mensagem para ele buscar, registros onde retorna um array caso ele encontre algo na string.

 

tbm estou usando um if simplificado com a sintaxe:

 

(condição)? true:false;

então o nosso amigo ereg() ele retorna um boleano caso ele encontre o resultado da busca ele retorna um true caso ao contrario um false.

 

Agora vamos ao ER (Expresão Regular);

 

Eu usei o seguinte -> "\"(.*)\"" ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Klaudin -> quanto mais limpo o script mais agil ele fica ai depende do que você quer ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

só uma coisa se ele quer buscar por palavras completas nao precisa usar o like use apenas = exemplo:

select * from frutas where fruta = 'banana'

 

assim ira encontrar a palavra completa se nao existir nao achara nada

 

e para ajudar na busca deixe a palavra digitada tudo em minusculo para bater com a que tiver no banco

 

mas se resolveu as explicaçlões beleza, mas como falei para busca mais extatas nao se usa o like

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa fabão... mais não precisa gravar no db tudo em maiusculo não depois que eu descobri como trabalha com sistema de busca agora a pessoa pode registra tanto maiusculo e minusculo juntos que vai dar na mesmo.. é só colocar o upper(campo) que ele puxa do banco em maiusuculo e compara junto com o strtoupper(string) ;) fazendo assim você num ter esse problema se salva tudo em maiusuco ou minusculo e tbm da liberdade para o kra escrever da maneira que ele quer ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

VAleu as explicações aí... Depois vou testar este script e estudar mais ER e a ereg.Valeus...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sobre o cadastro no banco sempre é bom ter um padrao mesmo que o usuario digite tudo maiusculo ou minusculo no banco sempre vai cadastrar um padrao e outra coisa importante evitar gravar dados formatados, só formatar na hora de visualizar

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.