Jump to content
Gustavo Heitor Borges

Ajuda com Filtro PHP+MYSQL

Recommended Posts

Boa tarde galera, não sei se alguém pode me ajudar, estou com uma duvida cruel em meu primeiro filtro que estou desenvolvendo.

 

Tenho varias informações no filtro, tipo:

idade:

cor do cabelo:

cor dos olhos:

cidade:

estado:

 

e isso gera uma tabela com todos os dados da procura, até ai tudo bem, consegui fazer tudo utilizando AND no SELECT, mas para isso o usuário precisa preencher todas as informações.

Gostaria de saber como fazer para se o usuário querer uma busca por exemplo de somente idade e cidade (Buscar modelos de São Paulo com idade de 15 anos).

alguém sabe me dizer como fazer ou conhece algum tutorial? Obrigado!!!

 

vou deixar uma gambi que fiz, mas acho que não esta certo:

<?php
	//ALTURA
	$altura_de = $_POST['altura_de'];
	$altura_ate = $_POST['altura_ate'];
	$altura_total  = $altura_de.$altura_ate;
	
	if(empty($altura_total)) {
		$altura_result = '';
		$and = '';
		$and2 = 'AND';
	}else{
		$altura_result = 'altura>'.$altura_de.' AND altura<'.$altura_ate.'';
		$and = 'AND';
		$and2 = '';
	}
	
	//FIM ALTURA
	//MANEQUIM
	$manequim = $_POST['manequim'];
	$numero_manequim = $manequim;
	if(empty($manequim)) {
		$manequim = '';
	}else{
		$manequim = ''.$and.' manequim='.$numero_manequim.'';
	}
	//FIM MANEQUIM
	
	//IDADE
	$idade = $_POST['idade'];
	$data_atual = date('Y');
	$ano_nascimento = $data_atual - $idade;
	
	if(empty($idade)){
		$result_idade = '';	
	}else{
		$result_idade = ''.$and.' data_de_nascimento LIKE "%'.$ano_nascimento.'%"';
	}
	//FIM IDADE
	
	
	$SQL = "SELECT * FROM galeria2 WHERE ".$altura_result." ".$manequim." ".$result_idade."";
	$RS  = mysql_query($SQL);
	while($banner = mysql_fetch_array($RS)){
		$foto = $banner['pasta'];
	 //RESULTADO
        }
	
?>

Share this post


Link to post
Share on other sites

Uma forma simples é colocar tudo num array e depois usar implode.

Um exemplo simples:

 

 

$nome  = 'Beraldo';
$idade = null;
$pais  = 'Brasil';
 
$filtros = [];

if (!empty($nome)) {
$filtros[] = sprintf("nome = '%s'", $nome);
}
if (!empty($idade)) {
$filtros[] = sprintf("nome = %d", $idade);
}
if (!empty($pais)) {
$filtros[] = sprintf("pais = '%s'", $pais);
}
 
$sql = "SELECT campos FROM tabela WHERE ".implode(' AND ', $filtros);
var_dump($sql);

 

Dá pra fazer um if com count() antes de usar implode, pois, se o usuário não selecionar filtro algum, ficará um WHERE sem nada e vai causar erro.

 

 

PS: funções mysql_* estão obsoletas desde o PHP 5.5 e já foram removidas no PHP 7. Prefira usar MySQLi ou PDO. Veja mais aqui: http://rberaldo.com.br/mysql-obsoleto-php/

  • +1 1

Share this post


Link to post
Share on other sites

Olá.

 

Você pode armazenar os filtros em um array e depois juntar na sua consulta.

Exemplo:

<?php
$filtros = Array();
 
// utilize o float para tratar/converter os dados e evitar sql injection
$altura_de = (float)$_POST['altura_de'];
$altura_ate = (float)$_POST['altura_ate'];
$manequim = (float)$_POST['manequim'];
$idade = (float)$_POST['idade'];
 
