如何迭代 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()
吗?
您需要定义一个数组并将数据存储到循环内的数组中。
使用 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];
}
在研究 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'];
}
我确实建议您使用所有“面向对象”的语法,而不是过程式或混合风格。 “面向对象”语法更简洁,在我看来更容易阅读。
最后,您的代码构造方式,$i
从 0
开始,并随着每一行递增。但是,您的结果集(具有两种样式的键)将如下所示...
[
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]
)的第三次迭代也不存在。等等。
你看,迭代确实是破坏脚本的部分。
我想遍历以下查询的结果集:
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()
吗?
您需要定义一个数组并将数据存储到循环内的数组中。
使用 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];
}
在研究 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'];
}
我确实建议您使用所有“面向对象”的语法,而不是过程式或混合风格。 “面向对象”语法更简洁,在我看来更容易阅读。
最后,您的代码构造方式,$i
从 0
开始,并随着每一行递增。但是,您的结果集(具有两种样式的键)将如下所示...
[
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]
)的第三次迭代也不存在。等等。
你看,迭代确实是破坏脚本的部分。