2015-10-15 56 views
2
while ($row = mysqli_fetch_array($result) && strlen($row['url_key']) > 4) 
{ 
.... 
} 

我想到这所取得的阵列分配给$row然后检查数组中的元素之一的长度,而是我得到为什么在PHP中执行布尔测试后发生变量赋值?

“PHP公告:未定义的变量:排在/ home/dwilkins/stage_image_update.php on line ...“

如果$row未被分配,我期望测试短路,并且url密钥的长度不被测试。我知道正在分配$行,因为当我将&& strlen...取出时,它正常运行。那么导致这种行为的'底层'实际上究竟发生了什么?我查看了logical operators的PHP.net条目,但我没有得到任何关于此的信息。

+1

'$ row'不存在,直到你'while'开始循环。 –

+0

评估时,我不认为'$ row ['url_key']'被赋值或索引不存在。同样在最后一次运行时,没有'$ row'。 – Twisty

+0

尝试使用括号,'($ row = mysqli_fetch_array($ result))&& strlen($ row ['url_key'])> 4)' – JCOC611

回答

7

&&有更高的operator precedence=。您需要相应地组织您的表达式(例如,引入parens以改变优先级)。这是理解和意识到的一个非常重要的基本概念。

+0

我错误地认为不是“=”作为操作符,如果我有,我会在我引用的页面上看到答案。谢谢 –

7

运算符优先级。

用圆括号包裹$row = mysqli_fetch_array($result),它会没事的。

($row = mysqli_fetch_array($result)) && strlen($row['url_key']) > 4 

它现在作为

$row = (mysqli_fetch_array($result) && strlen($row['url_key']) > 4) 
               ^^^^^ 
               Undefined 
-2

您必须声明在严格模式下PHP变量在循环之前或使用“如果”的语句时,严格的错误检查模式下,它被解释的方式。如果你设置为null,那么它们无关紧要,因为PHP会自动转换类型。

$row = ''; 

$row = null; 

$row = array(); //EMPTY ARRAY 

,或者您可以使用

settype($row, "null");