2012-07-03 79 views
4

我已經使用準備好的語句在PHP中編寫了一個註冊頁面。我的問題是一個相當簡單的問題。當用戶註冊時,我想確保他們沒有像其他人一樣使用相同的用戶名或電子郵件註冊。因此,作爲驗證過程的一部分,我運行了兩個查詢,一個用於檢查電子郵件是否存在,另一個用於檢查用戶名是否存在。我的問題是,有沒有更好的方法?我覺得運行更多的一個查詢可能會犧牲一些性能。性能甚至會受到這種查詢的影響嗎?我意識到我可以運行"SELECT * FROM table WHERE username = ? or email = ?",,但我希望用戶知道他們錯了什麼,而不僅僅是一個通用的「您的用戶名或電子郵件目前正在使用,隨時使用試驗和錯誤來找到它」。這可能是我對速度的偏執,但我只是想看看其他人對此事的看法。註冊頁面,電子郵件或密碼存在檢查

+0

您可以單獨檢查它們,但它對性能不利。 – Leri

+0

你能否證明你在說什麼?編輯:不要吝嗇,只是想知道爲什麼它更慢。是否因爲我連接到MySQL兩次?它有效地花費兩倍的時間嗎? – Sam

+0

如果此查詢返回1,您可以首先運行query'select * from username where =?',所以用戶名已被使用。如果它返回0注意它你可以檢查電子郵件。這對性能不利,因爲您必須運行2個查詢而不是1個查詢。 – Leri

回答

3

用OR運行您的查詢並檢查返回的結果以報告您發現的具體內容。

但是,根據數據庫內部結構和索引,兩個單獨的查詢可能會比OR'更快。你最好對所有案例進行基準測試(找到一個,找到兩個,都沒有發現),以確定你的環境。

+1

啊。因此,而不是僅僅依賴返回的行數,實際分析數據? – Sam

0

您的查詢是好的;你將有1或2個結果; 2如果只有電子郵件或只有暱稱的註冊存在; 1如果註冊有電子郵件和暱稱;使用JS和輸入字段

+0

目前我正在使用我寫的一個簡單的模板引擎,但是我看到你對JS的觀點。我正在做的事情將有效地做同樣的事情,但在紅色的形式的頂部。希望儘可能明顯。另外註冊表格非常小​​,只有少數投入。 – Sam

0

好權寫明原因,我想這將是最簡單的方法:

SELECT IF(username = :username_to_check, 1, 0) AS dup_username 
    FROM users 
WHERE username = :username_to_check OR email = :email_to_check 

然後你檢查:1)的行數 - 如果是0,沒有發現重複; 2)您的結果dup_username標誌,如果行數> 0。

這裏的an example與玩。

+0

我喜歡這個。有很多因素需要考慮,例如運行兩個查詢將使用更多的資源,或者使用if語句分析查詢。很多我想在這裏考慮。認爲我的問題比現在簡單。 – Sam

+0

據我所知,SELECT子句中的CASE/IF語句只會應用於結果集(已被'WHERE'過濾) - 換句話說,如果您的表被正確約束,則返回一行或零行。所以我不認爲它會變慢:儘管如此,檢查龐大的數據庫以證明或破壞它會很好。 ) – raina77ow

0

我不認爲它不好的性能

,如果你有一個從表中獲取一個行選擇查詢;可以說成千上萬的行;那麼影響是不是在所有提到..

什麼影響你的表現是加入哪個需要大量這是不是在你的情況下發生的資源查詢...

我相信它的安全使用它分開,我們一直在我們的網站上這樣做目前有超過一百萬用戶

也試圖在你的mysql服務器上運行這個查詢,看看它可以幫助多長時間(特別是對於更復雜的查詢)

+0

問題是,我認爲在我的數據庫中只用少量的虛擬內容來試用這些查詢是沒用的。我將不得不填補它幾十萬行,並看看它是如何去,但它仍然不是一個真實的生活場景的一個明確的說明。該網站可能永遠不會達到> 100000個用戶。 – Sam

+0

正如我在我的回答中所說的,您的查詢是安全的......並且它不會影響您的網站或減慢它的速度...... 查詢是爲了使用它的目的而做出的(而您的擔心遠沒有使事情壞或混亂),所以放鬆:) – Lamis

0
$result = mysql_query("SELECT * FROM table1 WHERE Username = ''", $link); 
    $num_rows = mysql_num_rows($result); 

    $result2 = mysql_query("SELECT * FROM table1 WHERE Email= ''", $link); 
    $num_rows2 = mysql_num_rows($result2); 

    $checkUsrN = false; 
    $checkEmail = false; 
    $mesg = "The following is bad: "; 

    if($num_rows == 0) 
    { 
     $checkUsrN = true;   
    } 
    else{ 
     $mesg .= "Username"; 
    } 

    if($num_rows2 == 0) 
    { 
     $checkEmail = true; 
    } 
    else{ 
     $mesg .= "Email"; 
    } 

    if($checkUsrN == false || $checkEmail == false) 
    { 
     echo $mesg; 
     break; 
    } 

怎麼樣爲了你的目的?

+0

通過在一個else語句中的電子郵件檢查並不意味着該電子郵件將只被檢查,如果用戶名是有效的?新用戶完全可以使用已經存在的用戶名以及其他用戶的現有電子郵件進行註冊。這意味着他們必須提交表格兩次。 – Sam

+0

是的,第一部分是正確的,但是如果用戶名無效,它會被踢出,否則會檢查電子郵件,如果不好的話,它也會被踢出去。檢查我的編輯以查看替代方案。 – Theron084

2

在您保留用戶信息的數據庫中,用戶名和電子郵件實體是唯一的。像主鍵一樣。

+0

用戶名和電子郵件被編入索引。因此獨特的索引不起作用。無論如何,據我所知。 – Sam

+0

用戶名和電子郵件都可以是唯一的; OP只是想知道哪些是(可能)重複的。 – raina77ow