Как сохранять данные формы после отправки

от admin

Сохранение значений формы после отправки в PHP

Пусть у нас есть некоторая форма, отправляющаяся на текущую страницу:

Давайте сделаем так, чтобы после отправки введенные данные не пропадали из нашего инпута:

Такой подход, однако, не совершенен — при первом заходе на страницу PHP выдаст ошибку из-за того, что $_GET[‘test’] не существует.

Для решения проблемы добавим условие:

С помощью формы спросите город и страну пользователя. После отправки формы выведите введенные данные на экран. Сделайте так, чтобы введенные данные не пропадали из инпутов после отправки формы.

Значение по умолчанию

Пусть мы хотим сделать так, чтобы по при заходе на страницу в инпуте уже был какой-то текст. Пользователь может поредактировать этот текст, а может оставить его без изменения. А после отправки формы в инпуте должен остаться тот текст, который был на момент отправки.

Для решения этой задачи нам необходимо добавить блок else в наше условие и в этом блоке вывести значение по умолчанию:

С помощью формы спросите у пользователя год. После отправки определите, этот год високосный или нет. Сделайте так, чтобы при первом заходе на страницу в инпуте уже стоял текущий год.

Сократим код

Полученный нами код очень уж длинный. Давайте его сократим. Для начала вместо if используем тернарный оператор:

А теперь используем сокращенный вариант PHP скобки:

А теперь используем оператор ?? , который сократит код еще больше:

С помощью трех инпутов спросите у пользователя год, месяц и день. После отправки формы выведите на экран, сколько дней осталось от введенной даты до Нового Года. По заходу на страницу сделайте так, чтобы в инпутах стояла текущая дата.

Как сохранять данные в форме

Думаю, многие из Вас встречали сайты, где Вы полчаса заполняли какую-нибудь форму, затем у Вас была какая-то ошибка, и Вы возвращались обратно к форме, однако, все данные были стёрты. Чтобы так не бесить пользователей, надо обязательно позаботиться о сохранении данных в форме. И об этом я сегодня расскажу.

Начнём с самого простого, а именно с использования атрибута autocomplete:

Теперь браузер будет сохранять введённые ранее в эту форму данные. Однако, есть один нюанс. Это сохранение зависит от настроек браузера, и далеко не всегда, во-первых, сработает, а, во-вторых, сработает как надо. Поэтому я использую второй, более сложный, но и более надёжный способ.

Состоит он в том, что после передачи формы, все данные оттуда сохраняются в сессию, а при возврате обратно данные из сессии подставляются в форму. Например, вот такой PHP-скрипт всё это делает:

<?php
session_start();
$_SESSION[«name»] = $_POST[«name»];
$_SESSION[«email»] = $_POST[«email»];
header(«Location: «.$_SERVER[«HTTP_REFERER»]);
exit;
?>

И теперь HTML-код формы:

<form name=»myform» action=»request.php» method=»post»>
<input type=»text» name=»name» value=»<?=$_SESSION[«name»]?>» />
<input type=»text» name=»email» value=»<?=$_SESSION[«email»]?>» />
<input type=»password» name=»password» />
</form>

Вот так подставляются сохранённые данные в форму. Более того, Вы вправе выбирать, какие данные сохранять, а какие нет. Например, пароль сохранять однозначно не стоит, так же не стоит сохранять ввод капчи и другие аналогичные данные.

Таким образом, Вы теперь уже должны знать, как сохранять данные в форме.

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

Она выглядит вот так:

Комментарии ( 7 ):

при этом к $_SESSION следует добавлять хотя бы strip_tags

Лучше использовать Ajax при отправке данных с формы обработчику пхп(данные формы так и останутся на странице пользователя), иначе сохранение куков с важными данными у клиента может произвести к краже куков через уязвимости сайта, например с помощью XSS атаки.

Михаил, как вы считаете, что луше писать <?php echo $a; ?> или <?=$a?> ?

Здравствуйте Андрей. Пишите как Вам удобнее и как привыкли, разницы нет никакой, соответственно лучше или хуже быть ни то ни другое не может. И <?=$a?> этот вариант мне вообще не понятен. Возможно Вы имели ввиду: <? echo $a; ?>

Мне кажется, что было б лучше сделать так: $_SESSION["name"] = htmlspecialchares($_POST["name"]);

Подскажите, пожалуйста, возможно ли уже введенные данные в течении сессии сразу направить на конкертный e-mail?

В принципе, вот неплохая статья на эту тему, используя JavaScript и sessionStorage: https://blog.lisogorsky.ru/session-storage-save-data

Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.

Удобное сохранение значений форм в сессию в случае ошибок при добавлении информации

При отправке данных из форм на сервер, иногда требуется сохранить информацию введённую пользователем, затем после перезагрузки страницы восстановить все значения у формы и показать соответственно ошибки, которые помешали добавлению данных.

