2013-05-25 16 views
1

我知道goto語句令人不悅,但我想知道下面的情況是否會使它成爲最可接受的。PHP:使用Goto的有效理由?

我想爲列值創建一個唯一的隨機數,但要做到這一點,我需要創建一個隨機數並檢查它是否存在於表中。

a: 
$rnumber = rand(1, 10); 
$queryresult = $mysqli->query("SELECT uniquerandomcolumn FROM tbldata WHERE uniquerandomcolumn =" . $rnumber); 

if ($queryresult->num_rows > 0) //if random number exists a row would be returned 
{goto a;} //try again 
else {//insert into table} 
+1

[PHP中goto的有效用例是什麼?](http://stackoverflow.com/questions/4843551/what-are-the-valid-use-cases-of-goto-in-php ) – BoltClock

+2

就你而言,你可以用一段時間來代替。 – evuez

+0

請參閱:http://xkcd.com/292/ –

回答

3

你不需要爲此而跳轉。

do 
{ 
    $rnumber = rand(1, 10); 
    $queryresult = $mysqli->query("SELECT uniquerandomcolumn FROM tbldata WHERE uniquerandomcolumn =" . $rnumber); 
} 
while($queryresult->num_rows > 0); 
//insert into table} 

編輯:這個答案只是爲了證明goto在原代碼中沒有必要。在這個特定的例子中,我建議不要使用這段代碼,並在代碼中使用WereWolf - Alpha的答案。

+0

謝謝大家的澄清,現在我知道使用循環。這樣做,而這裏的例子似乎是我正在尋找。保持循環,直到在db表中找不到隨機數。 – Ralph

+2

@Ralph這是行得通的,但有點危險(循環可能沒有任何運行) - 你可能想隨機地*嘗試所有10個數字,*從不*兩次相同的數字,*只有* 10,而不是更多請參閱下面的解決方案)。 –

+0

我知道你會告訴我什麼,但我認爲它不正確,因爲代碼-Ralph-張貼需要檢查其他,但這不檢查。 (請檢查我的答案)。 – ncm

2

相反,你應該使用while循環,纔是最重要的重試次數:

$attempt = 0; $success = false; 
while ($attempt++ < 3) { 
    // ... make sure $success gets marked true! 
    // in case of success, make sure you break here! 
} 
if (!$success) { 
    // Failure 
} 

這可以確保你的腳本從未凍結(無限循環)。

+0

沒有人使用'do'循環... –

+0

'do'循環只有在基於塊內的某些條件執行條件時纔有意義,我想。在這種情況下,它是非常不必要的。 – elslooo

+0

這恰好描述了這種情況.... *做*查詢,如果它不產生結果,請重新執行。 –

6

使用此相反,這樣的數量將是獨一無二

$id = uniqid(rand(), true); 
+1

+1是簡單而完整的。 PHP是一種簡單的語言。 – ncm

+0

謝謝@imsiso :-) –

0

轉到聲明,主​​要是 - 如果有的話 - 用於錯誤處理:在陳述一個長長的清單,它們中的每能夠觸發一個錯誤,在函數底部附近進行了跳轉(goto),以跳過所有剩餘的語句,並在函數結尾處運行一個通用的錯誤處理器。

但現在,即使PHP有異常處理,因而使用轉到的還要少有道理的。

修復提到

在你的情況的問題,你可以實現一個簡單的算法來執行同等功能

do { 
    $rnumber = rand(1, 10); 
    $queryresult = $mysqli->query("SELECT uniquerandomcolumn FROM tbldata WHERE uniquerandomcolumn =" . $rnumber); 

} while ($queryresult->num_rows > 0); 

具有在存在風險的無限(或非常長)環......

改進的餘地

由於嘗試的次數是有限的(1 .. 10),這將是更好的

  • 嘗試所有數字從1到10(最大)一旦而不重複
  • 隨機
  • (例如7 2 3 9 ...)

即執行最大10的嘗試,並退出如果不存在,或者如果所有10次嘗試已經完成。要從1到10中隨機嘗試,請使用shuffle函數隨機隨機混合1到10個元素的數組。

$tries = array(); 
for ($i=1 ; $i<=10 ; $i++) $tries[] = $i; // create an array (1,2,3,4,5...) 

shuffle ($tries); // shuffle the array, eg now $tries is (8,2,9,1,7...) 

$index = 0; // start with first element of $tries 
do { 
    $rnumber = $tries[$index++]; 
    $queryresult = $mysqli->query("SELECT uniquerandomcolumn FROM tbldata WHERE uniquerandomcolumn =" . $rnumber); 

} while ($queryresult->num_rows > 0 && $tries < 10); 

這樣你可以隨機地嘗試所有10個可能的值,而不是更多。

添加

if ($queryresult->num_rows < 1) { 
    // found a non existing number: $tries[$index-1] 
} 
else { 
    // all 10 numbers exist in the DB... 
} 

對付兩個條件後。

-1

goto不是一個好的編碼習慣,它會讓你的代碼變得不負責任並且難以管理。永遠不要使用goto。否則在你編譯你的代碼時,一個迅猛龍會襲擊你。

enter image description here

但是,如果你是一個控制檯應用程序,這沒關係,沒關係。