Я хотел бы использовать шаблон 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‑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-адрес довольно длинным. Я мог бы подумать о двух других подходах, чтобы решить мою проблему
formhandled.php
для того, чтобы эта информация оставалась на сервере дольше, чем необходимо.но я не понимаю, почему это было бы лучше / хуже. Я также не могу себе представить, что никто никогда не делал что-то подобное, но я не мог найти ничего о том, как эта проблема решается.
Поэтому мой вопрос: как отобразить введенные данные формы после перенаправления?
Есть два способа передачи этих данных:
Вы уже почти поняли это. Транспортировать его на стороне клиента действительно немного противно; вы действительно не хотите помещать всю эту информацию в URL (не из-за «уязвимостей», не возникает проблем с простой печатью данных с URL на экран), и вы не захотите просто устанавливать куки за это.
Лучшее решение это в значительной степени:
Теперь, что можно квалифицировать как хорошее краткосрочное хранилище для этого? Сессии были бы хорошими, и вы могли бы транспортировать идентификатор сессии через URL вместо куки. Это, вероятно, самое простое решение со встроенными инструментами PHP. В качестве альтернативы что-то вроде Redis хранилище или подобное хранилище в памяти было бы очень полезно для случаев, подобных этому; но может быть излишне устанавливать только для этой цели. Если вы уже используете базу данных, вы можете хранить данные там.
Какое бы решение вы ни выбрали, вы должны убедиться, что данные будут автоматически отброшены рано или поздно. Если по какой-либо причине пользователь не заходит на страницу перенаправления, временно сохраненные данные будут накапливаться на вашем сервере, чего вы хотите избежать. Сеансы автоматического сбора мусора, данные Redis могут быть очищены автоматически, а с базой данных вы можете запускать случайный запрос очистки с помощью различных механизмов.
Других решений пока нет …