在数据库中创建非重复用户名

时间:2018-04-13 04:31:45

标签: php sql database

我正在尝试根据网站的名字和姓氏为我的网站创建用户名。 (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变量,我不知道为什么。我有一个循环。没有一个回声被击中,这很奇怪。肯定有多个用户已在我的表格中使用相同的用户名。

2 个答案:

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