【问题标题】:Check if username exists, if so, increment by one检查用户名是否存在,如果存在,则加一
【发布时间】:2013-05-04 06:54:33
【问题描述】:

当一个用户名插入我的数据库时,例如:

  • 约翰_史密斯

我需要检查是否已经有 John_Smith 在场。如果是这样,将其加 1 成为 John_Smith_1

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

  • 约翰史密斯
  • 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 应该改变,你误用了你的数据库
  • 我讨厌网站这样做。只需告诉用户该名称已被使用,然后让他们选择另一个名称。
  • 快速思考 - 也许您应该将增量值与用户一起保存,以便您可以按该列排序。或者,您可以将 ID 附加到用户名(如果已使用)。或者更好的是,返回一个“错误”,说明用户名已被使用,并让他们选择另一个名称。
  • 谢谢你,虽然我没有提到用户使用社交网络登录,所以用户名是根据他们的社交登录自动生成的......我想我可以使用他们的电子邮件作为用户名,但是可能不受欢迎。

标签: php mysql increment


【解决方案1】:

我今天尝试解决一个类似的问题,并这样做了。在我的情况下,我需要根据用户的首字母/姓氏来存储/创建一个唯一的目录名称:

$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)
【解决方案2】:

虽然这可能不是总体方案中的最佳解决方案,但这里有一个答案可以解决您具体尝试做的事情。以下查询返回具有 $name 或 $name_123 SELECT COUNT(*) FROM users WHERE user_username REGEXP '$name[_0-9]*$'; 的用户数因此如果值为 0 您可以简单地使用 $name 本身,否则您可以使用 $name."_". + 查询返回的数字.

但是正如许多人所提到的,自动分配用户名并不是最好的主意(非常 web 1.0 :P)。我会推荐电子邮件地址。另一种选择是使用社交应用使用的任何用户 ID 以及标识社交应用的另一个字段(如果您有多个),然后使用自动递增的 id 字段作为唯一主键..

【讨论】:

  • 是的,我认为这是最好的方法。我将从他们的个人资料中获得一些独特的东西,并添加一个显示名称字段以在 UI 中显示一些友好的东西。谢谢
【解决方案3】:

你可以使用这个查询:

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

上面将查询 user_username 的值类似于 John_Smith_* 的行(其中 * 是任何有效字符,包括数字,您必须稍后检查)

你可以使用这个 php 语句来获取用户的后缀号:

preg_match( '/([0-9]+)$/', 'John_smith_10', $matches );
$user_number = $matches[0];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多