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