From 5a940b0f1404428c6db52b7b34acc8e9c08c07ab Mon Sep 17 00:00:00 2001 From: Steve Boyd Date: Thu, 30 Jun 2022 12:34:05 +1200 Subject: [PATCH] FIX PDO in PHP 8 --- src/ORM/Connect/PDOConnector.php | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/ORM/Connect/PDOConnector.php b/src/ORM/Connect/PDOConnector.php index 84f4b0026..42d580bae 100644 --- a/src/ORM/Connect/PDOConnector.php +++ b/src/ORM/Connect/PDOConnector.php @@ -7,6 +7,7 @@ use SilverStripe\Dev\Deprecation; use PDO; use PDOStatement; use InvalidArgumentException; +use PDOException; /** * PDO driver database connector @@ -109,10 +110,15 @@ class PDOConnector extends DBConnector implements TransactionManager } // Generate new statement - $statement = $this->pdoConnection->prepare( - $sql, - [PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY] - ); + try { + $statement = $this->pdoConnection->prepare( + $sql, + [PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY] + ); + } catch (PDOException $e) { + $statement = false; + $this->databaseError($e->getMessage(), E_USER_ERROR, $sql); + } // Wrap in a PDOStatementHandle, to cache column metadata $statementHandle = ($statement === false) ? false : new PDOStatementHandle($statement); @@ -557,8 +563,13 @@ class PDOConnector extends DBConnector implements TransactionManager } } + // Note: $this->inTransaction may not match the 'in-transaction' state in PDO $this->inTransaction = false; - return $this->pdoConnection->rollBack(); + if ($this->pdoConnection->inTransaction()) { + return $this->pdoConnection->rollBack(); + } + // return false because it did not rollback. + return false; } public function transactionDepth()