2011-01-19 97 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可能值得一读。