#php #json #forms
#php #json #формы
Вопрос:
У меня проблема с тем, как работает мой скрипт. Что должно произойти: когда форма загружается, она считывает последние использованные данные из файла .json и заполняет поля. Это работает, но при отправке новых данных форма заполняется старыми данными, а не новыми данными.
Первая часть считывает файл JSON и создает форму
<?php $old = json_decode((file_get_contents(dirname(__FILE__)."/json.json")), true); ?>
<!--Building the form-->
<table>
<form action="edit.php" method="POST">
<label for="time">Time:</label>
<input type="text" name="time" id="time" value="<?php echo ($old['time']); ?>"></input>
<br />
<label for="event">Event:</label>
<input type="text" name="event" id="event" value="<?php echo ($old['event']); ?>"></input>
<br />
<label for="event">Notes:</label>
<input type="textarea" name="notes" id="notes" value="<?php echo ($old['notes']); ?>"></input>
<br />
<input type="submit" name="task" value="Go" />
<input type="submit" name="task" value="Clear" />
</form>
В следующем разделе решается, что делать, если нажата кнопка очистить
<?php if ($_POST['task'] == 'Clear'){
$time = '';
$event = '';
$notes = '';
$remainingtime = '';
$task = 'clear';}
else {
?>
Этот последний раздел заполняет новый массив и сохраняет его как файл JSON.
<?php if ($old['time'] != $_POST['time']){
$time = preg_replace("/[^0-9]/","",$_POST['time']);
$remainingtime = ((microtime()) ($timein*60)*1000);
$task = 'countdown';}
else {
$remainingtime = $old['time'];
}
$event = $_POST['event'];
$notes = $_POST['notes'];
$remainingtime = '';
$task = 'display';
}
$new = array ('time' => $time, 'event' => $event,'notes' => $notes , 'remainingtime' => $remainingtime , 'task' => $task);
file_put_contents((dirname(__FILE__).'/json.json'), json_encode($new));
}
?>
При повторном нажатии кнопки очистить форма очищается, а файл JSON очищается.
При нажатии кнопки Go форма и файл JSON чередуются между отправкой новой формы и тем, что находится в файле JSON.
Любая помощь будет признательна.
ПРИМЕЧАНИЕ Сравнение времени не работает в моем текущем коде
Ответ №1:
Вы говорите, что «этот последний раздел» делает экономию. Если вы загружаете данные в верхней части страницы и сохраняете их внизу, после того, как вы сгенерировали форму, всегда будут отображаться старые данные, потому что это то, что вы загрузили. Вы не обновляете файл до тех пор, пока не загрузите старые данные и не отобразите их.
Чтобы исправить это, измените свой код на основе этой базовой структуры:
load data
display form using old data
decide what to do if the clear button is pressed
populate the new array
save the new array as the json file
к этому:
decide what to do if the clear button is pressed
if there's new data:
populate the new array
save the new array as the JSON file
otherwise, load the old data
display form using the data (whether it's new or old
Кстати, ваше сравнение с $post['time']
не имеет смысла. Код, которым вы поделились, не определяет $post
(что не то же самое, что суперглобальный $_POST
, но сбивает с толку).
Комментарии:
1. Спасибо @ed-cotterll, это была логическая ошибка с моей стороны.
2. @JonathanBishop Рад помочь! Пожалуйста, не забудьте принять ответ, если он показался вам полезным.
3. Поэтому я изменил порядок и поставил if isset в поле to, чтобы предотвратить очистку файла json при начальной загрузке страницы. Еще раз спасибо @ed
4. Спасибо. Изменение порядка операций исправило это, и спасибо, что указали на ссылку $post, которая теперь рассматривает аргумент сравнения времени.
Ответ №2:
Ваша проблема в том, что $_POST
данные все еще присутствуют. Если вы повторно отправите форму, старые данные будут вставлены еще раз. Что вам нужно будет сделать, это перенаправить страницу после записи данных вашей формы в ваш файл json.
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
switch ($_POST['action']) {
case 'Clear':
// Do clear stuff
break;
case 'Go':
default:
// Do go stuff
break;
}
// Redirect
header("Location: ".$_SERVER['REQUEST_URI']);
exit;
}