CodeIgniter不引发数据库错误

时间:2018-10-20 20:24:09

标签: php codeigniter error-handling

真的可以使用一些帮助。我正在使用CodeIgniter 3.0,并且正在尝试设计它,以便将数据库错误捕获在try catch块中,并且在catch块中,我可以获得数据库错误的详细描述,然后代码将在catch之后继续执行

我尽力做到的是抛出错误,但是我无法获得消息的描述,因此消息毫无用处。

在index.php中,我已设置:

define('ENVIRONMENT', isset($_SERVER['CI_ENV']) ? $_SERVER['CI_ENV'] : 'development');

在config.php中,我有

$config['log_threshold'] = 4;
$config['log_path'] = '';
$config['log_file_extension'] = '';
$config['log_file_permissions'] = 0644;
$config['log_date_format'] = 'Y-m-d H:i:s';
$config['error_views_path'] = '';

在database.php中,我有

$active_group = 'default';
$query_builder = TRUE;
$db['default'] = array(
    'dsn'   => '',
    'hostname' => $hostname,
    'username' => $username,
    'password' => $password,
    'database' => $database,
    'dbdriver' => 'mysqli',
    'dbprefix' => '',
    'pconnect' => FALSE,
    'db_debug' => FALSE,
    'cache_on' => FALSE,
    'cachedir' => '',
    'char_set' => 'utf8',
    'dbcollat' => 'utf8_general_ci',
    'swap_pre' => '',
    'encrypt' => FALSE,
    'compress' => FALSE,
    'stricton' => FALSE,
    'failover' => array(),
   'save_queries' => TRUE
);

然后我有一个实际的模型,其中一些代码通过ajax执行。基本上就是这个

try {

    $batch = array();
    for ( $x = 0; $x < count($selectedIds); $x++ ) {
        $data = array(
            "picklist_id" => $picklistId,
            "item_index" => $selectedIds[$x],
            "text" => $selectedTexts[$x]
        );
        $batch[] = $data;
    }

    if( !$this->db->insert_batch("p_picklists_created_selecteds", $batch) ) 
    {
        throw new Exception('DB error');
    }

} catch (Exception $ex) {

    $this->M_debug->log("ERROR!!!!");
    $this->M_debug->log($this->db->error()['message']);
    // output the error
    $this->M_debug->logError($ex);

}   

我要捕获的数据库错误是实际上没有名为p_picklists_created_selecteds的表,因此insert_batch查询失败。

现在,我已经设法使它按我提到的方式工作。检查查询是否为假会导致引发异常。但是调用我的自定义M_debug模型以记录$ this-> db-> error()['message'])的结果。只会导致一个空字符串。我只知道手动检查代码的实际错误是什么,将来我需要知道实际的消息。

此外,我不确定所有CI数据库失败的查询都将返回false(是吗?),如果我可以检查某种类型的db错误,就很好了,类似

$this->db->insert_batch("p_picklists_created_selecteds", $batch)
if ( $this->db->error()['code'] != 0 ) {
    // throw error
}

代替

if( !$this->db->insert_batch("p_picklists_created_selecteds", $batch) ) 
{
    throw new Exception('DB error');
}

但这没有效果。

另外,您可能会认为在database.php中设置'db_debug'=> TRUE可能会有所帮助,但是如果我这样做,那么我可以在chrome控制台中得到某种数据库错误消息,这很好,但是上面的代码不会抛出错误,换句话说,异常块中的代码不会执行,并且代码不会继续执行,一切都只是在ajax请求中的错误处停止

任何帮助将不胜感激。谢谢

0 个答案:

没有答案