Ir para conteúdo

POWERED BY:

Arquivado

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

Menegat

[Resolvido] Busca com filtro PHP

Recommended Posts

Ola pessoal......

so novo em php...e o meu primeiro projeto foi o site de uma imobiliaria....

q mão neh....

mas tudo beim com uma ajuda aqui outra ali consegui fazer o sistema.....

mas dai ela quis acrescentar mais campos..e meu sitema de busca por filtro jah estava enorme e todo confuso.....aew resolvi fazer outro...o codigo é esse..

 

$x = "SELECT produtos.Id, produtos.Categoria, produtos.produtos.situ, produtos.produtos_dorm, produtos.produtos_box, produtos.produtos_faixa, produtos.produtos_bairro FROM produtos WHERE produtos.Id != '0' ";
				
			if ($_GET['campo_tipo'] != "01"){
				 $x .= " AND produtos.Categoria ='" . $_GET['tipo'] . "'";
			}
			if ($_GET['campo_situ'] !="01"){
				$x .= " AND produtos.produtos_situ ='" . $_GET['tipo'] . "'";
			}
			if ($_GET['campo_dorm'] != "01"){
				$x .= " AND produtos.produtos_dorm=" . $_GET['campo_dorm'];
			}
			if ($_GET['campo_box'] !="01"){
				$x .= " AND produtos.produtos_box='" . $_GET['campo_box'] . "'";
			}
			if ($_GET['campo_faixa'] != "01"){
				$x .= " AND produtos.produtos_faixa='" . $_GET['campo_faixa'] . "'";
			} 
			if ($_GET['campo_bairro'] != "01"){
				$x .= " AND produtos.produtos_bairro='" . $_GET['campo_bairro'] . "'";
			}
			
			$x .= " ORDER BY Id DESC 
				LIMIT 5";

			$sql5 = mysql_query($x);

dae aparece o seguinte erro na tela: Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in C:\servidor\dallas\busca.php on line 224

 

a parte do codigo q apresenta erro é essa:

 <?php 
                     while($row5 = mysql_fetch_array($sql5)){ 
                       $link = $row5["Id"]; //linha 224 
                       echo '<img src="ff.gif" width="4" height="7"><span class="style5">_</span>' . '<span class="fonte_data">' . '<a href="produtos_detalhe.php?id='.$link.'">' . '<span class="fonte_data">' . $row5["produtos_nome"] . '</a>' .'<br><br>'; 
                       $foto++; 
                       } 
?>

alguem sabe oq pode ser..??

 

agradeço a ajuda desde jah....

Compartilhar este post


Link para o post
Compartilhar em outros sites

Que isso amigo???

 

Pra que tanto if e mais if e mais if??

 

Uma coisa tão simples que pode ser usada são estruturas ternárias:

 

$tipo = $_GET["tipo");

$complete = "";

$complete .= (isset($tipo)) ? " AND produtos.Categoria ='$tipo'";
" : "";

Ae tu continua e depois de fazer todas as verificações, acrescenta a $complete na tua query:

 

$sql = "SELECT * FROM tabela WHERE campo='$id' $complete";

Falo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Este erro ocorre quando os dados passados para o mysql_fetch_array estão incorretos... O problema é anterior. Vamos lá...

 

$sql5 = mysql_query($x) or die('A query ficou assim - '.$x.'<br/>'.mysql_error());// vai exibir o erro do mysql e a query

 

Analise o que for impresso e corrija os possíveis erro...

 

Agora vamos ao restante do seu código.

Indico que troque mysql_fetch_array por mysql_fetch_assoc http://br.php.net/mysql_fetch_assoc.

É mais rápido, porque o fetch_array gera um índice numérico e um associativo, enquanto que o fetch_assoc gera só o associativo (que é o que você usa).

 

Estude sobre Sql Injection. Não jogue o valor direto do GET para a consulta. Leia este tópico que vai te dar uma boa idéia do que estou falando.

http://forum.imasters.com.br/index.php?/topic/276729-seguranca-em-php/

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Que isso amigo???

 

Pra que tanto if e mais if e mais if??

 

Uma coisa tão simples que pode ser usada são estruturas ternárias:

 

$tipo = $_GET["tipo");

$complete = "";

$complete .= (isset($tipo)) ? " AND produtos.Categoria ='$tipo'";
" : "";

Ae tu continua e depois de fazer todas as verificações, acrescenta a $complete na tua query:

 

$sql = "SELECT * FROM tabela WHERE campo='$id' $complete";

Falo

 

Red Fenix....não entendi direito a forma como você colocou que eu deveria fazer as consultas.....

