如果重复,如何在用户名末尾添加额外的号码

时间:2010-12-21 11:44:56

标签: php

很难解释,让我举个例子。

  1. 如果MySQL中已经存在用户名 foo ,我希望php脚本允许它,但要 foo1
  2. 如果 foo1 也存在,脚本会生成用户名 foo2
  3. 如果 foo2 存在,则变为 foo3
  4. 如何做到这一点?

    Col. Shrapnel所说自然增量似乎更明智。就像Windows中的“新建文件夹(3)”一样

8 个答案:

答案 0 :(得分:3)

首先,锁定表,以便其他表不会同时写入它。然后做这样的事情:

$name = 'foo';
$first_name = $name;
$i = 0;
do {
  //Check in the database here
  $exists = exists_in_database($name);
  if($exists) {
    $i++;
    $name = $first_name . $i;
  }
}while($exists);
//save $name

另一种方法是选择表中以“foo”开头并以数字结尾然后找到最大数字的所有名称。这可以在SQL中完成。

第一种方法对于碰撞风险很小的用例更好,因为模式匹配可能很慢,但如果你有很多碰撞,后者可能会更好。

答案 1 :(得分:2)

首先,检查数据库中是否存在所需的用户名:

SELECT COUNT(*) AS numRows FROM table 
WHERE SUBSTRING(username, 1, CHAR_LENGTH(desiredUserName)) = desiredUserName

如果numRows为0,您可以保留用户名。如果为1,您只需在用户名末尾添加“1”即可。如果numRows>它会变得有点复杂。 1.您需要获取附加该用户名的当前最大号码:

SELECT CAST(SUBSTRING(username,(CHAR_LENGTH(desiredUserName) + 1)) AS SIGNED) AS maxNum
FROM table
WHERE SUBSTRING(username,1,CHAR_LENGTH(desiredUserName)) = desiredUserName
ORDER BY CAST(SUBSTRING(username,(CHAR_LENGTH(desiredUserName) + 1)) AS SIGNED) DESC
LIMIT 1

现在您只需要将1添加到返回的maxNum并将其附加到所需的用户名

答案 2 :(得分:0)

试试这个(你需要根据自己的需要进行修改!)

$username_loop = $username = "foo"; // edit: compatibility to usernames n.e. "foo"
$count = 0;
while (){
  $count++;
  $query =  "SELECT username FROM User WHERE username = ".$username_loop;
  $result = mysql_query($query);
  if ($result){
     $username_loop = $username.$count;
  }
  else break;
}

答案 3 :(得分:0)

首先,使用正则表达式解析所请求用户名的前导alpha部分,以及任何尾随的数字后缀,如:

^([a-zA-Z_]+)(\d)*$

第一组为你提供了一个词干(让我们把它分配给一个叫做UsernameStem的变量),第二组给你一个数字(让我们把它分配给UsernameNumber)。请注意,用户可能没有输入数字后缀,因此您需要检查此特殊情况并将0分配给UsernameNumber。

然后,您可以在users表上发出SQL语句,如下所示:

SELECT MAX(username) FROM users WHERE username LIKE :UsernameStem || '%' 

这将为您提供用户所需名称的最高数字后缀的现有用户名。

您可以再次使用上面的正则表达式来解析这个最大数字 - 这次检查正则表达式匹配返回的第二个组。然后,您可以为此号码添加1,以提供下一个可用的用户名。

示例:用户请求“foo21”。正则表达式将解析出“foo”作为UsernameStem并将“21”解析为用户名号。假设您的数据库中有一个用户名为“foo44”的用户,SQL查询将返回此用户名。再次将正则表达式应用于数据库中的此用户名将使您能够解析数字“44”。然后,您可以将其转换为int,添加1,然后将其与原始UsernameStem连接。这将产生“foo45”。

祝你好运!

答案 4 :(得分:0)

我会用这样的东西:

// the username
$username = "foo";

// find all users like foo%
$q = mysql_query("SELECT * FROM users WHERE username LIKE '".$username."%' ORDER BY id DESC");

// no users
if (mysql_num_rows($q) == 0) {
    // create $username
}
else {

    $last_num = 0;

    // find all foo users
    while ($row = mysql_fetch_array($q)) {

        // match foo + number
        if (preg_match("/^".preg_quote($username)."+([0-9]+)$/i", $row['username'], $match)) {

            // extract the number part
            $num = (int) $match[1];

            // set the highest number
            if ($num > $last_num) $last_num = $num;
        }
    }

    // append the highest number to the username
    if ($last_num > 0) $username .= $last_num + 1;

    // create $username
}

答案 5 :(得分:0)

  $getname   = $_POST['getname'];

  $i++;

  $q =  "SELECT username FROM User WHERE username LIKE '".$getname."%'";

  $r = mysql_query($q);

  if(mysql_num_rows($r) > 0){

    while($row = mysql_fetch_object($r)){
      if($row->username == $getname){
        $uname = $getname.$i;
      }else if($row->username == ($getname.$i)){
        $uname = $getname.$i+1;
      }
      $i++;
    }

  }
  else
  {
   $uname = "foo";
  }

答案 6 :(得分:0)

    while (exists($username)) {
        if (!is_numeric(substr($username, -1, 1))) {
            $username = "{$username}0";
        }
        $username++;
    }

    return $username;

您将获得:test,test1,test2等

答案 7 :(得分:-2)

的一些变体
$number = 1;
$query = "select name from users where username = ".$username.$number;
$res = mysql_query($query);
$num_rows = mysql_num_rows($res);
while ($num_rows) {
 $number ++;
 $query = "select name from users where username = ".$username.$number;
 $res = mysql_query($query);
 $num_rows = mysql_num_rows($res);
}

以上将增加数字,直到找到一个当前不在数据库中的数字。

您显然必须编辑值以适合您的设置