Как предотвратить диалоговое окно «Подтверждение повторной отправки формы»? - PullRequest
20 голосов
/ 26 июля 2011

Как очистить информацию в форме после отправки, чтобы она не отображала эту ошибку после обновления страницы?

См. Изображение (из хрома):

Диалог имеет текст:

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

Я хочу, чтобы это диалоговое окно не отображалось.

Ответы [ 7 ]

18 голосов
/ 26 июля 2011

Редактировать: Прошло несколько лет с тех пор, как я первоначально разместил этот ответ, и, хотя я получил несколько голосов, я не очень доволен своим предыдущим ответом, поэтому я переделал его полностью.Надеюсь, это поможет.


Когда использовать GET и POST:

Один из способов избавиться от этого сообщения об ошибке - заставить вашу форму использовать GET вместо POST.Просто помните, что это не всегда подходящее решение (читайте ниже).

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

Примеры использованияPOST будет включать в себя:

  • Форма входа
  • Форма контакта
  • Форма отправки платежа
  • Что-то, что добавляет, редактирует или удаляетзаписи из базы данных
  • Загрузчик изображений (обратите внимание, что при использовании GET с полем <input type="file"> на сервер будет отправлено только имя файла, что в 99,73% времени не соответствует желаемому.)
  • Форма со многими полями (которая создаст длинный URL при использовании GET)

В любом из этих случаев вам не нужно, чтобы люди обновляли страницу и повторноотправка данных.Если вы отправляете конфиденциальную информацию, использование GET будет не только неуместным, это будет проблемой безопасности (, даже если форма отправляется AJAX ), поскольку конфиденциальный элемент (например, пароль пользователя) отправляется вURL и, следовательно, будет отображаться в журналах доступа к серверу.

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

Примеры могут включать:

  • Выполнение поиска в поисковой системе
  • Форма навигации для навигации повеб-сайт
  • Выполнение одноразовых действий с использованием одноразового или одноразового пароля (например, ссылки «отписаться» в электронном письме).

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

Если вы используете POST:

Мне кажется, что в большинстве случаев даже всплывающее диалоговое окно «Подтверждение повторной отправки формы» показывает, что существует недостаток дизайна.По самой природе POST, используемой для выполнения разрушительных действий, веб-дизайнеры должны препятствовать тому, чтобы пользователи когда-либо выполняли их более одного раза, случайно (или намеренно) обновляя страницу.Многие пользователи даже не знают, что означает этот диалог, и поэтому просто нажимают «Продолжить».Что, если это было после запроса «отправить платеж»?Оплата отправляется снова?

Так что вы делаете?К счастью, у нас есть шаблон проектирования Post / Redirect / Get .Пользователь отправляет POST-запрос на сервер, сервер перенаправляет браузер пользователя на другую страницу, а затем эта страница извлекается с помощью GET.

Вот простой пример использования PHP:

if(!empty($_POST['username'] && !empty($_POST['password'])) {
    $user = new User;
    $user->login($_POST['username'], $_POST['password']);

    if ($user->isLoggedIn()) {
        header("Location: /admin/welcome.php");
        exit;
    }
    else {
        header("Location: /login.php?invalid_login");
    }
}

Обратите внимание, что в этом примере, даже если пароль неверен , я все еще перенаправляю обратно в форму входа.Чтобы отобразить недопустимое сообщение для входа в систему пользователю, просто сделайте что-то вроде:

if (isset($_GET['invalid_login'])) {
    echo "Your username and password combination is invalid";
}
8 голосов
/ 26 июля 2011

Это не имеет ничего общего с вашей формой или значениями в ней.Он запускается браузером, чтобы пользователь не мог повторить тот же запрос с кэшированными данными.Если вам действительно нужно включить обновление страницы результатов, вам следует перенаправить пользователя либо через PHP (header('Location:result.php');), либо на другом языке, который вы используете на сервере.Решение с метатегами должно также работать для отключения повторной отправки при обновлении.

5 голосов
/ 26 июля 2011

После обработки страницы POST перенаправьте пользователя на ту же страницу.

Вкл. http://test.com/test.php

header('Location: http://test.com/test.php');

Это избавит от поля, так как обновление страницы не будетповторно отправьте данные.

2 голосов
/ 05 сентября 2018

Вы можете попробовать использовать вызовы AJAX с jQuery. Например, как YouTube добавляет ваш комментарий без обновления. Это устранит проблему с освежением в целом.

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

$.ajax({
    type: 'POST',
    url: 'ajax/comment-on-video.php',
    data: {
        comment: $('#idOfInputField').val();
     },
    success: function(obj) {
        if(obj === 'true') {
            //Some code that recreates the inserted comment on the page.
        }
    }
});

Теперь вы можете создать файл comment-on-video.php и создать что-то вроде этого:

<?php
    session_start();

    if(isset($_POST['comment'])) {
        $comment = mysqli_real_escape_string($db, $_POST['comment']);
        //Given you are logged in and store the user id in the session.
        $user = $_SESSION['user_id'];

        $query = "INSERT INTO `comments` (`comment_text`, `user_id`) VALUES ($comment, $user);";
        $result = mysqli_query($db, $query);

        if($result) {
            echo true;
            exit();
        }
    }
    echo false;
    exit();
?>
1 голос
/ 02 мая 2014

У меня была ситуация, когда я не мог использовать ни один из приведенных выше ответов.Мой случай включал работу со страницей поиска, где пользователи получали бы «подтверждение повторной отправки формы», если щелкнуть назад после перехода к любому из результатов поиска.Я написал следующий javascript, который обошел проблему.Это не очень удачное решение, так как оно немного странное и не работает на IE8 или более ранних версиях.Тем не менее, хотя это может быть полезно или интересно для тех, кто имеет дело с этой проблемой.

jQuery(document).ready(function () {

//feature test
if (!history)
    return;

var searchBox = jQuery("#searchfield");

    //This occurs when the user get here using the back button
if (history.state && history.state.searchTerm != null && history.state.searchTerm != "" && history.state.loaded != null && history.state.loaded == 0) {

    searchBox.val(history.state.searchTerm);

    //don't chain reloads
    history.replaceState({ searchTerm: history.state.searchTerm, page: history.state.page, loaded: 1 }, "", document.URL);

    //perform POST
    document.getElementById("myForm").submit();

    return;
}

    //This occurs the first time the user hits this page.
history.replaceState({ searchTerm: searchBox.val(), page: pageNumber, loaded: 0 }, "", document.URL);

});
0 голосов
/ 12 ноября 2017

Кажется, вы ищете шаблон Post/Redirect/Get.

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

Вы можете обработать и обработать результат обработки сразу, без POST подтверждающего предупреждения. Вам просто нужно манипулировать объектом истории браузера:

history.replaceState("", "", "/the/result/page")

См. полный или короткий ответы

0 голосов
/ 06 июня 2017

У меня была такая же проблема,

это сработало для меня,

echo("<script>location.href = 'http://localhost/pagename.html';</script>");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...