如何在同一 PHP 页面上多次使用 mysqli fetch_assoc() 和准备好的语句?

How can I use mysqli fetch_assoc() several times with prepared statements on same PHP page?

有没有办法在同一页面上使用准备好的语句多次使用 fetch_assoc()

    $data = $conn->prepare("SELECT * FROM some_table WHERE id=?");
    $data->bind_param('i',$id);
    $data->execute();
    $result = $data->get_result();  

我希望能够在同一页面上使用 fetch_assoc() 的次数不限,次数不限。如果我想循环两次,我应该能够做到。如果我想循环并进行一次提取,我也应该能够做到这一点。现在看来,fetch_assoc()一旦被使用一次,就不能在同一个页面上再次使用了。

循环中

while($row = $result->fetch_assoc()){
...
}

单次获取

$user = $result->fetch_assoc();
$first_name = $user['first_name'];

您可以使用mysqli_result::data_seek在每次使用后重置结果指针,这样您就可以多次循环结果。例如:

while($row = $result->fetch_assoc()){
...
}
$result->data_seek(0);
while($row = $result->fetch_assoc()){
...
}

虽然技术上可以(Nick 展示了如何)倒回 mysqli_result 对象,但许多人发现使用 mysqli_result 很麻烦。将所有记录提取到 PHP 数组中并使用多维数组而不是 mysqli_result 对象要容易得多。

$result = $data->get_result()->fetch_all(MYSQLI_ASSOC);

这样你就可以用这个数组做任何你想做的事了。可以过滤,可以多次循环,可以使用PHP.

中的所有标准数组函数
$resultsFiltered = array_filter($results, fn($e) => $e['someColumn']>200);
foreach($resultsFiltered as $row) {
    // only records with someColumn > 200
}