警告:在条件语句中进行赋值

4

有一件事情一直困扰着我,就是当我检查PHP脚本时出现了警告"bool-assign: Assignment in condition",而且我经常遇到这种情况。

例如:

$guests = array();
$sql = "SELECT * FROM `guestlist`";
$result = mysql_query($sql);
while($row = mysql_fetch_assoc($result))
    $guests[] = $row['name'];

有没有另一种方法将多个或所有行获取到一个对象或数组中?或者这种方法没有问题吗?

2个回答

13

试着用这个方法:

$guests = array();
$sql = "SELECT * FROM `guestlist`";
$result = mysql_query($sql);
while(($row = mysql_fetch_assoc($result)) !== false)
    $guests[] = $row['name'];

我认为PHP发出了警告,因为$row = mysql_fetch_assoc($result)没有返回布尔值。


4
实际上,这是一种代码异味 - PHP并不关心结果的类型,只要它不能在运行时转换为false(例如:"0"、0或false)。你的脚本检查器只是过于谨慎,因为对于具有类C语言语法的语言中的新手而言,这是一个常见的问题。 - Bob Gettys

3

实际上,我认为这是一种警告,因为您可能会犯错误。通常在条件语句中,您的意图是执行以下操作:

if (something == something_else)

但很容易犯错,然后就会这样说:

if (something = something_else)

所以它很可能是在警告你。如果 PHP 和 C 一样,你可以通过在语句周围加上一组括号来解决问题,就像这样:

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

我认为Jeremy的回答有点偏差,因为PHP是弱类型的,通常不会关注这种区别。

我相信我们的答案在功能上是完全相同的;你所说的实际上就是 "while(($row = mysql_fetch_assoc($result)) === true)"。 我认为 "!== false" / "=== true" 增加了可读性和使用/不使用圆括号的理由。 - Jeremy Stanley
是的,这只是一个警告,程序运行得很好,但我不确定自己是否错过了更简单的替代方法(尽管在我看来这种方法似乎是最简单的) 谢谢! - Moak
我只是在处理手头的特定警告。它警告他因为有一个“条件中的赋值”,即一个 =,而通常期望的是 ==。这只是让它看到括号中的结果。 - Dan Fego

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接