Commit 8f2d79e4d15 for php.net
commit 8f2d79e4d15d31d3dead77d5a637e5c56ad4be1d
Author: Ilia Alshanetsky <ilia@ilia.ws>
Date: Mon Aug 10 08:10:02 2026 -0400
Honor ERRMODE_SILENT in pdo_raise_impl_error (#23070)
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.
Closes GH-23070
diff --git a/NEWS b/NEWS
index ae9a19c0cc8..2a06febbfa2 100644
--- a/NEWS
+++ b/NEWS
@@ -57,6 +57,10 @@ PHP NEWS
. Added SpoofChecker::getBidiSkeleton(). (Weilin Du)
. Added SpoofChecker::getSkeleton(). (David Carlier)
+- PDO:
+ . Fixed pdo_raise_impl_error() emitting a warning under ERRMODE_SILENT.
+ (iliaal)
+
- PDO_ODBC:
. Fixed bug GH-23016 (NULL values in long columns come back as garbage
binary strings). (Calvin Buckley, iliaal)
diff --git a/ext/pdo/pdo_dbh.c b/ext/pdo/pdo_dbh.c
index dcd9f7b126d..b7e2887e03e 100644
--- a/ext/pdo/pdo_dbh.c
+++ b/ext/pdo/pdo_dbh.c
@@ -73,21 +73,16 @@ void pdo_raise_impl_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, pdo_error_type sqlst
pdo_error_type *pdo_err = &dbh->error_code;
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 00000000000..762c8848b8b
--- /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--
+<?php
+$pdo = new PDO('sqlite::memory:');
+$pdo->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"