出處:
近日偶爾看到乙個很巧妙的 sql 技巧,乙個簡單的 sql 同時驗證帳號是否存在、密碼是否正確。之前從未曾想過這麼做,也未曾見過別人這麼做。雖是奇技淫巧,卻真正所謂構思巧妙。如果用來面試考考別人,真的能夠難倒一大片兄弟。好東西不敢獨享,特公開與大家同樂。
select case when p.encrypted_password =? then 1 else 0 end
and (lower(u.user_sign_in_nm) = ? or lower(u.email) = ?)
解釋:
a. 如果使用者名稱不存在,則查詢結果是無資料
b. 如果使用者名稱存在,而密碼不正確,則返回 0
c. 如果使用者名稱存在,而密碼正確,則返回 1
之所以把密碼單獨用乙個表儲存,是因為使用者的其他資訊(使用者名稱、郵件、**)與密碼是兩種不同性質的東西,系統架構師決定分開儲存,有助於提醒程式設計師這種差別: 使用者的其他資訊可以檢視,密碼不能檢視;使用者的其他資訊更改時可以看到更改前的資料,密碼更改時不能看到更改前的資料;修改使用者密碼與修改使用者其他資訊,是兩個不同頁面。
雖說程式設計師普遍有「文人相輕」的毛病(讀書人互相瞧不起),但看到這個 sql,不能不讓人佩服。
判斷乙個類是否存在
我們在開發的過程中難免會用到低版本中沒有的類,如果我們想讓我們的應用盡可能的相容多個版本,我們需要考慮 如果我們使用的類在低版本中沒有怎麼辦呢。class pkclass nsclassfromstring pkaddpassesviewcontroller if pkclass else nsst...
判斷乙個類是否存在
我們在開發的過程中難免會用到低版本中沒有的類,如果我們想讓我們的應用盡可能的相容多個版本,我們需要考慮 如果我們使用的類在低版本中沒有怎麼辦呢。class pkclass nsclassfromstring pkaddpassesviewcontroller if pkclass else nsst...
查詢乙個檔案是否存在 01
自己翻譯的程式設計百例 測試環境ubuntu 12.04lts 1.finding programs in the path shell指令碼使用環境變數 像mailer 和 pager 會有乙個乙個隱藏的危險,有時候,這些單詞的設定會只指向不存在的程式,例如,如果你決定使用使用pager設定去顯示...