4

このようなログインフォームで問題が発生しています

ここに画像の説明を入力

各フィールドの横に個別にエラーを表示したい

ここにコントローラーがあります

function index()
{      
        $this->form_validation->set_rules('username','Username','trim|required|exact_length[4]|xss_clean');
        $this->form_validation->set_rules('password','Password','trim|required|min_length[4]|max_length[40]|xss_clean|callback_login');
        $this->form_validation->set_rules('jabatan','Jabatan','trim|required|xss_clean');

        if($this->form_validation->run() == false)
        {
            $this->load->view('login');
        }
        else
        {
            $this->load->view('welcome_message');
        }

}

function login()
{
    $username = $this->input->post('username');
    $password = $this->input->post('password');
    $jabatan = $this->input->post('jabatan');

    $value = $this->m_login->login($username,$password,$jabatan);

    if($value)
    {
        return true;
    }
    else
    {
        $this->form_validation->set_message('login', 'password salah');
        //delete redirect() and showing blank white screen
        return false;

    }

<?php echo form_error(); ?>各畑の脇を作りました

<?php echo form_open('c_login/login'); ?>
            <table>
                <tr>
                    <td>Username</td>
                    <td><?php $inusername=array('name' => 'username', 'class' => 'GUI'); echo form_input($inusername); ?></td>
                    <td class="error"><?php echo form_error('username'); ?></td>
                </tr>

                <tr>
                    <td>Password</td>
                    <td><?php $inpassword=array('name' => 'password', 'class' => 'GUI', 'type' =>'password'); echo form_input($inpassword); ?></td>
                    <td class="error"><?php echo form_error('password'); echo $this->session->flashdata('login'); ?></td>
                </tr>

                <tr>
                    <td>Jabatan</td>
                    <td><?php $injabatan=array('keuangan' => 'keuangan', 'admin' => 'admin', 'hd' => 'head divisi', 'direktur' => 'direktur'); echo form_dropdown('jabatan',$injabatan,'keuangan','class = "gui"'); ?></td>
                    <td class="error"><?php echo form_error('jabatan'); ?></td>
                </tr>

                 <tr>
                    <td></td>
                    <td><?php $insubmit=array('name' =>'login','class' =>'button','value' => 'Login'); echo form_submit($insubmit); echo nbs(); $inreset=array('name' =>'reset','class' =>'button','value' => 'Hapus'); echo form_reset($inreset); ?></td>
                    <td class="error"><?php echo form_error(); ?></td>
                </tr>
            </table>
            <?php echo form_close(); ?>

andフィールドを空白のままにしてログインをクリックすると、form_error()関数がecho何もしないのはなぜですか?usernamepassword

4

5 に答える 5

3

検証の問題を知っているクラスのログインメソッドではなく、クラスのインデックスメソッドで検証をチェックしているフォームで、ログインが失敗した場合にリダイレクトするci_login/loginメソッドにアクションを与え、フォームの検証をクリアしていますログイン方法のフィールドもすべてのエラーメッセージをセッションと表示に入れます。スクリプトにいくつかの変更を加えました。このリンクを参照してくださいコードが変更されました

この変更には、url ヘルパーを使用する必要があります

function index()
{
    $this->form_validation->set_rules('username','Username','trim|required|exact_length[4]|xss_clean');
    $this->form_validation->set_rules('password','Password','trim|required|min_length[4]|max_length[40]|xss_clean|callback_login');
    $this->form_validation->set_rules('jabatan','Jabatan','trim|required|xss_clean');

    if($this->form_validation->run() == false)
    {
        $this->load->view('login');
    }
    else
    {
        //to check if the validation run correctly
        //$this->load->view('welcome_message');

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

        $value = $this->m_login->login($username,$password,$jabatan);

        if($value)
        {
            redirect('welcome_message');
            //return true;
        }
        else
        {
            $this->form_validation->set_message('login', 'password salah');
            redirect('c_login',$login); //i want to pass $login into login form, then print
            return false;               //them as a form_error

        }
    }

}


<?php echo form_open(uri_string()); ?>
<table>
    <tr>
        <td>Username</td>
        <td><?php $inusername=array('name' => 'username', 'class' => 'GUI'); echo form_input($inusername); ?></td>
        <td class="error"><?php echo form_error('username'); ?></td>
    </tr>

    <tr>
        <td>Password</td>
        <td><?php $inpassword=array('name' => 'password', 'class' => 'GUI', 'type' =>'password'); echo form_input($inpassword); ?></td>
        <td class="error"><?php echo form_error('password'); echo $this->session->flashdata('login'); ?></td>
    </tr>

    <tr>
        <td>Jabatan</td>
        <td><?php $injabatan=array('keuangan' => 'keuangan', 'admin' => 'admin', 'hd' => 'head divisi', 'direktur' => 'direktur'); echo form_dropdown('jabatan',$injabatan,'keuangan','class = "gui"'); ?></td>
        <td class="error"><?php echo form_error('jabatan'); ?></td>
    </tr>

     <tr>
        <td></td>
        <td><?php $insubmit=array('name' =>'login','class' =>'button','value' => 'Login'); echo form_submit($insubmit); echo nbs(); $inreset=array('name' =>'reset','class' =>'button','value' => 'Hapus'); echo form_reset($inreset); ?></td>
        <td class="error"><?php echo form_error(); ?></td>
    </tr>
</table>
<?php echo form_close(); ?>
于 2012-10-11T05:46:05.263 に答える
3

indexの場合は実行されloginません。

set_rules()フォームを送信すると関数が実行されると思われる場合。彼らはしません。フォームは、コントローラー内の関数'c_login/login'であるに送信されます。login()c_login

login()フォーム検証ロジックをに移動する必要がありindex()、ビューを初めてエコーするだけです。

あなたのコントローラー

function index(){      
    $this->load->view('login');
}

function login(){
    $this->form_validation->set_rules('username','Username','trim|required|exact_length[4]|xss_clean');
    $this->form_validation->set_rules('password','Password','required|xss_clean|correct');
    $this->form_validation->set_rules('jabatan','Jabatan','trim|required|xss_clean');

    if($this->form_validation->run() == false){
        //your validation messages will be taken care of.
        $this->load->view('login');
    }
    else{
        $p = $this->input->post();
        if($this->m_login->login($p['username'],$p['password'],$p['jabatan'])){
            //redirect() user to logged in area.
        }
        else{
            $this->form_validation->set_message('login', 'password salah');
            $this->load->view('login');
        }
    }
}

また、パスワードをトリミングするべきではありません。スペース文字は、パスワードの完全に有効なサフィックスまたはプレフィックスです。私はtrimあなたのために削除しました。と も削除しましmin_lengthmax_length。これは、サインアップ ページで強制したいものですが、ログイン ページに本当に価値があると確信していますか?

于 2012-10-12T03:44:24.483 に答える
2

次のフィールドに form_error() を指定する必要があります。

<?php echo form_error('username'); ?>

詳細はこちら

于 2012-10-11T05:02:37.343 に答える
2

これらがどのように機能するかについて、あなたは大きな誤解をしているように見えます。まず、そのredirect()呼び出しは必要ありませんlogin()。関数はユーザーを別のredirect()ページにリダイレクトします。CodeIgniter も PHP もページ リクエスト間でオブジェクトを保持しないため、すべてが失われます (フォーム検証オブジェクトとそのエラー メッセージなど)。

また、そのlogin()メソッドの前にアンダースコア ( _) を付けて、誰も HTTP リクエスト経由でアクセスできないようにすることもできます。

おそらく、index()代わりにメソッドにフォームを送信する必要がありlogin()ます。POST次に、リクエストに対してのみ検証を実行するようにしてください。

function index()
{
    if ($_POST)
    {
        // run validation here
    }

    // ...
}
于 2012-10-11T05:22:23.103 に答える