2015-08-21 65 views
0

你好,所以首先請考慮這個問題作爲一個新手,因爲我可以設置一個ID字段,並添加zerofill,所以它看起來像000001,000002等堡壘。但是我做的是錯誤的,系統已經很大,請考慮我的問題。我有一個名爲accounts的表,其中有id字段和sponsorID字段。現在我所做的看起來是這樣的(順便說一句,我用纖細的框架):PHP PDO獨特的隨機數發生器

$db = new db(); 
$sponsorIDrandom = mt_rand(100000, 999999); 
$bindCheck  = array(
    ":sponsorID" => $sponsorIDrandom 
); 
$sponsorIDChecker = $db->select("accounts", "sponsorID = :sponsorID", $bindCheck); 

$generate_SID = null; 
do { 
    $generate_SID = mt_rand(100000, 999999); 
} while (in_array($generate_SID, array_column($sponsorIDChecker, 'sponsorID'))); 

$db->insert("accounts", array(
     "sponsorID" => $generate_SID 
    )); 

上面的代碼將檢查一些賬目表中已經存在,如果有一個現有的,它會產生一個隨機數再次直到它在帳戶表中變得唯一或不存在。我製作了sponsorID字段unique,以便它不會接受重複的值。

現在的問題是我發佈的代碼。我認爲它會讓$generate_SID是唯一的,因爲我使用了in_array函數,因此它將檢查數組中是否已經存在一個值,並且再次生成一個數字,直到它是唯一的,但是我確實收到了它嘗試插入一個錯誤隨機數已經存在,並且沒有產生新的數字。

任何人都可以告訴我,如果有解決方案嗎?或者我應該重新修改上面的代碼,以便它不會進入已有的sponsorID?先謝謝你。

+0

究竟是什麼問題?你從這個時候期待什麼,但你從來沒有提到你得到什麼,或者我沒有看到它。 –

+0

插入部件在哪裏? – zeflex

回答

0

從我的理解,你嘗試插入一個唯一的ID到表中,但發電機只運行一次,或者它告訴你,該號碼已經存在。

我從來沒有用過渺茫,但它似乎在你的代碼,你嘗試做單記錄的SELECT,因爲你生成一個隨機數,然後問這個號碼數據庫:

$sponsorIDrandom = mt_rand(100000, 999999); 
$bindCheck  = array(
    ":sponsorID" => $sponsorIDrandom 
); 
$sponsorIDChecker = $db->select("accounts", "sponsorID = :sponsorID", $bindCheck); 

如果你說sponsorID是獨特的,這隻返回一個或沒有行。

然後您嘗試生成另一個隨機數並根據此單個(或空)記錄檢查是否不重複。

$generate_SID = null; 
do { 
    $generate_SID = mt_rand(100000, 999999); 
} while (in_array($generate_SID, array_column($sponsorIDChecker, 'sponsorID'))); 

,因爲本次的隨機數的概率是這裏面記錄(如果有記錄的話)這個循環只執行一次,幾乎沒有,如果數據庫是一樣大的,你說,那麼碰撞概率太高。

要使這段代碼正常工作,您需要加載每條記錄或要求新生成的數字(如果它在數據庫中每次生成時都存在),則不建議使用兩種替代方法,但由於數據庫已經(幾乎)已滿。

$sponsorIDChecker = $db->select(...); //use the equivalent of "SELECT sponsorID from accounts" without the WHERE clause, is better to ask for a single column. 
$generate_SID = null; 
do { 
    $generate_SID = mt_rand(100000, 999999); 
} while (in_array($generate_SID, ...)); //here you put the result of the query above. 

$db->insert("accounts", array(
     "sponsorID" => $generate_SID 
    )); 

現在,一些可能會有所幫助:如果你設置了sponsorID作爲DATABSE一個ZEROFILL如你所說

我可以只設置一個ID字段並添加ZEROFILL所以它看起來像000001,000002等堡壘。 然後您可以將最小值mt_rand降至0,並且您可以獲得100000個以上的ID進行嘗試。