Ir para conteúdo

POWERED BY:

Arquivado

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

Leandro Nigre

[Resolvido] Busca com várias palavras

Recommended Posts

Estou tentando fazer um sistema de busca que retorne qualquer um dos termos requeridos pelo usuário (e se possível fazer uma adaptação, com a opção de retornar se todos os termos forem encontrados). Estou há horas estudando os inúmeros tópicos que tem aqui no imasters, mas não consegui fazer o meu funcionar. Acho que o problema é no FOR. Do jeito como está abaixo, ele está procurando apenas pelo último termo digitado... Alguém pode dar um help?

 

Valeu!

 

// pega os termos digitados
$colname_Recordset1 = "-1";
if (isset($_GET['search'])) {
  $colname_Recordset1 = $_GET['search'];
}

$palavra = explode(" ", $colname_Recordset1);
$nova = count($palavra);
for ( $i = 0; $i < $nova; $i++ )
{
mysql_select_db($database_connPMMC, $connPMMC);
$query_Recordset1 = "SELECT * FROM noticias WHERE texto LIKE '% " . $palavra[$i] . " %'";
}
echo "Consulta: " . $query_Recordset1;

Compartilhar este post


Link para o post
Compartilhar em outros sites

As palavras vem por GET?

 

Faz assim. Dá um explode nelas pelo separador e joga no SELECT.

 

Só que o SELECT vai ficar diferente. Vai ficar mais ou menos assim

"SELECT * FROM noticias WHERE texto LIKE '% " . $palavra[0] . " %' OR texto LIKE '% " . $palavra[1] . " %' OR texto LIKE '% " . $palavra[3] . " %";

Porque aí ele vai retornar qualquer correspondência.

 

Também tá faltando pegar o resultado da query (mysql_fetch_array ou mysql_fetch_assoc).

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem matias, fiz da seguinte maneira:

 

// pega os termos digitados pelo usuario
$colname_Recordset1 = "-1";
if (isset($_GET['search'])) {
  $colname_Recordset1 = $_GET['search'];
}

// vamos considerar até 5 palavras digitadas
$palavra = explode(" ", $colname_Recordset1);
mysql_select_db($database_connPMMC, $connPMMC);
$query_Recordset1 = "SELECT * FROM noticias WHERE texto LIKE '% " . $palavra[0] . " %' OR texto LIKE '% " . $palavra[1] . " %' OR texto LIKE '% " . $palavra[2] . " %' OR texto LIKE '% " . $palavra[3] . " %' OR texto LIKE '% " . $palavra[4] . " %'";

$Recordset1 = mysql_query($query_Recordset1, $connPMMC) or die(mysql_error());
$row_Recordset1 = mysql_fetch_assoc($Recordset1);
$totalRows_Recordset1 = mysql_num_rows($Recordset1);
echo "Consulta: " . $query_Recordset1;

Está dando certo, mas com 1 porém. O sistema tenta procurar por até 5 palavras, mas se a pessoa digita 4, a ultima fica sendo ' ' (ESPAÇO), dá ele retorna todos os resultados, pois todos os textos tem espaço... Como sanar isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Beraldo!

 

Tomando como base a sua explicação em:

http://forum.imasters.com.br/index.php...t=#entry1221987

 

Montei meu code assim:

 

$colname_Recordset1 = "-1";
if (isset($_GET['search'])) {
  $colname_Recordset1 = $_GET['search'];
}

$palavra = explode(" ", $colname_Recordset1);
mysql_select_db($database_connPMMC, $connPMMC);
$query_Recordset1 = "SELECT * FROM noticias WHERE 1 = 1";

$totalPalavras = count($palavra);
for($i = 0; $i < $totalPalavras; $i++){
$query_Recordset1 = " AND texto LIKE '% " . $palavra[$i] . " %'";
}

$Recordset1 = mysql_query($query_Recordset1, $connPMMC) or die(mysql_error());
$row_Recordset1 = mysql_fetch_assoc($Recordset1);
$totalRows_Recordset1 = mysql_num_rows($Recordset1);

echo "Consulta: " . $query_Recordset1;

Fiz a sbusca digitando duas palavras e ele imprimiu o seguinte erro:

 

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AND texto LIKE '% 2ª_palavra_q_eu_forneci_na_busca %'' at line 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

dê um echo em $query_Recordset1 e poste o resultado

Beraldo, eu já havia dado o echo no Recordset 1, mas tudo o que foi exibido na página foi aquela sintaxe de erro.

 

O problema parecer está nesta linha, ao começar a instrução sem o tradicional SELECT * FROM... :

$query_Recordset1 = " AND texto LIKE '% " . $palavra[$i] . " %'";

Compartilhar este post


Link para o post
Compartilhar em outros sites

Certo Beraldo, com o pontinho milagroso funcionou. Só mais uma questão. Usando AND no começo, ele retorna se encontrar todas as palavras (essa seria a opção: Com todos os termos). Só que eu queria que ele encontrasse qualquer uma das palavras fornecidas, mas se eu coloco OR, ele vai levar em consideração o WHERE 1 = 1 e vai trazer todos os resultados...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Beraldo, consegui resolver!

Fiz o primeira $query com a variável inteira, e a a segunda $query com ela ja dividida, e começando com OR.

 

Obrigado!

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.