问题描述
||
我通过ajax将数据发布到我的控制器,该控制器进行一些验证并将其发送给模型。我的表具有唯一索引以防止重复。唯一插入效果很好,我的问题是我似乎无法捕获重复的错误并进行处理。
型号代码:
函数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调用:
函数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>\');
}
});
解决方法
来自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;
}
还要注意,只有在执行请求时出错时,才会调用$.ajax
中的error
。即使您的数据库查询失败,它也不会使Ajax查询失败。因此,您将永远不会出现Ajax错误。
我在这里看到两个选择:
1)使HTTP请求以某种方式失败(例如,返回HTTP 404错误)。
2)在success
方法而不是error
中处理MySQL错误:
success: function(msg){
if ( msg == \'yoursuccessmessage\' ) {
// Handle success
} else {
// Handle error
}
},
,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);
}