Ir para conteúdo
Rafeky

Como fazer uma busca limitada a palavras de um filtro? Php+Mysql

Recommended Posts

Estou criando um site php junto com banco de dados, e estou querendo saber como mesclar a busca por palavras junto com o busca por filtro/categoria. Meu site irá ser o seguinte, o usuário digita algum termo no campo de busca e clica em alguma opção do filtro, que esta dividido por cidades. Ex: digito "Construtor" e seleciono o filtro "cidade A", como eu junto essas duas variáveis e exibo somente os resultados que tenha a palavra "construtor" na "cidade a"? Sendo que cada bloco terá sua cidade e terá também alguma informação encontrada pela busca. Segue meu código até o momento.

 

<?php 
include_once("conexao.php");
/*aqui eu criei algumas variaveis para usar lá embaixo, esse $filtro é a palavra que o usuario digitar, o codigo está funcionando sem erros, só que não sei como juntar o $filtro + %categoria e exibir somente os resultados que conter as palavras de ambos*/
$filtro = isset($_GET['filtro'])?$_GET['filtro']:""; /* chave de busca */
$sql= "select * from empresas where servicos like '%$filtro%' union select * from empresas where cidade like '%$filtro%' union select * from empresas where nome like '%$filtro%' union select * from empresas where igreja like '%$filtro%'"; /* comando em mysql */
$consulta = mysqli_query($conexao, $sql);
$registros = mysqli_num_rows($consulta); /*mostra quantas linhas existem no BD*/
?>

<!DOCTYPE html>
<html lang="pt-br">
    <head>
        <meta charset="utf-8">
        <title>Sistema de Cadastro</title>
        <link rel="stylesheet" href="_css/estilo.css">
        
    </head>
    <body>       
                <div class="menutop">
             <img src="imagens/dafe.png" height="50px" width="240px" align="left" style="position: absolute; margin-left: 80px;"/>
                    <div class="separar"></div>
        <form method="get" action="">
            <div class="buscador">        
                
                    <input type="text" placeholder="Faça uma busca"name="filtro" class="busca">
                <input type="image" class="buscaimg"style="width: 21px" height="21px" src="imagens/busca.png">
                    <select name="categoria">
                        <option value="">Categoria</option>
                        <?php
                        
                        /* Nessa parte, ele busca no banco de dados todas as cidades */
                        $getcategories = "SELECT cidade FROM empresas";
                        $getcategoriesquery = mysqli_query($conexao, $getcategories) or die(mysqli_error());
                            while($getcategoriesline = mysqli_fetch_array($getcategoriesquery)) {
                                $categoria = $getcategoriesline['cidade'];
                                $categoria_id = $getcategoriesline['cidade'];
                                echo "<option value='$categoria_id'>$categoria</option>";
                            }
                        
                        ?>

                        
                    </select>
                
            </div>
                </form>
            
        </div>
        <div class="container">
            <nav>
                <ul class="menu">
                    
                    
                </ul>
                
            </nav>
            <section>

                
                <?php
                include_once("conexao.php");
                
                print "<h1><div id='resultadosx'>Resultados</div></h1><h3><div id='topox'>Foram encontrados $registros registros para a busca '$filtro' </div></h3><hr class='hr1'><br><br>";
               
            /*  aqui ele só está retornando os resultados da busca por palavras e ignorando o "filtro" de cidades, como eu faço para que ele pegue a variavel "$filtro" e junte com a variavel "$categoria" e retorne apenas esses resultados?  */
                
                print "<div id='topox'>Dê sempre a preferência ao Doméstico da Fé. Gal 6.10</div>";
                print "<br><br>";
                
                while($exibirRegistros = mysqli_fetch_array($consulta)) { /* verifica registro por registro e coloca na tela até acabar */
                
                    $idempresa = $exibirRegistros [0];
                    $nome = $exibirRegistros[1];
                    $servicos = $exibirRegistros[2];
                    $cidade = $exibirRegistros[3];
                    $bairro = $exibirRegistros[4];
                    $endereco = $exibirRegistros[5];
                    $telefone = $exibirRegistros[6];
                    $email = $exibirRegistros[7];
                    $igreja = $exibirRegistros[8];
                    $obs = $exibirRegistros[9];
                    $link = $exibirRegistros[10];
                    $logo = $exibirRegistros[11];

                    
                    print "<article>";

                    print "<div id='logox'><img width=160 height=160 src= $logo></div>";
                    print "<div id='segmentox'><strong>SEGMENTO: $servicos</strong><br></div>";
                    print "<div id='igrejax'>IGREJA:<br><strong>$igreja</strong> </div>";
                    print "<div id='nomex'>Nome: $nome<br>End: $endereco<br>Bairro: $bairro<br>Cidade: $cidade<br></div>"; 
                    print "<div id='nomex'>Tel: $telefone<br>E-mail: $email<br>Site/Facebook: $link<br> </div>";

                    
                    
                    
                    print "</article>";
                    print "<hr size='2' width='98%' align='center' noshade>";
                    print"<br>";
                    }
                
                
                    mysqli_close($conexao);
                
                    ?>
                
            </section>
        </div>
    </body>