if(!empty($altura_de) && !empty($altura_ate)){
    // utilize o BETWEEN ao invés de > e < (até porque o correto seria >= e <=, e é o que o bETWEEN faz)
    $filtros[] = "altura BETWEEN {$altura_de} AND {$altura_ate}";
}else if(!empty($altura_de)){
    $filtros[] = "altura >= {$altura_de}";
}else if(!empty($altura_ate)){
    $filtros[] = "altura <= {$altura_ate}";
}
 
if(!empty($manequim)){
    $filtros[] = "manequim = {$manequim}";
}
 
if(!empty($idade)){
    // utilize o TIMESTAMPDIFF, dessa forma ele retorna a idade de acordo com o campo data_de_nascimento, aí é só comparar com a da busca
    $filtros[] = "TIMESTAMPDIFF(YEAR, data_de_nascimento, CURDATE()) = {$idade}";
    // você também pode criar filtro idade_de e idade_ate e usar o between (igual a altura)...
    // algo assim:
    // TIMESTAMPDIFF(YEAR, data_de_nascimento, CURDATE()) BETWEEN {$idade_de} AND {$idade_ate}
}
 
// monta o where usando os filtros (concatena o array, usando o AND para juntar cada item)
if(count($filtros)){
    $where = "WHERE " . join(" AND ", $filtros);
}else{
    $where = "";
}
 
// usa os filtros (variável $where) na consulta
$SQL = "SELECT * FROM galeria2 {$where}";
 
// continua os comandos...
  • +1 1

Share this post


Link to post
Share on other sites

Uma forma simples é colocar tudo num array e depois usar implode.

Um exemplo simples:

$nome  = 'Beraldo';
$idade = null;
$pais  = 'Brasil';
 
$filtros = [];

if (!empty($nome)) {
$filtros[] = sprintf("nome = '%s'", $nome);
}
if (!empty($idade)) {
$filtros[] = sprintf("nome = %d", $idade);
}
if (!empty($pais)) {
$filtros[] = sprintf("pais = '%s'", $pais);
}
 
$sql = "SELECT campos FROM tabela WHERE ".implode(' AND ', $filtros);
var_dump($sql);

Dá pra fazer um if com count() antes de usar implode, pois, se o usuário não selecionar filtro algum, ficará um WHERE sem nada e vai causar erro.

 

 

PS: funções mysql_* estão obsoletas desde o PHP 5.5 e já foram removidas no PHP 7. Prefira usar MySQLi ou PDO. Veja mais aqui: http://rberaldo.com.br/mysql-obsoleto-php/

Cara, muito obrigado! Me ajudou bastante a entender!

Share this post


Link to post
Share on other sites

 

Olá.

 

Você pode armazenar os filtros em um array e depois juntar na sua consulta.

Exemplo:

<?php
$filtros = Array();
 
// utilize o float para tratar/converter os dados e evitar sql injection
$altura_de = (float)$_POST['altura_de'];
$altura_ate = (float)$_POST['altura_ate'];
$manequim = (float)$_POST['manequim'];
$idade = (float)$_POST['idade'];
 
if(!empty($altura_de) && !empty($altura_ate)){
    // utilize o BETWEEN ao invés de > e < (até porque o correto seria >= e <=, e é o que o bETWEEN faz)
    $filtros[] = "altura BETWEEN {$altura_de} AND {$altura_ate}";
}else if(!empty($altura_de)){
    $filtros[] = "altura >= {$altura_de}";
}else if(!empty($altura_ate)){
    $filtros[] = "altura <= {$altura_ate}";
}
 
if(!empty($manequim)){
    $filtros[] = "manequim = {$manequim}";
}
 
if(!empty($idade)){
    // utilize o TIMESTAMPDIFF, dessa forma ele retorna a idade de acordo com o campo data_de_nascimento, aí é só comparar com a da busca
    $filtros[] = "TIMESTAMPDIFF(YEAR, data_de_nascimento, CURDATE()) = {$idade}";
    // você também pode criar filtro idade_de e idade_ate e usar o between (igual a altura)...
    // algo assim:
    // TIMESTAMPDIFF(YEAR, data_de_nascimento, CURDATE()) BETWEEN {$idade_de} AND {$idade_ate}
}
 
