PHP返回JSON前出现多余问号,客户端解析失败求助
问题:PHP返回JSON开头出现多余问号,每次require/include新增一个
你遇到的这个问题很典型——返回的JSON字符串开头藏着多个问号,每用一次包含语句就多一个,浏览器里看不到但文本编辑器能发现,直接导致客户端JSON解析失败。你的环境是IIS搭配PHP 7.1.7,简化代码和返回结果如下:
简化代码示例
lookup.php
<?php include_once 'common/server.php'; echo $srv->QueryTable(qry_ItemList);
server.php
<?php require_once 'constants.php'; require_once 'sql/queryNAV.php'; class JSON_Server { public function QueryTable($SQLTextName) { $qry_result = /*(do SQL-Query)*/; return json_encode($qry_result); } } $srv = new JSON_RESTServer;
请求与返回示例
请求地址:
http://s-mde/itemLookup.php?number=305475
返回结果(开头的问号破坏了JSON结构):
?????[{"Typ":"I","No_":"408835","Description":"Ds Scene it? Twilight","debugCounter":96},{"Typ":"L","No_":"100773","Description":"Axe Deo Roll Diverse 50ml Ro","debugCounter":96},...]
原因分析
这种情况99%是被包含的PHP文件存在多余输出导致的,具体有几种可能:
- 文件末尾的
?>标记后面跟着空格、换行或者其他空白字符——PHP解析完脚本后会直接输出这些内容; - 文件带有UTF-8 BOM头——这是编辑器保存UTF-8文件时自动添加的三个隐藏字符(
EF BB BF),PHP会把它当作普通输出; - 文件开头的
<?php之前有空白字符(比如空行、空格)。
每包含一个有问题的文件,就会多一段这样的隐藏输出,反映到结果里就是多一个问号。
解决步骤
1. 移除所有PHP文件末尾的?>标记
PHP根本不需要这个标记来结束脚本,反而容易引入多余输出。直接删掉所有相关文件(包括constants.php、queryNAV.php)末尾的?>,比如修正后的server.php可以改成:
<?php require_once 'constants.php'; require_once 'sql/queryNAV.php'; class JSON_Server { public function QueryTable($SQLTextName) { $qry_result = /*(do SQL-Query)*/; return json_encode($qry_result); } } $srv = new JSON_Server; // 这里不再写?>,彻底避免末尾的空白输出
2. 检查并移除UTF-8 BOM头
用支持显示隐藏字符的编辑器(比如Notepad++、VS Code)打开所有PHP文件:
- 在Notepad++里,点击「视图」→「显示符号」→「显示所有字符」,查看文件开头是否有
(这就是BOM的可视化表现); - 如果有,点击「编码」→「转为UTF-8无BOM编码」,然后保存文件。
3. 清理文件开头的空白
确保每个PHP文件的第一行就是<?php,前面没有任何空行、空格或者其他字符。比如有些文件可能不小心在<?php前面加了个空行,这也会输出空白字符。
4. 额外排查(可选)
如果上述步骤都没用,检查IIS的PHP处理程序映射是否正确,确保没有第三方模块在响应中注入多余内容——不过这种情况概率很低,优先排查文件本身的问题。
修改完成后重新请求接口,返回的JSON开头应该就没有多余问号了,客户端也能正常解析了。
内容的提问来源于stack exchange,提问作者Heinzi Tuberkel
相关产品推荐
相关产品推荐

