红包序列号增加长度后,出现验证错误的问题,高手请进

2016-07-07 15:18 来源:www.chinab4c.com 作者:ecshop专家



我用的是ecshop2.7.2(0604)版
搜索了论坛中关于增加长度的方法,修改了user.js和bouns.php中的相关代码,具体如下:
第一,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++;
}


这样修改后,可以生成16位的红包序列号,如图
zzz.jpg
出现的问题是:
用这些系统生成的序列号,在前台用户中心添加红包的时候,提示红包不存在,可是在mysql数据库中,可以看到生成的序列号。
怎么解决这个问题呢,还需要修改什么地方,盼高手解答

回答:
这个问题很难么,呵呵

没人懂么?高手呢

不是很清楚!

呵呵,等待高手!!!!

很奇怪,在购物流程中,结算的时候红包可以验证过去,但是在用户中心却无法添加红包,问题应该出在lib_transaction.php,但是不知道怎么改,高手快进来

问题应该出在这段代码中,不知道是不是?
  1. /**
  2. *给指定用户添加一个指定红包
  3. *
  4. * @accesspublic
  5. * @paramint$user_id用户ID
  6. * @paramstring$bouns_sn 红包序列号
  7. *
  8. * @returnboolen$result
  9. */
  10. function add_bonus($user_id, $bouns_sn)
  11. {
  12. if (empty($user_id))
  13. {
  14. $GLOBALS['err']->add($GLOBALS['_LANG']['not_login']);

  15. return false;
  16. }

  17. /* 查询红包序列号是否已经存在 */
  18. $sql = "SELECT bonus_id, bonus_sn, user_id, bonus_type_id FROM " .$GLOBALS['ecs']->table('user_bonus') .
  19. " WHERE bonus_sn = '$bouns_sn'";
  20. $row = $GLOBALS['db']->getRow($sql);
  21. if ($row)
  22. {
  23. if ($row['user_id'] == 0)
  24. {
  25. //红包没有被使用
  26. $sql = "SELECT send_end_date, use_end_date ".
  27. " FROM " . $GLOBALS['ecs']->table('bonus_type') .
  28. " WHERE type_id = '" . $row['bonus_type_id'] . "'";

  29. $bonus_time = $GLOBALS['db']->getRow($sql);

  30. $now = gmtime();
  31. if ($now > $bonus_time['use_end_date'])
  32. {
  33. $GLOBALS['err']->add($GLOBALS['_LANG']['bonus_use_expire']);
  34. return false;
  35. }

  36. $sql = "UPDATE " .$GLOBALS['ecs']->table('user_bonus') . " SET user_id = '$user_id' ".
  37. "WHERE bonus_id = '$row[bonus_id]'";
  38. $result = $GLOBALS['db'] ->query($sql);
  39. if ($result)
  40. {
  41. return true;
  42. }
  43. else
  44. {
  45. return $GLOBALS['db']->errorMsg();
  46. }
  47. }
  48. else
  49. {
  50. if ($row['user_id']== $user_id)
  51. {
  52. //红包已经添加过了。
  53. $GLOBALS['err']->add($GLOBALS['_LANG']['bonus_is_used']);
  54. }
  55. else
  56. {
  57. //红包被其他人使用过了。
  58. $GLOBALS['err']->add($GLOBALS['_LANG']['bonus_is_used_by_other']);
  59. }

  60. return false;
  61. }
  62. }
  63. else
  64. {
  65. //红包不存在
  66. $GLOBALS['err']->add($GLOBALS['_LANG']['bonus_not_exist']);
  67. return false;
  68. }

  69. }
复制代码

呵呵,终于发现了问题的所在,是一个函数的问题,哈哈

问题解决,20位也没有问题,呵呵

是否把解决方法给我们大家公布一下

是否把方法给我们大家说一下

先不要说了,因为我还不知道这样改会不会导致程序漏洞

楼主真不厚道。。。。。。

知道为什么你遇到的问题大家不怎么帮你解决吗?因为你不懂得分享。。



鄙视楼主这样的人,自己解决问题不说方法,这样的人永远没有人理他。

我说一下吧,原因处在intval这个函数,在调用lib_transcation.php里面的add_bonus函数之前,作者把post上来的红包序列号应用了该函数,导致序列号过大的时候,返回值产生了变化,所以一直报“红包不存在”的提示。就此,我是把intval这个函数换成了trim,也就是不整型化该值。
更加详细的信息:请访问PHP博客 http://www.phpiask.com/?p=462