如何在PHP中阻止相同的(大写/小写的敏感内容)用户名?

时间:2016-03-07 13:29:19

标签: php

我可以阻止多个用户使用以下代码注册相同的用户名:

$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,但他无论如何都可以注册ABCabcabC等,我想阻止它。

作为一种可能的解决方案,我不想要strtolower()用户名。相反,我希望Abc用户使用他的密码登录,无论他是否写入登录输入ABCabcabC等。

为什么我要这个?

我发现用户可以在他的计算机上使用用户名abc注册。但是当他想要在他的移动设备上登录时,设备会自动将首字母大写,并且用户无法登录。反之亦然。

那么,为什么我不想要strtolower()?

因为有些用户也希望显示为abC,并且是故意这样注册的。因此,他们的用户名将在注册时显示。

4 个答案:

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

的MySQL

这取决于您的表格整理。如果它以_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

在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;
}