Перезагрузить / обновить страницу в браузере без повторной отправки формы? - PullRequest
4 голосов
/ 03 ноября 2011

У меня есть форма на странице php, которая отправляется на ту же страницу. Я заметил, что если я перезагружаю / обновляю страницу, форма снова отправляется. Как мне написать код, чтобы избежать этого самым простым способом?

Ответы [ 3 ]

3 голосов
/ 04 ноября 2011

Одной из возможностей является реализация подхода post-redirect-get.

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

$page = 'show_result.php';
header('Location: '.$page, true, 303);
exit;

При этом браузер покажет «show_result.php».page (запрос GET) вместо страницы, запрашиваемой с помощью POST.Это также страница, которая добавляется в историю, поэтому при обновлении и использовании кнопки «назад» никогда не будет выполнен другой запрос POST.В качестве приятного побочного эффекта вы избавляетесь от предупреждений браузера о повторной отправке данных, обычно пользователь в любом случае не может решить, что делать дальше.

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

2 голосов
/ 04 ноября 2011

Это предполагает много вещей, но, возможно, это то, что вы ищете:

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;
    }
}
0 голосов
/ 04 ноября 2011

Согласно стандарту 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';
?>  
...