Ir para conteúdo

POWERED BY:

Arquivado

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

Anderson Narciso

[Resolvido] Select de valores não filtra corretamente

Recommended Posts

Olá pessoal! Estou com um problemas em um filtro de imóveis, confiram:

 

Select

 

$valor = $_POST['valor'];
$valores = explode(" ",$valor);

$sql_res = mysql_query("SELECT * FROM imoveis WHERE imovelCidade LIKE '%$cidade%' AND imovelBairro LIKE '%$bairro%' AND imovelTipo LIKE '%$tipo%' AND imovelNegociacao LIKE '%$negocio%'");
$total =  mysql_num_rows($sql_res);
*/

$sql_select = 'SELECT * FROM imoveis WHERE imovelCidade LIKE :cidade AND imovelBairro LIKE :bairro AND imovelTipo LIKE :tipo AND imovelNegociacao LIKE :negocio AND imovelValor BETWEEN :valorum AND :valordois ORDER BY imovelID'

try{
$query_select = $conecta->prepare($sql_select);
$query_select->bindValue(':cidade','%'.$cidade.'%',PDO::PARAM_STR);
$query_select->bindValue(':bairro','%'.$bairro.'%',PDO::PARAM_STR);
$query_select->bindValue(':tipo','%'.$tipo.'%',PDO::PARAM_STR);
$query_select->bindValue(':negocio','%'.$negocio.'%',PDO::PARAM_STR);
$query_select->bindValue(':valorum',$valores[0],PDO::PARAM_STR);
$query_select->bindValue(':valordois',$valores[1],PDO::PARAM_STR);
$query_select->execute();
$resultado_query = $query_select->fetchAll(PDO::FETCH_ASSOC);

 

Select html

 

<select name="valor">
   <option value="">Todos os Valores</option>
   <option value="0 200000">Até R$200 mil</option>
   <option value="200000 400000">R$200 mil até R$400mil</option>
   <option value="400000 600000">R$400 mil até R$600mil</option>
   <option value="600000 750000">R$600 mil até R$750mil</option>
   <option value="750000 900000">R$750 mil até R$900mil</option>
   <option value="900000">Acima de R$900mil</option>
 </select>

 

O que acontece é o seguinte, ele parece que não filtra os zeros depois da primeira casa, se eu buscar de 200 mil até 400mil ele lista tbm valores completamente acima, como 1 milão.. Mesma coisa acontece em valores maiores, se eu busco de 750mil até 900 mil ele filtra valores como 80 mil :/

 

Alguém faz idéia de onde estou errando?

Grato desde já!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde, tambem estou tentando fazer um filtro para imobiliaria que filtre os valores e areas dos imóveis cadastrados, alguem tem alguma idéia de como fazer? um tutorial ou video aula?

 

Alencar

Compartilhar este post


Link para o post
Compartilhar em outros sites

não sei se eu estou sendo muito claro.. mas eu vejo uma forma mais fácil de fazer isso...

 

tu cria dois selects com os possíveis valores de venda etc... um select é pro menor valor e outro é pro maior valor ... (tipo uma pessoa quer comprar uma casa de R$ 0 a R$ 80.000,00) daí é só fazer o between como tu já estava fazendo...

 

acho que assim fica mais fácil até pro usuário que está mexendo no site... pois se tu coloca valores predefinidos... o cara não sabe bem se é bem aquilo que ele se adequa e tal..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas eu acho que tipo, ele iria filtrar do mesmo jeito, não iria fazer diferença.. o problema meu ali é que ele não ta filtrando corretamente...( se eu coloco de 500 mil até 750 mil ele tbm pega valores como 1 milhão) O caso seria como armazenar os valores do select e como salvar eles no db, podendo com vírgula e tal ou não, porque ele filtra mas de maneira errada...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Está é facil amigo Anderson. Ele está pegando valores como 1 milhão porque você está fazendo like '%600000%'. Ele vai procurar todo mundo que tem 6 que tem 0 que tem 2 zeros e por ai vai. Vira uma salada da p.... mesmo ^_^

O correto da sua pesquisa, já que acredito que esteja trabalhando com números inteiros ou float seria pesquisar >= <= .

 

SELECT valor FROM tabela WHERE valor >= '600000' AND valor <= '700000'

Entendeu + ou - a idéia?

 

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nesse momento está assim como no seu exmplo, porem não da certo. O like e % é para a busca de palavras, (cidades, bairros)

 

(Obs: trabalhando com float) (Dúvida: float armezena pontos e virgulas no DB? Ex: 800.000,00)

 



$cidade = $_POST['cidade'];
$bairro = $_POST['bairro'];
$tipo = $_POST['tipo'];
$negocio = $_POST['negocio'];

$valor = $_POST['valor'];
$valores = explode(" ",$valor);

$area = $_POST['area'];
$areas = explode(" ",$area);

$sql_select = 'SELECT * FROM imoveis WHERE imovelCidade LIKE :cidade AND imovelBairro LIKE :bairro AND imovelTipo LIKE :tipo AND imovelNegociacao LIKE :negocio AND imovelValor >= :valorum AND imovelValor <= :valordois AND imovelArea >= :areaum AND imovelArea <= :areadois ORDER BY imovelID';

try{
$query_select = $conecta->prepare($sql_select);
$query_select->bindValue(':cidade','%'.$cidade.'%',PDO::PARAM_STR);
$query_select->bindValue(':bairro','%'.$bairro.'%',PDO::PARAM_STR);
$query_select->bindValue(':tipo','%'.$tipo.'%',PDO::PARAM_STR);
$query_select->bindValue(':negocio','%'.$negocio.'%',PDO::PARAM_STR);
$query_select->bindValue(':valorum',$valores[0],PDO::PARAM_STR);
$query_select->bindValue(':valordois',$valores[1],PDO::PARAM_STR);
$query_select->bindValue(':areaum',$areas[0],PDO::PARAM_STR);
$query_select->bindValue(':areadois',$areas[1],PDO::PARAM_STR);
$query_select->execute();
$resultado_query = $query_select->fetchAll(PDO::FETCH_ASSOC);

}catch (PDOexception $error_select){
echo 'Erro ao selecionar '.$error_select->getMessage();
}
foreach($resultado_query as $res){
	$imovelID = $res['imovelID'];
	$imovelFoto = $res['imovelFoto'];
	$imovelNome = $res['imovelNome'];
	$imovelCidade = $res['imovelCidade'];
	$imovelNegociacao = $res['imovelNegociacao'];
	$imovelDormitorios = $res['imovelDormitorios'];
	$imovelArea = $res['imovelArea'];

	echo '<li>';
	echo '<div class="nome"><a href="processa.php?exe=single&imovel='.$imovelID.'">'.$imovelNome.'</a></div>';
	echo '<div class="foto"><a href="processa.php?exe=single&imovel='.$imovelID.'"><img src="../admin/painel/timthumb.php?src=painel/midias/'.$imovelFoto.'&h=125&w=139&zc=1" alt="" border="0" /></a></div>';
	echo '<div class="localizacao">'.$imovelCidade.'</div>';
	echo '<div class="negociacao">'.$imovelNegociacao.'</div>';
	echo '<div class="dormitorios">'.$imovelDormitorios.'</div>';
	echo '<div class="area_total">'.$imovelArea.'</div>';
	echo '<div class="codigo">'.$imovelID.'</div>';
	echo '<div class="veja_mais"><a href="processa.php?exe=single&imovel='.$imovelID.'"> Ver Imóvel...</a></div>';
	echo '</li>';
}
}?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

