谜语我这个......在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;
    }
}
有帮助吗?

解决方案

这是由于操作者的优先级。请参见有关详细信息,手动 ......这里的相关部分。

  

//“&&”具有更大的优先级比   “和”

     

//表达式(真&&假)结果被赋给$克,点击   //徒像:($ G =(真&&假))

     

$克=真假&&;

     

//恒定真分配给$小时,然后假被忽略,点击   //徒像:(($ H =真)和假)

     

$ H =真假;

     

的var_dump($克,$ H);

     

布尔(假),点击   布尔(真)

所以,用&&,表达式的结果赋值为true,则计算结果为1.并且,它的计算结果为MySQL的函数的结果 - 更多你想要什么,我觉得

顺便说一句,你也可以使用break消除了$ runningOK变量的需要。为了这样做,从and $runningOK条件除去while和更改$runningOK = FALSE;break;并且它将结束循环如果catch块被触发。

其他提示

尝试这种情况:

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

有可能是一个混淆,因为它是一种评估mysql_fetch_assoc($result) and $runningOK为TRUE,它然后分配给$row,在这种情况下是一样的1

如果您添加括号,你最有可能可以使用&&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。

这是因为操作员解决prescedence。

查看此表以了解:

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

使用()一样多,你需要的时候,你不知道它是如何解决的事情。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top