我可以使用以下代码防止多个用户使用相同的用户名注册:
$sqlusercheck = "SELECT (SELECT COUNT(row_username) FROM table_users WHERE row_username = :username LIMIT 1) as checkusername";
$stmt = $database->prepare($sqlusercheck);
$stmt->bindValue(':username', $username);
$stmt->execute();
$row = $stmt->fetch();
if ($row->checkusername > 0) {
$this->error[] = "This username is already taken.";
$success = false;
}
所以,如果数据库中有Abc
,用户就不能取Abc
这个用户名,但无论如何他都可以用ABC
注册>、abc
、abC
等,我想阻止。
作为一个可能的解决方案,我不想strtolower()
用户名。相反,我希望 Abc
用户使用他的密码登录,无论他是否写入登录输入 ABC
、abc
、abC
等
我为什么要这个?
我观察到用户可以在他的计算机上使用用户名 abc
进行注册。但是当他想在他的移动设备上登录时,设备会自动将首字母大写并且用户无法登录。反之亦然。
那么,为什么我不需要 strtolower()?
因为有用户也想显示成abC
,所以故意这样注册的。因此他们的用户名将在他们注册时显示。
最佳答案
在这种情况下,您可以受益于 mysql 的 LOWER()
和 php 的 strtolower()
函数。 (别担心,只有当您检查可用性时。)
$sqlusercheck = "SELECT (SELECT COUNT(row_username) FROM table_users WHERE LOWER(row_username) = :username LIMIT 1) as checkusername";
$stmt = $database->prepare($sqlusercheck);
$stmt->bindValue(':username', strtolower($username);
如果您这样更改查询,它将使两个值都变为小写并比较它们是否相同。
如果是,则会出现您的错误。
如果不是,它将按照用户输入的方式添加到您的数据库中。
注意:对于您描述的登录,您应该对登录查询进行相同的更改。
关于php - 如何防止在 PHP 中使用相同的(大写/小写不敏感)用户名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35845063/