$query_select->bindValue(':cidade','%'.$cidade.'%',PDO::PARAM_STR);

 

Anderson, se o seu valor for uma string, você não precisa especificar PDO::PARAM_STR, é o padrão.

 

$query_select->bindValue(':valorum',$valores[0],PDO::PARAM_STR);
$query_select->bindValue(':valordois',$valores[1],PDO::PARAM_STR);

 

Até onde eu percebi, $valor[0] e $valor[1] são números, então trate-os como números:

 

try{
	$query_select = $conecta->prepare($sql_select);
	$query_select->bindValue(':cidade','%'.$cidade.'%');
	$query_select->bindValue(':bairro','%'.$bairro.'%');
	$query_select->bindValue(':tipo','%'.$tipo.'%');
	$query_select->bindValue(':negocio','%'.$negocio.'%');
	$query_select->bindValue(':valorum',$valores[0],PDO::PARAM_INT);
	$query_select->bindValue(':valordois',$valores[1],PDO::PARAM_INT);
	$query_select->bindValue(':areaum',$areas[0],PDO::PARAM_INT);
	$query_select->bindValue(':areadois',$areas[1],PDO::PARAM_INT);
	$query_select->execute();
	$resultado_query = $query_select->fetchAll(PDO::FETCH_ASSOC);

}catch (PDOexception $error_select){
	echo 'Erro ao selecionar '.$error_select->getMessage();
}

 

