似乎无法通过codeigniter中的try catch块捕获MySQL错误

问题描述

|| 我通过ajax将数据发布到我的控制器,该控制器进行一些验证并将其发送给模型。我的表具有唯一索引以防止重复。唯一插入效果很好,我的问题是我似乎无法捕获重复的错误并进行处理。 型号代码函数insert($ data){
    //die($this->db->last_query);

    try{
        $query = $this->db->insert(\'subscriber\',$data);
    } catch (Exception $e) {
         echo \'Caught exception: \',$e->getMessage(),\"\\n\";
    }



    if($query){
        return true;
    } else {
        return false;
    }

}
jQuery ajax调用函数runAjax(){
$(\'#theform\').append(\'<p id=\"loading\"><img src=\"<?PHP echo base_url();?>\' + \'images/loader.gif\"/>\');

$.ajax({
   type: \"POST\",cache: false,url: \"<?PHP echo base_url();?>\" + \'contact/mail\',data: \'fname=\' + $(\'#fname\').val() + \'&lname=\' + $(\'#lname\').val() + \'&email=\' + $(\'#email\').val(),success: function(msg){

   $(\'#response\').remove();
   $(\'#theform\').append(\'<p id=\"response\">\' + msg + \'</p>\');
   $(\'#loading\').fadeOut(500,function() {
        $(this).remove();
    });
   },error: function(msg){
   $(\'#theform\').append(\'<p id=\"response\">\' + msg + \'</p>\');
   }
});     

解决方法

来自MySQL的错误不会作为异常抛出,因此您无法捕获它们。 相反,如果查询结果为空,则可以使用db-> _ error_message()和db-> _ error_number()(http://codeigniter.com/forums/viewthread/79950/#413830)打印消息。这样,您可以按以下方式重写代码:
    $query = $this->db->insert(\'subscriber\',$data);

    if($query){
        return true;
    } else {
        $msg = $this->db->_error_message();
        $num = $this->db->_error_number();
        // Do something with msg and num
        return false;
    }
还要注意,只有在执行请求时出错时,才会调用
$.ajax
中的
error
。即使您的数据库查询失败,它也不会使Ajax查询失败。因此,您将永远不会出现Ajax错误。 我在这里看到两个选择: 1)使HTTP请求以某种方式失败(例如,返回HTTP 404错误)。 2)在
success
方法而不是
error
中处理MySQL错误:
success: function(msg){

   if ( msg == \'yoursuccessmessage\' ) {
      // Handle success
   } else {
      // Handle error
   }
},
    ,
try{
    $this->db->trans_start();

    $q = $this->db->query(\'SELECT qty as num FROM tbl_stock_materials WHERE smId = \'.$smid);
    $row = $q->result();
    if($row->num < $qty)
    {
        $nQty = $qty - $row->num;
        $this->db->query(\'INSERT INTO tbl_qty_materials(qty,date_in,smId,cId,subId) VALUES(\'.$nQty.\',\"\'.date(\'d-M-Y\').\'\",\'.$smid.\',\'.$cat.\',\'.$sub.\')\');    
    }

    $data = array(
        \'qty\'       =>      $qty
    );

    $this->db->where(\'smId\',$smid);
    $up = $this->db->update(\'tbl_stock_materials\',$data);

    $this->db->trans_complete();
}
catch(Exception $ex)
{
    show_error($ex);
}