Ajax POST请求本地正常,网站部署后出现JSON解析错误
问题:Autocomplete功能部署后JSON.parse抛出"Unexpected end of JSON input"错误
问题详情
开发化合物搜索项目时,搜索栏的autocomplete功能在本地运行正常,但部署到线上网站后,在AJAX请求的onreadystatechange阶段执行JSON.parse()时触发以下错误:
Uncaught SyntaxError: Unexpected end of JSON input
前端核心代码
function handleAutocomplete(inputElement) { const ajaxReq = new XMLHttpRequest(); ajaxReq.onreadystatechange = function() { if (this.readyState === 4 && this.status === 200) { try { const autocompleteData = JSON.parse(this.responseText); // 渲染候选列表逻辑 } catch (err) { console.error('JSON解析失败:', err); } } }; const query = encodeURIComponent(inputElement.value.trim()); ajaxReq.open('GET', `process_data.php?query=${query}`, true); ajaxReq.send(); }
后端process_data.php代码
<?php header('Content-Type: application/json'); $dbConn = mysqli_connect('localhost', 'prod_user', 'prod_pass', 'compound_db'); if (!$dbConn) { die(json_encode(['error' => '数据库连接失败'])); } $searchQuery = isset($_GET['query']) ? $_GET['query'] : ''; $results = []; $sql = "SELECT compound_name FROM compounds WHERE compound_name LIKE ? LIMIT 8"; $stmt = $dbConn->prepare($sql); $likePattern = "%{$searchQuery}%"; $stmt->bind_param('s', $likePattern); $stmt->execute(); $resultSet = $stmt->get_result(); while ($row = $resultSet->fetch_assoc()) { $results[] = $row['compound_name']; } echo json_encode($results); $stmt->close(); mysqli_close($dbConn); ?>
已尝试的调试操作
- 调整前端错误捕获逻辑,新增
console.log输出响应内容 - 修改后端SQL过滤规则,优化模糊匹配的边界条件
- 验证前端请求参数的编码方式,确保特殊字符被正确转义
调试关键信息(截图总结)
- AJAX请求状态码为200,但
responseText为空字符串 - 本地环境中相同请求能返回完整的JSON数组
排查建议
直接验证后端输出
在线上环境直接访问process_data.php?query=test(替换为实际测试关键词),查看返回内容是否为合法JSON。如果返回PHP错误信息(比如数据库连接失败、语法报错),说明后端代码存在环境兼容问题。检查PHP错误日志
查看服务器的PHP错误日志,确认是否有未捕获的错误导致输出中断(比如数据库权限不足、SQL语法在生产环境不兼容)。明确响应编码
修改后端的Content-Type头,明确指定UTF-8编码:header('Content-Type: application/json; charset=utf-8');避免因字符编码问题导致JSON输出异常。
验证请求参数传递
检查服务器是否存在URL重写规则,导致$_GET['query']参数丢失。可在后端新增日志输出:error_log('Received query: ' . $searchQuery);确认参数是否正确接收。
检查服务器PHP版本
对比本地与线上的PHP版本,若线上版本过低,可能不支持mysqli_stmt::get_result()等语法,需替换为兼容写法(比如用mysqli_stmt::bind_result())。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

