簡體   English   中英

Codeigniter-未通過表單驗證,但未顯示錯誤消息

[英]Codeigniter - form validation not passed but no error message shown

我正在使用codeigniter進行登錄表單驗證。 該代碼以前可以正常工作,但是當我進行了一些修改時,現在不起作用了。

當我嘗試輸入錯誤或密碼或用戶名留空時,錯誤消息顯示為正常,但是當我輸入正確的用戶名和密碼時, $this->form_validation->run()只是給我FALSEvalidation_errors()字符串。

我試圖恢復我的舊工作控制器php,但是此錯誤可以抵抗。

有關完整代碼,請訪問:

下面僅粘貼相關代碼:

控制器:

<?php
class User extends CI_Controller {
    public function __construct()
    {
        parent::__construct();
        $this->load->library('form_validation');
        $this->load->model('user_model');
        $this->load->helper('url');
        $this->load->helper('form');
        $this->load->helper('cookie');
    }
    function login(){

        $this->form_validation->set_rules('username', 'Username', 'trim|required|xss_clean|callback_username_check');
        $this->form_validation->set_rules('password', 'Password', 'trim|required|md5|callback_password_check');
        $this->_username = $this->input->post('username');                //用戶名


        $remember_me = $this->input->post('remember_me');
        $json_string = $this->input->cookie('userinfo');
        $userinfo_json = json_decode($json_string);

        if(isset($userinfo_json->username)){
            if ($this->username_check($userinfo_json->username)){
                $this->user_model->login($userinfo);
                redirect('admin/dashboard');
            }
        }


        if ($this->form_validation->run() == FALSE){
            $this->load->view('account/login');
        } else {
            $userinfo=$this->user_model->get_by_username($this->_username);
            $this->user_model->login($userinfo);
            if($remember_me=="on"){$this->user_model->write_session($userinfo);}
            redirect('admin/dashboard');
        }


    }
    function username_check($username){
        if ($this->user_model->get_by_username($username)){
            return TRUE;
        }else{
            $this->form_validation->set_message('username_check', 'User name not exist.');
            return FALSE;
        }
    }
    function password_check($password) {
        $password = md5($password);
        if ($this->user_model->password_check($this->_username, $password)){
            return TRUE;
        }else{
            $this->form_validation->set_message('password_check', 'Incorrect username or paswsword.');
            return FALSE;
        }
    }
}

視圖:

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Login - <?=$this->admin_model->get_title();?></title>
    <?php $this->load->view('gy/head');?>
</head>
<body>
    <?php $this->load->view('gy/header');?>
    <div class="hero-unit header">
        <div class="container">
            <div style="text-align:center;">
                <h1>Sign in</h1>    
                <p class="lead">Log into <?=$this->admin_model->get_title();?>.</p>
            </div>
        </div>
    </div>
    <div class="container">
        <div class="span5 offset3">
        <?php if(validation_errors() !== '' || @(!$err_message == '')){ ?>
        <div class="alert alert-error fade in">
            <a href="#" class="close" data-dismiss="alert">&times;</a>
            <strong>Error!</strong> <?=validation_errors('<span>','</span>');?> <?=@$err_message?>
        </div>
        <?php } ?>
        <?php if(@$message!=''){ ?>
        <div class="alert fade in alert-success">
            <a href="#" class="close" data-dismiss="alert">&times;</a>
            <strong>Success!</strong> <?=$message?>
        </div>
        <?php } ?>
            <?php echo form_open('login',array('class'=>'form-horizontal')); ?>
                <div class="control-group">
                    <label class="control-label" for="username">User name</label>
                    <div class="controls">
                        <input type="text" id="username" name="username" placeholder="User name">
                    </div>
                </div>
                <div class="control-group">
                    <label class="control-label" for="password">Password</label>
                    <div class="controls">
                        <input type="password" id="password" name="password" placeholder="Password">
                    </div>
                </div>
                <label for="remember_me" class="checkbox">
                    <input type="checkbox" id="remember_me" name="remember_me"> Remember me (30 days)
                </label>
                <div style="text-align:center;">
                    <input type="submit" name="submit" value="Log in" class="btn btn-primary">
                </div>
        </Form>
    </div>
    </div>
    <?php $this->load->view('gy/footer');?>
</body>
</html>

模型:

<?php 
class user_model extends CI_Model {
    public function __construct()
  {
    parent::__construct();
    $this->load->database();
    $this->load->library('session');

  }
     function login($userinfo)
     {
         $data = array('username'=>$userinfo->username,
                       'user_id'=>$userinfo->id, 
                       'role'=>$userinfo->role,
                       'logged_in'=>TRUE);
         $this->session->set_userdata($data);
     }
     function write_session($userinfo)
     {
        $user_json = json_encode($userinfo);
        $cookie = array(
            'name'   => 'userinfo',
            'value'  => $user_json,
            'expire' => '2592000',
            'secure' => TRUE
        );
        $this->input->set_cookie($cookie);
     }
     function get_by_username($username)
     {
         $this->db->where('username', $username);
         $query = $this->db->get('users');
         if ($query->num_rows() == 1)
         {
             return $query->row();
         }
         else
         {
             return FALSE;
         }
     }
     function password_check($username, $password)
     {                
         if($user = $this->get_by_username($username))
         {
             return $user->password == $password ? TRUE : FALSE;
         }
         return FALSE;
     }
}

我懷疑修剪規則。 它不返回布爾值,我想您還沒有為該規則設置任何錯誤消息。 驗證運行成功后,trim()應在用戶名和密碼上運行。 如果您只想檢查輸入是否有空格,則可以添加一條規則以使用strpos()進行檢查,但還是在自定義回調中進行檢查。 只要記住要使用相同的運算符'==='而不是相等的'=='即可。

控制器:

$this->form_validation->set_rules('username','Username','callback_space_check|required|xss_clean|callback_username_check');

function space_check($input){
   if(strpos(' ',$input)===false){
       return TRUE;
    }else{
            $this->form_validation->set_message('space_check', '%s contains space.');
            return FALSE;
        }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM