【问题标题】:PHP: How to catch an exception from a method within another class?PHP:如何从另一个类中的方法捕获异常?
【发布时间】:2015-11-13 12:53:16
【问题描述】:

我正在使用一个类进行数据库连接,这个类包含 CRUD 方法,以及数据库连接方法。

它基本上是使用 DB 的所有其他类的核心。

在插入记录时,我目前在处理唯一列中的重复条目时遇到问题。

Database.class.php insertDB 方法:

class Database {
(...)       
public function insertDB($sql,$params=null){
            $con=$this->connect();
            $query=$con->prepare($sql);
            $query->execute($params);
            $rs = $con->lastInsertId();
            return $rs;
            self::__destruct();
        }
(...)
}

还有一个类,PersonDAO.class.php,是继承Database.class的类。

PersonDAO.class.php有自己的插入记录的方法,最终使用Database.class.php的InsertBD方法。

PersonDAO.class.php 插入方法:(注意它在末尾调用 insertDB)。

class PersonDAO extends Database{
(...)
    public function insert ($fields, $params=null) {
        $numparams="";
        for($i=0;$i<count($params);$i++) $numparams .= ",?";
        $numparams=substr($numparams, 1);
        $sql = "INSERT INTO Person ($fields) VALUES ($numparams)";
        $t=$this->insertDB($sql,$params);
        return $t;
    } 
(...)
}

问题出现在注册表register.php中,当我实例化PersonDAO并使用它的插入方法将重复条目插入到唯一的列中时。

(...)
       $person= new PersonDAO();
       $fields="email,name";
       $email="john@doe.com"; //already existing record. email column set as unique
       $name="John Doe";
       $params=array($email,$name);
       try {
             $rs = $person->insert($fields,$params);
       } catch (PDOException $e) {
             if ($e->errorInfo[1] == 1062) {
                echo "Cannot insert record. Duplicate entry";
             } 
       } 
(...)

它没有捕获重复条目异常,好像没有错误一样。

var_dump($rs) 包含:

string(1) "0"

但它不应该捕获 PDOException 并打印“无法插入记录。重复条目”吗?

【问题讨论】:

标签: php mysql database exception try-catch


【解决方案1】:

是否有任何“未捕获的异常...”消息?也许,您首先需要在 Database.class.php insertDB 方法中捕获异常,然后将其抛出。

class Database {
(...)       
public function insertDB($sql,$params=null){
        try{
            $con=$this->connect();
            $query=$con->prepare($sql);
            $query->execute($params);
            $rs = $con->lastInsertId();
            return $rs;
            self::__destruct();
        }
        catch(Exception $e){
            throw $e;
        }
    }
(...)
}

或者如果根本没有错误。检查

$con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

【讨论】:

    最近更新 更多