Skip to content

Commit 233f507

Browse files
kamil-tekielanikic
authored andcommitted
Fixed error reporting in mysqli_stmt::__construct
For the sake of simplicity, I've synchronized the implementation with PHP 8, which means null values are also accepted. Closes GH-6454.
1 parent e3e67b7 commit 233f507

File tree

2 files changed

+28
-32
lines changed

2 files changed

+28
-32
lines changed

ext/mysqli/mysqli.c

Lines changed: 17 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1041,51 +1041,38 @@ PHP_FUNCTION(mysqli_stmt_construct)
10411041
zval *mysql_link;
10421042
MY_STMT *stmt;
10431043
MYSQLI_RESOURCE *mysqli_resource;
1044-
char *statement;
1044+
char *statement = NULL;
10451045
size_t statement_len;
10461046

1047-
switch (ZEND_NUM_ARGS())
1048-
{
1049-
case 1: /* mysql_stmt_init */
1050-
if (zend_parse_parameters(1, "O", &mysql_link, mysqli_link_class_entry)==FAILURE) {
1051-
return;
1052-
}
1053-
MYSQLI_FETCH_RESOURCE_CONN(mysql, mysql_link, MYSQLI_STATUS_VALID);
1054-
1055-
stmt = (MY_STMT *)ecalloc(1,sizeof(MY_STMT));
1056-
1057-
stmt->stmt = mysql_stmt_init(mysql->mysql);
1058-
break;
1059-
case 2:
1060-
if (zend_parse_parameters(2, "Os", &mysql_link, mysqli_link_class_entry, &statement, &statement_len)==FAILURE) {
1061-
return;
1062-
}
1063-
MYSQLI_FETCH_RESOURCE_CONN(mysql, mysql_link, MYSQLI_STATUS_VALID);
1064-
1065-
stmt = (MY_STMT *)ecalloc(1,sizeof(MY_STMT));
1066-
1067-
if ((stmt->stmt = mysql_stmt_init(mysql->mysql))) {
1068-
mysql_stmt_prepare(stmt->stmt, (char *)statement, statement_len);
1069-
}
1070-
break;
1071-
default:
1072-
WRONG_PARAM_COUNT;
1073-
break;
1047+
if (zend_parse_parameters(ZEND_NUM_ARGS(), "O|s!", &mysql_link, mysqli_link_class_entry, &statement, &statement_len) == FAILURE) {
1048+
return;
10741049
}
1050+
MYSQLI_FETCH_RESOURCE_CONN(mysql, mysql_link, MYSQLI_STATUS_VALID);
10751051

1076-
if (!stmt->stmt) {
1052+
stmt = (MY_STMT *) ecalloc(1, sizeof(MY_STMT));
1053+
1054+
if (!(stmt->stmt = mysql_stmt_init(mysql->mysql))) {
10771055
efree(stmt);
10781056
RETURN_FALSE;
10791057
}
1058+
10801059
#ifndef MYSQLI_USE_MYSQLND
10811060
ZVAL_COPY(&stmt->link_handle, mysql_link);
10821061
#endif
10831062

10841063
mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE));
10851064
mysqli_resource->ptr = (void *)stmt;
1086-
mysqli_resource->status = (ZEND_NUM_ARGS() == 1) ? MYSQLI_STATUS_INITIALIZED : MYSQLI_STATUS_VALID;
1065+
mysqli_resource->status = MYSQLI_STATUS_INITIALIZED;
10871066

10881067
MYSQLI_REGISTER_RESOURCE_EX(mysqli_resource, getThis());
1068+
1069+
if (statement) {
1070+
if(mysql_stmt_prepare(stmt->stmt, statement, statement_len)) {
1071+
MYSQLI_REPORT_STMT_ERROR(stmt->stmt);
1072+
RETURN_FALSE;
1073+
}
1074+
mysqli_resource->status = MYSQLI_STATUS_VALID;
1075+
}
10891076
}
10901077
/* }}} */
10911078

ext/mysqli/tests/063.phpt

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,18 @@ require_once('skipifconnectfailure.inc');
1616
$stmt->bind_result($foo);
1717
$stmt->fetch();
1818
$stmt->close();
19-
$mysql->close();
20-
2119
var_dump($foo);
20+
21+
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
22+
try {
23+
// an exception should be thrown from prepare (i.e. constructor) not from execute
24+
$stmt = new mysqli_stmt($mysql, "SELECT invalid FROM DUAL");
25+
} catch(mysqli_sql_exception $e) {
26+
echo $e->getMessage()."\n";
27+
}
28+
29+
$mysql->close();
2230
?>
2331
--EXPECT--
2432
string(3) "foo"
33+
Unknown column 'invalid' in 'field list'

0 commit comments

Comments
 (0)