我是第一次尝试 PDO 交易。下面的代码不起作用。我们尝试插入的电子邮件地址有重复项,因此应该会失败。它确实给我一个错误。但是第一个插入被插入到数据库中并且它不会回滚。我知道如果我在提交之前将 PDO::rollBack 移动到 Try{ 中,回滚工作会导致回滚。我认为问题是它没有捕获错误,因此没有调用 PDO::rollBack。有什么想法吗?
try {
PDO::beginTransaction();
$sql = "INSERT INTO .`tblUsersIDvsAgencyID` (`id`, `agency_id`) VALUES (NULL, :agencyID)";
$STH = $this->prepare($sql);
$STH->bindParam(':agencyID', $AgencyUser['agency_id']);
$STH->execute();
$userID = parent::lastInsertId();
$sql = "INSERT INTO `tblUsersEmailAddress` (`id`, `user_id`, `email_address`, `primary`, `created_ts`, `email_verified`) VALUES (NULL , :userID , :EmailAddress , '1', CURRENT_TIMESTAMP , '0' )";
$STH = $this->prepare($sql);
$STH->bindParam(':userID', $userID);
$STH->bindParam(':EmailAddress', $email_address);
$STH->execute();
PDO::commit();
echo 'Data entered successfully<br />';
}
catch(PDOException $e)
{
/*** roll back the transaction if we fail ***/
PDO::rollBack();
echo "failed";
}
最佳答案
PDO::beginTransaction()
不是静态方法。从你的问题来看,你似乎在扩展 PDO 类。我不会那样做,因为我怀疑您是否在向基类添加任何重要内容。相反,您应该将 PDO 连接设置为类属性。
例如
class ParentClass
{
/**
* @var PDO
*/
protected $dbh;
public function __construct(PDO $dbh)
{
$this->dbh = $dbh;
// Make sure PDO is set to throw exceptions
$this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
}
class ChildClass extends ParentClass
{
public function insertStuff()
{
$this->dbh->beginTransaction();
try {
// do stuff
$this->dbh->commit();
} catch (PDOException $e) {
$this->dbh->rollBack();
throw $e;
}
}
}
关于php - PDO 事务不捕获异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7072326/