真的可以使用一些帮助。我正在使用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请求中的错误处停止
任何帮助将不胜感激。谢谢