PHP PDO的execute方法执行失败无返回数据是什么原因?
PHP PDO prepare执行成功但execute无响应、无报错问题排查
问题现象
- 学习PHP OOP搭建网站过程中,按教程使用PDO连接SQL数据库,完全复刻教程步骤后,PDO查询无法正常拉取数据库数据
- 代码运行无任何报错提示,逐行添加输出语句排查执行链路,确认SQL语句可成功完成prepare步骤,但执行到execute环节就终止,后续代码完全不运行
- 单独测试数据库连接逻辑,判断连接功能可正常工作
相关代码片段
数据库连接类
class Database{ private function connect() { $string = DBDRIVER . ":host =" .DBHOST.";dbname =".DBNAME; if ($conn = new PDO($string, DBUSER, DBPASS)) { return $conn; } else { die("Could not connect to database"); } } }
通用查询方法
经排查,代码执行到$stm->execute($data)行即停止,后续print_r($check)无任何输出:
public function query($query, $data = array(), $data_type = "object") { $con = $this->connect(); $stm = $con->prepare($query); print_r($stm); if ($stm) { $check = $stm->execute($data); // 代码执行到此处终止 print_r($check);// 无任何输出 if ($check) { if ($data_type == "object") { $data = $stm->fetchAll(PDO::FETCH_OBJ); } else { $data = $stm->fetchAll(PDO::FETCH_ASSOC); } if (is_array($data) && count($data) > 0) { return $data; } } } return false; }
控制器调用逻辑
执行查询时echo $data无输出,返回值为空:
function index(){ $db = new Database(); $data = $db->query("select * from users"); if($data){echo $data;} // 无输出,$data为空 $this -> view('home', ['rows' => $data]); }
问题修复方案
1. 修正DSN连接字符串格式错误
当前DSN字符串里,host =、dbname =的等号两侧加了多余空格,PDO无法正确解析这两个连接参数,虽然初始化PDO对象时没有直接抛出连接错误,但后续执行查询时会静默失败。
去掉等号两侧的空格即可:
$string = DBDRIVER . ":host=" . DBHOST . ";dbname=" . DBNAME;
2. 开启PDO异常报错模式
当前PDO初始化逻辑没有设置错误模式,PDO默认使用PDO::ERRMODE_SILENT静默模式,出错时不会输出任何错误提示,这也是看不到报错、只看到代码中断的核心原因。
初始化连接后添加属性配置,开启异常报错,同时关闭模拟预处理避免额外兼容问题:
if ($conn = new PDO($string, DBUSER, DBPASS)) { // 开启异常报错,出错时直接抛出异常方便排查 $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 使用数据库原生预处理,关闭PDO模拟预处理 $conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); return $conn; }
3. 修正调试输出逻辑
控制器里直接用echo输出查询结果是错误的:query方法返回的是对象/数组格式的结果集,echo无法直接输出数组/对象,就算查询成功也不会有正常输出,调试时请用print_r()或者var_dump()打印结果。
内容的提问来源于stack exchange,提问作者Ezra
相关产品推荐
相关产品推荐

