很难解释,让我举个例子。
如何做到这一点?
像Col. Shrapnel所说自然增量似乎更明智。就像Windows中的“新建文件夹(3)”一样
答案 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);
}
以上将增加数字,直到找到一个当前不在数据库中的数字。
您显然必须编辑值以适合您的设置