Вот объяснение проблемы ...
Нажатие на кнопку «отправить» в форме отправляет запрос на веб-сервер, который включает в себя все данные, введенные в форму. Не только URL, но и данные формы являются частью запроса, и этот запрос запоминается браузером. Если пользователь нажимает «обновить», браузер повторяет запрос, снова отправляя те же данные формы URL и на веб-сервер.
Но формы могут быть отправлены двумя разными способами, GET или POST, в зависимости от атрибута «method» тега «form». Существует соглашение, что запрос GET не имеет побочных эффектов; он только выбирает данные, но не вносит никаких изменений в базу данных. С другой стороны, если запрос изменяет данные, он всегда должен использовать запрос POST. Как я уже сказал, это всего лишь условные обозначения, и между ними нет особых технических различий, но очень важное различие заключается в том, что браузеры будут предупреждать пользователя, если они попытаются повторить POST - при нажатии кнопки «обновить» появится диалоговое окно. предупреждение пользователя о том, что это может привести к повторению операции, и подтверждение того, что он действительно хочет повторить отправку. Браузер не показывает это подтверждение при обновлении запроса GET.
Использует ли ваша форма метод GET, как подозревает @mk? Если это так, то изменение его на POST является самым простым решением, поскольку это будет по крайней мере означать, что пользователь будет предупрежден, если попытается обновить.
Но лучшим решением является идиома POST + REDIRECT + GET, предложенная @cletus. Это разделяет обновление базы данных (POST) и представление (GET) на две операции. Нажав на кнопку «Обновить» в браузере, вы просто повторяете GET, который не имеет побочных эффектов.