como disse sou novo em php...e mta coisa ainda n entendo....como você mxm disse... pra que tanto if....se você visse o meu outro codigo de filtro.. xD....

 

 

mas n entendi de que forma eu posso filtrar os dados apartir do seu codigo... =/// (noob) xD

 

e carlos....darei uma olhada no topico q me passou.....Vou mudar a passagem de parametro para post...

 

brigadão ae gentee

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ae lek, muito simples.

 

Primeiro você define as variáveis com cada dado, isso é, se preferir. Assim:

 

$tipo = $_GET["tipo"];
$dorm = $_GET["campo_dorm"];

// Continua....

 

Agora você utiliza estruturas ternárias para verificar o conteúdo de cada variável.

 

Estruturas ternárias são estruturas de controle reduzidas, bem simples de entender:

 

$var = (condicao) ? VALOR_VERDADEIRO : VALOR_FALSO;

 

Monta assim:

 

$complete = "";

$complete .= (isset($tipo) && $tipo != "01") " AND produtos.Categoria ='$tipo'" : "";
$complete .= (isset($dorm) && $dorm != "01") " AND produtos.produtos_dorm='$dorm'" : ""; 

// Continua aqui...

 

Feito isso, você insere a variável $complete na sua query sql:

 

$sql = "SELECT * FROM tabela WHERE id='$id'$complete";

 

Ae supondo que o $tipo = "02", sua query ficaria assim:

 

$sql = "SELECT * FROM tabela WHERE id='$id' AND produtos.Categoria ='02'";

 

Entendeu?

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Red Fenix.....

 

agora entendi sim.... vou fazer as alterações..... e logo no inicio da tarde posto os resultados, pois tenho q sair agora.....xD.....

 

por hora agradeço a ajuda......

 

 

te mais...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou mudar a passagem de parametro para post...

Não é necessário mudar para post. Pode deixar como GET mesmo. Só que faça alguma validação antes. Se os códigos que vierem forem sempre números, use is_int. Um exemplo.

$campo_tipo = (is_int($_GET['campo_tipo']) && !empty($_GET['campo_tipo'])) ? $_GET['campo_tipo'] : '';

 

Aqui vai validar se é um inteiro e se não está vazia. Caso não seja sempre valor inteiro (venha string), veja o que está naquele post.

 

Não vejo necessidade de testar com if ternário. Pode ser if simples mesmo, já que não vai ter else.

 

if(!empty($campo_tipo) && $campo_tipo != "01") $complete.= " AND produtos.Categoria ='$campo_tipo'";

 

Outra coisa. O if ternário do Red Fenix tem um defeito de sintaxe, caso queira usar. Falta um ?.

$complete .= (isset($tipo) && $tipo != "01") " AND produtos.Categoria ='$tipo'" : "";// errado
$complete .= (isset($tipo) && $tipo != "01") ? " AND produtos.Categoria ='$tipo'" : "";// correto

 

Mais ou menos isto. O meu primeiro projeto também foi de uma imobiliária.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa matias, valeu cara!

 

Nem percebi o meu erro de digitação. Foi na pressa, tava indo malhar.

 

Mas eu acho que com if ternário fica melhor porque fica menor o código e até mais limpo.

 

Mas ele que sabe.

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Primeiro você define as variáveis com cada dado, isso é, se preferir. Assim:

 

$tipo = $_GET["tipo"];
$dorm = $_GET["campo_dorm"];

// Continua....

 

$complete .= (isset($tipo) && $tipo != "01") " AND produtos.Categoria ='$tipo'" : "";

 

Só para esclarecer, quando você definiu (set) logo acima a variável $tipo, o isset passou a ser inútil.

Se você quer verificar se o usuário realmente enviou a informação você deve utilizar o isset na hora de resgatar o offset do GET/POST:

 

$tipo = $_GET["tipo"]; //aqui poderá gerar um warning se o usuário não enviar a informação "tipo"

$t = isset( $tipo ); //lógico, sempre será verdadeiro, você acabou de definir $tipo ai em cima.

Agora, a forma correta seria:

 

$tipo = isset( $_GET[ "tipo" ] ) ? $_GET[ "tipo" ] : null;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Red Fenix seguinte...usei o seu codigo..fatava um '?' mas consertei...

 

logo fiz o teste em uma pesquisa.....

 

e então.....

 

ele da esse erro: Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in C:\servidor\dallas\busca.php on line 240

 

bom tentei ver oq era e nada de eu descobrir....

 

então resolvi mostra oq tem na variavel $sql...]e so aparece isso:

 

Resource id #5

 

o codigo ficou assim:

