什么应该在PHP中使用PDO语句返回print_r?

时间:2010-09-30 21:07:11

标签: php

$dbh = new PDO ("sqlite:/Library/WebServer/Documents/nwind2009.db3");
$sql = "SELECT * FROM Customers";     
print_r($dbh->query($sql));

返回:

PDOStatement对象([queryString] => SELECT * FROM Customers)

但如果我这样做:

 foreach ($dbh->query($sql) as $row) {
    echo $row['CompanyName'];
 }

我得到了数据。

为什么print_r不显示数据库结果? foreach发生了什么特别的事情?我以为print_r向我展示了这个阵列,这就是我在foreach中所做的事情。

感谢。

3 个答案:

答案 0 :(得分:4)

如果迭代查询,它将自动获取数据。这是一件好事,因为适配器会在实际需要时延迟加载数据。

如果要强制PDO适配器提前获取数据,可以像这样运行fetchAll方法:

$dbh = new PDO ("sqlite:/Library/WebServer/Documents/nwind2009.db3");
$sql = "SELECT * FROM Customers";       
print_r($dbh->query($sql)->fetchAll());

答案 1 :(得分:3)

PDOStatement是存储在“普通”PHP代码之外的资源的可迭代接口。结果集不是在PHP级别实现的,并且根据设置,甚至是一个问题,即结果集是存在于PHP进程的内存中还是存在于数据库服务器的内存中。它上面的foreach实际上会调用资源上的多个提取,而你不知道(或应该关心)结果集在内存中的事实是一件好事。

如果您仍需要调试表示,可以拨打var_dump($stmt->fetchALL());

答案 2 :(得分:0)

查询返回一个数组/对象,print_r()显示结果,添加<pre>标记并将true传递给print_r()将使在HTML页面上显示时更容易阅读

echo "<pre>".print_r($dbh->query($sql)->fetchAll(),true)."</pre><br />";