HTML表单字段 - 验证或允许空白

时间:2016-10-26 14:15:02

标签: php html forms codeigniter

我有一个使用CodeigniterPHP创建的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功能。但这些领域是空的? !非常感谢这方面的帮助!

2 个答案:

答案 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 )有效并检查链接有效性。