diff --git a/ext/mysqli/mysqli_api.c b/ext/mysqli/mysqli_api.c index 68b55e1d78d35..a03d9282a063e 100644 --- a/ext/mysqli/mysqli_api.c +++ b/ext/mysqli/mysqli_api.c @@ -1040,9 +1040,9 @@ PHP_FUNCTION(mysqli_insert_id) /* {{{ Kill a mysql process on the server */ PHP_FUNCTION(mysqli_kill) { - MY_MYSQL *mysql; - zval *mysql_link; - zend_long processid; + MY_MYSQL *mysql; + zval *mysql_link; + zend_long processid; if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "Ol", &mysql_link, mysqli_link_class_entry, &processid) == FAILURE) { RETURN_THROWS(); @@ -1055,7 +1055,14 @@ PHP_FUNCTION(mysqli_kill) MYSQLI_FETCH_RESOURCE_CONN(mysql, mysql_link, MYSQLI_STATUS_VALID); - if (mysql_kill(mysql->mysql, processid)) { + char query[64]; + snprintf(query, sizeof(query), "KILL CONNECTION " ZEND_LONG_FMT, processid); + + if (mysql_real_query(mysql->mysql, query, strlen(query))) { + // 1317 is ER_QUERY_INTERRUPTED from server's side + if (mysql_errno(mysql->mysql) == 1317) { + RETURN_TRUE; + } MYSQLI_REPORT_MYSQL_ERROR(mysql->mysql); RETURN_FALSE; } @@ -1981,14 +1988,36 @@ PHP_FUNCTION(mysqli_store_result) PHP_FUNCTION(mysqli_thread_id) { MY_MYSQL *mysql; + MYSQL_RES *result; + MYSQL_ROW row; zval *mysql_link; + zend_long processid; if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) { RETURN_THROWS(); } MYSQLI_FETCH_RESOURCE_CONN(mysql, mysql_link, MYSQLI_STATUS_VALID); - RETURN_LONG((zend_long) mysql_thread_id(mysql->mysql)); + static const char *query = "SELECT CONNECTION_ID()"; + size_t query_len = strlen(query); + + if (mysql_real_query(mysql->mysql, query, query_len)) { + RETURN_LONG((zend_long)mysql_thread_id(mysql->mysql)); + } + + result = mysql_store_result(mysql->mysql); + if (!result) { + MYSQLI_REPORT_MYSQL_ERROR(mysql->mysql); + RETURN_THROWS(); + } + + row = mysql_fetch_row(result); + processid = (zend_long)strtoll(row[0], NULL, 10); + + efree(row); + mysql_free_result(result); + + RETURN_LONG(processid); } /* }}} */ diff --git a/ext/mysqli/tests/mysqli_kill.phpt b/ext/mysqli/tests/mysqli_kill.phpt index fdc068aeb6add..d7bc49f42a4fd 100644 --- a/ext/mysqli/tests/mysqli_kill.phpt +++ b/ext/mysqli/tests/mysqli_kill.phpt @@ -24,7 +24,7 @@ require_once 'skipifconnectfailure.inc'; printf("[005] Expecting boolean/any, got %s/%s\n", gettype($tmp), $tmp); if ($res = mysqli_query($link, "SELECT id FROM test LIMIT 1")) - pintf("[006] Expecting boolean/false, got %s/%s\n", gettype($res), $res); + printf("[006] Expecting boolean/false, got %s/%s\n", gettype($res), $res); var_dump($error = mysqli_error($link)); if (!is_string($error) || ('' === $error)) @@ -103,11 +103,11 @@ object(mysqli)#%d (%d) { } } ["field_count"]=> - int(0) + int(1) ["host_info"]=> string(%d) "%s" ["info"]=> - %s + NULL ["insert_id"]=> int(0) ["server_info"]=> @@ -115,13 +115,13 @@ object(mysqli)#%d (%d) { ["server_version"]=> int(%d) ["sqlstate"]=> - string(5) "HY000" + string(%d) "%s" ["protocol_version"]=> - int(10) + int(%d) ["thread_id"]=> int(%d) ["warning_count"]=> - int(0) + int(%d) } mysqli_kill(): Argument #2 ($process_id) must be greater than 0 array(1) {