Pergunta

Tenho recentemente começou a usar Zend Studio, que relatou como aviso o seguinte tipo de código:

$q = query("select * from some_table where some_condition");
while ($f = fetch($q)) {
  // some inner workings
}

Para parar o aviso às necessidades de código a ser escrito assim:

$q = query("select * from some_table where some_condition");
$f = fetch($q);
while ($f) {
  // some inner workings
  $f = fetch($q);
}

Por que isso está marcado como um aviso? É tão ruim assim?

Eu entendo que o aviso pode ser projetado para erros de parada assim:

$a = 1;
while ($a = 1) {
  // some inner workings
  $a++;
}

que nunca vai terminar porque 1 está sendo atribuído a $ a qual, por sua vez retorna 1 para o while, em vez de ser testado contra $ a e retornar false ao while quando $ a não é 1.

erro fácil de fazer o que pode validar um aviso, concedido, mas assim é esquecer de adicionar o extra de R $ f = fetch ($ q) no final da enquanto bloco no segundo exemplo que também irá resultar em um loop que nunca terminará. Se eu alterar meu código para remover o aviso e depois se esqueça de adicionar o $ f = fetch ($ q) no final da enquanto bloco Zend não vai aviso é sobre isso!

Assim, removendo o aviso relativo a um erro comum que eu estou me preparando para um erro comum diferente.

Fora da panela, para o fogo.

Foi útil?

Solução

while (($row = $sql->db_Fetch("MYSQL_ASSOC")) != false)

Outras dicas

Então você não vai ter que reescrever todo o código sem uma razão decente: Você pode desativar a detecção desse potencial erro de programação no Janela | Preferências, PHP | Análise semântica .

Este é provavelmente marcado como um aviso porque as pessoas costumam usar "=" por engano quando querem dizer "==".

por exemplo:

$a = 1
while($a = 1) {
   $a++;
}

Isso nunca vai terminar, mas se você pensou que tinha escrito "==", que deveria.

Zend Studio está tentando ajudá-lo a escrever um código melhor que debugs mais fácil. Desativando a verificação semântica não é uma boa idéia, ele simplesmente varre potenciais problemas para debaixo do tapete e você vai estar perdendo os problemas reais. Essa é uma razão decente! Não evitar mensagens de aviso por ignorá-las, modificar seu código, implementando a solução correta.

Como você bem sabe Zend Studio é construído em eclipse, que é um Java IDE. Na linguagem Java que é ilegal fazer algo parecido com isto:

String s;
while (s = getName()) {
    ...
}

Isso porque mesmo que retorna 'getName' um valor nulo será atribuído a 's' e lançando entre objetos e booleans (que é do tipo exigido pelas instruções de condição) é um pouco mais subjetivo como com PHP, portanto, irá lançar uma exceção em tempo de compilação.

A situação em PHP pode ser diferente, mas por alguma razão os desenvolvedores Zend decidiu deixar este aviso ativo por padrão, você pode desativá-lo como mencionado antes, mas eu considero que irá ajudá-lo quando uma verdadeira missão na condição acontece.

Limpar o aviso é bastante fácil por apenas atribuir os resultados e, em seguida, comparando-a assim:

if (($result = $mysqli->query ( $query )) == true) {

Em vez de:

if ($result = $mysqli->query ( $query )) {

Como você pode ver você não precisa de cachos de código adicionais.

De qualquer forma, é apenas um aviso, você não precisa se preocupar com eles muito.

Na verdade, eu acho que sua pergunta já foi respondida, um pouco. Mas para resolver o seu problema real, eu acho que isso pode ajudar.

//i dont know what is returned if there are no more records to fetch...
//but lets assume it is a boolean value
while (($f = fetch($q))!= false)
{
    $this->doSomethingVeryImportantThatMakesYourBossHappy($f);
}

Isso deve fazer o truque eo "Assignment na condição de" -mensagem deve desaparecer.

Como nota: usar o operador igual da mesma maneira como quando você coisas negate. Você também pode usar o sinal de igual com outros operadores como

if ($falseness != false){$trueness = true}

e não

if ($falseness ! false){$trueness = false}

Isso me ajuda a lembrar sempre como comparar valores e não valores atribuir a eles.

A razão que é ruim é um monte de pessoas usam "=" quando o então significava "=="

O operador = retornará o assigment para a esquerda, por isso, se você usa if($x=true) o código dentro do if será executado, se você usar if($x=false) o código não será executado. É um truque que pode salvar uma ou duas linhas de código, mas também é perigoso, porque se você quis dizer if($x == false) e digitou if($x = false) será um erro que pode ser difícil de rastrear.

Nay meus amigos todas atribuições na condição de gerar este aviso. Eu não quero transformar este fora completamente, como = em vez de == é um erro de sintaxe eu sou propenso a. Quanto à questão de por que é necessário, vou usar um exemplo do Manual do PHP. Esta é a partir da seção sobre o "MySQL melhorado" extensões ou mysqli:

$query = "SELECT Name, CountryCode FROM City ORDER by ID DESC LIMIT 50,5";

if ($result = $mysqli->query($query)) {

    /* fetch associative array */
    while ($row = $result->fetch_assoc()) {
        printf ("%s (%s)\n", $row["Name"], $row["CountryCode"]);
    }

Infelizmente, eu desenvolvi minhas funções de banco de dados usando esta técnica e estou tentando usá-los em Zend Studio. Este erro é aparecendo vezes o suficiente para ser uma dor real. Vou reformular com as sugestões aqui, como eu valorizo ??código inequívoca, porém eu também estou indo para pop para o manual PHP e sugerir que mudar o exemplo para usar o melhor estilo. Talvez alguns de vocês poderiam fazer o mesmo e nós poderíamos melhorar a documentação?!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top