Quanto a consulta, eu a escreveria dessa forma:

SELECT * FROM imoveis WHERE
( imovelCidade LIKE :cidade ) AND
( imovelBairro LIKE :bairro ) AND
( imovelTipo LIKE :tipo ) AND
( imovelNegociacao LIKE :negocio ) AND
( imovelValor >= :valorum AND imovelValor <= :valordois ) AND
( imovelArea >= :areaum AND imovelArea <= :areadois )
ORDER BY imovelID';

 

:seta: Um ponto que me deixou curioso foi a forma que você está colocando esses "values" no seu combo, qual o objetivo disso ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

João obrigado por responder o tópico.

 

Coloquei tudo conforme está ai João só mudei os valores do value para:

<select name="valor">
   <option value="">Todos os Valores</option>
   <option value="0 200">Até R$200 mil</option>
   <option value="200 400">R$200 mil até R$400mil</option>
   <option value="400 600">R$400 mil até R$600mil</option>
   <option value="600 750">R$600 mil até R$750mil</option>
   <option value="750 900">R$750 mil até R$900mil</option>
   <option value="900">Acima de R$900mil</option>
 </select>

 

Um ponto que me deixou curioso foi a forma que você está colocando esses "values" no seu combo, qual o objetivo disso ?

O que estou fazendo é o seguinte, coloquei dois valores no value, dai faço um explode(), e retiro o valorum e o valordois, para limitar o valor mínimo e máximo da busca.

$valor = $_POST['valor'];
$valores = explode(" ",$valor);

$valorum = $valores[0];
$valordois = $valores[1];

 

e o que está acontecendo é o seguinte:

 

No Banco de dados tenho os seguintes valores:

 

1200.000,00 (um milhão e duzentos mil)

130.000,00 (cento e trinta mil)

600.000,00 (seiscentos mil)

420.000,00 (quatrocentos e vinte mil)

 

porem quando faço a busca até 200 mil, que seria essa:

SELECT * FROM imoveis WHERE (imovelValor >= 0 AND imovelValor <= 200)

ele mostra dois resultados 130.000,00 e 1200.000,00, sendo que só deveria mostrar 130.000,00.

Não sei porque mostra assim, pois se eu fizer o select manualmente no phpmyadmin, ele mostra corretamente, só 130.000,00.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo Anderson, poderia ser mais simples, não precisa do explode.

 

<select name="valor">
   <option value="">Todos os Valores</option>
   <option value="200">Até R$200 mil</option>
   <option value="400">R$200 mil até R$400mil</option>
   <option value="600">R$400 mil até R$600mil</option>
   <option value="750">R$600 mil até R$750mil</option>
   <option value="900">R$750 mil até R$900mil</option>
   <option value="901">Acima de R$900mil</option>
 </select>

Desta forma através de um switch por exemplo você saberia que com 200 seria de 0 a 200

com 400 seria de 200 a 400 e assim por diante. Desta forma você trabalharia com um valor unico

e poderia definir a condição WHERE dentro do switch mesmo ao invés de dividir valores e etc.

 

Quanto ao float ele aceita valores com '.' então se você tem 800mil seria assim 800000.00.

 

Quando você monta a query ela fica como no exemplo que citei?

 

SELECT valor FROM tabela WHERE valor >= '600000' AND valor <= '700000'

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Quando você monta a query ela fica como no exemplo que citei?

 

SELECT valor FROM tabela WHERE valor >= '600000' AND valor <= '700000'

