0

我正在尝试实施 facebook 注册。它有效,我正在取回我需要的所有数据。现在我想像这样为用户分配一个用户名:

$username = ''.$first_name.'.'.$lastname.'';

问题是我不知道同名和姓氏的用户是否会注册到该网站,我想检查用户名是否被使用并向基本 $username 添加一个序列号(facebook 也这样做), 像这样:

name.lastname
name.lastname.1
name.lastname.2
etc

我试过:

$temp_username = ''.$first_name.''.$last_name.'';
$check_username = mysql_query("SELECT username FROM users WHERE username = '$temp_username'");
$num_rows = mysql_num_rows($check_username);
if ($num_rows == 0){
    $username = strtolower($temp_username);
} else {
    $username = strtolower(''.$temp_username.'.'.$num_rows.'');
}

但当然它不起作用,因为始终只有一个用户使用该用户名。

编辑* * * 这就是我修复它的方法(感谢 zander):

        $temp_username = ''.$first_name.''.$last_name.'';
        $num_rows = mysql_num_rows(mysql_query("SELECT username FROM users  WHERE username = '$temp_username' OR username LIKE '$temp_username%' "));
        $username = strtolower(''.$temp_username.'.'.$num_rows.'');
4

8 回答 8

2

$num_rows = mysql_num_rows(mysql_query("SELECT username FROM users WHERE username = '$temp_username' OR username LIKE '$temp_username.%' "));将返回您实际期望的行数。然后,用$username = strtolower(''.$temp_username.'.'.$num_rows.'');它来完成它。不需要循环。

于 2012-10-07T11:01:34.453 回答
2

SELECT如果有的话,下面确定数字最高的用户

select max(reverse(SUBSTRING(reverse(username), 1, LOCATE('.', reverse(username))-1))) trail 
  from users
 where username like 'John.Smith.%';

SQL 小提琴演示

像这样将它添加到 PHP

...
if ($num_rows == 0){
    $username = strtolower($temp_username);
} else {
   ... query for the max number here
   ... concatenate the username with the max number 
}

啊,最后但并非最不重要。确保您的代码不易受到 SQL 注入的影响。使用绑定参数。好的开始是这个答案:防御 mysql 注入和跨站点脚本的最佳方法

于 2012-10-07T11:42:51.827 回答
1

有许多现有答案正确建议在 WHERE 子句中使用 LIKE 运算符。但是有一个关键问题,现有的答案都没有解决。

两个人可以尝试在相同(或几乎相同)时间添加相同的用户名。每个都会选择与该名称类似的现有用户名的计数,并且它们每个都会生成相同的数字后缀,并且您仍然会得到重复。

我既不是 mysql 开发者也不是 php 开发者,所以我不会提供太多具体语法的方式。

您需要确保您的 users 表使用InnoDB 存储引擎。您的代码将需要:

  1. 开始交易

  2. SELECT FOR UPDATE 以确保只有一个人可以在给定时间获得特定用户名的计数

  3. 插入您的新用户

  4. 提交您的交易。

有关详细信息,请参阅选择更新

于 2012-10-07T12:20:53.907 回答
0

请改用此代码:

$check_username = mysql_query("SELECT username FROM users WHERE username = '$temp_username' OR username LIKE  '$temp_username.%' ");

这将匹配的示例:

johnsmith 或 joshnsmith.X 其中 x 将是 1 , 2 , 3 ........等

于 2012-10-07T10:56:32.347 回答
0

数据库转储

CREATE TABLE Users (
  `username` varchar(255) PRIMARY KEY,
  `firstname` varchar(255),
  `lastname` varchar(255)
);

INSERT INTO Users (`username`, `firstname`, `lastname`) VALUES (
  'praveen.kumar', 'Praveen', 'Kumar'
),(
  'praveen.kumar.1', 'Praveen', 'Kumar'
),(
  'praveen.kumar.2', 'Praveen', 'Kumar'
);

现在到 SQL,我们可以这样做:

SELECT *
FROM `Users`
WHERE `username` LIKE "praveen.kumar%"
ORDER BY `username` DESC

给出一个输出:

+-----------------+-----------+----------+
|        USERNAME | FIRSTNAME | LASTNAME |
+-----------------+-----------+----------+
| praveen.kumar.2 |   Praveen |    Kumar |
| praveen.kumar.1 |   Praveen |    Kumar |
|   praveen.kumar |   Praveen |    Kumar |
+-----------------+-----------+----------+

你可以通过这种方式获得最新的:

SELECT *
FROM `Users`
WHERE `username` LIKE "praveen.kumar%"
ORDER BY `username` DESC
LIMIT 1

PHP代码:

<?php
    # Outputs the largest number with that username.
    $nextUser = substr($userNameFromDB, strrpos($userNameFromDB, "."));
    $nextUser++;
?>

SQL 小提琴:http ://sqlfiddle.com/#!2/ad149/1

于 2012-10-07T11:00:38.177 回答
0

使用count()函数和like运算符:

$check_username = mysql_query("
    SELECT count(username) 
    FROM users 
    WHERE username like '$temp_username%'
");

它将返回现有名称的数量。无需调用mysql_num_rows

于 2012-10-07T11:01:35.090 回答
0

您应该使用 count() 函数

$query = mysql_query("
  SELECT count(user_name) cnt
    FROM users 
    WHERE username = '$just_registered_username'
");

然后使用获取结果

$row = sql_fetchrow($query);

然后获取用户数为

$next_index = $row->cnt;

然后将其附加到新用户名

$new_username = "{$just_registered_username}.{$next_index}";

不要忘记在最终代码中添加注释。还可以尝试使用 PDO 进行数据库访问。

于 2012-10-07T11:18:51.877 回答
-1

如果要查找不存在的用户名,则必须尝试组合,直到找到不存在的用户名。

因此,循环直到找到不存在的名称:

$temp_username = $first_name . $last_name;
$i=1;
$found = false;
while(!$found) {
  $check_username = mysql_query(
     "SELECT username FROM users WHERE username = '$temp_username'");
  $found = mysql_num_rows($check_username);
  if ($found){
    $username = strtolower($temp_username);
  }
  else{
    $temp_username = $first_name . $last_name . '.' . $i;
    $i++
  }
}
于 2012-10-07T10:56:46.990 回答