2012-11-22 18 views
0

我正在使用表單驗證功能 - 它目前不允許用戶在創建帳戶時輸入不正確的用戶名和密碼參數。但它是爲了讓用戶回到註冊屏幕。相反,他們被帶到主屏幕,並且如果我使用在進入數據庫之前已經使用過的用戶名。如何停止進入我的會員數據庫的重複條目?

註冊控制器:

class Signup extends CI_Controller { 

    function Signup() { 
     parent::__construct(); 
     $this->load->model('membership'); 
    } 

    function index() { 
     $this->load->view('shared/header'); 
     $this->load->view('account/signuptitle'); 
     $this->load->view('account/signupview'); 
     $this->load->view('shared/footer'); 
    } 

    function register() { 

     $this->load->helper(array('form', 'url')); 

     $this->load->library('form_validation'); 


     $this->form_validation->set_rules('username', 'Username', 'required|min_length[5]|max_length[12]|trim'); 
     $this->form_validation->set_rules('password', 'Password', 'required|md5|trim'); 
     $this->form_validation->set_rules('username', 'Username', 'callback_usernameTaken'); 


     $username = $this->input->post('username'); 
     $password = $this->input->post('password'); 


     if ($this->form_validation->run()) { 

     $this->membership->newUser($username, $password); 
     $this->session->set_userdata('status', 'OK'); 
     $this->session->set_userdata('username', $username); 
     redirect('home'); 
     } 


     if ($this->membership->usernameTaken($username)) { 
     $this->load->view('shared/header'); 
     $this->load->view('account/signuptitle'); 
     $this->load->view('account/signupview'); 
     $this->load->view('shared/footer'); 
     } else { 
     $this->load->view('shared/header'); 
     $this->load->view('account/signuptitle'); 
     $this->load->view('account/signupview'); 
     $this->load->view('shared/footer'); 
     } 
    } 

} 

我覺得if ($this->membership->usernameTaken($username))語句需要安排一定的方式可能它可能是一個else if語句?

會員制模式:

class Membership extends CI_Model { 

    function Membership() { 
     parent::__construct(); 
    } 

    function newUser($username, $password) { 
     $newMember = array('username' => $username, 
     'password' => $password); 
     $insert = $this->db->insert('membership', $newMember); 
    } 

    function usernameTaken($username) { 
     $this->db->select('*')->from('membership')->where('username', $username); 
     $query = $this->db->get(); 
     if ($query->num_rows > 0) { 
     return true; 
     } else { 

     return false; 
     } 
    } 

感謝您的幫助再次鄉親 - 我一直在尋找類似的問題,在這個網站,但我只是發現他們太混亂

回答

0

我相信當註冊函數運行時,只有這部分代碼在重定向之前執行。

if ($this->form_validation->run()) { 

    $this->membership->newUser($username, $password); 
    $this->session->set_userdata('status', 'OK'); 
    $this->session->set_userdata('username', $username); 
    redirect('home'); 
    } 

試着做這樣的事情。

如果($這個 - > form_validation-> run()的& &!$這個 - >成員─> usernameTaken($用戶名)){

$this->membership->newUser($username, $password); 
    $this->session->set_userdata('status', 'OK'); 
    $this->session->set_userdata('username', $username); 
    redirect('home'); 
    } 

這樣它不會重定向並繼續執行線在它下面。

+0

謝謝 - 我會試試這個:) –

0

表單驗證可能不有權訪問該模型。嘗試將usernameTaken($username)移動到控制器。

+0

難道它沒有看到模型thorugh這個命令 - $ this-> load-> model('membership');如果我加了它? –

0

我想你每次都插入。

if (! $this->membership->usernameTaken($username)) 
{ 
    $this->membership->newUser($username, $password); 
} 
2

我會說這些意見在模板中,你可以加載該模板。它使事情看起來有點整潔。 你的指數函數應該是這樣的

function index() { 
    $data['page_title'] = 'Sign up page'; 
    $data['central_content'] = "sign_up"; 
    $this->load->view('template'); 
} 

在模板中不要忘了加載內容,像這樣;

<?php $this->load->view($central_content); ?> 

重新排列你註冊函數看起來像這樣;

function register() { 
    #you should be autoloading these helpers tbh 

    $this->load->helper(array('form', 'url')); 

    $this->load->library('form_validation'); 


    $this->form_validation->set_rules('username', 'Username', 'required|min_length[5]|max_length[12]|trim'); 
    $this->form_validation->set_rules('password', 'Password', 'required|md5|trim'); 
    $this->form_validation->set_rules('username', 'Username', 'callback_usernameTaken'); 




    if ($this->form_validation->run()) { 

    $username = $this->input->post('username'); 
    $password = $this->input->post('password'); 
    #Learn to use flashdata, it helps. 

    if($this->membership->newUser($username, $password)){ 
     $this->session->set_userdata('status', 'OK'); 
     $this->session->set_userdata('username', $username); 
     redirect('home'); 
    } 

    }else{ 

    $this->index(); 
    } 

} 

#You specified a callback but there's no callback function in your class? Here's how you go about it. 
Public function usernameTaken(){ 
#callbacks should return true or false 
    if ($this->membership->usernameTaken($username)) { 
    return true; 
    } else { 
#You can set your own validation message in the case it's false. 
$this->form_validation->set_message('usernameTaken', 'The selected username already exists'); 
return false; 


    } 
} 

你的模型是確定的,嘗試改變的funcs中這個

function newUser($username, $password) { 
     $newMember = array('username' => $username, 
     'password' => $password); 
     return ($this->db->insert('membership', $newMember)) ? true : false; 
} 
function usernameTaken($username) { 
    #your query, requires a select * in a case where it's clearly not needed. Little things like this slow down your query.Try, 
    $query = $this->db->where('username', $username)->get('membership'); 
    #Also num_rows() 
    return ($query->num_rows() > 0) ? false : true; 

} 

剛纔寫的就到這裏,所以你必須要對其進行測試,但我敢肯定它應該是精細。對不起,我不能正確縮進它,雖然這是一個痛苦在這裏做:)

相關問題