如何让code_validation在Code Igniter中正常工作

时间:2012-10-09 17:22:02

标签: codeigniter error-handling validation

我非常接近放弃Code Igniter中的原生表单验证错误功能,因为我很难让它们正常工作。我的逻辑似乎是一个箭头,但错误构成的行为实际上是基于我的逻辑抛出一个循环。

所以这里列出了正在发生的事情。

*当我提交表单时没有填写任何字段=无效的电子邮件和密码错误构成了应该

*当我输入正确的电子邮件并将密码字段留空时=正确的无效密码错误构成应该

*当我输入正确的电子邮件和错误的密码=页面加载白色

*当我只输入密码字段时=出现无效的电子邮件

*当我输入乱码电子邮件并将密码留空时=无效的电子邮件会出现

正在进行许多假罩的组合。

如果输入的电子邮件在数据库中不存在,我也想让电子邮件对其识别的位置唯一。

我长期坚持这一点,真的需要一些帮助。我是代码点火器的新手,我真的很困惑为什么会发生这种情况。非常感谢任何帮助。

这是我的代码:

形式:

<?php
echo form_open('auth/validate_credentials_login');
echo "<span class='errors_login'>";
echo form_error('email_login');
echo "</span>";
echo form_label('', 'Email', 'email_login');
$data = array( 'name' => 'email_login', 'class' => 'input', 'placeholder' => 'Email');
echo form_input($data, set_value('email_login'));
echo "<span class='errors_login'>";
echo form_error('password_login');
echo "</span>";
echo form_label('', 'Password;', 'password_login');
$data = array( 'name' => 'password_login', 'class' => 'input', 'placeholder' => 'Password');
echo form_password($data, set_value('sha1(password_login)'));
echo form_submit('submit_login', 'Login');
echo form_close();
?>

控制器:

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', 'required');
            $this->form_validation->set_rules('password_login', 'Password', 'required');
            $login = $this->input->post('submit_login');

            if($login) {
                if($this->form_validation->run() == FALSE)
                {
                    $data['main_content'] = 'home/home_page';
                    $this->load->view('includes/templates/home_page_template', $data);
                }
                else 
                {
                    $user = $this->um->validate_home_login(array('email' => $this->input->post('email_login')));

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

提前感谢!

1 个答案:

答案 0 :(得分:4)

  

当我输入正确的电子邮件和错误的密码=页面加载白色

那是因为你在这里没有else条件:

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

列表中的其他内容听起来像预期的行为,但您可能需要确保$this->um->validate_home_login()正在做它应该做的事情。

作为附注,在致电exit之后无需redirect(),它会为您做到这一点。

另外,set_value('sha1(password_login)')对我来说看起来很可疑,我觉得它不符合你的想法。它会将密码值设置为文字字符串sha1(password_login)。我建议你不要预先填写密码字段 - 只需将其留空即可。

CI的表单验证肯定没有被破坏,它实际上运行得很好,所以不要感到沮丧。最好回顾documentation并尝试更简单的事情,直到你能使一切正常运作。

  

如果输入的电子邮件在数据库中不存在,我也想让电子邮件对其识别的位置唯一。

查看is_unique规则:

http://ellislab.com/codeigniter/user_guide/libraries/form_validation.html#rulereference

$this->form_validation->set_rules(
    'email_login',
    'Email',
    'required|is_unique[your_table.your_email_field]'
);