|
39 / 9 / 10
Регистрация: 19.09.2016
Сообщений: 1,076
|
||||||
Как при обновлении страницы избежать повторной отправки POST запроса с передачей переменных в шаблон?23.06.2020, 12:23. Показов 3829. Ответов 24
Метки нет (Все метки)
Есть страничка юзера, на ней форма изменения роли(админ/юзер). Реализовано на радиокнопках и кнопке подтверждения выбора.
При всех вариантах событий на страничку должно выводиться сообщение об успешной или неудачной операции. Видел варианты - переадресовывать на ту же страничку. но я тогда не знаю, как правильно передавать сообщения в шаблон. Пробовал делать unset, вижу. что при обновлении странички уже нет переменной $_POST['role'], но условие if(isset($_POST['role'])) не срабатываетСам обработчик:
0
|
||||||
| 23.06.2020, 12:23 | |
|
Ответы с готовыми решениями:
24
Повторение POST запроса при обновлении страницы Запретить повторную отправку POST запроса при обновлении страницы Как избежать повторной отправки формы? |
|
1932 / 1523 / 703
Регистрация: 17.11.2012
Сообщений: 6,585
|
|
| 23.06.2020, 12:36 | |
|
1
|
|
|
39 / 9 / 10
Регистрация: 19.09.2016
Сообщений: 1,076
|
||
| 23.06.2020, 13:19 [ТС] | ||
|
А почему не срабатывает условие, которое я описал выше? Переменная же удаляется из $_POST, я это явно вижу.
0
|
||
|
1306 / 998 / 232
Регистрация: 01.10.2018
Сообщений: 3,884
|
||
| 23.06.2020, 15:11 | ||
![]() Добавлено через 5 минут 1) GET /setrole 2) POST /setrole 3) GET /setrole/info Можно и на исходной форме отображать текущую роль, чтобы не делать модификацию ![]() Добавлено через 5 минут Достаточно новым состоянием радиокнопок показать, что действие завершилось успешно ![]() А модификатор можно использовать для ошибки.
0
|
||
| 23.06.2020, 17:08 | |
|
Не по теме: Ошибся при чтении вопроса
0
|
|
|
39 / 9 / 10
Регистрация: 19.09.2016
Сообщений: 1,076
|
||||
| 23.06.2020, 17:44 [ТС] | ||||
|
Мне как раз нужно что-то похожее на : А так же на этой страничке еще одна форма - управления активацией. Все это должно доступно по GET /users/1 Обработчик управления ролью POST /users/1/rolecontrol Обработчик управления активацией POST /users/1/activationcontrol Переадресовывать по итогу на[quote="estic;14675416"] GET /users/1 Можно было бы придумать какой-то индикатор в адресе использовать как селектор ошибок, но вместе с этим, в шаблон нужно еще объект пользователя передать. Вот тут скорее загвоздка с переадресацией. Тут и сессии уже не совсем в тему.. Добавлено через 6 минут Ну и остался открытый вопрос: Почему, если unset удаляет переменную из массива, проверка все равно не проходит?
0
|
||||
|
1306 / 998 / 232
Регистрация: 01.10.2018
Сообщений: 3,884
|
||||
| 23.06.2020, 18:10 | ||||
0
|
||||
|
165 / 150 / 58
Регистрация: 15.06.2013
Сообщений: 1,107
|
|
| 23.06.2020, 18:24 | |
|
СергейСереб, я, конечно, могу ошибаться, но в документации сказано что, если unset используется в функции, то удаляется только локальная версия переменной.
0
|
|
|
39 / 9 / 10
Регистрация: 19.09.2016
Сообщений: 1,076
|
||||
| 23.06.2020, 21:47 [ТС] | ||||
|
Делал проверку на нажатие кнопки подтверждения - тоже не срабатывает. все равно повторно отправляется запрос по обновлению странички. Можно просто напросто вообще убрать проверку на повторное назначение той же роли и соответственно выброс сообщения-ошибки об этом. Подобная ситуация не может быть воспроизведена пользователем(я ее уже исключил на уовне юзер-интерфейса). Или после изменения роли перекидывать на какую-то страничку с сообщением о переназначении. или вообще никаких сообщений не выдавать. а сделать посто переадресацию на страничку с информацией о юзере. Но мне в любом случае интересно, как разрешить этот вопрос не отменяя эту проверку. Тут, я так понимаю, вопрос в том, что браузер кэширует запрос и ему все равно, что там удалили или не удалили.
0
|
||||
|
165 / 150 / 58
Регистрация: 15.06.2013
Сообщений: 1,107
|
|
| 23.06.2020, 22:10 | |
|
СергейСереб, Браузер к серверной части не имеет отношения. Если, конечно, вы повторно форму не отправляете. А вы пробовали выводить содержимое массива пост перед функцией иссет?
0
|
|
|
39 / 9 / 10
Регистрация: 19.09.2016
Сообщений: 1,076
|
|||
| 23.06.2020, 23:08 [ТС] | |||
|
Сделал еще такой примитивный вариант: При выводе профиля пользователя стартую сессию, и в сессионную переменную записываю фиксированное значение. При отправке POST запроса сравниваю, при условии, что $_POST не пустой делаю поверку с этим же значением. После успешного выполнения POST запроса(на страничке я вижу об этом сообщение) присваиваю сессионной переменной новое рандомное значение. Вероятность совпадения с фиксированным значением крайне мала. После неудачи проверки делаю редирект на вывод профиля пользователя. (сообщение об успешном переназначении роли уже не выводится). По хорошему, обновление странички не должно убирать с экрана это сообщение. Ну и в целом - какой-то конкретный костыль все это, как мне кажется....
0
|
|||
|
1084 / 746 / 364
Регистрация: 09.07.2018
Сообщений: 1,760
|
|
| 23.06.2020, 23:11 | |
|
0
|
|
|
39 / 9 / 10
Регистрация: 19.09.2016
Сообщений: 1,076
|
|
| 23.06.2020, 23:23 [ТС] | |
|
0
|
|
|
1306 / 998 / 232
Регистрация: 01.10.2018
Сообщений: 3,884
|
|||
| 24.06.2020, 06:03 | |||
|
Мне не понятно, зачем нужен unset в данном контексте. Вы уже перешли на использование перенаправления? Я другими понятиями мыслить не могу в описанной ситуации. Добавлено через 2 минуты
0
|
|||
|
39 / 9 / 10
Регистрация: 19.09.2016
Сообщений: 1,076
|
|||
| 24.06.2020, 09:04 [ТС] | |||
|
В целом: Если делать без переадресации, нужно передавать и сообщение и объект пользователя, т.к. форма изменения роли находится на одной страничке с инфомацией о пользователе. Если делать переадресацию, то переадресацию нужно сделать на ту же страничку с информацией о пользователе и формой изменения роли. С первым вариантом я уже все перепобовал - тупик, данные запроса без переадресации все равно при обновлении отправляются. Все проверки и условия на пустоту массива $_POST при этом игнорируются. Со вторым вариантом, с переадресацией - да я ошибался, объект передавать будет не нужно. т.к. переадресация будет на страничку информации о пользователе с формой изменения роли(GET /users/1). Это отдельный обработчик и там объект пользователя получаю отдельно. Тогда вывод сообщений можно делать, как выше написали - через сессии. Нужно выводить и сообщение об успешной операции и о неуспешной. И на этой же страничке, на форме изменения роли. Вариант с модификацией адреса/передачей флага ошибки в адресе мне не очень нравится. Если бы это работало в контексте обновления странички, было бы очень просто решить вопрос. А так, unset в данном контексте - получается бесполезен. Не имеет значения ткущее состояние $_POST, отправляются уже запомненные данные с последней отправки.
0
|
|||
|
165 / 150 / 58
Регистрация: 15.06.2013
Сообщений: 1,107
|
|||
| 24.06.2020, 09:04 | |||
Я не совсем понимаю, если вы все сделали с результатами отправки формы, то зачем вам дальше массив POST? Делайте редирект и забывайте про него.
0
|
|||
|
39 / 9 / 10
Регистрация: 19.09.2016
Сообщений: 1,076
|
||||
| 24.06.2020, 09:37 [ТС] | ||||
Добавлено через 5 минут Добавлено через 9 минут И про архитектуру. Где правильнее/логичнее размещать обработчик изменения роли? В админконтроллере или в юзерконтроллере? В админ удобнее, т.к. ко всем подобным обработчикам не нужно отдельно делать проверку на админ/не админ, а сделать это один раз для всех методов, подразумевающих доступ только админа, с другой стороны-манипуляции касаются пользователя, значит обработка должна быть в юзерконтроллере? И на счет проверки доступа. Как лучше/правильно?: Делать проверки и на уровне представления(только админу показывать разрешенные элементы интерфейса) и на уровне кода, везде где предполагается доступ админа?
0
|
||||
|
165 / 150 / 58
Регистрация: 15.06.2013
Сообщений: 1,107
|
|||||||
| 24.06.2020, 10:02 | |||||||
1
|
|||||||
|
1306 / 998 / 232
Регистрация: 01.10.2018
Сообщений: 3,884
|
|||||
| 24.06.2020, 12:34 | |||||
|
1
|
|||||
|
39 / 9 / 10
Регистрация: 19.09.2016
Сообщений: 1,076
|
||||
| 24.06.2020, 15:27 [ТС] | ||||
|
В конструктора админконтроллера(где собраны методы, предполагающие управления действиями в админке) я делаю проверку, админ пользователь или нет. И все методы соответственно уже не требуют этой проверки. Но есть действия, которые как я уже написал выше - мне не понятно, к чему отнести - к действиям администрирования или к обычному управлению. Например - то же изменение роли. Или в контроллере админки должны быть методы, предполагающие непосредственное участие админа? Не очень понятно это разделение. Что должно быть и по какому критерию отобрано в контроллер админки. Добавлено через 51 минуту
0
|
||||
| 24.06.2020, 15:27 | |
|
Помогаю со студенческими работами здесь
20
Как избежать добавление в БД при обновлении страницы? Защита от повторной отправки POST-данных
Чтение данных с XML, как избежать повторной операции при следующей загрузке формы После повторной отправки Get-запроса и парсера выдается предыдущий результат Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|
|
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога
SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
|
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога
SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
|