mysql和php突然区分大小写?

时间:2011-01-19 09:30:23

标签: php mysql case-insensitive

基本上,我已经在我的php登录代码中更改了一些内容,现在当我登录时,MySQL要求案例匹配?!

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

    echo $match;

如果我的用户名的CaSe与数据库不匹配,那么它不会返回任何行。

如果用户注册为ADMIN,那么我希望他们能够以“admin”或“AdMiN”等方式登录任何想法吗?

非常感谢:)

1 个答案:

答案 0 :(得分: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é”是一个有效的用户名?它是否会成功从您的前端传递到数据库并且不受语言设置问题的影响而退出?乔尔·斯波尔斯基的excellent article on Unicode在某些时候可能值得一读。