Ir para conteúdo

POWERED BY:

Arquivado

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

betodesign

Busca Perfeita em php

Recommended Posts

Galera estou querendo melhorar o sistema de busca do meu site, o código está em anexo, eu consegui fazer ela funcionar da forma que eu quero, o unico problema é que agora eu preciso da ultima coisa pra ele ficar perfeito.

 

Ex: digito da busca "pet shop" ele busca "pet" e busca "shop" , ai lista mais de 50 resultados.

Ex.: "roupa de cama" a busca abre quase todos os resultados por causa do "de"

 

Gostaria que ela fosse inteligente, e que neste momento de 2 palavras ela pudesse listar no resultado apenas o registro que possui todas as palavras, correto? Irá deixar a busca mais limpa, pois quanto mais palavras, mais detalhes a pessoa quer. Independente da ordem, caso o nome do resultado no banco seja BANCO DO BRASIL , se eu digitar brasil branco, ele acha também, pois reparei que a busca padrão em php só busca na ordem...

 

Bom acho que falei demais, o codigo está abaixo, gostaria de ajuda onde preciso alterar para funcionar da forma acima. Abração a todos!

 

<?

$conexao = mysql_connect("$server", "$user", "$senha"); $db = mysql_select_db("$banco");

// termina conexão com o banco

$palavra = $_GET[palavra];

$palavra = mysql_real_escape_string($palavra);

$documento = "$palavra";


//Aqui você coloca o nome do arquivo que será gravado

$arquivo = "buscas/buscas.txt";

//Abrimos o arquivo que será gravado.

$abrir = fopen($arquivo, "a");
$quebra = chr(13).chr(10);//essa é a quebra de linha
//Gravamos no arquivo

$gravar = fwrite($abrir, $documento.$quebra);




?>
<?php include "templates/global_top_busca.html"; ?>
<style type="text/css">
<!--
.busca1 {
	font-size: 14px;
	font-family: Arial, Helvetica, sans-serif;
	font-weight: bold;
	color: #FF0000;
}
-->
</style>

<table width="100%" border="2" align="center" cellpadding="5" cellspacing="5" bordercolorlight="#006699">
  <tr>
    <td width="489" valign="top">
    <?php
	
        $aux = explode(" ", $palavra);
        $i = 0;
        while ($aux[$i] != "") {
                // esse IF vai servir para a primeira palavra ou se existir apenas uma palavra
                if ($i == 0) {
                        $busca = "listing_title  LIKE '%".$aux[$i]."%' OR listing_brief_desc LIKE '%".$aux[$i]."%' OR listing_brief_desc LIKE '%".$aux[$i]."%'";
                } else {
                        // Aki ele concatena se existir várias palavras
                        $busca .= " OR listing_title LIKE '%".$aux[$i]."%' OR listing_brief_desc LIKE '%".$aux[$i]."%' OR listing_brief_desc LIKE '%".$aux[$i]."%'";
                }
                
                $i++;
        }
                $sql = "SELECT * FROM listing WHERE $busca  ORDER BY listing_title";
                $query = mysql_query($sql);
				$id = $busca["listing_id"];
                $titulo = $busca["listing_title"];
               $tr2 = mysql_num_rows($query);
