Mysqli迭代结果集

时间:2015-10-19 12:47:26

标签: php loops mysqli while-loop

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

"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()吗?

3 个答案:

答案 0 :(得分: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];
}

答案 1 :(得分:0)

您应该尝试使用fetch()函数,而不需要初始化变量,因为while将显示受查询影响的所有增量行。

所以你的新代码应该是;

while($row = $output->fetch()){

        $deviceToken = $row['uid'];
        echo '$deviceToken<br>';
}

答案 2 :(得分:0)

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])的第三次迭代。依此类推。
您会看到,迭代确实是破坏脚本的部分。