我有这段代码:
while ($i = $res->fetchArray(SQLITE3_ASSOC))
{
$items[] = $i;
}
我试着把它整理成这样:
while ($items[] = $res->fetchArray(SQLITE3_ASSOC));
它看起来非常令人满意,但是我现在在数组的末尾得到了一个额外的元素(当调用fetchArray()
返回 false 时。有没有办法编写这个语句而不在末尾得到额外的元素?
我有这段代码:
while ($i = $res->fetchArray(SQLITE3_ASSOC))
{
$items[] = $i;
}
我试着把它整理成这样:
while ($items[] = $res->fetchArray(SQLITE3_ASSOC));
它看起来非常令人满意,但是我现在在数组的末尾得到了一个额外的元素(当调用fetchArray()
返回 false 时。有没有办法编写这个语句而不在末尾得到额外的元素?
如果你使用 PDO 作为你的数据库库,你应该使用fetchAll()
方法(文档)
$items = $stmt->fetchAll(PDO::FETCH_ASSOC)
这将为您提供一个二维关联数组。它的索引从 0 到 n-1,其中 n 是获取的行数,每一行都包含一个以列名作为索引的数组。例如:
$items[3]['id']
将包含存储在第 4 个提取行的 id 列中的值。
如果您使用 mysqli_* 代替,则有mysqli_fetch_all()但不鼓励这样做,因为它更昂贵,而不是 mysqli_fetch_array() 的循环,或者文档说。
如果您使用的是第三方库,请查阅提供的文档。如果没有提供或没有fetchAll
同等产品,则表明质量差。删除它并改用本机 PDO。
由于您使用的是 SQLITE3 驱动程序,我建议您查看此页面:SQLITE (PDO),它解释了如何将 PDO 与 SQLITE3 一起使用。相信我,这是值得的。很可能您不会长期坚持使用 SQLITE,当您迁移到 MySQL 或 PostgreSQL 时,您会感谢我的阅读。
PDO 的主要优点是(通常)对于用户来说是透明的,关于哪个 DB 在下面。因此,如果您更改数据库,它不应该破坏您的应用程序,只需更改 PDO 连接字符串就足够了。
尝试
while(($item=$res->fetchArray(SQLITE3_ASSOC))&&$items[]=$item);