if($tr2>0){

	
	?>

     
      <table width="100%" cellpadding="0" cellspacing="0">
        <tr>
          <td height="22"><font size="4" color="<?=$coronmouse?>"><b>NOS ANUNCIOS</b></font></td>
          <td height="22" colspan="2" align="right">Foram encontrados <? echo "<b><font color=$coronmouse>$tr2</font></b>";?> registros.</td>
        </tr>
        <tr>
          <td height="1" colspan="4" background="<?=$usite?>images/divisao_horizontal.gif"></td>
        </tr>
        <?
		
$i = 1;
 while($busca = mysql_fetch_assoc($query))
                {
	if ($i == 1) { $bgcolor="$corcelula1"; } else { $bgcolor="#FFFFFF"; $i = 0; } 
	$i++;
	
	$titulo = str_replace("%","-",$busca["listing_title"]);
?>
        <tr>
          <td height="3" colspan="4" bgcolor="<?=$bgcolor?>"></td>
        </tr>
        <tr>
          <td colspan="3" bgcolor="<?=$bgcolor?>"> <b><font style='text-transform:uppercase;'><a href="cabofrio-<?php echo $busca["listing_id"]; ?>-<?php echo $titulo; ?>">
            <?php echo $busca["listing_title"]; ?>
          </a></font></b></td>
        </tr>
        <tr>
          <td height="3" colspan="4" bgcolor="<?=$bgcolor?>"></td>
        </tr>
        <tr>
          <td height="1" colspan="4" background="<?=$usite?>images/divisao_horizontal.gif"></td>
        </tr>
        <? }?>
      </table>
      <? } else {?>
      <table width="100%" cellpadding="0" cellspacing="0">
        <tr>
          <td height="22"><font size="4" color="<?=$coronmouse?>"><b>NOS ANUNCIOS</b></font><font size="2"> </font></td>
        </tr>
        <tr align="center">
          <td bgcolor="<?=$bgcolor?>"><fieldset>
            <font color="#FF0000" size="2"><b> <br />
              Nenhum registro encontrado!</b></font> <br />
            <br />
          </fieldset></td>
        </tr>
      </table>
    <? } ?></td>
    <td width="462" valign="top">
    <?php
	
        $aux = explode(" ", $palavra);
        $i = 0;
        while ($aux[$i] != "") {
                // esse IF vai servir para a primeira palavra ou se existir apenas uma palavra
                if ($i == 0) {
                        $busca = "category_name  LIKE '%".$aux[$i]."%'";
                } else {
                        // Aki ele concatena se existir várias palavras
                        $busca .= " OR category_name LIKE '%".$aux[$i]."%'";
                }
                
                $i++;
        }
                $sql = "SELECT * FROM setup_category WHERE $busca ";
                $query = mysql_query($sql);
               $tr1 = mysql_num_rows($query);
if($tr1>0){

	
	?>
	
      <table width="100%" cellpadding="0" cellspacing="0">
        <tr>
          <td width="238" height="22"><font size="4" color="<?=$coronmouse?>"><b>NAS CATEGORIAS</b></font></td>
          <td width="238" height="22" colspan="2" align="right">Foram encontrados <? echo "<b><font color=$coronmouse>$tr1</font></b>";?> registros.</td>
        </tr>
        <tr>
          <td height="1" colspan="4" background="<?=$usite?>images/divisao_horizontal.gif"></td>
        </tr>
        
		 <?
		
$i = 1;
 while($busca = mysql_fetch_assoc($query))
                {
	if ($i == 1) { $bgcolor="$corcelula1"; } else { $bgcolor="#FFFFFF"; $i = 0; } 
	$i++;
?>
		
        <tr>
          <td height="3" colspan="4" bgcolor="<?=$bgcolor?>"></td>
        </tr>
        <tr>
          <td colspan="3" bgcolor="<?=$bgcolor?>"> <b><font style='text-transform:uppercase;'><a href="<?=$busca[category_id]?>-<?=$busca[category_name]?>">
            <?=$busca[category_name]?>
          </a></font></b></td>
        </tr>
        <tr>
          <td height="3" colspan="4" bgcolor="<?=$bgcolor?>"></td>
        </tr>
        <tr>
          <td height="1" colspan="4" background="<?=$usite?>images/divisao_horizontal.gif"></td>
        </tr>
        <? }?>
      </table>
      <? } else {?>
      <table width="100%" cellpadding="0" cellspacing="0">
        <tr>
          <td height="22"><font size="4" color="<?=$coronmouse?>"><b>NAS CATEGORIAS</b></font></td>
        </tr>
        <tr align="center">
          <td bgcolor="<?=$bgcolor?>"><fieldset >
            <font color="#FF0000" size="2"><b> <br />
              Nenhum registro encontrado!</b></font> <br />
            <br />
          </fieldset></td>
        </tr>
      </table>
      <? } ?>
   
    </td>
    <td width="462" valign="top">
    <?php
	
        $aux = explode(" ", $palavra);
        $i = 0;
        while ($aux[$i] != "") {
                // esse IF vai servir para a primeira palavra ou se existir apenas uma palavra
                if ($i == 0) {
                        $busca = "product_brief_info LIKE '%".$aux[$i]."%' OR product_name LIKE '%".$aux[$i]."%'";
                } else {
                        // Aki ele concatena se existir várias palavras
                        $busca .= " OR product_brief_info LIKE '%".$aux[$i]."%' OR product_name LIKE '%".$aux[$i]."%'";
                }
                
                $i++;
        }
                $sql = "SELECT * FROM listing_product WHERE $busca ";
                $query = mysql_query($sql);
               $tr1 = mysql_num_rows($query);
