Скасування повторної відправки форми
Мені часто ставлять запитання щодо скасування повторної відправки форми. Наприклад, Ви зробили форму додавання коментарів, додали обробник на цю ж сторінку. Потім при додаванні коментаря він успішно додається, але варто користувачеві натиснути 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"?
Ось так це робиться в простих скриптах. Та й, в складних, в кінцевому рахунку робиться те ж саме.
- Як динамічно отримувати коментарі з бази даних.
- Як зробити динамічне додавання коментарів, використовуючи ajax.
- Як зробити коментування на сайті
- Вийшла книга "створення сайту від початку і до кінця"
- Створення движка на mvc. Створюємо можливість додавання користувача в базу даних через адмін панель
- Відправка асинхронних запитів на jquery.
- Динамічне підвантаження даних для select
- Відправка post-запитів через jаvascript
- Тестування php-скриптів через curl
- Динамічне завантаження файлів на jquery
- Перевірка форми в jаvascript
- Відправка ajax-запиту на інший домен
- Обробка форми в php
- Робота з масивами в html-формі
- Робота з cookie в php
- Фільтр пошуку на php
- Капча на php
- Динамічна перевірка форми на jаvascript
- Whois і php
- Скрипт форми зворотного зв`язку
- Ajax запити за допомогою методів $ .post () і $ .get ().