Для этого используют несколько разных инструментов

1. Данные сохраняются в куках, и при следующем показе формы достаются оттуда.
2. Пишется javascript, который не дает отправить форму пока не будут заполнены все неоходимые поля.
3. Данные сохраняются в сесиии.

Способ хранения данных в куках весьма ограничен размером сохраняющихся данных и в случае работы с большим текстом обязательно подведет. К тому же поддержка кук может быть отключена. Подойдет разве что подставить логин в поле авторизации, так как очень не надежен.

Javascript — это сила. C помощью него можно не только не дать данным отправиться, пока не будут заполнены все поля, что уменьшает вероятность потери данных, но и посылать данные вообще не перезагружая страницу, с помощью ajax. В этом случае данные не только не пропадут с экранов, напротив, часто стоит проблема какие действия принимать после отправки данных, чтобы эту форму убрать. Этот способ не потерять данные формы довольно надежный, но к сожалению не все браузеры его поймут. Например не все мобильники и смартфоны поодерживают javascript, а тем более ajax, так что им скорее всего не повезет, если забыть заполнить какое-то поле. Будут матюкаться, особенно если большой текст пропадет. А его на мобильнике писать — это не клавиатуре быстро набрать. Так что если кому и не повезет — то только тем, кто меньше всего этого хотелбы.

Сессии легко решают эту проблему — это самое надежное средство которое только можно использовать для сохранения данных формы в случае ошибки добавления. Но тут есть другая проблема, а именно реализация механизма, который позволит это легко сделать.

Читать:
Error snapshotting volumes disk2vhd как исправить

Способ сохранения данных в форме я использую довольно давно, но он мне всегда не нравился из-за масштабов получавшихся обработчиков. Форма из пяти шести полей всегда выходила мне в несколько мониторов кода. Так как проверок много, каждая требует сохранить ошибку, и если одни условия пройдены — это не значит что будут пройдены другие, а бывают случаи когда пользователю необходимо показать группу ошибок на одно поле, плюс сохранить данные, а еще другие поля ждут. Так же сильно раздувается и форма, там тоже нужно делать кучу проверок на существование ошибок, чтобы их показать, на существование сохраненной информации для каждого поля, нужно не забыть обработать данные от xss атак, вообщем тоже мало приятного. Из-за всех этих заморочек формы и обработчики аж не хочется порой писать, настолько нудное это дело.

Но писать форм приходилось много и каждую последующую форму приходилось упрощать. И так я упрощал то тех пор, пока меня не осенило как это правильно нужно делать.

Нужно просто привести все однотипные действия к общему знаменателю, обернуть каждое такое действие гибкой оболочкой, через которую будет удобно применить ее к любому полю, но так, чтобы при этом несколько последовательных форм имея одинаковые поля не забивали друг друга. Речь идет о текстовых полях, так как поставить чекбокс это мелочи, а вот потерять пусть даже небольшой параграф текста жутко неприятно.

И так, определим эти самые действия.
Начнем с обработчиков.

Сохранять данные в сессию требуется всегда с первого по последнее поле, потому как никогда не известно будут ошибки или нет. Вообщем предохраняемся, а так как обычно данные идут из массива $_POST, вполне логично брать их прямо оттуда.

// cохранение значения поля в сессию
function insert_value($key, $name)
<
if (isset($_POST[$name]))
<
if (!empty($_POST[$name]))
<
$_SESSION[$key . $name] = $_POST[$name];
>
>
>

$key — идентификатор формы, чтобы не было путаницы.
$name — имя поля, значение которого требуется сохранить.

Раз мы решили сохранять данные в сессию, то логично сохранять туда и ошибки добавления форм.

// занесение ошибок в сессию
function insert_error($key, $error)
<
$_SESSION[$key] = $error;
>

$key — здесь так же идентификатор формы, думаю больше об этом писать не стоит.
$error — ошибки (строка), вызванные в процессе проверки данных на корректность.

Если кому-то удобнее использовать для сохранения ошибок массив, а не строки, может легко переделать под себя добавив в функцию цикл преобразования массива в строку. Мне больше нравится без лишних действий.

Ну и самое главное в каждом обработчике — это в случае успешной проверки всех данных уничтожить весь тот мусор, который собрался в сессии в процессе выполнения скрипта.

// очистка сессии от мусора
function delete_value($key, $name)
<
if (isset($_SESSION[$key . $name])) unset($_SESSION[$key . $name]);
>
// очистка сессии от мусора
function delete_error($key)
<
if (isset($_SESSION[$key])) unset($_SESSION[$key]);
>

Переходим к формам.
Каждая форма должна содержать место под ошибки. Обычно это сверху формы, но при большой форме может быть еще и снизу.
Именно для таких мест следующая функция

