
本文讲解如何将原本依赖 letters.txt 文件持久化存储的 PHP 表单数据,改为使用 PHP Session 数组暂存,并通过 foreach 遍历动态渲染,实现无文件依赖、内存级数据管理的轻量方案。
本文讲解如何将原本依赖 `letters.txt` 文件持久化存储的 php 表单数据,改为使用 php session 数组暂存,并通过 `foreach` 遍历动态渲染,实现无文件依赖、内存级数据管理的轻量方案。
在原始实现中,data.php 通过 fopen() 和 fwrite() 将每封信件追加写入 letters.txt 文本文件,这种方式虽简单,但存在明显局限:文件 I/O 效率低、并发写入易出错、缺乏结构化访问能力,且难以对单条数据做增删查改操作。更现代、更可控的替代方案是——利用 PHP Session 存储结构化数组,并结合 foreach 进行安全遍历与展示。
✅ 核心改造思路
- 启用 Session:必须在任何输出(包括 HTML、空格、BOM)之前调用 session_start();
- 结构化存储:将每次提交的 $_POST 数据(即一封完整信件)作为关联数组元素,push 到 $_SESSION['letters'] 中;
- 遍历渲染:使用 foreach 遍历 $_SESSION['letters'],按需格式化并输出每封信的 HTML 结构;
- 状态隔离:避免重复提交污染,建议区分「提交动作」与「展示动作」(如用独立按钮触发显示)。
? 示例:重构后的 data.php
<?php
session_start();
// 确保 session 数组已初始化
if (!isset($_SESSION['letters'])) {
$_SESSION['letters'] = [];
}
// ✅ 接收并保存新信件(仅当表单提交且关键字段非空)
if (isset($_POST['Submit']) &&
!empty(trim($_POST['firstName_Receiver'])) &&
!empty(trim($_POST['firstName_Sender']))) {
$letter = [
'receiver' => htmlspecialchars($_POST['firstName_Receiver'] . ' ' . $_POST['lastName_Receiver']),
'sender' => htmlspecialchars($_POST['firstName_Sender'] . ' ' . $_POST['lastName_Sender']),
'content1' => nl2br(htmlspecialchars($_POST['firstContext'])),
'content2' => nl2br(htmlspecialchars($_POST['secondContext'])),
'afterword'=> nl2br(htmlspecialchars($_POST['Afterword']))
];
$_SESSION['letters'][] = $letter;
}
// ✅ 可选:提供独立按钮(如 name="show")触发列表渲染,避免页面刷新即重绘
if (isset($_POST['show']) && !empty($_SESSION['letters'])):
?>
<h2>Съхранени писма (<?= count($_SESSION['letters']) ?>)</h2>
<?php foreach ($_SESSION['letters'] as $index => $ltr): ?>
<div style="border: 1px solid #0099cc; margin: 15px 0; padding: 12px; background: #e6f7ff;">
<h3>Писмо №<?= $index + 1 ?></h3>
<p><strong>Уважаеми(а), <?= $ltr['receiver'] ?>,</strong></p>
<p><?= $ltr['content1'] ?></p>
<p><?= $ltr['content2'] ?></p><div class="aritcle_card flexRow">
<div class="artcardd flexRow">
<a class="aritcle_card_img" href="/xiazai/code/9622" title="XYCMS建站系统php版1.4"><img
src="https://img.php.cn/upload/webcode/000/000/002/175948560395651.png" alt="XYCMS建站系统php版1.4" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a href="/xiazai/code/9622" title="XYCMS建站系统php版1.4">XYCMS建站系统php版1.4</a>
<p>XYCMS建站系统PHP版非MVC框架,自己手写原生态普通代码,作为企业用,已经绰绰有余。软件运行效率中等,加入数据缓存后性能提高。假如用来学习,下载可以慢慢研究的,假如用来建站,可以选择购买商业版就行建站用。栏目类别:文章,人员信息,专题项目,招聘,下载,相册,单页【支持无限极分类】文章:可用作添加新闻,资讯,列表信息类栏目信息人员信息:可用作企业员工信息栏目内容添加或者维护专题项目:可用作企业</p>
</div>
<a href="/xiazai/code/9622" title="XYCMS建站系统php版1.4" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
</div>
</div><p><span>立即学习</span>“<a href="https://pan.quark.cn/s/7fc7563c4182" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">PHP免费学习笔记(深入)</a>”;</p>
<p><em><?= $ltr['afterword'] ?>, <?= $ltr['sender'] ?>!</em></p>
<hr style="border-top: 1px dashed #006699;">
</div>
<?php endforeach; ?>
<?php endif; ?>? 关键注意事项:
- htmlspecialchars() 和 nl2br() 是必备防护:防止 XSS 攻击,并将换行符转为
;- Session 数据仅在当前用户会话中有效,关闭浏览器后自动销毁;如需长期存储,请后续扩展为数据库(MySQL)或 JSON 文件;
- 若需清空所有信件,可添加按钮调用 $_SESSION['letters'] = [];;
- 原 letters.php 中的 应保留于 底部,确保 session_start() 已执行。
? 总结
用数组 + foreach 替代文本文件,不只是语法替换,更是数据思维的升级:从“扁平日志”转向“结构化集合”,为后续排序、搜索、分页、导出等扩展功能打下坚实基础。本方案零文件依赖、零权限配置、开箱即用,特别适合教学演示、原型开发或轻量内部工具场景。只需牢记三原则:先启动 Session,再存数组,最后 foreach 安全渲染——简洁,可靠,专业。










