1
0
mirror of https://github.com/php/php-src.git synced 2026-03-24 08:12:21 +01:00

ext/mysqli: raise ValueError for invalid option in mysqli_options() (#20971)

Closes GH-20968

Co-authored-by: Ilija Tovilo <ilija.tovilo@me.com>
Co-authored-by: Kamil Tekiela <tekiela246@gmail.com>
Co-authored-by: Gina Peter Banyard <girgias@php.net>
This commit is contained in:
Arshid
2026-02-03 23:57:10 +05:30
committed by GitHub
parent f0f28b763c
commit a5a0ff6448
4 changed files with 46 additions and 7 deletions

View File

@@ -1198,6 +1198,11 @@ 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_argument_value_error(ERROR_ARG_POS(2), "must be MYSQLI_INIT_COMMAND, MYSQLI_SET_CHARSET_NAME, MYSQLI_SERVER_PUBLIC_KEY, or one of the MYSQLI_OPT_* constants");
RETURN_THROWS();
}
if (expected_type != Z_TYPE_P(mysql_value)) {
switch (expected_type) {
case IS_STRING:

View File

@@ -0,0 +1,26 @@
--TEST--
GH-20968 mysqli_options() with invalid option should triggers ValueError
--EXTENSIONS--
mysqli
--CONFLICTS--
mysqli
--SKIPIF--
<?php
require_once 'skipifconnectfailure.inc';
?>
--FILE--
<?php
require_once 'connect.inc';
$mysqli = new mysqli($host, $user, $passwd, $db, $port, $socket);
try {
$value = $mysqli->options(10, 'invalid_option');
var_dump($value);
} catch (ValueError $exception) {
echo $exception->getMessage() . "\n";
}
?>
--EXPECTF--
mysqli::options(): Argument #%d ($option) must be MYSQLI_INIT_COMMAND, MYSQLI_SET_CHARSET_NAME, MYSQLI_SERVER_PUBLIC_KEY, or one of the MYSQLI_OPT_* constants

View File

@@ -60,7 +60,13 @@ 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");
try {
var_dump(mysqli_options($link, MYSQLI_CLIENT_SSL, 'not a mysqli_option'));
} catch (ValueError $exception) {
echo $exception->getMessage() . "\n";
}
mysqli_close($link);
@@ -81,9 +87,6 @@ try {
echo $e->getMessage() . "\n";
}
// invalid options do not generate errors
mysqli_options($link, -1, "Invalid option");
print "done!";
?>
--EXPECTF--
@@ -110,7 +113,7 @@ bool(true)
%s(19) "MYSQLI_INIT_COMMAND"
bool(true)
%s(17) "MYSQLI_CLIENT_SSL"
bool(false)
mysqli_options(): Argument #%d ($option) must be MYSQLI_INIT_COMMAND, MYSQLI_SET_CHARSET_NAME, MYSQLI_SERVER_PUBLIC_KEY, or one of the MYSQLI_OPT_* constants
Link closed
mysqli object is already closed
Unknown character set

View File

@@ -24,7 +24,12 @@ 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'));
try {
var_dump(mysqli_set_opt($link, MYSQLI_CLIENT_SSL, 'not an mysqli_option'));
} catch (ValueError $exception) {
echo $exception->getMessage() . "\n";
}
mysqli_close($link);
@@ -48,6 +53,6 @@ bool(true)
bool(true)
bool(true)
bool(true)
bool(false)
mysqli_set_opt(): Argument #2 ($option) must be MYSQLI_INIT_COMMAND, MYSQLI_SET_CHARSET_NAME, MYSQLI_SERVER_PUBLIC_KEY, or one of the MYSQLI_OPT_* constants
mysqli object is already closed
done!