我有一个使用Codeigniter
和PHP
创建的HTML表单,我正在尝试在2个字段上设置验证。这些字段可以留空,但如果填充了一个而不是另一个,则应生成错误。字段是:
-ltitle []
-llink [] //array of multiple links corresponding to ltitle[]
我正在尝试仅在填充其中一个字段时实施验证。
if( !empty($_POST['ltitle']) || !empty($_POST['llink']) )
{
$this->form_validation->set_rules('ltitle[]', 'ltitle', 'xss_clean|callback_check_link');
$this->form_validation->set_rules('llink[]', 'llink', 'xss_clean|callback_check_link');
}
check_link功能:
function check_link($ltitle){
$llink = $_POST['llink'];
if(empty($ltitle) && empty($llink) )
{
return true;
}
elseif( (empty($ltitle) && !empty($llink) ) || (!empty($ltitle) && empty($llink) ) )
{
$this->form_validation->set_message('check_link', 'Complete the link fields correctly');
return false;
}
else
{
return true;
}
}
在提交表单并且两个字段都空白的时刻,错误消息显示'正确填写链接字段',表示已执行check_link功能。但这些领域是空的? !非常感谢这方面的帮助!
答案 0 :(得分:0)
可能是导致问题的几个因素。首先,我不会有条件地设定规则。其次,因为验证回调将运行两次,每个字段一次,在控制器中设置消息。否则它可能被设置两次,这是不需要的额外处理。
更改此
if( !empty($_POST['ltitle']) || !empty($_POST['ltitle']) )
{
$this->form_validation->set_rules('ltitle[]', 'ltitle', 'xss_clean|callback_check_link');
$this->form_validation->set_rules('llink[]', 'llink', 'xss_clean|callback_check_link');
}
到这个
$this->form_validation->set_rules('ltitle[]', 'ltitle', 'xss_clean|callback_check_link');
$this->form_validation->set_rules('llink[]', 'llink', 'xss_clean|callback_check_link');
$this->form_validation->set_message('check_link', 'Complete the link fields correctly');
每个字段使用相同的回调,这意味着传递的参数是要检查的字段的值。您检索$_POST['llink']
但在一种情况下这将是传递的参数。您应该显式检索它们并忽略该参数。此外,逻辑可以大大简化。
function check_link($ltitle)
{
//use trim() to make sure the value isn't a string of one (or more) space characters
$is_llink = !empty(trim($_POST['llink']));
$is_ltitle = !empty(trim($_POST['ltitle']));
return ($is_llink && $is_ltitle) || (!$is_llink && !$is_ltitle);
}
编辑1
实际上回调中的最后一行可以更简单。
更改
return ($is_llink && $is_ltitle) || (!$is_llink && !$is_ltitle);
到
return $is_llink === $is_ltitle;
编辑2
更简单。不要为这两个字段设置规则。这消除了获取两个$_POST
项的需要,因为一个项被传递给回调。
在控制器中
$this->form_validation->set_rules('ltitle[]', 'ltitle', 'xss_clean|callback_check_link');
$this->form_validation->set_message('check_link', 'Complete the link fields correctly');
然后回调变为
function check_link($ltitle)
{
return empty(trim($ltitle)) === empty(trim($_POST['llink']));
}
答案 1 :(得分:0)
代码点火器$ _POST [“”] = $ this-> input-> post(“”)
//Set the values not to null, but to an empty variable
$llink = "";
$ltitle = "";
if ( $this->input->post("ltitle") = $ltitle AND $this->input->post("llink ") = $llink )
//If the inputs have an empty value
{
}
//Make sure they are both set, and populated
else if ( !empty($this->input->post("ltitle")) AND !empty($this->input->post("llink "))
//If they are both set, then check their values
{
//Title doesn't need a link check i think
$this->form_validation->set_rules('ltitle[]', 'ltitle', 'xss_clean');
$this->form_validation->set_rules('llink[]', 'llink', 'xss_clean|callback_check_link');
//Run the validation procces
if ($this->form_validation->run() == FALSE)
{
$this->form_validation->set_message('check_link', 'Complete the link fields correctly');
}
else
{
$this->load->view('formsuccess');
}
}
并确保您的回调( callback_check_link )有效并检查链接有效性。