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

如何在不使用会话、数据库或文件的情况下用PHP持久化表单数据

问题:使用Hidden Input+JSON持久化联系人数据时出现覆盖问题

我正在学习PHP,老师布置了一个日程表练习:通过表单录入、修改或删除联系人信息,禁止使用Session、数据库或文件存储,要求用json_encode结合hidden input实现数据保存。

目前的问题是:新提交的数据会覆盖旧数据,提交第三条时第一条会被删除,无法实现所有联系人数据的累加保存,希望能持久保存为以下多维数组格式:

Array(
  [99999999P] => Array
    (
        [name] => Daniel
        [surname] => García
        [email] => daniel@example.com
        [phone] => 678678678
        [birthday] => 1980/02/28
        [addDate] => 11-11-2022 12:16:49 pm
        [blocked] => 
    )
  [77777777L] => Array
    (
        [name] => Lucia
        [surname] => Santana
        [email] => lucia@example.com
        [phone] => 99999999
        [birthday] => 1990/06/20
        [addDate] => 11-11-2022 12:18:35 pm
        [blocked] => 
    )
)

现有代码

modules.php工具文件

function getLocalTime() {
    date_default_timezone_set('Atlantic/Canary');
    return date("d-m-Y H:i:s a");
}

function encodeData($data) {
    return json_encode($data);
}

function getData() {
    if(isset($_POST['hiddenInput'])) {
        return json_decode($_POST['hiddenInput'], true);
}
    return [];
}

function addData(&$data) {
    $date = getLocalTime();
    $data[$_POST['regNid']]['name'] = $_POST['regName'];
    $data[$_POST['regNid']]['surname'] = $_POST['regSurname'];
    $data[$_POST['regNid']]['email'] = $_POST['regEmail'];
    $data[$_POST['regNid']]['phone'] = $_POST['regTel'];
    $data[$_POST['regNid']]['birthday'] = $_POST['regBirth'];
    $data[$_POST['regNid']]['addDate'] = $date;
    $data[$_POST['regNid']]['block'] = false;
}

表单页面代码

<?php            
    if(!isset($_POST['hiddenInput'])) {
        $agenda = [];
    } else {
        $agenda = getData();
        // var_dump($agenda);
        addData($agenda);
    }
    print('<pre>'.print_r($agenda, true).'</pre>');
?>
    <form class="w-50 m-auto p-5" action='<?php echo $_SERVER['PHP_SELF']; ?>' method="POST" enctype="multipart/form-data" role="form" >
        <div class="body">
            <div class="form-floating mb-4">
                <input type="text" id="registerNid" name="regNid" class="form-control" placeholder="DNI"/>
                <label for="registerName">DNI</label>
            </div>
            <div class="form-floating mb-4">
                <input type="text" id="registerName" name="regName" class="form-control" placeholder="Nombre"/>
                <label for="registerEmail">Nombre</label>
            </div>
            <div class="form-floating mb-4">
                <input type="text" id="registerSurname" name="regSurname" class="form-control" placeholder="Apellidos"/>
                <label for="registerUsername">Apellidos</label>
            </div>
            <div class="form-floating mb-4">
                <input type="email" id="registerEmail" name="regEmail" class="form-control" placeholder="Email"/>
                <label for="registerUsername">Email</label>
            </div>
            <div class="form-floating mb-4">
                <input type="tel" id="registerTel" name="regTel" class="form-control" placeholder="Teléfono"/>
                <label for="registerPassword">Teléfono</label>
            </div>
            <div class="form-floating mb-4">
                <input type="text" id="registerBirth" name="regBirth" class="form-control" placeholder="Fecha de nacimiento"/>
                <label for="registerBirth">Fecha de nacimiento</label>
            </div>
        </div>
        <div class="footer">
            <button type="submit" id="submit" class="btn btn-primary" name="sub-register" value="register">Registrarse</button>
            <?php
                $data = [$_POST["regNid"], $_POST["regName"], $_POST["regSurname"], $_POST["regEmail"], $_POST["regTel"], $_POST["regBirth"]];
            ?>
            <input type="hidden" name="hiddenInput" value='<?php echo encodeData($data); ?>'>
            <div class="text-center w-100">
                <p>¿Ya existe? <a class="text-info" href="#!">Actualizar datos</a></p>
            </div>
        </div>
    </form>


