2010-11-16 1 views
4

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

  1. пользователя входа в веб-сайт - ХОРОШО
  2. Пользователь представлен форме представить текст комментария - ХОРОШО
  3. Пользователь вводит текст комментария и представляет - ХОРОШО
  4. У меня есть рутинный, который дезинфицирует комментарий & сохраните его в MySQL (с идентификатором пользователя, textcomment, datetime stamp) & откройте пользователя, чтобы его комментарий был введен - OKAY
  5. Пользователь решает обновить браузер - вводится двойной комментарий - BAD!

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

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

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

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

ответ

4

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

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

This question on SO рассказывает, как вы перенаправляете с помощью php.

+0

Извините мое невежество что вы подразумеваете под перенаправлением? – Jorge

+0

@Jorge Я обновил свой ответ. –

+0

Редирект: он отправляет HTTP-статус 302. Ознакомьтесь с документацией PHP для метода заголовка: http://php.net/manual/en/function.header.php - выполните поиск по «Location:» – Thilo

1

Вам необходимо ввести Post/Redirect/Get pattern.

+0

К сожалению, я используя apache_mod_rewrite для большинства страниц, поэтому отображение GET на результирующей странице не является вариантом. В противном случае я сломаю mod_rewrite rulest, я думаю, – Jorge

+0

Это совершенно не зависит от шаблона. Просто позаботьтесь о том, чтобы вы перенаправляли правильный URL – AndreKR

0

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

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

+0

Я могу согласиться с вашим Вариантом4, к сожалению, я не использую переменные SESSION в это время, и не желательно добавлять дополнительные таблицы SQL в это время, чтобы сохранить эти значения ни – Jorge

0

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

-4

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

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); 
    } 

} 
+3

thats nasty !!!! –

4

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

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

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

+3

Эта донная работа - данные хранится в браузере и отключает его не поможет (я бы хотел, чтобы ... перенаправление означало время ...) –

+0

Fo r me снятие пост-данных сразу после успешного входа в систему делает трюк. И если пользователь перейдет на один шаг назад в истории браузера, данные теряются и не могут быть найдены браузером. Работа выполнена ;) – Snickbrack

Смежные вопросы