无需数据库实现多表单提交且每个信件拥有唯一值并追加至data.php数组的技术问询
不用数据库实现信件数据持久化方案
嘿,作为PHP新手能想到这种需求已经很棒啦!既然不想依赖数据库,咱们可以用文件存储的方式来实现——具体来说就是用JSON格式的文件保存每次提交的信件数据,既能持久化存储,又不用折腾数据库配置,非常适合入门练习。
核心思路
每次提交表单时:
- 读取已存储的JSON文件数据
- 将本次提交的信件内容追加到数据数组中
- 更新JSON文件
- 展示所有历史信件
修改后的完整代码
1. letters.php(无需修改,保持原表单即可)
<html> <head> <meta charset="UTF-8"> <title>Домашна Работа 3</title> <link rel="stylesheet" type="text/css" href="style.css"> <style> body { font-family: Tahoma; } table, td { margin: auto; padding: 7px; width: 33%; border: 2px solid black; border-collapse: collapse; background: #f0faff; } th { font-size: 40px; margin: auto; padding: 10px; } h1 { margin: auto; padding: 30px; background: #bfeaff; } input { margin: 10px; } p { font-size: 20px; margin: auto; padding: auto; } hr { margin: 15px; padding: auto; } input[type=submit], input[type=reset] { padding-top: 10px; padding-bottom: 10px; padding-left: 15px; padding-right: 15px; } </style> </head> <body> <form method="post" action="data.php"> <table class="table"> <tr> <td> <center> <h1>СЪЗДАВАНЕ НА ПИСМО(А)</h1> <label for="countLetters">Колко писма искате да изпратите?</label> <input type="number" placeholder="Мин. 1" id="countLetters" name="countLetters" required><br> <hr> <label for="firstName_Receiver">Име на получател:</label> <input type="text" id="firstName_Receiver" name="firstName_Receiver" required><br> <label for="lastName_Receiver">Фамилия на получател:</label> <input type="text" id="lastName_Receiver" name="lastName_Receiver" required><br> <hr> <p>Съдържания:</p><br> <textarea placeholder="Напр. 'Имаме удоволствието да ви поканим на открито изложение'" id="Context1" name="Context1" rows="6" cols="65" required></textarea><br><br> <textarea placeholder="Напр. 'Бъдете 10 минути преди откриването!'" id="Context2" name="Context2" rows="6" cols="65" required></textarea><br><br> <p>Послепис:</p><br> <textarea placeholder="Напр. 'С уважение'" id="Afterword" name="Afterword" rows="4" cols="40" required></textarea> <hr> <label for="firstName_Sender">Вашето име:</label> <input type="text" id="firstName_Sender" name="firstName_Sender" required><br> <label for="lastName_Sender">Вашата фамилия:</label> <input type="text" id="lastName_Sender" name="lastName_Sender" required><br> <hr> <input type="submit" value="Изпрати" id="Submit" name="Submit"> <input type="reset" value="Изчисти"> </center> </td> </tr> </table> </form> </body> </html>
2. 修改后的data.php
<?php // 定义存储文件路径,和当前脚本同目录 $storageFile = 'letters_storage.json'; // 初始化存储所有信件的数组 $allLetters = []; // 如果存储文件已存在,读取并解析数据 if (file_exists($storageFile)) { $jsonContent = file_get_contents($storageFile); $allLetters = json_decode($jsonContent, true); // 容错处理:如果JSON解析失败,重置为空数组 if ($allLetters === null) { $allLetters = []; } } // 处理表单提交逻辑 if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['Submit'])) { // 确保信件数量至少为1,避免非法输入 $count = max(1, (int)$_POST["countLetters"]); // 收集本次提交的信件数据 $newLetters = []; for ($i = 0; $i < $count; $i++) { $newLetters[] = [ 'fN_R' => $_POST["firstName_Receiver"], 'lN_R' => $_POST["lastName_Receiver"], 'C1' => $_POST["Context1"], 'C2' => $_POST["Context2"], 'Aw' => $_POST["Afterword"], 'fN_S' => $_POST["firstName_Sender"], 'lN_S' => $_POST["lastName_Sender"] ]; } // 将新信件追加到历史数据中 $allLetters = array_merge($allLetters, $newLetters); // 把更新后的数据写回JSON文件,保留Unicode字符并格式化输出 file_put_contents($storageFile, json_encode($allLetters, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT)); } // 展示所有已存储的信件 if (!empty($allLetters)) { foreach ($allLetters as $index => $letter) { echo "Уважаеми (а), " . $letter["fN_R"] . " " . $letter["lN_R"] . "<br>"; echo $letter["C1"] . "<br>"; echo $letter["C2"] . "<br>"; echo $letter["Aw"] . ", " . $letter["fN_S"] . " " . $letter["lN_S"] . "!"; // 最后一封信件不加分割线 if ($index !== count($allLetters) - 1) { echo "<hr>"; } } } else { echo "<p>Все още няма изпратени писма.</p>"; } ?>
关键细节说明
- 文件读写:用
file_get_contents和file_put_contents简化文件操作,不用手动处理文件打开/关闭的流程。 - JSON处理:
json_encode的两个参数很重要:JSON_UNESCAPED_UNICODE:确保保加利亚语的特殊字符不会被转义(比如不会把СЪЗДАВАНЕ变成Unicode编码)JSON_PRETTY_PRINT:让JSON文件格式更整齐,方便你直接打开查看内容
- 容错处理:
- 强制
countLetters至少为1,防止用户输入0或负数 - 检测JSON解析失败的情况,避免脚本报错
- 强制
- 权限问题:要确保PHP对当前目录有写入权限,不然无法创建/修改
letters_storage.json。本地环境(如XAMPP)一般默认没问题,服务器环境可能需要调整文件权限为755或644。
注意事项
这种文件存储方案适合数据量不大的场景,比如练习用的小项目。如果以后需要处理大量信件数据,数据库(比如MySQL)会是更高效、更安全的选择,但作为入门练习,这个方案完全够用啦!
内容的提问来源于stack exchange,提问作者Aleksandar Haralanov
相关产品推荐
相关产品推荐

