-1

我正在尝试输入一个自定义表单错误,该错误将向用户显示“您没有帐户。单击此处注册”。但目前,如果我输入了不正确的用户名,我在视图中什么也看不到存在于我的个人资料数据库中。我有一个 lang 文件,它加载了我已经在我的 autoload.php 文件中定义的这个错误: $autoload['language'] = array('myerrors'); 我的视图有问题吗?认为我需要使用 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>

控制器:

函数登录用户()

{

$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');
}
}
4

2 回答 2

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->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 ;   
于 2012-12-23T01:42:29.527 回答
0

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

另外,如果您执行 autoload form_validation,那么为什么要在控制器中再次加载它?如果你不这样做,如果你想在那里设置消息,你也应该将它加载到模型中。

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

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

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

我希望它有所帮助。

于 2012-12-22T21:34:04.953 回答