如何在不使用会话、数据库或文件的情况下用PHP持久化表单数据
我正在学习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>
问题核心
- 页面重复了两套数据处理逻辑和表单,导致逻辑混乱
- 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
相关产品推荐
相关产品推荐

