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