PHP PDO报错Call to undefined method PDOStatement,无法获取查询结果求助
解决PDO调用
get_result()报错及正确查询方法 嘿,我一眼就看到问题所在了——你现在踩了个典型的「MySQLi和PDO API混用」的坑,咱们一步步把它理顺:
1. 核心错误原因
你代码里的$q->get_result()是**MySQLi语句对象(mysqli_stmt)**的专属方法,但你用的是PDO,PDO的PDOStatement类根本没有这个方法,这就是为啥会报Call to undefined method PDOStatement的原因。之前用mysqli_query能跑,是因为你用对了对应扩展的API,但PDO和MySQLi是两套完全独立的数据库操作扩展,不能混搭方法。
2. 修正你的查询函数
首先把PDO的正确方法用上,同时优化连接逻辑(别每次调用函数都require连接文件,容易重复创建连接):
// 建议在脚本最顶部引入连接文件,只引入一次 require "conection.php"; private function Query($sql, $params = []){ global $db; // 或者更优雅的方式是把$db作为参数传入,避免依赖全局变量 $stmt = $db->prepare($sql); // 执行参数绑定并运行查询 $stmt->execute($params); // PDO获取结果的方式:fetchAll(PDO::FETCH_ASSOC) 返回关联数组,和mysqli的fetch_assoc效果一致 // 如果你只需要单条结果,可以用fetch(PDO::FETCH_ASSOC) return $stmt->fetchAll(PDO::FETCH_ASSOC); }
另外,建议在你的conection.php里加上PDO错误模式配置,方便调试:
$host = "127.0.0.1"; $dbname = "truckla"; $username = "root"; $password = "123456"; try{ $db = new PDO("mysql:host=$host;dbname=$dbname", $username, $password); // 开启PDO异常错误模式,出错时抛出异常,更容易定位问题 $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 设置默认返回关联数组 $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); }catch(Exception $e){die("Fatal error: ".$e->getMessage());}
3. 修正SQL语句与参数绑定
你的原SQL有两个问题:
- PDO的占位符
?不能放在%里面,通配符应该写在绑定的参数里,而不是SQL语句中 - OR的优先级比AND低,你的原SQL逻辑可能会出现预期外的结果,建议给OR两侧的条件加括号包裹
修正后的调用代码:
// 给参数加上通配符,用于LIKE匹配 $truckTypeParam = "%{$trucktype}%"; $groupIdParam = "%{$groupsId}%"; $driverIdParam = "%{$driverId}%"; // 修正后的SQL,注意占位符位置和逻辑括号 $sql = "SELECT OrderId,Products,Quantis,Description,RecvrName,AddressInfo,GPS,TimeStart,TimeSpec FROM orders WHERE (IsPrivate = 'false' AND IsComplete = 'false' AND StillOpen = 'true' AND CanShow = 'true' AND TruckType LIKE ?) OR ((GroupId LIKE ? OR DriversId LIKE ?) AND IsComplete = 'false' AND StillOpen = 'true' AND CanShow = 'true')"; // 调用查询函数 $result = $this->Query($sql, [$truckTypeParam, $groupIdParam, $driverIdParam]);
额外小建议
- 不要用
LIKE匹配布尔值:你的IsPrivate LIKE 'false'应该改成IsPrivate = 'false'(如果字段是布尔/枚举类型),这样更准确也更高效 - 避免依赖全局变量:可以把
$db对象作为参数传入Query函数,或者用类属性存储,这样代码更健壮
内容的提问来源于stack exchange,提问作者a161803398874
相关产品推荐
相关产品推荐