// monta o where usando os filtros (concatena o array, usando o AND para juntar cada item)
if(count($filtros)){
    $where = "WHERE " . join(" AND ", $filtros);
}else{
    $where = "";
}
 
// usa os filtros (variável $where) na consulta
$SQL = "SELECT * FROM galeria2 {$where}";
 
// continua os comandos...

Nossa, era bem isso que estava tentando fazer, mas sou iniciante ainda, tenho muito que aprender, Muito Obrigado mesmo!

Share this post


Link to post
Share on other sites

 

Olá.

 

Você pode armazenar os filtros em um array e depois juntar na sua consulta.

Exemplo:

<?php
$filtros = Array();
 
// utilize o float para tratar/converter os dados e evitar sql injection
$altura_de = (float)$_POST['altura_de'];
$altura_ate = (float)$_POST['altura_ate'];
$manequim = (float)$_POST['manequim'];
$idade = (float)$_POST['idade'];
 
if(!empty($altura_de) && !empty($altura_ate)){
    // utilize o BETWEEN ao invés de > e < (até porque o correto seria >= e <=, e é o que o bETWEEN faz)
    $filtros[] = "altura BETWEEN {$altura_de} AND {$altura_ate}";
}else if(!empty($altura_de)){
    $filtros[] = "altura >= {$altura_de}";
}else if(!empty($altura_ate)){
    $filtros[] = "altura <= {$altura_ate}";
}
 
if(!empty($manequim)){
    $filtros[] = "manequim = {$manequim}";
}
 
if(!empty($idade)){
    // utilize o TIMESTAMPDIFF, dessa forma ele retorna a idade de acordo com o campo data_de_nascimento, aí é só comparar com a da busca
    $filtros[] = "TIMESTAMPDIFF(YEAR, data_de_nascimento, CURDATE()) = {$idade}";
    // você também pode criar filtro idade_de e idade_ate e usar o between (igual a altura)...
    // algo assim:
    // TIMESTAMPDIFF(YEAR, data_de_nascimento, CURDATE()) BETWEEN {$idade_de} AND {$idade_ate}
}
 
// monta o where usando os filtros (concatena o array, usando o AND para juntar cada item)
if(count($filtros)){
    $where = "WHERE " . join(" AND ", $filtros);
}else{
    $where = "";
}
 
// usa os filtros (variável $where) na consulta
$SQL = "SELECT * FROM galeria2 {$where}";
 
// continua os comandos...

Amigo, uma duvida, tentei colocar mais campos no meu filtro, Exemplo: Cidade, mas não esta funcionando, pelo meu ver é só adicionar mais um:

$cidade = (float)$_POST['cidade'];

 

 

if(!empty($cidade)){

$filtros[] = "cidade= {$cidade}";

}

 

