0

データベースに保存されている各ユーザーに一意のユーザー名を作成する関数を作成しようとしています。

私の計画は、姓と名を連結してユーザー名を作成し、このユーザー名が使用されているかどうかを確認することでした。データベースに保存するだけでなく、保存していた場合は、末尾に番号を追加します。

たとえば、ConnorAtherton が取得された場合、関数は次に ConnorAtherton1、ConnorAtherton2 を一意のユーザー名が見つかるまでチェックします。

これが関数です(デバッグ用にいくつかのエコーステートメントを追加しました)

    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) の後に正しい値が返されますが、ループの後に 2 番目の値が存在する理由がわかりません。

ConnorAtherton1 を返すので、ConnorAtherton2 を返す必要があります。

どんな助けでも大歓迎です。

4

2 に答える 2

3

コードは期待どおりに実行されます。表示されているのは、再帰呼び出しから巻き戻されたスタックだけです。

再帰呼び出しから結果を返すことにより、再帰呼び出しの後に終了するように関数を変更する必要があります

     //...
    $counter++;
    return createUserName($username, $counter);
 }
 //... Rest of fn omitted
于 2013-03-08T13:47:55.087 に答える
1

再帰なしで、はるかに簡単に目的を達成できます。基本的なロジックは次のようになります。

$counter = '';
do {
    $username = ucfirst($fname) . ucfirst($lname) . ($counter++);
} while(!doesNameExist($username));

メソッドを実装するだけで済みますdoesNameExist()。そこで DB クエリを実行しtrue、名前が既に存在する場合は戻ります。

パーツは、($counter++)最初の反復で空の文字列を追加します (値が評価された++、接尾辞によって変数が増加します)。

于 2013-03-08T13:54:27.263 に答える