Ir para conteúdo

POWERED BY:

Arquivado

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

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

  • Conteúdo Similar

    • Por violin101
      Caros amigos, saudações.
       
      Por favor, poderiam me ajudar.

      Estou com a seguinte dúvida:
      --> como faço para para implementar o input código do produto, para quando o usuário digitar o ID o sistema espera de 1s a 2s, sem ter que pressionar a tecla ENTER.

      exemplo:
      código   ----   descrição
           1       -----   produto_A
       
      Grato,
       
      Cesar
    • Por violin101
      Caros amigos, saudações.
       
      Humildemente peço desculpa por postar uma dúvida que tenho.

      Preciso salvar no MySql, os seguinte Registro:

      1 - Principal
      ====> minha dúvida começa aqui
      ==========> como faço para o Sistema Contar Automaticamente o que estiver despois do 1.____?
      1.01 - Matriz
      1.01.0001 - Estoque
      1.01.0002 - Oficina
      etc

      2 - Secundário
      2.01 - Loja_1
      2.01.0001 - Caixa
      2.01.0002 - Recepção
      etc
       
      Resumindo seria como se fosse um Cadastro de PLANO de CONTAS CONTÁBEIL.

      Grato,


      Cesar









       
    • Por violin101
      Caros amigos, saudações.

      Por favor, me perdoa em recorrer a orientação dos amigos.

      Preciso fazer um Relatório onde o usuário pode Gerar uma Lista com prazo para vencimento de: 15 / 20/ 30 dias da data atual.

      Tem como montar uma SQL para o sistema fazer uma busca no MySql por período ou dias próximo ao vencimento ?

      Tentei fazer assim, mas o SQL me traz tudo:
      $query = "SELECT faturamento.*, DATE_ADD(faturamento.dataVencimento, INTERVAL 30 DAY), fornecedor.* FROM faturamento INNER JOIN fornecedor ON fornecedor.idfornecedor = faturamento.id_fornecedor WHERE faturamento.statusFatur = 1 ORDER BY faturamento.idFaturamento $ordenar ";  
      Grato,
       
      Cesar
       
       
       
       
    • Por violin101
      Caros amigos, saudações
       
      Por favor, me perdoa em recorrer a orientação dos amigos, tenho uma dúvida.
       
      Gostaria de uma rotina onde o Sistema possa acusar para o usuário antes dos 30 dias, grifar na Tabela o aviso de vencimento próximo, por exemplo:
       
      Data Atual: 15/11/2024
                                           Vencimento
      Fornecedor.....................Data.....................Valor
      Fornecedor_1...........01/12/2024..........R$ 120,00 <== grifar a linha de Laranja
      Fornecedor_1...........01/01/2025..........R$ 130,00
      Fornecedor_2...........15/12/2024..........R$ 200,00 <== grifar a linha de Amarelo
      Fornecedor_2...........15/01/2025..........R$ 230,00
      Fornecedor_3...........20/12/2024..........R$ 150,00
       
      Alguém tem alguma dica ou leitura sobre este assunto ?

      Grato,
       
      Cesar
    • Por violin101
      Caros amigos, saudações.

      Por favor, me perdoa em recorrer a ajuda dos amigos, mas preciso entender uma processo que não estou conseguindo sucesso.

      Como mencionado no Título estou escrevendo um Sistema Web para Gerenciamento de Empresa.
       
      Minha dúvida, que preciso muito entender:
      - preciso agora escrever a Rotina para Emissão de NFe e essa parte não estou conseguindo.
       
      tenho assistido alguns vídeos e leituras, mas não estou conseguindo sucesso, já fiz toda as importações das LIB da NFePhp conforme orientação.

      Preciso de ajuda.

      Algum dos amigos tem conhecimento de algum passo-a-passo explicando a criação dessa rotina ?

      tenho visto alguns vídeos com LARAVEL, mas quando tento utilizar e converter para PHP+Codeiginter, dá uma fila de erros que não entendo, mesmo informando as lib necessárias.

      Alguns do amigo tem algum vídeo, leitura explicando essa parte ?

      Grato,

      Cesar.
×

Informação importante

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