我正在制作我正在创建的客户注册表所需的表单部分。
我的目标是检查客户是否存在,如果存在,则将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循环根本没有更改数字。
所以我想我的更新问题是,如何检查数字是否已被使用过?
答案 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){}
不会。在这种情况下,无关紧要。