[英]Multiple for-loops from one $result = $conn->query($query)
我已將數據導入表中,現在我正在使用 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();
不起作用,盡管 'Flag' 被打印了適當的次數。
而如果我再次聲明 $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 。
我推薦的標准解決方案是執行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)
{
...
}
調用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/>';
}
當然,通常不需要將同一個結果集循環兩次,你可能需要重新思考你的邏輯,只循環一次。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.