【问题标题】:codeigniter/Pyro: making sure one of three fields is validcodeigniter/Pyro:确保三个字段之一有效
【发布时间】:2011-03-05 02:10:52
【问题描述】:

我有三个电话字段(work_phone、home_phone 和 cell_phone)。我想确保用户至少填写其中一项。这是我迄今为止的验证。

array(
    'field' => 'work_phone',
    'label' => 'lang:employee.work_phone',
    'rules' => 'max_length[10]|numeric|callback_check_phones[work_phone]'
    ),
array(
    'field' => 'home_phone',
    'label' => 'lang:employee.home_phone',
    'rules' => 'max_length[10]|numeric|callback_check_phones[home_phone]'
    ),
array(
    'field' => 'cell_phone',
    'label' => 'lang:employee.cell_phone',
    'rules' => 'max_length[10]|numeric|callback_check_phones[cell_phone]'
    ),

function check_phones($value,$name) {
    if((!isset($_POST[$name]))) {
        $this->form_validation->set_message('check_phones', 
            'You must enter at least one phone number');
        return FALSE;
    }
    else
    {
        return TRUE;
    }
}

问题在于它使所有电话字段都成为必需的。如果我尝试if((!isset($_POST[work_phone])) ||(!isset($_POST[home_phone])) ){,则不会返回错误。 检查三个字段之一是否不为空的最佳方法是什么?

编辑 我通过使用empty() 而不是isset()&& 而不是|| 来实现这个功能,我知道有

function check_phones($value){
    if((empty($_POST['work_phone'])) && (empty($_POST['home_phone'])) && (empty($_POST['cell_phone']))){
        $this->form_validation->set_message('check_phones', 'You must enter at least one phone number');
        return FALSE;
    }
    else
    {
        return TRUE;
    }

}

有效但返回错误三次

【问题讨论】:

  • 为什么不使用 CI 输入类?
  • @Peter,我实际上正在使用 PyroCMS,这是我第一次使用 CI。你能详细说明一下吗?
  • Codeigniter 有一个内置类来帮助 $_POST 的整体使用和安全性。你可以在这里阅读...codeigniter.com/user_guide/libraries/input.html
  • 好的,只需在其中一个电话元素上回调验证函数即可。无需调用 3 次。
  • @Peter,没有一个答案以我解决问题的方式回答问题。回答我自己的问题并将其标记为解决方案,我也觉得不对。

标签: php validation codeigniter


【解决方案1】:

只需将您的 !isset 语句更改为 isset:

if(isset($_POST['phone1') || isset($_POST['phone2']) || isset($_POST['phone3'])){
   //at least 1 is filled.
}else{
   //fail
}

【讨论】:

  • 这是否是说如果该字段设置为返回 false 并显示错误?
  • 这表示如果至少设置了一个字段,则通过您的验证要求,为清晰起见进行了编辑
  • :) 希望对您有所帮助 :) 如果您有任何其他问题,请说出来
  • 在这一点上,他们处理验证的方式似乎更像是一个 CI 问题。 (见编辑)
【解决方案2】:

如何使用 CI 输入类... $this->input->post 如果为空,则返回 false


if($this->input->post('work_phone') || $this->input->post('home_phone') || $this->input->post('cell_phone'))
    {
        echo "We have your phone!";
    }
    else
    {
        echo "Please enter at least one!";
    }

CI 验证更新...

如果他们没有填写任何电话字段,您可以为第一个字段添加验证。就这样……


if($_SERVER['REQUEST_METHOD'] == "POST")
{
    if($this->input->post('work_phone') || $this->input->post('home_phone') || $this->input->post('cell_phone'))
    {
        echo "At least one is in there";
    }
    else
    {
        $this->form_validation->set_rules('work_phone', '1 Phone', 'required');
//      echo "Please enter at least one!";
    }
}

【讨论】:

  • 看来这个方法也行得通,或者我用empty()而不是isset它和$_POST[work_phone]一起工作我只显示同样的错误3次。
【解决方案3】:

答案是使用empty() 而不是isset() 见上文。

【讨论】:

    猜你喜欢
    • 2012-12-09
    • 2017-10-28
    • 1970-01-01
    • 2016-02-20
    • 2019-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多