3

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

  • 约翰·史密斯

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

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

  • 约翰·史密斯
  • 约翰_史密斯_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   
4

3 回答 3

1

您可以使用此查询:

$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];
于 2013-05-09T18:12:23.313 回答
0

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

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

于 2013-05-09T18:16:26.007 回答
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。

于 2017-06-25T07:45:39.417 回答