Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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>>
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.
/monthly_2017_10/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.
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 JoinsRafeky
É 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***
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:
)T WHERE T.servicos LIKE '%$filtro%' OR T.cidade LIKE '%$filtro%' OR T.nome LIKE '%$filtro%'