我們知道在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紅包默認的編碼規則。
新聞熱點
疑難解答