Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

Где хранить корзину - в куках или в сессиях?


Sammy95

  

108 голосів

You do not have permission to vote in this poll, or see the poll results. Будь ласка, увійдіть або зареєструйтеся для голосування в опитуванні.

Recommended Posts

1. Сейчас поведение корзины OpenCart / ocStore такое:

Корзина хранится в сессии (т.е. в спец. файле на сервере), но при перезапуске браузера сессия удаляется (вместе со всем содержимым корзины, естественно).

Единственным недостатком этого метода является удаление корзины, но зато всё предсказуемо и понятно.

2. Можно это поведение изменить путём регулирования времени жизни сессии. Тогда корзина клиента не будет очищаться после перезапуска браузера, но очистится после истечения времени жизни сессии. Причём при таком варианте возможны случаи, когда клиент зашел на сайт - сессия установилась. Через месяц он снова зашёл на сайт, добавил товары в корзину и решил оформить покупку, но корзина уже пустая т.к. время жизни сессии (месяц) только что истекло. Да и время жизни сильно большое не поставишь, т.к. могут закончиться имена для сессионных файлов (ну не предназначены они для этого).

3. Можно перенести хранение корзины в куки. Тогда товары не исчезнут из корзины неожиданно и ещё можно будет задать время хранения куки побольше (время будет отсчитываться с момента последнего захода на сайт). Но у кук есть ограничения на размер, т.е. сильно много товаров в корзину не добавишь.

4. Обойти это ограничение (см. пункт 3) можно путём просьбы зарегистрироваться или войти в свой аккаунт, если товаров станет сильно много.

Здесь у меня возникают вопросы: а) - сколько товаров сразу у вас обычно покупают (добавляют в корзину)?; б) - сколько максимум товаров у вас когда-либо покупали за один раз?

Приблизительный подсчёт показал, что если взять за ограничение куки в 2 килобайта, то поместится около 50 товаров. Ещё один недостаток здесь в том, что эти 2 килобайта будут при каждой загрузке передаваться на сервер (трафик).

5. Можно не просить клиента зарегаться, а сохранить расширенный список товаров в сессии. Тогда при перезапуске браузера потеряется не вся корзина, а только та её часть, которая не поместилась в куках. Но зато, если клиент оформит покупку без перезапуска браузера, то всё будет работать как и сейчас.

6. Или можно оставить как есть, но для зарегистрированных клиентов хранить корзину между сессиями в базе данных.

----

Прошу голосовать и высказываться. Если ничего не поняли, то лучше не голосуйте.

Надіслати
Поділитися на інших сайтах


В куках хранить идентификатор корзины, а как хранить на стороне сервера саму корзину уже не важно.

И вообще пора-бы сделать хранение сессий в базе. Не так редки случаи когда на виртуальных серверах сессии хранят в общей куче и нежданные гости не исключены.

  • +1 1
Надіслати
Поділитися на інших сайтах

В куках хранить идентификатор корзины, а как хранить на стороне сервера саму корзину уже не важно.

О! А это отличный вариант, надо будет подумать. Но вопрос про кол-во товаров в корзине всё-равно актуален.

И вообще пора-бы сделать хранение сессий в базе. Не так редки случаи когда на виртуальных серверах сессии хранят в общей куче и нежданные гости не исключены.

В php-скрипте можно указать каталог для файлов сессий. Попробую протолкнуть это изменение в следующую версию.
Надіслати
Поділитися на інших сайтах


Sammy95, есть такая штука как uid в кукесах который может автоматически назначать сам http сервер. По мне, так корзину надо держать на сервере, но привязывать не к сессии в ocStore, а именно к uid. Фактически это последний вариант.

Надіслати
Поділитися на інших сайтах


есть юзер.

берем его данные какие-нибудь, делаем хэш, кладем его в базу вместе с корзиной и UID (id юзера в базе, нахер данные http-сервера), ставим этот хэш в cookie юзеру.

при следующем заходе смотрим - есть ли хэш у юзера и есть ли такой хэш для этого юзера (не забываем - у нас есть UID) в базе.

если есть - пихаем ему в сессию "корзинку с товарами" из базы.

Надіслати
Поділитися на інших сайтах

есть юзер.

Если юзер есть, то получается, что корзина будет только для зареганых и вошедших, а для остальных оставить как есть? Тогда это почти вариант №4.

берем его данные какие-нибудь, делаем хэш, кладем его в базу вместе с корзиной и UID (id юзера в базе, нахер данные http-сервера), ставим этот хэш в cookie юзеру.

при следующем заходе смотрим - есть ли хэш у юзера и есть ли такой хэш для этого юзера (не забываем - у нас есть UID) в базе.

если есть - пихаем ему в сессию "корзинку с товарами" из базы.

не совсем понял для чего манипуляции с хешем. Чтобы корзину не подменили и товаров не добавили? :)
Надіслати
Поділитися на інших сайтах


есть юзер.

берем его данные какие-нибудь, делаем хэш, кладем его в базу вместе с корзиной и UID (id юзера в базе, нахер данные http-сервера), ставим этот хэш в cookie юзеру.

Тогда всех посетителей придется регать в базе. Преимущество серверного uid в том что он делается для всех посетителей автоматом.

Надіслати
Поділитися на інших сайтах


не совсем понял для чего манипуляции с хешем. Чтобы корзину не подменили и товаров не добавили?

Sammy95, типа того.

Преимущество серверного uid в том...

...что при изменении некоторых "переменных окружения" мы его один хрен теряем.

"кто не регистрируется - я не виноват" :lol:

Надіслати
Поділитися на інших сайтах

...что при изменении некоторых "переменных окружения" мы его один хрен теряем.

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

