我正在尝试创建一个函数,为存储在数据库中的每个用户创建一个唯一的用户名。
我的计划是通过连接名字和姓氏来创建用户名,然后检查是否已使用此用户名。如果它不只是将它存储在数据库中,如果它只是在它的末尾添加一个数字。
例如,如果ConnorAtherton被采用,该功能接下来会检查ConnorAtherton1,ConnorAtherton2,直到它找到一个唯一的用户名。
这是函数(我已经为调试添加了一些echo语句)
function createUserName($username, $counter){
global $fname, $lname;
echo "\t\t\tUsername at Start - " . $username . "\n";
// connect to database
require($_SERVER['DOCUMENT_ROOT'] . "/inc/db.connect.php");
$stmt = $conn->prepare('SELECT * FROM users WHERE username = ?');
$stmt->bind_param('s', $username);
$stmt->execute();
$stmt->store_result();
echo "\t\t\tUsername before loop - " . $username . "\n";
if( $stmt->num_rows > 0){
//construct original name and try again
$username = ucfirst($fname) . ucfirst($lname) . $counter;
$counter++;
createUserName($username, $counter);
}
echo "\t\t\tUsername after loop - " . $username . "\n\n";
return $username;
}
以下是它返回控制台的内容
Username at Start - ConnorAtherton
Username before loop - ConnorAtherton
Username at Start - ConnorAtherton1
Username before loop - ConnorAtherton1
Username at Start - ConnorAtherton2
Username before loop - ConnorAtherton2
Username after loop - ConnorAtherton2
Username after loop - ConnorAtherton1
它在循环(ConnorAtherton2)之后返回正确的值,但我不知道为什么在循环之后会有第二个值。
它返回ConnorAtherton1,我需要它返回ConnorAtherton2。
非常感谢任何帮助。
答案 0 :(得分:3)
代码按预期执行。你所看到的只是从递归调用中展开的堆栈。
您应该通过返回递归调用的结果来修改函数以在递归调用后退出
//...
$counter++;
return createUserName($username, $counter);
}
//... Rest of fn omitted
答案 1 :(得分:1)
你可以更轻松地实现你想要的而不需要递归。基本逻辑看起来像这样:
$counter = '';
do {
$username = ucfirst($fname) . ucfirst($lname) . ($counter++);
} while(!doesNameExist($username));
您只需要实施doesNameExist()
方法。如果名称已存在,则执行数据库查询并返回true
。
($counter++)
部分将在第一次迭代时附加一个空字符串(++
后缀会在评估值后增加变量。)