Skip to content

Commit 428340d

Browse files
Add error reporting to mysqli_options (#7036)
1 parent 7a76640 commit 428340d

File tree

2 files changed

+114
-86
lines changed

2 files changed

+114
-86
lines changed

ext/mysqli/mysqli_api.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1771,11 +1771,15 @@ PHP_FUNCTION(mysqli_options)
17711771
}
17721772
switch (expected_type) {
17731773
case IS_STRING:
1774-
ret = mysql_options(mysql->mysql, mysql_option, Z_STRVAL_P(mysql_value));
1774+
if ((ret = mysql_options(mysql->mysql, mysql_option, Z_STRVAL_P(mysql_value)))) {
1775+
MYSQLI_REPORT_MYSQL_ERROR(mysql->mysql);
1776+
}
17751777
break;
17761778
case IS_LONG:
17771779
l_value = Z_LVAL_P(mysql_value);
1778-
ret = mysql_options(mysql->mysql, mysql_option, (char *)&l_value);
1780+
if ((ret = mysql_options(mysql->mysql, mysql_option, (char *)&l_value))) {
1781+
MYSQLI_REPORT_MYSQL_ERROR(mysql->mysql);
1782+
}
17791783
break;
17801784
default:
17811785
ret = 1;

ext/mysqli/tests/mysqli_options.phpt

Lines changed: 108 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -2,99 +2,122 @@
22
mysqli_options()
33
--SKIPIF--
44
<?php
5-
require_once('skipif.inc');
6-
require_once('skipifconnectfailure.inc');
5+
require_once 'skipif.inc';
6+
require_once 'skipifconnectfailure.inc';
7+
78
?>
89
--FILE--
910
<?php
10-
require_once("connect.inc");
11-
12-
$valid_options = array(
13-
MYSQLI_READ_DEFAULT_GROUP => "MYSQLI_READ_DEFAULT_GROUP",
14-
MYSQLI_READ_DEFAULT_FILE => "MYSQLI_READ_DEFAULT_FILE",
15-
MYSQLI_OPT_CONNECT_TIMEOUT => "MYSQLI_OPT_CONNECT_TIMEOUT",
16-
MYSQLI_OPT_LOCAL_INFILE => "MYSQLI_OPT_LOCAL_INFILE",
17-
MYSQLI_INIT_COMMAND => "MYSQLI_INIT_COMMAND",
18-
MYSQLI_SET_CHARSET_NAME => "MYSQLI_SET_CHARSET_NAME",
19-
MYSQLI_OPT_SSL_VERIFY_SERVER_CERT => "MYSQLI_OPT_SSL_VERIFY_SERVER_CERT",
20-
);
21-
22-
if ($IS_MYSQLND && defined('MYSQLI_OPT_NET_CMD_BUFFER_SIZE'))
23-
$valid_options[] = constant('MYSQLI_OPT_NET_CMD_BUFFER_SIZE');
24-
if ($IS_MYSQLND && defined('MYSQLI_OPT_NET_READ_BUFFER_SIZE'))
25-
$valid_options[] = constant('MYSQLI_OPT_NET_READ_BUFFER_SIZE');
26-
if ($IS_MYSQLND && defined('MYSQLI_OPT_INT_AND_FLOAT_NATIVE'))
27-
$valid_options[] = constant('MYSQLI_OPT_INT_AND_FLOAT_NATIVE');
28-
29-
$link = mysqli_init();
30-
31-
/* set it twice, checking if memory for the previous one is correctly freed */
32-
mysqli_options($link, MYSQLI_SET_CHARSET_NAME, "utf8");
33-
mysqli_options($link, MYSQLI_SET_CHARSET_NAME, "latin1");
34-
35-
// print "run_tests.php don't fool me with your 'ungreedy' expression '.+?'!\n";
36-
var_dump("MYSQLI_READ_DEFAULT_GROUP", mysqli_options($link, MYSQLI_READ_DEFAULT_GROUP, 'extra_my.cnf'));
37-
var_dump("MYSQLI_READ_DEFAULT_FILE", mysqli_options($link, MYSQLI_READ_DEFAULT_FILE, 'extra_my.cnf'));
38-
var_dump("MYSQLI_OPT_CONNECT_TIMEOUT", mysqli_options($link, MYSQLI_OPT_CONNECT_TIMEOUT, 10));
39-
var_dump("MYSQLI_OPT_LOCAL_INFILE", mysqli_options($link, MYSQLI_OPT_LOCAL_INFILE, 1));
40-
var_dump("MYSQLI_INIT_COMMAND", mysqli_options($link, MYSQLI_INIT_COMMAND, array('SET AUTOCOMMIT=0', 'SET AUTOCOMMIT=1')));
41-
42-
if (!$link2 = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket))
43-
printf("[006] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n",
44-
$host, $user, $db, $port, $socket);
45-
46-
if (!$res = mysqli_query($link2, 'SELECT version() AS server_version'))
47-
printf("[007] [%d] %s\n", mysqli_errno($link2), mysqli_error($link2));
48-
$tmp = mysqli_fetch_assoc($res);
49-
mysqli_free_result($res);
50-
$version = explode('.', $tmp['server_version']);
51-
if (empty($version))
52-
printf("[008] Cannot determine server version, need MySQL Server 4.1+ for the test!\n");
53-
54-
if ($version[0] <= 4 && $version[1] < 1)
55-
printf("[009] Need MySQL Server 4.1+ for the test!\n");
56-
57-
if (!$res = mysqli_query($link2, "SHOW CHARACTER SET"))
58-
printf("[010] Cannot get list of available character sets, [%d] %s\n",
59-
mysqli_errno($link2), mysqli_error($link2));
60-
61-
$charsets = array();
62-
while ($row = mysqli_fetch_assoc($res))
63-
$charsets[] = $row;
64-
mysqli_free_result($res);
65-
mysqli_close($link2);
66-
67-
foreach ($charsets as $charset) {
68-
$k = $charset['Charset'];
69-
/* The server currently 17.07.2007 can't handle data sent in ucs2 */
70-
/* The server currently 16.08.2010 can't handle data sent in utf16 and utf32 */
71-
if ($charset['Charset'] == 'ucs2' || $charset['Charset'] == 'utf16' || $charset['Charset'] == 'utf32') {
72-
continue;
73-
}
74-
if (true !== mysqli_options($link, MYSQLI_SET_CHARSET_NAME, $charset['Charset'])) {
75-
printf("[009] Setting charset name '%s' has failed\n", $charset['Charset']);
76-
}
11+
require_once "connect.inc";
12+
13+
$valid_options = array(
14+
MYSQLI_READ_DEFAULT_GROUP => "MYSQLI_READ_DEFAULT_GROUP",
15+
MYSQLI_READ_DEFAULT_FILE => "MYSQLI_READ_DEFAULT_FILE",
16+
MYSQLI_OPT_CONNECT_TIMEOUT => "MYSQLI_OPT_CONNECT_TIMEOUT",
17+
MYSQLI_OPT_LOCAL_INFILE => "MYSQLI_OPT_LOCAL_INFILE",
18+
MYSQLI_INIT_COMMAND => "MYSQLI_INIT_COMMAND",
19+
MYSQLI_SET_CHARSET_NAME => "MYSQLI_SET_CHARSET_NAME",
20+
MYSQLI_OPT_SSL_VERIFY_SERVER_CERT => "MYSQLI_OPT_SSL_VERIFY_SERVER_CERT",
21+
);
22+
23+
if ($IS_MYSQLND && defined('MYSQLI_OPT_NET_CMD_BUFFER_SIZE')) {
24+
$valid_options[] = constant('MYSQLI_OPT_NET_CMD_BUFFER_SIZE');
25+
}
26+
if ($IS_MYSQLND && defined('MYSQLI_OPT_NET_READ_BUFFER_SIZE')) {
27+
$valid_options[] = constant('MYSQLI_OPT_NET_READ_BUFFER_SIZE');
28+
}
29+
if ($IS_MYSQLND && defined('MYSQLI_OPT_INT_AND_FLOAT_NATIVE')) {
30+
$valid_options[] = constant('MYSQLI_OPT_INT_AND_FLOAT_NATIVE');
31+
}
32+
33+
$link = mysqli_init();
34+
35+
/* set it twice, checking if memory for the previous one is correctly freed */
36+
mysqli_options($link, MYSQLI_SET_CHARSET_NAME, "utf8");
37+
mysqli_options($link, MYSQLI_SET_CHARSET_NAME, "latin1");
38+
39+
// print "run_tests.php don't fool me with your 'ungreedy' expression '.+?'!\n";
40+
var_dump("MYSQLI_READ_DEFAULT_GROUP", mysqli_options($link, MYSQLI_READ_DEFAULT_GROUP, 'extra_my.cnf'));
41+
var_dump("MYSQLI_READ_DEFAULT_FILE", mysqli_options($link, MYSQLI_READ_DEFAULT_FILE, 'extra_my.cnf'));
42+
var_dump("MYSQLI_OPT_CONNECT_TIMEOUT", mysqli_options($link, MYSQLI_OPT_CONNECT_TIMEOUT, 10));
43+
var_dump("MYSQLI_OPT_LOCAL_INFILE", mysqli_options($link, MYSQLI_OPT_LOCAL_INFILE, 1));
44+
var_dump("MYSQLI_INIT_COMMAND", mysqli_options($link, MYSQLI_INIT_COMMAND, array('SET AUTOCOMMIT=0', 'SET AUTOCOMMIT=1')));
45+
46+
if (!$link2 = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) {
47+
printf("[006] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n",
48+
$host, $user, $db, $port, $socket);
49+
}
50+
51+
if (!$res = mysqli_query($link2, 'SELECT version() AS server_version')) {
52+
printf("[007] [%d] %s\n", mysqli_errno($link2), mysqli_error($link2));
53+
}
54+
$tmp = mysqli_fetch_assoc($res);
55+
mysqli_free_result($res);
56+
$version = explode('.', $tmp['server_version']);
57+
if (empty($version)) {
58+
printf("[008] Cannot determine server version, need MySQL Server 4.1+ for the test!\n");
59+
}
60+
61+
if ($version[0] <= 4 && $version[1] < 1) {
62+
printf("[009] Need MySQL Server 4.1+ for the test!\n");
63+
}
64+
65+
if (!$res = mysqli_query($link2, "SHOW CHARACTER SET")) {
66+
printf("[010] Cannot get list of available character sets, [%d] %s\n",
67+
mysqli_errno($link2), mysqli_error($link2));
68+
}
69+
70+
$charsets = array();
71+
while ($row = mysqli_fetch_assoc($res)) {
72+
$charsets[] = $row;
73+
}
74+
mysqli_free_result($res);
75+
mysqli_close($link2);
76+
77+
foreach ($charsets as $charset) {
78+
$k = $charset['Charset'];
79+
/* The server currently 17.07.2007 can't handle data sent in ucs2 */
80+
/* The server currently 16.08.2010 can't handle data sent in utf16 and utf32 */
81+
if ($charset['Charset'] == 'ucs2' || $charset['Charset'] == 'utf16' || $charset['Charset'] == 'utf32') {
82+
continue;
83+
}
84+
if (true !== mysqli_options($link, MYSQLI_SET_CHARSET_NAME, $charset['Charset'])) {
85+
printf("[009] Setting charset name '%s' has failed\n", $charset['Charset']);
7786
}
87+
}
7888

79-
var_dump("MYSQLI_READ_DEFAULT_GROUP", mysqli_options($link, MYSQLI_READ_DEFAULT_GROUP, 'extra_my.cnf'));
80-
var_dump("MYSQLI_READ_DEFAULT_FILE", mysqli_options($link, MYSQLI_READ_DEFAULT_FILE, 'extra_my.cnf'));
81-
var_dump("MYSQLI_OPT_CONNECT_TIMEOUT", mysqli_options($link, MYSQLI_OPT_CONNECT_TIMEOUT, 10));
82-
var_dump("MYSQLI_OPT_LOCAL_INFILE", mysqli_options($link, MYSQLI_OPT_LOCAL_INFILE, 1));
83-
var_dump("MYSQLI_INIT_COMMAND", mysqli_options($link, MYSQLI_INIT_COMMAND, 'SET AUTOCOMMIT=0'));
89+
var_dump("MYSQLI_READ_DEFAULT_GROUP", mysqli_options($link, MYSQLI_READ_DEFAULT_GROUP, 'extra_my.cnf'));
90+
var_dump("MYSQLI_READ_DEFAULT_FILE", mysqli_options($link, MYSQLI_READ_DEFAULT_FILE, 'extra_my.cnf'));
91+
var_dump("MYSQLI_OPT_CONNECT_TIMEOUT", mysqli_options($link, MYSQLI_OPT_CONNECT_TIMEOUT, 10));
92+
var_dump("MYSQLI_OPT_LOCAL_INFILE", mysqli_options($link, MYSQLI_OPT_LOCAL_INFILE, 1));
93+
var_dump("MYSQLI_INIT_COMMAND", mysqli_options($link, MYSQLI_INIT_COMMAND, 'SET AUTOCOMMIT=0'));
8494

85-
/* mysqli_real_connect() */
86-
var_dump("MYSQLI_CLIENT_SSL", mysqli_options($link, MYSQLI_CLIENT_SSL, 'not a mysqli_option'));
95+
/* mysqli_real_connect() */
96+
var_dump("MYSQLI_CLIENT_SSL", mysqli_options($link, MYSQLI_CLIENT_SSL, 'not a mysqli_option'));
8797

88-
mysqli_close($link);
98+
mysqli_close($link);
8999

90-
echo "Link closed\n";
91-
try {
92-
mysqli_options($link, MYSQLI_INIT_COMMAND, 'SET AUTOCOMMIT=1');
93-
} catch (Error $exception) {
94-
echo $exception->getMessage() . "\n";
95-
}
100+
echo "Link closed\n";
101+
try {
102+
mysqli_options($link, MYSQLI_INIT_COMMAND, 'SET AUTOCOMMIT=1');
103+
} catch (Error $exception) {
104+
echo $exception->getMessage() . "\n";
105+
}
106+
107+
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
108+
$link = mysqli_init();
109+
110+
// test for error reporting
111+
try {
112+
mysqli_options($link, MYSQLI_SET_CHARSET_NAME, "foobar");
113+
} catch (mysqli_sql_exception $e) {
114+
echo $e->getMessage() . "\n";
115+
}
116+
117+
// invalid options do not generate errors
118+
mysqli_options($link, -1, "Invalid option");
96119

97-
print "done!";
120+
print "done!";
98121
?>
99122
--EXPECTF--
100123
%s(25) "MYSQLI_READ_DEFAULT_GROUP"
@@ -123,4 +146,5 @@ bool(true)
123146
bool(false)
124147
Link closed
125148
mysqli object is already closed
149+
Unknown character set
126150
done!

0 commit comments

Comments
 (0)