なぜ、&&の代わりに「と」をこのループのリターン1を使用しない場合には?
質問
これは... while($row = mysql_fetch_assoc($result) and $runningOK)
ループでは、PHPの&&
演算子はand
の代わりに使用されているならば、mysql_fetch_assoc
がひどく失敗し、実行しているときにだけ番号1
を返す私に謎。
私はmysql_fetch_array()
と場所で試したし、私はまだ1
の問題を抱えています。それはときである、とする場合にのみ、私は正しい行が返されていることを、現在の&&
文のようand
でwhile
を置き換えます。
私は、デバッグ文を置いていました。私はこれは私がを説明することができなかったPHPの気まぐれか何かであるかどうかを知りたいと思います。
// 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;
}
}
解決
これは、演算子の優先順位によるものです。ここに関連する部分だ...詳細はマニュアルのrel="noreferrer">
//「&&」よりも大きい優先順位を持ちます
"および" //(真&&偽)式の結果は、$ G $ G =真&&偽; // $ hに割り当てられ、真の定数、その後、偽は無視され の$ H =; のvar_dump($ gでは、$ H); BOOL(偽) だから、&&と、式の結果は1.に評価され、trueに割り当てられていると、それがMySQLの関数の結果と評価された - より多くのあなたが欲しいものを、私は数える ところで、あなたはまた$ runningOK変数の必要性を排除するために
に割り当てられています
//のような行為:()$ G =(真&&偽)
(($ H =真)とfalse)
ブール値(真)break
を使用することができます。そのためには、and $runningOK
すると、catchブロックがトリガされた場合、それがループを終了しますwhile
条件と変更$runningOK = FALSE;
からbreak;
を削除します。
他のヒント
これを試してください:
while(($row = mysql_fetch_assoc($result)) and $runningOK)
それが、この場合にはmysql_fetch_assoc($result) and $runningOK
と同じである、$row
に割り当てるTRUEに評価1
、あるとして、ミックスアップがあるかもしれません。
あなたは括弧を追加する場合は、適切に評価を2分割しているだろうとして、、あなたが最も可能性が高い、&&
またはand
のいずれかを使用できます。
これは、私は確信している別の構文の副作用です。
代入演算子=
と二つの論理演算子&&
とAND
はを有します異なる優先する:&&
が=
前に実行され、順番にAND
前に実行されます。
そこで、基本的声明ます:
$row = mysql_fetch_assoc($result) AND $runningOK
に等しい
($row = mysql_fetch_assoc($result)) AND $runningOK
while文ます:
$row = mysql_fetch_assoc($result) && $runningOK
に等しい
$row = (mysql_fetch_assoc($result) && $runningOK)
最後のケースでは、単に値1(mysql_fetch_assocが値を返す場合)または0を代入している。
それはです。
理解するために、このページをチェックしてください:
http://php.net/manual/en/language.operators .precedence.phpする
あなたはそれが解決されますか分からないときに必要なだけの使用()。