Php Codeigniter使用验证回调更改提交的值
我有一个用户提交CSV的文本输入,例如红色、蓝色、红色、黄色 如果用户提交重复的值,例如如上所示的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
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');