【问题标题】:How do I iterate over the results in a MySQLi result set?如何迭代 mysqli 结果集?
【发布时间】:2016-01-17 19:46:09
【问题描述】:

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

"select uid from userbase"

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

$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++;
}

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

【问题讨论】:

标签: php loops mysqli while-loop resultset


【解决方案1】:

您需要定义一个数组并将数据存储到循环内的数组中。 使用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];
}

【讨论】:

  • 如果没有密钥,为什么不直接使用array_push?
  • 我需要打印正在获取的单个设备令牌。我该怎么办?
  • 使用MYSQLI_ASSOC,你会得到所有uid。并使用 for 循环获取单个设备令牌
  • @saty 谢谢。您应该将 for 循环内的条件指定为“
  • 我绝对不建议在循环中进行重复的count() 调用。计数应该被缓存为一个变量(一次)并且该变量被反复使用——但是在同一个结果集数据上运行两个循环是无意义的。
【解决方案2】:

您会在研究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])的第三次迭代也不存在。等等。
你看,迭代确实是搞砸了你的脚本的部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-05
    • 1970-01-01
    • 1970-01-01
    • 2017-03-07
    • 2021-09-29
    • 2013-12-24
    • 2013-08-09
    相关资源
    最近更新 更多