PHP表单提交写入PHP文件覆盖旧数据 如何实现追加存储
问题根因
原有代码出现覆盖问题来自两个核心原因:
file_put_contents函数默认使用覆盖写入模式,执行时会直接清空目标文件原有内容再写入新内容- 每次写入都使用固定的
$uName、$pWord变量名,就算改成追加写入,PHP运行时后面定义的同名变量也会覆盖前面的值,无法读取历史记录
调整思路
仅需要修改send函数逻辑即可,原有表单校验、前端输出部分的代码完全不需要改动:
- 给
file_put_contents传入FILE_APPEND参数,切换为追加写入模式,新内容会自动加到文件末尾,不会清空原有内容 - 给每条提交记录分配独立的自增序号,变量名拼接序号生成,比如第1条记录用
$uName_1/$pWord_1,第2条用$uName_2/$pWord_2,从根源避免变量重名覆盖 - 自动判断目标文件是否存在,首次写入时自动加上PHP起始标记,后续追加不再重复添加,避免文件语法错误;文件末尾不需要加
?>闭合标签,方便后续追加内容,也符合PHP纯代码文件的编写规范
修改后完整代码
<?php function send($uName, $pWord) { $recordId = 1; // 如果存储文件已存在,统计已有记录数,生成新的记录序号 if (file_exists('textBit.php')) { $existContent = file_get_contents('textBit.php'); // 统计已有的用户名变量数量,即为已存储的记录总条数 $recordId = substr_count($existContent, '$uName_') + 1; } $var_str1 = var_export($uName, true); $var_str2 = var_export($pWord, true); // 首次写入先添加PHP起始标记 if ($recordId === 1) { $content = "<?php\n"; } else { $content = ""; } // 拼接带独立序号的变量代码 $content .= "\$uName_$recordId = $var_str1;\n\$pWord_$recordId = $var_str2;\n\n"; // 用FILE_APPEND模式追加写入,不覆盖原有内容 file_put_contents('textBit.php', $content, FILE_APPEND); } function checker($uName, $pWord){ $pwLen = strlen($pWord); $uLen = strlen($uName); $pwNum = is_numeric($pWord); if ($pwLen < 12 && $uLen < 12 && $pwNum == 1) { echo "Thanks $uName, your information has been saved."; send($uName, $pWord); } elseif ($pwLen == 0 && $uLen == 0) { echo "Both a password and a username is required"; } elseif ($pwLen > 12) { echo "Password too long"; } elseif ($pwLen == 0) { echo "Needs password"; } elseif ($uLen > 12) { echo "Username too long"; } elseif ($uLen == 0) { echo "Needs username"; } elseif ($pwNum == 0) { echo "Password needs at least 1 number"; } } function confirm() { $uName = $_POST["uName"]; $pWord = $_POST["pWord"]; echo "Your Name is: "; echo $_POST["uName"]; echo "<br>"; echo "Your Password is: "; echo $_POST["pWord"]; echo "<br>"; checker($uName, $pWord); } confirm(); ?>
效果说明
每次提交符合校验规则的用户名密码后,新内容会自动追加到textBit.php末尾,生成的文件内容示例如下:
<?php $uName_1 = 'zhangsan'; $pWord_1 = '123456'; $uName_2 = 'lisi'; $pWord_2 = '654321'; $uName_3 = 'wangwu'; $pWord_3 = '112233';
所有历史记录都会保留,不会被新提交覆盖,每个变量名独立,引入textBit.php后可以直接通过序号读取对应记录。
内容的提问来源于stack exchange,提问作者Rocky
相关产品推荐
相关产品推荐

