Перейти к содержимому

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

  • автор:

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

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

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

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

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

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

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

В случае несовпадения либо логина, либо пароля необходимо вывести форму авторизации с сообщением: “Неверный логин или пароль”. При этом в поля формы необходимо подставить данные, которые ввел пользователь ранее. Для этого в атрибуты “value” тегов “input” необходимо подставить данные, которые пришли из формы или подставлять пустые строки, если данных нет. Вспоминаем про замечательный тернарный оператор и используем его.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
 include $_SERVER['DOCUMENT_ROOT'] . '/include/success.php'; error_reporting(-1); $login = "admin"; $password = "12345"; $error = true; if(!empty($_POST)){ if($_POST['login'] === $login && $_POST['password'] === $password) { echo $message; } else { header('Location: http://task.manager/?login=yes'); echo "Неверный логин или пароль"; echo ''; } } ?>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
 html xmlns="http://www.w3.org/1999/xhtml"> head> meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> link href="styles.css" rel="stylesheet" /> title>Project - ведение списков/title> /head> body> div class="header"> div class="logo">img src="i/logo.png" width="68" height="23" alt="Project" />/div> div style="clear: both">/div> /div> table width="100%" border="0" cellspacing="0" cellpadding="0"> tr> td class="left-collum-index"> h1>Возможности проекта —/h1> p>Вести свои личные списки, например покупки в магазине, цели, задачи и многое другое. Делится списками с друзьями и просматривать списки друзей./p> /td> td class="right-collum-index"> div class="project-folders-menu"> ul class="project-folders-v"> li class="project-folders-v-active">span>Авторизация/span>/li> li>a href="#">Регистрация/a>/li> li>a href="#">Забыли пароль?/a>/li> /ul> div style="clear: both;">/div> /div>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
 if(isset($_GET['login']) AND $_GET['login']=='yes'){ echo '                '; } ?>
1 2 3 4 5 6 7 8 9 10 11
/td> /tr> /table> div class="footer">©  2018/nobr> Project./div> /body> /html>

94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Как очистить данные после отправки формы ?
Всем привет, давно уже болит такой вопрос, как очистить htm форму после отправки? Очистить форму.

Как обновить данные формы после отправки данных в БД ajax
Добрый день. Как обновить форму с комментариями, когда отправил данные через ajax в БД код JS.

Как обновить данные формы после отправки данных в БД ajax
Добрый день. Как обновить форму с комментариями, когда отправил данные через ajax в БД код JS.

576 / 514 / 253
Регистрация: 26.09.2010
Сообщений: 2,603

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
 if(isset($_GET['login']) AND $_GET['login']=='yes'){ ?> div class="index-auth"> form method="POST" action="index.php"> table width="100%" border="0" cellspacing="0" cellpadding="0"> tr> td class="iat">Ваш e-mail: br /> input id="login_id" size="30" name="login" value="$_GET['login'])) $_GET['login'];> ?>>" />td> tr> tr> td class="iat">Ваш пароль: br /> input id="login_id" size="30" name="password" value="$_GET['login'])) $_GET['password'];> ?>>"/>td> tr> tr> td>input type="submit" name="send"/>td> tr> table> form> div>  } ?>

Добавлено через 1 минуту
лучше конечно сделать ajax, и данные передавать используя $_POST
Смотрю книгу вижу фигу
32 / 23 / 11
Регистрация: 12.11.2016
Сообщений: 97

Otisfrost, надеюсь правильно понял задачу

Когда данные обрабатываются в одном файле с формой

Кликните здесь для просмотра всего текста

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
 include $_SERVER['DOCUMENT_ROOT'] . '/include/success.php'; error_reporting(-1); $login_check = "admin"; $password_check = "12345"; $status = 'no'; $login = $password = $error = null; if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['send'])) { if (!empty($_POST['login'])) { $login = $_POST['login']; if (!empty($_POST['password'])) { $password = $_POST['password']; if ($login === $login_check && $password === $password_check) { $status = 'yes'; } else { $error = 'Неверный логин или пароль'; } } else { $error = 'Введите Ваш пароль'; } } else { $error = 'Введите Ваш логин'; } } ?>

