如何迭代mysqli结果集?

Ash*_*eef 0 php mysqli loops resultset while-loop

我想遍历以下查询的结果集:

"select uid from userbase"
Run Code Online (Sandbox Code Playgroud)

我目前正在使用以下循环,但我只能获得第一个值。

$i = 0;
$output = mysqli_query($mysqli, "select uid from userbase") or die(mysqli_error($mysqli));
while ($row = $output->fetch_array()) {
    $deviceToken = $row[$i];
    echo $deviceToken;
    $i++;
}
Run Code Online (Sandbox Code Playgroud)

可能是什么问题?是fetch_array()吗?

mic*_*usa 5

https://php.net/manual/en/mysqli-result.fetch-array.php研究 php 手册时,您会注意到它fetch_array()的默认行为是生成包含索引和关联键控元素的结果集 ( MYSQLI_BOTH) .

可以使用MYSQLI_ASSOC...

while ($row = $output->fetch_array(MYSQLI_ASSOC)) {
    echo $row['uid'];
}
Run Code Online (Sandbox Code Playgroud)

或者MYSQLI_NUM……

while ($row = $output->fetch_array(MYSQLI_NUM)) {
    echo $row[0];
}
Run Code Online (Sandbox Code Playgroud)

也就是说,实际上有一种更简单、更简洁、更有效的方法,因为 mysqliquery()可以用作可迭代对象。fetch_array()可以完全省略调用每个迭代行的步骤。你可以把你的$output写成 aforeach()就可以了。(通过关联键参考列值。)

foreach ($output as $row) {
    echo $row['uid'];
}
Run Code Online (Sandbox Code Playgroud)

我确实建议您使用所有“面向对象”语法,而不是程序或混合样式。“面向对象”语法更简洁,在我看来更容易阅读。

最后,您的代码的构建方式,$i0每一行开始并递增。但是,您的结果集(具有两种样式的键)将如下所示...

[
    0 => [0 => 1, 'uid' => 1],
    1 => [0 => 2, 'uid' => 2],
    2 => [0 => 3, 'uid' => 3]...
]
Run Code Online (Sandbox Code Playgroud)

您的第一次迭代有效,因为$output[0][0](又名$row[0])存在。
您的第二次迭代不起作用,因为$output[1][1](又名$row[1])不存在。
也不存在$output[2][2](aka $row[2])的第三次迭代。等等。
你看,迭代确实是弄乱你的脚本的部分。