处理数据库错误并显示给用户


Handling db errors and showing to the user

我有一个很简单的问题。

是否有办法将数据库错误与格式良好的警告联系起来?

我的意思是,例如一个用户在一个网站注册,他/她选择的用户名已经被采取,所以当保存到数据库时,发生以下错误:

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'peter' for key 'username'

我真的不想把这个显示给用户,而是像这样:"选择的用户名已被占用"

识别错误并输出格式良好的警告的最佳方法是什么?

Thanks in advance

首先执行一个select查询来检查用户名是否已被占用。只有当它不是,你才插入它。

理想情况下,您可以锁定表,或者使用事务,但实际上,如果两个查询离彼此很近,则可能可以

您可以先检查用户名是否被占用:

$num_rows_aff = SELECT * FROM table where username = 'peter';
If($num_rows_aff > 0)
{
  // Username exists, Output "Username is taken";
}else{
  // Insert username into database
}

您可以尝试编写一些基本的数据库函数,如exists()等,您可以传递一个自定义的错误字符串。像这样:

<?php
class DB {
    private $_instance;
    public function __construct() {
        $this->_instance = new MySQLI('server','username','password','database');
    }
    public function exists($sql, $msg) {
        $result = $this->_instance->query($sql);
        if ($result->num_rows > 0) {
            throw new FrontDBException($msg);
        }
        return false;
    }
}
class FrontDBException extends Exception {
    public function __toString() {
        echo($this->getMessage());
    }
}
$db = new DB();
try {
    $db->exists('SELECT id FROM users WHERE username="' . $username . "'",
            'Username is already taken.');
} catch(FrontDBException $e) {
    echo($e);
}
?>

但是你不能真正预测传入的错误,当你只是做基本的查询时,你需要把它包装在特定的函数中