Ajax删除请求返回200却触发Error,JSON响应含多余ID求助
问题解决:Ajax返回200却触发error回调,响应前附加用户ID
核心问题分析
从控制台日志xhr.responseText = 49{"success":true}可以明确:后端在输出JSON响应前,意外输出了要删除的用户ID(49),导致返回的内容不是合法JSON,jQuery的dataType: 'json'解析失败,因此触发error回调,哪怕HTTP状态码是200。
前端按钮的渲染逻辑(不管是PHP formatter还是JS重写)只是获取ID并发起请求,不会导致后端响应附加ID,问题完全出在后端代码的输出环节。
解决方案步骤
1. 排查后端所有可能的意外输出
检查remove_user.php以及它引入的所有依赖文件(比如初始化$c_eta的类文件、配置文件等),重点找以下场景:
- 是否在
echo json_encode($form_data);之前,存在echo $_POST['id'];、print($id);这类主动输出ID的代码 - 检查
$c_eta->_get_user_info()或$c_eta->_remove_user()方法内部,是否有调试用的var_dump()、echo语句 - 检查PHP文件的开头/结尾,是否有
<?php标签外的空格、换行、注释(这些也会被当作输出内容)
2. 强制清空输出缓冲区(临时快速修复)
如果暂时找不到输出源,可以在remove_user.php最顶部添加缓冲区控制代码,确保只有JSON响应被输出:
<?php ob_start(); // 开启输出缓冲区 // 原有的代码逻辑 if($_POST['form_process'] == 'Remove User') { $training_info = $c_eta->_get_user_info($_POST['id']); if (count($training_info) > 0) { if ($c_eta->_remove_user($_POST['id'])) { $form_data['success'] = true; } else { $form_data['success'] = false; $form_data['errors'] = "Unable to remove user"; } ob_end_clean(); // 清空缓冲区所有多余输出 header('Content-Type: application/json'); echo json_encode($form_data); exit; // 终止脚本,避免后续代码输出 } }
注意:用
exit替代return,确保脚本执行到JSON输出后立刻终止,避免后续可能的输出。
3. 验证修复结果
发起删除请求后,查看浏览器开发者工具的「网络」面板,检查响应内容是否为纯{"success":true},没有任何前缀。此时jQuery就能正常解析JSON,进入success回调。
补充说明
把dataType改为text后进入success回调,但data.errors报错,是因为此时data是字符串"49{"success":true}",不是JSON对象,自然没有errors属性。核心还是要保证后端输出合法的JSON。
内容的提问来源于stack exchange,提问作者Lay
相关产品推荐
相关产品推荐

