Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/240.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Codeigniter使用验证回调更改提交的值_Php_Forms_Codeigniter_Callback - Fatal编程技术网

Php Codeigniter使用验证回调更改提交的值

Php Codeigniter使用验证回调更改提交的值,php,forms,codeigniter,callback,Php,Forms,Codeigniter,Callback,我有一个用户提交CSV的文本输入,例如红色、蓝色、红色、黄色 如果用户提交重复的值,例如如上所示的red,我想删除重复值。我开始回电话,但我不知道如何完成 //callback rule function _remove_dublicate($str) { $val = strtolower($str); //make everything lowercase $colors = str_getcsv($val); //c

我有一个用户提交CSV的文本输入,例如红色、蓝色、红色、黄色

如果用户提交重复的值,例如如上所示的
red
,我想删除重复值。我开始回电话,但我不知道如何完成

    //callback rule
    function _remove_dublicate($str) 
    {
            $val = strtolower($str); //make everything lowercase
            $colors = str_getcsv($val); //create array                          
            $result = array_unique($colors); //remove duplicates

    }
如果存在重复项,我应该如何将
$result
中的新字符串提交到数据库

下面是我的表单验证

$this->form_validation->set_rules('colors', 'Colors', 'trim|required|xss_clean|regex_match[/^[a-z, ]+$/i]|callback__remove_dublicate');


        if ($this->form_validation->run() == FALSE) //if validation rules fail
        {           
            $this->load->view('edit/form');
        }
        else //success
        {
            $data = array (
                'colors' => $this->input->post('colors')
            );          
            $this->My_model->colors_update($data);          
        }
编辑

根据卡巴莱的建议,我在
else
声明中添加了这一点,以删除副本

$colors = str_getcsv($this->input->post('colors')); //create array
$result = array_unique($colors); //remove duplicates
$comma_separated = implode(",", $result); //add back CSV string

$data = array (
    'colors' => $comma_separated
);          

就我个人而言,这似乎是可行的,我会在表单验证通过后,取出回调方法并处理这个问题。我认为没有办法从回调返回结果数组。至少《用户指南》没有对此做出任何规定。我认为,表单验证库的回调只能返回
true
false

我只需要将一个函数调用放入
else
中,检查重复项,并在将数据插入数据库之前始终在那里运行它


也许有更多CI专业知识的人知道更好的方法,但我会这样做。

尽管有评论,这是使用回调的一个非常有效的理由,类似于“准备”规则,它实际上改变了提交的输入的值(例如:trim、xss_clean、strtolower)

您的方法是正确的,您所要做的就是在回调中
返回$result
,它将改变输入,但请确保返回字符串。例如:

//callback rule
function _remove_duplicate($str = '') 
{
    $val = strtolower($str); //make everything lowercase
    $colors = str_getcsv($val); //create array 
    // you could also use explode(',', $colors)
    // if you aren't expecting other delimiters than a comma
    // i.e. no commas within quotes                         
    $result = array_unique($colors); //remove duplicates
    $result = implode(',', $result); // back to string value
    return $result; // Return the value to alter the input
}
现在,如果您想警告用户存在重复项,而不是简单地删除它们,只要
返回FALSE
如果发现任何重复项,可以使用
count($colors)==count($result)
,而
$result
仍然是一个数组。这取决于您,但只是让您知道返回真/假或更改输入的选项是可用的

实际上,您可以在form_validation类本身(扩展库,甚至只是一个全局函数)内将这样的内容写入一个新的表单验证规则,而不需要使用回调,这似乎是一个非常可重用的函数

这被视为“准备”规则。从:

除了上面使用的验证功能外,您还可以通过各种方式准备数据。例如,您可以设置如下规则:

在上面的示例中,我们正在“修剪”字段,将密码转换为MD5,并通过“xss_clean”函数运行用户名,该函数将删除恶意数据

任何接受一个参数的本机PHP函数都可以作为规则使用,如htmlspecialchars、trim、MD5等

注意:您通常希望在验证规则之后使用prepping函数,因此如果出现错误,原始数据将显示在表单中

因此,在检查输入是否有效后,可以继续清理、修剪、删除逗号分隔字符串中的重复项,或者执行任何需要的操作。任何全局可用的函数都是有效的(包括非本机PHP函数,例如:任何CI的帮助函数,只要它们已加载和定义。),以及任何属于Form_验证库或其任何扩展的函数

需要注意的一点是:如果函数不存在或不可用,它将被默默忽略。始终进行测试以确保得到正确的结果


希望这能消除一些困惑。

+1。我同意。验证回调不适合这样做。如果我们想显示关于重复问题的错误消息,那么回调是合适的,但是如果它本身不是验证,那么它应该在..好的建议之后发生。我用答案编辑了我的问题。您喜欢吗?回调可以返回真/假或返回值。谢谢。当我写《一个拥有更多CI专业知识的人》时,我想到了你和其他人用户指南中有记录吗?我只是看了看,发现只有一行,但没有一个例子。当您返回$result时,它会去哪里?令人困惑请参见上的示例。例如,其中之一是
md5
,它将md5字符串。了解他们如何建议在返回true/false的验证规则之后才运行更改输入的函数,以便在重新填充表单时显示原始数据。使用类似于
url\u title()
的规则也是一个完美的例子。基本上,任何返回字符串的函数都会改变input.Hmm的值。仍然很困惑,;我明天会检查一下,因为现在是凌晨4点,我现在可能太累了。谢谢你教我新东西;)@韦斯利·默奇:我为你的回答鼓掌!我认为我们都学到了一些有价值的东西。在我的验证规则中,我在末尾添加了
callback\u\u remove\u dubplicates
。我只有一个问题。在回调函数中,为什么使用
$str='
?只是
$str
似乎也能起作用。再次感谢@网络瘾君子:这是我的偏执狂,我总是用PHP提供默认参数,所以如果它丢失,就不会抛出通知。这可能是一个坏习惯,因为有时您希望收到错误通知。仅供参考,我认为你的函数太有用了,不能只是一个回调函数——我建议你把它写在其他控制器(比如在助手中)可以使用的地方,然后你可以使用
$this->form_validation->set_rules('colors'、'colors'、'required | remove_duplicates')或类似的东西。
$this->form_validation->set_rules('username', 'Username', 'trim|required|min_length[5]|max_length[12]|xss_clean');
$this->form_validation->set_rules('password', 'Password', 'trim|required|matches[passconf]|md5');
$this->form_validation->set_rules('passconf', 'Password Confirmation', 'trim|required');
$this->form_validation->set_rules('email', 'Email', 'trim|required|valid_email');