2013-07-22 44 views
1

我正在學習PHP並試圖正確使用while和continue表達式。使用while()並在PHP中繼續

我有一個腳本可以創建一個6位數的PIN碼,我想確保它是唯一的,否則我想生成另一個PIN碼。

while(1) { 
    $pin = rand(111111,999999); 
    $sel = mysql_query("SELECT * FROM formusers WHERE pin = '$pin'"); 
    if(mysql_num_rows($sel) != 0) { continue; } 

    mysql_query("INSERT INTO formusers(email,password,pin) VALUES('".$_POST['srEmail']."','".$_POST['srPass']."','".$pin."')"); 
    if(mysql_affected_rows()!=-1) { 
     echo "Pin:" . $pin; 
     exit; 
    } else { 
     echo "Existing email, try again<br />"; 
    } 
    break; 
} 

我的語法是否正確?它似乎工作,但我沒有辦法在rand()函數創建兩次相同的PIN的情況下進行調試。

此外,如果我沒有用完獨特的PIN碼,這裏會發生什麼?想必它會無限循環?有什麼辦法可以防止這種情況發生?

+2

這是密碼重置電子郵件的密碼?或者用戶的唯一ID?如果它是一個唯一的ID,那麼不要把它作爲一個隨機數字。你會以比預期更快的速度碰撞FAR(查看'生日悖論')。對ids使用增量INT。如果它是一個密碼重置,那麼它很容易猜到。 –

+0

他的邏輯看起來很適合我。是的,他在沒有條件的情況下突破,但他仍然處於一種狀態。是的,這有點複雜,但邏輯看起來是正確的,雖然這可以做得更清楚一點。 – mti2935

+0

此問題的解決方案對隨機唯一值有很好的解釋。 [解決方案](http://stackoverflow.com/questions/7579570/loop-until-passcode-is-unique) – Peter

回答

2

是的,代碼的作品,但正如所述的無限循環有關。你可能可以這樣解決:

var $i = 0; 

while($i < 10) { 
    $i++; 

    $pin = rand(111111,999999); 
    $sel = mysql_query("SELECT * FROM formusers WHERE pin = '$pin'"); 
    if(mysql_num_rows($sel) != 0) { continue; } 

    mysql_query("INSERT INTO formusers(email,password,pin) VALUES('".$_POST['srEmail']."','".$_POST['srPass']."','".$pin."')"); 
    if(mysql_affected_rows()!=-1) { 
     echo "Pin:" . $pin; 
     exit; 
    } else { 
     echo "Existing email, try again<br />"; 
    } 
    break; 
} 

這將確保你永遠不會超過10次迭代。但是,更大的問題可能是,即使這樣的抽樣規模在未來也不會起作用。這提出了一些難題。一種可能的方法是確定在開始循環之前存在多少個唯一的數字,然後迭代多次,但這種方法類似於如下的方法:(可能,我對大O不是很好,我不喜歡只是知道它會很糟糕)。

0

您可以播種隨機的,所以它可以讓你每次都相同的值,你運行它:

srand (55); //Or some other value. 

while循環語法看起來還好我。

2

你可以利用這個php數組鍵的獨特性質。

function getPins($qty){ 
    $pins = array(); 
    while (count($pins) < $qty){ 
     $pins[rand(111111,999999)] = ""; 
    } 
    return array_keys($pins); 
} 

這將確保對於給定的運行,您將獲得$ qty數量的唯一引腳。您可能需要考慮在每次函數運行時追加一個唯一前綴,以避免多次運行在兩者之間產生衝突。