第一,user.js中,把原来的10改为16
function addBonus()
{
var frm = document.forms['addBouns'];
var bonus_sn = frm.elements['bonus_sn'].value;
if (bonus_sn.length == 0)
{
alert(bonus_sn_empty);
return false;
}
else
{
var reg = /^[0-9]{16}$/;
if ( ! reg.test(bonus_sn))
{
alert(bonus_sn_error);
return false;
}
}
return true;
}
第二,把bouns.php中的代码修改如下
/* 生成红包序列号 */
$num = $db->getOne("SELECT MAX(bonus_sn) FROM ". $ecs->table('user_bonus'));
$num = $num ? floor($num / 10000) : 100000;
for ($i = 0, $j = 0; $i < $bonus_sum; $i++)
{
$bonus_sn = ($num + $i) . str_pad(mt_rand(0, 9999999999), 10, '0', STR_PAD_LEFT);
$db->query("INSERT INTO ".$ecs->table('user_bonus')." (bonus_type_id, bonus_sn) VALUES('$bonus_typeid', '$bonus_sn')");
$j++;
}
呵呵……其实是个小问题,但是不能不说是Ecshop团队中的测试部门不够尽职。在红包使用过程中,如果数值较小例如红包序列号是:1000056556这样的,是没有问题的,如果超过一定数值(我遇到的是:2745225862之类)之后就会在添加红包的时候误报为:该红包不存在。
问题在于,在user.php的添加红包流程中,Ecshop团队在post上来的bonus_sn上应用了intval函数,该段代码类似于下:
$bouns_sn = isset($_POST['bonus_sn']) ? intval($_POST['bonus_sn']) : ”;
而intval函数并非我们想象中的听话,在遇到一些超大的数据的时候例如:intval(2745225862)返回值并非我们期望的是:2745225862,而是-1549741434,这就会导致lib_transaction.php在执行add_bonus函数的时候,在数据库中无法查询到该红包————要是能查到才怪呢!故而报:该红包不存在,的提示。
把user.php的添加红包流程中的这句话:
$bouns_sn = isset($_POST['bonus_sn']) ? intval($_POST['bonus_sn']) : ”;
修改为:
$bouns_sn = isset($_POST['bonus_sn']) ? trim($_POST['bonus_sn']) : ”;
就可以了!
具体关于PHP 中intval为啥会这样返回,期待有钻研精神的兄弟们留言给个答案,以补充该文,谢谢。
补充:
在PHP中 intval的取值范围:
与操作系统相关,
32位系统上为-2147483648到2147483647,
64位系统上为-9223372036854775808到9223372036854775807
有因有果,关于ecshop的红包添加报红包不存在的提示,至此圆满解决。

