Ir para conteúdo

POWERED BY:

Arquivado

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

marcelo2605

[Resolvido] SELECT para sistema de busca

Recommended Posts

Pessoal, estou usando o seguinte select para um sistema de busca:

 

SELECT * FROM imoveis WHERE tipo = '$tipo' OR bairro = '$bairro' OR quartos = '$quartos' OR vagas = '$vagas'

 

O problema é que, se houver uma casa e um apartamento no bairro 1 e o usuário selecionar no formulário casa e depois bairro1, vão aparecer a casa e o apartamento no resultado.

 

Ou seja, o Select não considera as duas seleções juntas, mas isoladamente.

 

Existe uma maneira de fazer isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites
Ou seja, o Select não considera as duas seleções juntas, mas isoladamente.

 

Para "junto" use AND

 

AP ou CASA

Bairro COPACABANA

Quartos 3

Vagas 2 ou+

 

SELECT * 
FROM imoveis 
WHERE tipo in ('ap','casa') 
     AND bairro = 'COPACABANA' 
     AND quartos = 3 
     AND vagas >= 2

 

Em geral a melhor solução é montar o SQL de forma dinâmica pois o cliente pode querer mais de um bairro etc e tal

Compartilhar este post


Link para o post
Compartilhar em outros sites

Diego, o resultado foi o mesmo.

Poste o teu SELECT. O OR não era pra ter falhado não. Os tipos são esses que eu postei? Lembre-se que o meu é um exemplo.

 

O IN postado pelo Motta também resolve.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Diego e Motta, segue o script da busca:

 

<?php
if(isset($_POST['acao']) && $_POST['acao'] == 'enviar'){
	$tipo = $_POST['tipo'];
	$bairro = $_POST['bairro'];
	$quartos = $_POST['quartos'];

	$seleciona_imovel = mysql_query("SELECT * FROM imoveis WHERE (tipo = '$tipo') OR (bairro = '$bairro') OR (quartos = '$quartos') OR (vagas = '$vagas')");
	if(mysql_num_rows($seleciona_imovel) == 0){
		echo 'sem resultados';	
	}else{
		while($linha_imovel = mysql_fetch_array($seleciona_imovel)){
			echo '<h1>'.$linha_imovel['titulo'].'</h1>';	
		}
	};
}
?>

 

Como poderia usar o IN para resolver o meu problema?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Diego e Motta, segue o script da busca:

 

<?php
if(isset($_POST['acao']) && $_POST['acao'] == 'enviar'){
	$tipo = $_POST['tipo'];
	$bairro = $_POST['bairro'];
	$quartos = $_POST['quartos'];

	$seleciona_imovel = mysql_query("SELECT * FROM imoveis WHERE (tipo = '$tipo') OR (bairro = '$bairro') OR (quartos = '$quartos') OR (vagas = '$vagas')");
	if(mysql_num_rows($seleciona_imovel) == 0){
		echo 'sem resultados';	
	}else{
		while($linha_imovel = mysql_fetch_array($seleciona_imovel)){
			echo '<h1>'.$linha_imovel['titulo'].'</h1>';	
		}
	};
}
?>

 

Como poderia usar o IN para resolver o meu problema?

Bom dia amigo,

 

Veja como eu postei o OR pra você:

 

... WHERE ((tipo = 'casa') OR (tipo = 'apartamento')) ...

Eu usei o OR apenas na condição dos tipos, como eu tinha entendido que você precisava. Você aplicou o OR em todos os lugares que tinha AND e ainda assim não adicionou o tipo apartamento que você desejava.

 

Para usar IN:

 

... WHERE tipo IN ('casa','apartamento') ...

Mais uma vez lembrando: É um exemplo acima, você precisa verificar se no teu banco realmente está escrito casa, ou apartamento, além de incluir todas as tuas outras condições (com AND e não OR).

 

Abraço, espero que resolva.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Diego, talvez esteja expressando mal o meu problema. Peço até desculpas pelo tempo que você tem dedicado às minhas dúvidas.

 

Acho que encontrei um caminho para o meu problema, mas não estou conseguindo dar sequência a ele.

 

A minha dificuldade inicial era que a pesquisa por imóveis usasse os valores passados pelo usuário de modo único. Daí a necessidade de usar o operador AND e não o operador OR como eu estava fazendo.

 

Então pensei no seguinte: uma série de elseif que considerasse todas as possibilidades de busca. Ficou assim:

 

