如何在另一个表单上提交后保留数组中的数据



所有人,

首先,我很抱歉这个问题有点令人困惑。

问题是:几天前我发布了另一个问题(这个问题),关于我们老师给我们的一个练习,这有点棘手,换句话说,这项工作包括将从表格中收集的数据(事实上是几个数据)保存在一个数组中,然后能够在不删除数组中其他数据的情况下修改它们。

正如我在上一篇文章中所说,糟糕的是我们不能使用会话、数据库、文件或本地存储。

注意:我在一个页面中完成所有操作,因为这是保存我找到的数据的最佳方式

他告诉我们,诀窍是使用json_encode()在隐藏的输入中传递数据,到目前为止一切都很好,多亏了上一篇文章中的答案,只要NID还不在数组中,我就设法保存了多个用户,但在我们必须更新数据的部分,一切都变得复杂起来。要更新数据,我要做的第一件事是要求用户的NID用select/选项进行修改,但当我提交select时,它会删除我在$agenda变量中添加的用户的数据。

我确信问题出在isset()上,但我做这个练习已经一周了,我想不出什么新的了。

这是index.php:的代码

<?php
require_once './controllers/modules.php';
if(!isset($_POST['hiddenInputUpdate'])) {
$newAgenda = [];
} else {
$newAgenda = decodeData();
updateData($newAgenda);
}
if(!isset($_POST['hiddenInputReg'])) {
$agenda = [];
} else {
$agenda = decodeData();
addData($agenda);
}
print('<pre>'.print_r($agenda, true).'</pre>');
?>
<div class="container-panel">
<main>
<div id="add-contact" class="section-content">
<div class="top">
<div class="left">
<h1>Añadir contactos</h1>
<div class="date">
<input type="date" name="date" id="date">
</div>
</div>
<div class="right">
<div class="theme-toggler">
<span class="material-icons-sharp active">light_mode</span>
<span class="material-icons-sharp">dark_mode</span>
</div>
</div>
</div>
<div>
<form action='' method="POST" class="w-75 form-register" id="regForm">
<div class="form-floating mb-4">
<input type="text" class="form-control form-control-lg" name="regNid" required/>
<label for="regNid">DNI</label>
</div>
<div class="form-floating mb-4">
<input type="text" class="form-control form-control-lg" name="regName" required/>
<label for="regName">Nombre</label>
</div>
<div class="form-floating mb-4">
<input type="text" class="form-control form-control-lg" name="regSurname" required/>
<label for="regSurname">Apellidos</label>
</div>
<div class="form-floating mb-4">
<input type="email" class="form-control form-control-lg" name="regEmail" required/>
<label for="regEmail">Email</label>
</div>
<div class="form-floating mb-4">
<input type="tel" class="form-control form-control-lg" name="regTel" required/>
<label for="regTel">Teléfono</label>
</div>
<div class="form-floating mb-4">
<input type="date" class="form-control form-control-lg" name="regBirth" required/>
<label for="regBirth">Fecha de nacimiento</label>
</div>
<div class="d-flex justify-content-center">
<input type="hidden" name="hiddenInputReg" value='<?php echo encodeData($agenda); ?>'>
<button type="submit" name="regSubmit" class="btn btn-success btn-block btn-lg gradient-custom-4 text-body">Registrar</button>
</div>
</form>
</div>
</div>
<div id="update-contact" class="section-content">
<div class="top">
<div class="left">
<h1>Actualizar contactos</h1>
<div class="date">
<input type="date" name="date" id="date">
</div>
</div>
<div class="right">
<div class="theme-toggler">
<span class="material-icons-sharp active">light_mode</span>
<span class="material-icons-sharp">dark_mode</span>
</div>
</div>
</div>
<div>
<form class="w-25 my-5" action="" method="POST" id="getNidForm">
<select class="form-select form-select-lg mb-3" aria-label=".form-select-lg example" name="getNid">
<?php
if(isset($agenda)){
echo '
<option value="noSel" selected>Selecciona un DNI</option>
';
foreach($agenda as $key => $value) {
echo '
<option value='.$key.'>'.$key.'</option>
';
}
} else {
echo '
<option value="noSel" selected>No hay DNIs</option>
';
}
?>
</select>
<button type="submit" name="getNidSubmit" class="btn btn-success btn-block btn-lg gradient-custom-4 text-body">Seleccionar</button>
</form>
<?php
if(isset($_POST['getNid']) && !empty($_POST['getNid'])) {
if($_POST['getNid'] !== 'noSel') {
echo '
<form class="my-5" action="" method="POST" id="updForm">
<div class="form-group">
<h2 class="heading">Registrar</h2>
<div class="form-floating mb-4">
<input type="text" class="form-control form-control-lg" name="updateNid" value="'.$_POST['getNid'].'">
<label for="updateNid">DNI</label>
</div>
<div class="form-floating mb-4">
<input type="text" class="form-control form-control-lg" name="updateName">
<label for="updateName">Nombre</label>
</div>
<div class="form-floating mb-4">
<input type="text" class="form-control form-control-lg" name="updateSurname">
<label for="updateSurname">Apellidos</label>
</div>
<div class="form-floating mb-4">
<input type="email" class="form-control form-control-lg" name="updateEmail">
<label for="updateEmail">Email</label>
</div>       
<div class="form-floating mb-4">
<input type="tel" class="form-control form-control-lg" name="updatePhone">
<label for="updatePhone">Phone</label>
</div>
<div class="form-floating mb-4">
<input type="text" class="form-control form-control-lg" name="updateBirth"/>
<label for="updateBirth">Fecha de nacimiento</label>
</div>
<div class="mb-4" style="width: 22rem;">
<label for="registerPic">Selecciona una foto<span class="text-danger">*</span></label>
<input type="file" class="form-control form-control-lg" name="updateFile" />
</div>
</div>
<div class="form-group">
<div class="grid">
<button type="submit" class="btn btn-primary" name="sub-update" value="update">Actualizar</button>
<input type="hidden" name="hiddenInputUpdate" value='.encodeData($newAgenda).'>
</div>  
</div>
</form>
';
}
}
?>
</div>
</div>
</main>
</div>

