Сучасна диджитал-освіта для дітей — безоплатне заняття в GoITeens ×
Mazda CX 5
×

Алгоритм корзины интернет-магазина на сессиях и массивах

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

Здравствуйте.

Я хочу сделать корзину на сессиях и массивах для интернет-магазина своего. Только PHP!

Но не знаю как начать. Могли бы подсказать алгоритм работы, пожалуйста?

Заранее спасибо.

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

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

Коментар порушує правила спільноти і видалений модераторами.

Но не знаю как начать. Могли бы подсказать алгоритм работы, пожалуйста?
ПХП не знаю, но common sense мне подсказывает.
При добавлении в корзину отправляешь пост запросом на сервер айдишник товара, проверяешь открыта ли юзер-сессия, если нет открываешь, если да, то ложишь туда айди товара. При логауте не забудь закрывать сессию пользователя. Это традиционный способ.

А вообще в последние 8 лет никто не хранит сессии на сервер сайде, а используют куки или localstorage, из за проблем с масштабированием. Я бы посоветовал бы сделать оба варианта и протестировать какой будет лучше под нагрузкой.

А какие у сессий проблемы с масштабированием ?

Коментар порушує правила спільноти і видалений модераторами.

для чего нужен localStorage в реализации корзины?

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

При чем тут я?

Если разработики оставляют список моих товаров в localstorage, то они явно недостаточно умные, чтоб обеспечить безопасность номера кредитки.

Если разработики оставляют список моих товаров в localstorage
А как по вашему работает сессия незалогиненого пользователя?

Молодой человек, я бы попросил вас следить за своим тоном. Хамством вы свою точку зрения на этом сайте не отстоите.

Безопасность списка товаров в корзине нужно обеспечивать. Для вас он ценности не несет. Для пользователя — неизвестно. Так как он может покупать подарок любовнице, игрушки для сексуальных развлечений или еще что-то, что хотелось бы сохранить в тайне от тех, кто имеет досутп к компьютеру.

Сессия, кукисы экспайрятся. Когда логинишься на сайте, можно не ставить галочку «запомнить меня». А localstorage не экспайрится, и любителя пощекотать очко таким образом спалят.

Сессия, кукисы экспайрятся. Когда логинишься на сайте, можно не ставить галочку «запомнить меня». А localstorage не экспайрится, и любителя пощекотать очко таким образом спалят.
И снова смешались в кучу кони, люди: У вас 3 предложение и 3 разных бизнес-сценария:
1) Хранение в сессии. Тут можно и нужно использовать локалсторедже
2) Работа заголенного пользователя. Тут 2 сценария — в одном см пункт 1, во втором «сессией и массивами» на сервере не отделаешься.
3) Работа с приватной информацией. Тут уже не важно что сессия и куки проекспайрятся, их время жизни крайне мало и единственное реально доступное хранилище — это БД на сервере.
От только не имеет смысл предполагать самый сложный вариант как тот который по умолчанию — это оверинжениринг.

Я рассматриваю задачу о корзине в контексте того, что то, что лежит в корзине — это приватная информация, и в этом контексте использование localstorage недопустимо.

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

то, что лежит в корзине — это приватная информация, и в этом контексте использование localstorage недопустимо.
1) Если информация таки приветная, то люди не оставляют ее на непойми каких девайсах.
2) А использовать сетевое соединение или куки — это допустимо?
Спереть есть больше способов чем хакнуть локалсторедж.

Ну так и кредитную карту можно в подворотне отжать, и не нужно будет перехыватывать ее номер когда ее будут вводить на каком-то говносайте.

