CodeIgniter 中处理数据库错误的最佳实践
Posted
技术标签:
【中文标题】CodeIgniter 中处理数据库错误的最佳实践【英文标题】:Best Practices for Processing Errors from Database in CodeIgniter 【发布时间】:2010-10-18 13:28:32 【问题描述】:我的 Web 应用程序数据库中有一个带有唯一键 (date
+ userid
) 的表。当我尝试使用现有的 date
和 userid
插入记录时,我收到以下错误:
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 中登录用户的最佳实践是啥?