我有一个用户提交CSV的文字输入,例如red, blue, red, yellow
如果用户提交了实例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);
}
修改
根据Cabaret的建议,我在else
声明中添加了这个以删除dublicates
$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
);
似乎有效
答案 0 :(得分:7)
尽管有评论,但这是使用回调的完全正当理由,类似于实际更改提交输入值的“准备”规则(例如:trim,xss_clean,strtolower)。
你走在正确的轨道上,你所要做的就是在你的回调中return $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
}
现在,如果您想警告用户存在重复项而不是简单地删除它们,只需return FALSE
(如果找到),可能使用count($colors) === count($result)
而$result
仍然是数组。这取决于你,但只是你知道返回true / false的选项或改变输入是可用的。
你实际上可以将这样的东西写入Form_validation类本身的新表单验证规则(扩展库,甚至只是一个全局函数)而不需要使用回调,它似乎是一个非常可重用的函数
这被视为“准备”规则。来自User Guide:
除了我们上面使用的验证功能外,您还可以通过各种方式准备数据。例如,您可以设置如下规则:
$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');
在上面的示例中,我们正在“修剪”字段,将密码转换为MD5,并通过“xss_clean”函数运行用户名,该函数会删除恶意数据。
任何接受一个参数的本机PHP函数都可以用作规则,如htmlspecialchars,trim,MD5等。
注意:您通常希望在验证规则之后使用预备功能,因此如果出现错误,原始数据将显示在表单中。
因此,在您检查输入有效后,您可以继续清理,修剪,删除逗号分隔字符串中的重复项或任何您想要的内容。任何全局可用的函数都是有效的(包括非本机PHP函数,例如:CI的任何辅助函数,只要它们被加载和定义。),以及属于Form_validation库或其任何扩展的任何函数。你可能有。
要注意的一件事:如果该功能不存在或不可用,它将被静默忽略。始终进行测试以确保您获得正确的结果。
希望这可以解决一些困惑。
答案 1 :(得分:2)
就个人而言,在表单验证通过后,我会将回调方法取出并稍后处理。我认为没有办法从回调中返回结果数组。至少用户指南未指定任何内容。表单验证库的回调仅用于返回true
或false
,我认为。
我只是将一个函数调用检查重复项到else
并在将数据插入数据库之前始终在那里运行。
也许拥有更多CI专业知识的人知道更好的方法,但我就是这样做的。