[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Защита формы от повторной отправки
Страницы: 1, 2
AllesKlar
Цитата (VeRTak @ 26.04.2017 - 12:56)
Отработал скрипт, далее redirect. Попали на страницу какую нужно, уже с пустым постом. Что не так? Или я где то не так понимаю

При такой структуре у тебя должно быть три скрипта (или логических блока, не суть важно)
1. - Форма
2. - Обработчик формы
3. - Обязательный скрипт-приемник, куда нужно будет прыгнуть, дабы убить POST

Для чего нам нужен лишний скрипт? Тогда как, при той же MVC это все интегрируется в index.php и любой action принимает уже чистые данные формы из сессии, а POST уже пуст.

Как ты будешь релизовывать MVC на твоей модели поведения?
- action читает непосредственно из POST.
- action закончил обработку, его задача вывести новое View, но мы этого не можем, т.к. нам нужен промежуточный прыжок, чтобы очистить POST. При этом необходимо куда-то запихать данные, подготовленные для View, как и имя самого View

_____________
[продано копирайтерам]
VeRTak
Я половина из написанного не понял. Возможно ты и прав, опыта у тебя куда больше. Но лично мне кажется усложняете, решаете куда все проще
AllesKlar
VeRTak
ээээ... За что эксперта дали? biggrin.gif
Ок. У тебя три скрипта, у меня два. Два меньше, чем три biggrin.gif

_____________
[продано копирайтерам]
sergeiss
Цитата (AllesKlar @ 26.04.2017 - 15:07)
При такой структуре у тебя должно быть три скрипта (или логических блока, не суть важно)
1. - Форма
2. - Обработчик формы
3. - Обязательный скрипт-приемник, куда нужно будет прыгнуть, дабы убить POST

Не надо никуда прыгать! Ты даже на примере этого форума постоянно видишь, как работает "убийца F5" :) (когда при отправке данных вылезает в центре экрана надпись "Подождите" и еще чего-то)

Кстати, в хэлпе об этом сказано всё: http://php.net/manual/ru/function.header.php

Вот примерно так код получается (всё в одном скрипте!!!):
<?php
// обработчик тут же, где и форма, в одном файле - это намного удобнее
if (была отправлена форма) {
... // обрабатываем данные
...

if (если обработка успешна) {
header("refresh: 10, url=этот же файл");
echo ... // выводим какую-нибудь инфу о том, что данные приняты
// и сейчас произойдет автоматический возврат назад;
// можно сделать на JS обратный отсчет и также ссылку для прямого перехода

exit(); // этот также важно тут, чтобы всякая лабуда, что ниже в коде, вообще не выводилась в браузер
}

}


?>
<!doctype html>
...
<body>
<form
....>
...
</form>
....


_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
VeRTak
Цитата (sergeiss @ 26.04.2017 - 16:46)
Вот примерно так код получается (всё в одном скрипте!!!):


Так же делаю. Если обработка успешна header, не успешна и тоже header
AllesKlar
blink.gif ВЫ ЧО? Какой "подождите..."???
Пока будет "подождите", я яваскриптом обновлю 100500 раз страницу и засру всю базу.
А если речь о деньгах? Я с удовольствием "оплачу" множество, множество, множество раз в тот момент, когда буду видеть "Оплата прошла успешно, подождите, сейчас Вы будет перенаправлены..."

Короче, я в расстроенных чуйствах ушел. huh.gif

_____________
[продано копирайтерам]
twin
Цитата (AllesKlar @ 26.04.2017 - 13:20)
Пока будет "подождите", я яваскриптом обновлю 100500 раз страницу и засру всю базу.
Ну вот на, обновляй:
<?php

$token = md5(microtime(true));

if (isset($_COOKIE['token'], $_POST['token']) && $_COOKIE['token'] === $_POST['token']) {
// Обработка

setcookie('token', $token, time() + 100500);
header('location: /'); // Можно вернуть обратно, если другой обработчик
exit();
}

setcookie('token', $token, time() + 100500);

?>
<form action="" method="post">
<
input name="token" type="hidden" value="<?=$token;?>" />
<
input name="text" type="text" value="" /><br />
<
input name="go" type="submit" value="Go!" />
</
form>


_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.