您如何在PHP中为用户建议唯一的用户名?

时间:2011-08-17 07:03:41

标签: php mysql

假设有人想要的用户名,那么我希望系统建议一个可用的用户名列表,比如5个建议。

现在,我可以基于我已经拥有的数据的排列和组合生成多个用户名,例如他们的名字,生日,e.t.c。但是,如何确保生成的用户名可用?我的意思是,如果对于每个生成的用户名,我必须查询数据库以检查可用性,在最坏的情况下,这可能会变成无限循环。

有什么想法吗?

2 个答案:

答案 0 :(得分:6)

我怀疑这个问题是基础的,所以我将提供一个简单的例子:

<?php

// Untested code and only one of the many possible ideas
$suggestions = array(
    'foobar' => TRUE,
    'foo1974' => TRUE,
    'foo37' => TRUE,
    'drfoo' => TRUE,
    'mrfoo' => TRUE,
);


$params = $placeholders = array();
foreach(array_keys($suggestions) as $position => $username){
    $params['u' . $position] = $username;
    $placeholders[] = ':u' . $position;
}
$sql = 'SELECT username
    FROM user
    WHERE username IN (' . implode(', ', $placeholders) . ')';

$res = $conn->prepare($sql);
$res->execute($params);
while( $row = $res->fetch(PDO::FETCH_ASSOC) ){
    $suggestions[ $row['username'] ] = FALSE;
}


foreach($suggestions as $username => $available){
    if($available){
        // ...
    }
}

修改

提供无限可用名称列表的唯一方法是使用一个非常简单的规则,例如添加连续数字。在这种情况下,您可以尝试这样的事情:

SELECT username
FROM user
WHERE username REGEXP '^foo[0-9]+'

......然后:

$username = 'foo';

$suggestions = array();
$count = 0;
$names_left = 5;
while($names_left>0){
    $count++;

    if( !in_array($username . $count, $names_taken) ){
        $suggestions[] = $username . $count;
        $names_left--;
    }
}

答案 1 :(得分:0)

我会列出一个要尝试的列表(比如15-20的列表)。任何命中都会向用户显示前5个。否则只是说没有建议。

可能的评论可能包括排序或姓氏,名字,姓名缩写,年龄,出生年份或只是随机数。你应该至少可以找到至少一个建议。