找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 182|回复: 0

[cms教程] ecshop中红包编码生成规则分析和改进

[复制链接]

该用户从未签到

发表于 2015-8-24 23:06:58 | 显示全部楼层 |阅读模式

您需要 登录 才可以下载或查看,没有账号?立即注册

×
我们知道在ecshop后台的促销管理里面,有红包的功能。ecshop红包的功能无非就是可以直接抵消现金的作用,ecshop红包有两类型,一种是直接发送到个人帐户上去的。就是存储在ecs_user_bonus表中的,这个一旦发送到客户的帐户上去。那么意味着别人拿到了这个编码,也不能使用这个编码进行抵扣。另外一种ecshop红包就是线下发送的。当你得到这个编码,在红包的有效期内,可以使用该红包。
             我们必须知道,ecshop的红包编码是有问题的。我们看flow.php
             if (((!empty($bonus) && $bonus['user_id', == $_SESSION['user_id',) || ($bonus['type_money', > 0 && empty($bonus['user_id',))) && $bonus['order_id',
               这一句表示,就算是该编码没被使用。只要是发到个人帐户去之后。即使你登陆了,也不能通过这个编码来进行使用,所以这就是一大问题。
              其次,我们看ecshop红包的编码生成机制。
              $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_sn = ($num + $i) . str_pad(mt_rand(0] 9999)] 4, '0', STR_PAD_LEFT);
                $db->query("INSERT INTO ".$ecs->table('user_bonus')." (bonus_type_id, bonus_sn) VALUES('$bonus_typeid', '$bonus_sn')");
                $j++;
            }
             首先我们看清楚,当你的红包编码达到了几百完以上,就容易产生重复的编码。其次,在录入红包编码的时候,根本没判断是否有重复的红包,这就造成了很大的问题,如果红包编码重复,那将是非常严重的问题
            $db->query("INSERT INTO ".$ecs->table('user_bonus')." (bonus_type_id, bonus_sn) VALUES('$bonus_typeid', '$bonus_sn')");
            为了解决这个问题,首先我们必须保证在录入编码之前,确保该编码没重复,所以必须判断数据库中是否有该编码。那么我们就必须对bonus_sn 来进行扫描判断,那么多数据如何提高扫描速度呢。我们必须在bonus_sn上建立索引。其次,我们可以修改红包编码的规则。既然是十位,我们就可以用我们自己的办法来得到。
            static function GenSecret($len=6, $type=self::CHAR_WORD)
            {
                $secret = '';
                for ($i = 0; $i
                    if ( self::CHAR_NUM==$type ){
            if (0==$i) {
             $secret .= chr(rand(49, 57));
            } else {
             $secret .= chr(rand(48, 57));
            }
                    }else if ( self::CHAR_WORD==$type ){
                        $secret .= chr(rand(65, 90));
                    }else{
                        if ( 0==$i ){
                            $secret .= chr(rand(65, 90));
                        } else {
                            $secret .= (0==rand(0]1))?chr(rand(65, 90)):chr(rand(48,57));
                        }
                    }
                }
                return $secret;
            }
           这个方法,要强过ecshop红包默认的编码规则。
回复

使用道具 举报

网站地图|页面地图|文字地图|Archiver|手机版|小黑屋|找资源 |网站地图

GMT+8, 2024-10-6 20:37

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表