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

Php 在CodeIgniter中处理数据库错误的最佳实践,php,database,codeigniter,Php,Database,Codeigniter,我的web应用程序数据库中有一个带有唯一键(date+userid)的表。当我尝试插入带有现有日期和用户ID的记录时,我收到以下错误: dupicate key in table 我在应用程序配置中打开了数据库调试器,因为我需要使用MySQL错误号和消息。现在我需要处理这个错误。我可以在控制器中使用硬编码常量,但我认为这不是个好主意。我需要在许多地方处理数据库错误,我不喜欢CodeIgniter的错误处理。关于数据库错误处理的最佳实践是什么。我们在项目建设中使用的方法如下: $this->

我的web应用程序数据库中有一个带有唯一键(
date
+
userid
)的表。当我尝试插入带有现有
日期
用户ID
的记录时,我收到以下错误:

dupicate key in table

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

我们在项目建设中使用的方法如下:

$this->db->_error_number();  
$this->db->_error_message();
但这种未记录的函数在下一个版本中可能会改变。 当然,您可以简单地使用标准php for mysql错误处理函数:

mysql_errno()  
mysql_error()
CI内部使用这些函数

对我来说,最佳实践是在定制模型的基类(BaseModel)中使用

并确定错误,下一次抛出异常,信息错误消息取自

$this->db->_error_message();

您的所有模型都是从BaseModel派生的,并且调用方法来检查上次的db错误请求,您的模型必须处理异常,并对其进行处理(可能是额外的日志),当然您可以将检查结果作为结果值来实现,并避免抛出异常。

对此我有不同的建议,我将推荐此方法

$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();
}

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

我也使用此功能。BaseModel这是个好主意,我考虑过了。谢谢带有模型处理异常的IMO抛出异常方法有点困难,而且不透明。我需要在查询运行后立即处理简单的错误。我需要根据_error_number()做出决定
public function emailAvailability($email)
{
    $this->db->where('email',$email);
    $query  =   $this->db->get('tablename');
    return $query->row();
}