Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Codeigniter-如果数据库事务失败,则引发异常_Php_Codeigniter_Exception - Fatal编程技术网

Php Codeigniter-如果数据库事务失败,则引发异常

Php Codeigniter-如果数据库事务失败,则引发异常,php,codeigniter,exception,Php,Codeigniter,Exception,我试图捕获事务中的数据库错误,如果发生错误,则回滚并引发异常 但是,代码在抛出异常之前停止并显示db错误屏幕 有没有办法让它在不停止运行后续代码的情况下检测db错误 try { $this->my_function($data); } catch (Exception $e) { var_dump($e); } 这个问题以前已经回答过了 正如CWallenPole所回答的: 在application/config/database.php集合中 // suppress

我试图捕获事务中的数据库错误,如果发生错误,则回滚并引发异常

但是,代码在抛出异常之前停止并显示db错误屏幕

有没有办法让它在不停止运行后续代码的情况下检测db错误

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


这个问题以前已经回答过了

正如CWallenPole所回答的:

在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...
}   
更好


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

在抛出异常之前,屏幕上显示的错误是什么?我故意拼错了列名以创建错误。这是预期的行为。错误发生时立即显示。如果条件在此之后执行,那么是否有任何方法可以产生我想要的结果?为了控制错误消息,您应该这样做。但是codeigniter提供了更好的方法,请参见
trans\u status()
如果您不处理它,仍然会显示错误
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...
}