这是modules.hp:

<?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 decodeData() {
return json_decode($_POST['hiddenInputReg'], true);
}
function cleanData($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
function addData(&$data) {
$date = getLocalTime();
if(!in_array($_POST['regNid'], $data) || empty($data)) {
$data[$_POST['regNid']]['nombre'] = cleanData($_POST['regName']);
$data[$_POST['regNid']]['apellidos'] = cleanData($_POST['regSurname']);
$data[$_POST['regNid']]['correo'] = cleanData($_POST['regEmail']);
$data[$_POST['regNid']]['telefono'] = cleanData($_POST['regTel']);
$data[$_POST['regNid']]['fechaNacimiento'] = cleanData($_POST['regBirth']);
$data[$_POST['regNid']]['fechaInsercion'] = $date;
$data[$_POST['regNid']]['bloqueado'] = false;
$data[$_POST['regNid']]['ficheros'] = [];
return;
}
return;
}
function updateData(&$data) {
if(!in_array($_POST['regNid'], $data) || empty($data)) {
$data[$_POST['regNid']]['nombre'] = cleanData($_POST['regName']);
$data[$_POST['regNid']]['apellidos'] = cleanData($_POST['regSurname']);
$data[$_POST['regNid']]['correo'] = cleanData($_POST['regEmail']);
$data[$_POST['regNid']]['telefono'] = cleanData($_POST['regTel']);
$data[$_POST['regNid']]['fechaNacimiento'] = cleanData($_POST['regBirth']);
$data[$_POST['regNid']]['ficheros'] = $_FILES['updateFile']['name'];
return;
}
return;
}
?>

注意:我还没有使用updateDate()函数,但我更喜欢将其添加到帖子中以防万一

总之,我想要实现的是保持使用#regForm添加的数据,即使我在#getNidForm或#updForm上提交。

最后,它很简单,只需使用相同的隐藏输入#regForm传递每个表单中的数据;您还需要在考虑提交按钮(regSubmit、updSubmit或blockSubmit)的情况下更改条件(isset()),因为它们每个都使用不同的函数,如addData、updateData或setBlock。

如果有人和我有同样的问题,有同样的否决权,我把最后的代码留在这里:

if(!isset($_POST['hiddenInputReg'])) {
$agenda = [];
} else {
$agenda = decodeData();
if(isset($_POST['regSubmit'])) {
addData($agenda);
} 
else if(isset($_POST['updSubmit'])) {
updateData($agenda);
}
else if(isset($_POST['blockSubmit'])) {
setBlock($agenda);
}
}
print('<pre>'.print_r($agenda, true).'</pre>');
?>
<div class="container-panel">
<main>
<div id="add-contact" class="section-content">
<div class="top">
<div class="left">
<h1>Añadir contactos</h1>
<div class="date">
<input type="date" name="date" id="date">
</div>
</div>
<div class="right">
<div class="theme-toggler">
<span class="material-icons-sharp active">light_mode</span>
<span class="material-icons-sharp">dark_mode</span>
</div>
</div>
</div>
<div>
<form action='' method="POST" class="w-75 form-register" id="regForm">
<div class="form-floating mb-4">
<input type="text" class="form-control form-control-lg" name="regNid" required/>
<label for="regNid">DNI</label>
</div>
<div class="form-floating mb-4">
<input type="text" class="form-control form-control-lg" name="regName" required/>
<label for="regName">Nombre</label>
</div>
<div class="form-floating mb-4">
<input type="text" class="form-control form-control-lg" name="regSurname" required/>
<label for="regSurname">Apellidos</label>
</div>
<div class="form-floating mb-4">
<input type="email" class="form-control form-control-lg" name="regEmail" required/>
<label for="regEmail">Email</label>
</div>
<div class="form-floating mb-4">
<input type="tel" class="form-control form-control-lg" name="regTel" required/>
<label for="regTel">Teléfono</label>
</div>
<div class="form-floating mb-4">
<input type="date" class="form-control form-control-lg" name="regBirth" required/>
<label for="regBirth">Fecha de nacimiento</label>
</div>
<div class="d-flex justify-content-center">
<input type="hidden" name="hiddenInputReg" value='<?php echo htmlspecialchars(encodeData($agenda)); ?>'>
<button type="submit" name="regSubmit" class="btn btn-block btn-lg gradient-custom-4 text-body custom-btn">Registrar</button>
</div>
</form>
</div>
</div>
<div id="update-contact" class="section-content">
<div class="top">
<div class="left">
<h1>Actualizar contactos</h1>
<div class="date">
<input type="date" name="date" id="date">
</div>
</div>
<div class="right">
<div class="theme-toggler">
<span class="material-icons-sharp active">light_mode</span>
<span class="material-icons-sharp">dark_mode</span>
</div>
</div>
</div>
<div>
<form class="w-25 my-5" action="" method="POST" id="getNidForm">
<select class="form-select form-select-lg mb-3" aria-label=".form-select-lg example" name="getNid">
<?php
if(isset($agenda)){
echo '
<option value="noSel" selected disabled>Selecciona un DNI</option>
';
foreach($agenda as $key => $value) {
echo '
<option value='.$key.'>'.$key.'</option>
';
}
} else {
echo '
<option value="noSel" selected disabled>No hay DNIs</option>
';
}
?>
</select>
<input type="hidden" name="hiddenInputReg" value='<?php echo htmlspecialchars(encodeData($agenda)); ?>'>
<button type="submit" name="getNidSubmit" class="btn btn-block btn-lg gradient-custom-4 text-body custom-btn">Seleccionar</button>
</form>
<?php
if(isset($_POST['getNid'])) {
foreach($agenda as $key => $val) {
if($_POST['getNid'] === $key) {
echo '
<form class="my-5" action="" method="POST" enctype="multipart/form-data" id="updForm">
<div class="form-group">
<h2 class="heading">Registrar</h2>
<div class="form-floating mb-4">
<input type="text" class="form-control form-control-lg" name="updateNid" value="'.$key.'">
<label for="updateNid">DNI</label>
</div>
<div class="form-floating mb-4">
<input type="text" class="form-control form-control-lg" name="updateName" value="'.$agenda[$key]['nombre'].'">
<label for="updateName">Nombre</label>
</div>
<div class="form-floating mb-4">
<input type="text" class="form-control form-control-lg" name="updateSurname" value="'.$agenda[$key]['apellidos'].'">
<label for="updateSurname">Apellidos</label>
</div>
<div class="form-floating mb-4">
<input type="email" class="form-control form-control-lg" name="updateEmail" value="'.$agenda[$key]['correo'].'">
<label for="updateEmail">Email</label>
</div>       
<div class="form-floating mb-4">
<input type="tel" class="form-control form-control-lg" name="updatePhone" value="'.$agenda[$key]['telefono'].'">
<label for="updatePhone">Phone</label>
</div>
<div class="form-floating mb-4">
<input type="text" class="form-control form-control-lg" name="updateBirth" value="'.$agenda[$key]['fechaNacimiento'].'">
<label for="updateBirth">Fecha de nacimiento</label>
</div>
<div class="mb-4" style="width: 22rem;">
<label for="updateFile">Selecciona una foto<span class="text-danger">*</span></label>
<input type="file" class="form-control form-control-lg" name="updateFile"/>
</div>
</div>
<div class="form-group">
<div class="grid">
<input type="hidden" name="hiddenInputReg" value="'.htmlspecialchars(encodeData($agenda)).'">
<button type="submit" class="btn custom-btn" name="updSubmit" value="update">Actualizar</button>
</div>  
</div>
</form>
';
}
}
}
?>
</div>
</div>
</main>
</div>

这是模块.pp:

<?php
function getLocalTime($mode) {
date_default_timezone_set('Atlantic/Canary');
if($mode === 'datetime') {
return date("d-m-Y H:i:s a");
}
return date("d/m/Y");
}
function encodeData($data) {
return json_encode($data);
}
function decodeData() {
return json_decode($_POST['hiddenInputReg'], true);
}
function cleanData($data) {
$data = trim($data);
$data = stripslashes($data);
// $data = htmlspecialchars($data);
return $data;
}
function addData(&$data) {
$date = getLocalTime('datetime');
if(!in_array($_POST['regNid'], $data) || empty($data)) {
$data[$_POST['regNid']]['nombre'] = cleanData($_POST['regName']);
$data[$_POST['regNid']]['apellidos'] = cleanData($_POST['regSurname']);
$data[$_POST['regNid']]['correo'] = cleanData($_POST['regEmail']);
$data[$_POST['regNid']]['telefono'] = cleanData($_POST['regTel']);
$data[$_POST['regNid']]['fechaNacimiento'] = cleanData($_POST['regBirth']);
$data[$_POST['regNid']]['fechaInsercion'] = $date;
$data[$_POST['regNid']]['bloqueado'] = false;
$data[$_POST['regNid']]['ficheros'] = [];
}
return;
}
function updateData(&$data) {
$data[$_POST['updateNid']]['nombre'] = cleanData($_POST['updateName']);
$data[$_POST['updateNid']]['apellidos'] = cleanData($_POST['updateSurname']);
$data[$_POST['updateNid']]['correo'] = cleanData($_POST['updateEmail']);
$data[$_POST['updateNid']]['telefono'] = cleanData($_POST['updatePhone']);
$data[$_POST['updateNid']]['fechaNacimiento'] = cleanData($_POST['updateBirth']);
$data[$_POST['updateNid']]['ficheros'][] = cleanData($_FILES['updateFile']['name']);
}
function setBlock(&$data) {
$data[$_POST['block']]['bloqueado'] = !$data[$_POST['block']]['bloqueado'];
}
?>

可能有一些垃圾代码(一些打印或一些不必要的部分),因为我刚刚解决了它,所以我更喜欢直接上传我所拥有的。

除了将hiddenInputReg放在其他形式或表中(数据更改的地方)之外,关键是调用htmlspecialchar()函数,包装hiddenInputReg的encodeData();理论上不在";updSubmit()"形式(在回声中)导致$agenda数组数据看起来是"0";空";在updateData()函数中,当然是因为引号的原因,它用htmlspecialchar()为我解决了这个问题,我也把它放在了其他encodeData()中以防万一,但我认为删除除了echos中的所有内容,它应该没问题。

最新更新