Sim, como citei a cima:

 

SELECT * FROM imoveis WHERE (imovelValor >= 0 AND imovelValor <= 200)

 

 

Tem como me dar um exemplo mais detalhado do teu switch? Não entendo muito dessa parte.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo Anderson se é float

 

SELECT * FROM imoveis WHERE (imovelValor >= 0 AND imovelValor <= 200000)

Tem que funcionar, a menos que os valores estejam cadastrados incorretamente.

 

Quanto ao switch é molesa.

 

http://www.php.net/switch

 

switch($_POST['valor']) {
   case 200:
       $where = 'imovelValor <= 200000';
       break;
   case 400:
       $where = 'imovelValor >= 200000 AND imovelValor <= 400000';
       break;
   case 600:
       $where = 'imovelValor >= 400000 AND imovelValor <= 600000';
       break;
   case 900:
       $where = 'imovelValor >= 600000 AND imovelValor <= 900000';
       break;
   case 901:
       $where = 'imovelValor >= 900000';
       break;
}

$sql = 'SELECT * FROM imoveis WHERE '.$where;

Captou a idéia?

 

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Captei sua idéia, estou tentando fazer aqui, ocorreu um erro, ve se você o entende:

 

Erro ao selecionar SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens

Warning: Invalid argument supplied for foreach() in funcoes.php on line 315

 

$cidade = $_POST['cidade'];
$bairro = $_POST['bairro'];
$tipo = $_POST['tipo'];
$negocio = $_POST['negocio'];

switch($_POST['valor']){
   case 200:
   $valorMinimo = '0';
   $valorMaximo = '200';
   break;
   case 400:
   $valorMinimo = '200';
   $valorMaximo = '400';
   break;
   case 600:
   $valorMinimo = '400';
   $valorMaximo = '600';
   break;
   case 750:
   $valorMinimo = '600';
   $valorMaximo = '750';
   break;
   case 900:
   $valorMinimo = '750';
   $valorMaximo = '900';
   break;
   case 901:
   $valorMinimo = '900';
   break;
}

$sql_select = 'SELECT * FROM imoveis WHERE
(imovelCidade LIKE :cidade) AND 
(imovelBairro LIKE :bairro) AND 
(imovelTipo LIKE :tipo) AND 
(imovelNegociacao LIKE :negocio) AND
(imovelValor >= valorMinimo AND imovelValor <= valorMaximo)';

