Как предотвратить дублирование сообщений через обновление браузера?

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

<?php if( $_SERVER['REQUEST_METHOD']=='POST' ) { try { // write to database } catch($e) { // error reporting } } ?> 

Использование шаблона Post-Redirect-Get – перенаправление всегда после успешной отправки данных.

Нет, потому что если они нажмут кнопку обновления (или обратно / вперед, что угодно), браузер снова попытается выполнить POST. То, что вы хотите, это парадигма Post / Redirect / Get . Обратите внимание, что это предотвратит дублирование материалов только через навигацию. Если вы хотите предотвратить дублирование представлений от нескольких кликов отправки формы, вам нужно использовать javascript, чтобы отключить кнопку каким-то образом во время попытки публикации.

Некоторый код:

 <?php if ('POST' == $_SERVER['REQUEST_METHOD']) { //do processing //303 forces a GET request header("Location: thank-you-page", true, 303); exit; } else { //handle bad page visit. } ?> 

Я не вижу там никакого кода, который бы делал что-либо, чтобы различать первый пост и дублирующийся пост. То, что вам нужно сделать, – перенаправить браузер на другой URL-адрес после обработки POST, чтобы, если они нажимают обновление, они не обновляют цель формы и POSTing снова.

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

Добавьте одноразовый токен в свои формы и сохраните его в $_SESSION -переменный. Затем, если он используется (форма отправлена), удалите его из сеанса (или создайте новый токен). Если форма затем отправляется снова, два токена не совпадают, и у вас есть повторяющаяся запись (например, вы можете игнорировать вторую).