簡體   English   中英

如何正確檢查是否采用了用戶名?

[英]How to properly check if username is taken?

我正在使用PHP / MySQL。 檢查用戶名是否已被采用的最佳方法是什么?

現在我所做的就是執行一個select語句,看看是否已經使用了用戶名。 如果select返回一行,則我停止並顯示錯誤消息。 如果select沒有返回任何內容,那么我插入新用戶。

但是有更有效的方法嗎? 例如,我可以在用戶名列上使用UNIQUE,然后只執行一個insert語句(如果已經采用插入語句,則從插件中獲取錯誤)。

您確實存在其他一些線程將在您確認用戶不存在的SELECT和插入它的INSERT之間的短暫時間內插入您的用戶名的風險。 這被稱為競爭條件

看起來這種情況發生的可能性很小,但有一種說法:“ 下周二將有百萬分之一。

是的,用戶名上的UNIQUE約束可以阻止您插入重復的用戶名。 聲明該約束。

有些文章會告訴您,一旦有了UNIQUE約束,就不必再進行SELECT了。 只需嘗試 INSERT,如果沖突,則報告錯誤。

但是,我幫助網站從這種技術引起的問題中恢復過來。 用戶在他們的網站上試圖非常快速地創建新的用戶名,並導致INSERT上出現很多沖突。 問題是MySQL增加了表的自動增量主鍵,即使INSERT被取消了 並且這些自動增量值永遠不會被重用。 結果是他們為每個成功的INSERT丟失了1000-1500個id號。 當他們的INT主鍵達到2 31 -1並且他們無法在表中創建另一行時,他們打電話給我!

他們使用的解決方案是首先嘗試SELECT,並報告重復。 然后,如果它似乎安全,請嘗試INSERT - 但是編寫代碼來處理與UNIQUE約束的可能沖突,因為競爭條件仍然可能發生。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM