我正在尝试根据网站的名字和姓氏为我的网站创建用户名。 (FirstName.LastName)如果一个人具有相同的名字和姓氏,那么他们将具有相同的用户名。我试图这样做,如果他们有相同的名称,它只会添加一个递增的数字。这是我到目前为止所拥有的。
$sq = "SELECT * FROM Users";
$quer = mysqli_query($conn, $sq);
$userName = '';
$mod = 1;
$foundUser = false;
while ($row = mysqli_fetch_array($quer)){
if($row['UserName'] == ucfirst(strtolower($_POST['fName'])) . '.' . ucfirst(strtolower($_POST['lName']))){
while($foundUser = false){
if($row['UserName'] == ucfirst(strtolower($_POST['fName'])) . '.' . ucfirst(strtolower($_POST['lName'])) . $mod){
$mod = $mod + 1;
echo 'hitting mod';
}else{
$userName = ucfirst(strtolower($_POST['fName'])) . '.' . ucfirst(strtolower($_POST['lName'])) . $mod;
$foundUser = true;
echo 'last else';
}
}
}
}
这当前没有填充$ userName变量,我不知道为什么。我有一个循环。没有一个回声被击中,这很奇怪。肯定有多个用户已在我的表格中使用相同的用户名。
答案 0 :(得分:2)
因为$userName
仅在数据库中存在时才分配。您需要在首次else
条件后添加if
。
if($row['UserName'] == ucfirst(strtolower($_POST['fName'])) . '.' . ucfirst(strtolower($_POST['lName']))){
while($foundUser = false){
if($row['UserName'] == ucfirst(strtolower($_POST['fName'])) . '.' . ucfirst(strtolower($_POST['lName'])) . $mod){
$mod = $mod + 1;
echo 'hitting mod';
}else{
$userName = ucfirst(strtolower($_POST['fName'])) . '.' . ucfirst(strtolower($_POST['lName'])) . $mod;
$foundUser = true;
echo 'last else';
}
}
} else {
$userName = ucfirst(strtolower($_POST['fName'])) . '.' . ucfirst(strtolower($_POST['lName']));
}
您可以先搜索数据库中的用户名,而不是获取所有用户并循环它们。这是我的建议:
$userName = ucfirst(strtolower($_POST['fName'])) . '.' . ucfirst(strtolower($_POST['lName']));
$sq = "SELECT * FROM Users WHERE UserName LIKE '".$userName."%'";
$quer = mysqli_query($conn, $sq);
$count = mysqli_num_rows($quer);
if($count > 0) {
$userName = $userName . $count; // or $userName = $userName . ($count + 1)
}
答案 1 :(得分:0)
如果在您的查询中使用where username like UserName like '".$userName."%'"
如果我们这种情况会发生什么?
A
注册$_POST['fName']=John
& $_POST['lName']=Doe
(将John Doe设置为用户名)。B
注册$_POST['fName']=John
& $_POST['lName']=Doei
(将johnDoei设置为用户名)。C
注册$_POST['fName']=John
& $_POST['lName']=Doe
(用户名为JohnDoe
的用户数为两行,设置为' JohnDoe2' as usrename)您拥有JohnDoe3
用户C
用户名,但应获得JohnDoe1 or JohnDoe2
用户名。任何以JohnDoe
开头的用户都会影响行数,而不仅仅是JohnDoe+{number}
的用户。
导致重复用户名的另一种情况:
A
注册$_POST['fName']=John
& $_POST['lName']=Doe
(将John Doe设置为用户名)。B
注册$_POST['fName']=John
& $_POST['lName']=Doe2
(将johnDoei设置为用户名)。C
注册$_POST['fName']=John
& $_POST['lName']=Doe
(用户名为JohnDoe
的用户数为两行,将JohnDoe2
设置为usrename但已由用户用户B
使用,现在您有重复的行,如果想要使用username+(count+1)
作为用户名,假设用户B
拥有$_POST['lName']=Doe3
,对于用户C
,您将JohnDoe3
设置为用户名,并再次在表格中包含重复的用户名) 我的建议是在注册时从用户获取username
,并在数据库中搜索用户已经username
,并向用户显示错误,如果已经尝试了另一个username
。
一个注意事项:您应该使用参数绑定来阻止sql注入,请参阅How can I prevent SQL injection in PHP?