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

无需数据库实现多表单提交且每个信件拥有唯一值并追加至data.php数组的技术问询

不用数据库实现信件数据持久化方案

嘿,作为PHP新手能想到这种需求已经很棒啦!既然不想依赖数据库,咱们可以用文件存储的方式来实现——具体来说就是用JSON格式的文件保存每次提交的信件数据,既能持久化存储,又不用折腾数据库配置,非常适合入门练习。

核心思路

每次提交表单时:

  1. 读取已存储的JSON文件数据
  2. 将本次提交的信件内容追加到数据数组中
  3. 更新JSON文件
  4. 展示所有历史信件

修改后的完整代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 16:08:12