Похоже, не удается перехватить ошибку MySQL с помощью блока try catch в codeigniter

#ajax #codeigniter

#ajax #codeigniter

Вопрос:

Я отправляю данные через ajax на свой контроллер, который выполняет некоторую проверку и отправляет их модели. Моя таблица имеет уникальный индекс для предотвращения дубликатов. Уникальные вставки работают нормально, моя проблема в том, что я не могу поймать повторяющуюся ошибку и справиться с ней.

Код модели: вставка функции ($ 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()   'amp;lname='   $('#lname').val()   'amp;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>');
   }
  

});

Ответ №1:

Ошибки из MySQL не выдаются как исключения, и, следовательно, вы не можете их перехватить.

Вместо этого, если вы запрашиваете результаты null, вы можете распечатать сообщения с помощью 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;
    }
  

Также обратите внимание, что error inside $.ajax вызывается только в том случае, если при выполнении запроса возникает ошибка.Даже если ваш запрос к базе данных завершается с ошибкой, это все равно не приводит к сбою запроса Ajax. Следовательно, вы никогда не обнаружите ошибку Ajax.

Я вижу здесь два варианта:

1) Каким-либо образом выполнить сбой HTTP-запроса (например, вернуть ошибку HTTP 404).

2) Обработайте свои ошибки MySQL внутри success метода, вместо error :

 success: function(msg){

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

Комментарии:

1. Я пробовал это, но как только запрос завершается неудачей, ответ ajax является Object object . Если запрос завершается неудачно, я хочу иметь возможность выдавать пользовательское сообщение типа «вы уже зарегистрировались». Вместо этого я просто возвращаю Object object обратно.

2. Спасибо. Я подумал, что это связано с выполнением HTTP-запросов. Мне пришлось переместить jQuery из файла ресурсов и поместить в свой документ, чтобы заставить его работать не так, как я хотел. Когда это было в файле активов, он даже не запускал запрос.

Ответ №2:

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

Комментарии:

1. Спасибо за публикацию ответа! Хотя фрагмент кода может ответить на вопрос, все равно здорово добавить некоторую дополнительную информацию, например, explain и т.д..