0

私は以下のコードを持っています:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Login extends MY_Controller
{

function __construct()
{
    parent::__construct();
    $this->load->model('users/user_model');
    $this->load->library('form_validation');
}

function _load_login_page()
{
    $this->load->model('sysconfig/sysconfig_model');

    $a = $this->sysconfig_model->get_sysconfig();
    $row = $a[0];

    $this->lang->load('klas',$row->sysconfig_language);

    $data['sys_name'] = $row->sysconfig_system_name;        
    $data['template_name'] = $row->systemplate_name; 
    $data['css_script'] = base_url().'assets/'.$row->systemplate_name;

    if($row->sysconfig_maintenance === 'Y')
    {
        $this->load->view('sysconfig/maintenance',$data);
    } 
    else {

        $this->load->view('login',$data);
    }
}

function index()
{            
    $this->form_validation->set_rules('username', 'Username', 'trim|required|max_length[12]|xss_clean|callback_check_auth');
    $this->form_validation->set_rules('password','Password','trim|required');

    if($this->form_validation->run($this) == FALSE)
    {
       $this->_load_login_page();     
    } else {
        redirect('welcome','refresh');
    }

}

function check_auth()
{
    if($this->user_model->authentication())
    {
        return TRUE;
    }

    $this->form_validation->set_message('check_auth',$this->lang->line('invalid_username'));
    return FALSE;
}
?>

user_model.php

<?php

class User_Model extends CI_Model
{
function authentication() 
 {
    $this->db->where('useracc_id', $this->input->post('username'));
    $this->db->where('useracc_password', md5($this->input->post('password')));
    $q = $this->db->get('base_useracc');

    if($q->num_rows() == 1)
    {
        $session_data = array('isUserLogged'=>TRUE);

        $this->session->set_userdata($session_data);

        return TRUE;
    } 
 }
?>

ここから、ユーザーがユーザー名とパスワードのフィールドに入力しなかったかどうかを確認できます。エラーが表示され、すべてが期待どおりに機能します。問題は、ユーザーが無効なユーザー名またはパスワードを入力した場合、エラー メッセージが表示されないことです。

情報のために、私はすでに$lang['invalid_username'] = 'Invalid username or password';言語ファイルを入れています。

私はHMVC技術を使用してこれを行っています。私を助けてください。

4

2 に答える 2

0

HMVC wiki ページから:

MX でフォーム検証を使用する場合、現在のコントローラーを $CI 変数として form_validation ライブラリに割り当てる前に、以下に示すように CI_Form_validation クラスを拡張する必要があります。これにより、コールバック メソッドが適切に機能するようになります。(これは CI フォーラムでも議論されています)。すなわち:

<?php
/** application/libraries/MY_Form_validation **/ 
class MY_Form_validation extends CI_Form_validation 
{
    public $CI;
}

<?php
class Xyz extends MX_Controller 
{
    function __construct()
    {
        parent::__construct();

        $this->load->library('form_validation');
        $this->form_validation->CI =& $this;
    }
}
于 2012-04-27T11:26:40.713 に答える
0

コールバック関数にデータを渡していないようです。コールバック関数は、入力フィールドの値がパラメーターとして渡されることを想定しています。認証方法はおそらくパスワードとユーザー名の両方を知る必要があるため、これをフォーム検証コールバックとして機能させることはできないと思います。現在、 check_auth メソッドにデータを渡していないか、実際には user_model->authentication() メソッドに渡していません。そのため、form_validation はそれを無視しています。

コールバックとして check_auth を呼び出すのではなく、最初に form_validation を実行して (データが正しく、サニタイズされていることを確認するためのものです)、フォームからの値を if ステートメントの一部として check_auth 関数に渡します。form_validation set_message メソッドを使用してエラーを表示することはできませんが、これはよりクリーンなアプローチだと思います。

要約すると、form_validation を使用して、受信しているデータが正常であることを確認し、そうでない場合は関連するメッセージを表示します。その情報に基づいてユーザーを認証することは、検証に属しているとは思わない別の手順です。違いがわかりますか?

于 2012-04-26T10:05:02.777 に答える