如果用户名已经存在,如何将数字添加到用户名

Posted

技术标签:

【中文标题】如果用户名已经存在,如何将数字添加到用户名【英文标题】:How to add number to username if it already exists 【发布时间】:2020-01-10 17:49:15 【问题描述】:

我正在尝试为我的课程制作一个学校门户系统。每个学生都有一个用户名,由姓名的第一个字母和姓氏的前 4 个字母组成。为了自动创建这个用户名,我在管理员添加学生的页面中使用它。

if (isset($_POST["btnAddUser"])) 
    //preparing statement to protect against sql injections
    $stmt = $conn->prepare("INSERT INTO tbluser (Username, Password, Role) VALUES (?,?,?)");
    $stmt->bind_param("sss", $usernamenew3, $password, $a);
    $password = $_POST["s_password"];
    $password = md5($password);
    $name = $_POST["s_name"];
    $surname = $_POST["s_surname"];
    $dob = $_POST["s_dob"];
    $a = "Admin";
    $usernamenew = substr($name, 0, 1);
    $usernamenew1 = substr($surname, 0, 4);
    $usernamenew3 = $usernamenew.$usernamenew1;

但是,例如,如果输入了两个姓氏相同的学生,并且输入了相同的姓名首字母,则会出现错误,所以我需要它在第一次使用该用户名时添加 01,02第二次等等。 例子。姓名 = 考试,姓氏 = 学生 对于此示例,我希望带有这些字母的第一个用户名是 TStud01,第二个是 TStud02...

【问题讨论】:

你真的不应该使用MD5 password hashes,你真的应该使用php的built-in functions来处理密码安全。确保你 don't escape passwords 或在散列之前对它们使用任何其他清理机制。这样做会更改密码并导致不必要的额外编码。 请不要只求我们为您解决问题。向我们展示您是如何尝试自己解决问题的,然后向我们确切展示结果是什么,并告诉我们您为什么觉得它不起作用。向我们明确解释什么不起作用并提供a Minimal, Complete, and Verifiable example。阅读How to Ask 一个好问题。请务必take the tour 并阅读this。 一种方法是先创建用户名。然后获取以该用户名LIKE 'some-username% 开头的所有用户。这将为您提供用户名等于或以用户名开头的所有用户的列表,然后检查您创建的用户名是否存在于结果中。如果是,请添加一个数字。然后检查结果中是否存在该用户名。如果是,则增加您添加的数字并再次测试。这样做直到它不存在。 然后你保存用户。 请不要在 cmets @Dero3376 中转储代码,这是不可读的。 您需要获得password_hash() 才能工作。 MD5 是一场等待发生的灾难。 【参考方案1】:

您需要从数据库中获取以通用模式开头的用户名计数,然后将其递增 1。然后您可以使用 0 填充它并将其保存在数据库中。

注意几点:

切勿以明文形式或使用 MD5/SHA1 存储密码! 仅存储使用 PHP 的 password_hash() 创建的密码哈希,然后您可以使用 password_verify() 进行验证。看看这篇文章:How to use password_hash 并了解更多关于bcrypt & password hashing in PHP 的信息。确保列是VARCHAR(255)。 请改用mb_substr(),因为名称可以包含非拉丁字母。 要将LIKEmysqli 一起使用,您必须在PHP 中连接%,然后将该变量绑定到查询。 要了解如何使用 MySQLi 获取匹配行数,请参阅 How to get count of rows in MySQL table using PHP?
if (isset($_POST["btnAddUser"])) 
    $password = password_hash($_POST["s_password"], PASSWORD_DEFAULT);
    $name = $_POST["s_name"];
    $surname = $_POST["s_surname"];
    $dob = $_POST["s_dob"];
    $a = "Admin";
    $fistLetter = mb_substr($name, 0, 1);
    $shortSurname = mb_substr($surname, 0, 4);
    $usernamenew = $fistLetter.$shortSurname;

    $searchString = $usernamenew.'%';

    $stmt = $conn->prepare('SELECT COUNT(Username) FROM tbluser WHERE Username LIKE ?');
    $stmt->bind_param('s', $searchString);
    $stmt->execute();
    $countUsername = $stmt->get_result()->fetch_row()[0];

    $usernamenew .= str_pad($countUsername+1, 2, '0', STR_PAD_LEFT);

    //preparing statement to protect against sql injections
    $stmt = $conn->prepare("INSERT INTO tbluser (Username, Password, Role) VALUES (?,?,?)");
    $stmt->bind_param("sss", $usernamenew, $password, $a);
    $stmt->execute();

结果:

【讨论】:

以上是关于如果用户名已经存在,如何将数字添加到用户名的主要内容,如果未能解决你的问题,请参考以下文章

如果用户已经提供了对象,如何停止将用户提供的对象添加到数组列表中? [关闭]

如何检查用户是不是存在于数据库表中?

如果他们输入一维数组的数字已经输入,如何提醒用户?

如果匹配已经存在,如何将行号附加到行插入?

如何在使用Devise注册时创建新用户时添加或更新关联的属性?

仅当更新前不存在用户时如何将用户添加到索引 Elasticsearch