0

我在代码点火器中为我的登录表单提交错误表单的所有不同组合都正常工作。

**编辑 - 这似乎是最合乎逻辑的形式,因为其他建议是加载双视图,或者与我的结构没有凝聚力。除一个错误外,所有错误都正常工作。

当您使用正确的电子邮件和乱码密码点击提交时,不会出现错误,并且页面会重新加载,输入的电子邮件自动填充,密码字段设置回默认的“密码”文本。

我一直坚持这一点太久了,任何帮助都将不胜感激。

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>'); ?>
...

如果你稍微改变你的逻辑,你可以摆脱's 并在语句运行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 回答