[英]How to generate a unique random number in a specific format and check that it is not used?
我需要生成格式为105-#####的随机数,并且需要在将其保存到数据库以确保它不存在之前,对照已创建的数字检查此生成的数字。
这是我自己生成数字的代码:
$digits = 5;
$second_num = str_pad(rand(0, pow(10, $digits)-1), $digits, '0', STR_PAD_LEFT);
$order_gen = "105-".$second_num;
现在,我有了这个$ order_gen编号,最好的方法是循环遍历order_number数据库表中已有的内容以确保没有重复项? 我当时在考虑使用while循环,但不确定如何应用它。
对于您的算法,没有什么更好的方法了,除了查询数据库以生成的每个ID,直到找到一个未被使用的ID。
将整个内容包装在do/while
语句中,并定义一个通过该随机ID查询数据库的方法,如果记录存在,则返回true,否则返回false:
do {
$digits = 5;
$second_num = str_pad(rand(0, pow(10, $digits)-1), $digits, '0', STR_PAD_LEFT);
$order_gen = "105-".$second_num;
} while (record_exists($order_gen);
或者,随机生成一次,然后递增直到找到未取的数字:
$digits = 5;
$second_num = str_pad(rand(0, pow(10, $digits)-1), $digits, '0', STR_PAD_LEFT);
$order_gen = "105-".$second_num;
while (record_exists($order_gen) {
$second_num += 1
$second_num = str_pad($second_num, '0', STR_PAD_LEFT);
$order_gen = "105-".$second_num;
}
我可以想到3种选择:
生成一个id并查询以查看是否使用了它。 如果使用,请生成另一个并重复直到找到一个未使用的。 这可能是最慢的。
有一个包含所有可能ID的表。 从该表中选择一个随机行,使用该ID并将其删除,以免再次使用。 但是,这需要一个仅用于保存这些ID的表。 根据您的需要,这可能无法实现。
在PHP中,按ID查询所有现有ID。 遍历结果并制作所有ID的数组。 从那里您可以生成(如果存在于数组中),如#1那样再次生成,或者将所有可能的id组成一个数组, array_diff($allIDS, $usedIDs)
查找未使用的数组,array_rand获取一个随机数组。 此选项在php中使用更多内存,必须查询出所有现有ID。
如果同时发生两个请求,则这3种方法都可能会遇到竞争条件,其中一个ID可能重复。 #2可能最容易防止比赛条件。 在删除查询上,检查受影响的行数(如果使用PDO,则为PDOStatement :: rowCount),如果为0,则在使用它之前先假定有人得到它,然后再获得另一个ID。
这可以做的工作
$rand = mt_rand(000123,999999); //prefix between 000123 to 999999
$id = "105".$rand;
$error = true;
while($error){
$query = "SELECT id FROM table WHERE id = '$id'";
$result = mysqli_query($conn,$query);
$count = mysqli_num_rows($result);
if($count!=0){
$error = true;
$rand = mt_rand(000123,999999);
$id = "105".$rand;
}else{
$error = false;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.