php - 为什么我的 foreach 循环没有按预期工作?

标签 php mysql

我是 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/

相关文章:

php - 如何在 php/mysql 中以 12 小时时间格式使用 >= AND <= 获取数据?

php - Javascript 重定向与表单提交到 php 脚本

php - 表中每一列中的每个匹配项都将存储在数组中

mysql - 使用 SQL 比较两个表中标识符的计数

php - MySQL计数问题

mysql - 将数据从 excel 文件写入数据库 (mysql) 时出现编码错误

php - Laravel 软删除在数据透视表中不起作用

php - Laravel 验证登录路径

php - 在数据库中存储 MySQL 查询 (MySQL)

mysql - 使用 Diesel 的声明式架构定义