2

これが状況です。ユーザーがサインアップできる登録ページがありますが、ユーザーは姓、名の電子メールとパスワードを入力することしかできません。データは一時ユーザー テーブルに保存されます。これは、まだアカウントをアクティブ化していないユーザー用です。

登録が成功した後、ユーザーは電子メールでアカウントをアクティブ化できます。アクティブ化されると、データは別のテーブルに移動され、一時テーブルから削除されます (この方法に反対する人もいるかもしれませんが、これが私が選択した方法です) )。これはすべてうまくいきます。

私が今直面している問題は、ユーザー名用のフィールドがあることです。これは実際には、example.com/home/first.last.56 のような URL の構築にのみ使用されますが、一意である必要があり、もちろんユーザーは、アクティブにしてログインすると、後でこれを変更できます。

ユーザーが自分のユーザー名を選択できるようにするだけで簡単になり、長期的にはおそらく簡単になることはわかっていますが、当面はこれをやりたくありません。

私がやろうと思ったこと:

「一時テーブル」からの一意の行 ID を使用し、次のように文字列の末尾に配置します: first.last.56 ここで、first と last はユーザーの姓名で、56 は一時テーブルからの一意の行 ID です。これは問題なく動作しますが、テーブルが 1500 または 2000 になると、ユーザー名が長くなり、つまり first.last.1597 になり、URL の見た目が少し悪くなり、URL もそうではないと考えています。非常にユーザーフレンドリー。これを最大2桁に抑えたいと思います。

一意のユーザー名を維持しながら、これを達成するための他の方法は何ですか?

また、名前がユーザーの本名に似ている限り、名前または姓から文字を使用してユーザー名を作成しても問題ありません。

これまでの私のコードは次のようになります。

    $new_member_insert_data = array(
        'First_Name' => ucfirst(strtolower($first_name)),
        'Last_Name' => ucfirst(strtolower($last_name)),
        'Email' => $this->input->post($this->session->userdata('email_n_attribute')),
        'Password' => $hash,
        'Confirm_Code' => $confirm_code,
        'IP' => $_SERVER['REMOTE_ADDR']
    );
    
    $insert = $this->db->insert('Temp_Account', $new_member_insert_data);
    
    $this->db->select('idAccount');
    $query = $this->db->get_where('Temp_Account', $new_member_insert_data);
    if($query->num_rows() == 1){
        foreach($query->result() as $row){
            $user_name = array('User_Name' => $first_name.'.'.$last_name.'.'.$row->idAccount);
            $this->db->where('idAccount', $row->idAccount);
            $this->db->update('Temp_Account', $user_name);  
        }
    
    }           
4

2 に答える 2

0

確かに、私は個人的に codeigniter フレームワークを使用したことはありませんが、次のようにします。

$search_user_name = $first_name.'.'.$last_name.'.';
$query = "select count(1) as count from users where User_Name like '{$search_user_name }%'";
//Use whatever DB method you CI uses to run this query
//If possible remove $user_name from the query directly and use bind parameter
//This query will return a number ($count) then you can do the following
$user_name = array('User_Name' => $search_user_name . $count);
//Use the rest of your existing code
于 2013-01-14T13:42:41.050 に答える
0

まず、フィードバックをくださった皆様に感謝いたします。stackoverflow.com は素晴らしく、最高のコミュニティを持っています。これまで。

それで、いじくり回したり、何度か失敗したりした後、上から残されたアドバイスフォームのコメントが私が思いついたものです。

「ランダムなユーザー名」の作成を処理するプライベート関数を作成することにしました。最初に、MySQL COUNT() 関数を使用して sql 部分を記述しようとしましたが、これが必要ないことに気付きました。(CodeignterでActiveレコードを使用する場合)

代わりに、単純にデータベースにクエリを実行して、次のように結果を確認できます。

    $sql = 'SELECT User_Name FROM Account WHERE User_Name = ?';
    $count = $this->db->query($sql, $user_name);

したがって、random_user_name 関数は次のとおりです。

private function random_user_name($first_name, $last_name, $data){
    // Generate a random number
    $rand_number = rand(2, 99);
    // Create the username 
    $user_name = array('User_Name' => $first_name.'.'.$last_name.'.'.$rand_number);

    // Check the db for a matching username     
    $sql = 'SELECT User_Name FROM Account WHERE User_Name = ?';
    $count = $this->db->query($sql, $user_name);

    // If a matching username is found run the function again, to create a new username 
    if($count->num_rows() == 1){
            $this->random_user_name($first_name, $last_name, $data);
    }else{

        // Select the row id from the db of the newly created user  
        $this->db->select('idAccount');
        $query = $this->db->get_where('Temp_Account', $data);

        // If we find the user, and we better! update the username field
        if($query->num_rows() == 1){
            foreach($query->result() as $row){  
                $this->db->where('idAccount', $row->idAccount);
                $this->db->update('Temp_Account', $user_name);
            }
        }
    }
}

これが、かなり単純な問題であることが判明した原因を解明しようとして、必要以上に多くの時間を費やしている他の誰かの助けになることを願っています。また、皆さんに感謝します!

于 2013-01-12T06:18:34.770 に答える