处理db错误并向用户显示

时间:2011-08-07 11:13:37

标签: php database web

我有一个非常简单的问题。

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

我的意思是例如用户在网站中注册并且他/她选择的用户名已被采用,因此在保存到数据库时会发生以下错误:

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

我真的不想向用户展示这个,但更像是: “已选择的用户名已被采用”

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

提前致谢

3 个答案:

答案 0 :(得分:0)

首先执行选择查询以检查是否已使用用户名。只有在不插入的情况下才会插入。

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

答案 1 :(得分:0)

您可以先检查是否已使用用户名:

$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
}

答案 2 :(得分:0)

您可以尝试编写一些基本的数据库函数,例如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);
}

?>

但是你无法真正预测传入的错误,当你只是进行基本的查询时,你需要将它包装在特定的函数中。