为什么我的表单错误没有从表单验证中丢弃它应该的正确消息?

时间:2012-12-22 17:40:56

标签: php codeigniter

我试图输入一个自定义表单错误,该错误会向用户说“你没有帐户。点击这里注册。”但是,如果我输入错误,我在视图中看不到任何内容在我的个人资料数据库中不存在的用户名。我有一个lang文件加载我在autoload.php文件中已经定义的错误:$ autoload ['language'] = array('myerrors');我的问题是什么view?我想我需要使用一个form_error行,但我不知道在哪里......定义的错误名称是validateUser_error。

型号:

   function validateUser($username, $password)
     {
      $this->db->select('*')->from('membership');
      $this->db->where('username', $username);
      $this->db->where('password', $password);
      $query = $this->db->get();
      if ($query ->num_rows ==1)
     {
        $this->form_validation->set_message('validateUser_error');

        return true;
    }

    else{
        return false;

       }
    }

查看:

<?php echo validation_errors(); ?>

<?=form_open('login/loguserin');?>
  <p>
    username <?=form_input('username');?>
  </p>
  <p>
    password <?=form_password('password');?>
  </p>
  <p>
  <?=form_submit('submit', 'Login'); ?>
  <?=form_close(); ?>
</p>

控制器:

函数loguserin()

{

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

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

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


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

$valid = $this->membership->validateUser($username, $password);

if ($this->form_validation->run() && $valid == true)
{
    $this->session->set_userdata('status', 'OK');
    $this->session->set_userdata('username', $username);

    redirect('home');
}
else
{
    $this->session->set_userdata('status', 'NOT_OK');
    $this->load->view('shared/header');
    $this->load->view('account/logintitle');
    $this->load->view('account/loginview');
    $this->load->view('shared/footer');
}
}

2 个答案:

答案 0 :(得分:0)

在模型中设置此消息有点奇怪 - 这样做的通常位置是控制器......

此外,如果您进行自动加载form_validation,那么为什么要在控制器中再次加载它?如果不这样做,如果要在那里设置消息,还应该在模型中加载它。

但主要的是验证消息只会在函数validateUser_error返回false时出现 - 此函数似乎不存在于您的样本中。

有多种方法可以更改代码,但基本上你的validateUser()应该由validateUser_error()调用(它将由CI自动调用,因为它在验证规则中)可以从表单字段获取数据,也可以无条件致电

$this->form_validation->set_message('validateUser_error', 'Error message');

我希望它有所帮助。

答案 1 :(得分:0)

更改模型方法,使其只返回true或false。 如果失败,请在视图中显示消息。

 if( $this->membership->validateUser($username, $password) == false ) 
 {
      $data['error_msg'] = 'OMG what is up with your fat fingers? ';
      // load view, pass $data, $error_msg will be available in yr view
      $this->load->view('account/loginview', $data);
 } 
 else
 {
      // keep going 

 }

如果检查用户名,您还会有更多选项,然后检查密码。

另一种方法是在失败时使用单独的方法,并使用$ this-&gt; error_msg或类似方法。特别是如果你要加载一堆视图,你就不必重复它

 if( $this->membership->validateUser($username) == false ) 
  {
  $this->error_msg = 'No user by that name ';   
  $this->loginFail();
  } 
  elseif( $this->membership->validatePass($password) == false ) 
  {
  $this->error_msg = 'Password does not match this user name';   
  $this->loginFail();
  }

然后在loginFail()中加载您的视图,相应的错误消息将自动传递给视图:

 $data['error_msg'] = $this->error_msg ;