</html>


 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não me ficou muito claro o seu problema, vou responder pelo que acho que entendi.
Primeiro, troque esse monte de UNION por OR (apesar de ter o mesmo efeito, para esse caso, o correto é utilizar o OR, sera mais performático), vou deduzir que categorias também se encontra na tabela empresas:
 

SELECT * FROM(
  SELECT * FROM empresas
  WHERE categorias = 'categoria'
)T
WHERE T.servicos LIKE '%$filtro%' 
OR T.cidade LIKE '%$filtro%' 
OR T.nome LIKE '%$filtro%' 
OR T.igreja LIKE '%$filtro%'";

Pergunta: Precisa mesmo de "LIKE", o "=" não resolve?

Compartilhar este post


Link para o post
Compartilhar em outros sites
22 horas atrás, EdCesar disse:

Não me ficou muito claro o seu problema, vou responder pelo que acho que entendi.
Primeiro, troque esse monte de UNION por OR (apesar de ter o mesmo efeito, para esse caso, o correto é utilizar o OR, sera mais performático), vou deduzir que categorias também se encontra na tabela empresas:
 


SELECT * FROM(
  SELECT * FROM empresas
  WHERE categorias = 'categoria'
)T
WHERE T.servicos LIKE '%$filtro%' 
OR T.cidade LIKE '%$filtro%' 
OR T.nome LIKE '%$filtro%' 
OR T.igreja LIKE '%$filtro%'";

Pergunta: Precisa mesmo de "LIKE", o "=" não resolve?

Entendi o seu codigo, acho que é por esse caminho mesmo, só que ao implementar ele deu 2 erros:

@EdCesar


