如何在自定义codeigniter表单验证器中比较表单输入数据和数据库数据?

时间:2017-12-13 05:55:44

标签: php database forms codeigniter validation

编辑:在我尝试自己解决问题时,有些命名已经混淆了。我修复了回调等命名,同样的错误仍然存​​在。

我正在尝试为我的codeigniter网站创建一个登录页面。我已经有一个注册页面,可以正确地将用户名和密码输入到"用户"表。我在理解创建自定义表单验证器所需功能的语法时遇到了问题。

我的错误是"无法访问与您的字段名称相对应的错误消息"用于密码和用户名自定义验证器。

以下是控制器的相关部分" login_ctrl"

    class login_ctrl extends CI_Controller {

function __construct() {
parent::__construct();
$this->load->model('login_mdl');
}
function index() {

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

$this->form_validation->set_error_delimiters('<div class="error">', '</div>');

//Validating Name Field
$this->form_validation->set_rules('username', 'Username', 'trim|required|callback_userCorrect');

//Validating Password Field 
$this->form_validation->set_rules('password', 'Password', 'trim|required|callback_passwordCorrect');

//variables to pass form input
$username = $this->input->post('username');
$password = $this->input->post('password'); 

//reload login page if validation fails
if ($this->form_validation->run() == FALSE) {
$this->load->view('login');
} else {
//functions for custom validation
function userCorrect($username) {
    $this->load->library('form_validation');
    //the loads the model that contains the function to compare input to database data
    $userExists = $this->login_mdl->userExists($username);

    if ($userExists) {
        $this->form_validation->set_message(
           'userCorrect', 'correct user.'
    );
        return true;
    } else {
        $this->form_validation->set_message(
            'userCorrect', 'not a valid user name.'
        ); 
        return false;
    }
}
function passwordCorrect($password) {
    $this->load->library('form_validation');
    $passwordExists = $this->login_mdl->passwordCorrect($password);

    if ($passwordExists) {
        $this->form_validation->set_message('passwordCorrect', 'correct password.');
        return true;
    } else {
        $this->form_validation->set_message('passwordCorrect', 'invalid password.'); 
        return false;
    }
}

这是相应的视图&#34; login&#34;

<?php echo form_open('login_ctrl'); ?>
<h1>Login</h1><hr/>
<?php if (isset($message)) { ?>
<?php } ?>
<?php echo form_label('User Name :'); ?> <?php echo form_error('username'); ?><br />
<?php echo form_input(array('id' => 'username', 'name' => 'username')); ?><br />

<?php echo form_label('Password :'); ?> <?php echo form_error('password'); ?><br />
<?php echo form_input(array('id' => 'password', 'name' => 'password')); ?><br />

<?php echo form_submit(array('id' => 'submit', 'value' => 'Submit')); ?>

<?php echo form_close(); ?><br/>

最后,这是相应的模型&#34; login_mdl&#34; (我认为问题可能出在这个人身上)。

<?php
class login_mdl extends CI_Model{
function __construct() {
parent::__construct();
}
function userExists($username) {
    $this->db->select('id');
    $this->db->where('username', $username);
    $query = $this->db->get('users');

    if ($query->num_rows() > 0) {
        return true;
    } else {
        return false;
    }
}

function passwordCorrect($password) {
    $this->db->select('password');
    $this->db->where('username', $username);
    $query = $this->db->get('users');
    $result = $query->row();
    return $result->password;

    if ('password' == $password) {
        return true;
    } else {
        return false;
    }
}
}
?>

我认为我的问题与db调用和if语句有关,但是我一直在阅读文档并且未能将其修复数小时,因此非常感谢新的眼睛。

1 个答案:

答案 0 :(得分:0)

您需要在服装规则函数中使用您的字段名称与函数回调相同。所以,它应该是这样的:

  $this->form_validation->set_message(
           'userCorrect', 'correct user.'

在你的其他功能上做同样的事情。