猿问

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

我已将数据导入表中,现在我正在使用 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 的代码中发生了什么。


叮当猫咪
浏览 228回答 2
2回答

慕标琳琳

我推荐的标准解决方案是fetch_all()代替:$rows = $result->num_rows;for ($name = 0; $name < $rows; ++$name){&nbsp; &nbsp; $row = $result->fetch_array(MYSQLI_ASSOC);做$rows = $result->fetch_all();foreach ($rows as $row){&nbsp; &nbsp; ...}// then you can re-loop same array of $rowsforeach ($rows as $row){&nbsp; &nbsp; ...}

汪汪一只猫

fetch_*调用函数时有一个内部指针。在您的第一个for循环中,您将指针发送到结果集的末尾。因此,下一个fetch将不返回任何内容。如果您运行$result->data_seek(0),您将重置此指针并可以重用:for ($name = 0; $name < $rows; ++$name){&nbsp; &nbsp; $row = $result->fetch_array(MYSQLI_ASSOC);&nbsp; &nbsp; echo htmlspecialchars($row['Name']) . '<br/>';}$result->data_seek(0); //<---- REPLACE HEREfor ($number = 0; $number < $rows; ++$number){&nbsp; &nbsp; $row = $result->fetch_array(MYSQLI_ASSOC);&nbsp; &nbsp; echo htmlspecialchars($row['Number']) . '<br/>';}当然,通常不需要循环两次相同的结果集,您可能需要重新考虑您的逻辑并只循环一次。
随时随地看视频慕课网APP
我要回答