2013-01-11 47 views
2

好希望有人可以幫助我這個。這裏是情況,我有註冊頁面,允許用戶註冊,但只允許用戶輸入他們的名字,姓氏電子郵件和密碼。數據存儲在臨時用戶表中,這是針對尚未激活其帳戶的用戶。隨機用戶名

成功註冊後,用戶可以通過電子郵件激活他們的帳戶,一旦激活,數據將被移動到不同的表中並從臨時表中刪除(我知道有些人可能不同意這種方法,但這是方法我選擇了)。所有這些都很好。

我現在面臨的問題是,我有一個用於用戶名的字段,這實際上只用於構建像這樣的url:example.com/home/first.last.56但它必須是唯一的當然用戶將能夠稍後改變這一次活動和登錄英寸

我知道這會更容易,如果我只是讓用戶選擇自己的用戶名,可能更簡單的長期來說,但對於暫時這不是我想要做的事。

事情我曾經想過做:

從「臨時表」使用唯一的行ID和放置在像這樣的字符串的結尾:first.last.56其中第一和最後一個是用戶名和姓以及56是來自臨時表的唯一行標識。這工作正常,但即時通訊認爲,一旦表增長說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); 
     } 

    }   
+0

你能擁有像,1000 +約翰呢? –

+6

檢查是否存在相同的第一個和最後一個記錄?如果是這樣,請計算多少並添加1. First John Doe = john.doe.1 Second John Doe = john.doe.2 – Pitchinnate

+0

您還可以將ID轉換爲Base64,而不是Base10,這會將其更短。我也同意上面的檢查 - 在添加任何數字之前查看它是否是重複的。 – Jack

回答

0

首先,我要感謝大家的反饋,說stackoverflow.com是真棒,有最好的社會!永遠。

因此,在做了一些嘗試之後,幾次失敗的嘗試以及從上面留下的建議表單註釋都是我所想到的。

我決定創建一個私有函數來處理「隨機用戶名」的創建。起初,我嘗試使用MySQL COUNT()函數編寫sql部分,以瞭解這不是必需的。所以在這裏(當使用Active紀錄Codeignter)

相反,你可以簡單地查詢數據庫,並檢查了,像這樣的結果,

$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); 
      } 
     } 
    } 
} 

希望這幫助其他人花費更多的時間,而不是嘗試找出一個相當簡單的問題,並再次感謝每個人!

+0

並一如既往地開放以改善或改善解決方案。 – jphreak

0

當然,我個人從來沒有使用過的笨框架,但這裏是我會怎麼做:

$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 
+0

只是爲了澄清,基本上我會用用戶號碼而不是隨機生成的號碼計數的號碼? – jphreak

+0

正確,這將是您在運行'$ query'時收到的值。 – Pitchinnate

+0

對不起,在回覆,學校和工作中出現延遲!大聲笑,這似乎是一個很好的方法,實際上可能比使用隨機數字方法快一點。當我有機會時,我會試一試。謝謝! – jphreak