2013-10-30 42 views
0

我需要在格式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循環,但不知道如何應用它。

+0

爲什麼要使用一個隨機數生成器,如果你需要做的是確保它是獨一無二的?爲什麼不只是做一個單號?那麼你不必檢查隨機性。只需找到當前存在的最大一個,並從那裏開始? (如果後面有足夠的空間用於你想要的模式) – MJB

+0

我會非常喜歡這個哈哈,但是我正在使用的客戶端堅持使用非增量式解決方案。 – Arun

回答

1

鑑於你的算法,也沒有除了查詢每次生成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; 
} 
+0

謝謝,這正是我所需要的。 – Arun

1

有3個選擇,我能想到的:

  1. 生成一個id並查詢它是否被使用。如果使用,生成另一個並重復,直到找到一個不使用。這可能是最慢的。

  2. 與所有可能的ID的表。從該表中選擇一個隨機行,使用該ID並將其刪除,以便不再使用該行。這需要一個表格來保存這些ID。根據您的需求,這可能是不可能的。

  3. 在PHP中,通過ID查詢所有現有的IDS秩序。循環結果並創建所有ID的數組。從那裏你可以生成,如果存在數組再次生成像#1或使所有可能的ID的數組,array_diff($allIDS, $usedIDs)找到沒有使用和array_rand來獲得一個隨機的。這個選項在php中使用更多的內存來查詢所有現有的ID。

所有3種方法將可能從比賽條件,其中如果兩個請求發生在同一時間的ID可以重複吃虧。 #2可能是最容易防止競爭條件。在刪除查詢中,檢查受影響行的計數(如果使用PDO,則使用PDOStatement :: rowCount),如果爲0,則假定有人在使用它之前獲得了它並獲取另一個ID。

-1

這可以做的工作

$rand = mt_rand(000123,999999); //prefix between 00to 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; 
    } 
}