我是 PHP 开发的新手,但我认为我正在快速掌握它,但是当我从 XAMPP 转移到真实主机时遇到了一些问题。我正在尝试做这样的事情。
$cast_list = mysqli_query($dblink, $sql);
foreach ($cast_list as $role)
{
echo "<tr><td width='50%'>".$role['appeared_as']."</td>";
}
它适用于我安装在家用 PC 上的 XAMPP,但不适用于我安排测试的主机。实际查询运行良好,所以这不是问题。我可以在 PHPMyAdmin 中、XAMPP 中以及当我按如下方式更改代码时看到正确的结果。
$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
不能正常工作是出于合乎逻辑的原因?
最佳答案
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。
最佳做法是在您要部署到的所有软件的相同版本上进行开发,这样您就不会被这种意外吓到。
关于php - 为什么我的 foreach 循环没有按预期工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25070098/