似乎无法在codeigniter中使用try catch块捕获MySQL错误

时间:2011-05-25 18:46:57

标签: ajax codeigniter

我通过ajax将数据发布到我的控制器,该控制器进行一些验证并将其发送给模型。我的表有一个唯一的索引来防止重复。独特的插入工作正常,我的问题是我似乎无法捕获重复的错误并处理它。

型号代码: function 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调用: function 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>');
   }

});

2 个答案:

答案 0 :(得分:0)

来自MySQL的错误不会被视为异常,因此您无法捕获它们。

相反,如果查询结果为null,则可以使用db-&gt; _error_message()和db-&gt; _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;
    }

另请注意只有在执行请求时出现错误才会调用error内的$.ajax即使您的数据库查询失败,它仍然无法生成Ajax查询失败。因此,您永远不会出现Ajax错误。

我在这里看到两个选项:

1)以某种方式使HTTP请求失败(例如,返回HTTP 404错误)。

2)在success方法中处理MySQL错误,而不是error

success: function(msg){

   if ( msg == 'yoursuccessmessage' ) {
      // Handle success
   } else {
      // Handle error
   }
},

答案 1 :(得分:0)

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);
}