Скасування повторної відправки форми

Скасування повторної відправки форми

Мені часто ставлять запитання щодо скасування повторної відправки форми. Наприклад, Ви зробили форму додавання коментарів, додали обробник на цю ж сторінку. Потім при додаванні коментаря він успішно додається, але варто користувачеві натиснути F5, як форма буде відправлена ​​ще раз. А F5 користувач може легко натиснути, якщо сторінка буде довго грузиться. У підсумку, замість 1-го коментаря буде цілих 2, а то і більше. У цій статті я покажу, як цього можна уникнути.

Для початку розберемо більш детально проблему на прикладі цього коду:

lt ;?php
if(!empty($ _POST["Sqr"])){
echo
"Квадрат числа ".$ _POST["X"]."Дорівнює".pow($ _POST["X"],2) -
}
?gt;

Натиснувши на кнопку "Піднести до квадрата", Ви побачите результат роботи скрипта. Але варто після цього користувачеві натиснути F5, як скрипт знову буде виконуватися. В даному випадку, це не так критично, як з додаванням коментарем, однак, навіщо потрібна зайва навантаження на сервер?

Відео: Разведопрос: Єгор Яковлєв про історичні фальшивки і проект "цифрова історія"




Тепер поговоримо про способи вирішення даної проблеми. Перший спосіб - виділити скрипт обробки в окремий файл. Тоді в атрибуті action у тега form треба додати шлях до цього скрипту. А сам скрипт повинен зберігати куди-небудь результат своїх дій, які змінні прийшли на скрипт, а після робити редирект назад. Загалом, дивіться код скрипта:

lt ;?php
session_start
() -
$ _SESSION
["X"]= $ _POST["X"] -
header
("Location:".$ _SERVER["HTTP_REFERER"]) -
exit-
?gt;

А код сторінки з формою тепер буде виглядати так:

lt ;?php
session_start
() -
if(isset($ _SESSION["X"])) echo "Квадрат числа ".$ _SESSION["X"]."Дорівнює".pow($ _SESSION["X"],2) -
}
?gt;



Недолік цього підходу очевидна - доводиться створювати ще один файл для такого простого скрипта. Тому розповідаю і про другий спосіб, як можна уникнути повторної відправки форми:

lt ;?php
session_start
() -
if(!empty($ _POST["Sqr"])){
$ _SESSION
["X"]= $ _POST["X"] -
header
("Location:".$ _SERVER["REQUEST_URI"]) -
exit-
}
if(isset($ _SESSION["X"])) echo "Квадрат числа ".$ _SESSION["X"]."Дорівнює".pow($ _SESSION["X"],2) -
?gt;

Тут обробка знову відбувається в цьому ж файлі, але ключова відмінність - це наявність редиректу на цю ж сторінку в кінці. В результаті, сторінка перевантажиться після відправки форми і браузер при натисканні F5 не пропонуватиме користувачеві відправити форму ще раз.

Відео: Блочний редактор і парсер DOM, дайджест оновлень Бітрікс, випуск # 3

Підведу підсумок того, як скасувати повторне надсилання форми:

  • або робити обробку в окремому файлі, а потім звідти робити редирект назад.
  • Або робити обробку в тому ж файлі, що і форма, але при цьому після обробки робити редирект на ту ж сторінку.

Відео: Як задати умови зміщення або видаляти нагадування в програмі "медобліку SQL"?

Ось так це робиться в простих скриптах. Та й, в складних, в кінцевому рахунку робиться те ж саме.

Поділися в соціальних мережах:

Схожі
Динамічна перевірка форми на jаvascriptДинамічна перевірка форми на jаvascript
Фільтр пошуку на phpФільтр пошуку на php
Обробка форми в phpОбробка форми в php
Тестування php-скриптів через curlТестування php-скриптів через curl
Як динамічно отримувати коментарі з бази даних.Як динамічно отримувати коментарі з бази даних.
Як зробити коментування на сайтіЯк зробити коментування на сайті
Відправка асинхронних запитів на jquery.Відправка асинхронних запитів на jquery.
Створення форм в htmlСтворення форм в html
Вийшла книга "створення сайту від початку і до кінця"Вийшла книга "створення сайту від початку і до кінця"
Ajax запити за допомогою методів $ .post () і $ .get ().Ajax запити за допомогою методів $ .post () і $ .get ().
» » Скасування повторної відправки форми