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

もう一度助けてくれてありがとう—私はこのサイトで同様の問題を見てきましたが、私はそれらがあまりにも混乱していることに気づきました

4

4 に答える 4

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;


    }
}

モデルは大丈夫です。関数をこれに変更してみてください

 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;

}

これをここに書いたので、テストする必要がありますが、問題ないはずです。申し訳ありませんが、正しくインデントできませんでした。ここでそれを行うのは面倒です:)

于 2012-11-22T15:33:12.650 に答える
0

フォームの検証では、おそらくモデルにアクセスできません。usernameTaken($username)コントローラに移動してみてください。

于 2012-11-22T14:42:15.273 に答える
0

毎回挿入していると思います。

if (! $this->membership->usernameTaken($username)) 
{
  $this->membership->newUser($username, $password);
}
于 2012-11-22T14:49:55.290 に答える
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');
    }

このようなことをしてみてください。

if($ this-> form_validation-> run()&&!$ this-> membership-> usernameTaken($ username)){

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

このように、リダイレクトせず、その下の行の実行に進みます。

于 2012-11-22T14:51:34.010 に答える