2013-06-29 19 views
1

這是我的代碼:在PHP循環 - 創建不同的卷數

$roll = rand(100,1000000); 

$result = mysql_query("SELECT roll FROM users") or die(mysql_error()); 

if($row["roll"] == $roll) { 
    $roll = rand(100,1000000); 
} 
else 
{ 
    mysql_query("INSERT INTO users (roll) VALUES('$roll') ") or die(mysql_error()); 
} 

echo "Data Inserted!"; 

我的問題是:

若再生卷號再次等於卷號在數據庫中已經存在的,它是如何應該再次生成一個新的卷號並繼續檢查它,除非它獲得一個唯一的數字,我可以最終插入數據庫中?請幫忙!

+0

實現。此外,查詢不完整(您是使用對象還是多個值使用數組檢索單個值),並使用mysqli或PDO而不是「mysql_ *」。請提供詳細信息。 – Debashis

+1

只是一個小提示:只要你想使用rand(),就用[mt_rand()](http://php.net/manual/en/function.mt-rand.php)代替。爲了您自己的理智。 – bjrn

+0

我假設$ roll [「roll」]在if查詢中應該是$ result [「roll」]?如果是這樣,你可以編輯問題的清晰度? – JonRed

回答

0

試試這個:

$count = 1; 
while($count > 0) { 
    $roll = rand(100,1000000); 
    mysql_query('SELECT COUNT(1) FROM `users` WHERE roll=' . mysql_real_escape($roll)) or die('Can\'t query the DB server.'); 
    $countRow = mysql_fetch_array($result); 
    $count = $countRow[0]; 
} 

在現實生活中的情況很可能需要添加更好的錯誤檢查 - 使用trigger_error,或例外(當然必須被捕獲)。我甚至會建議記錄所有的錯誤。

+2

把mysql_query調用直接放到一個需要MySQL資源的函數中是一種粗糙的編碼。您應該測試查詢結果以查找失敗並處理它們。 (即使在示例代碼中... *尤其是*在示例代碼中!) – Atli

+0

你是對的,我編輯了我的答案。謝謝。 – Agares

+1

沒問題,那好多了。我想提出一個額外的建議。 '或die()'方法可用於開發,但對於生產代碼來說並不理想。用戶不應該看到實際的錯誤信息。 ''或trigger_error()'方法會更好,因爲它可以配置爲在開發過程中將錯誤轉儲到頁面上,然後在代碼移至生產時記錄到文件中。 – Atli

1

您不必每次都獲取所有卷。這只是浪費資源。只要檢查數據庫中是否存在卷軸,如果是,請檢查一個新卷軸。

function doesRollExist($roll) { 
    $sql = "SELECT COUNT(*) FROM users WHERE roll = " . (int)$roll; 
    $result = mysql_query($sql); 
    if ($result) { 
     return ((int)mysql_result($result, 0)) != 0; 
    } 
    else { 
     trigger_error("Query failed: " . mysql_error(), E_USER_ERROR); 
    } 
} 

do { 
    $newRoll = mt_rand(100, 1000000); 
} 
while (doesRollExist($newRoll)); 

// Now $newRoll will be a random number that doesn't exist 
// in the database. 
+0

嘿,我手動在$ roll中輸入了一個已經存在於數據庫中的數字,然後運行這個頁面,但不是生成一個新的滾動編號,而是保存了我輸入的相同編號。 – user2534211

+0

當它通過代碼說數據庫中的卷號已經存在時,爲什麼它沒有創建一個新的? – user2534211

+0

那裏有幾個語法錯誤(分號),但除此之外,代碼的工作方式與預期的一樣。我甚至測試過它,只是爲了確保。 – Atli

0

你可以通過你還沒有在這個分配$行[「滾」]的任何值,這樣

$flag=1; 
while($flag==1) 
{ 
$roll = rand(100,1000000); 

$result = mysql_query("SELECT roll FROM users WHERE roll=$roll") or die(mysql_error()); 
$row = mysql_fetch_row($result); 

if($row[0] == $roll) 
{ 
    $roll = rand(100,1000000); 
} 
else 
{ 
$flag=0; 
    mysql_query("INSERT INTO users values($roll)") or die(mysql_error()); 
    echo "Data Inserted!"; 
} 


}