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

AJAX请求未POST数据:CodeIgniter字段验证无响应问题

问题分析与解决方案

嘿,我一眼就瞅到问题的核心了,咱们一步步把它搞定:

1. 最致命的错误:CodeIgniter验证错误字段名完全不匹配

你看你的appointment_validation函数里,所有form_error()的参数都写错了!比如你明明给respondee_name设置了验证规则,但你却调用form_error('respondee_gender')——这根本不是同一个字段,自然返回空字符串。所有form_error()的参数必须和set_rules()里的第一个参数严格对应。

修正后的CodeIgniter函数:

function appointment_validation(){ 
    // 设置验证规则
    $this->form_validation->set_rules('respondee_name', 'Naam', 'required'); 
    $this->form_validation->set_rules('respondee_email', 'E-mailadres', 'trim|required|valid_email'); 
    $this->form_validation->set_rules('respondee_phone', 'Telefoonnummer', 'required'); 
    $this->form_validation->set_rules('respondee_date', 'Datum', 'required'); 
    $this->form_validation->set_rules('respondee_time', 'Tijd', 'required'); 
    $this->form_validation->set_rules('respondee_appointment', 'Hoe', 'required'); 

    // 执行验证
    if ($this->form_validation->run() == FALSE){ 
        // 验证失败,返回正确的错误信息
        $vals = [ 
            'error' => true, 
            'respondee_name_error' => form_error('respondee_name'), 
            'respondee_email_error' => form_error('respondee_email'), 
            'respondee_phone_error' => form_error('respondee_phone'), 
            'respondee_date_error' => form_error('respondee_date'), 
            'respondee_time_error' => form_error('respondee_time'), 
            'respondee_appointment_error' => form_error('respondee_appointment') 
        ]; 
        echo json_encode($vals); 
    } else {
        // 验证通过的情况也要返回内容,不然AJAX会拿到空
        echo json_encode(['error' => false]);
    }
}

注意:我还加了验证通过时的返回内容,不然当所有字段都正确时,你的AJAX会收到空字符串,正好符合你之前遇到的情况。

2. 别忘了CodeIgniter的CSRF保护(大概率踩这个坑)

如果你的CodeIgniter开启了CSRF保护(默认是开启的),AJAX请求必须带上CSRF令牌,否则请求会被拦截,自然拿不到数据。

解决方法:

首先在你的视图页面里,输出CSRF令牌:

<!-- 在表单里隐藏输出CSRF令牌 -->
<input type="hidden" name="<?php echo $this->security->get_csrf_token_name(); ?>" value="<?php echo $this->security->get_csrf_hash(); ?>">

然后在AJAX的data里加上这个令牌:

$('#appointment_form_submit').click(function(e){ 
    e.preventDefault(); 
    // 获取CSRF令牌
    let csrfName = $('[name="<?php echo $this->security->get_csrf_token_name(); ?>"]').attr('name');
    let csrfHash = $('[name="<?php echo $this->security->get_csrf_token_name(); ?>"]').val();

    $.ajax({ 
        url: '/afspraken/appointment_validation', // 建议加上斜杠,避免相对路径问题
        type: 'POST', 
        data: { 
            [csrfName]: csrfHash, // 带上CSRF令牌
            respondee_name: $('#InputName').val(), 
            respondee_email: $('#InputEmail').val(), 
            respondee_phone: $('#InputTel').val(), 
            respondee_date: $('#startDate').val(), 
            respondee_time: $('#select_timestamp').val(), 
            respondee_appointment: $('#select_appointment').val() 
        }, 
        dataType: 'json', // 加上这个,告诉jQuery预期返回JSON,不用手动JSON.parse
        success: function(data) { 
            if(!data.error){ 
                console.log('no errors'); 
            } else { 
                console.log(data); 
                $('#errors_display_respondee_name').html(data.respondee_name_error); 
                $('#errors_display_respondee_email').html(data.respondee_email_error); 
                $('#errors_display_respondee_phone').html(data.respondee_phone_error); 
                $('#errors_display_respondee_date').html(data.respondee_date_error); 
                $('#errors_display_respondee_time').html(data.respondee_time_error); 
                $('#errors_display_respondee_appointment').html(data.respondee_appointment_error); 
            } 
        }, 
        error: function(XMLHttpRequest, textStatus, errorThrown) { 
            console.log(XMLHttpRequest.responseText); 
            console.log(textStatus); 
            console.log(errorThrown); 
        } 
    }); 
    return false; 
});

我还加了dataType: 'json',这样jQuery会自动把返回的JSON转成对象,不用你再手动JSON.parse(data)了。

3. 额外检查:URL路径是否正确

确保你的URL是正确的,比如如果你的控制器是Afspraken.php(首字母大写),那URL应该是/afspraken/appointment_validation(CodeIgniter会自动处理大小写),如果你的项目放在子目录里,要加上子目录路径,比如/your-project/afspraken/appointment_validation。

最后测试步骤

  1. 把修正后的代码替换进去
  2. 打开浏览器控制台,查看AJAX请求的参数是否正确发送(Network标签里看Form Data)
  3. 查看返回的JSON是否包含正确的错误信息

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 20:47:31