diff options
Diffstat (limited to 'ext/mysqli')
-rw-r--r-- | ext/mysqli/mysqli_api.c | 28 | ||||
-rw-r--r-- | ext/mysqli/tests/010.phpt | 6 | ||||
-rw-r--r-- | ext/mysqli/tests/bug67839.phpt | 18 |
3 files changed, 42 insertions, 10 deletions
diff --git a/ext/mysqli/mysqli_api.c b/ext/mysqli/mysqli_api.c index 698e6bb5ba..7ea4d6a1a0 100644 --- a/ext/mysqli/mysqli_api.c +++ b/ext/mysqli/mysqli_api.c @@ -33,6 +33,7 @@ #include "zend_smart_str.h" #include "php_mysqli_structs.h" #include "mysqli_priv.h" +#include "ext/mysqlnd/mysql_float_to_double.h" #if !defined(MYSQLI_USE_MYSQLND) @@ -413,9 +414,18 @@ mysqli_stmt_bind_result_do_bind(MY_STMT *stmt, zval *args, unsigned int argc, un col_type = (stmt->stmt->fields) ? stmt->stmt->fields[ofs].type : MYSQL_TYPE_STRING; switch (col_type) { - case MYSQL_TYPE_DOUBLE: case MYSQL_TYPE_FLOAT: stmt->result.buf[ofs].type = IS_DOUBLE; + stmt->result.buf[ofs].buflen = sizeof(float); + + stmt->result.buf[ofs].val = (char *)emalloc(sizeof(float)); + bind[ofs].buffer_type = MYSQL_TYPE_FLOAT; + bind[ofs].buffer = stmt->result.buf[ofs].val; + bind[ofs].is_null = &stmt->result.is_null[ofs]; + break; + + case MYSQL_TYPE_DOUBLE: + stmt->result.buf[ofs].type = IS_DOUBLE; stmt->result.buf[ofs].buflen = sizeof(double); /* allocate buffer for double */ @@ -1021,8 +1031,22 @@ void mysqli_stmt_fetch_libmysql(INTERNAL_FUNCTION_PARAMETERS) } break; case IS_DOUBLE: - ZVAL_DOUBLE(result, *(double *)stmt->result.buf[i].val); + { + double dval; + if (stmt->stmt->bind[i].buffer_type == MYSQL_TYPE_FLOAT) { +#ifndef NOT_FIXED_DEC +# define NOT_FIXED_DEC 31 +#endif + dval = mysql_float_to_double(*(float *)stmt->result.buf[i].val, + (stmt->stmt->fields[i].decimals >= NOT_FIXED_DEC) ? -1 : + stmt->stmt->fields[i].decimals); + } else { + dval = *((double *)stmt->result.buf[i].val); + } + + ZVAL_DOUBLE(result, dval); break; + } case IS_STRING: if (stmt->stmt->bind[i].buffer_type == MYSQL_TYPE_LONGLONG #if MYSQL_VERSION_ID > 50002 diff --git a/ext/mysqli/tests/010.phpt b/ext/mysqli/tests/010.phpt index 83a43e06b6..b1712ca2a6 100644 --- a/ext/mysqli/tests/010.phpt +++ b/ext/mysqli/tests/010.phpt @@ -62,7 +62,7 @@ mysqli_close($link); --EXPECT-- array(7) { [0]=> - float(3.141593) + float(3.14159) [1]=> float(-1.0E-6) [2]=> @@ -70,10 +70,10 @@ array(7) { [3]=> float(1.0E+12) [4]=> - float(0.5646425) + float(0.564642) [5]=> float(1) [6]=> - float(8.888889E+14) + float(8.88889E+14) } done! diff --git a/ext/mysqli/tests/bug67839.phpt b/ext/mysqli/tests/bug67839.phpt index ef4e6c649c..58b2d2fa82 100644 --- a/ext/mysqli/tests/bug67839.phpt +++ b/ext/mysqli/tests/bug67839.phpt @@ -38,19 +38,27 @@ precision=5 die(); } - if (!mysqli_stmt_execute($stmt)) { + $id = null; + $fp4 = null; + $fp8 = null; + + if (!mysqli_stmt_bind_result($stmt, $id, $fp4, $fp8)) { printf("[006] [%d] %s\n", mysqli_errno($link), mysqli_error($link)); die(); } - - if (!($result = mysqli_stmt_get_result($stmt))) { + if (!mysqli_stmt_execute($stmt)) { printf("[007] [%d] %s\n", mysqli_errno($link), mysqli_error($link)); die(); } - $data = mysqli_fetch_assoc($result); - print $data['id'] . ": " . $data['fp4'] . ": " . $data['fp8'] . "\n"; + + if (!(mysqli_stmt_fetch($stmt))) { + printf("[008] [%d] %s\n", mysqli_errno($link), mysqli_error($link)); + die(); + } + + print $id . ": " . $fp4 . ": " . $fp8 . "\n"; ?> --CLEAN-- <?php |