Работа с регенерацией идентификатора сессии в PHP / CodeIgniter - PullRequest
1 голос
/ 04 февраля 2011

Я использую класс Session CodeIgniter для управления своими сессиями в системе корзины / оформления заказа. Данные сеанса хранятся в базе данных, а идентификатор сеанса сохраняется в файле cookie. Вся информация о корзине извлекается через AJAX и сохраняется в сеансе вместе с идентификатором сеанса.

Сейчас я использую идентификатор сеанса, который генерирует PHP / CodeIgniter для отслеживания пользователей. Пользователи не входят на сайт, а магазин и система корзины / оформления заказа находятся в разных доменах, поэтому это единственное, что привязывает их к своей корзине, которая хранится в сеансе / базе данных. Я использую этот идентификатор сеанса в скрытых полях в формах и в качестве параметра в ссылках, чтобы он отправлялся на сервер по любому запросу (добавить элемент, удалить элемент, просмотреть корзину и т. Д.) *

CodeIgniter позволяет вам установить время для регенерации идентификатора сеанса, прямо сейчас у меня установлено 10 минут. У меня было значение по умолчанию, но оно было слишком коротким, потому что, если пользователь сидел на странице слишком долго, идентификатор сеанса, который динамически записывался в ссылки и формы, был бы устаревшим и больше не привязывался к данным их корзины. 1005 *

Это явно не лучшее решение. Каков наилучший способ разрешить восстановление идентификаторов сеансов с меньшим интервалом, но при этом держать пользователей привязанными к своим данным корзины, даже если пользователь ждет 10+ минут (без обновления страницы), чтобы выполнить действие?

1 Ответ

8 голосов
/ 04 февраля 2011

Не используйте идентификаторы сеанса в базе данных.Корзина должна сохраняться между сеансами, поэтому вам нужно хранить корзину по отношению к пользователю, а не к сеансу.Я также не буду помещать идентификатор сеанса в поля как скрытое поле.Преимущество сессий в том, что вы можете хранить их на стороне сервера.

Сохраните корзину в базе данных, не загружайте все это в сеанс.

Метод # 1

Пользователь может получить «активную» корзину вбаза данных.

User -> (has many) Cart

Затем эта корзина обновляется путем добавления в нее товаров

/cart/add/{id}        -> Verify prices / quantities

Эта корзина не связана с сеансом, сеанс только контролирует, какой пользователь вошел в систему. Когда ониоформить заказ: корзина установлена ​​с «активной» на «заказанная», и создается новая «активная» (но пустая) корзина.Тележки сохраняются в базе данных между сеансами, и можно сделать доступной полную историю.

Метод # 2

Сохранять всю корзину в сеансе, не сохраняя ее в базе данных.Это могло бы упростить некоторые вещи (добавление / удаление элементов не является операциями с БД), но также не сохранялось между сеансами.Когда пользователь оформляет заказ, записываете корзину в базу данных.

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