优惠券系统的随机码生成器

时间:2011-09-27 01:58:10

标签: php random

这对于随机优惠券代码生成器来说是否足够好?在制作新代码时,我应该检查并查看代码是否已被使用?这会重复的几率是多少?

$coupon_code = substr(base_convert(sha1(uniqid(mt_rand())), 16, 36), 0, 7);

编辑 - 这是我的实际代码:

$coupon_code = substr(base_convert(sha1(uniqid(mt_rand())), 16, 36), 0, 7);
$numrows = mysql_num_rows(mysql_query("SELECT id FROM generatedcoupons WHERE coupon_code='$coupon_code' LIMIT 1"));
if($numrows>0){
     $coupon_code =  substr(base_convert(sha1(uniqid(rand())), 16, 36), 0, 7);
     $numrows = mysql_num_rows(mysql_query("SELECT id FROM generatedcoupons WHERE coupon_code='$coupon_code' LIMIT 1"));
     if($numrows>0)
          //error, show link to retry
}

2 个答案:

答案 0 :(得分:2)

这是一个优惠券系统,不仅可以保证唯一的代码,而且在查找时非常有效:

// assuming MySQL table with (id, code, effect)
mysql_query( "insert into `coupons` set `effect`='".$effect."'");
// "effect" will be some keyword to identify what the coupon does
$id = mysql_insert_id();
$code = $id."F";
$codelen = 32; // change as needed
for( $i=strlen($code); $i<$codelen; $i++) {
    $code .= dechex(rand(0,15));
}
mysql_query( "update `coupons` set `code`='".$code."' where `id`=".$id);

// now, when you are given a code to redeem, say $_POST['code']
list($code,$effect) = mysql_fetch_row( mysql_query( "select `code`, `effect` from `coupons` where `id`='".((int) $_POST['code'])."'"));
if( $code != $_POST['code']) die("Code not valid");
else {
    // do something based on $effect
}

如您所见,它从AUTO_INCREMENT获取ID,附加F,然后使用随机十六进制字符填充。您可以根据需要设置$codelen,但是32应该足够(即使在第一百万张优惠券之后也可以提供大约16 ** 26种组合)。

答案 1 :(得分:0)

对我来说似乎相当随意......我仍然可能会仔细检查一下你创建一个代码时是否已经使用了一个非常轻微的机会,你得到一个重复的数字。
/>

重复的可能性大概超过1 ^ 36 ^ 8或大约1:2,821,109,907,456。

请注意,由于SHA1在十六进制字符串中返回40位数字,如果您希望重复它的可能性较小,您可以随时将您的substr从(0,7)增加到(0,29)(您甚至可以高一点,但我怀疑你想要一个大的数字)

但是我同意你应该在某些数据库中存储某种独特的优惠券ID,以确保你没有重复,这将是一个很好的方式来查看你们创建了多少优惠券(可能是如何很多人习惯了?= D)