try{
$query_select = $conecta->prepare($sql_select);
$query_select->bindValue(':cidade','%'.$cidade.'%',PDO::PARAM_STR);
$query_select->bindValue(':bairro','%'.$bairro.'%',PDO::PARAM_STR);
$query_select->bindValue(':tipo','%'.$tipo.'%',PDO::PARAM_STR);
$query_select->bindValue(':negocio','%'.$negocio.'%',PDO::PARAM_STR);
$query_select->bindValue(':valorMinimo',$valorMinimo,PDO::PARAM_INT);
$query_select->bindValue(':valorMaximo',$valorMaximo,PDO::PARAM_INT);
$query_select->execute();
$resultado_query = $query_select->fetchAll(PDO::FETCH_ASSOC);

}catch (PDOexception $error_select){
echo 'Erro ao selecionar '.$error_select->getMessage();
}
foreach($resultado_query as $res){                                      // Linha 315 //
	$imovelID = $res['imovelID'];
	$imovelFoto = $res['imovelFoto'];
	$imovelNome = $res['imovelNome'];
	$imovelCidade = $res['imovelCidade'];
	$imovelNegociacao = $res['imovelNegociacao'];
	$imovelDormitorios = $res['imovelDormitorios'];
	$imovelArea = $res['imovelArea'];

 

Achei o erro,

 

$sql_select = 'SELECT * FROM imoveis WHERE
(imovelCidade LIKE :cidade) AND 
(imovelBairro LIKE :bairro) AND 
(imovelTipo LIKE :tipo) AND 
(imovelNegociacao LIKE :negocio) AND
(imovelValor >= valorMinimo AND imovelValor <= valorMaximo)';

 

Faltou os : em :valorMinimo e :valorMaximo, porem não resolveu, ainda está listando 1 milhão em 0 até 200 mil :/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Este erro diz que $resultado_query não é um array.

E ele não é um array porque sua query não trouxe resultados.

Ela não trouxe resultados porque está sendo montada da forma incorreta.

 

No exemplo que te dei eu monto a condição WHERE dentro do switch.

Não faço uma simples atribuição de valores. Desta forma pode dar erro

quando 901 é selecionado pois ele vai fazer imovelValor <= '' uma vez

que você não definiu o valor máximo.

 

Monte o where dentro do switch para integrar a query, basta ver meu exemplo ^_^

 

Quanto a query, debug ela, print ela na tela e veja como esta sendo montada para

ver onde está o erro.

 

Se nada estiver errado com a query, ou o teu where ta errado ou os valores na base

estão errados.

 

Teste e nos diga oque conseguiu.

 

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não está retornando nada, nenhum resultado.. (fiz conforme você pediu) (DUREZA!!!)

switch($_POST['valor']){
   case 200:
   $whereValor = 'imovelValor <= 200';
   break;
   case 400:
   $whereValor = 'imovelValor >= 200 AND imovelValor <= 400';
   break;
   case 600:
   $whereValor = 'imovelValor >= 400 AND imovelValor <= 600';
   break;
   case 750:
   $whereValor = 'imovelValor >= 600 AND imovelValor <= 750';
   break;
   case 900:
   $whereValor = 'imovelValor >= 750 AND imovelValor <= 900';
   break;
   case 901:
   $whereValor = 'imovelValor >= 900';
   break;
}

$sql_select = 'SELECT * FROM websul_imoveis WHERE
imovelCidade LIKE :cidade AND 
imovelBairro LIKE :bairro AND 
imovelTipo LIKE :tipo AND 
imovelNegociacao LIKE :negocio AND :whereValor';

try{
$query_select = $conecta->prepare($sql_select);
$query_select->bindValue(':cidade','%'.$cidade.'%');
$query_select->bindValue(':bairro','%'.$bairro.'%');
$query_select->bindValue(':tipo','%'.$tipo.'%');
$query_select->bindValue(':negocio','%'.$negocio.'%');
$query_select->bindValue(':whereValor',$whereValor);
$query_select->execute();
$resultado_query = $query_select->fetchAll(PDO::FETCH_ASSOC);

}catch (PDOexception $error_select){
echo 'Erro ao selecionar '.$error_select->getMessage();
}
foreach($resultado_query as $res){
	$imovelID = $res['imovelID'];
	$imovelFoto = $res['imovelFoto'];
	$imovelNome = $res['imovelNome'];
	$imovelCidade = $res['imovelCidade'];
	$imovelNegociacao = $res['imovelNegociacao'];
	$imovelDormitorios = $res['imovelDormitorios'];
	$imovelArea = $res['imovelArea'];

 

Os valores acredito que estejam cadastrados corretamente, porque pelo que entendi, funciona as casas antes do .

 

1200.000,00 (um milhão e duzentos mil)

130.000,00 (cento e trinta mil)

600.000,00 (seiscentos mil)

420.000,00 (quatrocentos e vinte mil)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você ja fez um teste simples na base de dados

e trouxe algum resultado?

 

Suspeito que o erro esteja nos valores do teu where

 

Tente fazer uma query simples na base de dados e descobrir

qual o valor correto deve ser informado para que funcione.

 

Ex:

 

SELECT * FROM websul_imoveis WHERE imovelValor >= 400 AND imovelValor <= 600

Se funcionar, outras condições no seu WHERE podem estar atrapalhando. Ai seria bom você

printar a query final (depois de completamente montada) verificar se esta tudo certo e testar

na base para ver onde está o erro.

 

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal, resolvido \o/ , retirei as aspas (depois que dei uma conferida nos exemplos do php.net que estavam sem) de $valorMinimo = '0'; $valorMaximo = '200'; ficando $valorMinimo = 0; $valorMaximo = 200; funcionou

obrigado Periscuelo e a todos os amigos do fórum que utilizarem um pouco de seu tempo me ajudando :)

 

Abraço.

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.