如果重複,如何回到上一個步驟再繼續?

$public_prod_id = 'C'.rand(1000000000,9999999999);
    $_SESSION['public_prod_id'] = $public_prod_id;

 $exist = mysqli_num_rows($pdo->query(
      "SELECT * FROM `product`
      WHERE `public_prod_id` = '{$_SESSION['public_prod_id']}' "
    ));
if($exist == 0){
$pdo->query(
      "INSERT INTO ``
      (
        ``
      )
      VALUES
      (
        '{}'
      )
      "
    );
 }

如果找到的結果是大於0
那我如何回到上面再產生一組新的號碼,然後再重新走一次?

阅读 2.1k
3 个回答
// 1. 找到可用的id
do{
    $public_prod_id = 'C'.rand(1000000000,9999999999);
    $_SESSION['public_prod_id'] = $public_prod_id;

     $exist = mysqli_num_rows($pdo->query(
          "SELECT * FROM `product`
          WHERE `public_prod_id` = '{$_SESSION['public_prod_id']}' "
    ));
}while($exist > 0);
// 2. 插入数据
INSERT INTO ...

以上方法有一个问题,在1和2之间如果有新的重复,尽管概率很低,但是插入的时候依然会报错。
改进:

do{
    $public_prod_id = 'C'.rand(1000000000,9999999999);
    $_SESSION['public_prod_id'] = $public_prod_id;

     $exist = mysqli_num_rows($pdo->query(
          "SELECT * FROM `product`
          WHERE `public_prod_id` = '{$_SESSION['public_prod_id']}' "
    ));
    if($exist == 0){
        try{
            Insert ...
        }catch(\Exception $e){
            $exists = 1;
        }
    }
}while($exist > 0);

这样其实还有一个问题,随着数据量的增大,这个函数重复执行的次数会越来越多。

  1. 使用一个id池,每次从id池中取id,用过立即去掉
  2. 调整id的生成策略

while continue break;

把这个操作封装成一个函数,如果查询结果大于0就再调用自己一次,直到满足你的条件再退出

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题