[英]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.