检查用户名是否存在,如果存在,则将其增加一。

3

当一个用户名被插入到我的数据库中时,比如:

  • John_Smith

我需要检查是否已经有一个叫John_Smith的存在。如果是的话,将其增加1变为John_Smith_1。

所以,如果以下用户名已经存在:

  • John_Smith
  • John_Smith_1
  • John_Smith_2
  • John_Smith_3
  • ....一直到John_Smith_10

我需要下一个插入的John_Smith被递增为John_Smith_11。

到目前为止,我已经搜索并找到了这个:

  $preferredname= "John_Smith"

        //check for duplicate user names
        $duplicate= check_for_duplicate_username($preferredname);                       

        //if duplicate, increment the preferredname     
        if ($duplicate) 
        {
          $parts = explode("_",$preferredname);

          if (isset($parts[1]))
          $preferredname = $parts[0]."_".$parts[1]."_".($parts[2]+1);

          else $preferredname = $parts[0]."_".$parts[1]."_1";
        }

我相信这只能适用于第一个匹配的用户名。我的问题是检查数据库中版本号最高的名称。这是我的SQL语句:

        function check_for_duplicate_username($name)
{
     // check if username already exists
    $sql = "SELECT * FROM users WHERE user_username=$name";
    //then return duplicates   

你在这里遇到了一个 XY 问题。你的 ddls 应该改变,你正在误用你的数据库。 - gbtimmon
1
我讨厌网站这样做。只需告诉用户该名称已被使用,让他们选择另一个即可。 - vascowhite
快速想法 - 或许你应该将增加后的值与用户一起保存,这样你就可以按该列进行排序。或者,如果用户名已被使用,你可以将ID附加到用户名后面。更好的方法是返回一个“错误”,说明用户名已被使用,并要求他们选择另一个名称。 - KleverKrypto
谢谢大家,虽然我没有提到用户使用社交网络登录,因此用户名是根据他们的社交登录自动生成的...我想我可以使用他们的电子邮件作为用户名,但这可能不受欢迎。 - gray
3个回答

1
你可以使用这个查询语句:

$sql = 'SELECT * FROM users WHERE user_username LIKE ' . $name . '_%';

上面的查询将查询用户用户名具有类似于John_Smith_*(其中*是任何有效字符,包括数字,稍后您必须检查)的值的行。
您可以使用此PHP语句获取用户的后缀号码:
preg_match( '/([0-9]+)$/', 'John_smith_10', $matches );
$user_number = $matches[0];

0

尽管这可能不是一个完美的解决方案,但以下答案将回答您特别想要做的事情。下面的查询返回拥有$ name或$ name_123的用户数量:SELECT COUNT (*) FROM users WHERE user_username REGEXP'$ name [_ 0-9] * $';因此,如果值为0 ,您可以仅使用 $name 本身,否则您可以使用 $name."_".加上查询返回的数字。

但正如许多人所提到的那样,自动分配用户名可能不是最好的主意(非常Web 1.0:P)。我建议使用电子邮件地址。另一种选择是使用社交应用程序使用的任何用户ID以及识别社交应用程序的另一个字段,然后使用自动递增的ID字段作为唯一的主键。


是的,我认为这是最好的方法。我将从他们的个人资料中选择一些独特的内容,并添加一个显示名称字段,在用户界面中展示一些友好的内容。谢谢。 - gray

0
我今天也遇到了一个类似的问题,解决方法如下。在我的情况下,我需要根据用户的姓和名字的首字母创建一个唯一的目录名来存储数据:
$username = "bjones";
$usersql = "SELECT * FROM users WHERE username LIKE '$username%'";
$usercnt = mysqli_num_rows(mysqli_query($con,$usersql));  

// If bjones, bjones1, bjones2, etc already exists
if ($usercnt >= 1) {
    $num = ++$usercnt;             // Increment $usercnt by 1
    $username = $username . $num;  // Add number to username
}

假设bjones、bjones1和bjones2已经存在,那么我最终会得到bjones3。

如果bjones、bjones1和bjones3存在,那么怎么办?(没有bjones2) - Dezza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接