Ну так и кредитную карту можно в подворотне отжать, и не нужно будет перехыватывать ее номер когда ее будут вводить на каком-то говносайте.
Мимо кассы.
Суть проста: спереть куки можно имея девайс физически или через сетевое соединение, данные с локалсторадже только имея девайс физически. Если ваши данные таки приватные и вы не явно не закрыли сессию, то вы как минимум так же уязвимы как и в случае с локалстораджем.
Суть проста: спереть куки можно имея девайс физически или через сетевое соединение, данные с локалсторадже только имея девайс физически. Если ваши данные таки приватные и вы не явно не закрыли сессию, то вы как минимум так же уязвимы как и в случае с локалстораджем.
Трафик шифруется, куки экспайрятся, в auth token зашивается тайм бомба.
куки экспайрятся
Экспайрятся в течении некоторого времени. Если данные приватные и вы явно не почистили куки, то есть время на то чтобы спереть ваши куки и получить полный доступ к вашему аккаунту, а не только к корзине.
К слову, экспайрятся и удаляются с жесткого диска — это так же 2 больших разницы, и если там лежит что-то отличное от идшки сессии, то у вас дыра не только в корзине, но и во всей системе.
если там лежит что-то отличное от идшки сессии, то у вас дыра не только в корзине, но и во всей системе.
baby steps
Не так то, что я пересяду за другой компьютер, и сайт про*бет мою корзину, потому что она осталась на старом компьютере, и я туда больше не вернусь, так как раз там про*бали мою корзину, то про*бут и еще что-нибудь, например, номер кредитной карты.
1) Номер кредитки — это отдельная история (ее в «корзине» не хранят)
2) Если пользователь не зареган, то сессию вы не перенесете между компьютерами.
3) Надо четко понимать задачу: в некоторых случаях переносимость «сессии» важна (это подразумевает залогиненость), но в большинстве «корзина» не особо то интересна __до нажатия кнопки "Заплатить"__ (вот в этот момент и будет синк, скорее всего)
2) Если пользователь не зареган, то сессию вы не перенесете между компьютерами.
Если я анон, я не буду ожидать, что моя корзина будет гулять за мной. Если я зарегистрированый пользователь, то буду ожидать, что моя корзина ходит за мной, так как нет ни одной причины чтоб корзина была привязана к компьютеру, а не к пользователю, которого сайт узнал.
но в большинстве «корзина» не особо то интересна __до нажатия кнопки «Заплатить»
Если я на работе шарился по амазону и накидал какой-то дребедени в корзину, то мне будет очень интересно продолжить шопинг вечером с домашнего компьютера, а не начинать его заново.
, так как нет ни одной причины чтоб корзина была привязана к компьютеру, а не к пользователю, которого сайт узнал.
Скорость работы (как отклика, так и нагрузка на сеть и сервера).
Если я зарегистрированый пользователь
Вводная была такая:
Якщо клієнт не зареєстрований на сайті,
И от ТСа:
Я хочу сделать корзину на __сессиях__ и массивах
Если речь про ХТТП-сессии, то разницаы с локалСтореджем нет. Если речь про бизнес-сессии (такое обычно более четко указывается), то тут могут быть варианты.
Скорость работы (как отклика, так и нагрузка на сеть и сервера).
Скорость работы в каких сценариях?

Не исключено, что в случае с localstorage скорость работы будет и ниже.

Когда пользователь заходит на страницу корзины, нужно будет как минимум подтянуть статус доступен/недосутпен и цены, так как они могли измениться с момента, когда товар положили в корзину. Если корзина лежит на сервере, то эту инфу клиент получит сразу когда зайдет на страницу корзины. Если корзина в localstorage, то нужно будет выполнить дополнительный запрос на сервер, чтоб эту инфу получить.

Когда пользователь заходит на страницу корзины, нужно будет как минимум подтянуть статус доступен/недосутпен и цены,
Нет, это можно (и, в подавляющем большинстве случаев, нужно) делать при нажатии на «Заплатить». Но тут повторюсь:
Надо четко понимать задачу
В некоторых случаях ваши требования могут быть критичными, но в большинстве случаев доступность товара и цены не придают по 100500 раз в день.

Если я аноним — потрется. Если я не аноним, а прошел аутентификацию, то она будет ходить за мной с места на место и никуда не пропадет (при условии пряморукой реализации, разумеется)

Я про client side нигде не писал

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

Сидячи з комментарий — люди до цих пір не використовують localStorage, який може містити 5-10 МБ інформації...
Судя по вашему комменту, его оставила шоколада у которой нет ни малейшего представления о том сколько информации можно записать в 5-10 МБ
UPD
Сори, пропустил «не» :)