if($tr1>0){

	
	?>
	
      <table width="100%" cellpadding="0" cellspacing="0">
        <tr>
          <td width="238" height="22" bgcolor="#FF0000"><font size="4" color="#ffffff"><b>NAS PROMOÇÕES</b></font></td>
          <td width="238" height="22" colspan="2" align="right">Foram encontrados <? echo "<b><font color=$coronmouse>$tr1</font></b>";?> registros.</td>
        </tr>
        <tr>
          <td height="1" colspan="4" background="<?=$usite?>images/divisao_horizontal.gif"></td>
        </tr>
        
		 <?
		
$i = 1;
 while($busca = mysql_fetch_assoc($query))
                {
	if ($i == 1) { $bgcolor="$corcelula1"; } else { $bgcolor="#FFFFFF"; $i = 0; } 
	$i++;
?>
		
        <tr>
          <td height="3" colspan="4" bgcolor="<?=$bgcolor?>"></td>
        </tr>
        <tr>
          <td colspan="3" bgcolor="<?=$bgcolor?>"> <b><font style='text-transform:uppercase;'><a href="http://guiaforte.com.br/promocoes/oferta/cabofrio/<?=$busca[product_id]?>">
            <?=$busca[product_name]?>
          </a></font></b></td>
        </tr>
        <tr>
          <td height="3" colspan="4" bgcolor="<?=$bgcolor?>"></td>
        </tr>
        <tr>
          <td height="1" colspan="4" background="<?=$usite?>images/divisao_horizontal.gif"></td>
        </tr>
        <? }?>
      </table>
      <? } else {?>
      <table width="100%" cellpadding="0" cellspacing="0">
        <tr>
          <td height="22"><font size="4" color="<?=$coronmouse?>"><b>NAS PROMOÇÕES</b></font></td>
        </tr>
        <tr align="center">
          <td bgcolor="<?=$bgcolor?>"><fieldset >
            <font color="#FF0000" size="2"><b> <br />
              Nenhum registro encontrado!</b></font> <br />
            <br />
          </fieldset></td>
        </tr>
      </table>
      <? } ?>
   
    </td>
  </tr>
</table>
 <?php include "templates/global_bottom.html"; ?>

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom acho que dessa forma deve funcionar para você só você adapartar ao seu código.

 

<?php

$busca = 'seu produto';//variavel que recebe o valor para pesquisa
$busca_array = explode(" ",$busca);//crria um array de variavel para consulta
$total_itens = count($busca_array)-1;//total de intentes do array usa -1 pelo fato do array começar em 0
//faz um loop para criar as definições para a consulta
for ($i=0; $i <= $total_itens; $i++) { 
	if($i == 0){
		$paramentos_consultas = "product_name like'%".$busca_array[$i]."%' ";//primeira linha os paramentros de consulta
	}else{
		$paramentos_consultas .= "OR product_name like'%".$busca_array[$i]."%' ";//adiciona o OR nas proximas linhas do paramentro de consulta
	}
}
$query = mysql_query("SELECT * FROM listing_product WHERE $paramentos_consultas");//coloca a varivel com os parametros dentro da consulta

?>

 

DICA

Evite misturar php e html quando possivel faça sempre as consaltas mysql as funçoes antes do html e coloque no html somente o retorno das consultas e as chamadas das funções que realmente forem ser ultilizadas dentro do html.

 

OBERSEVAÇÃO

