在while($row = mysql_fetch_assoc($result) and $runningOK)
循环中解决这个问题......如果使用PHP &&
运算符代替and
,那么mysql_fetch_assoc
会非常失败并仅返回运行时编号1
。
我已经尝试了mysql_fetch_array()
并且我仍然遇到1
问题。只有当我用&&
替换当前and
语句时,才会返回正确的行。
我已经在之前,之内和之后放置了调试语句来确保这一点。我想知道这是一个PHP怪癖还是我无法解释的东西。
while
答案 0 :(得分:9)
这是由于运营商的优先权。有关详细信息,请参阅the manual ...这是相关部分。
//“&&”优先级高于 “和”
//表达式的结果(true&& false)被分配给$ g
//行为如:($ g =(true&& false))$ g = true&&假;
//常量true指定给$ h,然后忽略false //行为如:(($ h = true)和false)
$ h = true和false;
var_dump($ g,$ h);
布尔(假)
布尔(真)
因此,使用&&,表达式的结果被赋值为true,其结果为1.使用和,它计算mysql函数的结果 - 我想要的更多,我想。
顺便说一句,您还可以使用break
来消除对$ runningOK变量的需求。为此,请从and $runningOK
条件中删除while
并将$runningOK = FALSE;
更改为break;
,如果触发了阻止块,它将结束循环。
答案 1 :(得分:1)
试试这个:
while(($row = mysql_fetch_assoc($result)) and $runningOK)
可能会混淆,因为它正在评估mysql_fetch_assoc($result) and $runningOK
为TRUE,然后将其分配给$row
,在这种情况下与1
相同
如果添加括号,您很可能会使用&&
或and
,因为您将正确地分开两个评估。
这是替代语法的副作用我敢肯定。
答案 2 :(得分:1)
赋值运算符=
和两个逻辑运算符&&
和AND
具有different precedence:&&
在=
之前执行,其中转弯在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。
答案 3 :(得分:0)
这是因为运营商解决了偏见。
查看此表以了解:
http://php.net/manual/en/language.operators.precedence.php
当你不知道如何解决时,尽可能多地使用()。