开发者

Codeigniter callback failure

开发者 https://www.devze.com 2023-01-23 16:06 出处:网络
Can anyone see what I\'m missing? I\'m using Codeigniter v1.72. In the doc: http://codeigniter.com/user_guide/libraries/form_validation.html

Can anyone see what I'm missing?

I'm using Codeigniter v1.72.

In the doc:

http://codeigniter.com/user_guide/libraries/form_validation.html

It states:

$this->form_validation->set_rules('username', 'Username', 'callback_username_check');

function username_check($str)
    {
        if ($str == 'test')
        {
            $this->form_validation->set_message('username_check', 'The %s field can not be the word "test"');
            return FALSE;
        }
        else
        {
            return TRUE;
        }
    }

In my class User extends Controller

I have in function register:

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

I have also tried 

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

And

$this->form_validation->set_rules('username', 'Username', 'trim|required|xss_clean', 'callback_username_check['.$username.']');


    function username_check($str)
    {
            $this->load->model('Use开发者_Python百科r_model', '', TRUE);
            $taken = $this->User_model->countUsername($str);

            if($taken)
            {
                $this->form_validation->set_message('username_check', 'That username is already taken');
                return FALSE;
            }
            else
                return TRUE;
    }

There are no errors at all, none of my approaches work, the code behaves like it's not there.


First of all, I'm assuming the rest of your code is correct. It might help to show the whole User class.

You might want to check if CodeIgniter lets you invoke callback functions AND prepping/validator functions in the same rule. If it doesn't allow that, you could call trim, require, and xss_clean in your callback function.

I will say, though, that if it is allowed, then this is definitely the RIGHT form:

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

This is wrong:

$this->form_validation->set_rules('username', 'Username', 'trim|required|xss_clean', 'callback_username_check['.$username.']');

And this is wrong too:

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

See, in that line, you shouldn't actually be CALLING the function. Rather, you're passing a string to the set_rules() function that it will parse and figure out what function you want to use as a callback.

As the documentation states, whatever the value of username is, will be passed as the argument to your callback function.

EDIT:

I was going to say try this:

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

But I don't think it will work. Instead, this should work:

function username_check($str)
    {
        $this->load->model('User_model', '', TRUE);
        $taken = $this->User_model->countUsername($str);

        if($taken)
        {
            $this->form_validation->set_message('username_check', 'That username is already taken');
            return FALSE;
        }
        else if(!$str) {
            // This is functioning as the required rule
            return FALSE;
        }
        else {
            $str = trim($str);
            $str = $this->input->xss_clean($str);
            return $str;
        }
}
0

精彩评论

暂无评论...
验证码 换一张
取 消