模型中的Codeigniter表单验证

o8x7eapl  于 7个月前  发布在  其他
关注(0)|答案(4)|浏览(52)

大家好,这是我的第一个CI项目。
我的模型中有一个简单的表单验证函数。

function verify_login()
{

    //This method will have the credentials validation
    $this->load->library('form_validation');

    $this->form_validation->set_rules('username', 'Username', 'trim|required|xss_clean');
    $this->form_validation->set_rules('password', 'Password', 'trim|required|xss_clean|callback_check_database');

    var_dump($this->form_validation->run());
    die;
    if ($this->form_validation->run() == FALSE) {
        //Field validation failed.  User redirected to login page
        $this->load->view('login_view');
    } else {
        //Go to private area
        redirect('home', 'refresh');
    }
}

字符串
当我尝试将变量从控制器传递到模型中的函数时,变量会被接收到,但不会被处理。
有人能给我点启发吗?谢谢。

ztigrdn8

ztigrdn81#

在模型中进行表单验证是很好的。但是您希望验证返回True或False到控制器。而不是调用视图。

// in your Model lets call it Users
function verify_login()
{    
    $this->load->library('form_validation');

    $this->form_validation->set_rules('username', 'Username', 'trim|required|xss_clean');
    $this->form_validation->set_rules('password', 'Password', 'trim|required|xss_clean|callback_check_database');

    if ($this->form_validation->run() == FALSE) {
       return FALSE ; 
    } else {
       return TRUE; 
    }
}

// Your callback function 

 // in Controller 
function verify(){

if( $this->users->verify_login() == FALSE ){  
// $this->errormessage will be available in any view that is called from this controller
$this-errormessage = "There was an error with your Log In. Please try again." ; 
$this->showLogin() ; } 

else { 
// set a session so you can confirm they are logged in on other pages
$this->setLoginSession($this->input->post('username', TRUE)) ; 
$this->showUserHome(); } 
}

字符串
另一件需要考虑的事情是--通常人们知道他们的用户名,但是却把密码搞混了。所以如果你分别检查他们,你可以相应地调整错误消息。如果你检查用户名,但是没有结果--你不需要检查密码,你可以在错误消息中告诉他们没有这个名字的用户。

lo8azlld

lo8azlld2#

我对你最大的建议是不要在你的模型中做这样的验证,如果你在你的模型中验证,它需要直接针对数据库值而不是表单。
请让我知道,如果这解决了你的问题,如果没有,请评论,我会编辑我的答案。
更新:请忽略上面的一些,因为我是脱离理论而不是事实:)
我必须深入研究CI核心,才能很好地了解这是什么问题。您的代码本身看起来还不错。我唯一能看到的是,您的回调可能不存在于您的模型中,而只存在于您的控制器中。与下面的观点相呼应,我不认为这是对模型的良好使用。
关于验证的文档

aemubtdh

aemubtdh3#

class Data_model extends CI_Model
{
public function rules()
    {
        return [
            ['field' => 'pertanyaan',
            'label' => 'pertanyaan',
            'rules' => 'required|is_unique[data.pertanyaan]'],

            ['field' => 'jawaban',
            'label' => 'jawaban',
            'rules' => 'required']
        ];
    }
}

class Datas extends CI_Controller
{
public function add()
    {
        $data = $this->data_model;
        $validation = $this->form_validation;
        $validation->set_rules($data->rules());
        if ($validation->run()) {
            $data->save();
            $this->session->set_flashdata('success', 'Berhasil disimpan');
        }

        $this->load->view("admin/data/new_form");
    }
}

字符串

ymzxtsji

ymzxtsji4#

如果你想在你的模型中使用Codeigniter的表单验证库,并想使用回调;请按照以下步骤操作:
1.首先,你必须通过数组分隔规则。
1.而且比你可以使用匿名函数的伎俩。
示例如下:

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

class My_model extends CI_Model {

        public function check_database($var){
           return $var;
        }    
        
        public function verify_login()
        {
        
            //This method will have the credentials validation
            $this->load->library('form_validation');
        
            $this->form_validation->set_rules('username', 'Username', 'trim|required|xss_clean');
        
        
        
        
        //edit your rule as below
        $this->form_validation->set_rules('password', 'Password', array('trim','required','xss_clean',array('check_database','callback_check_database')));
        
        //and we must show custom error for our custom function check trick
        $this->form_validation->set_message('check_database', 'This is a custom error for {field}!');
    
    //That's all folks :)
        
        
        
        
        
            var_dump($this->form_validation->run());
            die;
            if ($this->form_validation->run() == FALSE) {
                //Field validation failed.  User redirected to login page
                $this->load->view('login_view');
            } else {
                //Go to private area
                redirect('home', 'refresh');
            }
        }

字符串

相关问题