From c4d7dc846e2e4105f61da46fbd6e09f83fec5946 Mon Sep 17 00:00:00 2001 From: Ilia Alshanetsky Date: Tue, 4 Aug 2026 22:02:49 -0400 Subject: [PATCH] Honor ERRMODE_SILENT in pdo_raise_impl_error pdo_raise_impl_error stored the SQLSTATE then still emitted E_WARNING even when the handle error mode was SILENT. The early return for SILENT was present but disabled (#if 0). Copy the error code first so errorInfo() remains valid, then return without warning. --- NEWS | 4 ++++ ext/pdo/pdo_dbh.c | 13 ++++-------- .../tests/pdo_silent_impl_error.phpt | 21 +++++++++++++++++++ 3 files changed, 29 insertions(+), 9 deletions(-) create mode 100644 ext/pdo_sqlite/tests/pdo_silent_impl_error.phpt diff --git a/NEWS b/NEWS index 378643836c80..edeca01c7f7b 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,10 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? ????, PHP 8.4.25 +- PDO: + . Fixed pdo_raise_impl_error() emitting warnings under ERRMODE_SILENT. + (iliaal) + - Date: . Fixed leak on double DatePeriod::__construct() call. (ilutov) diff --git a/ext/pdo/pdo_dbh.c b/ext/pdo/pdo_dbh.c index 782639be0758..08e618af70e1 100644 --- a/ext/pdo/pdo_dbh.c +++ b/ext/pdo/pdo_dbh.c @@ -71,21 +71,16 @@ void pdo_raise_impl_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, pdo_error_type sqlst char *message = NULL; const char *msg; - if (dbh->error_mode == PDO_ERRMODE_SILENT) { -#if 0 - /* BUG: if user is running in silent mode and hits an error at the driver level - * when they use the PDO methods to call up the error information, they may - * get bogus information */ - return; -#endif - } - if (stmt) { pdo_err = &stmt->error_code; } memcpy(*pdo_err, sqlstate, sizeof(pdo_error_type)); + if (dbh->error_mode == PDO_ERRMODE_SILENT) { + return; + } + /* hash sqlstate to error messages */ msg = pdo_sqlstate_state_to_description(*pdo_err); if (!msg) { diff --git a/ext/pdo_sqlite/tests/pdo_silent_impl_error.phpt b/ext/pdo_sqlite/tests/pdo_silent_impl_error.phpt new file mode 100644 index 000000000000..762c8848b8b6 --- /dev/null +++ b/ext/pdo_sqlite/tests/pdo_silent_impl_error.phpt @@ -0,0 +1,21 @@ +--TEST-- +pdo_raise_impl_error honors ERRMODE_SILENT (no warning) +--EXTENSIONS-- +pdo_sqlite +--FILE-- +setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT); +set_error_handler(function (int $errno, string $errstr): bool { + echo "warning: $errstr\n"; + return true; +}); +$result = $pdo->getAttribute(123456); +echo "result: "; +var_dump($result); +echo "errorInfo: "; +var_dump($pdo->errorInfo()[0]); +?> +--EXPECT-- +result: bool(false) +errorInfo: string(5) "IM001"