Codeigniter回调失败

时间:2010-11-06 22:29:58

标签: php codeigniter callback

有人能看到我错过的东西吗?

我正在使用Codeigniter v1.72。

在doc:

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

它声明:

$ 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;
        }
    }

在我的班级用户扩展控制器

我有函数寄存器:

$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');

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


    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
                return TRUE;
    }

根本没有错误,我的方法都不起作用,代码的行为就像它不存在一样。

1 个答案:

答案 0 :(得分:3)

首先,我假设你的其余代码是正确的。显示整个User类可能会有所帮助。

您可能想要检查CodeIgniter是否允许您在同一规则中调用回调函数和准备/验证程序函数。如果不允许,您可以在回调函数中调用trimrequirexss_clean

我会说,如果允许,那么这绝对是 RIGHT 形式:

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

错误

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

这也是错误

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

请注意,在该行中,您实际上不应该 CALLING 该函数。相反,您将一个字符串传递给它将解析的set_rules()函数,并找出您想要用作回调的函数。

正如文档所述,无论username的值是什么,都将作为参数传递给回调函数。

修改

我打算说试试这个:

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

但我认为它不会起作用。相反,这应该工作:

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;
        }
}