在thinkphp中有个string类系统需要优惠券的生成程序,保证每次生成的优惠券都是唯一的,一次生成的数量不是固定的。
分享我的做法:
1、查出表里已有的优惠码。
2、在外部定义一个值,记录内部实际有效运行的次数。
3、当内部循环的数量等于实际需求生成的数量时,跳出循环。
分享我的做法:
1、查出表里已有的优惠码。
2、在外部定义一个值,记录内部实际有效运行的次数。
3、当内部循环的数量等于实际需求生成的数量时,跳出循环。
4、避免循环的插入数据,手动的拼接SQL语句,然后执行。
$coupon = M('coupon')->getCouponList('codes'); // 此函数php版本 (PHP 5 >= 5.5.0) ,取出结果集中的 ‘code’ 字段 $coupon_list = array_column($coupon, 'codes'); // 实例化 ThinkPHP 系统类 String $string = new \Org\Util\String(); $i = 1; $num = 100; // 指定生成个数 $num,在做封装的时候,可以将这个值作为参数传入 $str = ''; $list = array(); while ($i <= $num) { $str = $string->randString(12); // 调用系统方法生成字符串 // 判断随机码和已经存在的是否冲突,如果冲突,则再重新生成一次,因为没有执行$i++,所以会生成$num个为止 if (in_array($str, $coupon_list) === false) { $list[] = $str; $coupon_list[] = $str; // 将生成的随机码写入 $coupon_list 用于下次判断是否冲突 $i++; } }; $sql = ''; foreach ($list as $k => $v) { $sql .= "INSERT INTO coupon (codes,addtime) VALUES('" . $v . "'," . time() . ");"; // 字段设置根据数据表来定 } // 将上面 foreach 生成的组合sql语句批量插入数据库 $info = M()->execute($sql);