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。
最后测试步骤
- 把修正后的代码替换进去
- 打开浏览器控制台,查看AJAX请求的参数是否正确发送(Network标签里看Form Data)
- 查看返回的JSON是否包含正确的错误信息
内容的提问来源于stack exchange,提问作者hixlax
相关产品推荐
相关产品推荐

