diff --git a/ext/mysqli/mysqli_nonapi.c b/ext/mysqli/mysqli_nonapi.c index 394afc7ccc993..76b02d4a50beb 100644 --- a/ext/mysqli/mysqli_nonapi.c +++ b/ext/mysqli/mysqli_nonapi.c @@ -1039,6 +1039,7 @@ PHP_FUNCTION(mysqli_set_charset) MYSQLI_FETCH_RESOURCE_CONN(mysql, mysql_link, MYSQLI_STATUS_VALID); if (mysql_set_character_set(mysql->mysql, cs_name)) { + MYSQLI_REPORT_MYSQL_ERROR(mysql->mysql); RETURN_FALSE; } RETURN_TRUE; diff --git a/ext/mysqli/tests/mysqli_set_charset.phpt b/ext/mysqli/tests/mysqli_set_charset.phpt index 43b8be3f0017c..9c66116081e35 100644 --- a/ext/mysqli/tests/mysqli_set_charset.phpt +++ b/ext/mysqli/tests/mysqli_set_charset.phpt @@ -102,6 +102,20 @@ if ((($res = mysqli_query($link, 'SHOW CHARACTER SET LIKE "latin1"', MYSQLI_STOR } mysqli_free_result($res); + // Make sure that set_charset throws an exception in exception mode + mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); + try { + $link->set_charset('invalid'); + } catch (\mysqli_sql_exception $exception) { + echo $exception->getMessage() . "\n"; + } + + try { + $link->set_charset('ucs2'); + } catch (\mysqli_sql_exception $exception) { + echo $exception->getMessage() . "\n"; + } + mysqli_close($link); try { @@ -117,5 +131,7 @@ if ((($res = mysqli_query($link, 'SHOW CHARACTER SET LIKE "latin1"', MYSQLI_STOR require_once("clean_table.inc"); ?> --EXPECT-- +Invalid character set was provided +Variable 'character_set_client' can't be set to the value of 'ucs2' mysqli object is already closed done! diff --git a/ext/mysqlnd/mysqlnd_connection.c b/ext/mysqlnd/mysqlnd_connection.c index 252c05f676dd2..9f34c0407004b 100644 --- a/ext/mysqlnd/mysqlnd_connection.c +++ b/ext/mysqlnd/mysqlnd_connection.c @@ -1152,8 +1152,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, set_charset)(MYSQLND_CONN_DATA * const conn, c DBG_INF_FMT("conn=%llu cs=%s", conn->thread_id, csname); if (!charset) { - SET_CLIENT_ERROR(conn->error_info, CR_CANT_FIND_CHARSET, UNKNOWN_SQLSTATE, - "Invalid characterset or character set not supported"); + SET_CLIENT_ERROR(conn->error_info, CR_CANT_FIND_CHARSET, UNKNOWN_SQLSTATE, "Invalid character set was provided"); DBG_RETURN(ret); } @@ -1161,9 +1160,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, set_charset)(MYSQLND_CONN_DATA * const conn, c char * query; size_t query_len = mnd_sprintf(&query, 0, "SET NAMES %s", csname); - if (FAIL == (ret = conn->m->query(conn, query, query_len))) { - php_error_docref(NULL, E_WARNING, "Error executing query"); - } else if (conn->error_info->error_no) { + if (FAIL == (ret = conn->m->query(conn, query, query_len)) || conn->error_info->error_no) { ret = FAIL; } else { conn->charset = charset;