PHP7.2.4查询单条数据返回JSON正常,多条则无返回(200空响应)
问题排查与解决办法
嘿,我来帮你搞定这个诡异的问题!从你描述的现象和代码片段来看,主要问题大概率出在循环逻辑的写法或者JSON编码失败上,下面给你拆解分析并提供修正方案:
可能的问题根源
- 冗余且易出错的循环写法:你用
while($i < $res->num_rows)加上data_seek($i)的方式遍历结果集,这种写法不仅没必要,还很容易在多行数据时出现遍历不完整或者数据收集遗漏的情况。 - JSON编码静默失败:当查询结果里包含非UTF-8编码的字符(比如特殊符号、乱码的中文),
json_encode()会偷偷返回false,而如果你没做错误处理,直接输出这个false就会得到空响应,但HTTP状态码还是200(因为PHP没抛出显性错误)。 - 缺失正确的响应头:虽然单条数据时可能侥幸正常,但多条数据时如果没设置
Content-Type为application/json,客户端可能无法正确解析响应,看起来像是空内容。
修正后的完整代码
<?php // 先设置正确的响应头,告诉客户端这是JSON格式数据 header('Content-Type: application/json; charset=utf-8'); require_once "connexion.php"; // 去掉limit,测试多行数据场景 $sql = "select id,title,image from em0hb_yendifvideoshare_videos"; $res = $conn->query($sql); // 先检查SQL查询是否成功 if (!$res) { echo json_encode(['error' => 'SQL查询失败: ' . $conn->error]); $conn->close(); exit; } // 直接一次性获取所有结果,比手动循环靠谱得多 $rows = $res->fetch_all(MYSQLI_ASSOC); $conn->close(); // 检查JSON编码是否成功,避免静默失败 $json_output = json_encode($rows); if ($json_output === false) { $encode_error = json_last_error_msg(); echo json_encode(['error' => 'JSON编码失败: ' . $encode_error]); exit; } // 输出最终的JSON数据 echo $json_output; ?>
关键优化点说明
- 响应头设置:
header('Content-Type: application/json; charset=utf-8')确保客户端能正确识别响应类型,避免解析异常。 - 简化结果获取:用
fetch_all(MYSQLI_ASSOC)直接获取所有关联数组形式的结果,彻底避免手动循环的潜在问题。 - 错误排查机制:增加了SQL查询失败和JSON编码失败的错误提示,能帮你快速定位问题(比如如果是编码错误,会提示你具体是哪种编码问题,方便你处理数据库字符编码)。
额外排查建议
如果修正后还是有问题,可以检查:
- 数据库表的字符编码是否为
utf8mb4(支持所有Unicode字符),确保查询结果的编码和PHP输出编码一致。 - 查看PHP的错误日志,确认有没有内存不足或者其他隐性报错。
内容的提问来源于stack exchange,提问作者Thibaut
相关产品推荐
相关产品推荐