if(isset($_POST['acao']) && $_POST['acao'] == 'enviar'){
	$tipo = $_POST['tipo'];
	$bairro = $_POST['bairro'];
	$quartos = $_POST['quartos'];

	if($tipo == 0){
	$seleciona_imovel = mysql_query("SELECT * FROM imoveis WHERE (bairro = '$bairro') AND (quartos = '$quartos')");	
	}
	elseif($quartos == 0){
	$seleciona_imovel = mysql_query("SELECT * FROM imoveis WHERE (tipo = '$tipo') AND (bairro = '$bairro')");	
	}
	elseif($bairro == 0){
	$seleciona_imovel = mysql_query("SELECT * FROM imoveis WHERE (tipo = '$tipo') AND (quartos = '$quartos')");	
	}
	elseif($tipo == 0 && $bairro == 0){
	$seleciona_imovel = mysql_query("SELECT * FROM imoveis WHERE quartos = '$quartos'");	
	}
	elseif($bairro == 0 && $quartos == 0){
	$seleciona_imovel = mysql_query("SELECT * FROM imoveis WHERE tipo = '$tipo'");	
	}
	elseif($tipo == 0 && $quartos == 0){
	$seleciona_imovel = mysql_query("SELECT * FROM imoveis WHERE bairro = '$bairro'");	
	}
	else{
	$seleciona_imovel = mysql_query("SELECT * FROM imoveis WHERE (tipo = '$tipo') AND (bairro = '$bairro') AND (quartos = '$quartos')");
	}


	if(mysql_num_rows($seleciona_imovel) == 0){
		echo 'sem resultados';	
	}else{
		while($linha_imovel = mysql_fetch_array($seleciona_imovel)){
			echo '
	<h1>'.$linha_imovel['titulo'].'</h1>
	';	
		}
	};
}

 

O problema é que o script funciona somente quando o elseif contém apenas uma variável. Nos casos de duas variáveis não.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde amigo,

 

Opa, não há necessidade de desculpas, estamos aqui para ajudar :thumbsup:

 

Quanto ao problema, uma série de ElseIf fica "imoral" por assim dizer. Pois é a mesma coisa que você estar programando de forma estruturada.

 

Você não pode fazer algo +- assim como abaixo?

 

$query = "SELECT * FROM imoveis ";

$where = "";

($user['permissions'] == 'admin' ? true : false);

if ($quartos != 0 ) $where = $where . ($where != "" ? " AND " : "") . " quartos = '$quartos' ";
if ($tipo    != "") $where = $where . ($where != "" ? " AND " : "") . " tipo    = '$tipo' ";

if ($where != "") $query = $query . " WHERE " . $where ;

echo $where;

Se cada condição for satisfeita, ele apenda na query com AND. Depois basta você executá-la ?(mysql_query).

 

Atente-se:

 

- Variáveis que contém 0 ou branco, lembre-se que são valores diferentes. Por exemplo eu assumi que $quartos é uma variável numérica, portanto a condição ficou != 0. Já tipo é string, ficando != "".

 

- Mude os operadores e inclua parenteses de condições onde for necessário. Por exemplo se você tiver mais que 1 tipo, poderá precisar de um bloco de código pra montar o IN.

 

Qualquer coisa etsamos aí, abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Diego, agora parece que deu certo cara. Muito obrigado.

 

Só quero acrescentar mais um campo: preço. Neste caso, preciso usar o switch.

 

Então ficou assim:

 

if(isset($_POST['acao']) && $_POST['acao'] == 'enviar'){
	$tipo = $_POST['tipo'];
	$bairro = $_POST['bairro'];
	$quartos = $_POST['quartos'];
	$preco = $_POST['preco'];

	switch($preco){

		case '';
		$valor = '= 0';
		break;

		case '1000';
		$valor = '<= 1000';
		break;

		case '1500';
		$valor = 'BETWEEN 1000 AND 1500';
		break;
	}

	$query = "SELECT * FROM imoveis ";

	$where = "";

	if ($quartos != 0 ) $where = $where . ($where != "" ? " AND " : "") . " quartos = '$quartos' ";

	if ($tipo    != "") $where = $where . ($where != "" ? " AND " : "") . " tipo    = '$tipo' ";

	if ($bairro    != "") $where = $where . ($where != "" ? " AND " : "") . " bairro    = '$bairro' ";

	if ($valor    != 0) $where = $where . ($where != "" ? " AND " : "") . " preco    '$valor' ";


	if ($where != "") $query = $query . " WHERE " . $where ;

	echo $where;
	$seleciona_imovel = mysql_query("SELECT * FROM imoveis WHERE $where");
	if(mysql_num_rows($seleciona_imovel) == 0){
		echo 'sem resultados';	
	}else{
		while($linha_imovel = mysql_fetch_array($seleciona_imovel)){
			echo '<h1>'.$linha_imovel['titulo'].'</h1>';	
		}
	};

}

 

