5

I have a table with a unique key (date + userid) in my web application database. When I try to insert record with existing date and userid I receive the following error:

dupicate key in table

I turned on the database debugger in application config, because I needed to use MySQL error numbers and messages. Now I need to process this error. I can use hard coded constants in the controller, but I think it's not good idea. I need database error handling in many places, and I dont like CodeIgniter's error handling. What is a best practice concerning the processing of database errors.

4

2 回答 2

10

We use in our project constructions like these:

$this->db->_error_number();  
$this->db->_error_message();

but this undocumented functions and in next releases this could change. Of course you can simply use standard php for mysql error handle function:

mysql_errno()  
mysql_error()

internally CI use these functions.

As for me the best practice is use in custom Model's base class (BaseModel)

$this->db->_error_number();

and determine error, next throw exception with information error message taken from

$this->db->_error_message();

All your Model derived from BaseModel, and call method to check last request for db error and your Model must handle exception, and process it (may be additionally log), of course you can implement check result as result value and avoid of throwing exception.

于 2009-04-09T13:22:37.897 回答
1

我对此有不同的建议,我会推荐这个

$this->form_validation->set_rules('email', 'Email', 'required|max_length[32]|valid_email|callback_email_available');

在提交表单时,您需要定义规则。总是使用回调与数据库交互

控制器回调方法

public function email_available($str)
{
    // You can access $_POST variable
    $this->load->model('mymodel');
    $result =   $this->mymodel->emailAvailability($_POST['email']);
    if ($result)
    {
        $this->form_validation->set_message('email_available', 'The %s already exists');
        return FALSE;
    }else{
        return TRUE;
    }
}

和模型方法

public function emailAvailability($email)
{
    $this->db->where('email',$email);
    $query  =   $this->db->get('tablename');
    return $query->row();
}

这样,您将始终避免前面的数据库错误,并且可以让用户以更好的方式查看事物。您不必处理数据库错误,因为表单验证正在为您处理一切。

于 2013-01-22T08:10:37.110 回答