Essa linha: while($exibirRegistros = mysqli_fetch_array($consulta)) {

( ! ) Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in C:\wamp64\www\teste4\consultas.php on line 139

 

E essa linha: $registros=mysqli_num_rows($consulta);

( ! ) Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given in C:\wamp64\www\teste4\consultas.php on line 7

 

Eu usei o "LIKE" só pra usar o '%", mas acho que dá pra usar o "=" no lugar sim.

 

O banco de dados só tem essa tabela, que só serve para armazenar algumas informações e exibir na tela como uma lista. Eu achei que seria mais facil colocar a busca por palavra no banco de dados, ai ele só exibe os que tiver determinada palavra, só que minha duvida foi se dava pra colocar 2 palavras, sendo que uma delas é automática, que seria as cidades, que só iria listar as que tem no banco de dados, e a outra seria o que o usuário digitar. 

a.JPG.c68132971d7878be39306e333e1268fb.JPG

 

 

Em vermelho, é a categoria, onde listará as cidades disponíveis no banco de dados, meu problema é simples, provavelmente basta 3 linhas de código, mas meio que estou sem ideias.

 

b.thumb.JPG.12511c6d32bfe3874fd53ff2cbe0201e.JPG

Compartilhar este post


Link para o post
Compartilhar em outros sites

Resolveu?
Três coisas, você usou um select  * from empresas, não precisa usar novamente. 
use or ( coluna A where coisa or coluna B where coisa ... ) 
Considerando que sua lógica esteja no caminho certo acho que você queria fazer a union entre tabelas diferentes. 
Pesquise sobre as Joins

Compartilhar este post


Link para o post
Compartilhar em outros sites

Rafeky

É bem simples.

 

Você precisa colocar o LIKE sim, porque quer realizar uma pesquisa no seu Banco de Dados buscando por PARTES e não a palabra inteira.

 

Sintexa LIKE '%".$palavra."%' ;

 

Você deve colocar o % no seu LIKE caso caso a palavra que procure esteja no meio

Exemplo:

Tabela

Ferradura

Ferrolho

Fermento

Garfo

Bota

Sapato

 

Se eu procurar por LIKE '%adu%' encontrarei a palavra FERRADURA

Se eu procurar por LIKE 'adu%' não vou encontrar nenhum registro, porque estou procurando uma palavra que COMECE com ADU e no meu exemplo ADU esta no meio de ferrADUra

Se eu procurar por '%adu' não vou encontrar nada também porque estou procurando uma palavra que TERMINE com ADU e na minha tabela não tenho nenhuma palavra que termine com adu.

 

Bom logo vamos ao que você precisa:

Faça assim:

 

$sql = "select * from empresa where (servicos like '%".$_GET['filtro']."%' or nome like '%".$_GET['filtro']."%' or igreja like '%".$_GET['filtro']."%') and cidade like '%".$_GET['categoria']."%'";

 

Então você ira pegar TUDO que tenha nos campos SERVICOS e/ou NOME e/ou IGREJA a palavra digitada pelo usuario, onde a CIDADE vai ser a CIDADE escolhida no SELECT de CATEGORIA.

 

Caso a sua necessidade seja outra, explique melhor o que você quer fazer.

 

Como, a palavra digitada pelo usuario corresponde a qual campo da sua tabela.

O conteúdo do seu combobox que tem os nomes das cidades corresponde apenas que quero buscar pela cidade escolhida.

 

Se a minha resposta for útil não esqueça de agradecer e votar positivo.

Espero ter ajudado de alguma forma.

 

Att
Felipe Guedes Coutinho

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por ILR master
      Fala galera.
      Espero que todos estejam bem.
      Seguinte: Tenho um arquivo xml onde alguns campos estão com : (dois pontos), como o exemplo abaixo:
       
      <item>
      <title>
      d sa dsad sad sadasdas
      </title>
      <link>
      dsadas dsa sad asd as dsada
      </link>
      <pubDate>sadasdasdsa as</pubDate>
      <dc:creator>
      d sad sad sa ad as das
      </dc:creator>
      </item>
       
      Meu código:
       
      $link = "noticias.xml"; 
      $xml = simplexml_load_file($link); 
      foreach($xml -> channel as $ite) {     
           $titulo = $ite -> item->title;
           $urltitulo = $ite -> item->link;
           print $urltitulo = $ite -> item->dc:creator;
      } //fim do foreach
      ?>
       
      Esse campo dc:creator eu não consigo ler. Como faço?
       
      Agradeço quem puder me ajudar.
       
      Abs
       
       
    • Por First
      Olá a todos!
       
      Eu estou criando um sistema do zero mas estou encontnrando algumas dificuldades e não estou sabendo resolver, então vim recorrer ajuda de vocês.
      Aqui está todo o meu código: https://github.com/PauloJagata/aprendizado/
       
      Eu fiz um sistema de rotas mas só mostra o conteúdo da '/' não sei porque, quando eu tento acessar o register nada muda.
      E eu também quero que se não estiver liberado na rota mostra o erro de 404, mas quando eu tento acessar um link inválido, nada acontece.
      Alguém pode me ajudar com isso? E se tiver algumas sugestão para melhoria do código também estou aceitando.
       
       
      Desde já, obrigado.
    • Por landerbadi
      Olá pessoal, boa tarde
       
      Tenho uma tabela chamada "produtos" com os seguintes campos (id, produto) e outra tabela chamada "itens" com os seguintes campos (id, prod_01, prod_02, prod_03, prod_04).
       
      Na tabela produtos eu tenho cadastrado os seguintes produtos: laranja, maçã, uva, goiaba, arroz, feijão, macarrão, etc.
       
      Na tabela itens eu tenho cadastrado os itens da seguinte maneira:
       
      1, laranja, uva, arroz, feijão;
      2, maçã, macarrão, goiaba, uva;
      3, arroz, feijão, maçã, azeite
       
      Meu problema é o seguinte: 
      Eu escolho um produto da tabela "produtos", por exemplo "uva".  Preciso fazer uma consulta na tabela "itens" para ser listado todos os registros que contenham o produto "uva" e que todos os demais produtos estejam cadastrados na tabela "produtos".
       
      No exemplo acima seria listado apenas dois registros, pois o terceiro registro não contém o produto "uva". 
       
      Alguém pode me ajudar? Pois estou quebrando a cabeça a vários dias e não consigo achar uma solução.
×

Informação importante

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