Будут ли следующие остановки случайных дубликатов записей в моей базе данных, если пользователь отправляет форму и затем нажимает кнопку обновления браузера?
<?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
-переменный. Затем, если он используется (форма отправлена), удалите его из сеанса (или создайте новый токен). Если форма затем отправляется снова, два токена не совпадают, и у вас есть повторяющаяся запись (например, вы можете игнорировать вторую).