为了账号安全,请及时绑定邮箱和手机立即绑定

来自一个 $result = $conn->query($query) 的多个 for 循环

来自一个 $result = $conn->query($query) 的多个 for 循环

PHP
叮当猫咪 2022-06-17 17:18:13
我已将数据导入表中,现在我正在使用 PHP 使用以下代码访问该数据,<?phprequire_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?<?phprequire_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 。<?phprequire_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 的代码中发生了什么。
查看完整描述

2 回答

?
慕标琳琳

TA贡献1830条经验 获得超9个赞

我推荐的标准解决方案是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)

{

    ...

}


查看完整回答
反对 回复 2022-06-17
?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

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


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


如果您运行$result->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/>';

}

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


查看完整回答
反对 回复 2022-06-17
  • 2 回答
  • 0 关注
  • 227 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号