Pergunta

Riddle me isto ... no circuito while($row = mysql_fetch_assoc($result) and $runningOK), se o operador PHP && é usado no lugar do and então mysql_fetch_assoc falha terrivelmente e retorna apenas o número 1 durante a execução.

Eu tentei mysql_fetch_array() e no lugar e eu ainda tenho o problema 1. É quando, e somente quando, eu substituir o && com um and como a declaração while atual que as linhas corretas são devolvidos.

Eu tinha colocado instruções de depuração antes, dentro e depois para garantir isso. Gostaria de saber se isso é uma peculiaridade PHP ou algo que eu não poderia explicar.

// Query
$selectQuery = "SELECT * FROM jobs_cache LIMIT 20";
// Run the Selection Query.
$result = mysql_query($selectQuery)
    or die('Query Failed: '.mysql_error());

// Loop through results.
$runningOK = TRUE;
$resubmitList = array();

while($row = mysql_fetch_assoc($result) and $runningOK)
{
    // Resubmit The Job
    try
    {
        $client->addTaskBackground($row['function_name'],$row['job_data']);
        $resubmitList[] = (string)$row['job_cache_id'];
    }
    catch(Exception $e)
    {
        echo "Error adding task for job id: " . $row['job_cache_id'];
        $runningOK = FALSE;
    }
}
Foi útil?

Solução

É devido a precedência do operador. Consulte manual para detalhes ... aqui está a parte relevante.

// "&&" tem maior precedência que "E"

// O resultado da expressão (true && false) é atribuído a $ g
// age como: ($ g = (true && false))

$ g = true && false;

// A constante verdade é atribuído a $ h e, em seguida, falsa é ignorado
// age como: (($ h = true) e falso)

$ h = verdadeiro e falso;

var_dump ($ g, h $);

bool (false)
bool (true)

Assim, com a &&, o resultado da expressão é atribuído a verdade, que avalia a 1. Com e, avalia o resultado da função mysql -. Mais o que você quer, eu acho

A propósito, você também pode usar break para eliminar a necessidade para a variável $ runningOK. Para isso, retire and $runningOK da condição while e mudança $runningOK = FALSE; para break; e terminará o loop quando o bloco catch é acionado.

Outras dicas

Tente isto:

while(($row = mysql_fetch_assoc($result)) and $runningOK)

Pode haver uma mistura, como é avaliar mysql_fetch_assoc($result) and $runningOK como TRUE, que, em seguida, atribui à $row, que neste caso é o mesmo que 1

Se você adicionar o parêntese, você provavelmente pode usar && ou and, como você vai ter separado adequadamente as duas avaliações.

Este é o efeito colateral de sintaxes alternativas, tenho certeza.

O = operador de atribuição e os dois operadores lógicos && e AND Tem diferente precedência: && é executado antes =, que por sua vez é executado antes AND

Então, basicamente a declaração:

$row = mysql_fetch_assoc($result) AND $runningOK

é igual a:

($row = mysql_fetch_assoc($result)) AND $runningOK

enquanto a declaração:

$row = mysql_fetch_assoc($result) && $runningOK

é igual a:

$row = (mysql_fetch_assoc($result) && $runningOK)

Neste último caso, você está apenas a atribuição de valores 1 (se mysql_fetch_assoc retorna um valor) ou 0.

É porque o operador resolver prescedence.

Confira esta tabela para compreender:

http://php.net/manual/en/language.operators .precedence.php

Use (), tanto quanto você precisa quando você não sabe como ele é resolvido.

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