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"