PDO 循环并打印 fetchAll

问题描述 投票:0回答:2

我无法从 fetchAll 获取数据以选择性打印。

在普通的mysql中我是这样做的:

$rs = mysql_query($sql);
while ($row = mysql_fetch_array($rs)){
   $id = $row['id'];
   $n = $row['n'];
   $k = $row['k'];
}

在 PDO 中,我遇到了麻烦。我绑定了参数,然后像上面一样将获取的数据保存到 $rs 中,目的是以相同的方式循环它..

$sth->execute();
$rs = $query->fetchAll();

现在麻烦的部分来了。我该怎么做 PDO 才能获得与上面的 while 循环匹配的东西?!我知道我可以使用 print_r() 或 dump_var,但这不是我想要的。我需要做我以前能够使用常规 mysql 做的事情,比如根据需要单独获取 $id、$n、$k。可以吗?

提前致谢..

php mysql database pdo fetchall
2个回答
34
投票

应该是

while ($row = $query->fetch(PDO::FETCH_ASSOC)) {
  $id = $row['id'];
  $n = $row['n'];
  $k = $row['k'];
}

如果你坚持

fetchAll
,那么

$results = $query->fetchAll(PDO::FETCH_ASSOC);
foreach($results as $row) {
   $id = $row['id'];
   $n = $row['n'];
   $k = $row['k'];
}

PDO::FETCH_ASSOC
仅获取列名称并省略数字索引。


0
投票

如果您打算在执行查询的同一函数/方法或层中迭代结果集,那么建议直接迭代结果对象,而不是调用

fetchAll()
。 (这对资源的需求更少,并且语法更简单。)始终避免将
fetchAll()
的数据传递给 foreach 的一个例外是当您使用 PDO 的专用有效负载变异模式/标志之一时(例如
PDO::FETCH_GROUP
) .

将结果集对象作为

foreach()
的输入传递。 foreach 会将有效负载视为关联数组的索引数组,并且如果结果为零,则不会抱怨。

一些演示假设

$sql = "SELECT id, n, k FROM my_table";
(PHPize Demo)

foreach ($pdo->query($sql) as $row) {
    vprintf("id: %d, n: %s, k: %s\n", $row);
}

foreach ($pdo->query($sql) as $row) {
    echo "id: {$row['id']}, n: {$row['n']}, k: {$row['k']}\n";
}

foreach ($pdo->query($sql) as ['id' => $id, 'n' => $n, 'k' => $k]) {
    echo "id: $id, n: $n, k: $k\n";
}

$result = [];
foreach ($pdo->query($sql) as ['id' => $id, 'n' => $n, 'k' => $result[$id][$n]]);
var_export($result);

请注意,上述技术都不需要调用 PDO 的

fetch()
方法来访问
->fetch(PDO::FETCH_ASSOC)
生成的等效数据。

完全相同的技术可用于通过 PDO 执行准备好的语句生成的结果对象。只需传入对象即可,无需手动调用

fetch()

© www.soinside.com 2019 - 2024. All rights reserved.