Ir para conteúdo

Arquivado

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

Ferrvasconcelos

Ajuda com código.

Recommended Posts

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
$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, @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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.