Ошибка сеанса с unset () и кнопкой возврата браузера - PullRequest
0 голосов
/ 20 декабря 2010

Я использую переменную SESSION, чтобы установить предварительно выделенный идентификатор записи из Postgres (получая последовательность идентификаторов записи), используя DB PEAR nextId () . Я установил идентификатор I в переменную сеанса из-за проблем с областями видимости в унаследованном коде, с которым я работаю. После того, как произойдет INSERT, я использую unset () , чтобы удалить переменную SESSION (для очистки идентификатора используемой записи). В сеансе также содержится больше информации, которая остается неизменной, это просто удаляемый элемент next_id.

Псевдокод:

// Get the next Id and set to SESSION
$_SESSION['next_id'] = $db->nextId();

... more code here

// After insert
unset($_SESSION['next_id']);

У меня такой вопрос, может ли нажатие на кнопку возврата в браузере каким-либо образом сбросить переменную SESSION $_SESSION['next_id']? Может быть, из-за этого NULL? Как CACHE обрабатывает SESSION после того, как элемент был удален, но пользователь вернулся в предыдущее состояние?

EDIT: причина этого вопроса в том, что производственный код произвольно (любым пользователем) пытается ВСТАВИТЬ с ИДЕНТИФИКАТОРОМ записи NULL (который является next_id из SESSION). Просто попытка отладки процесса, поскольку код очень минимален, проверен моими коллегами и только что поставил нас в тупик ???

РЕДАКТИРОВАТЬ 2: Ух ты, я думаю, есть проблема с тем, как я использую переменную SESSION. Хорошо, я объясню столько, сколько я могу, почему я выбрал этот метод. Сначала код находится в процессе переписывания из PHP 4, но текущей рабочей версией в основном является PHP 4 с большим количеством недавно добавленного кода модуля в PHP 5. Причина, по которой я выбрал переменную SESSION, заключается в том, что проблема с областью видимости должна быть жестко задана на нескольких сотнях страниц устаревшего кода или на одной странице и преобразовать значение в SESSION, к которому имеют доступ все страницы. (ну мой начальник, который платит мне зарплату, как вариант, который я выбрал). Первоначальная проблема заключается в том, что они (мой начальник) хотели показать идентификатор конечному пользователю до вставки информации. Следовательно, PEAR DB вызывает nextId (). Мы используем PostgreSQL, и я использую последовательность идентификаторов записей, чтобы гарантировать, что следующий идентификатор будет уникальным и будет выделен только конечному пользователю (без дубликатов, поскольку Postgres обрабатывает блокировку этого в последовательности). Таким образом, конечный пользователь также может перемещаться по нескольким страницам во время процесса, это также является другой проблемой. Теперь использование SESSION и получение следующего идентификатора с некоторой проверкой и проверками составляет около 50 строк кода для всего процесса вместо тысяч строк кода, которые были бы написаны для правильной работы. Опять же, НЕ МОЙ КОД, во-первых, просто лучшее решение с наименьшими затратами.

Если у вас есть другое, лучшее, лучшее, более простое и дешевое решение, не стесняйтесь отправлять. Но если вы не согласитесь с моим решением о кодировании, пожалуйста, оплатите мои счета, и я полностью согласен с более строгим стандартом кодирования, практикой, решением.

Ответы [ 4 ]

1 голос
/ 20 декабря 2010

Просто обойдите вставку все вместе, если $ _SESSION ['next_id'] доходит до NULL, даже если это означает вызов die () до того, как вы достигнете этого старого кода, к которому вы не хотите прикасаться.

1 голос
/ 20 декабря 2010

Вы уверены, что сам сеанс не сбрасывается на стороне сервера?У меня была ситуация в среде общего хостинга, когда настройки сервера приводили к тому, что мои сеансы исчезали.Мне пришлось добавить локальные настройки в мое приложение, чтобы преодолеть это (частное, а не общее хранилище сеансов).

Это настройки, которые у меня есть в моем файле .htaccess для сеансов, что дает им разумное время на диске

php_value session.gc_probability 1
php_value session.gc_divisor 100
php_value session.gc_maxlifetime 3600
1 голос
/ 20 декабря 2010

Невозможно представить сценарий, в котором вам нужно было бы хранить nextId () в сеансе для использования на следующей странице.

Как указывалось в webbiedave, $ _SESSION хранится на сервере, поэтому нажатие кнопки «назад» не приведет к «сбросу» переменной сеанса.

Но, если пользователь нажимает кнопку «Обновить» на второй странице (той, которая очистила переменную _SESSION), ваш сценарий будет запущен снова, с параметром next_id, равным нулю (потому что на предыдущей странице установлено значение nextId ())

То же самое произойдет, если пользователь нажмет кнопку «Назад» и предыдущая страница будет загружена из кэша браузера - нет запроса к серверу, нет переменной next_id в _SESSION.


Но все же, что-то действительно не так, если вы сохраняете nextId () в _SESSION.

0 голосов
/ 23 декабря 2010

Найдена причина проблемы. Конечные пользователи открывают несколько вкладок в своих браузерах, в результате чего данные SESSION распространяются на любую открытую вкладку, поскольку все они будут вызывать один и тот же сеанс. Таким образом, отправка одного запроса на одной вкладке отменяет сеанс на всех вкладках. Поэтому, когда они отправляют запрос на второй вкладке, сеанс пропускает значение next_id, вызывая все проблемы. Обучение пользователей решит проблему на данный момент, но в скором времени будет стремиться реализовать все по-новому.

Спасибо за все усилия

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...