自定义CodeIgniter验证规则:校验表单是否含指定year前缀字段
CodeIgniter表单验证:确保至少提交一个年份字段
需求说明:需要创建表单验证规则,保证提交的表单数据中包含year0、year1、year2、year3、year4、year5中的至少一个字段,且该字段需有有效数值。以下是验证通过的提交数据示例:
Array ( [name] => Test Submission [year1] => Array ( [0] => 1281 ) [year3] => Array ( [0] => 1345 ) )
现有代码无法正常运行,代码如下:
$yearPost = ['year0', 'year1', 'year2', 'year3', 'year4', 'year5']; $multiYears = false; foreach ($yearPost as $field) { if (array_key_exists($field, $this->input->post())) { $multiYears = true; break; } } if ($multiYears === false) { $this->form_validation->set_rules('year', 'Year', 'required|numeric'); }
问题分析
- 仅检查字段是否存在,未验证字段值是否有效(比如空数组也会被判定为存在);
- 最后设置的验证规则针对
year字段,与实际需要验证的yearX字段不匹配,无法触发正确的验证提示。
解决方案
推荐使用CodeIgniter的回调验证函数,更符合框架验证流程:
// 设置验证规则,绑定到任意一个year字段即可 $this->form_validation->set_rules('year0', '年份', 'callback_check_at_least_one_year'); // 自定义回调验证函数 public function check_at_least_one_year() { $yearFields = ['year0', 'year1', 'year2', 'year3', 'year4', 'year5']; foreach ($yearFields as $field) { $value = $this->input->post($field); // 验证字段存在、是数组格式且包含有效数值 if (isset($value) && is_array($value) && !empty($value[0]) && is_numeric($value[0])) { return true; } } // 验证不通过时设置错误提示 $this->form_validation->set_message('check_at_least_one_year', '请至少填写一个有效的年份'); return false; }
关键要点
- 同时校验字段存在性和值的有效性,避免空提交或无效值通过验证;
- 回调函数可以统一处理所有
yearX字段的校验逻辑; - 错误提示明确告知用户需填写至少一个有效年份。
内容的提问来源于stack exchange,提问作者Jake
相关产品推荐
相关产品推荐

