Ferrvasconcelos 0 Denunciar post Postado Dezembro 30, 2017 Pessoal boa noite, sou novata e estou atualizando um sistema que já tínhamos aqui não consegui entender muito bem a sintaxe da query abaixo, no caso eu precisava selecionar só registros com status ='0' sei que teria que colocar no sql where status='0' mas o código do antigo programador esta meio estranho, alguém pode me ajudar ? $sql_query = "Select * from locais"; if($estado_busca || $cidade_busca || $finalidade ){ $sql_query.= " WHERE status='0'"; if($estado_busca){ $sql_query .= " estado = ".$estado_busca." "; $firstWhere = true; } if($cidade_busca && $cidade_busca != "x"){ if($firstWhere){$firstWhere = " and ";}else{ $firstWhere = "";} $sql_query .= $firstWhere." cidade = ".$cidade_busca." "; $firstWhere = true; } if($finalidade_busca){ if($firstWhere){$firstWhere = " and ";}else{ $firstWhere = "";} $sql_query .= $firstWhere." (seo_keywords like '%".$finalidade_busca."%' OR (seo_desc like '%".$finalidade_busca."%')) "; unset($firstWhere); } } $sql_query.= "; "; $query_resultado= mysql_query($sql_query) or die(mysql_error()); Compartilhar este post Link para o post Compartilhar em outros sites
BrunoBit 82 Denunciar post Postado Dezembro 30, 2017 $sql_query = "Select * from locais"; if($estado_busca || $cidade_busca || $finalidade ){ $sql_query.= " WHERE status='0'"; [...code] ao entrar nesse trecho já possui a query "Select * from locais WHERE status=0"; que o antigo programador fez, ele concatenou $sql_query, se $estado_busca ou $cidade_busca ou $finalidade forem verdadeiros a query inicial fica da forma como você quer, que no caso é: "Select * from locais WHERE status=0" O "problema" é que à seguir ele faz +3 verificações usando if's pra complementar essa query, que são essas: if($estado_busca){ $sql_query .= " estado = ".$estado_busca." "; $firstWhere = true; } if($cidade_busca && $cidade_busca != "x"){ if($firstWhere){$firstWhere = " and ";}else{ $firstWhere = "";} $sql_query .= $firstWhere." cidade = ".$cidade_busca." "; $firstWhere = true; } if($finalidade_busca){ if($firstWhere){$firstWhere = " and ";}else{ $firstWhere = "";} $sql_query .= $firstWhere." (seo_keywords like '%".$finalidade_busca."%' OR (seo_desc like '%".$finalidade_busca."%')) "; unset($firstWhere); } Ou seja, a gente não faz ideia se essas verificações vão retornar verdadeiras, pq se retornar verdadeiro a query vai modificando, e não dá pra saber se o seu sistema depende dessas verificações, pq se depender e você remover elas, vai dar pau no código em outra parte dele. Dei uma comentada no código, talvez te ajude a interpretar melhor: if($estado_busca || $cidade_busca || $finalidade ){ $sql_query.= " WHERE status='0'"; /* * até aqui temos "select * from locais WHERE status='0'" */ if($estado_busca){ $sql_query .= " estado = ".$estado_busca." "; $firstWhere = true; /* * se aqui for verdadeiro, então temos: * "select * from locais WHERE status='0' estado = '$estado_busca' */ } if($cidade_busca && $cidade_busca != "x"){ if($firstWhere){ $firstWhere = " and "; }else{ $firstWhere = ""; } $sql_query .= $firstWhere." cidade = ".$cidade_busca." "; $firstWhere = true; /* * se $firstWhere for true: * "select * from locais WHERE status='0' estado = '$estado_busca' and * * se $firtWhere não for true: * "select * from locais WHERE status='0' estado = '$estado_busca' cidade = '$cidade_busca' * */ } if($finalidade_busca){ if($firstWhere){ $firstWhere = " and "; }else{ $firstWhere = ""; } $sql_query .= $firstWhere." (seo_keywords like '%".$finalidade_busca."%' OR (seo_desc like '%".$finalidade_busca."%')) "; unset($firstWhere); /* * se $firstWhere for true: * "select * from locais WHERE status='0' estado = '$estado_busca' and (seo_keywords like '% $finalidade_busca %' OR (seo_desc like '% $finalidade_busca %')) * * se $firstWhere não for true: * "select * from locais WHERE status='0' estado = '$estado_busca' cidade = '$cidade_busca' (seo_keywords like '% $finalidade_busca %' OR (seo_desc like '% $finalidade_busca %')) */ } } Comentei rápido aqui, talvez tenha um erro ou outro, mas já te dá um norte. Importante lembrar que se $firstWhere não for true, vai dar erro no SQL da forma como está formatado, pq o $firstWhere ele seta o AND ou vazio, se for vazio vai dar pau no SQL na hora de fazer a query pq não tem o AND. Compartilhar este post Link para o post Compartilhar em outros sites
Ferrvasconcelos 0 Denunciar post Postado Dezembro 30, 2017 Bruno Muito obrigado, vou ler com calma e testar e retorno aqui, obrigado mesmo. Compartilhar este post Link para o post Compartilhar em outros sites
EdCesar 124 Denunciar post Postado Dezembro 30, 2017 @Ferrvasconcelos, @BrunoBit, joia!@Ferrvasconcelos, considerando que entendi a questão, o código, a principio, já esta fazendo o que você precisa, que é selecionar apenas os registros com status 0 Então não sei exatamente o que você precisa mudar, mas para melhorar um pouco as coisas, o código abaixo fara a mesma coisa que o código que você postou, de uma forma muito mais simples! $sql_query = "Select * from locais WHERE status='0' "; if ($estado_busca) { $sql_query .= " and estado = '{$estado_busca}'"; } if ($cidade_busca && $cidade_busca != "x") { $sql_query .= " and cidade = '{$cidade_busca}'"; } if ($finalidade_busca) { $sql_query .= " and (seo_keywords like '%{$finalidade_busca}%' OR (seo_desc like '%{$finalidade_busca}%')"; } $query_resultado= mysql_query($sql_query) or die(mysql_error()); Acredito que assim as coisas devem ficar mais fáceis. Dica: Assim que possível, tente refatorar esse != "x", afinal, o que é x? É claro que daria para melhorar mais, deixando automatizado para não precisar criar novos ifs, mas nesse momento o principal é a simplicidade! Compartilhar este post Link para o post Compartilhar em outros sites
BrunoBit 82 Denunciar post Postado Dezembro 30, 2017 @EdCesar conhece algum material legal pra indicar falando sobre refatoração? Vídeo, site ou alguma matéria específica. Compartilhar este post Link para o post Compartilhar em outros sites
Ferrvasconcelos 0 Denunciar post Postado Janeiro 10, 2018 Agradeço a todos pessoal deu certinho e entendi o funcionamento graças a vocês. Compartilhar este post Link para o post Compartilhar em outros sites