diff --git a/NEWS b/NEWS index 7dd05a2b1c72..c3b0c904bf29 100644 --- a/NEWS +++ b/NEWS @@ -27,6 +27,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 dcd9f7b126df..b7e2887e03eb 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 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"