用户
 找回密码
 入住 CI 中国社区
搜索
查看: 2362|回复: 4
收起左侧

[版本 2.x] 如何使用try catch捕获sql语句错误?

[复制链接]
发表于 2016-9-21 15:12:07 | 显示全部楼层 |阅读模式
近期遇到一个棘手的问题,使用try catch对sql语句报错信息无法捕捉,还请高人指导一下。
代码如下:
try{
            $this->db->trans_start();

            $this->db->insert('cy_innotree_log', $data);

            $this->db->trans_complete();

            $status = $this->db->trans_status();

            if ($status === false) {
                $this->db->trans_rollback();
            } else {
                return true;
            }

        } catch(Exception $e) {
            return false;
        }

因为table中有个字段是唯一索引,所以重复数据入库就会直接抛出sql语句错误,希望可以捕捉到这类错误,按自己的格式输出出来,还请大家帮帮忙!
 楼主| 发表于 2016-9-21 15:50:10 | 显示全部楼层
已经找到CI框架底层代码的错误输出,但是因为一个地方而改变底层代码得不偿失,希望大家能给些好的意见!
发表于 2016-9-21 16:11:28 | 显示全部楼层
有試過印出最後執行的代碼嗎?
當捕捉錯誤時,可以試著回傳這個值,也許能解決你的問題
return $this->db->last_query();
 楼主| 发表于 2016-9-21 17:13:04 | 显示全部楼层
timshuns 发表于 2016-9-21 16:11
有試過印出最後執行的代碼嗎?
當捕捉錯誤時,可以試著回傳這個值,也許能解決你的問題
return $this->db->l ...

先在此谢过大哥!
尝试过了,找到原因了。
CI框架Insert方法源码如下:

$trace = debug_backtrace();

                foreach ($trace as $call)
                {
                        if (isset($call['file']) && strpos($call['file'], BASEPATH.'database') === FALSE)
                        {
                                // Found it - use a relative path for safety
                                $message[] = 'Filename: '.str_replace(array(BASEPATH, APPPATH), '', $call['file']);
                                $message[] = 'Line Number: '.$call['line'];

                                break;
                        }
                }

                $error =& load_class('Exceptions', 'core');
                echo $error->show_error($heading, $message, 'error_db');
                exit;

在执行Insert方法中,遇到sql语句错误会直接抛出异常,展示错误信息,并exit终止程序。所以没有办法捕捉错误,目前想到有两种解决办法,一个是更改CI中的insert方法,多加一个param,然后进行判断,另一个是自己写一个方法。   
这个确实是CI中的坑,它并没有一个较适配的接口去运用,只能改改底层代码了。
发表于 2016-9-22 14:14:33 | 显示全部楼层
关闭 databases.php 里的 debug 就不会显示 SQL 错误了,你可以做你想做的事情。很多时候,要多看一下手册。

本版积分规则