我的Web应用程序数据库中有一个包含唯一键(date
+ userid
)的表。当我尝试插入包含现有date
和userid
的记录时,我收到以下错误:
dupicate key in table
我在应用程序配置中打开了数据库调试器,因为我需要使用MySQL错误号和消息。现在我需要处理这个错误。我可以在控制器中使用硬编码常量,但我认为这不是一个好主意。我需要在很多地方进行数据库错误处理,我不喜欢CodeIgniter的错误处理。有关处理数据库错误的最佳做法是什么。
答案 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();
}
通过这种方式,您将始终避免前端的数据库错误,并且可以让用户以更好的方式查看内容。您不必处理数据库错误,因为表单验证正在为您处理所有事情。