2

これをなぞってください...while($row = mysql_fetch_assoc($result) and $runningOK)ループで、PHP&&演算子がの代わりに使用されているand場合、実行時mysql_fetch_assocにひどく失敗し、数値だけを返します1

私は試してみましたmysql_fetch_array()が、まだ1問題があります。正しい行が返されるのは、現在のステートメント&&のようなものに置き換えるときだけです。andwhile

これを確実にするために、前、中、後にデバッグステートメントを配置しました。これが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;
    }
}
4

4 に答える 4

9

これは、演算子の優先順位によるものです。詳細についてはマニュアルを参照してください...ここに関連する部分があります。

// "&&" は "and" よりも優先されます

// 式 (true && false) の結果が $g に割り当てられます
// 次のように動作します: ($g = (true && false))

$g = true && false;

// 定数 true が $h に割り当てられ、false は無視されます
// 次のように動作します: (($h = true) and false)

$h = true と false;

var_dump($g, $h);

bool(偽)
bool(真)

したがって、&& を使用すると、式の結果が true に割り当てられ、これは 1 に評価されます。and を使用すると、mysql 関数の結果に評価されます。

ちなみに、break$runningOK 変数を不要にするために を使用することもできます。これを行うには and $runningOKwhile条件から削除してに変更$runningOK = FALSE;break;、catch ブロックがトリガーされた場合にループを終了します。

于 2010-02-07T03:39:44.647 に答える
1

これを試して:

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

TRUEと評価されるため、取り違えが発生する可能性がありますmysql_fetch_assoc($result) and $runningOK。これは に割り当てられ$rowます。この場合は と同じです。1

括弧を追加すると、2 つの評価が適切に分離されるため、ほとんどの場合、&&または のいずれかを使用できます。and

これは、私が確信している代替構文の副作用です。

于 2010-02-07T03:33:23.070 に答える
1

代入演算子と 2 つの=論理演算子&&andの優先順位AND異なります。&&=AND

したがって、基本的には次のステートメントです。

$row = mysql_fetch_assoc($result) AND $runningOK

に等しい:

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

声明の間:

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

に等しい:

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

最後のケースでは、値 1 (mysql_fetch_assoc が値を返す場合) または 0 を割り当てるだけです。

于 2010-02-07T03:49:33.660 に答える
0

これは、演算子が優先順位を解決するためです。

次の表を見て理解してください。

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

解決方法がわからない場合は、必要なだけ () を使用してください。

于 2010-02-07T05:27:06.993 に答える