PHP:不区分大小写的登录检查

时间:2011-12-27 23:10:31

标签: php login logic

截至目前,我检查用户是否可以这种方式登录:

// simply logic:
if (username == usernameEntered && password == passwordEntered) {

我的数据库在我的用户表中有一个Aaron条目。但是,如果我尝试以aaronAARON等方式登录,则会拒绝我访问。所以它似乎区分大小写。这是我的数据库的问题,还是我如何检查登录凭据?

我记得当我摆弄JavaScript时,/values/i可用于不区分大小写。 PHP检查有这样的东西吗?

此外,由于我在这里,在引用cookies / $ _ GET []时isset();empty();之间有很大差异;请求?

3 个答案:

答案 0 :(得分:3)

strtolower()条件的两边使用strtoupper()if

if (strtolower(username) == strtolower(usernameEntered) && strtolower(password) == strtolower(passwordEntered))

这些函数用低位字母替换所有大写字母,反之亦然,允许不区分大小写的检查。

此外,您可以通过查看PHP文档来详细了解isset()empty()之间的差异

PHP: isset - Manual

PHP: empty - Manual

参考文献:

http://php.net/manual/en/function.strtoupper.php

http://php.net/manual/en/function.strtolower.php

答案 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

至于issetemptyisset会告诉您某个值是否存在,empty还会告诉您它是否被视为empty。请阅读手册或http://kunststube.net/isset