因为涉及大量数据,且需要一定的稳定性不能出错,所以使用了mysql的事物。
所谓事物简单理解就是要么包含的所有sql全部执行,要么一条都别执行。
这里我用的是tp5框架,不用框架思路也是一样的。
核心主要是事物+批量录入卡号+验证卡密码唯一性。
public function setCard($data,$id){
Db::startTrans();//准备事物
try{
$card = model('CardType')->getOneData(' * ',['id'=>$data['cardtype']]);//获取卡分类
$table = 'card_'.$card->mark;
$card_id = Db::table($table)->field('max(id) id')->find();//获取最大卡号
//准备数据
$sql = "INSERT INTO `{$table}` (`id`,`password`,`product_id`) VALUES ";
$i = $data['num'];
$card_id = empty($card_id['id']) ? 10000000 : $card_id['id'];
$str = '';
$old_psw = array();
for ($i;$i>0;$i--){
if ($i != $data['num'])$str .= ',';
++$card_id;
$t = true;
while ($t){//处理可能重复的卡号
$psw = rand(10000001,99999999).rand(10000001,99999999);
if (!in_array($psw,$old_psw)){
if (!Db::table($table)->field('id')->where('password = '.$psw)->find()){
$t = false;
$old_psw[] = $psw;
}
}
}
$str .= '('.$card_id.','.$psw.','.$id.')';
}
$sql = $sql.$str;
unset($old_psw);
Db::query($sql);
unset($sql);
unset($str);
Db::commit();
} catch (\Exception $e) {
// 回滚事务
Db::rollback();
return false;
}
return true;
}