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

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

dupicate key in table

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

【问题讨论】:

    标签: php database 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 错误,因为表单验证会为您处理一切。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-12
      • 2017-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-06
      相关资源
      最近更新 更多