【问题标题】:Query display result with while() or foreach()使用 while() 或 foreach() 查询显示结果
【发布时间】:2020-12-02 18:39:18
【问题描述】:

我在搞乱如何从 MySQL 进行查询并在 PHP 上显示它们,我偶然发现了一些东西:

这是我要查询的表:

$query = mysqli_query($conexion, "SELECT * FROM notas");

while($nota = mysqli_fetch_assoc($query)){
    var_dump($nota);
    echo $nota["Descripcion"];
}

每当我使用 while() 来显示查询的所有结果时,它都会起作用。此表有 2 行,它们都在显示。

var_dump($notas) 的结果:

但是每当我使用 foreach() 时,它只会返回查询的最后一个结果。

$query = mysqli_query($conexion, "SELECT * FROM notas");

foreach(mysqli_fetch_assoc($query) as $valor){
    var_dump($valor);
}

var_dump($valor) 的结果:

有什么原因吗?我在 foreach() 循环中做错了什么?我真的说不出来。我只会说“捏造”,接受它并只使用 while 循环来显示查询,但是,你知道,我想知道我是做错了什么还是不理解什么。

【问题讨论】:

  • mysqli_fetch_all。这对你的 foreach 有用。原因_fetch_assoc 不起作用是它一次只返回一行并增加一个内部指针,所以下次调用它时它会检索下一行。对于foreach,您需要一个数组或iterator
  • foreach($query 但您应该使用一些错误报告,以便您知道查询已成功执行
  • 如果您要处理大量行,使用 while( _fetch_assoc()) 会很好,如果一次将所有结果放入数组中,可能会占用过多内存。
  • 另外,我个人建议使用PDO 而不是mysqli。我一直觉得它更容易使用,我喜欢它是用于绑定参数的 api。但这也不是一个关键的转换,所以不要让我的建议分散你对你想要完成的事情的注意力。我只是认为这是一种更好的开发者体验。
  • @Reed 我明白了。使用_fetch_all 确实有效,var_dump 现在返回了我期待的两行。我会记住你所说的关于行和 PDO 的内容(还没有使用它,所以不妨研究一下)。谢谢 c:

标签: php mysqli


【解决方案1】:

第二个版本循环遍历列,而不是行。相当于:

$row = mysqli_fetch_assoc($query);
foreach ($row as $valor) {
    var_dump($valor);
}

您可以在这里看到它只是获取一行,这是一个关联数组,然后循环遍历该数组的元素。

foreach (<expression> as <variable>) 不会在每次循环中都重新计算表达式。它执行一次,保存该数组,然后循环遍历数组元素。

mysqli_result 对象是可迭代的,所以你可以这样做:

foreach($query as $valor) {
    var_dump($valor);
}

您也可以调用mysqli_fetch_all($query),它将返回一个包含所有结果的二维数组,然后循环遍历该数组。但是如果查询返回很多结果,这会占用大量内存。

【讨论】:

  • 我明白了。不太了解fetch_assocfetch_all 的工作原理。此外,从未尝试使用mysqli_result 处理查询结果,不妨试试看效果如何。谢谢 c:
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-09
  • 2021-07-24
  • 2017-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多