diff options
Diffstat (limited to 'ext/mysqli/mysqli_api.c')
| -rw-r--r-- | ext/mysqli/mysqli_api.c | 28 | 
1 files changed, 26 insertions, 2 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  | 
