PHP PDO没有捕获致命错误SQL异常

时间:2016-02-20 14:40:26

标签: php mysql pdo

修改:我已经尝试了“可能重复”帖子中的解释。没工作。正如我所解释的那样,除了一些罕见的情况外,几乎总是会遇到异常。我的答案中的一个例子是其中一个案例,它认为这与格式错误的SQL语句有关。但我需要抓住异常,而不是解决它。

我到处寻找,无法找到解决问题的方法。使用PDO我几乎可以捕获每个异常但有时它不起作用。

这里是我使用的代码

获取PDO实例的Helper类:

    <?PHP

    class DBH {

        protected static $cn;

        private function __construct() {

            //HERE I REMOVED DATABASE VARIABLES FOR PRIVACY

            $dsn = "mysql:host=$dbIp;port=$dbPort;dbname=$dbDbase";

            try {
                self::$cn=new PDO($dsn, $dbUte, $dbPass);
                self::$cn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            } catch (PDOException $e) { $this->exErr($e->getMessage(),"DbHelper __construct()"); }
        }

        public static function getDatabaseHandler() {
            if (!self::$cn) {
                //new connection object.
                new DBH();
            }

            //return connection.
            return self::$cn;
        }

        private function exErr($msg,$func) {
            $response["result"] = "error";
            $response["function"] = $func;
            $response["errmsg"] = $msg;
            echo json_encode($response);
            exit;
        }
    }

    ?>

这是一个示例函数:

    <?PHP
    include_once 'DBH.php';

    class Example {

        private $cn;

        private function __construct()  {
            $this->cn = DBH::getDatabaseHandler();  
        }

        private function exampleFunction() {
            try {
                $query = $this->cn->prepare("DELETE FROM examples WHERE did= ? AND (kind='examplekind' AND action != 0 AND action != 2 AND action != 13) OR (kind='examplekind2' AND action != 0 AND action != 2 AND action != 13) OR kind='exampleKind3'");
                $query->execute(array($this->uid));
            } catch (PDOException $e) { $this->exErr($e->getMessage(),"exampleFunction()"); }
        }

        private function exErr($msg,$func) {
            $response["result"] = "error";
            $response["function"] = $func;
            $response["errmsg"] = $msg;
            echo json_encode($response);
            exit;
        }
    }
    ?>

正如我所说,一切都按预期工作,除了少数情况,如上面的情况。如果我在exampleFunction()中使用查询,则会抛出致命错误,但不会被异常捕获。有人能解释我为什么吗?感谢

0 个答案:

没有答案