You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何json_decode对脚本内编码字符串有效,对文件读取字符串无效?

问题分析:json_decode无法解析文件读取的字符串,但可解析脚本内生成的同格式字符串

核心问题原因

  1. 文件指针位置错误
    第一次调用fread($ips, filesize('e'))后,文件指针已经移动到了文件末尾。此时第二次调用fread会读取到空字符串,json_decode("")返回null,自然没有输出内容。

  2. 文件存在冗余不可见字符
    第一次读取的字符串显示为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 01:55:34