PHP:如何从另一个 class 中的方法捕获异常?
PHP: How to catch an exception from a method within another class?
我正在使用 class 进行数据库连接,这个 class 包含 CRUD 方法,还有数据库连接方法。
它基本上是所有其他使用 DB 的 classes 的核心。
我目前在插入记录时遇到处理唯一列中重复条目的问题。
Database.class.php 插入数据库方法:
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();
}
(...)
}
还有一个class,PersonDAO.class.php,是继承Database.class的class。
PersonDAO.class.php有自己的插入记录的方法,最终使用Database.class.phpInsertBD方法。
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 并打印 "Cannot insert record. Duplicate entry" 吗?
有"Uncaught Exception ..."消息吗?也许,您首先需要在 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);
我正在使用 class 进行数据库连接,这个 class 包含 CRUD 方法,还有数据库连接方法。
它基本上是所有其他使用 DB 的 classes 的核心。
我目前在插入记录时遇到处理唯一列中重复条目的问题。
Database.class.php 插入数据库方法:
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();
}
(...)
}
还有一个class,PersonDAO.class.php,是继承Database.class的class。
PersonDAO.class.php有自己的插入记录的方法,最终使用Database.class.phpInsertBD方法。
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 并打印 "Cannot insert record. Duplicate entry" 吗?
有"Uncaught Exception ..."消息吗?也许,您首先需要在 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);