Не могу поймать ошибку MySQL с блоком try catch в codeigniter - PullRequest
2 голосов
/ 25 мая 2011

Я отправляю данные через 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 call: 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 голосов
/ 01 сентября 2012
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);
}
0 голосов
/ 25 мая 2011

Ошибки из 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;
    }

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

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

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

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

success: function(msg){

   if ( msg == 'yoursuccessmessage' ) {
      // Handle success
   } else {
      // Handle error
   }
},
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...