У меня есть форма на странице php, которая отправляется на ту же страницу. Я заметил, что если я перезагружаю / обновляю страницу, форма будет повторно отправлена. Как код, чтобы избежать этого самым простым способом?
Одна из возможностей – реализовать подход post-redirect-get.
Проще говоря, запрос POST никогда не будет доставлен в браузер. Вместо этого вы выполняете все необходимые действия и сохраняете необходимую информацию в сеансе, а затем вы делаете перенаправление с кодом 303.
$page = 'show_result.php'; header('Location: '.$page, true, 303); exit;
В этом случае браузер отобразит страницу «show_result.php» (запрос GET) вместо страницы, запрошенной с помощью POST. Это также страница, добавленная в историю, поэтому обновление и использование кнопки «Назад» никогда не будут выполнять другой запрос POST. Как хороший побочный эффект, вы избавляетесь от предупреждений браузера о пересылке данных, обычно пользователь не может решить, что делать, так или иначе.
Я думаю, что самая большая проблема с этим подходом заключается в том, что вам нужен сеанс для хранения сообщений об ошибках, что означает, что вам приходится полагаться на файлы cookie. Если вы не переадресовываете отображение ошибок, браузер покажет предупреждение о пересылке данных.
Это предполагает много вещей, но, возможно, это то, что вы ищете:
if ($_POST) { $success = false; /* * if all goes OK managing POST data make $success = true; * */ if ($success) { // this will redirects to your original // form's page but using GET method // so re-submitting will be no possible header("location: {$_SERVER['PHP_SELF']}"); exit; } }
Согласно стандарту HTTP, вы должны сделать браузер, чтобы выполнить запрос GET после отправки POST.
Вот пример эскиза для обработки формы:
<? if ($_SERVER['REQUEST_METHOD']=='POST') { $err = array(); //performing all validations and raising corresponding errors if (empty($_POST['name']) $err[] = "Username field is required"; if (empty($_POST['text']) $err[] = "Comments field is required"; if (!$err) { //if no errors - saving data and redirect header("Location: ".$_SERVER['PHP_SELF']); exit; } else { // all field values should be escaped according to HTML standard foreach ($_POST as $key => $val) { $form[$key] = htmlspecialchars($val); } } else { $form['name'] = $form['comments'] = ''; } include 'form.tpl.php'; ?>