$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中所做的事情。
感谢。
答案 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 />";