Edit report at http://bugs.php.net/bug.php?id=52891&edit=1

 ID:                 52891
 Updated by:         and...@php.net
 Reported by:        and...@php.net
 Summary:            Wrong data inserted with mysqli/mysqlnd when using
                     bind_param,value>LONG_MAX
-Status:             Open
+Status:             Assigned
 Type:               Bug
 Package:            MySQLi related
 Operating System:   All
 PHP Version:        5.3SVN-2010-09-20 (SVN)
-Assigned To:        
+Assigned To:        mysql
 Block user comment: N



Previous Comments:
------------------------------------------------------------------------
[2010-09-20 08:56:45] and...@php.net

Description:
------------
LONG_MAX is differs from platform to platform. 

Because zval internally uses a signed long for integer fields when the
value in the script is over LONG_MAX, or under -LONG_MAX-1 then the
value is fit into a double. When using mysqli_stmt_bind_param with such
a value and "i" modifier then the value is converted back to long, which
results in incorrect results - like if the VALUE was LONG_MAX+1 the
result will be -1 (internally it is a signed long).

Test script:
---------------
CREATE TABLE tint(a bigint unsigned);





./php -r
'$c=mysqli_connect("127.0.0.1","root","root","test");$s=$c->prepare("insert
into tint
values(?)");$param=4294967295;$s->bind_param("i",$param);var_dump($s->execute());'

bool(true)

Expected result:
----------------
Don't bork the data. Check if the value can't be fit into a long, and if
this is the case use string to send to the server (changing the modifier
to "s" just for the next execution, preserve "i" for further
executions).

Actual result:
--------------
-1


------------------------------------------------------------------------



-- 
Edit this bug report at http://bugs.php.net/bug.php?id=52891&edit=1

Reply via email to