每個人,
首先,很抱歉這個問題有點令人困惑。
問題是這樣的:幾天前我發布了另一個問題(這個問題),關于我們老師給我們的一個練習,它有點棘手,以某種方式來說,這項作業包括保存從表格收集的資料(幾個資料,實際上),在一個陣列中,然后能夠在不洗掉陣列中的其他資料的情況下修改它們。
正如我在上一篇文章中所說,不好的是我們不能使用會話、資料庫、檔案或本地存盤。
注意:我在一頁上完成所有操作,因為這是保存我找到的資料的最佳方式。
他告訴我們訣竅是使用 json_encode() 將資料傳遞到隱藏的輸入中,到目前為止一切正常,感謝上一篇文章的回答,我設法保存了多個用戶,只要NID 不在陣列中,但在我們必須更新資料的部分,一切都變得復雜起來。要更新資料,我做的第一件事是要求使用選擇/選項修改的人的 NID,但是當我提交選擇時,它會洗掉我在 $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 action="" method="POST" id="updForm">
<div >
<h2 >Registrar</h2>
<div >
<input type="text" name="updateNid" value="'.$_POST['getNid'].'">
<label for="updateNid">DNI</label>
</div>
<div >
<input type="text" name="updateName">
<label for="updateName">Nombre</label>
</div>
<div >
<input type="text" name="updateSurname">
<label for="updateSurname">Apellidos</label>
</div>
<div >
<input type="email" name="updateEmail">
<label for="updateEmail">Email</label>
</div>
<div >
<input type="tel" name="updatePhone">
<label for="updatePhone">Phone</label>
</div>
<div >
<input type="text" name="updateBirth"/>
<label for="updateBirth">Fecha de nacimiento</label>
</div>
<div style="width: 22rem;">
<label for="registerPic">Selecciona una foto<span >*</span></label>
<input type="file" name="updateFile" />
</div>
</div>
<div >
<div >
<button type="submit" name="sub-update" value="update">Actualizar</button>
<input type="hidden" name="hiddenInputUpdate" value='.encodeData($newAgenda).'>
</div>
</div>
</form>
';
}
}
?>
</div>
</div>
</main>
</div>
這是 modules.php:
<?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() 函式,但我更愿意將它添加到帖子中以防萬一。
總而言之,我想要實作的是,即使我在 #getNidForm 或 #updForm 上提交,也要保留使用 #regForm 添加的資料。
uj5u.com熱心網友回復:
最后,它就像使用相同的隱藏輸入 #regForm 傳遞每個表單中的資料一樣簡單;您還需要更改條件 (isset()),同時考慮提交按鈕(regSubmit、updSubmit 或 blockSubmit),因為每個按鈕都使用不同的函式,例如 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 action="" method="POST" enctype="multipart/form-data" id="updForm">
<div >
<h2 >Registrar</h2>
<div >
<input type="text" name="updateNid" value="'.$key.'">
<label for="updateNid">DNI</label>
</div>
<div >
<input type="text" name="updateName" value="'.$agenda[$key]['nombre'].'">
<label for="updateName">Nombre</label>
</div>
<div >
<input type="text" name="updateSurname" value="'.$agenda[$key]['apellidos'].'">
<label for="updateSurname">Apellidos</label>
</div>
<div >
<input type="email" name="updateEmail" value="'.$agenda[$key]['correo'].'">
<label for="updateEmail">Email</label>
</div>
<div >
<input type="tel" name="updatePhone" value="'.$agenda[$key]['telefono'].'">
<label for="updatePhone">Phone</label>
</div>
<div >
<input type="text" name="updateBirth" value="'.$agenda[$key]['fechaNacimiento'].'">
<label for="updateBirth">Fecha de nacimiento</label>
</div>
<div style="width: 22rem;">
<label for="updateFile">Selecciona una foto<span >*</span></label>
<input type="file" name="updateFile"/>
</div>
</div>
<div >
<div >
<input type="hidden" name="hiddenInputReg" value="'.htmlspecialchars(encodeData($agenda)).'">
<button type="submit" name="updSubmit" value="update">Actualizar</button>
</div>
</div>
</form>
';
}
}
}
?>
</div>
</div>
</main>
</div>
這是 modules.php:
<?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 放在其他表格或表中,這是資料發生變化的地方,是呼叫 htmlspecialchars() 函式,包裝 hiddenInputReg 的 encodeData(); 理論上,不以“updSubmit()”形式(在回顯中)添加此函式會導致 $agenda 陣列資料在 updateData() 函式中看起來為“null”,肯定是因為引號和 htmlspecialchars( ) 它為我解決了它,我也把它放在另一個 encodeData() 中以防萬一,但我認為洗掉除了回聲之外的所有內容,它應該可以正常作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/535690.html
標籤:PHPJSON形式
