首页 > 解决方案 > PDO 错误:$pdo->prepare()->execute() 抛出错误“在布尔值上调用成员函数 fetch()”

问题描述

如果我的 pdo 查询如下:

$sql=$pdo->prepare('select timezone from wo_users where user_id=?')->execute(array($wo['user']['user_id']));
while($row=$sql->fetch()){var_dump($row);die;}

会抛出错误:

( ! ) 致命错误:在第 27 行的 C:\wamp64\www\community.voyance\2\sources\calendar.php 中的布尔值上调用成员函数 fetch()

但是如果我直接使用 query() 的 pdo 查询不会抛出错误:

$sql=$pdo->query('select timezone from wo_users where user_id=1;');
while($row=$sql->fetch()){var_dump($row);die;}

C:\wamp64\www\community.voyance\2\sources\calendar.php:27: 数组 (size=1) 'timezone' => string '-8' (length=2)

为什么会这样?谢谢!

标签: phpmysqlpdo

解决方案


你需要一个PDOStatement来获取,execute只返回真或假。您应该只execute使用PDOStatement. 这会给你一个你可以返回的结果对象fetch或一个错误。对于 PDO 错误处理,请参阅My PDO Statement doesn't work

$stmt = $pdo->prepare('select timezone from wo_users where user_id=?');
$stmt->execute(array($wo['user']['user_id']));
while($row = $stmt->fetch()){
     var_dump($row);
     die;
}

正如您从手动查询中看到的那样,因为:

PDO::query() 返回一个 PDOStatement 对象,如果失败则返回 FALSE。

在哪里执行

成功时返回 TRUE,失败时返回 FALSE。

prepare就是我们需要的:

如果数据库服务器成功准备语句,PDO::prepare() 返回一个 PDOStatement 对象。如果数据库服务器无法成功准备语句,则 PDO::prepare() 返回 FALSE 或发出 PDOException(取决于错误处理)。

获取(这是描述,而不是返回):

从与 PDOStatement 对象关联的结果集中获取一行


推荐阅读