【问题标题】:HTML form fields - validate OR allow blankHTML 表单字段 - 验证或允许空白
【发布时间】:2016-10-26 14:15:01
【问题描述】:

我有一个使用 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 函数已执行。但是字段是空的?? !非常感谢您对此的帮助!

【问题讨论】:

  • 为什么加了$llink = $_POST['llink'];而不加$ltitle= $_POST['ltitle'];?您的回调函数似乎在检查 $ltitle 时会按预期工作,但在检查 $llink 时不会。
  • 更改此if( !empty($_POST['ltitle']) && !empty($_POST['ltitle']) )
  • 我改变了 check_link: "function check_link(){ $ltitle = $_POST['ltitle']; $llink = $_POST['ltitle']; if( (empty($ltitle) && !empty($llink) ) || (!empty($ltitle) && empty($llink) ) { $this->form_validation->set_message('check_link', '正确填写链接字段'); return false; } else { return true; } } " 现在允许提交空白。但是当只填写一个字段时它不会抛出错误?

标签: php html forms codeigniter


【解决方案1】:

可能是导致问题的几个因素。首先,我不会有条件地制定规则。其次,因为验证回调将运行两次,每个字段一次,在控制器中设置消息。否则它可能会被设置两次,这是不需要的额外处理。

改变这个

 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']));
}

【讨论】:

    【解决方案2】:

    在代码点火器中 $_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) 有效并检查链接的有效性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-17
      • 1970-01-01
      相关资源
      最近更新 更多