Что такое хороший способ для отображения данных формы на последней странице, используя шаблон PRG

Я хотел бы использовать шаблон PRG для предотвращения повторной отправки формы, потому что отправка включает в себя отправку почты. Проблема с этим подходом состоит в том, что я, кажется, не нахожу «право» способ показать пользователю, какие данные были отправлены после перенаправления. В настоящее время я делаю что-то вроде:

Некоторая страница с формой (index.html)

<form action="handleform.php" method="post">
<input type="text" name="name" placeholder="Name" required />
<input type="text" name="tel" placeholder="Telephone" />
<input type="email" name="mail" placeholder="E&#8209;Mail" required />

<!-- and more input fields -->
</form>

Какой-то скрипт handleform.php который обрабатывает данные формы

<?php
$data[0] = filter_var(INPUT_POST, "name", FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$data[1] = filter_var(INPUT_POST, "tel", FILTER_SANITIZE_NUMBER_INT);
$data[2] = filter_var(INPUT_POST, "mail", FILTER_VALIDATE_EMAIL);

// process rest of data and create mail

$mail->Body = getNiceHTML($data);

$mail->send();
header("Location: formhandled.php?id=" . urlencode($mail->Body));
exit();
?>

и сценарий страницы formhandled.php показать на успех

<!-- header and menu html -->

<?php
echo $_GET["id"];
?>

<!-- footer html -->

Проблема с этим подходом заключается в том, что мне пришла в голову мысль, что это выставляет все введенные данные в URL и, таким образом, может быть слишком уязвимым. Кроме того, HTML-строка делает URL-адрес довольно длинным. Я мог бы подумать о двух других подходах, чтобы решить мою проблему

  1. Сохраните строку во (временном) файле и передайте имя файла, но затем мне нужно будет найти способ удалить эти файлы после того, как я оставил formhandled.php для того, чтобы эта информация оставалась на сервере дольше, чем необходимо.
  2. Начать сеанс Основная проблема этого подхода заключается в том, что я мог отображать данные только в том случае, если пользователь не отключил файлы cookie (если я правильно понял).

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

Поэтому мой вопрос: как отобразить введенные данные формы после перенаправления?

1

Решение

Есть два способа передачи этих данных:

  1. Транспортируйте его на клиентскую сторону, что в случае перенаправления означает через URL или, возможно, куки.
  2. Транспортируйте его на сервер, то есть сервер сохраняет данные и снова получает их на следующей странице.

Вы уже почти поняли это. Транспортировать его на стороне клиента действительно немного противно; вы действительно не хотите помещать всю эту информацию в URL (не из-за «уязвимостей», не возникает проблем с простой печатью данных с URL на экран), и вы не захотите просто устанавливать куки за это.

Лучшее решение это в значительной степени:

  1. сервер хранит данные в кратковременном месте автоматической очистки с уникальным идентификатором
  2. вы отправляете уникальный идентификатор через URL как параметр запроса
  3. Вы извлекаете данные из кратковременного местоположения с помощью идентификатора, отображаете их, а затем отбрасываете

Теперь, что можно квалифицировать как хорошее краткосрочное хранилище для этого? Сессии были бы хорошими, и вы могли бы транспортировать идентификатор сессии через URL вместо куки. Это, вероятно, самое простое решение со встроенными инструментами PHP. В качестве альтернативы что-то вроде Redis хранилище или подобное хранилище в памяти было бы очень полезно для случаев, подобных этому; но может быть излишне устанавливать только для этой цели. Если вы уже используете базу данных, вы можете хранить данные там.

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]