<?php            
if(!isset($_POST['hiddenInput'])) {
    $agenda = [];
} else {
    $agenda = getData();
    // var_dump($agenda);
    addData($agenda);
}
print('<pre>'.print_r($agenda, true).'</pre>');
?>
<form class="w-50 m-auto p-5" action='<?php echo $_SERVER['PHP_SELF']; ?>' method="POST" enctype="multipart/form-data" role="form" >
    <div class="body">
        <div class="form-floating mb-4">
            <input type="text" id="registerNid" name="regNid" class="form-control" placeholder="DNI"/>
            <label for="registerName">DNI</label>
        </div>
        <div class="form-floating mb-4">
            <input type="text" id="registerName" name="regName" class="form-control" placeholder="Nombre"/>
            <label for="registerEmail">Nombre</label>
        </div>
        <div class="form-floating mb-4">
            <input type="text" id="registerSurname" name="regSurname" class="form-control" placeholder="Apellidos"/>
            <label for="registerUsername">Apellidos</label>
        </div>
        <div class="form-floating mb-4">
            <input type="email" id="registerEmail" name="regEmail" class="form-control" placeholder="Email"/>
            <label for="registerUsername">Email</label>
        </div>
        <div class="form-floating mb-4">
            <input type="tel" id="registerTel" name="regTel" class="form-control" placeholder="Teléfono"/>
            <label for="registerPassword">Teléfono</label>
        </div>
        <div class="form-floating mb-4">
            <input type="text" id="registerBirth" name="regBirth" class="form-control" placeholder="Fecha de nacimiento"/>
            <label for="registerBirth">Fecha de nacimiento</label>
        </div>
    </div>
    <div class="footer">
        <button type="submit" id="submit" class="btn btn-primary" name="sub-register" value="register">Registrarse</button>
        <?php
            $data = [$_POST["regNid"], $_POST["regName"], $_POST["regSurname"], $_POST["regEmail"], $_POST["regTel"], $_POST["regBirth"]];
        ?>
        <input type="hidden" name="hiddenInput" value='<?php echo encodeData($data); ?>'>
        <div class="text-center w-100">
            <p>¿Ya existe? <a class="text-info" href="#!">Actualizar datos</a></p>
        </div>
    </div>
</form>

问题核心

  1. 页面重复了两套数据处理逻辑和表单,导致逻辑混乱
  2. Hidden input存储的是当前表单的单条一维数据,而非累加后的完整联系人多维数组,每次提交都会覆盖之前的完整数据集

解决方案

1. 修正modules.php字段名不一致问题

目标数组中字段为blocked,但工具函数中写的是block,统一字段名:

function addData(&$data) {
    $date = getLocalTime();
    $data[$_POST['regNid']]['name'] = $_POST['regName'];
    $data[$_POST['regNid']]['surname'] = $_POST['regSurname'];
    $data[$_POST['regNid']]['email'] = $_POST['regEmail'];
    $data[$_POST['regNid']]['phone'] = $_POST['regTel'];
    $data[$_POST['regNid']]['birthday'] = $_POST['regBirth'];
    $data[$_POST['regNid']]['addDate'] = $date;
    $data[$_POST['regNid']]['blocked'] = false; // 与目标数组字段统一
}

2. 重构表单页面逻辑

删除重复的处理代码和表单,让hidden input存储完整的联系人数据集,实现累加保存:

<?php
// 引入工具文件
require 'modules.php';

// 初始化或获取已有完整数据集
$agenda = isset($_POST['hiddenInput']) ? getData() : [];

// 仅在表单提交时添加新数据
if (isset($_POST['regNid'])) {
    addData($agenda);
}

// 打印当前数据用于调试
print('<pre>'.print_r($agenda, true).'</pre>');
?>
<form class="w-50 m-auto p-5" action='<?php echo $_SERVER['PHP_SELF']; ?>' method="POST" role="form" >
    <div class="body">
        <div class="form-floating mb-4">
            <input type="text" id="registerNid" name="regNid" class="form-control" placeholder="DNI" required/>
            <label for="registerNid">DNI</label>
        </div>
        <div class="form-floating mb-4">
            <input type="text" id="registerName" name="regName" class="form-control" placeholder="Nombre" required/>
            <label for="registerName">Nombre</label>
        </div>
        <div class="form-floating mb-4">
            <input type="text" id="registerSurname" name="regSurname" class="form-control" placeholder="Apellidos" required/>
            <label for="registerSurname">Apellidos</label>
        </div>
        <div class="form-floating mb-4">
            <input type="email" id="registerEmail" name="regEmail" class="form-control" placeholder="Email" required/>
            <label for="registerEmail">Email</label>
        </div>
        <div class="form-floating mb-4">
            <input type="tel" id="registerTel" name="regTel" class="form-control" placeholder="Teléfono" required/>
            <label for="registerTel">Teléfono</label>
        </div>
        <div class="form-floating mb-4">
            <input type="text" id="registerBirth" name="regBirth" class="form-control" placeholder="Fecha de nacimiento" required/>
            <label for="registerBirth">Fecha de nacimiento</label>
        </div>
    </div>
    <div class="footer">
        <button type="submit" id="submit" class="btn btn-primary" name="sub-register" value="register">Registrarse</button>
        <!-- 存储完整的联系人数据集 -->
        <input type="hidden" name="hiddenInput" value='<?php echo encodeData($agenda); ?>'>
        <div class="text-center w-100">
            <p>¿Ya existe? <a class="text-info" href="#!">Actualizar datos</a></p>
        </div>
    </div>
</form>

原理说明

  • 每次页面加载时,先从hidden input中读取已保存的完整联系人数组(JSON转PHP数组)
  • 表单提交时,将新联系人数据添加到数组中(以DNI为键,自动覆盖重复DNI的联系人,实现修改功能)
  • 将更新后的完整数组转成JSON,重新存入hidden input,下次提交时传递全部数据,实现累加持久化

内容的提问来源于stack exchange,提问作者ilos28

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 07:55:30