PDO执行INSERT语句未插入数据 如何输出缺失表/列等错误信息
问题排查及解决方法
直接报错原因
你遇到的Undefined variable: e报错,是因为你把调用$e->getMessage()的调试代码写在了catch块之外,$e是catch的入参,只有触发异常进入catch块时才会被定义,try块内不存在这个变量。
无数据写入的核心原因
你的PDO连接默认是静默错误模式,SQL执行出错时不会抛出PDOException,所以不会进入catch块,你没有判断execute()方法的返回值,才会误以为执行成功。
正确输出SQL错误的方案
方案1:开启PDO异常模式(推荐)
在你的两个PDO连接实例$this->account、$this->player初始化的位置,添加配置开启异常模式:
// PDO实例化后添加以下代码,两个数据库连接都要配置 $this->account->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $this->player->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
之后把catch块中//echo $e->getMessage();的注释去掉,删除你写在try块里的$e相关调试代码,后续SQL执行出错(缺失表、字段、约束不满足等)都会自动进入catch块,直接用echo $e->getMessage()就能输出完整错误信息。
方案2:不修改错误模式,直接获取语句错误
如果不想调整全局错误配置,每次调用execute()之后,输出$stmt->errorInfo()即可拿到错误详情:
$stmt->execute(); // 加这行输出错误 var_dump($stmt->errorInfo());
errorInfo()返回的数组第二位是SQL错误码,第三位是具体错误描述,缺失表、字段的错误会直接展示在里面。
额外优化建议
execute()方法执行成功返回true,失败返回false,你当前没有判断执行结果,建议加上校验逻辑避免误判执行状态:
if (!$stmt->execute()) { var_dump($stmt->errorInfo()); // 错误处理逻辑 exit; }
内容的提问来源于stack exchange,提问作者Vasilica Dimancescu
相关产品推荐
相关产品推荐

