You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用try catch捕获PDO插入数据库时的唯一约束重复报错并展示给用户

前置配置:开启PDO异常模式

首先要确保你初始化PDO数据库连接时,已经开启了异常抛出模式,否则PDO默认只会返回错误码不会触发异常,无法被try catch捕获,初始化示例:

$this->connection = new PDO($dsn, $user, $password);
// 开启PDO异常模式
$this->connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

修改后的setData方法实现

public function setData($name, $number, $email, $date)
{
    $data = [
        'name' => $name,
        'number'=> $number,
        'email' => $email,
        'date' => $date
    ];
    try {
        $query = $this->connection->prepare("INSERT INTO Example.users (name, phone_number, email, date_visit)
        values (:name, :number, :email, :date)");
        $query->execute($data);
        return "信息已成功存入数据库";
    } catch (PDOException $e) {
        // 判断是否为唯一键重复错误
        if ($e->getCode() == 23000 && str_contains($e->getMessage(), '1062 Duplicate entry')) {
            // 自定义友好提示,若需要返回原生错误字符串直接替换为 return $e->getMessage();
            return "提交失败:所选日期已存在,请更换日期后重试";
        }
        // 其他数据库错误返回通用提示
        return "数据库操作失败:" . $e->getMessage();
    }
}
  • 不建议给普通用户暴露原生SQL错误,避免泄露数据库结构信息,生产环境优先使用自定义友好提示。
  • 如果需要区分是哪个字段触发的重复校验,可以在错误信息中匹配对应字段名,比如匹配date_visit即可确认是日期字段重复。

内容的提问来源于stack exchange,提问作者Данил Самойленко

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 01:36:08