Ir para conteúdo

POWERED BY:

Arquivado

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

Levi Gonçalves

Problemas com o resultado da busca

Recommended Posts

Boas a todos!

 

Estou com um probleminha em uma consulta. É o seguinte:

 

No campo "termo" da aplicação o usuário irá digitar um termo pelo qual ele deseje encontrar no resultado da busca.

Ex.de termo: “palavra1 palavra2 palavra3”.

 

Na rotina abaixo eu recebo o termo digitado e o desmembro em até 4 palavras, obtendo o seguinte resultado:

$termo1 = “palavra1”;

$termo2 = “palavra2”;

$termo3 = “palavra3”;

$termo4 = “”;

 

 

if ($_GET["termo"] == ' ') {
	$_SESSION["termonovo"][1] = '';
	$_SESSION["termonovo"][2] = '';
	$_SESSION["termonovo"][3] = '';
	$_SESSION["termonovo"][4] = '';
} else {
	$_SESSION["termonovo"][1] = '';
	$_SESSION["termonovo"][2] = '';
	$_SESSION["termonovo"][3] = '';
	$_SESSION["termonovo"][4] = '';
	$termo = $_GET["termo"];
	$cont = 1;
	$varios = strlen($termo);
	for ($ii = 0; $ii <= $varios - 1; $ii++) {
		$_SESSION["termonovo"][$cont] .= substr($termo, $ii, 1);
		if (substr($termo, $ii, 1) == ' ') {
			$cont++;
		}
	}
}

$termo1 = $_SESSION["termonovo"][1];
$termo2 = $_SESSION["termonovo"][2];
$termo3 = $_SESSION["termonovo"][3];
$termo4 = $_SESSION["termonovo"][4];

Após o desmembramento do termo em palavras, vem o código SQL que irá fazer a consulta:

 

$sql = "SELECT * FROM produto WHERE 1=1 ";

if ($termo1 != ''){
$sql.="and ((vc_fabricante like '%".$termo1."%') or (vc_modelo like '%".$termo1."%') or (vc_cor like '%".$termo1."%') or (vc_observacao like '%".$termo1."%') ";
	if ($termo2 != ''){
	$sql.="or (vc_fabricante like '%".$termo2."%') or (vc_modelo like '%".$termo2."%') or (vc_cor like '%".$termo2."%') or (vc_observacao like '%".$termo2."%') ";
		if ($termo3 != ''){
		$sql.="or (vc_fabricante like '%".$termo3."%') or (vc_modelo like '%".$termo3."%') or (vc_cor like '%".$termo3."%') or (vc_observacao like '%".$termo3."%') ";
			if ($termo4 != ''){
			$sql.="or (vc_fabricante like '%".$termo4."%') or (vc_modelo like '%".$termo4."%') or (vc_cor like '%".$termo4."%') or (vc_observacao like '%".$termo4."%') ";
			}
		}
	}
$sql.=") ";
}

Bom, hoje verifiquei que há algo errado no código SQL, pois se eu fizer uma pesquisa usando o mesmo termo com as palavras invertidas eu terei resultados diferentes.

 

Explicando melhor:

Considerando que a tabela “produto” tenha os seguintes dados:

 

Código		vc_observacao
1		palavra1
2		palavra2

Se eu digitar o termo “palavra1 palavra2” o resultado final da pesquisa será:

palavra1

palavra2

 

Agora se eu digitar o termo “palavra2 palavra1” o resultado será:

palavra1

 

Alguém saberia dar alguma dica para arrumar isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se você puder explicar melhor o lance dos termos eu posso te ajudar, pq sinceramente nao entendi do q se trata

 

 

Em primeiro lugar obrigado pela atenção giesta.

 

Resumindo:

 

Considere a tabela de dados “produto”:

 

Código		vc_observacao		vc_modelo	vc_cor		vc_fabricante
1		palavra1		palavra3	palavra5	palavra7
2		palavra2		palavra4	palavra6	palavra8

Quero fazer uma consulta nessa tabela, para isso uso o seguinte código:

 

SELECT * FROM produto WHERE
(vc_fabricante like '%[b]palavra1[/b]%') OR (vc_modelo like'%[b]palavra1[/b]%') OR (vc_cor like '%[b]palavra1[/b]%') OR (vc_observacao like '%[b]palavra1[/b]%') OR (vc_fabricante like '%[b]palavra2[/b]%') OR (vc_modelo like '%[b]palavra2[/b]%') OR (vc_cor like '%[b]palavra2[/b]%') OR (vc_observacao like '%[b]palavra2[/b]%');

Observe que estou procurando em todos os campos da tabela por “palavra1” e “palavra2”. Está repetitivo, eu sei, mas foi a maneira que encontrei de encontrar o resultado que busco.

Nessa consulta o resultado sairá da seguinte maneira:

 

Código		vc_observacao		vc_modelo	vc_cor		vc_fabricante
1		palavra1		palavra3	palavra5	palavra7
2		palavra2		palavra4	palavra6	palavra8

Até aqui beleza, é exatamente isso que eu quero, porém se eu mudar a ordem das variáveis “palavra1” e “palavra2” o resultado sairá diferente:

 

SELECT * FROM produto WHERE
(vc_fabricante like '%[b]palavra2[/b]%') OR (vc_modelo like '%[b]palavra2[/b]%') OR (vc_cor like '%[b]palavra2[/b]%') OR (vc_observacao like '%[b]palavra2[/b]%') OR (vc_fabricante like '%[b]palavra1[/b]%') OR (vc_modelo like '%[b]palavra1[/b]%') OR (vc_cor like '%[b]palavra1[/b]%') OR (vc_observacao like '%[b]palavra1[/b]%');

Resultado da pesquisa acima (faltando dados):

 

Código		vc_observacao		vc_modelo	vc_cor		vc_fabricante
1		palavra1		palavra3	palavra5	palavra7

O que eu preciso é que nessa pesquisa saiam todas as tuplas (linhas) que tenha “palavra1” e “palavra2”, independente da ordem das variáveis.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ahhh... o esquema do termo é o seguinte:

 

O usuário vai digitar um termo qualquer (um produto) pelo qual ele deseja encontrar. Por exemplo: "geladeira frost free marrom".

Se eu fizer a pesquisa com esse termo grande do jeito que está, provavelmente o usuário não encontrará resultado algum, mas se eu dividir esse termo em palavras com certeza ele irá encontrar tudo que tiver:

$termo1 = geladeira

$termo2 = frost

$termo3 = free

$termo4 = marrom

Compartilhar este post


Link para o post
Compartilhar em outros sites

amigo acho que voce pode utilizar explode() do php

com um delimitador " " espaço em branco.

e procura por cada valor do explode,

e o que retornar melhores resultados, deve ser o qeu a pessoa quer.

Porem deve ter aluma função para isso no Mysql, so que ai u fico te devendo essa.

 

Acharia algo assim

lista de geladeira

lista de frost

lista de free

 

Ex:

$procura='geladeira frost free';

lista_procura=explode($procura,' ')# algo assim

echo=lsita_procura[0];# valor de geladeira

echo=lsita_procura[1];# valor de frost

echo=lsita_procura[2];# valor de free

 

essa e a ideia?

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.