// показ ошибок
function select_error($key)
<
if (isset($_SESSION[$key])) return $_SESSION[$key];
>

Ну и для вывода сохраненной информации в соответствующие поля последний штрих

// безопасное представление value поля
function select_value($key, $name)
<
if (isset($_SESSION[$key . $name])) return htmlspecialchars($_SESSION[$key . $name]);
>

Здесь лучше сразу учесть вопрос безопасности, и забыть о том, что кто-либо исполнит в вашей форме код раз и навсегда.

Вот в принципе и все, для примера я набросал небольшую формочку с простейшим обработчиком, который сохраняет данные полей и показывает ошибки.

<?php echo select_error(‘addpost’);?>

<?php echo select_value(‘addpost’, ‘smalltext’);?>

<?php echo select_value(‘addpost’, ‘bigtext’);?>

session_start();
include ‘function.php’;

$name = isset($_POST[‘name’]) ? trim($_POST[‘name’]) : »;
$smalltext = isset($_POST[‘smalltext’]) ? trim($_POST[‘smalltext’]) : »;
$bigtext = isset($_POST[‘bigtext’]) ? trim($_POST[‘bigtext’]) : »;

if (empty($name)) $error .= ‘Не указано имя
‘;
else insert_value(‘addpost’, ‘name’);

if (empty($smalltext)) $error .= ‘Не указан малый текст
‘;
else insert_value(‘addpost’, ‘smalltext’);

if (empty($bigtext)) $error .= ‘Не указан большой текст
‘;
else insert_value(‘addpost’, ‘bigtext’);

// контрольное условие
if (!empty($error))
<
// сохраняем ошибки заполнения формы
insert_error(‘addpost’, $error);
header(‘Location: form.php’); exit;
>
else
<
// в случае успешного прохождения формы
// обязательно очищаем сессию от ненужного мусора
delete_value(‘addpost’, ‘name’);
delete_value(‘addpost’, ‘smalltext’);
delete_value(‘addpost’, ‘bigtext’);
delete_error(‘addpost’);

И все функции я собрал в одном месте, включив их в каждый файл.
<?php

// сохранение value поля в сессию
function insert_value($key, $name)
<
if (isset($_POST[$name]))
<
if (!empty($_POST[$name]))
<
$_SESSION[$key . $name] = $_POST[$name];
>
>
>

// безопасное представление value поля
function select_value($key, $name)
<
if (isset($_SESSION[$key . $name])) return htmlspecialchars($_SESSION[$key . $name]);
>

// очистка сессии от мусора
function delete_value($key, $name)
<
if (isset($_SESSION[$key . $name])) unset($_SESSION[$key . $name]);
>

// занесение ошибок в сессию
function insert_error($key, $error)
<
$_SESSION[$key] = $error;
>

// показ ошибок
function select_error($key)
<
if (isset($_SESSION[$key])) return $_SESSION[$key];
>

// очистка сессии от мусора
function delete_error($key)
<
if (isset($_SESSION[$key])) unset($_SESSION[$key]);
>

Сохранение данных в форме при перезагрузки страницы

Есть форма фильтра в ней предоставляется выбор характеристик шин, по нажатию на кнопку подобрать, страница перезагружается и выдает соответствующий запрос, но в форме фильтра выбранное значение не отображается, Как отобразить текст в форме выбора после перезагрузки страницы?

Если для отправки формы используется POST то в свойство value нужных input вписать value='».$_POST[‘test’].»‘ где test — это name нужного input. Если используется GET — то $_GET[‘test’]

update: Если у вас используются select’ы то в месте где они генерируются необходимо дописать в тег option

Пример для вашего кода. (При условии что у вас не используется генератор для этой формы, шаблонизатор или ajax)

Виктор Жариков's user avatar

В вашем случае правильнее будет использовать асинхронные запросы (AJAX). Тогда вам не придется перезагружать страницу целиком, а можно будет только обновлять данные, которые пришли в запросе.

Если же у вас нет такой возможности, то можно возвращать значение фильтра в ответе на запрос.

Один из вариантов на чистом js. Данные формы можно сохранить в специальное хранилище браузера localStorage .

К сожалению здесь данный код запустить не удастся, поскольку песочница не работает с localStorage в целях безопасности.

Russell's user avatar

Отличная возможность сохранить данные, введённые в форму — через sessionStorage. Вот вполне достойная статья на эту тему:
https://blog.lisogorsky.ru/session-storage-save-data
Суть в следующем: при изменении содержимого любого input, записываем в Storage данные:
sessionStorage[«key»] = «value»;
При первоначальной загрузке страницы проверяем, есть ли в Storage эти данные. Если есть — значит они были введены и как раз был случай перезагрузки страницы. Извлекаем данные, проходя поля формы через forEach(e):
window.sessionStorage.getItem(e.name, e.value);

Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.3.11.43304

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Похожие статьи