Logic 为什么使用&;时此循环返回1&;而不是';和';?
给我猜这个谜语。。。在Logic 为什么使用&;时此循环返回1&;而不是';和';?,logic,php,gearman,Logic,Php,Gearman,给我猜这个谜语。。。在while($row=mysql\u fetch\u assoc($result)和$runningOK)循环中,如果使用PHP&&操作符代替和,那么mysql\u fetch\u assoc会严重失败,运行时只返回数字1 我已经试过了mysql\u fetch\u array(),但仍然存在1问题。只有当且仅当我将&替换为和时,才会返回正确的行,就像当前的while语句一样 为了确保这一点,我将调试语句放在了前面、里面和后面。我想知道这是PHP的怪癖还是我无法解释的原因
while($row=mysql\u fetch\u assoc($result)和$runningOK)
循环中,如果使用PHP&&
操作符代替和
,那么mysql\u fetch\u assoc
会严重失败,运行时只返回数字1
我已经试过了mysql\u fetch\u array()
,但仍然存在1
问题。只有当且仅当我将&
替换为和
时,才会返回正确的行,就像当前的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;
}
}
试试这个:
while(($row = mysql_fetch_assoc($result)) and $runningOK)
可能存在混淆,因为它正在将mysql\u fetch\u assoc($result)和$runningOK
评估为TRUE,然后将其分配给$row
,在本例中,这与1
如果添加括号,则很可能可以使用&&
或和
,因为您将正确地分隔这两个求值
我敢肯定,这是另类语法的副作用 这是由于运算符的优先级。有关详细信息,请参阅。。。以下是相关部分 //“&&”的优先级大于 “和” //表达式的结果(true和false)被分配给$g
//行为类似:($g=(真与假)) $g=true&&false //常量true被分配给$h,然后忽略false
//行为类似:($h=true)和false) $h=正确和错误 var_dump($g,$h) 布尔(假)
布尔(真) 因此,使用&&,表达式的结果被指定为true,其计算结果为1。使用and,它的计算结果是mysql函数的结果——我认为这是您想要的结果
顺便说一下,您还可以使用
break
来消除对$runningOK变量的需要。要执行此操作,请从while
条件中删除和$runningOK
,并更改$runningOK=FALSE代码>到<代码>中断如果catch块被触发,它将结束循环。赋值运算符=
和两个逻辑运算符&&
和和具有:&
在=
之前执行,而又在和之前执行
因此,基本上,声明:
$row = mysql_fetch_assoc($result) AND $runningOK
$row = mysql_fetch_assoc($result) && $runningOK
等于:
($row = mysql_fetch_assoc($result)) AND $runningOK
$row = (mysql_fetch_assoc($result) && $runningOK)
虽然声明:
$row = mysql_fetch_assoc($result) AND $runningOK
$row = mysql_fetch_assoc($result) && $runningOK
等于:
($row = mysql_fetch_assoc($result)) AND $runningOK
$row = (mysql_fetch_assoc($result) && $runningOK)
在最后一种情况下,您只是分配值1(如果mysql\u fetch\u assoc返回一个值)或0。这是因为运算符解析precedence
查看此表以了解:
当您不知道如何解决时,请尽可能多地使用()。我的钱就在这个解释上。这是一个更大的Gearman Worker内核的一个缩影,在几个部分中使用running ok以确保我们有有效的SQL调用和Worker运行状况。对优先顺序的解释是多么美妙和清晰啊!同时也在1000代表上擦肩而过:)谢谢!我在用冰淇淋庆祝。