截至目前,我检查用户是否可以这种方式登录:
// simply logic:
if (username == usernameEntered && password == passwordEntered) {
我的数据库在我的用户表中有一个Aaron
条目。但是,如果我尝试以aaron
或AARON
等方式登录,则会拒绝我访问。所以它似乎区分大小写。这是我的数据库的问题,还是我如何检查登录凭据?
我记得当我摆弄JavaScript时,/values/i
可用于不区分大小写。 PHP检查有这样的东西吗?
此外,由于我在这里,在引用cookies / $ _ GET []时isset();
和empty();
之间有很大差异;请求?
答案 0 :(得分:3)
在strtolower()
条件的两边使用strtoupper()
或if
。
if (strtolower(username) == strtolower(usernameEntered) && strtolower(password) == strtolower(passwordEntered))
这些函数用低位字母替换所有大写字母,反之亦然,允许不区分大小写的检查。
此外,您可以通过查看PHP文档来详细了解isset()
和empty()
之间的差异
参考文献:
答案 1 :(得分:3)
是的,请使用strtolower功能。只需要做这样的事情:
if(strtolower($username) == strtolower($usernameEntered))
对于 isset() 和 empty() ,它们确实不同,但通常它们会给你相同的结果。 isset()告诉您是否设置了变量(但它仍然没有值)。 empty()通常会告诉变量是否等于某个东西。请参阅我为每个链接到的PHP文档。我建议不要使用 empty()来检查cookie和GET / POST值,因为空字符串和0被认为是空的,这可能不是你想要的。我会使用isset()来查看变量是否已设置,然后进一步检查它是否有您要查找的数据。通常你会想要处理一个空字符串而不是没有任何值。
此外,Pekka在评论中提到,如果您根据用户名在数据库中找到该帐户,那么您确实需要在那里进行小写转换。如果是这样的话:
SELECT * FROM users WHERE LOWER(username) = LOWER(:username)
假设您正在使用PDO准备好的查询。否则只需将我的变量替换为:username
(当然还有正确的字符串连接等等。)
编辑:由于在评论中提到了deceze,在这样的查询中使用LOWER()会是一个非常糟糕的主意,因为它必须将表中的每个用户名转换为小写以进行比较,并且会渲染任何对该领域的指数毫无用处。更好的方法是在数据库中存储用户名的小写版本以及字段上的索引。当用户尝试登录时,将他们输入的内容转换为小写,然后与之进行比较。
答案 2 :(得分:0)
您可以在SQL语句中使用COLLATE
clause来选择在数据库中搜索用户名时用于比较的排序规则:
SELECT * FROM `users` WHERE `username` COLLATE utf8_general_ci = 'FoObAr'
使用_ci
(不区分大小写)排序规则可以让您查找值,无论其大小写如何。确保选择正确的排序规则,否则您可能会得到意想不到的结果,因为其他字符也会被视为相同(例如e和é)。您还可以直接在列上设置排序规则,因此您不必在每个查询中都包含COLLATE
。
你真正应该做的是在进入数据库之前规范化用户名,所以你总是以小写形式存储用户名。然后,在搜索数据库时,您还要将要搜索的术语小写,然后再将其插入查询中。请参阅strtolower
。
至于isset
和empty
:isset
会告诉您某个值是否存在,empty
还会告诉您它是否被视为empty。请阅读手册或http://kunststube.net/isset。