Надіслати
Поділитися на інших сайтах


на основании чего генерируется её значение?

На основе поля с AUTO INCREMENT в БД, я полагаю.

Хэш, в принципе, тоже (вместе с uid) можно держать в куке и в БД, а при надобности сверять.

Надіслати
Поділитися на інших сайтах


на основании чего генерируется её значение?

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

Надіслати
Поділитися на інших сайтах


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

меняется IP - печенько идет в мусор.

меняется параметр браузера - печенько в мусор.

и еще куча вариантов, когда такое печенько идет в мусор.

отталкиваться от "текущего времени" - накой фиг?

Вполне возможно, что если такой модуль не настроен, имеет смысл генерировать такой uid движком магазина.

ПЕРЕСТАНЬ надеятся на авось, и считать, что каждый владелец инет-магазина владеет выделенным сервером и достаточными знаниями для настройки соответствующего ПО.

Sammy95, мы тут DB отодвинули в сторону и флеймим про движок web-сервера.

Надіслати
Поділитися на інших сайтах

меняется IP - печенько идет в мусор.

меняется параметр браузера - печенько в мусор.

и еще куча вариантов, когда такое печенько идет в мусор.

Юзер заходит один раз и ему сразу выдается кука со значением на долгое время. Это не сессионая кука - она привязывается к дроузеру. Не имеет значения что там у юзера измениться, т.к. кука в броузере останется. Если кука слетит, она ему выдасться новая - уникальная. Пока действует одна кука - проблем с привязкой корзины не будет. Залогиненный будет юзер или гость - корзина будет привязана к броузеру с данной кукой.

Надіслати
Поділитися на інших сайтах


ПЕРЕСТАНЬ надеятся на авось, и считать, что каждый владелец инет-магазина владеет выделенным сервером и достаточными знаниями для настройки соответствующего ПО.

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

Sammy95, мы тут DB отодвинули в сторону и флеймим про движок web-сервера.

А по моему, мы не флеймим, а обсуждаем к чему именно нужно привязывать корзину. То что нужную куку может выдавать модуль http сервера ничего не меняет.

Надіслати
Поділитися на інших сайтах


Не совсем понятно о каком UID идёт речь. Если имеется в виду mod_uid апача или аналогичный трекер, то эти приблуды есть далеко не на всех серверах и используются для сбора статистики на уровне сервера. Идентифицировать пользователя по таким идентификаторам я бы не стал.

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

Надіслати
Поділитися на інших сайтах

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

Вот этот вопрос давайте подробнее обсудим, тем более что в опенкарте уже сохраняется содержимое корзины для зареганых (таблица `customer` в поле `cart`) и надо просто приделать её использование.

Кто как думает?

Надіслати
Поділитися на інших сайтах


Вот этот вопрос давайте подробнее обсудим, тем более что в опенкарте уже сохраняется содержимое корзины для зареганых (таблица `customer` в поле `cart`) и надо просто приделать её использование.

Кто как думает?

Мой ответ по поводу хранения идентификатора корзины в куках, а самой корзины на стороне сервера был дан как техническое решение поставленной задачи.

А вот надо-ли эту задачу решать - это другой вопрос. Поведение OpenCart по отношению к анонимному пользователю абсолютно правильное. Хочеш быть анонимным - терпи все прелести анонимности до конца. Хочеш комфорта - авторизуйся и тебя будут помнить, облизывать со всех сторон и т.д

Надіслати
Поділитися на інших сайтах

  • 2 weeks later...

Я проголосовал за: "В сессиях (оставить как есть, но сохранять корзину для вошедших в аккаунт)".

Поясню свой выбор (вкратце):

В том виде в котором корзина работает сейчас, (в принципе) всё устраивает, кроме одного.

Человек зашел на сайт, увидел то что хотел, выбрал товары которые нужны, (доооолго лазил) и наконец всё добавил в корзину... Жмёт "Оформить" и тут ему говорят что необходимо зарегистрироваться... Он начинает вводить свои данные, жмёт продолжить и... Корзина пуста! Начинает всё искать и добавлять по новой... Такое уже было. И это "не айс"... :angry:

Надіслати
Поділитися на інших сайтах

Жмёт "Оформить" и тут ему говорят что необходимо зарегистрироваться... Он начинает вводить свои данные, жмёт продолжить и... Корзина пуста!

Почему пуста? Я пробовал, корзина не очищается пока человек не выйдет из аккаунта.
Надіслати
Поділитися на інших сайтах


  • 1 year later...

А как можно сделать чтобы не происходила разавторизация при выходе из браузера?

То есть чтобы залогинился, закрыл браузер, потом запускаешь и ты остался авторизированным.

Надіслати
Поділитися на інших сайтах


  • 4 weeks later...

Чтобы не происходила разавторизация при закрытии браузера нужно установить время жизни сессии отличное от нуля.

Сделать это можно в файле /system/library/session.php (относительно корня сайта), установить в:

session_set_cookie_params(0, '/');
вместо нуля время в секундах, через которое все данные сессии будут удалены, например 3600 (час) или 1814400 (3 недели)

session_set_cookie_params(1814400, '/');
  • +1 1
Надіслати
Поділитися на інших сайтах


А как можно сделать чтобы не происходила разавторизация при выходе из браузера?

То есть чтобы залогинился, закрыл браузер, потом запускаешь и ты остался авторизированным.

ммм.. а как же безопасность, а если это клуб кафе и тд где все пользуются одним браузером? Подарить кому то аккаунт и не дай бог если на нём есть денег чутка?
  • +1 1
Надіслати
Поділитися на інших сайтах

Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку

×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.