如何优雅地显示数据库错误?(例如 SQLSTATE[23000]: ..)


How do I display database errors gracefully? (e.g. SQLSTATE[23000]: ...)

我在用户表列(电子邮件、用户名)上设置了两个唯一索引,但是当我尝试使用已获取的电子邮件和已获取的用户名注册新用户时,它按预期显示异常。但是,它只在电子邮件列上显示异常,而不是用户名:

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'martynbissett@yahoo.co.uk' for key 'email_2'

在我的代码中,我尝试做这样的事情:

try {
    // attempt to save
} catch('Exception $e) {
    switch($e->getCode()) {
        case 23000:
            $this->flash->error('Email(?) address already taken'); // or is it username?
            break;
        default:
            $this->flash->error($e->getMessage());
    }
}

另外,您可以看到我想呈现比SQLSTATE[23000]更好的错误消息:完整性恒常... 所以我正在捕获错误代码。但我不知道在任何给定情况下哪一列有问题("电子邮件地址被占用"或"用户名被占用"?

在验证之前,我是否需要对其中每个执行单独的查询?如果我只有一个唯一的索引(例如只有电子邮件),那么我可以依靠异常中的代码,但是如果我有两个......

只需在插入数据库之前进行验证即可。检查指定值是否存在的查询真的很便宜,所以不要害怕。

数据库约束将是额外的保护。

相关文章: