Перейти к содержанию
Sammy95

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

  

96 проголосовавших

You do not have permission to vote in this poll, or see the poll results. Пожалуйста, войдите или зарегистрируйтесь для возможности голосования в этом опросе.

Рекомендуемые сообщения

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 движком магазина.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Ну, не думаю что для работы этого модуля в апаче нужен mysql. :) Это было-бы очень странно. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

session_set_cookie_params(1814400, '/');
  • +1 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.