2009-04-09 96 views
5

我在我的Web应用程序数据库中有一个包含唯一键(date + userid)的表。当我尝试插入记录与现有dateuserid我收到以下错误:在CodeIgniter中处理数据库错误的最佳实践

dupicate key in table 

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

回答

9

我们在项目建设使用这样的:

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

但这无证功能和下一个版本,这可能改变。 当然你也可以简单地使用标准的PHP MySQL的错误处理功能:

mysql_errno() 
mysql_error() 

内部CI使用这些功能。

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

$this->db->_error_number(); 

,并确定错误的信息的错误消息下一抛出异常从

$this->db->_error_message(); 

所有模型拍摄派生自BaseModel,并调用方法来检查最后一次请求db错误,并且你的Model必须处理异常,并对它进行处理(可能会另外记录),当然你可以将检查结果作为结果值执行,避免抛出异常。

+0

我也使用这个功能。 BaseModel是个好主意,我想一想。谢谢。 IMO抛出异常方法与模型处理异常是有点困难,不透明。查询运行后,我需要立即处理简单的错误。比我需要做出决定依靠_error_number() – drnk 2009-04-09 13:44:04

+0

这些不是构造函数,但很好的答案。 – Zack 2010-05-01 13:49:27

0

我有不同的建议,为了这个,我会推荐这

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

这样你就永远避免正面数据库错误,并能得到用户看到的东西更好的方法。你不必处理数据库错误,因为表单验证正在为你处理所有事情。