#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 и т.д..