You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义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');
}

问题分析

  1. 仅检查字段是否存在,未验证字段值是否有效(比如空数组也会被判定为存在);
  2. 最后设置的验证规则针对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 20:25:08