Pourquoi est-ce retour de la boucle 1 lors de l'utilisation && au lieu de « et »?
Question
moi Riddle cette ... dans la boucle de while($row = mysql_fetch_assoc($result) and $runningOK)
, si l'opérateur &&
PHP est utilisé à la place du and
alors mysql_fetch_assoc
échoue terriblement et retourne juste le nombre 1
lors de l'exécution.
Je l'ai essayé et mysql_fetch_array()
en place et j'ai encore le problème de 1
. Il est quand, et seulement quand, je remplace le &&
avec un and
comme la déclaration de while
actuelle que les lignes correctes sont retournées.
Je l'avais placé des instructions de débogage avant, à l'intérieur, et après pour assurer cela. Je voudrais savoir si cela est une bizarrerie PHP ou quelque chose que je ne pouvais pas expliquer.
// 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;
}
}
La solution
Il est fait de la priorité de l'opérateur. Voir manuel pour plus de détails ... voici la partie pertinente.
// "&&" a une plus grande priorité que "Et"
// Le résultat de l'expression (true && false) est affecté à $ g
// Actes comme: ($ g = (true && false))$ g = true && false;
// La constante vraie est assignée à $ h et faux est ignoré
// Actes comme: (($ h = true) et false)$ h = true et false;
var_dump ($ g, $ h);
bool (false)
bool (true)
Alors, avec le &&, le résultat de l'expression est affectée à true, qui évalue à 1. Avec et, il évalue le résultat de la fonction mysql - plus ce que vous voulez, je pense
. Par ailleurs, vous pouvez également utiliser break
pour éliminer la nécessité de la variable $ runningOK. Pour ce faire, enlever and $runningOK
de la condition de while
et changer $runningOK = FALSE;
à break;
et mettra fin à la boucle si le bloc catch est déclenché.
Autres conseils
Essayez ceci:
while(($row = mysql_fetch_assoc($result)) and $runningOK)
Il pourrait y avoir eu confusion, car il évalue mysql_fetch_assoc($result) and $runningOK
à TRUE, qu'il attribue ensuite à $row
, qui dans ce cas est le même que 1
Si vous ajoutez la parenthèse, vous avez probablement peut utiliser &&
ou and
, que vous aurez bien séparé les deux évaluations.
Ceci est l'effet secondaire de syntaxes alternatives, je suis sûr.
L'opérateur d'affectation =
et les deux opérateurs logiques &&
et AND
autre priorité : &&
est exécutée avant =
, qui à son tour est exécutée avant AND
Donc, fondamentalement, la déclaration:
$row = mysql_fetch_assoc($result) AND $runningOK
est égal à:
($row = mysql_fetch_assoc($result)) AND $runningOK
alors que l'instruction:
$row = mysql_fetch_assoc($result) && $runningOK
est égal à:
$row = (mysql_fetch_assoc($result) && $runningOK)
Dans le dernier cas, vous êtes juste d'attribuer des valeurs 1 (si mysql_fetch_assoc retourne une valeur) ou 0.
Il est parce que l'opérateur résolution prescedence.
Consultez ce tableau pour comprendre:
http://php.net/manual/en/language.operators .precedence.php
Utilisation () autant que vous avez besoin quand vous ne savez pas comment il est résolu.