Php 一个$result=$conn->;中的多个for循环;查询($query)

Php 一个$result=$conn->;中的多个for循环;查询($query),php,for-loop,mysqli,Php,For Loop,Mysqli,我已经将数据导入到一个表中,现在使用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)

我已经将数据导入到一个表中,现在使用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循环开始,它将按循环运行的次数打印Number列中的最后一个值


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

我建议的标准解决方案是执行
fetch\u all()

而不是:

$rows = $result->num_rows;

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

调用
fetch.*
函数时,会有一个内部指针

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

如果运行
$result->data\u 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/>';
}
($name=0;$name<$rows;++$name)的

{
$row=$result->获取数组(MYSQLI\u ASSOC);
回显htmlspecialchars($row['Name'])。
; } $result->data\u seek(0)//获取数组(MYSQLI\u ASSOC); echo htmlspecialchars($row['Number'])。'
; }

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

为什么要两次运行相同的查询,每次只得到一列?您可以将这两个循环组合起来,只需在同一个for循环中获取两列?你让你自己变得更加困难,效率也更低,正如@AFriend所说,考虑到你使用的是完全相同的数据,为什么不把这两个
echo
放在同一个
for
循环中呢?我确实理解这一推理,并且看到我在这里的编码方式过于复杂。这是一次尝试和理解代码的尝试,使用重复,这导致我在代码中发现了一个我看不出原因的问题。我在这里问过,得到了很好的回答@费利佩·杜阿尔特解释了一个我不知道的概念,我很感谢我在这里得到的帮助。的确,我将自己重新编写代码,但我已经了解了代码的作用。我建议将结果作为关联数组传递给MYSQLI_ASSOC。用户达曼已经添加了一条类似于我的注释作为注释。使用“$rows=$result->fetch_all(MYSQLI_ASSOC);”以关联数组的形式获取结果。谢谢你的回答,我以后可能会这样做。
$row = $result->fetch_array(MYSQLI_ASSOC);
$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)
{
    ...
}

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/>';
}