【问题标题】:Multiple for-loops from one $result = $conn->query($query)来自一个 $result = $conn->query($query) 的多个 for 循环
【发布时间】:2020-04-09 07:22:02
【问题描述】:

我已将数据导入到表中,现在我正在使用 PHP 使用以下代码访问该数据,

<?php
require_once 'connect.php';

$query = "SELECT * FROM JunkData";
$result = $conn->query($query);

if(!$result) die("Fatal Error");

$rows = $result->num_rows;

for ($name = 0; $name < $rows; ++$name)
{
    $row = $result->fetch_array(MYSQLI_ASSOC);
    echo htmlspecialchars($row['Name']) . '<br/>';
}

$result->close();
$conn->close();

这行得通!
我真的很好奇为什么添加第二个 for 循环不起作用,除非我再次声明 $result?

<?php
require_once 'connect.php';

$query = "SELECT * FROM JunkData";
$result = $conn->query($query);

if(!$result) die("Fatal Error");

$rows = $result->num_rows;

for ($name = 0; $name < $rows; ++$name)
{
    $row = $result->fetch_array(MYSQLI_ASSOC);
    echo htmlspecialchars($row['Name']) . '<br/>';
}

for ($number = 0; $number < $rows; ++$number)
{
    $row = $result->fetch_array(MYSQLI_ASSOC);
    echo htmlspecialchars($row['Number']) . 'Flag<br/>';
}


$result->close();
$conn->close();

不起作用,尽管“标志”被打印了适当的次数。
而如果我再次声明 $result。

<?php
require_once 'connect.php';

$query = "SELECT * FROM JunkData";
$result = $conn->query($query);

if(!$result) die("Fatal Error");

$rows = $result->num_rows;

for ($name = 0; $name < $rows; ++$name)
{
    $row = $result->fetch_array(MYSQLI_ASSOC);
    echo htmlspecialchars($row['Name']) . '<br/>';
}

$result = $conn->query($query);

for ($number = 0; $number < $rows; ++$number)
{
    $row = $result->fetch_array(MYSQLI_ASSOC);
    echo htmlspecialchars($row['Number']) . '<br/>';
}


$result->close();
$conn->close();

代码确实有效。
我尝试使用 unset($row) 等取消设置一些变量,如果删除该行,我确实注意到了,

$row = $result->fetch_array(MYSQLI_ASSOC);

从第二个 for 循环开始,它将在循环运行时打印 Number 列中的最后一个值。

我希望这是可以理解的。我想知道如果我想针对它运行第二个 for 循环,我需要重新声明 $result 的代码中发生了什么。

【问题讨论】:

  • 为什么你运行相同的查询两次,每次只得到 1 列?您可以将两个循环组合起来,然后将两列都放在同一个 for 循环中吗?你让自己变得比需要的更困难和效率更低
  • 正如@AFriend 所说,考虑到您使用完全相同的数据,为什么不将两个echo 放在同一个for 循环中?
  • 我确实理解这个推理,并且看到我在这里编码的方式过于复杂。这是尝试使用重复来尝试理解代码的尝试,这使我在代码中找到了我看不到原因的问题。我在这里问过,并得到了很好的答案。 @Felippe Duarte 解释了一个我不知道的概念,我很感激我在这里得到的帮助。的确,我会自己重写代码,但我已经深入了解了代码的作用。

标签: php for-loop mysqli


【解决方案1】:

我推荐的标准解决方案是fetch_all()

代替:

$rows = $result->num_rows;

for ($name = 0; $name < $rows; ++$name)
{
    $row = $result->fetch_array(MYSQLI_ASSOC);

$rows = $result->fetch_all();

foreach ($rows as $row)
{
    ...
}
// then you can re-loop same array of $rows
foreach ($rows as $row)
{
    ...
}

【讨论】:

  • 我建议通过 MYSQLI_ASSOC 来获取关联数组的结果。
  • 用户 Dharman 已经添加了类似于我的注释作为评论。使用“$rows = $result->fetch_all(MYSQLI_ASSOC);”将结果作为关联数组获取。谢谢你的回答,我以后可能会这样做。
【解决方案2】:

调用fetch_*函数时有一个内部指针。

在您的第一个for 循环中,您将指针发送到结果集的末尾。 因此,下一个fetch 将不会返回任何内容。

如果您运行$result-&gt;data_seek(0),您将重置此指针并可以重复使用:

for ($name = 0; $name < $rows; ++$name)
{
    $row = $result->fetch_array(MYSQLI_ASSOC);
    echo htmlspecialchars($row['Name']) . '<br/>';
}

$result->data_seek(0); //<---- REPLACE HERE

for ($number = 0; $number < $rows; ++$number)
{
    $row = $result->fetch_array(MYSQLI_ASSOC);
    echo htmlspecialchars($row['Number']) . '<br/>';
}

当然,通常不需要循环两次相同的结果集,你可能需要重新考虑你的逻辑并且只循环一次。

【讨论】:

    猜你喜欢
    • 2012-09-22
    • 2017-06-22
    • 2019-04-11
    • 1970-01-01
    • 2020-07-26
    • 1970-01-01
    • 2014-11-07
    • 1970-01-01
    • 2013-01-20
    相关资源
    最近更新 更多