关于intval()函数中数值大于2147483647后溢出的问题

2016-07-07 14:55 来源:www.chinab4c.com 作者:ecshop专家

最近在生成红包序列号后(线下红包,量很大),其中一些生成的红包值超过了2147483647,结果导致这些红包查询结果不存在的问题,仔细查看后发现是intval()函数的问题,因为该函数中数值如果超过2147483647这个数,则会出现溢出的现象。如:
<?php
echo intval(2147483647); // 2147483647
echo intval(2147483648); // -2147483647
echo intval(2987654321); // -1307312975
?>

出现该问题的文件:user.php中

  1. /* 添加一个红包 */
  2. elseif ($action == 'act_add_bonus')
  3. {
  4. include_once(ROOT_PATH . 'includes/lib_transaction.php');
  5. $bouns_sn = isset($_POST['bonus_sn']) ? intval($_POST['bonus_sn']) : '';
  6. if (add_bonus($user_id, $bouns_sn))
  7. {
  8. show_message($_LANG['add_bonus_sucess'], $_LANG['back_up_page'], 'user.php?act=bonus', 'info');
  9. }
  10. else
  11. {
  12. $err->show($_LANG['back_up_page'], 'user.php?act=bonus');
  13. }
  14. }
复制代码


修改之后:
  1. /* 添加一个红包 */
  2. elseif ($action == 'act_add_bonus')
  3. {

  4. include_once(ROOT_PATH . 'includes/lib_transaction.php');

  5. $bouns_sn = isset($_POST['bonus_sn']) ? floor(floatval($_POST['bonus_sn'])) : '';
  6. //或者去掉intval函数:$bouns_sn = isset($_POST['bonus_sn']) ? $_POST['bonus_sn'] : '';

  7. if (add_bonus($user_id, $bouns_sn))
  8. {

  9. show_message($_LANG['add_bonus_sucess'], $_LANG['back_up_page'],
  10. 'user.php?act=bonus', 'info');
  11. }
  12. else
  13. {

  14. $err->show($_LANG['back_up_page'], 'user.php?act=bonus');
  15. }
  16. }
复制代码

回答:
如果红包很多,那么会有此问题。
需要破万个。需要11w多个才行。
但是如果是中数据库中手动添加了,那么而且这个值很大,那么就可能会出错。
如果是后台正常操作,那么允许发布11w多个。

2147483647,这个快捷登录也帮忙弄下吧,会自动修改PID啊,无法快捷登录啊!

在订单ID里面,如果订单特别多,也会溢出..