Кликните здесь для просмотра всего текста

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
 html xmlns="http://www.w3.org/1999/xhtml"> head> meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> link href="styles.css" rel="stylesheet" /> title>Project - ведение списковtitle> head> body> div class="header"> div class="logo">img src="i/logo.png" width="68" height="23" alt="Project" />div> div style="clear: both">div> div> table width="100%" border="0" cellspacing="0" cellpadding="0"> tr> td class="left-collum-index"> h1>Возможности проекта —h1> p>Вести свои личные списки, например покупки в магазине, цели, задачи и многое другое. Делится списками с друзьями и просматривать списки друзей.p> td> td class="right-collum-index">  if (isset($status) && $status === 'no') { ?> div class="project-folders-menu"> ul class="project-folders-v"> li class="project-folders-v-active">span>Авторизацияspan>li> li>a href="#">Регистрацияa>li> li>a href="#">Забыли пароль?a>li> ul> div style="clear: both;">div> div> div class="index-auth"> form method="POST" action="$_SERVER['REQUEST_URI']; ?>"> table width="100%" border="0" cellspacing="0" cellpadding="0"> tr> td class="iat">Ваш e-mail: br /> input id="login_id" size="30" name="login" value="$login; ?>" />td> tr> tr> td class="iat">Ваш пароль: br /> input id="login_id" size="30" name="password" value="$password; ?>" />td> tr> tr> td> if (!empty($error)) echo $error; ?>td> tr> tr> td>input type="submit" name="send"/>td> tr> table> form> div>  } else { ?> div class="project-folders-menu"> ul class="project-folders-v"> li>a href="#">Выходa>li> ul> div style="clear: both;">div> div>  } ?> td> tr> table> div class="footer">© nobr>2018nobr> Project.div> body> html>

Когда обработка данных с формы в другом файле

Кликните здесь для просмотра всего текста

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
 html xmlns="http://www.w3.org/1999/xhtml"> head> meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> link href="styles.css" rel="stylesheet" /> title>Project - ведение списковtitle> head> body> div class="header"> div class="logo">img src="i/logo.png" width="68" height="23" alt="Project" />div> div style="clear: both">div> div> table width="100%" border="0" cellspacing="0" cellpadding="0"> tr> td class="left-collum-index"> h1>Возможности проекта —h1> p>Вести свои личные списки, например покупки в магазине, цели, задачи и многое другое. Делится списками с друзьями и просматривать списки друзей.p> td> td class="right-collum-index">  if (isset($_GET) && $_GET['login'] !== 'success') { ?> div class="project-folders-menu"> ul class="project-folders-v"> li class="project-folders-v-active">span>Авторизацияspan>li> li>a href="#">Регистрацияa>li> li>a href="#">Забыли пароль?a>li> ul> div style="clear: both;">div> div> div class="index-auth"> form method="POST" action="login.php"> table width="100%" border="0" cellspacing="0" cellpadding="0"> tr> td class="iat">Ваш e-mail: br /> input id="login_id" size="30" name="login" value="$login; ?>" />td> tr> tr> td class="iat">Ваш пароль: br /> input id="login_id" size="30" name="password" value="$password; ?>" />td> tr> tr>  if (isset($_GET)) { if ($_GET['login'] === 'empty') { ?> td>Введите Ваш логинtd>  } elseif ($_GET['password'] === 'empty') { ?> td>Введите Ваш парольtd>  } elseif ($_GET['login'] === 'error') { ?> td>Неверный логин или парольtd>  } ?>  } ?> tr> tr> td>input type="submit" name="send"/>td> tr> table> form> div>  } else { ?> div class="project-folders-menu"> ul class="project-folders-v"> li>a href="#">Выходa>li> ul> div style="clear: both;">div> div>  } ?> td> tr> table> div class="footer">© nobr>2018nobr> Project.div> body> html>

Файл login.php
Кликните здесь для просмотра всего текста

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
 include $_SERVER['DOCUMENT_ROOT'] . '/include/success.php'; error_reporting(-1); // получаем ссылку на сайт if (isset($_SERVER['HTTPS']) === '') { $site_url = 'https://' . $_SERVER['SERVER_NAME'] . '/'; } else { $site_url = 'http://' . $_SERVER['SERVER_NAME'] . '/'; } $login_check = "admin"; $password_check = "12345"; $login = $password = $error = null; if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['send'])) { if (!empty($_POST['login'])) { $login = $_POST['login']; if (!empty($_POST['password'])) { $password = $_POST['password']; if ($login === $login_check && $password === $password_check) { header('Location: ' . $site_url . '?login=success'); exit(); } else { header('Location: ' . $site_url . '?login=error'); exit(); } } else { header('Location: ' . $site_url . '?password=empty'); exit(); } } else { header('Location: ' . $site_url . '?login=empty'); exit(); } } else { header('Location: ' . $site_url); exit(); } ?>

Сохранение данных формы сразу после ввода?

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

  • Вопрос задан более трёх лет назад
  • 5475 просмотров

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

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

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

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

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

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

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

Способ сохранения данных в форме я использую довольно давно, но он мне всегда не нравился из-за масштабов получавшихся обработчиков. Форма из пяти шести полей всегда выходила мне в несколько мониторов кода. Так как проверок много, каждая требует сохранить ошибку, и если одни условия пройдены — это не значит что будут пройдены другие, а бывают случаи когда пользователю необходимо показать группу ошибок на одно поле, плюс сохранить данные, а еще другие поля ждут. Так же сильно раздувается и форма, там тоже нужно делать кучу проверок на существование ошибок, чтобы их показать, на существование сохраненной информации для каждого поля, нужно не забыть обработать данные от 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]);
>

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

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

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’);

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

// сохранение 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]);
>

Пользуйтесь на здоровье!

  • сессии
  • формы
  • сохранение данных формы
  • потеря данных формы

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *