Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá!
Imaginem um formulário de busca interna, onde existem três critérios para a busca. Não necessariamente os três critérios devem ser preenchidos. Os critérios são, p. ex.: Marca, Modelo, Cor.
O usuário UM vai realizar uma pesquisa e escolhe: Marca: ALFA; Modelo: XY; Cor: "Deixou em branco".
O usuário DOIS vai realizar uma pesquisa e escolhe: Marca: SIGMA; Modelo: ZG; Cor: Azul.
Se no código eu por: "SELECT * FROM tabela WHERE marca= varMarca OR modelo= varModelo OR cor= varCor" irei ter problemas, pois se o usuário escolher uma marca específica, um modelo e uma cor a QUERY irá retornar tudo que conter a marca escolhida, o modelo e a cor, ou seja não irá filtar corretamente. Mas o usuário pode querer somente uma marca um modelo e a cor pode ser qualquer uma, e irá acontecer o mesmo... a query irá trazer todas as marcas independente do modelo. Entendem??
Então, o que devo fazer?
Ao invés de utilizar OR tente AND.
SELECT * FROM tabela WHERE marca= varMarca AND modelo= varModelo AND cor= varCor"EDIT: Esqueça... agora vi oque realmente queria (depois do post do Beraldo)
Antes de mais nada obrigado a você e ao Lucas.
Então, eu fiz o que voce disse e nao deu resultado algum. Talvez nao seja assim... Vou tentar explicar melhor. Os itens selecionas na pesquisa funcionarão como um arranjo, p. ex.: Marca: ALFA Modelo: X OU Marca: ALFA Modelo: "todos". Eu até consigo fazer colocando o AND, só que o internauta vai ter que obrigatoriamente por a MARCA e o MODELO, ora ele pode somente escolher a marca e o modelo pode ser todos. E no Select eu quero que sejam exibidos todos os campos e não só os campos Marca e Modelo, imagine que marca e modelo é apenas uma das características do item cadastrado e que como resultado da pesquisa aparecerá as outras características dos itens.
Mostre como fez.
Também dê um echo em $sql antes de executá-la no banco, para ver como está sendo enviada.
A partir a ajuda de uma usuária de outro fórum, o que ela pensou foi bastante parecido com o que o BERALDO tambem pensou, eu consegui fazer dessa forma:
$varMarca = $_GET['marca'];
$varModelo = $_GET['modelo'];
$varCodigo = $_GET['codigo'];
$Complemento = " id is not null ";
if($varMarca ){
$Complemento .= " AND marca= '$varMarca ";
}
if($varMdelo){
$Complemento .=" AND modelo= '$varMdelo";
}
if($varCodigo ){
$Complemento .=" AND id = '$varCodigo ";
}
$Pesquisa = "SELECT * FROM tabela WHERE $Complemento";
Só que o campo Codigo/ID também fará parte da pesquisa e na $Complemento eu estou passando ao interpretador que ele não é nulo, mas o usuário pode deixá-lo em branco. Caso isso ocorra acontecerá um erro e não haverá resultados.
Por que não usa a mesma lógica para o ID, então?
Também pode usar is null, não somente is not null
Beraldo,
Se eu digo que o ID é nulo quando o usuário digitá-lo o browser nao irá reconhecer, ora eu disse que ele é nulo.
:huh:
Eu acho que se por outra coisa na igualdade da $Complemento ($Complemento = "id is not null") funciona. Eu tentei por $Complemento = "WHERE" e etirei o WHERE da linha do Select... Deu errado, aí eu dei um ECHO e vi ele ele concatenou assim: Select * FROM tabela WHERE AND marca = '$varMarca'...
É possível fazer uns if's para certificar-se de que há uma condição entre o WHERE e o AND. Mas você também pode fazer uma gambiarra:
SELECT campos FROM tabela WHERE 1=1 AND outras_condicoes;Esse Beraldo é F.... mesmo. Consegui. Ficou assim:
$Complemento = 1;
$varMarca = $_GET['marca'];
$varModelo = $_GET['modelo'];
$varCodigo = $_GET['codigo'];
if($varMarca ){
$Complemento .= " AND marca= '$varMarca ";
}
if($varMdelo){
$Complemento .=" AND modelo= '$varMdelo";
}
if($varCodigo ){
$Complemento .=" AND id = '$varCodigo ";
}
$Pesquisa = "SELECT * FROM tabela WHERE 1=$Complemento";
Ah!!
Eu consegui fazer outra coisa também que tava dando muita dor de cabeça. Eu queria filtrar os itens da pesquisa por preço... Tipo menor valor e maior valor. Então eu fiz:
$varMenor = $_GET['menor'];
$varMaior = $_GET['maior'];
if($varMenor.$varMaior){
$Complemento .= " AND valor BETWEEN '$varMenor' AND '$varMaior'";
}
Obs.: o usúario deverá digitar os números, menor e maior, sem ponto e sem vírgula. Caso contrário nao haverá resultados. Outra coisa, essa parte do ponto e da vírgula, moeda, eu nao consegui resolver...
E mais uma vez obrigado pela atenção Beraldo.
Monte a string da consulta dinamicamente, conforme os retornos de IF's. Por exemplo:
{Faça isso para cada critério. Lembre-se de colocar AND ou OR entre cada uma delas. Aliás, isso pode ser outro filtro da busca, como em sistemas de busca que oferecem opções para buscar todas as palavras ou qualquer uma delas. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif