Ir para conteúdo

POWERED BY:

Arquivado

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

Igor Pereira

[Resolvido] Multiplos campo para busca em mysql

Recommended Posts

Olá galera estou apanhando um pouco para a lógia ao fazer um SELECT no bd.

 

o problema é o seguinte, tem por volta de 8 campos de busca, onde o usuario pode prencher todos, apenas 1 ou2, ou nenhum (onde aparecerá todos os dados).

 

Logo, uma tabema assim Nome, Bairro, estado_civil. o nome pode filtrar somene nome ou nome e bairro ou todos os campos entenderam? o negócio é que existem 8 mais opções de filtro da informação.

 

a principio tentei dessa forma

"SELECT * FROM usuarios WHERE  (nome '%". $_POST['buscaNome'] . "%' OR bairro like '%". $_POST['buscaBairro'] . "%' OR estado_civil '%". $_POST['buscaEstadoCIvil'] . "%'ORDER BY ID"

 

porem dessa forma se a acondição de BuscaNome for true, o select não filtra os outros campos. Outra coisa que me intrifa é se o usuario não colocar nada em "bairro" a busca não acha nada qndo é para selecionar todos.

 

Como posso fazer um select de multiplos variaveis?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá, basta você usar um array_filter na variável global $_POST, assim você vai ter os dados

de $_POST filtrados, removendo índices que contenha valores false ou vazios, eu não sei se é bem esse o algorítimo

para fazer esse tipo de busca, no qual os campos podem ser adicionados a qualquer momento, aqui funcionou, veja bem:

 

<?php
       function Search( Array $Fields ){
             if( !is_array( $Fields ) ){
                 throw new OutOfBoundsException( 'Esperavamos um array' );
             }else{
                 $Fields = array_filter( $Fields );
                 foreach( $Fields as $index => $data ){
                     $fields[] = sprintf( '`%s`', $index );
                     $values[] = !is_numeric( $data ) ? sprintf( "'%s'", $data ) : intval( $data );
                 }
                 for( $i = 0; $i < sizeOf( $fields ); ++$i ){
                      if( $i %count( $fields ) == 0 ){
                          $sql[ $i ] = sprintf( '%s = %s', $fields[ $i ], $values[ $i ] );
                      }else{
                          $sql[ $i ] = sprintf( 'OR %s = %s', $fields[ $i ], $values[ $i ] );
                      }
                 }
                 return implode( ' ', $sql );
             }
       }

Executando o código, vai te retornar uma instrução SQL que você deve juntar ao seu SELECT, executando dessa forma:

<?php
       $Data = array( 'campo1' => '---', 
                      'campo2' => '***', 
                      'campo3' => '///', 
                      'campo4' => 'abc', 
                      'campo5' => 'def', 
                      'campo6' => 'ghi', 
                      'campo7' => '123' 
       );
       echo sprintf( 'SELECT * FROM `tabela` WHERE %s', search( $Data ) );

 

Perceba também que na função, temos um cast de números, e strings, justamente para impedir que haja variação

na pesquisa, o resultado foi:

SELECT * FROM `tabela` WHERE `campo1` = '---' OR `campo2` = '***' 
OR `campo3` = '///' OR `campo4` = 'abc' OR `campo5` = 'def' 
OR `campo6` = 'ghi' OR `campo7` = 123

Você pode reduzir o número de campos intencionalmente, como o usuário desejar, basta você enviar pelo primeiro

parametro da função a variável $_POST, lembrando que cada índice do array $_POST deve ser o nome do campo no MySQL

 

outro exemplo seria uma redução de campos, o OR no SQL não muda, independente da situação, se tiver mais de 1

campo ou 1 item no POST, será adicionado um OR, se tiver somente um, seria a condição definitiva para consulta

veja bem:

   $Data = array( 'campo1' => '---' );
   echo sprintf( 'SELECT * FROM `tabela` WHERE %s', search( $Data ) );

Saída:

SELECT * FROM `tabela` WHERE `campo1` = '---'

com 2 campos:

   $Data = array( 'campo1' => '---', 'campo2' => 'abc' );
   echo sprintf( 'SELECT * FROM `tabela` WHERE %s', search( $Data ) );

saída:

SELECT * FROM `tabela` WHERE `campo1` = '---' OR `campo2` = 'abc'

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

A Lógica eu entendi, masa na pratica eu declaro o array $Data com os meus campos e as variaveis e depois chamo a funcao search na instrução sql?!?!?! assim ?

<?php
       $Data = array( 'userName' => '$_POST['buscaNome']', 
                      'userBairro' => '$_POST['buscaBairro']', 
                      'campo3' => '///', 
                      'campo4' => 'abc', 
                      'campo5' => 'def', 
                      'campo6' => 'ghi', 
                      'campo7' => '123' 
       );
       echo sprintf( 'SELECT * FROM `tabela` WHERE %s', search( $Data ) );

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não precisa não amigo, você pode mandar o $_POST diretamente na função, ela já faz o serviço todo pra você

dessa forma:

<?php
     echo sprintf( 'SELECT * FROM `tabela` WHERE %s', search( $_POST ) );

mais lembre que o 'name' dos seus inputs no html tem que ser o nome do campo no banco de dados

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não precisa não amigo, você pode mandar o $_POST diretamente na função, ela já faz o serviço todo pra você

dessa forma:

<?php
     echo sprintf( 'SELECT * FROM `tabela` WHERE %s', search( $_POST ) );

mais lembre que o 'name' dos seus inputs no html tem que ser o nome do campo no banco de dados

 

hummmm, Muito boa a ajuda! Resolvido! :clap:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Okay, mais agora, vejo que na sua SQL 'do primeiro post', você usa o 'LIKE', caso você queira mudar, é só alterar:

$sql[ $i ] = sprintf( 'OR %s = %s', $fields[ $i ], $values[ $i ] );

para:

$sql[ $i ] = sprintf( 'OR %s LIKE \'%s%s%s\'', $fields[ $i ], '%', $values[ $i ], '%' );

 

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Okay, mais agora, vejo que na sua SQL 'do primeiro post', você usa o 'LIKE', caso você queira mudar, é só alterar:

$sql[ $i ] = sprintf( 'OR %s = %s', $fields[ $i ], $values[ $i ] );

para:

$sql[ $i ] = sprintf( 'OR %s LIKE \'%s%s%s\'', $fields[ $i ], '%', $values[ $i ], '%' );

 

;)

 

só para conhecimentos, qual seria a diferença, visto que ambos funcionam?

ah, troquei o operador 'OR' pelo 'AND' logo se usuario preencher 2 campos ex.: user: igor cidade: SP escreverá apenas linha que contenham user: Igor e cidade: SP (refinamento de busca).

 

agora to tentando fazer uma condição que ser todos os campos for vazios selecionar tudo senão passa a fazer a função... mas não funfou

<?php 
if (empty($_POST){
"select * from 'tabela'";
}
else
{
//função feita acima
} ?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

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