题
谜语我这个......在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
使用()一样多,你需要的时候,你不知道它是如何解决的事情。