as funções mysql_ serão descontinuada para evitar futuros problemas de incompatibilidade com novas versões do php pode se ultilizar as funções mysqli_ ou PDO.

Compartilhar este post


Link para o post
Compartilhar em outros sites

show Ricardo, funcionou perfeitamente, agora pra finalizar, seria possivel exlcuir da busca palavras como "de" "a" "o" sozinhas pois elas ainda estao atrapalhando, ex: "roupas de cama" por causa do "de" ainda lista muito resultados entende?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa sim é simples nem precisa altera muito coisa no código

 

$nao_permitido = array('da ','de ');//colque as palavras que não deseja utiliza na consulta sempre com um espaço na frente para remover o espaço para que a função explode funcione correntarmente
$busca = str_replace($nao_permitido,'','joao paulo de oliveira');//variavel que recebe o valor para pesquisa

acho que isso ja resolver o seu problema

Compartilhar este post


Link para o post
Compartilhar em outros sites

nao funcionou nao, rs

mas veja bem, pode ser melhor, pensei o seguinte, porque nao limitar a busca por palavras de no maximo 3 caracteres, acho q fica melhor entende? palavras de menos de 3 caracteres nao sao levadas em conta

o q acha?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hmm, fica uma parada tipo assim:

<?php

    function BuildProductSearchData($input)
    {
        if (!empty($input)) {
            $spacement = chr(32);
            $words = array_filter(explode($spacement, $input), function($word) {
                // Implemente seu algoritmo de aceitação de termos
                return strlen($word) > 3;
            });
            
            if(count($words) !== 0) {
                $sql = array();
                foreach($words AS $offset => $word) {
                    $sql[] = "`product_name` LIKE '%". addslashes($word) ."%'" . $spacement;
                }
                
                return implode("OR" . $spacement, $sql);
            }
        }
    }
    
    $input = 'eu vou ser filtrado pelo filtro :P'; // filter_input(INPUT_POST, '...')
    $query = sprintf("SELECT * FROM `listing_product` WHERE %s", BuildProductSearchData($input));
    var_dump($query);

 

Daí lá onde eu comentei sobre o algoritmo para aceitação dos termos de busca, no caso fiz a sua proposta (não aceitar se for 3 caracteres), daí ali você pode trabalhar outras coisas, etc, se necessário.

 

Minha saída foi:

string 'SELECT * FROM `listing_product` WHERE `product_name` LIKE '%filtrado%' OR `product_name` LIKE '%pelo%' OR `product_name` LIKE '%filtro%' ' (length=137)

 

E sobre a variável spacement, chr(32) é a mesma coisa que " ", é paranoia minha, se quiser muda ali

:P

Compartilhar este post


Link para o post
Compartilhar em outros sites

Que tipo de tabela você está usando? Se for myisam (ou seu mysql for a última versão, ai pode ser innodb também) pode montar uma busca com fulltext, muito mais simples, podendo até ordenar pela relevância.

Compartilhar este post


Link para o post
Compartilhar em outros sites

outro modo é criar uma hierarquia do resultado da busca

 

utilize a sintaxe condicional CASE no SELECT e ordene (ORDER BY) segundo o resultado dos "CASES"

 

 

exemplo:

SELECT

	T1.field AS field

	,(CASE 
	 WHEN T1.field = 'de' then 0
	 WHEN T1.field LIKE 'de%' then 1
	 WHEN T1.field LIKE '% de %' then 2
	 WHEN T1.field LIKE '%de' then 3
         ELSE 4
         END) AS order_result

table_name AS T1

WHERE T1.field LIKE '%de%'

ORDER BY order_result, T1.field LIMIT 0, 50

 

O case desse exemplo exibirá na ordem de prioridade:

 

1º o que for exato

2º o que começa com...

3º o que possui a palavra com espaços a equerda ou direita

4º o que terminar com..

5º o que vier..

 

 

 

nota: Sem o ELSE, o que escapar a regra do case virá como null, sobrevalecendo os números na ordenação.

Para analisar os resultados em null, remova o ELSE pois alguma coisa pode escapar a regra montada.. isso dependerá da sua regra de negócios.

 

Crie uma regra consistente e cheque os resultados.

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.