簡體   English   中英

來自一個 $result = $conn->query($query) 的多個 for 循環

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM