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

Posted

技术标签:

【中文标题】CodeIgniter 中处理数据库错误的最佳实践【英文标题】:Best Practices for Processing Errors from Database in CodeIgniter 【发布时间】:2010-10-18 13:28:32 【问题描述】:

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

dupicate key in table

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

【问题讨论】:

【参考方案1】:

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

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

但是这个未记录的函数和在下一个版本中可能会改变。 当然你可以简单地使用标准的php for mysql错误处理函数:

mysql_errno()  
mysql_error()

CI 在内部使用这些函数。

对我来说,最好的做法是在自定义模型的基类(BaseModel)中使用

$this->db->_error_number();

并确定错误,然后抛出异常,并从

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

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

【讨论】:

我也使用这个功能。 BaseModel 是个好主意,我考虑了一下。谢谢。模型处理异常的 IMO 抛出异常方法有点困难且不透明。我需要在查询运行后立即出现简单的处理错误。比我需要做决定依赖 _error_number()【参考方案2】:

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

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

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

【讨论】:

以上是关于CodeIgniter 中处理数据库错误的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

将特定页面限制为仅在 Codeigniter 中登录用户的最佳实践是啥?

Codeigniter 资产文件夹最佳实践

Codeigniter - 清理输入的最佳实践

使用 codeigniter 实现动态菜单/页眉/页脚的最佳方法

在 redux 中处理异步操作错误的最佳实践是啥?

如何在codeigniter中设置持久登录?