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

Codeigniter3表单验证使用required规则与callback回调函数报错问题

问题原因

出现该问题的核心是表单验证规则存在语法错误、规则顺序错误、视图输出语法错误三个问题:

  • 控制器set_rules方法的规则参数语法错误:没有将完整的规则字符串用引号包裹,还在callback前多写了多余的单引号和空格,导致CodeIgniter无法正确解析验证规则,你自定义的必填错误信息也没有生效,才会输出默认的英文必填提示
  • 验证规则顺序错误:trim规则放在了所有验证规则的末尾,会导致先验证内容的规则执行完再修剪空格,如果用户输入的内容前后带空格,会出现前面的规则验证通过,修剪后内容为空的异常
  • 视图输入框的value属性输出存在语法错误,可能导致编辑页加载时原有手机号没有正确填充到输入框,提交时空值触发必填校验

修复步骤

1. 修正控制器的表单验证规则

将规则字符串调整为正确的语法,同时把trim、xss_clean这类数据预处理规则放在最前面,再依次写验证规则:

$this->form_validation->set_rules(
    'volasoccel', 
    'Celular',
    'trim|xss_clean|required|numeric|callback_volasoccel_check[tvolasoc.TVOLASOC_CEL]',
    array('required' => 'Debe ingresar el Celular')
);

2. 修正视图输入框语法

修正value属性的输出逻辑,正确输出原有手机号,同时如果不需要HTML5原生的必填校验可以删除原生required属性,避免和CI的验证冲突:

<?php echo form_error('volasoccel' ); ?>
<input value="<?php echo $volasoc[0]->Celular; ?>" type="text" name="volasoccel" class="form-control" id="volasoccel" placeholder="Celular">

3. 可选:修正回调函数逻辑

如果修改完上述代码仍然存在异常,检查volasoccel_check回调函数,编辑场景下校验手机号是否重复时,需要排除当前正在编辑的那条数据的ID,不然会把当前数据本身的手机号判定为重复,参考写法:

public function volasoccel_check($cel, $table_field)
{
    list($table, $field) = explode('.', $table_field);
    // 编辑页需要新增隐藏域存储当前编辑数据的ID
    $edit_id = $this->input->post('edit_id');
    $this->db->where($field, $cel);
    if($edit_id){
        // 排除当前正在编辑的数据
        $this->db->where('id !=', $edit_id);
    }
    $count = $this->db->count_all_results($table);
    if($count > 0){
        $this->form_validation->set_message('volasoccel_check', '该手机号已被使用');
        return FALSE;
    }
    return TRUE;
}

内容的提问来源于stack exchange,提问作者mcarruitero

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 01:18:03