0

コードイグナイターでログインフォームに間違ったフォームを送信するさまざまな組み合わせがすべて正常に機能しています。

**編集 - 他の提案が二重のビューをロードしているか、私の構造とまとまっていないため、これは最も論理的な構成のようです。1 つを除いて、すべてのエラーが正常に機能します。

正しい電子メールと意味不明なパスワードで送信を押すと、エラーは表示されず、入力された電子メールが自動入力され、パスワード フィールドがデフォルトの「PASSWORD」テキストに設定された状態でページがリロードされます。

私はこれまでも長い間立ち往生しており、どんな助けも大歓迎です。

function validate_credentials_login()
    {
        $this->load->library('session');
        $this->load->helper(array('form','url'));
        $this->load->model('user_model', 'um');
        $this->load->library('encrypt');
        $this->load->library('form_validation');


        $this->form_validation->set_rules('email_login', 'Email', 'trim|required|valid_email'); 
        $this->form_validation->set_rules('password_login', 'Password', 'trim|required');


        if ( $this->form_validation->run() === TRUE ) 
        {   
            $user = $this->um->validate_home_login(array('email' => $this->input->post('email_login')));

            if ( $user )
            {
                if ( $user->password == $this->encrypt->sha1( $user->salt .         $this->encrypt->sha1($this->input->post('password_login'))) && $user->email == $this->input->post('email_login') ) 
                {
                    $this->session->set_userdata(array('email' => $this->input->post('email_login')));
                    redirect('account/edit');
                }
                else
                {
                   $this->form_validation->run() == FALSE;
                }
            }
            else
            {
                $this->form_validation->run() == FALSE;
            }
        }

  $data['main_content'] = 'home/home_page';
  $this->load->view('includes/templates/home_page_template', $data);   

    } 
4

2 に答える 2

0

私がやろうとしていたこと(そしてやったこと)はvalidation_errors()、ログインビューページで使用することです。これを行うことでそれを行うことができます:

if ($user)
    if ($success)
    {
        redirect(...);
    }
}
$this->load->view('login_page_template', $data); // Not sure what your login view is named

そしてログインビューで:

...
<?php echo validation_errors('<div class="errors_login">', '</div>'); ?>
...

ロジックを少し変更すると、 を削除して、ステートメントの実行else後にログイン ビューを読み込むことができます。ifユーザーが正常にログインすると、ログイン ビューが読み込まれる前にリダイレクトされます。elseこのように、 if ステートメントごとに同じコードを何度も複製する必要はありません。意味がない場合はお知らせください。

編集: @ m4t1t0 が言ったように、エラーをビューに渡す必要はありませんecho validation_errors('<div class="errors_login">', '</div>');。エラーを表示したい場所ならどこでもかまいません。これを反映するように例を更新しました。

各フォーム項目の上に個別にエラーを表示したい場合 (つまり、電子メールが存在しない、パスワードが正しくないなど)、echo form_error('field_name');それぞれの場所で使用できます。

編集 2: パスワードに sha1 暗号化を使用していることにも気付きました。これはセキュリティの低いセットアップでは問題ありませんが、PHP のcrypt()関数を使用することをお勧めします。この関数は、デフォルトで Blowfish アルゴリズムを使用します (利用可能な場合)。基本的な実装は次のとおりです。

// to make password hash
$password = crypt($this->input->post('password'));

// to check password hash
if (crypt($this->input->post('password'), $password_from_db) == $password_from_db)
{
    // success 
}
于 2012-10-12T17:57:38.570 に答える
0

@Brendan が言うように、最後の 2 つの else ステートメントは必要ありませんが、ビューにエラーを渡す必要さえありません! このコードを入れることができます:

コントローラーで:

$this->form_validation->set_rules('email_login', 'Email', 'trim|required|valid_email'); 
$this->form_validation->set_rules('password_login', 'Password', 'trim|required');


if ( $this->form_validation->run() === TRUE ) 
{   
  $user = $this->um->validate_home_login(array('email' => $this->input->post('email_login')));

  if ( $user )
    {
    if ( $user->password == $this->encrypt->sha1( $user->salt .         $this->encrypt->sha1($this->input->post('password_login'))) && $user->email == $this->input->post('email_login') ) 
      {
        $this->session->set_userdata(array('email' => $this->input->post('email_login')));
        redirect('account/edit');
      }


  $data['main_content'] = 'home/home_page';
  $this->load->view('includes/templates/home_page_template', $data);   
}

そしてビューで:

<?php echo validation_errors('<div class="error">', '</div>'); ?>

<div class="error" は、フォームの検証中にエラーが発生した場合にのみ表示され、それ以外の場合は何も表示されません。

于 2012-10-12T18:20:43.430 に答える