From a4016991c4edd50ee8243f165f69d1d64beb5d50 Mon Sep 17 00:00:00 2001 From: arshidkv12 Date: Mon, 19 Jan 2026 08:35:44 +0530 Subject: [PATCH 01/20] Fix bug gh20968 --- ext/mysqli/mysqli_api.c | 6 +++++ ext/mysqli/tests/gh20968.phpt | 41 +++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 ext/mysqli/tests/gh20968.phpt diff --git a/ext/mysqli/mysqli_api.c b/ext/mysqli/mysqli_api.c index 1bf74dd77eeab..5c472b3b3608b 100644 --- a/ext/mysqli/mysqli_api.c +++ b/ext/mysqli/mysqli_api.c @@ -1209,6 +1209,9 @@ PHP_FUNCTION(mysqli_options) convert_to_long(mysql_value); break; default: + if (MyG(report_mode) & MYSQLI_REPORT_INDEX){ + zend_value_error("mysqli_options(): Invalid option %d", (int)mysql_option); + } break; } } @@ -1226,6 +1229,9 @@ PHP_FUNCTION(mysqli_options) break; default: ret = 1; + if (MyG(report_mode) & MYSQLI_REPORT_INDEX){ + zend_value_error("mysqli_options(): Invalid option %d", (int)mysql_option); + } break; } diff --git a/ext/mysqli/tests/gh20968.phpt b/ext/mysqli/tests/gh20968.phpt new file mode 100644 index 0000000000000..f8f689952c48d --- /dev/null +++ b/ext/mysqli/tests/gh20968.phpt @@ -0,0 +1,41 @@ +--TEST-- +Bug #20968 mysqli_options() with invalid option triggers ValueError +--EXTENSIONS-- +mysqli +--CONFLICTS-- +mysqli +--SKIPIF-- + +--FILE-- +report_mode = MYSQLI_REPORT_OFF; +$value = $mysqli->options(-1, 'invalid_option'); + +var_dump($value); + +$driver->report_mode = MYSQLI_REPORT_ALL; +$value = $mysqli->options(-1, 'invalid_option'); +var_dump($value); + +?> +--EXPECTF-- +bool(false) + +Fatal error: Uncaught ValueError: mysqli_options(): Invalid option %i in %s:%d +Stack trace: +#0 %s(%d): mysqli->options(%i, 'invalid_option') +#1 {main} + +Next ValueError: mysqli_options(): Invalid option %i in %s:%d +Stack trace: +#0 %s(%d): mysqli->options(%i, 'invalid_option') +#1 {main} + thrown in %s on line %d From 217b19b58c6c926b20e91050e94c5990f94abfff Mon Sep 17 00:00:00 2001 From: arshidkv12 Date: Mon, 19 Jan 2026 08:42:51 +0530 Subject: [PATCH 02/20] mysqli: raise ValueError for invalid option in mysqli_options() respecting report_mode --- ext/mysqli/mysqli_api.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/mysqli/mysqli_api.c b/ext/mysqli/mysqli_api.c index 5c472b3b3608b..ebda3cc457844 100644 --- a/ext/mysqli/mysqli_api.c +++ b/ext/mysqli/mysqli_api.c @@ -1209,7 +1209,7 @@ PHP_FUNCTION(mysqli_options) convert_to_long(mysql_value); break; default: - if (MyG(report_mode) & MYSQLI_REPORT_INDEX){ + if (MyG(report_mode) & MYSQLI_REPORT_ERROR){ zend_value_error("mysqli_options(): Invalid option %d", (int)mysql_option); } break; @@ -1229,7 +1229,7 @@ PHP_FUNCTION(mysqli_options) break; default: ret = 1; - if (MyG(report_mode) & MYSQLI_REPORT_INDEX){ + if (MyG(report_mode) & MYSQLI_REPORT_ERROR) { zend_value_error("mysqli_options(): Invalid option %d", (int)mysql_option); } break; From 66fbc0a9c66c2e2aeeae085566597e271c2c1311 Mon Sep 17 00:00:00 2001 From: arshidkv12 Date: Mon, 19 Jan 2026 08:52:21 +0530 Subject: [PATCH 03/20] mysqli: raise ValueError for invalid option in mysqli_options() respecting report_mode --- ext/mysqli/mysqli_api.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/mysqli/mysqli_api.c b/ext/mysqli/mysqli_api.c index ebda3cc457844..f6ea0c188c9a5 100644 --- a/ext/mysqli/mysqli_api.c +++ b/ext/mysqli/mysqli_api.c @@ -1229,7 +1229,7 @@ PHP_FUNCTION(mysqli_options) break; default: ret = 1; - if (MyG(report_mode) & MYSQLI_REPORT_ERROR) { + if (MyG(report_mode) & MYSQLI_REPORT_ERROR){ zend_value_error("mysqli_options(): Invalid option %d", (int)mysql_option); } break; From 54a8e06a44c413803a82fbdd21bf2f6e9e36c346 Mon Sep 17 00:00:00 2001 From: arshidkv12 Date: Mon, 19 Jan 2026 09:27:53 +0530 Subject: [PATCH 04/20] mysqli: raise ValueError for invalid option in mysqli_options() respecting report_mode --- ext/mysqli/tests/gh20968.phpt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/mysqli/tests/gh20968.phpt b/ext/mysqli/tests/gh20968.phpt index f8f689952c48d..89b63a097f69d 100644 --- a/ext/mysqli/tests/gh20968.phpt +++ b/ext/mysqli/tests/gh20968.phpt @@ -17,12 +17,12 @@ $driver = new mysqli_driver(); $mysqli = new mysqli($host, $user, $passwd, $db, $port, $socket); $driver->report_mode = MYSQLI_REPORT_OFF; -$value = $mysqli->options(-1, 'invalid_option'); +$value = $mysqli->options(10, 'invalid_option'); var_dump($value); $driver->report_mode = MYSQLI_REPORT_ALL; -$value = $mysqli->options(-1, 'invalid_option'); +$value = $mysqli->options(10, 'invalid_option'); var_dump($value); ?> From 0716f97a4fa0f77d28e8b3ec4da244127273ae95 Mon Sep 17 00:00:00 2001 From: arshidkv12 Date: Mon, 19 Jan 2026 09:35:46 +0530 Subject: [PATCH 05/20] mysqli: raise ValueError for invalid option in mysqli_options() respecting report_mode --- ext/mysqli/mysqli_api.c | 5 +---- ext/mysqli/tests/gh20968.phpt | 11 +++-------- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/ext/mysqli/mysqli_api.c b/ext/mysqli/mysqli_api.c index f6ea0c188c9a5..e7615f4340de2 100644 --- a/ext/mysqli/mysqli_api.c +++ b/ext/mysqli/mysqli_api.c @@ -1228,10 +1228,7 @@ PHP_FUNCTION(mysqli_options) } break; default: - ret = 1; - if (MyG(report_mode) & MYSQLI_REPORT_ERROR){ - zend_value_error("mysqli_options(): Invalid option %d", (int)mysql_option); - } + ret = 1; break; } diff --git a/ext/mysqli/tests/gh20968.phpt b/ext/mysqli/tests/gh20968.phpt index 89b63a097f69d..755376a9c70c0 100644 --- a/ext/mysqli/tests/gh20968.phpt +++ b/ext/mysqli/tests/gh20968.phpt @@ -29,13 +29,8 @@ var_dump($value); --EXPECTF-- bool(false) -Fatal error: Uncaught ValueError: mysqli_options(): Invalid option %i in %s:%d +Fatal error: Uncaught ValueError: mysqli_options(): Invalid option %d in %s:%d Stack trace: -#0 %s(%d): mysqli->options(%i, 'invalid_option') +#0 %s(%d): mysqli->options(%d, 'invalid_option') #1 {main} - -Next ValueError: mysqli_options(): Invalid option %i in %s:%d -Stack trace: -#0 %s(%d): mysqli->options(%i, 'invalid_option') -#1 {main} - thrown in %s on line %d + thrown in %s on line %d \ No newline at end of file From d7dd9388117e34d315cfe6d77c35e28b8c8968f6 Mon Sep 17 00:00:00 2001 From: arshidkv12 Date: Mon, 19 Jan 2026 09:36:48 +0530 Subject: [PATCH 06/20] mysqli: raise ValueError for invalid option in mysqli_options() respecting report_mode --- ext/mysqli/mysqli_api.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/mysqli/mysqli_api.c b/ext/mysqli/mysqli_api.c index e7615f4340de2..d3c7cd527027e 100644 --- a/ext/mysqli/mysqli_api.c +++ b/ext/mysqli/mysqli_api.c @@ -1228,7 +1228,7 @@ PHP_FUNCTION(mysqli_options) } break; default: - ret = 1; + ret = 1; break; } From 1aa360ab8257c06b52b2b35a70a0fb8562c834d5 Mon Sep 17 00:00:00 2001 From: arshidkv12 Date: Mon, 19 Jan 2026 09:58:41 +0530 Subject: [PATCH 07/20] mysqli: raise ValueError for invalid option in mysqli_options() respecting report_mode --- ext/mysqli/tests/mysqli_options.phpt | 2 -- 1 file changed, 2 deletions(-) diff --git a/ext/mysqli/tests/mysqli_options.phpt b/ext/mysqli/tests/mysqli_options.phpt index 64e42dc752b1a..bc449cd877294 100644 --- a/ext/mysqli/tests/mysqli_options.phpt +++ b/ext/mysqli/tests/mysqli_options.phpt @@ -81,8 +81,6 @@ try { echo $e->getMessage() . "\n"; } -// invalid options do not generate errors -mysqli_options($link, -1, "Invalid option"); print "done!"; ?> From 04f8006a6a9e6156042ff94cc4f4434064d592b1 Mon Sep 17 00:00:00 2001 From: Arshid Date: Mon, 19 Jan 2026 21:33:06 +0530 Subject: [PATCH 08/20] Update ext/mysqli/mysqli_api.c Co-authored-by: Ilija Tovilo --- ext/mysqli/mysqli_api.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/mysqli/mysqli_api.c b/ext/mysqli/mysqli_api.c index d3c7cd527027e..f495197ed5c79 100644 --- a/ext/mysqli/mysqli_api.c +++ b/ext/mysqli/mysqli_api.c @@ -1209,7 +1209,7 @@ PHP_FUNCTION(mysqli_options) convert_to_long(mysql_value); break; default: - if (MyG(report_mode) & MYSQLI_REPORT_ERROR){ + if (MyG(report_mode) & MYSQLI_REPORT_ERROR) { zend_value_error("mysqli_options(): Invalid option %d", (int)mysql_option); } break; From 9ba4bf2959fb0254a1704262ea6463e7b7d78f56 Mon Sep 17 00:00:00 2001 From: Arshid Date: Mon, 19 Jan 2026 21:37:22 +0530 Subject: [PATCH 09/20] Update ext/mysqli/tests/gh20968.phpt Co-authored-by: Ilija Tovilo --- ext/mysqli/tests/gh20968.phpt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/mysqli/tests/gh20968.phpt b/ext/mysqli/tests/gh20968.phpt index 755376a9c70c0..60ab72872d73b 100644 --- a/ext/mysqli/tests/gh20968.phpt +++ b/ext/mysqli/tests/gh20968.phpt @@ -33,4 +33,4 @@ Fatal error: Uncaught ValueError: mysqli_options(): Invalid option %d in %s:%d Stack trace: #0 %s(%d): mysqli->options(%d, 'invalid_option') #1 {main} - thrown in %s on line %d \ No newline at end of file + thrown in %s on line %d From 2db6e98f8125b2cfecbccde29cff374b1195aff9 Mon Sep 17 00:00:00 2001 From: arshidkv12 Date: Mon, 19 Jan 2026 21:40:19 +0530 Subject: [PATCH 10/20] mysqli: raise ValueError for invalid option in mysqli_options() respecting report_mode --- ext/mysqli/mysqli_api.c | 1 + 1 file changed, 1 insertion(+) diff --git a/ext/mysqli/mysqli_api.c b/ext/mysqli/mysqli_api.c index f495197ed5c79..177dd9b176e64 100644 --- a/ext/mysqli/mysqli_api.c +++ b/ext/mysqli/mysqli_api.c @@ -1212,6 +1212,7 @@ PHP_FUNCTION(mysqli_options) if (MyG(report_mode) & MYSQLI_REPORT_ERROR) { zend_value_error("mysqli_options(): Invalid option %d", (int)mysql_option); } + ret = 1; break; } } From 29ed278610ce002b5507829010a19bda2edd5ca8 Mon Sep 17 00:00:00 2001 From: arshidkv12 Date: Tue, 20 Jan 2026 11:09:25 +0530 Subject: [PATCH 11/20] mysqli: raise ValueError for invalid option in mysqli_options() respecting report_mode --- ext/mysqli/mysqli_api.c | 8 ++++---- ext/mysqli/tests/gh20968.phpt | 11 +---------- ext/mysqli/tests/mysqli_options.phpt | 3 +-- ext/mysqli/tests/mysqli_set_opt.phpt | 2 -- 4 files changed, 6 insertions(+), 18 deletions(-) diff --git a/ext/mysqli/mysqli_api.c b/ext/mysqli/mysqli_api.c index 177dd9b176e64..f6d2a02d17eb0 100644 --- a/ext/mysqli/mysqli_api.c +++ b/ext/mysqli/mysqli_api.c @@ -1198,6 +1198,10 @@ PHP_FUNCTION(mysqli_options) MYSQLI_FETCH_RESOURCE_CONN(mysql, mysql_link, MYSQLI_STATUS_INITIALIZED); expected_type = mysqli_options_get_option_zval_type(mysql_option); + if (expected_type == IS_NULL) { + zend_value_error("Argument #1 ($option) is not a valid mysqli option"); + RETURN_THROWS(); + } if (expected_type != Z_TYPE_P(mysql_value)) { switch (expected_type) { case IS_STRING: @@ -1209,10 +1213,6 @@ PHP_FUNCTION(mysqli_options) convert_to_long(mysql_value); break; default: - if (MyG(report_mode) & MYSQLI_REPORT_ERROR) { - zend_value_error("mysqli_options(): Invalid option %d", (int)mysql_option); - } - ret = 1; break; } } diff --git a/ext/mysqli/tests/gh20968.phpt b/ext/mysqli/tests/gh20968.phpt index 60ab72872d73b..650849b619626 100644 --- a/ext/mysqli/tests/gh20968.phpt +++ b/ext/mysqli/tests/gh20968.phpt @@ -12,24 +12,15 @@ require_once 'skipifconnectfailure.inc'; report_mode = MYSQLI_REPORT_OFF; $value = $mysqli->options(10, 'invalid_option'); var_dump($value); -$driver->report_mode = MYSQLI_REPORT_ALL; -$value = $mysqli->options(10, 'invalid_option'); -var_dump($value); - ?> --EXPECTF-- -bool(false) - -Fatal error: Uncaught ValueError: mysqli_options(): Invalid option %d in %s:%d +Fatal error: Uncaught ValueError: Argument #1 ($option) is not a valid mysqli option in %s:%d Stack trace: #0 %s(%d): mysqli->options(%d, 'invalid_option') #1 {main} diff --git a/ext/mysqli/tests/mysqli_options.phpt b/ext/mysqli/tests/mysqli_options.phpt index bc449cd877294..8d7f345bb5ef4 100644 --- a/ext/mysqli/tests/mysqli_options.phpt +++ b/ext/mysqli/tests/mysqli_options.phpt @@ -60,7 +60,7 @@ var_dump("MYSQLI_OPT_LOCAL_INFILE", mysqli_options($link, MYSQLI_OPT_LOCAL_INFIL var_dump("MYSQLI_INIT_COMMAND", mysqli_options($link, MYSQLI_INIT_COMMAND, 'SET AUTOCOMMIT=0')); /* mysqli_real_connect() */ -var_dump("MYSQLI_CLIENT_SSL", mysqli_options($link, MYSQLI_CLIENT_SSL, 'not a mysqli_option')); +var_dump("MYSQLI_CLIENT_SSL"); mysqli_close($link); @@ -108,7 +108,6 @@ bool(true) %s(19) "MYSQLI_INIT_COMMAND" bool(true) %s(17) "MYSQLI_CLIENT_SSL" -bool(false) Link closed mysqli object is already closed Unknown character set diff --git a/ext/mysqli/tests/mysqli_set_opt.phpt b/ext/mysqli/tests/mysqli_set_opt.phpt index 218e9f5177869..54b58a89e6fbc 100644 --- a/ext/mysqli/tests/mysqli_set_opt.phpt +++ b/ext/mysqli/tests/mysqli_set_opt.phpt @@ -24,7 +24,6 @@ require_once 'skipifconnectfailure.inc'; var_dump(mysqli_set_opt($link, MYSQLI_OPT_CONNECT_TIMEOUT, 10)); var_dump(mysqli_set_opt($link, MYSQLI_OPT_LOCAL_INFILE, 1)); var_dump(mysqli_set_opt($link, MYSQLI_INIT_COMMAND, 'SET AUTOCOMMIT=0')); - var_dump(mysqli_set_opt($link, MYSQLI_CLIENT_SSL, 'not an mysqli_option')); mysqli_close($link); @@ -48,6 +47,5 @@ bool(true) bool(true) bool(true) bool(true) -bool(false) mysqli object is already closed done! From 1647ae80a288e2c651e015ab5190678d97444769 Mon Sep 17 00:00:00 2001 From: arshidkv12 Date: Tue, 20 Jan 2026 11:11:55 +0530 Subject: [PATCH 12/20] mysqli: raise ValueError for invalid option in mysqli_options() respecting report_mode --- ext/mysqli/tests/mysqli_options.phpt | 7 +++++++ ext/mysqli/tests/mysqli_set_opt.phpt | 8 ++++++++ 2 files changed, 15 insertions(+) diff --git a/ext/mysqli/tests/mysqli_options.phpt b/ext/mysqli/tests/mysqli_options.phpt index 8d7f345bb5ef4..5e980fee222de 100644 --- a/ext/mysqli/tests/mysqli_options.phpt +++ b/ext/mysqli/tests/mysqli_options.phpt @@ -62,6 +62,12 @@ var_dump("MYSQLI_INIT_COMMAND", mysqli_options($link, MYSQLI_INIT_COMMAND, 'SET /* mysqli_real_connect() */ var_dump("MYSQLI_CLIENT_SSL"); +try { + var_dump(mysqli_options($link, MYSQLI_CLIENT_SSL, 'not a mysqli_option')); +} catch (Error $exception) { + echo $exception->getMessage() . "\n"; +} + mysqli_close($link); echo "Link closed\n"; @@ -108,6 +114,7 @@ bool(true) %s(19) "MYSQLI_INIT_COMMAND" bool(true) %s(17) "MYSQLI_CLIENT_SSL" +Argument #1 ($option) is not a valid mysqli option Link closed mysqli object is already closed Unknown character set diff --git a/ext/mysqli/tests/mysqli_set_opt.phpt b/ext/mysqli/tests/mysqli_set_opt.phpt index 54b58a89e6fbc..3615f4503453a 100644 --- a/ext/mysqli/tests/mysqli_set_opt.phpt +++ b/ext/mysqli/tests/mysqli_set_opt.phpt @@ -24,6 +24,13 @@ require_once 'skipifconnectfailure.inc'; var_dump(mysqli_set_opt($link, MYSQLI_OPT_CONNECT_TIMEOUT, 10)); var_dump(mysqli_set_opt($link, MYSQLI_OPT_LOCAL_INFILE, 1)); var_dump(mysqli_set_opt($link, MYSQLI_INIT_COMMAND, 'SET AUTOCOMMIT=0')); + + + try { + var_dump(mysqli_set_opt($link, MYSQLI_CLIENT_SSL, 'not an mysqli_option')); + } catch (Error $exception) { + echo $exception->getMessage() . "\n"; + } mysqli_close($link); @@ -47,5 +54,6 @@ bool(true) bool(true) bool(true) bool(true) +Argument #1 ($option) is not a valid mysqli option mysqli object is already closed done! From 0a98c9c54d3f6f861771599a79ccd77c632fec30 Mon Sep 17 00:00:00 2001 From: arshidkv12 Date: Tue, 20 Jan 2026 11:13:37 +0530 Subject: [PATCH 13/20] mysqli: raise ValueError for invalid option in mysqli_options() respecting report_mode --- ext/mysqli/mysqli_api.c | 1 + 1 file changed, 1 insertion(+) diff --git a/ext/mysqli/mysqli_api.c b/ext/mysqli/mysqli_api.c index f6d2a02d17eb0..5c7694843852e 100644 --- a/ext/mysqli/mysqli_api.c +++ b/ext/mysqli/mysqli_api.c @@ -1202,6 +1202,7 @@ PHP_FUNCTION(mysqli_options) zend_value_error("Argument #1 ($option) is not a valid mysqli option"); RETURN_THROWS(); } + if (expected_type != Z_TYPE_P(mysql_value)) { switch (expected_type) { case IS_STRING: From 819354290d4c63771e60342ac9a5198dfe7c0481 Mon Sep 17 00:00:00 2001 From: Arshid Date: Tue, 20 Jan 2026 18:59:51 +0530 Subject: [PATCH 14/20] Update ext/mysqli/mysqli_api.c Co-authored-by: Kamil Tekiela --- ext/mysqli/mysqli_api.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/mysqli/mysqli_api.c b/ext/mysqli/mysqli_api.c index 5c7694843852e..bd3212937f361 100644 --- a/ext/mysqli/mysqli_api.c +++ b/ext/mysqli/mysqli_api.c @@ -1199,7 +1199,7 @@ PHP_FUNCTION(mysqli_options) expected_type = mysqli_options_get_option_zval_type(mysql_option); if (expected_type == IS_NULL) { - zend_value_error("Argument #1 ($option) is not a valid mysqli option"); + zend_argument_value_error(ERROR_ARG_POS(2), "must be one of predefined options"); RETURN_THROWS(); } From 3a633b304b08c30464bf207aa7fe0d01ec2488e5 Mon Sep 17 00:00:00 2001 From: Arshid Date: Tue, 20 Jan 2026 19:00:06 +0530 Subject: [PATCH 15/20] Update ext/mysqli/tests/mysqli_options.phpt Co-authored-by: Kamil Tekiela --- ext/mysqli/tests/mysqli_options.phpt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/mysqli/tests/mysqli_options.phpt b/ext/mysqli/tests/mysqli_options.phpt index 5e980fee222de..91b2184301f99 100644 --- a/ext/mysqli/tests/mysqli_options.phpt +++ b/ext/mysqli/tests/mysqli_options.phpt @@ -64,7 +64,7 @@ var_dump("MYSQLI_CLIENT_SSL"); try { var_dump(mysqli_options($link, MYSQLI_CLIENT_SSL, 'not a mysqli_option')); -} catch (Error $exception) { +} catch (ValueError $exception) { echo $exception->getMessage() . "\n"; } From 072d1a404ece2068d6e619d0cab0c92e7bda089e Mon Sep 17 00:00:00 2001 From: arshidkv12 Date: Tue, 20 Jan 2026 19:03:37 +0530 Subject: [PATCH 16/20] mysqli: raise ValueError for invalid option in mysqli_options() respecting report_mode --- ext/mysqli/tests/mysqli_options.phpt | 2 +- ext/mysqli/tests/mysqli_set_opt.phpt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/mysqli/tests/mysqli_options.phpt b/ext/mysqli/tests/mysqli_options.phpt index 91b2184301f99..e3daf2230fe3d 100644 --- a/ext/mysqli/tests/mysqli_options.phpt +++ b/ext/mysqli/tests/mysqli_options.phpt @@ -114,7 +114,7 @@ bool(true) %s(19) "MYSQLI_INIT_COMMAND" bool(true) %s(17) "MYSQLI_CLIENT_SSL" -Argument #1 ($option) is not a valid mysqli option +mysqli_options(): Argument #2 ($option) must be one of predefined options Link closed mysqli object is already closed Unknown character set diff --git a/ext/mysqli/tests/mysqli_set_opt.phpt b/ext/mysqli/tests/mysqli_set_opt.phpt index 3615f4503453a..f2af5fc827639 100644 --- a/ext/mysqli/tests/mysqli_set_opt.phpt +++ b/ext/mysqli/tests/mysqli_set_opt.phpt @@ -54,6 +54,6 @@ bool(true) bool(true) bool(true) bool(true) -Argument #1 ($option) is not a valid mysqli option +mysqli_set_opt(): Argument #2 ($option) must be one of predefined options mysqli object is already closed done! From a188868809162965338b86f162836130baaea2bb Mon Sep 17 00:00:00 2001 From: Arshid Date: Tue, 20 Jan 2026 19:04:12 +0530 Subject: [PATCH 17/20] Update ext/mysqli/tests/mysqli_set_opt.phpt Co-authored-by: Kamil Tekiela --- ext/mysqli/tests/mysqli_set_opt.phpt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/mysqli/tests/mysqli_set_opt.phpt b/ext/mysqli/tests/mysqli_set_opt.phpt index f2af5fc827639..0a5cf208e3ef5 100644 --- a/ext/mysqli/tests/mysqli_set_opt.phpt +++ b/ext/mysqli/tests/mysqli_set_opt.phpt @@ -28,7 +28,7 @@ require_once 'skipifconnectfailure.inc'; try { var_dump(mysqli_set_opt($link, MYSQLI_CLIENT_SSL, 'not an mysqli_option')); - } catch (Error $exception) { + } catch (ValueError $exception) { echo $exception->getMessage() . "\n"; } From e1029678d09229c7f3d513f7f5ea06284e932380 Mon Sep 17 00:00:00 2001 From: arshidkv12 Date: Tue, 20 Jan 2026 19:35:36 +0530 Subject: [PATCH 18/20] mysqli: raise ValueError for invalid option in mysqli_options() respecting report_mode --- ext/mysqli/tests/gh20968.phpt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/mysqli/tests/gh20968.phpt b/ext/mysqli/tests/gh20968.phpt index 650849b619626..37f2581a176f7 100644 --- a/ext/mysqli/tests/gh20968.phpt +++ b/ext/mysqli/tests/gh20968.phpt @@ -20,7 +20,7 @@ var_dump($value); ?> --EXPECTF-- -Fatal error: Uncaught ValueError: Argument #1 ($option) is not a valid mysqli option in %s:%d +Fatal error: Uncaught ValueError: mysqli::options(): Argument #1 ($option) must be one of predefined options in %s:%d Stack trace: #0 %s(%d): mysqli->options(%d, 'invalid_option') #1 {main} From 6a71d4f49ec20bb294cd62f0b7e31995ba7251b0 Mon Sep 17 00:00:00 2001 From: arshidkv12 Date: Tue, 20 Jan 2026 20:03:14 +0530 Subject: [PATCH 19/20] mysqli: raise ValueError for invalid option in mysqli_options() respecting report_mode --- ext/mysqli/tests/mysqli_set_opt.phpt | 1 - 1 file changed, 1 deletion(-) diff --git a/ext/mysqli/tests/mysqli_set_opt.phpt b/ext/mysqli/tests/mysqli_set_opt.phpt index 0a5cf208e3ef5..4e148ad5ea486 100644 --- a/ext/mysqli/tests/mysqli_set_opt.phpt +++ b/ext/mysqli/tests/mysqli_set_opt.phpt @@ -25,7 +25,6 @@ require_once 'skipifconnectfailure.inc'; var_dump(mysqli_set_opt($link, MYSQLI_OPT_LOCAL_INFILE, 1)); var_dump(mysqli_set_opt($link, MYSQLI_INIT_COMMAND, 'SET AUTOCOMMIT=0')); - try { var_dump(mysqli_set_opt($link, MYSQLI_CLIENT_SSL, 'not an mysqli_option')); } catch (ValueError $exception) { From d1df211f411037663d2b34307f41f2392d3fa771 Mon Sep 17 00:00:00 2001 From: arshidkv12 Date: Wed, 21 Jan 2026 06:20:59 +0530 Subject: [PATCH 20/20] mysqli: raise ValueError for invalid option in mysqli_options() respecting report_mode --- ext/mysqli/tests/gh20968.phpt | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/ext/mysqli/tests/gh20968.phpt b/ext/mysqli/tests/gh20968.phpt index 37f2581a176f7..95ceeeb5121bd 100644 --- a/ext/mysqli/tests/gh20968.phpt +++ b/ext/mysqli/tests/gh20968.phpt @@ -1,5 +1,5 @@ --TEST-- -Bug #20968 mysqli_options() with invalid option triggers ValueError +GH-20968 mysqli_options() with invalid option should triggers ValueError --EXTENSIONS-- mysqli --CONFLICTS-- @@ -13,15 +13,14 @@ require_once 'skipifconnectfailure.inc'; require_once 'connect.inc'; $mysqli = new mysqli($host, $user, $passwd, $db, $port, $socket); - -$value = $mysqli->options(10, 'invalid_option'); - -var_dump($value); + +try { + $value = $mysqli->options(10, 'invalid_option'); + var_dump($value); +} catch (ValueError $exception) { + echo $exception->getMessage() . "\n"; +} ?> --EXPECTF-- -Fatal error: Uncaught ValueError: mysqli::options(): Argument #1 ($option) must be one of predefined options in %s:%d -Stack trace: -#0 %s(%d): mysqli->options(%d, 'invalid_option') -#1 {main} - thrown in %s on line %d +mysqli::options(): Argument #1 ($option) must be one of predefined options