【问题标题】:Codeigniter - throw exception if database transaction failsCodeigniter - 如果数据库事务失败则抛出异常
【发布时间】:2017-02-19 21:06:42
【问题描述】:

我正在尝试在事务中捕获数据库错误,如果发生错误,则回滚并抛出异常。

但是,代码在引发异常之前会停止并显示 db 错误屏幕。

有什么想法可以让它在不停止运行后续代码的情况下检测 db 错误吗?

try {
    $this->my_function($data);
} catch (Exception $e) {
    var_dump($e);
}

private function my_function($data)
{

    $this->db->trans_start();
    foreach($data as $reg)
    {
        $sql = $this->db->insert_string('my_table', $reg);
        if($this->db->query($sql))
        {
            continue;
        } else {
            $this->db->trans_rollback();
            throw new Exception('Exception message here...');
        }
    }
    $this->db->trans_complete();

}

【问题讨论】:

  • 在引发异常之前屏幕上显示的错误是什么?
  • 我故意拼错列名以造成错误
  • 这是预期行为。错误发生时立即显示。如果条件在那之后执行
  • 那么有什么方法可以产生我想要的结果吗?
  • 你应该 handle exception 来控制错误消息。但是 codeigniter 提供了更好的方法来做到这一点见 trans_status() codeigniter.com/user_guide/database/transactions.html.but 如果你不处理它仍然会显示错误

标签: php codeigniter exception


【解决方案1】:

这已经在this问题上回答过

如 cwallenpoole 所回答:

在 application/config/database.php 中设置

// suppress error output to the screen
$db['default']['db_debug'] = FALSE;

在您的模型或控制器中:

// try the select.
$dbRet = $this->db->select($table, $dataArray);
// select has had some problem.
if( !$dbRet )
{
   $errNo   = $this->db->_error_number()
   $errMess = $this->db->_error_message();
   // Do something with the error message or just show_404();
}

或者在你的情况下:

private function my_function($data)
{
    $errors = array();
    $this->db->trans_start();
    foreach($data as $reg)
    {
        $sql = $this->db->insert_string('my_table', $reg);
        if($this->db->query($sql))
        {
            continue;
        } else {
            $errNo   = $this->db->_error_number()
            $errMess = $this->db->_error_message();
            array_push($errors, array($errNo, $errMess));
        }
    }
    $this->db->trans_complete();
    // use $errors...
}   

更好

我相信this question 有你需要的所有答案,因为它考虑了多次插入,让你完成一次没有返回错误的插入。

【讨论】:

    猜你喜欢
    • 2017-03-13
    • 2011-09-18
    • 2012-08-23
    • 2023-01-22
    • 1970-01-01
    • 2017-03-17
    • 2018-03-06
    • 2018-10-23
    • 1970-01-01
    相关资源
    最近更新 更多