如果用户名已经存在,如何将数字添加到用户名
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()
,因为名称可以包含非拉丁字母。
要将LIKE
与mysqli 一起使用,您必须在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();
结果:
【讨论】:
以上是关于如果用户名已经存在,如何将数字添加到用户名的主要内容,如果未能解决你的问题,请参考以下文章
如果用户已经提供了对象,如何停止将用户提供的对象添加到数组列表中? [关闭]