Mas está dando erro:

 

Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in C:\wamp\www\websiteDDB\administracao\busca.php on line 183

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa noite amigo,

 

Ficaram duas coisas "erradas":

 

1 - O echo $where era apenas coisa do exemplo, pra ver como tinha ficado o mesmo. Tu pode retirar do teu código oficial.

 

2 - Você repetiu o SELECT e concatenou com a variável $where:

 

$seleciona_imovel = mysql_query("SELECT * FROM imoveis WHERE $where");

Imagine que NÃO haja $where, tua query ficaria assim:

 

SELECT * FROM imoveis WHERE ;

Ocasionando, desta maneira, um erro (o que pode estar acontecendo agora pra você).

 

A intenção das variáveis é preparar a query para você não ter que escrevê-la de novo, ou seja, você deve alimentar as variáveis como fez e executar assim:

 

$seleciona_imovel = mysql_query($query);

Caso o erro persista, debugue o código e verifique a query que está sendo gerada, pois este erro acontece quando uma query não-válida tenta ser executada.

 

A disposição, abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Diego, o erro está acontecendo somente quando seleciono o valor

 

Veja que na variável $valor, agrego também um ou mais operadores:

 

	switch($preco){

		case '';
		$valor = '= 0';
		break;

		case '1000';
		$valor = '<= 1000';
		break;

		case '1500';
		$valor = 'BETWEEN 1000 AND 1500';
		break;
	}

 

Por isso, acredito que o if que você me passou deve ser diferente dos outros, pois no caso do $valor, é necessário também importar os operadores. No caso das outras variáveis ($tipo, $bairro, $quartos) o operador era sempre =

 

if ($valor    != 0) $where = $where . ($where != "" ? " AND " : "") . " valor  '$valor' ";

 

Mas não sei como fazer isso.

 

Ah, já arrumei os erros que você apontou.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hum entendi.

 

Qual o tipo de campo de preco ?

 

Tentou executar a query separadamente direto no banco? Se sim, qual o erro que dá?

 

A sintaxe do case não seria case condicao : instrucao; break;? Pelo que vi você usou ponto e vírgula onde é dois pontos. Perdoe-me se eu estiver errado mas desconheço se dessa maneira funciona, porém não trabalho com PHP apenas estudei.

 

Verifique estas questões, e se o problema persistir poste a query aqui para vermos.

 

Abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Diego,

 

Para facilitar, coloquei o campo como INT na tabela.

 

O switch funcionou bem em outros testes.

 

Se eu manter somente os valores numéricos (por exemplo $valor = '1000'; ao invés de $valor = '<= 1000'; ), o script todo funciona bem.

 

Por isso, acho que esta linha que você me passou:

 

if ($valor    != 0) $where = $where . ($where != "" ? " AND " : "") . " valor  = '$valor' ";

 

Precisa ser alterada, pois a variável $valor já vem com o operador.

 

Tentei tirar o último "=", mas não deu certo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O campo não devia ser DECIMAL não ? (Não que isso influa na capacidade de busca)

 

O nome do campo é preco ou valor? Pois no código lá em cima tá como preco, agora como valor.

 

Poste a query que ele está tentando executar, se possível rode ela no banco e veja o erro que dá. Na dúvida poste o mesmo aqui também.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Diego, na versão definitiva será decimal 10,2. Coloquei INT só para testar.

 

O $preco é substituído por $valor dependendo da opção que o usuário escolher. Por isso, o uso do switch.

 

Como eu pego a query que está sendo rodada?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Posta teu código atual.

 

Debugou pra ver se ele entra no If do WHERE do preco ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Diego, parece que agora consegui. Olhe só

 

if ($preco    != "") $where = $where . ($where != "" ? " AND " : "") . " valor   $preco ";

 

O valor de $preco é uma string, então "". Também tirei os '' na variável $preco.

 

Valeu cara!

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.