我通过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>');
}
});
答案 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);
}