为何json_decode对脚本内编码字符串有效,对文件读取字符串无效?
问题分析:json_decode无法解析文件读取的字符串,但可解析脚本内生成的同格式字符串
核心问题原因
文件指针位置错误
第一次调用fread($ips, filesize('e'))后,文件指针已经移动到了文件末尾。此时第二次调用fread会读取到空字符串,json_decode("")返回null,自然没有输出内容。文件存在冗余不可见字符
第一次读取的字符串显示为190字符,远大于正常JSON的19字符,说明文件中存在大量空白、换行或其他不可见字符——这些字符肉眼无法通过打印发现,但会直接导致json_decode解析失败。
代码问题拆解
- 你用
r+模式打开文件后,首次fread读取了全部内容,指针停在文件末尾; - 第二次
fread返回空字符串,$aga被设为null,触发if条件将其重置为空数组; - 后续添加IP并写入的是正常格式的JSON,但文件之前的残留内容(190字符)是导致初始解析失败的元凶。
修复方案
用更简洁的文件操作函数替代手动指针管理,同时预处理读取内容去除冗余字符:
<?php // 读取文件内容,@抑制文件不存在的报错 $fileContent = @file_get_contents("e"); // 去除空白/不可见字符后解析,true参数返回关联数组 $aga = json_decode(trim($fileContent), true); // 解析失败则重置为空数组 if (!is_array($aga)) { $aga = []; } // 添加当前访问IP $aga[] = [$_SERVER['REMOTE_ADDR']]; // 写入处理后的JSON file_put_contents("e", json_encode($aga)); // 调试输出 echo '<div>'; var_dump($fileContent); // 查看原始文件内容 echo '</div>'; echo '<div>'; var_dump(json_encode($aga)); echo '</div>'; echo '<div>'; var_dump($aga); echo '</div>'; ?>
修复要点
- 使用
file_get_contents/file_put_contents自动处理文件指针,避免手动操作的失误; trim($fileContent)清除文件中的空白、换行等干扰字符;json_decode的第二个参数设为true,直接返回关联数组,更便于数组操作。
内容的提问来源于stack exchange,提问作者stairtheref
相关产品推荐
相关产品推荐

