PHP 使用 for 循环遍历 MySQLi 记录集

PHP Use for loop to iterate over MySQLi recordset

每当我使用 PHP MySQLi 记录集时,我总是使用标准 while 循环来处理返回的数据以遍历记录集。然而,最近,我开始想知道是否有一种方法可以改用 for 循环。这在您想限制返回的结果数量的情况下会很方便。


下面是一个使用 while 循环的例子:

//Prepare a query that will produce a reverse-order recordset
$sql = "SELECT * FROM tblNames ORDER BY numberID DESC";
$recordset = $conn -> query($sql);

//Count the number of contacts added to the list
$contactCount = 0;

while($row = $recordset -> fetch_assoc())
{   
    //If the list has reached its maximum number (5), end the display loop
    if($contactCount >= 5)
    {
        break;
    }

    $contactList .= $row["name"] . "<br>";

    //Increment the number of contacts added to the list
    $contactCount ++;
}

//Use '$contactList' somewhere....
echo($contactList);

虽然这确实有效,但必须有更好的方法在指定的迭代次数后结束循环。在这种情况下使用 for 循环会更容易吗?如果可以,怎么做?

在写这个问题的时候,我突然决定再试一次,但方式和以前不同。我一直在寻找一种 efficient/safe 方法来判断记录集何时为空(在自定义最大数量大于记录数以及没有记录时遇到了 运行 问题)。


//Execute the SQL query (reverse order), and store the results in a recordset
$sql = "SELECT * FROM tblNames ORDER BY numberID DESC";
$recordset = $conn -> query($sql);

//Use a 'for' loop to iterate over the recordset
for($i = 0; $i < 15; $i++)
{ 
    //If there is another row in the recordset, add the column value to the list
    if($row = $recordset -> fetch_assoc())
    {
        $contactList .= $row["name"] . "<br>";
    }
    else
    {
        //Break from the loop when there are no more records (used if the 
        //   given maximum number was actually greater than the number of records)
        break;
    }
}

echo($contactList);

据我所知,这是遍历 set/custom 条记录然后停止的更好方法。它还将安全地捕获记录集的末尾(假设它在截止数之前到达),并结束循环。


编辑

正如上面 HenryTK 的回答所指出的,如果您可以控制查询,最好的方法是使用 LIMIT SQL 语句。但是,如果您只能访问记录集,我仍然认为 for 循环会节省时间。 (虽然我不确定这会在什么时候发生)。

您可以在查询中使用LIMIT。例如:

SELECT * FROM tblNames ORDER BY numberID DESC LIMIT 15

这样您就不必担心如果您的查询 return 少于 15 个结果会发生什么。