1. <rp id="bw1kc"><object id="bw1kc"><blockquote id="bw1kc"></blockquote></object></rp>
      <button id="bw1kc"><acronym id="bw1kc"><u id="bw1kc"></u></acronym></button>
    2. <tbody id="bw1kc"></tbody>

        王者資源網專注于商業源碼、商業教程、商業素材、商業模板、精品軟件分享,為廣大站長朋友提供最優質的服務。
        用戶名:
        密碼:
        注冊

        商業源碼分享

        VIP

        CMS教程

        站長學院

        ecshop中紅包編碼生成規則分析和改進

        www.hongshengok.cn / 2015-08-24
        我們知道在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'] <= 0)
               這一句表示,就算是該編碼沒被使用。只要是發到個人帳戶去之后。即使你登陸了,也不能通過這個編碼來進行使用,所以這就是一大問題。
              其次,我們看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_sum; $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 < $len;  $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紅包默認的編碼規則。
        收縮