递归PHP函数未返回预期值

时间:2013-03-08 13:43:45

标签: php function recursion return

我正在尝试创建一个函数,为存储在数据库中的每个用户创建一个唯一的用户名。

我的计划是通过连接名字和姓氏来创建用户名,然后检查是否已使用此用户名。如果它不只是将它存储在数据库中,如果它只是在它的末尾添加一个数字。

例如,如果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。

非常感谢任何帮助。

2 个答案:

答案 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++)部分将在第一次迭代时附加一个空字符串(++后缀会在评估值后增加变量。)