PDO setAttribute基于每个事务

时间:2014-08-08 12:33:11

标签: php mysql database pdo

我想知道是否可以基于每个事务而不是基于每个连接来设置PDO :: ATTR_ERRMODE。

我在class Database中打开数据库连接,目前正在设置属性:

namespace Core {
    class Database {
        private $pdo;

        public function __construct() {
            $this->pdo = new \PDO(/*Connection arguments*/);
            $this->pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
        }

        public function getConnection() {
            return $this->pdo;
        }
    }
}

现在所有错误都会抛出异常,但是,在处理手动事务时我只会喜欢这种行为。

理想情况下,我可以做类似的事情:

namespace Repositories {
    class Something {
        private $pdo;

        public function __construct(\Core\Database $database) {
            $this->pdo = $database->getConnection();
        }

        public function doSomething() {
            $this->pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); // Set the attribute here
            $this->pdo->beginTransaction();

            try {
                // Execute some queries and statements
                $this->pdo->commit();
            }
            catch (\PDOException $e) {
                $this->pdo->rollback();
                // Do something with $e
            }
        }
    }
}

并且在方法结束时将错误模式返回到默认值(我知道我的示例不起作用)

提前致谢

您可能知道我没有在每个使用一个方法的方法中创建新的PDO连接,但是数据库类在首次创建时会存储在对象池中。

1 个答案:

答案 0 :(得分:0)

您可以执行以下操作:

$pdo = $this->pdo;  
$pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);