2012-08-09 79 views
0

如何檢查某個ID是否存在於mysql數據庫中,如果存在:創建一個新ID並重新檢查。我有以下代碼來創建一個ID:檢查數據庫中是否存在ID

$length = 10; 
$id = ''; 
for ($i = 0; $i < $length; $i++) { 
    $id .= chr(rand(ord('0'), ord('9'))); 
} 

要檢查是否存在的ID我用下面的代碼:

$database->query('SELECT user_id FROM users 
        WHERE public_id = ':public_id',array(':public_id' => $public_id)'); 

if($database->count() >= '1') { 
//create a new id 
} else { } 
+0

請注意[TOCTOU](http://en.wikipedia.org/wiki/Time_of_check_to_time_of_use)錯誤,您使用此ID的原因是什麼以及爲什麼它是隨機的? – Ghost 2012-08-09 17:21:19

+0

'id'列是主鍵嗎?如果是這樣,你可以使用[INSERT ... ON DUPLICATE KEY UPDATE](http://dev.mysql.com/doc/refman/5.1/en/insert-on-duplicate.html)來檢查重複鍵並創建一個新的條目,如果它已經存在於一個語句中。但仍然不確定你想要完成什麼。 – Romuloux 2012-08-09 17:21:54

+0

爲什麼你需要「再次檢查」?一旦它被插入到數據庫中,就知道它在那裏。 – Matt 2012-08-09 17:22:14

回答

1

你試圖做的是不被認爲是「最佳實踐「(理論上),您可以創建一個無限循環(創建一個隨機ID,然後檢查存在是否可以在每次迭代時」擊中「)。

創建唯一ID的更好解決方案是將列設置爲主鍵,並在每個新插入時增加。

如果您希望另一列是唯一的,您可以將該列定義爲唯一,但不必依賴「隨機」字符串。

+1

問題不在於理論上的無限循環,而是'UNIQUE'約束,只需要一個查詢即可阻止帶有錯誤的INSERT調用。這優於'SELECT',然後是'INSERT',它更容易出現競爭狀況。沒有'UNIQUE'索引,就不能保證唯一性。 – tadman 2012-08-09 17:59:29

+0

+1,@tadman。您的評論比我的回答更準確。雖然我知道這是真的,但我沒有這樣解釋。謝謝! – Matt 2012-08-09 18:02:49

相關問題