PHP存入文件的数组反序列化后无法正常填充的问题
解决PHP序列化数组读写文件的问题
我帮你梳理下代码里的几个关键问题,以及对应的修复方案:
代码里的核心问题
fread参数错误:fread($myfile, "r")是错误的写法,fread的第二个参数需要是读取的字节数,而非文件模式。- 文件指针位置不对:用
a+模式打开文件时,默认指针停在文件末尾,直接读取会读不到任何内容,得先把指针移到文件开头。 - 未处理空文件场景:如果文件是新建的或者为空,
unserialize会返回false,这时候不能直接把它赋值给$discounts,得手动初始化空数组。 - 忘记写入修改后的数组:你修改了
$discounts数组,但没有把序列化后的新数组写入文件,导致修改无法持久化,重启程序后数据就丢失了。
修复后的完整代码
<?php // 打开文件,a+模式支持读写,文件不存在则自动创建 $myfile = fopen("discountsList.txt", "a+") or die("Unable to open file!"); // 将文件指针移到开头,确保能读取到文件内已有内容 rewind($myfile); // 读取文件全部内容,用filesize获取文件总字节数作为读取长度 $fileContent = fread($myfile, filesize("discountsList.txt")); // 反序列化数组,处理空文件的情况:空文件unserialize返回false,这里用?:初始化空数组 $discounts = unserialize($fileContent) ?: []; // 处理POST参数(添加参数校验,避免非法输入破坏数据) if (isset($_POST['item'], $_POST['percentage'])) { // 强制转换参数类型,保证item是int、百分比是float $itemId = (int)$_POST['item']; $discountPercent = (float)$_POST['percentage']; // 将数据存入数组,键用int类型也完全可行,无需转字符串 $discounts[$itemId] = $discountPercent; } // 先清空文件内容,再写入序列化后的新数组(避免追加导致的序列化数据错乱) ftruncate($myfile, 0); fwrite($myfile, serialize($discounts)); // 关闭文件释放资源 fclose($myfile); // 测试用:输出数组查看结果 var_dump($discounts); ?>
额外注意事项
- 参数校验:实际业务中一定要校验
$_POST参数的合法性,比如判断item是否为正整数、percentage是否在0-100的合理范围内,防止恶意输入破坏序列化数据。 - 文件权限:确保PHP进程拥有
discountsList.txt文件的读写权限,否则会出现无法打开或写入的错误。 - 数据安全:如果这个文件是公开可访问的,序列化数据可能被篡改,生产环境建议改用数据库存储,或者对序列化数据进行加密处理。
内容的提问来源于stack exchange,提问作者Rémi Jonathan Choquette
相关产品推荐
相关产品推荐

