2011-01-11 23 views
0

我想在我的PHP代碼中執行檢查,檢查數據庫中是否存在重複的用戶ID,如果是,分配新的用戶ID並再次檢查,但我是有麻煩釘邏輯,這裏是我迄今爲止,檢查MySQL數據庫重複的用戶ID

function check($uid){ 
    $sql = mysql_query("SELECT * FROM table WHERE uid='$uid'"); 
    $pre = mysql_num_rows($sql); 

    if($pre >= 1){ 
     return false; 
    }else{ 
     return true; 
    } 
} 

,然後使用該功能,我想用一個while循環,繼續循環通過,直到它的計算結果爲true

$pre_check = check($uid); 

while($pre_check == false){ 
    //having trouble figuring out what should go here 
} 

所以基本上,一旦我有一個可用的uid,將所有內容寫入數據庫,否則繼續生成新的並檢查它們直到找到一個尚未使用的。

這可能很簡單,但由於某種原因,我遇到了麻煩。 Thanx提前!

回答

1

事實上最好是使用自動增量的ID,但如果你沒有選擇,你可以做一個這樣的reccursive功能:

function find_uid() { 
    $new_uid = rand(1000000000, 9999999999); 
    $sql = mysql_query("SELECT COUNT(*) AS 'nb' WHERE uid=".$new_uid.";"); 
    $row = mysql_fetch_assoc(); 
    $pre = $row['nb']; 
    return ($pre >= 1 ? find_uid() : $new_uid); 
} 

COUNT(*)應該是因爲更個性化高性能是由MySQL而不是PHP。順便說一句,如果你需要一個新的uid不應該條件是($ pre> 0)而不是($ pre> 1)?

2
$uid = 100; // pick some other value you want to start with or have stored based on the last successful insert. 
while($pre_check == false){ 
    $pre_check = check(++$uid); 
} 

當然這正是'自動遞增'的主鍵是有用的。你知道在MySQL中'自動遞增'主鍵嗎?

編輯
在您的評論的光關於維護使用這樣的隨機函數別人的代碼(ewwwww)......我會用我上面提出的方法和存儲最後插入編號的地方,你可以閱讀它再次爲下一個用戶。這將允許你爲失蹤的用戶「填空」。因此,例如,如果您有uids 1,2,5,9,40,100 ...,您可以從$uid = 1;開始。您的while循環會在返回到3後返回。現在,您存儲3並創建新記錄。下一次,你從$uid = 3;開始等等。最終您將填寫所有數字。

認識到您需要通過鎖定WRITES表來執行插入也很重要。你不想進入競爭狀態,兩個不同的用戶被賦予相同的uid,因爲他們都在同一時間尋找可用的uid。

+0

我知道他們是的,我正在編輯某人elses代碼,他們使用`$ uid = rand(1000000000,9999999999);`< - - 生成uid。 :/ – Odyss3us 2011-01-11 08:08:55