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 luiz monteiro
      Olá, tudo bem?
       
      Estou melhorando meu conhecimento em php e mysql e, me deparei com o seguinte. A tabela da base de dados tem um campo do tipo varchar(8) o qual armazena números. Eu não posso alterar o tipo desse campo. O que preciso é fazer um select para retornar o números que contenham zeros a direita ou a esquerda.
      O que tentei até agora
       
      Ex1
      $busca = $conexao->prepare("select campo form tabela where (campo = :campo) ");
      $busca->bindParam('campo', $_REQUEST['campo_form']);
       
      Se a direita da string $_REQUEST['campo_form'] termina ou inicia com zero ou zeros, a busca retorna vazio.
      Inseri dados numéricos, da seguinte maneira para testar: 01234567;  12345670: 12345678: 12340000... entre outros nessa coluna. Todos os valores que não terminam ou não iniciam com zero ou zeros, o select funciona.
       
       
      Ex2
      $busca = $conexao->prepare("select campo form tabela where (campo = 0340000) ");
      Esse número está cadastrado, mas não retorna.
       
      Ex3
      $busca = $conexao->prepare("select campo form tabela where (campo = '02340001' ) ");
      Esse número está cadastrado, mas não retorna.
       
       
      Ex4
      $busca = $conexao->prepare("select campo form tabela where (campo like 2340000) ");
      Esse número está cadastrado, mas não retorna.
       
      Ex5
      $busca = $conexao->prepare("select campo form tabela where (campo like '12340000') ");
      Esse número está cadastrado, mas não retorna.
       
      Ex6
      $busca = $conexao->prepare("select campo form tabela where (campo like '"12340000"' ) ");
      Esse número está cadastrado, mas não retorna.
       
       
      Ex7
      $busca = $conexao->prepare("select campo form tabela where (campo like :campo) ");
      $busca->bindParam('campo', $_REQUEST['campo_form'])
      Não retorna dados.
       
      O  $_REQUEST['campo_form'] é envio via AJAX de um formulário. 
      Usei o gettype para verificar o post, e ele retorna string.
      Fiz uma busca com número 12345678 para verificar o que o select retorna, e também retrona como string.
       
      Esse tipo de varchar foi usado porque os números que serão gravados nesse campo,  terão zeros a direita ou na esquerda. Os tipos number do mysql não gravam zeros, então estou usando esse. O problema é a busca.
      Agradeço desde já.
       
       
    • Por daemon
      Boa tarde,
       
      Eu tenho uma rotina que faz uma leitura do arquivo .xml de vários sites.

      Eu consigo pegar o tópico e a descrição, e mostrar a imagem que esta na pagina do link.
      Para isso utilizo esta função:
      function getPreviewImage($url) { // Obter o conteúdo da página $html = file_get_contents($url); // Criar um novo objeto DOMDocument $doc = new DOMDocument(); @$doc->loadHTML($html); // Procurar pela tag meta og:image $tags = $doc->getElementsByTagName('meta'); foreach ($tags as $tag) { if ($tag->getAttribute('property') == 'og:image') { return $tag->getAttribute('content'); } } // Se não encontrar og:image, procurar pela primeira imagem na página $tags = $doc->getElementsByTagName('img'); if ($tags->length > 0) { return $tags->item(0)->getAttribute('src'); } // Se não encontrar nenhuma imagem, retornar null return null; } // Uso: $url = "https://example.com/article"; $imageUrl = getPreviewImage($url); if ($imageUrl) { echo "<img src='$imageUrl' alt='Preview'>"; } else { echo "Nenhuma imagem encontrada"; }  
      Mas estou com um problema, esta funcão funciona quando coloco em uma pagina de teste.php. Preciso mostrar em uma página inicial diversas fotos de todos os links. (No caso acima só funciona 1).
    • Por violin101
      Caros amigos, saudações.
       
      Por favor, me permita tirar uma dúvida com os amigos.

      Tenho um Formulário onde o Usuário digita todos os Dados necessários.

      Minha dúvida:
      --> como faço após o usuário digitar os dados e salvar, o Sistema chamar uma Modal ou mensagem perguntando se deseja imprimir agora ?

      Grato,
       
      Cesar
    • Por Carcleo
      Tenho uma abela de usuarios e uma tabela de administradores e clientes.
      Gostaria de uma ajuda para implementar um cadastro
       
      users -> name, login, passord (pronta) admins -> user_id, registratiom, etc.. client -> user_id, registratiom, etc...
      Queria ajuda para extender de user as classes Admin e Client
      Olhem como estáAdmin
      <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Admin extends User {     use HasFactory;            protected $fillable = [         'name',         'email',         'password',         'registration'     ];      private string $registration;     public function create(         string $name,          string $email,          string $password,         string $registration     )     {         //parent::create(['name'=>$name, 'email'=>$email, 'password'=>$password]);         parent::$name = $name;         parent::$email = $email;         parent::$password = $password;         $this->registration = $registration;     } } User
      <?php namespace App\Models; // use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Illuminate\Database\Eloquent\Relations\BelongsToMany; class User extends Authenticatable {     /** @use HasFactory<\Database\Factories\UserFactory> */     use HasFactory, Notifiable;     static string $name;     static string $email;     static string $password;     /**      * The attributes that are mass assignable.      *      * @var list<string>      */     protected $fillable = [         'name',         'email',         'password',     ];          /**      * The attributes that should be hidden for serialization.      *      * @var list<string>      */     protected $hidden = [         'remember_token',     ];     /**      * Get the attributes that should be cast.      *      * @return array<string, string>      */     protected function casts(): array     {         return [             'email_verified_at' => 'datetime',             'password' => 'hashed',         ];     }          public function roles() : BelongsToMany {         return $this->belongsToMany(Role::class);     }       public function hasHole(Array $roleName): bool     {                 foreach ($this->roles as $role) {             if ($role->name === $roleName) {                 return true;             }         }         return false;     }         public function hasHoles(Array $rolesName): bool     {                 foreach ($this->roles as $role) {             foreach ($rolesName as $rolee) {             if ($role->name === $rolee) {                 return true;             }          }         }         return false;     }         public function hasAbility(string $ability): bool     {         foreach ($this->roles as $role) {             if ($role->abilities->contains('name', $ability)) {                 return true;             }         }         return false;     }     } Como gravar um Admin na tabela admins sendo que ele é um User por extensão?
      Tentei assim mas é claro que está errado...
      public function store(Request $request, Admin $adminModel) {         $dados = $request->validate([             "name" => "required",             "email" => "required|email",             "password" => "required",             "registration" => "required"         ]);         $dados["password"] =  Hash::make($dados["password"]);                  $admin = Admin::where("registration",  $dados["registration"])->first();                  if ($admin)              return                    redirect()->route("admin.new")                             ->withErrors([                                 'fail' => 'Administrador já cadastrados<br>, favor verificar!'                   ]);                            $newAdmin = $adminModel->create(                                    $dados['name'],                                    $dados['email'],                                    $dados['password'],                                    $dados['registration']                                 );         dd($newAdmin);         $adminModel->save();         //$adminModel::create($admin);                  return redirect()->route("admin.new")->with("success",'Cadastrado com sucesso');     }  
×

Informação importante

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