php - PDO 事务不捕获异常

标签 php mysql pdo

我是第一次尝试 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/

相关文章:

java - 如何使用通配符从多个表中搜索值?

mysql - 尝试从外部脚本(同一服务器)连接到 WordPress 数据库时出现 500 内部服务器错误

php - 如何从 PDOStatement 获取列名?

php - 使用 PHP 和 OpenSSL 将 P12 转换为 PEM

php - Laradock 在工作区内更改 php-fpm 版本

CodeIgniter:找不到类 'CI_Controller'

php - 为什么这个 PDO 语句会默默地失败?

php - 在 php 中显示多个时区或时区时钟

需要大量(复杂?)过滤的 MySQL 查询

java - Spring Boot webservice JDBC偶尔无法获得连接