我偶然发现了一个奇怪的错误/问题。
我有一个MySQL表,其中一列填充了数字(BIGINT)。这些数字对于常规的32位整数来说太大了,因此PHP会将它们转换为32位的字符串。这样每次都能得到正确的结果。
当在64位PHP上运行并且没有强制转换为json_encode
的字符串时,结果将有时减1,这样像1293203059233这样的数字变为1293203059232.这是显然没有好处。奇怪的是我看不到任何模式。
它不是随机发生的,因为MySQL中的一行有时会递减,有时也不会递减,但是总是会递减相同的整数/行,并且总是递减1.
是什么导致这个?我使用stdClass
将arrays()
- 对象或mysqli
转换为文本,然后通过常规HTTP响应发送它们。
$stmt = $sql->prepare->("SELECT BIGNUMBER FROM table WHERE SOMEID = ?");
$stmt->bind_result($bignumber);
$stmt->bind_param("i",$someid);
$stmt->execute();
$stmt->fetch();
$stmt->close();
$obj = new stdClass();
$obj->number = $bignumber;
echo json_encode($obj);
使用预先准备的语句检索行,如:
10205160559939609 -> 10205160669939608 // bad
我已经验证浏览数据库表时所有整数都是正确的。
一些例子(这些是实际值):
没有强制转换为字符串:
10205160559939609 -> "10205160559939609" // good
使用:
10154493437278508 -> 10154493437278508 // good (?)
没有强制转换为字符串:
10154493437278508 -> "10154493437278508" // good
with:
as Strng: (used error_log((string)$number);)
10205160559939609
as int: (used error_log($number);)
10205160559939609
编辑:我做了一个error_log测试pre-json_encode来测试,产生:
{{1}}
这表明php确实获得了正确的值,并且错误发生在php json_encode或浏览器的解码方法中。
答案 0 :(得分:2)
只需在Chrome控制台中键入10205150669939609即可打印出10205150669939608(舍入效果)。我想这个整数在JS中无效,所以它们也不应该是JSON。如果我的值很大,我就会使用字符串。