Estou certo? Obrigado!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Giovanird
      Olá a todos!

      Abaixo lista minha estrutura em Json. Há grupos que faltam um objeto (TIPO) e ao listar recebo o erro  por não encontrá-lo.
      Existe alguma maneira de verificar se este objeto existe e caso não, ignorar?

      Desde já agradeço a atenção.

       
      ESTUTURA JSON: [ { “titulo”: “JSON”, “data”: “20/10/2020”, “ano”: 2020, “tipo”: novo }, { “titulo”: “HTML”, “data”: “20/10/2020”, “ano”: 2020, “tipo”: usado }, { “titulo”: “PHP”, “data”: “20/10/2020”, “ano”: 2020 } ] CAPTURANDO OS DADOS: $titulo = $decode->titulo; $data = $decode->data; $ano = $decode->ano; $tipo = $decode->tipo;  
       
    • By mibs
      Olá! podem me ajudar? o mysql inicia e depois desliga no xampp, já troquei de pasta, exclui arquivos da pasta xamp/mysql já fiz de tudo o que encontrei pela internet s e não funciona. 
       
      Esse é o erro:
      Status change detected: stopped      Error: MySQL shutdown unexpectedly.      This may be due to a blocked port, missing dependencies,       improper privileges, a crash, or a shutdown by another method.      Press the Logs button to view error logs and check      the Windows Event Viewer for more clues      If you need more help, copy and post this      entire log window on the forums  
      E esse o log:
        Mutexes and rw_locks use Windows interlocked functions  Uses event mutexes   Compressed tables use zlib 1.2.11   Number of pools: 1   Using SSE2 crc32 instructions   Initializing buffer pool, total size = 16M, instances = 1, chunk size = 16M   Completed initialization of buffer pool   1 out of 1 rollback segments are active.  Creating shared tablespace for temporary tables   Setting file 'C:\xampp\mysql\data\ibtmp1' size to 12 MB. Physically writing the file full; Please wait ...  File 'C:\xampp\mysql\data\ibtmp1' size is now 12 MB.  10.4.14 started; log sequence number 11460; transaction id 1  !!! innodb_force_recovery is set to 4 !!!  Loading buffer pool(s) from C:\xampp\mysql\data\ib_buffer_pool  Plugin 'FEEDBACK' is disabled.  InnoDB: Buffer pool(s) load completed at 201027 12:56:18  Server socket created on IP:   
    • By maurohpg
      Estou fazendo uma gravação dos dados no banco e ao mesmo tempo eu faço upload de um arquivo pdf. 

      Acontece que a gravação do dados está ok, grava o nome do arquivo pdf no banco, mas não grava o arquivo pdf na pasta, e não me retorna nenhum erro, segue no script ou no log.
       
      Alguém pode dar uma luz no que estou fazendo errado? É bem simples, nas não encontro o erro.
       
      <?php include("../config.php"); include("verifica.php"); include("../tags.php"); $acao = strip_tags( $_GET['acao'] ); /* Informa o nível dos erros que serao exibidos */ error_reporting(E_ALL); /* Habilita a exibiçao de erros */ ini_set("display_errors", 1); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <?php echo "<?xml version=\"1.0\" encoding=\"iso-8859-2\"?".">"; ?> <title><?php echo $nomeL ?></title> <link href="css/css.css" rel="stylesheet" type="text/css" /> <!-- desenvolvido por Mauro Garcia --> <script type="text/javascript" src="../js/funcoes.js"></script> <script src="ckeditor/ckeditor.js"></script> </head> <body> <?php include("topo.php"); ?> <div id="content_interno"> <?php include("menu.php"); ?> <div id="admin"> <table width="774" border="0" cellspacing="0" cellpadding="0"> <tr> <td width="82%"><p>INSERIR REGISTRO</p></td> <td width="18%"><a href="privacidade_add.php"><br /> </a></td> </tr> </table> <br /> <br /> <?php if( empty( $acao ) ) { ?> <form name="add" action="privacidade_add.php?acao=add" method="post" enctype="multipart/form-data"> <div class="form_add"> <table width="650" border="0" align="left" cellpadding="5" cellspacing="5"> <tr> <td colspan="4"><strong>Mostrar no site</strong></td> </tr> <tr> <td colspan="4"><select name="ativo"> <option value="1">Sim</option> <option value="0">N&atilde;o</option> </select></td> </tr> <tr> <td height="5" colspan="4"><img src="img/spacer.gif" width="5" height="5" /></td> </tr> <tr> <td colspan="4"><strong>C&oacute;digo, se n&atilde;o houver deixe em branco</strong></td> </tr> <tr> <td colspan="4"><input name="codigo" type="text" id="codigo" onfocus="dentro(this, 'Código')" onblur="fora(this, 'Código')" value="Código" size="20" maxlength="10"/></td> </tr> <tr> <td colspan="4"><img src="img/spacer.gif" width="5" height="5" /></td> </tr> <tr> <td colspan="4"><input name="hora" type="text" id="hora" onfocus="dentro(this, 'Data')" onblur="fora(this, 'Data')" value="Data" size="20" maxlength="10"/> dd/mm/aaaa</td> </tr> <tr> <td colspan="4"><img src="img/spacer.gif" width="5" height="5" /></td> </tr> <tr> <td colspan="4"><strong>T&iacute;tulo (At&eacute; 200 caracteres): </strong></td> </tr> <tr> <td colspan="4"><input name="nome_imovel" type="text" id="nome_imovel" onfocus="dentro(this, 'Título')" onblur="fora(this, 'Título')" value="T&iacute;tulo" size="80" maxlength="200"/></td> </tr> <tr> <td colspan="4"><img src="img/spacer.gif" alt="" width="5" height="5" /></td> </tr> <tr> <td colspan="4"><strong><font color="#FF0000">N</font><font color="#FF0000">&atilde;o esquecer de selecionar</font></strong></td> </tr> <tr> <td width="174"><select name="id_negocio_tipo"> <option value="">Categoria</option> <?php $sql = mysql_query("SELECT id, tipo FROM negocio_tipo ORDER BY tipo ASC"); while( $linha = mysql_fetch_array( $sql ) ){ echo '<option value="' . $linha['id'] . '"> ' . $linha['tipo'] . '</option>'; } ?> </select></td> <td width="192">&nbsp;</td> <td width="184">&nbsp;</td> <td width="184">&nbsp;</td> </tr> <tr> <td colspan="4"><img src="img/spacer.gif" alt="" width="5" height="5" /></td> </tr> <tr> <td colspan="4"><strong>Resumo</strong></td> </tr> <tr> <td colspan="4"><textarea name="msg" id="msg" cols="60" rows="5" onfocus="dentro(this, 'Texto')" onblur="fora(this, 'Texto')"></textarea></td> </tr> <tr> <td colspan="4"><img src="img/spacer.gif" alt="" width="5" height="5" /></td> </tr> <tr> <td colspan="4"><strong>PDF</strong></td> </tr> <tr> <td colspan="4"><input id="fakeupload" name="fakeupload" class="fakeupload" type="text" /> <input id="arquivo" name="arquivo" class="foto" type="file" onchange="this.form.fakeupload.value = this.value;" /></td> </tr> <tr> <td><a href="javascript:document.add.submit();"><img src="img/bt_gravar.png" width="74" height="26" /></a></td> <td>&nbsp;</td> <td>&nbsp;</td> <td>&nbsp;</td> </tr> <tr> <td>&nbsp;</td> <td>&nbsp;</td> <td>&nbsp;</td> <td>&nbsp;</td> </tr> </table> </div> </form> <?php } // fim da açao EMPTY if( $acao == 'add') { extract( $_POST, EXTR_OVERWRITE); // extrai os dados do POST, transformando os indices em nomes. Sobrescreve as variaveis existentes, se houver $sql1 = mysql_query("SELECT id FROM privacidade WHERE codigo='$codigo'"); $ttlCodigo = mysql_num_rows($sql1); if( !empty( $codigo ) && $ttlCodigo > 0){ echo "<script language='JavaScript'> alert('Código duplicado, informe outro código'); window.location.href='javascript:history.go(-1)' </script>"; exit; } ///////////////// TRATA if( !empty( $arquivo['name'] ) ) { if(preg_match( '/\.(pdf)+$/', $arquivo["type"])){ echo "<script language='JavaScript'> alert('Arquivo em formato inválido! Formato aceito: PDF'); window.location.href='javascript:history.go(-1)' </script>"; exit; } // Verifica tamanho do arquivo if($arquivo["size"] > 200000000) { echo "<script language='JavaScript'> alert('A imagem deve ser de no máximo 2020680 bytes'); window.location.href='javascript:history.go(-1)' </script>"; exit; } preg_match("/\.(pdf)+$/", $arquivo["name"], $ext); $imagem_nome = md5(uniqid(time())) . "." . $ext[1]; $imagem_dir = "../uploads/pdf/" . $imagem_nome; }else{ // se nao for informado nenhum arquivo echo "<script language='JavaScript'> alert('A imagem da notícia esta faltando'); window.location.href='javascript:history.go(-1)' </script>"; exit; // Repassa a variável do upload $arquivo = isset($_FILES["arquivo"]) ? $_FILES["arquivo"] : FALSE; // Caso a variável $arquivo contenha o valor FALSE, esse script foi acessado // diretamente, então mostra um alerta para o usuário if(!$arquivo) { echo "Não acesse esse arquivo diretamente!"; } // Imagem foi enviada, então a move para o diretório desejado else { // Diretório para onde o arquivo será movido $imagem_dir = "../uploads/pdf/"; // Move o arquivo // Lembrando que se $arquivo não fosse declarado no começo do script, // você estaria usando $_FILES["arquivo"]["tmp_name"] e $_FILES["arquivo"]["name"] if (move_uploaded_file($arquivo["tmp_name"], $imagem_dir . $arquivo["name"])) { echo "Arquivo Enviado com sucesso!"; } else { echo "Erro ao enviar seu arquivo!"; } } } $sql = mysql_query("INSERT INTO privacidade (id_negocio_tipo, codigo, foto_exibicao, msg, ativo, nome_imovel, hora) VALUES ('$id_negocio_tipo','$codigo','$imagem_nome','$msg','$ativo','$nome_imovel','$hora')") or print(mysql_error()); $ultimo_id = mysql_insert_id(); echo '<div id="sucesso"><font color="#5a5a5a" size="3" face="Arial, Helvetica, sans-serif"><font color="#009900" size="4"><b>Registro inserido com sucesso</b></font><br /><br /> <a href="privacidade_add.php">CADASTRAR OUTRO</a><br><br> <a href=privacidade.php>clique aqui para voltar</a> </font></div>'; } ?> </div> </div> <script> // This call can be placed at any point after the // <textarea>, or inside a <head><script> in a // window.onload event handler. // Replace the <textarea id="editor"> with an CKEditor // instance, using default configurations. CKEDITOR.replace( 'msg' ); </script> <?php include("rodape.php"); ?> </body> </html>  
    • By anabeatrizzz
      2. Por que PHP é a mais utilizada em projetos? Explique.
       
      3. São 24 anos de desenvolvimento em PHP, o que faz ele durar tanto na área da programação? Explique.
       
      4. Você acredita que o PHP vai morrer ou não? Explique.
       
      5. Explique o que seria esta HHVM que as empresas utilizam.
       
      6. PHP tem a facilidade de criar APIs, quais seriam as vantagens na hora de desenvolver aplicativos para celular? Explique.
       
      7. Explique um pouco sobre o Laravel, Zend Framework, Sympony, lumen, codelgniter que foram surgindo ao decorrer dos anos.
       
      8. “O PHP veio da WEB e da WEB ele permanecerá”. O que essa frase significaria para você? Explique.
       
      9. Como funcionariam as comunidades em PHP? Por que existem tantas pessoas ainda usando a linguagem? Explique.
       
      10. O PHP vem se modernizando durante anos, quais seriam estas evoluções dele? Explique.
    • By fideles
      Mais uma vez venho aqui pedir ajuda a vocês.
       
      Tenho um formulario que criei aqui na empresa algo bem simples, somente para sair das planilhas de excel, que seria cadastro de funcionarios.
       
      Tem os campos, matricula, nome completo, unidade de trabalho, endereço e telefone de emergencia.
       
      A parte do formulario funciona, a gravação no BD tbm, listar as informações também, ai me perguntaram se era possível um auto preenchimento dos campos colocando somente a matricula do funcionario e respondi que eu não sei porque realmente não sei.
       
      A ajuda que eu preciso de vocês seria, é possível fazer isso ? Colocar a matricula e vir do banco e preencher os outros inputs? Se sim, é possível me derem um exemplo de como funciona e eu estudar o codigo e colocar nos outros inputs.
       
      Obrigado antecipadamente. 
       
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.