2011-01-19 94 views
1

基本上,我已經改變了我的php登錄代碼中的某些內容,現在當我登錄時,MySQL要求這種情況匹配?!mysql和php突然區分大小寫?

$match = "select * from users where username = '".$username."' and password = '".$password."';"; 

    echo $match; 

如果我的用戶名的CaSe與數據庫不匹配,那麼它不會返回任何行。

如果用戶註冊爲ADMIN,那麼我希望他們能夠以「admin」或「AdMiN」等方式登錄任何想法?

非常感謝:)

+5

「username」的排序規則是什麼? – 2011-01-19 09:32:41

+0

你改變了什麼? – 2011-01-19 10:04:20

回答

8

該列的排序規則已更改,我猜。請參閱this MySQL page about case sensitivity in string comparison瞭解更多信息。爲了使自己免受類似問題的困擾,例如:

$match = "select * from users where UPPER(username) = '".strtoupper($username)."' and password = '".$password."';"; 

是常見的技巧。但正如其他人所看到的那樣,瞭解數據庫中的排序規則是如何工作的並正確使用它是最好的解決方案。正確獲取數據庫排序規則並依賴它,應該允許數據庫使用用戶名列上的任何索引,而不是掃描表。

還要確保您避免SQL injection攻擊 - 如果用戶輸入包含單引號的用戶名,當前代碼會發生什麼?

您可能還想考慮一下您將允許哪些字符作爲用戶名,以及您使用的字符集是否是「René」的有效用戶名?它是否會成功地從前端通過數據庫傳遞回來,而不受字符集問題的影響? Joel Spolsky的excellent article on Unicode可能值得一讀。