PHP очищает кеш браузера, чтобы избежать повторной отправки данных формы после обновления - PullRequest
5 голосов
/ 16 ноября 2010

Я разрабатываю приложение PHP-MySQL, которое позволяет зарегистрированным пользователям вводить текстовые комментарии. Проблема:

  1. Вход пользователя на веб-сайт - OKAY
  2. Пользователю предоставлена ​​форма для отправки текстового комментария - OKAY
  3. Пользователь вводит текстовый комментарий и отправляет - OKAY
  4. У меня есть процедура, которая очищает комментарий и сохраняет его в MySQL (с идентификатором пользователя, текстовым комментарием, отметкой даты и времени) и представляет пользователю, что его комментарий введен - OKAY
  5. Пользователь решает обновить браузер - вводится повторный комментарий - ПЛОХО!

Я думал 3 варианта:

  • ВАРИАНТ 1: Процедура, которая проверяет: последний раз пользователь оставлял комментарий, и если так, проверьте, является ли он дубликатом. Если дубликат, отобразится сообщение об ошибке.
  • ВАРИАНТ 2: Процедура, которая не позволяет пользователю публиковать сообщения слишком быстро. Так что в основном не допускайте публикации комментариев в течение 1 минуты или около того. Поэтому, если браузер обновлен, комментарий будет проигнорирован.
  • ВАРИАНТ 3: Управляйте кэшем браузера, чтобы очистить его содержимое, чтобы при обновлении дубликат не вводился.

Теперь, в контексте моего приложения, меня беспокоит OPTION 1 и OPTION 2 - производительность PHP-MySQL, поскольку у меня уже есть различные запросы на одной странице, которые отправляют / получают данные из баз данных. Таким образом, ВАРИАНТ 3 может быть нацелен на проблему по-другому.

Вопросы: если я выберу ВАРИАНТ 3, можно ли это считать лучшей практикой? что означает очистка кэша браузера - лучшее и наиболее эффективное решение? Я читал, что есть последствия тоже? ваши мысли ценятся!

Ответы [ 6 ]

4 голосов
/ 07 апреля 2012

Просто сбросьте опубликованную переменную после того, как вы вставили ее в базу данных

<?php
    if(isset($_POST["comment"])){
        //store in the database
        //on successful storage
        unset($_POST["comment"]);
    }
?>

Таким образом, значение не будет опубликовано, когда пользователь обновит страницу ...

4 голосов
/ 16 ноября 2010

Просто сделайте редирект после отправки данных в базу данных.Это обычная практика.

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

Этот вопрос о SO рассказывает, как вы перенаправляете с php.

1 голос
/ 16 ноября 2010

Вам необходимо реализовать шаблон Post / Redirect / Get .

0 голосов
/ 17 февраля 2011

Я нашел новый способ попробовать это.

   function PreventResendData($invalidpage='index.php'){

    if(   $_POST && !is_array( $_SESSION['post_var'] )   ) {

        $_SESSION['post_var'] = $_POST;
        header('location:'.$_SERVER['PHP_SELF']);

    }
    else if($_SESSION['post_var'])
    {
        $_POST = $_SESSION['post_var']; 
        $_SESSION['post_var'] = '';
    }
    else
    {
        header("location:".$invalidpage);
    }

}
0 голосов
/ 16 ноября 2010

После ввода данных в базу данных перенаправить страницу, используя заголовок или location.href

0 голосов
/ 16 ноября 2010

Я бы использовал вариант 4: использовать одноразовый токен формы, который аутентифицирует запрос формы. Если запрос был успешным, аннулируйте токен.

При этом даже возврат к форме после перенаправления не позволит ей отправить форму снова. Кроме того, это также усложнит CSRF-атаки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...