如何循环访问 MySQLi 结果集中的结果


How do I iterate over the results in a MySQLi result set?

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

select uid from userbase

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

$i = 0;
$output = mysqli_query($mysqli, "select uid from userbase");
while ($row = $output->fetch_array()) {
    $deviceToken = $row[$i];
    echo $deviceToken;
    $i++;
}

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

在 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'];
}

MYSQLI_NUM...

while ($row = $output->fetch_array(MYSQLI_NUM)) {
    echo $row[0];
}

也就是说,实际上有一种更简单,更简短,更有效的方法,因为MySQLi的query()可以用作可迭代对象。可以完全省略在每个迭代行上调用fetch_array()的步骤。您可以将$output写入foreach()然后就可以了(通过关联键引用列值(。

foreach ($output as $row) {
    echo $row['uid'];
}

我建议您使用所有"面向对象"语法,而不是过程或混合样式。 "面向对象"语法更简短,在我看来更容易阅读。

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

[
    0 => [0 => 1, 'uid' => 1],
    1 => [0 => 2, 'uid' => 2],
    2 => [0 => 3, 'uid' => 3]...
]

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

您需要定义一个数组并将数据存储在循环内的数组中。使用MYSQLI_ASSOC无需增加值

$deviceToken=array();
while ($row = $output->fetch_array(MYSQLI_ASSOC)) {
    $deviceToken[] = $row['uid'];
}
print_r($deviceToken);
for($i=0;$i<=count($deviceToken);$i++){
echo $deviceToken[$i];
}