$id = "select Id from produtos";
		$complete = " ";
		$complete .= (isset($tipo) && $tipo != "01") ? " AND produtos.Categoria ='$tipo'" : "";
		$complete .= (isset($dorm) && $dorm != "01") ? " AND produtos.produtos_dorm='$dorm'" : " ";
		$complete .= (isset($box) && $box != "01") ? " AND produtos.produtos_box ='$box'" : " ";
		$complete .= (isset($dorm) && $situ != "01") ? " AND produtos.produtos_situ='$situ'" : " ";
		$complete .= (isset($tipo) && $faixa != "01") ? " AND produtos.produtos_faixa ='$faixa'" : " ";
		$complete .= (isset($bairro) && $bairro != "01") ? " AND produtos.produtos_bairro='$bairro'" : " ";
		
		$sql = mysql_query("SELECT * FROM produtos WHERE id='$id'$complete");
		 echo $sql;

=[[

Compartilhar este post


Link para o post
Compartilhar em outros sites

Releia o post #3. Faça como está escrito lá. Coloque o select em uma variável e jogue dentro do mysql_query. Veja.

$complete = "SELECT produtos.Id, produtos.Categoria, produtos.produtos.situ, produtos.produtos_dorm, produtos.produtos_box, produtos.produtos_faixa, produtos.produtos_bairro FROM produtos WHERE produtos.Id != '0' ";
$complete .= (isset($tipo) && $tipo != "01") ? " AND produtos.Categoria ='$tipo'" : "";
$complete .= (isset($dorm) && $dorm != "01") ? " AND produtos.produtos_dorm='$dorm'" : " ";
$complete .= (isset($box) && $box != "01") ? " AND produtos.produtos_box ='$box'" : " ";
$complete .= (isset($dorm) && $situ != "01") ? " AND produtos.produtos_situ='$situ'" : " ";
$complete .= (isset($tipo) && $faixa != "01") ? " AND produtos.produtos_faixa ='$faixa'" : " ";
$complete .= (isset($bairro) && $bairro != "01") ? " AND produtos.produtos_bairro='$bairro'" : " ";

$sql = mysql_query($complete) or die('Erro na consulta - '.$complete.'<br/>'.mysql_error());

 

Se existir algum erro, vai imprimir ele na tela.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Releia o post #3. Faça como está escrito lá. Coloque o select em uma variável e jogue dentro do mysql_query. Veja.

$complete = "SELECT produtos.Id, produtos.Categoria, produtos.produtos.situ, produtos.produtos_dorm, produtos.produtos_box, produtos.produtos_faixa, produtos.produtos_bairro FROM produtos WHERE produtos.Id != '0' ";
$complete .= (isset($tipo) && $tipo != "01") ? " AND produtos.Categoria ='$tipo'" : "";
$complete .= (isset($dorm) && $dorm != "01") ? " AND produtos.produtos_dorm='$dorm'" : " ";
$complete .= (isset($box) && $box != "01") ? " AND produtos.produtos_box ='$box'" : " ";
$complete .= (isset($dorm) && $situ != "01") ? " AND produtos.produtos_situ='$situ'" : " ";
$complete .= (isset($tipo) && $faixa != "01") ? " AND produtos.produtos_faixa ='$faixa'" : " ";
$complete .= (isset($bairro) && $bairro != "01") ? " AND produtos.produtos_bairro='$bairro'" : " ";

$sql = mysql_query($complete) or die('Erro na consulta - '.$complete.'<br/>'.mysql_error());

 

Se existir algum erro, vai imprimir ele na tela.

 

Carlos Eduardo

 

Ola carlos...

 

Não pude fazer como no post #3 pois eu não conseguia vizualizaer o tag do code...

 

refiz como voce postou ai...ele n apresenta erros..... ai coloquei um echo na variavel $sql e e ele retorna apenas isso: Resource id #5

 

agradeço as ajudas

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não pude fazer como no post #3 pois eu não conseguia vizualizaer o tag do code...

Como assim? Não dá pra ver? Qual navegador está usando?

 

Sobre o problema do tópico, se não apresenta erros é para funcionar. Como está seu código no momento? O que ocorreu? você diz que não apareceu nenhuma mensagem de erro, mas como se comportou? O que era para exibir e o que exibiu?

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Carlos eu uso IE 7...

 

bom meu codigo esta atualmente assim:

//recebimeno dos valores que o usuario informou na busca
$campo = $_GET["campo_Tipo"];
	$dormitorios = $_GET["campo_Dorm"];
	$bairro = $_GET["campo_Bairro"];
	$faixa = $_GET["campo_Faixa"];
	$box = $_GET["campo_box"];
	$situ = $_GET["campo_situ"];
	$pagina = 1;
				
	if($campo == "01"){
		$msg = "Campo Imovel Invalido!";
	}//fecha primeiro if
	else{

		
		$complete = "SELECT produtos.Id, produtos.Categoria, produtos.produtos_situ, produtos.produtos_dorm, produtos.produtos_box, produtos.produtos_faixa, produtos.produtos_bairro FROM produtos WHERE produtos.Id != '0' ";
		$complete .= (isset($tipo) && $tipo != "01") ? "AND produtos.Categoria ='$tipo'" : "";
		$complete .= (isset($dorm) && $dorm != "01") ? " AND produtos.produtos_dorm='$dorm'" : "";
		$complete .= (isset($box) && $box != "01") ? " AND produtos.produtos_box ='$box'" : "";
		$complete .= (isset($situ) && $situ != "01") ? " AND produtos.produtos_situ='$situ'" : "";
		$complete .= (isset($tipo) && $faixa != "01") ? " AND produtos.produtos_faixa ='$faixa'" : "";
		$complete .= (isset($bairro) && $bairro != "01") ? " AND produtos.produtos_bairro='$bairro'" : "";                
		
		$sql = mysql_query($complete) or die('Erro na consulta - '.$complete.'<br/>'.mysql_error());
		echo $sql;
		
			$sql5 = mysql_query($sql);		 
				 
				$num = mysql_num_rows($sql5);
					if($num == "0"){
						$msg =  "Nenhum imóvel cadastrado com estas informações.";
					}
					
				
		
		}//fecha primero else
	
	//Mostra o resultado da busca na tela

                  	  <?php while($row5 = @mysql_fetch_assoc($sql5)){ ?>
                      <?php $link = $row5["Id"]; ?>
                      <?php echo '<img src="ff.gif" width="4" height="7"><span class="style5">_</span>' . '<span class="fonte_data">' . '<a href="produtos_detalhe.php?id='.$link.'">' . '<span class="fonte_data">' . $row5["produtos_nome"] . '</a>' .'<br><br>'; ?>
                      <?php $foto++; ?>
                      <?php } ?>

Bom o codigo deveria mostras os imoveis filtrados de acordo com os dados que o ussuario definiu

mas na tela ele não mostra nada, nem a mensagem de não haver os produtos nem mensagem de erros das querys.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vamos debugar o código... Ative todas as mensagens de erro...

error_reporting(E_ALL);

 

Coloque isto no início do código para imprimir o que vem do GET.

echo '<pre>';
print_r($_GET);

 

Vai exibir um monte de erros. Achei vários... Tente entender o que está escrito em cada um deles e tente corrigir. São todos simples e provavelmente serão todos iguais.

 

Confira os nomes de variáveis que vem do GET e o nome das variáveis que você está usando... Vou dar um exemplo...

$dormitorios = $_GET["campo_Dorm"];// confira se vem como campo_Dorm mesmo... é diferente de CAMPO_DORM.
$complete .= (isset($dorm) && $dorm != "01") ? " AND produtos.produtos_dorm='$dorm'" : "";/ aqui você usa $dorm e ali em cima você setou $dormitorios

 

Qualquer coisa posta novamente.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Carlos assim.....nem tinha notado a variavel $dormitoris e dpois $dorm..

 

fiz os ajustes nas variaveis..era so essa q estava diferete...

 

ele apresentas isso no $_GET:

Array

(

[campo_Tipo] => 15

[campo_situ] => 01

[campo_Dorm] => 01

[campo_box] => 01

[campo_Faixa] => 01

[campo_Bairro] => 01

[submit] => Procurar

)

 

e não aparece msg de erro....não referente ao codigo de filtro......

que são esses:

 

Notice: Undefined index: categorias_id in C:\servidor\dallas\busca.php on line 136

 

Notice: Undefined index: categorias_id in C:\servidor\dallas\busca.php on line 139

 

//pega o produto e coloca no display.
	$sql8 = mysql_query("select * from produtos where Categoria='".$_REQUEST["categorias_id"]."' ");
	
	//pega por get as informações para qual a categoria o cara clicou.
	$sql9 = mysql_query("select * from categorias where Id='".$_REQUEST["categorias_id"]."' order by Id desc");
	$row9 = mysql_fetch_array($sql9);

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tá, mas e não está funcionando? o que está ocorrendo?

 

Carlos Eduardo

 

Carlos, sim esta funcionando...

 

antes ele não mostrava os produtos encontrados, pq coloquei para ele aparecer o nome do produtos, e na seleção da query eu não selecionava o nome.....

 

mas agora esta funcionando tudo certinho como deveria...

 

agradeço a todos q ajudaram e me mostraram mais algumas peculiaridades de PHP q eu não conhecia....

 

um abraço a todos...

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.