Передача правильных данных сеанса при открытии нескольких вкладок в веб-браузере

#php

#php

Вопрос:

У меня есть PHP-скрипт (script A), который выполняет запрос к базе данных, сохраняет результат в переменной сеанса и создает HTML-страницу, содержащую форму, которая позволяет пользователю отправлять отправку (необязательно). После отправки результат, сохраненный в переменной сеанса, используется для обработки в другом скрипте (скрипт B).

Поскольку HTML-страница не уникальна, пользователь может открыть несколько вкладок, на которых отображаются разные страницы, созданные скриптом A. Поскольку переменная сеанса может содержать данные только для последней сгенерированной страницы, когда пользователь нажимает на любую из предыдущих вкладок и выполняет отправку, будет использоваться неправильный набор данных сеанса.

Один из способов предотвратить это — принудительно перезагрузить страницу перед отправкой. Есть ли лучший и безопасный способ сделать это, кроме повторного запроса к базе данных в скрипте B?

Ответ №1:

Сгенерируйте секретный токен и его хэш.

Добавьте секретный токен в свой $_SESSION .

Добавьте хэш в форму в качестве скрытого элемента ввода.

При отправке создайте хэш из секретного токена в $_SESSION .

Сравните это с представленным хэшем. Если он не соответствует, вы знаете, что форма не подходит для вашего сеанса.

Вы можете расширить это, введя данные с помощью хэша внутри вашего $_SESSION :

 $_SESSION[$hash] = your form data
  

Тогда вы даже можете правильно обрабатывать несколько форм (и несколько экземпляров формы).

Комментарии:

1. а, понятно .. создание уникального элемента в сеансе.. Но данные состоят из нескольких переменных. Могу ли я сохранить их все в этот хэш-элемент в виде массива внутри массива??

Ответ №2:

PHP-скрипт (скрипт A), который выполняет запрос к базе данных, сохраняет результат в переменной сеанса

Для чего? Какой смысл хранить данные, которые у вас уже есть?

После отправки результат, сохраненный в переменной сеанса, используется для обработки в другом скрипте (скрипт B)

Для чего? Почему вы не можете отправить свою форму непосредственно в B?

Я вообще не вижу смысла использовать сеансы здесь. Или, по крайней мере, в соответствии с вашим текущим описанием.

Комментарии:

1. Поскольку отправка является необязательной, а не обязательной.

2. И что? Любая форма в мире является необязательной. Как один, чтобы ответить на ваш вопрос. По-прежнему нет смысла хранить эту форму где-либо.

3. ошибка.. почему вы так разогреваетесь? Позвольте мне обдумать ваш вопрос, прежде чем отвечать, хорошо?

4. Я пытался, но не удалось объединить два скрипта. Скрипт A также принимает $_GET переменную. Форма POST — это лишь очень небольшая часть всей HTML-страницы и была добавлена намного позже, потому что я не хочу иметь отдельную страницу для получения только одной переменной. Я посмотрю на это снова завтра. Спасибо, что указали.

5. Мне удалось объединить два сценария, но это не позволяет избежать повторного запроса к базе данных при отправке. Я не понимаю, как это можно сделать без использования SESSION , поскольку INSERT оператор полагается на некоторый вывод из SELECT оператора. Это не так просто, как кажется.