在CodeIgniter中处理数据库错误的最佳实践

时间:2009-04-09 13:06:53

标签: php database codeigniter

我的Web应用程序数据库中有一个包含唯一键(date + userid)的表。当我尝试插入包含现有dateuserid的记录时,我收到以下错误:

dupicate key in table

我在应用程序配置中打开了数据库调试器,因为我需要使用MySQL错误号和消息。现在我需要处理这个错误。我可以在控制器中使用硬编码常量,但我认为这不是一个好主意。我需要在很多地方进行数据库错误处理,我不喜欢CodeIgniter的错误处理。有关处理数据库错误的最佳做法是什么。

2 个答案:

答案 0 :(得分:10)

我们在这样的项目构造中使用:

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

但是这个没有文档的功能,在下一个版本中,这可能会改变。 当然你可以简单地使用标准的php for mysql错误句柄功能:

mysql_errno()  
mysql_error()

内部CI使用这些功能。

至于我,最佳做法是在自定义Model的基类(BaseModel)中使用

$this->db->_error_number();

并确定错误,下一次抛出异常并带有从

获取的信息错误消息
$this->db->_error_message();

所有模型派生自BaseModel,并调用方法来检查db错误的最后请求,并且您的Model必须处理异常,并处理它(可能是另外的日志),当然您可以将检查结果实现为结果值并避免抛出异常。

答案 1 :(得分: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();
}
通过这种方式,您将始终避免前端的数据库错误,并且可以让用户以更好的方式查看内容。您不必处理数据库错误,因为表单验证正在为您处理所有事情。