php pdo使用规范核心是统一连接管理、参数化查询防注入、异常处理标准化、资源及时释放;需封装pdo为单例或依赖注入,强制预处理语句,事务成对出现,大结果集流式处理。

PHP PDO 的使用规范核心在于统一连接管理、参数化查询防注入、异常处理标准化、资源及时释放。代码重构不是重写,而是把散乱的数据库操作收束为可复用、可测试、易维护的结构。
统一 PDO 实例与连接管理
避免在每个方法里 new PDO,容易导致重复连接、配置不一致、无法复用连接池特性(如持久连接)。应封装为单例或依赖注入的连接工厂。
- 使用静态属性或容器管理唯一 PDO 实例,连接参数(DSN、用户、密码)从配置文件读取,不硬编码
- 开启
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,让错误抛出异常而非静默失败或返回 false - 启用
PDO::ATTR_PERSISTENT => true(仅适用于长生命周期服务,如 CLI 或常驻进程),注意连接状态残留问题 - 设置
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4"确保字符集统一,避免乱码
强制使用预处理语句,杜绝字符串拼接 SQL
所有变量值必须通过 bindParam() 或 execute([$params]) 绑定,禁止用 . 或 sprintf 拼接 SQL 字符串。
- WHERE 条件、INSERT 值、UPDATE SET 字段值、LIMIT 数字等,只要含用户输入或动态内容,一律参数化
- 表名、字段名、ORDER BY 字段不能参数化,需白名单校验或映射转换(例如:$sortField = in_array($input, ['created_at', 'status']) ? $input : 'id';)
- 批量插入用
INSERT INTO t (a,b) VALUES (?,?), (?,?)+ 多参数 execute,比循环单条 insert 效率高且安全
事务与异常处理要成对出现
涉及多条写操作(如转账、订单创建+库存扣减)必须显式事务,并确保 rollback 在 catch 中无条件执行。
立即学习“PHP免费学习笔记(深入)”;
- 用 try-catch 包裹 beginTransaction() → 执行逻辑 → commit(),catch 中先 rollback() 再 re-throw 或记录日志
- 避免在事务中调用可能长时间阻塞或外部依赖(如 HTTP 请求、文件读写),防止事务超时或锁表
- 不手动 setAttribute(ERRMODE) 覆盖全局设置;若需局部静默错误(极少见),改用 exec() + errorCode() 判断,而非关闭异常模式
查询结果处理标准化,避免内存泄漏
大结果集不用 fetchAll() 一次性加载,小结果优先用 fetch() 或 fetchColumn();语句执行后及时释放。
- SELECT 单行单列(如 COUNT、ID)→ 用
fetchColumn() - SELECT 单行 → 用
fetch(PDO::FETCH_ASSOC) - 需遍历大量数据 → 用
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { ... }流式处理 - 执行完查询后,显式调用
$stmt = null或让其自动超出作用域,有助于 GC 回收 Statement 对象(尤其在长循环中)











