Bug #52891 [Asn->Csd]: Wrong data inserted with mysqli/mysqlnd when using bind_param,value>LONG_MAX
| From: | andrey@php.net | Date: | Wed, 22 Sep 2010 12:18:47 +0000 |
| Subject: | Bug #52891 [Asn->Csd]: Wrong data inserted with mysqli/mysqlnd when using bind_param,value>LONG_MAX | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-154564@lists.php.net to get a copy of this message | ||
Edit report at http://bugs.php.net/bug.php?id=52891&edit=1
ID: 52891
Updated by: andrey@php.net
Reported by: andrey@php.net
Summary: Wrong data inserted with mysqli/mysqlnd when using
bind_param,value>LONG_MAX
-Status: Assigned
+Status: Closed
Type: Bug
Package: MySQLi related
Operating System: All
PHP Version: 5.3SVN-2010-09-20 (SVN)
Assigned To: mysql
Block user comment: N
New Comment:
Fix will be part of 5.3.4
Previous Comments:
------------------------------------------------------------------------
[2010-09-22 13:38:51] andrey@php.net
Automatic comment from SVN on behalf of andrey
Revision: http://svn.php.net/viewvc/?view=revision&revision=303671
Log: Fix for
Bug #52891 Wrong data inserted with mysqli/mysqlnd when using
bind_param,value>LONG_MAX
------------------------------------------------------------------------
[2010-09-20 08:56:45] andrey@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