2

给我猜个谜……在while($row = mysql_fetch_assoc($result) and $runningOK)循环中,如果使用 PHP&&运算符代替andthen 会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;
    }
}
4

4 回答 4

9

这是由于运算符优先级。有关详细信息,请参阅手册……这是相关部分。

// "&&" 的优先级高于 "and"

// 表达式的结果 (true && false) 被赋值给 $g
// 行为类似于: ($g = (true && false))

$g = 真 && 假;

// 将常量 true 分配给 $h,然后忽略 false
// 行为类似于:(($h = true) and false)

$h = 真假;

var_dump($g, $h);

布尔(假)
布尔(真)

因此,使用 &&,表达式的结果被分配为 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)

可能有混淆,因为它正在评估mysql_fetch_assoc($result) and $runningOK为 TRUE,然后将其分配给$row,在这种情况下与1

如果添加括号,您很可能可以使用&&or and,因为您将正确分隔两个评估。

我敢肯定,这是替代语法的副作用。

于 2010-02-07T03:33:23.070 回答
1

赋值运算符和=两个逻辑运算符具有不同的优先级:先执行,后者依次执行&&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 回答