为每个客户生成一个随机数

时间:2017-01-24 05:04:03

标签: php

我正在制作我正在创建的客户注册表所需的表单部分。

我的目标是检查客户是否存在,如果存在,则将customerid输出到输入框中。如果客户不存在,则应在输入框中生成一个6位数字。

这是我的代码:

if(!empty($row['customerid'])) {
    echo '<input class="input-xlarge focused" disabled id="focusedInput" name="customerID" value="'.$row['customerid'].'">';
} else {
    $six_digit_random_number = mt_rand(100000, 999999);
    $sql = "SELECT * FROM customers WHERE customerid='$six_digit_random_number'";
    $loop = 0;
    while($row = $result->fetch_assoc()){
        if($loop == 10) {
            echo "CANNOT GENERATE RANDOM NUMBER";
            die();
        }
        $six_digit_random_number = mt_rand(100000, 999999);
        $loop++;
    }
    echo '<input class="input-xlarge focused" disabled id="focusedInput" name="customerID" value="'.$six_digit_random_number.'">';
}

我的问题是,while循环是否真的会阻止重复,或者是否有我忽略的东西?

- UPDATE 我使用数据库中已存在的数字切换了原始$six_digit_random_number,并且while循环根本没有更改数字。

所以我想我的更新问题是,如何检查数字是否已被使用过?

1 个答案:

答案 0 :(得分:1)

然后你必须做这样的事情(未经测试)

   $sql = "SELECT customerid FROM customers WHERE customerid=:random_number";
   $stmt = $DB->prepare($sql);
  do{
       //generate random number
       $six_digit_random_number = mt_rand(100000, 999999);
       //search for it
       $stmt->excute([':random_number' => $six_digit_random_number]);
       if( !$stmt->fetch() ){
           //exit loop if it matches.
           break;
       }
  }while(true);


  //$six_digit_random_number  save user with the unique number

让我为你打破逻辑。

创建新用户时,需要无限循环。在该循环的每次迭代

  • 制作一个随机数
  • 检查现有

现在,当fetch返回false表示该号码从未保存过时,请使用break退出循环。 $six_digit_random_number的最后一个值仍然设置。因此,在退出循环后,插入具有该编号的新用户。

下一个用户不能使用相同的号码,因为fetch将返回结果,循环将继续并生成新号码。依此类推,直到创造一个未使用的时间为止。

主要缺点是,如果您有很多用户可以对数据库进行大量查询,请确保将该字段设置为int并在架构中具有唯一索引。这将改善查询性能,因为只返回一个字段(这就是你所需要的),而不是*

有道理。

-note-我喜欢使用do{ }while(true);语法,因为它不太可能被误认为是错误的后者。它比使用while(true){ }更具可读性,然后唯一的区别是使用do循环,循环在评估之前发生,因此do{ }while(0)将运行1次while(0){}不会。在这种情况下,无关紧要。