Por que esse retorno ciclo 1 ao usar && em vez de 'e'?
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;
}
}
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.