+1 к JSON. Засовываешь в него ид+кол-во+раздел, на страничке корзины вытаскиваешь по идентификаторам из базы и вуа-ля, дело 15 минут, не понимаю зачем вообще топик создавать :(

засовуеш в масив, потом высовуеш. Помоему все логично.

шо мне нравится в доу — шо потрепаться на тему зарлат, где встретить девушку и прочей бытовухи — 3 милиона 500 комментов. Если спросить что то профессиональное — то хорошего ответна нада ждеть день или два и комментов будет всего десяток и то если наберется.

Хотел возразить, перечитал вопрос и передумал.

paste.ee/p/a63Sk

Сессии, массивы, минимум кода. По крайней мере у меня меньше не получается.

Если спросить что то профессиональное — то хорошего ответна
Для этого есть stackoverflow.

ты можешь сохранить свою корзину в базе (например mysql) и в сессии сохранить только id твоей корзины. далее подгружать твою корзину из базы по ее ID. вообще общее правило — чем меньше данных хранится в объектах сессии, тем лучше.
другой вариант хранить корзину на стороне клиента, то есть в куках javascript. Это подойдет?

так обычно не делают, хранят id товаров и количество в сессиях

А на кой хрен нужно id корзины вообще? Есть клиент, есть его корзина. Зачем привязываться к сессии, если можно тупо положить её в JSON-строку и рулить ею только в клиентской части? То есть, серверной логики не нужно совсем, а просто соотнести id клиента с его строкой-списком покупок. И рассматривать корзину не как уже купленный или заказанный товар, а просто как список планируемых покупок, которым он по сути и является.

У клиента может быть одна корзина. Если ему она не нравится — он сам её очистит, или можно установить таймаут на неделю-две.

А вот когда корзина уже трансформировалась в заказ — тут уже совершенно другая песня: с резервированием товара, с фиксацией цен, с генерацией и выдачей счёта (и фиксацией его срока действия). До тех пор ничего предпринимать не нужно, это клиентский объект который серверной части не интересен, сервер его просто хранит за пользователем.

без локал стораджа, перегрузка страницы ее погубит.

и если в сессии хранить то погубит ?

Так предлагают жеж

тупо положить её в JSON-строку и рулить ею только в клиентской части
Я тоже за сессию ;)

Что значит без локал стораджа? Он поддерживается везде — caniuse.com/#feat=namevalue-storage Не вижу причины не использовать его.

у меня в грейлог, очень иногда, но падает что он запрещен, так что

везде
это знаменитые 99,9%

Полифилы (gist.github.com/remy/350433) спасут отца русской демократии, затачивающего свой сайт под юзеров, которые понимают, что им не нужно апдейтить своего ослика до новаторской 8й версии.

Ну если куки понеслись, то чем сессия не подходит )
Да и запрещен != старый браузерок.
Но, должен отметить, прежде всего, что

«Але я не за те» ©

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

Не изобретай велосипед, возьми что-то из фреймворков для магазина. Иначе (если это реальный магазин) наступишь на те же грабли что и создатели сего счастья до тебя. Малейшая дырочка — и тебя поимеют на деньги.

Дырочки появляются от взятия фреймворков без понимания, как оно вообще работает.
Хочет человек попробовать — пусть пробует.

Малейшая дырочка — и тебя поимеют на деньги
Продадут базу телефонных номеров? За которую они не отвечают. Страаашно.

Нет. Установят себе всевозможные скидки, накидают купонов на покупки и прочие ништяки.

«Здрасьте, это манагер магазина nakolenke нет уа, мы посмотрели ваш заказ, о***и позвонили на склад и там товара нет, kthxbye»

Это даже если не думать, откуда купоны и скидки появляются.
А появляются они, когда берут «готовое решение» и ставят как есть.
Потому что граблей в N-мегабайтном болоте кода ещё больше, чем в базовом языке.
И документированы они хуже.

Т.е. вы считаете, что человек, который задает вопрос «помогите написать алгоритм корзины на массивах и сессиях» справится с этой задачей лучше (сделаем меньше дырок) чем огромное коммьюнити фреймворка/движка магазина?

Дырочки появляются от взятия фреймворков без понимания, как оно вообще работает.
Вообще-то автор обратился за рекомендацией по алгоритму корзина-сессия ) а не в помощи выбора фреймворка
Следовательно, да, будет хорошо написать свое решение, а после просмотреть уйму кода, — найти «свой» алгоритм...

пожалуйста не сочтите за грубость, search: e-commerce shopping cart workflow много есть в картинках, очень наглядно, ну а в ПХП переписать уже дело обычное

вот, получше запрос: (commerce || «shopping cart») & (workflow || flowchart || algorithm)
немного комбинаций и можно подобрать, или более абстрактно про коммерц, или более схематично, предметно

Якщо це буде реальний магазин для реального клієнта то краще бери шось готове. Просто настрой шось типу X-Cart .
А якщо просто потреніруватися або ще непонятно чи це буде робочий магазин то роби сам з нуля.

Підписатись на коментарі