为什么我的foreach循环不能按预期工作?

时间:2014-07-31 22:39:35

标签: php mysql

我对PHP开发很陌生,但我想我会快速地接受它,但是当我从XAMPP迁移到IAMPP时,我遇到了一些问题。一个真正的主人。我试图做这样的事情。

$cast_list = mysqli_query($dblink, $sql);
foreach ($cast_list as $role)
{
    echo "<tr><td width='50%'>".$role['appeared_as']."</td>";
}

它适用于我在家用电脑上安装的XAMPP,但它不能用于我安排测试的主机。实际的查询工作正常,所以不是问题。我可以在XAMPP上的PHPMyAdmin中看到正确的结果,当我按如下方式更改代码时。

$cast_list = mysqli_query($dblink, $sql);
$y = mysqli_num_rows($cast_list);
for ($x = 0; $x <$y; $x++)
{
    $role = mysqli_fetch_assoc($cast_list);
    echo "<tr><td width='50%'>".$role['appeared_as']."</td>";
}

第二个代码块将产生所需的效果。第一个代码块显然会迭代5次,但不会包含任何有意义的数据。事实上,第一个代码块的var_dump($role)显示它是NULL

如果需要,我可以适应这种情况,但也许有foreach为我正常工作的合理原因?

1 个答案:

答案 0 :(得分:4)

mysqli_query()不返回可与foreach()一起使用的数组或数组对象。 mysqli_query()的返回类型是一种资源。你可以在循环中获取它,就像你的第二个解决方案一样。

使用while()代替for():

更简单
$cast_list = mysqli_query($dblink, $sql);
while ($role = mysqli_fetch_assoc($cast_list)) {
    echo "<tr><td width='50%'>".$role['appeared_as']."</td>";
}

当结果集末尾提取的行为NULL时,循环将自动终止。您不需要知道循环之前的行数。


重新评论:

looking up some facts之后,我不得不承认我上面的回答并不完全正确。或者某些版本的PHP不适用。

在PHP 5.4中,mysqli_result资源添加了Iterator功能,您实际上可以foreach()中使用它。但是您的主机显然使用的是旧版本的PHP。

最佳做法是使用您将部署的所有软件的相同版本进行开发,这样您就不会受到这种惊喜。