以下是三种PDO错误处理模式的最佳实践案例,结合具体场景和使用建议:
一、静默模式(PDO::ERRMODE_SILENT)最佳实践
适用场景:生产环境高频操作、批量数据处理
// 批量插入数据(生产环境)
$pdo = new PDO($dsn, $user, $pass);
$stmt = $pdo->prepare("INSERT INTO log (event, detail) VALUES (?, ?)");
foreach ($logs as $log) {
$result = $stmt->execute([$log['event'], $log['detail']]);
if ($result === false) {
$error = $stmt->errorInfo();
// 记录到日志系统,不中断流程
error_log("DB ERROR [{$error[0]}]: {$error[2]} - Data: ".json_encode($log));
}
}核心实践:
高频操作中避免异常处理开销
必须手动检查每次操作的返回值
错误信息记录到日志系统而非显示给用户
配合
errorInfo()获取详细错误三元组12
二、警告模式(PDO::ERRMODE_WARNING)最佳实践
适用场景:开发调试、遗留系统改造
// 开发环境调试
$pdo = new PDO($dsn, $user, $pass, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING
]);
// 故意执行错误SQL
$invalidSql = "SELECT * FROM non_existent_table";
$pdo->query($invalidSql); // 自动触发E_WARNING
// 补充日志记录
if ($pdo->errorCode() !== '00000') {
file_put_contents('sql_errors.log', date('[Y-m-d H:i] ').print_r($pdo->errorInfo(), true), FILE_APPEND);
}核心实践:
开发阶段快速定位SQL语法错误
需设置
display_errors=On查看网页警告配合
error_reporting()控制警告显示级别生产环境应关闭警告显示并启用日志36
三、异常模式(PDO::ERRMODE_EXCEPTION)最佳实践
适用场景:事务操作、关键业务流程
try {
$pdo = new PDO($dsn, $user, $pass, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);
$pdo->beginTransaction();
// 资金转账操作
$stmt1 = $pdo->prepare("UPDATE accounts SET balance=balance-? WHERE id=?");
$stmt1->execute([$amount, $from]);
$stmt2 = $pdo->prepare("UPDATE accounts SET balance=balance+? WHERE id=?");
$stmt2->execute([$amount, $to]);
$pdo->commit();
} catch (PDOException $e) {
$pdo->rollBack();
// 分类处理不同错误
switch ($e->errorInfo[0]) {
case '23000': // 唯一键冲突
return "操作失败:数据已存在";
case '40001': // 死锁
retryTransaction();
default:
notifyAdmin($e);
return "系统繁忙,请稍后再试";
}
}核心实践:
事务操作中自动回滚保障数据一致性
通过
$e->errorInfo实现精细化错误分类处理敏感信息过滤后再返回给客户端
结合全局异常处理器统一管理810
模式选择建议表
动态切换示例:
// 高频操作前切换静默模式 $origMode = $pdo->getAttribute(PDO::ATTR_ERRMODE); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT); // 执行批量插入... // 恢复原模式 $pdo->setAttribute(PDO::ATTR_ERRMODE, $origMode);此方案兼顾性能与安全性