我可以阻止多个用户使用以下代码注册相同的用户名:
$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
,并且是故意这样注册的。因此,他们的用户名将在注册时显示。
答案 0 :(得分:11)
在这种情况下,您可以从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);
如果您更改这样的查询,它会使两个值都小写,并且如果它们相同则进行比较。
如果是,则会出现您的错误。
如果不是,它将按用户输入的方式添加到您的数据库中。
注意:对于您所描述的登录,您应该对登录查询进行相同的更改。
答案 1 :(得分:10)
这取决于您的表格整理。如果它以_ci
结尾,那么当您进行非二进制字符串比较时,它已经不区分大小写,默认情况下已经。但是,如果它以_cs
或_bin
结尾,则区分大小写。
如果您的表格排序是敏感,并且您想要执行案例不敏感查询,则可以向查询添加COLLATE
,如下所示:< / p>
... WHERE row_username COLLATE collation_you_want_ci = :username LIMIT 1
如果要对_ci
排序规则执行敏感案例查询,而不必求助于将字符串转换为大写或小写,则可以使用BINARY
:
... WHERE BINARY row_username = :username LIMIT 1
在PostgreSQL中,字符串比较的默认值区分大小写。您可以使用ILIKE
,~*
或LOWER
,但请注意,这些对您的索引有潜在的性能影响。使用citext数据类型或基于函数的索引。
答案 2 :(得分:3)
在查询中使用mysql LOWER并在绑定param时使用strtolower() PHP函数: -
$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)); // use strtolower function
$stmt->execute();
$row = $stmt->fetch();
希望它会对你有所帮助:)。
答案 3 :(得分:3)
您可以尝试以下解决方案:
$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));
$stmt->execute();
$row = $stmt->fetch();
if ($row->checkusername > 0) {
$this->error[] = "This username is already taken.";
$success = false;
}