Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Пишу свою корзину / 22 сообщений из 22, страница 1 из 1
11.04.2015, 12:25
    #38933733
kolyan2288
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пишу свою корзину
Привет IT- специалистам, пишу первый интернет-магазин, разрабатываю на Yii, пишу Class корзины, было решено хранить данные корзины в Cookie.

1. Получаю Get параметр id товара;
2. Кол-во товара по умолчанию = 1;
3. Получаю цену товара из БД;
4. Записываю все данные в массив;
5. Отправляю в куки формат JSON сформированного массива;

вот что получаем
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 
Array
  (
     [cart] => CHttpCookie Object
        (
           [name] => cart
           [value] => {"cart":{"134972":{"count":1,"price":"330"}}}
                  
         )
   )


т е в [value] храниться многомерный массив в формате json,

пугает одно : при изменении кол-во товара или добавлении нового товара, переписывается все значение [value] новый строкой json (массива) или это норма на практике для корзины? спасибо
наверное вопрос можно было написать короче )))))
...
Рейтинг: 0 / 0
11.04.2015, 12:48
    #38933743
bazile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пишу свою корзину
kolyan2288, раз ты используешь cookie, то любые изменения подразумевают полную замену значения. Никак иначе. И не важно корзина это или что-то другое.

kolyan22881. Получаю Get параметр id товара;
Добавлять товары в корзину следует POST запросом т.к. GET запрос не должен иметь побочных эффектов.

kolyan22884. Записываю все данные в массив;
Хранения цены в cookie плохая идея т.к. её значение несложно исправить или подделать.
...
Рейтинг: 0 / 0
11.04.2015, 13:29
    #38933781
kolyan2288
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пишу свою корзину
bazilekolyan2288, раз ты используешь cookie, то любые изменения подразумевают полную замену значения. Никак иначе
Так и предполагал, но вроде время обработки быстрое на куки.
bazileДобавлять товары в корзину следует POST запросом т.к. GET запрос не должен иметь побочных эффектов.
Переправлю на POST, какие побочные эффекты у GET ? инфы не встречал
bazileХранения цены в cookie плохая идея т.к. её значение несложно исправить или подделать.
Даже не подумал об этом спасибо предупрелили, тогда напишу функцию return price по id товара, а в куки тока записывать кол-во выбранного товара.
...
Рейтинг: 0 / 0
11.04.2015, 17:24
    #38933860
bazile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пишу свою корзину
kolyan2288какие побочные эффекты у GET ? инфы не встречал
Ты не понял. У GET запроса как раз не должно быть побочных эффектов. В данном случае таким эффектом является добавление товара в корзину. Поэтому здесь правильнее использовать POST который создан как раз для операций с побочным эффектом. Именно поэтому при попытке обновить страницу полученную через POST все браузеры спрашивают разрешение на повторную отправку данных. Подробности смотри в RFC 7231: 4.2.1 Safe Methods .

kolyan2288Даже не подумал об этом спасибо предупрелили, тогда напишу функцию return price по id товара, а в куки тока записывать кол-во выбранного товара.
Советую хранить всю корзину в БД, а в cookie хранить только идентификатор корзины. Причем чтобы избежать подбора идентификаторов с целью доступа к чужим корзинам следует использовать длинные и непоследовательные идентфикаторы. Например, GUID. Ну и если на сайте есть авторизация делать проверку что пользователь обращается к своей корзине.
...
Рейтинг: 0 / 0
11.04.2015, 19:32
    #38933908
kolyan2288
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пишу свою корзину
bazile Именно поэтому при попытке обновить страницу полученную через POST все браузеры спрашивают разрешение на повторную отправку данных. Подробности смотри в RFC 7231: 4.2.1 Safe Methods .
Теперь понял о чём речь, сталкивался.
bazileСоветую хранить всю корзину в БД, а в cookie хранить только идентификатор корзины. Причем чтобы избежать подбора идентификаторов с целью доступа к чужим корзинам следует использовать длинные и непоследовательные идентфикаторы. Например, GUID. Ну и если на сайте есть авторизация делать проверку что пользователь обращается к своей корзине.
Если авторизованного(зарегистрировавшего) пользователя данные корзины хранить в БД, а у неавторизованных в куки? (планирую такой вариант).

По теме идентификаторам корзины немного не понял, особенно второй вариант:
1. При варианте если пользователь зарегистрирован и авторизован, в тб tb_user будет поле id_cart (индификатор корзины привязанный к покупателю) к полю id_cart тб tb_cart . (поле id_cart сгенерирую как GUID). т е тут можно обойтись без cookias?

2. Если для не зарегистрированных покупателей, в тб tb_user их нет, рандомно сгенерирую id_cart и запишу в cookia, где тут взять id не зарегистрированного покупателя? что-то мне подсказывает из глобального массива $_SERVER
...
Рейтинг: 0 / 0
11.04.2015, 20:35
    #38933935
bazile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пишу свою корзину
kolyan2288, я бы создал таблицы cart c полями (cart_id GUID PK, user_id int NULL, .... ) и cart_content (cart_content_id int PK, cart_id GUID FK NOT NULL, ....). Это удобнее потому что мы будем одинаково работать с корзиной для авторизованных и анонимных посетителей. В твоем же случае придется писать два разных механизма которые делают по сути одно и то же. Это увеличивает вероятность ошибки.

Алгоритм добавления товара в корзину:
1) Проверяем есть ли cookie с ID корзины. Если нет, то генерируем новый GUID. Если да, то проверяем есть ли такая корзина в БД. Если такой корзины нет, то генерируем новый GUID. Если такая корзина есть, то если пользователь авторизован одновременно проверяем что это его корзина. Если корзина чужая, то выдаем ошибку.
1.1) При необходимости создаем корзину т.е. новую запись в таблице cart
2) Добавляем указанный товар в корзину используя GUID с шага 1. Новая запись в таблице cart_content.
3) Отправляем клиенту cookie с ID корзины

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

Важный момент который нельзя упустить, это регистрация анонимного пользователя с корзиной. В этом случае после завершения регистрации - то есть когда известен user_id - мы выполняем запрос вида UPDATE cart SET user_id = AAA WHERE cart_id = ZZZ и миграция завершена.
...
Рейтинг: 0 / 0
11.04.2015, 21:34
    #38933955
kolyan2288
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пишу свою корзину
bazileВажный момент который нельзя упустить, это регистрация анонимного пользователя с корзиной. В этом случае после завершения регистрации - то есть когда известен user_id - мы выполняем запрос вида UPDATE cart SET user_id = AAA WHERE cart_id = ZZZ и миграция завершена.

Это тоже хотел спросить, но теперь разобрался.
bazile спасибо что уделил время на рассмотрение теоретической части моей корзины, подсказал много нужных моментов, буду теперь реализовывать
...
Рейтинг: 0 / 0
11.04.2015, 21:57
    #38933961
bazile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пишу свою корзину
kolyan2288, пожалуйста. Кстати есть еще пара моментов

1) Что делать если авторизованный посетитель с корзиной сделает logout? Т.к. удобство пользователя должно быть приоритетом, то следует дать возможность рабоать с ней дальше. Или показывать корзину в режиме только-чтение пока он не пройдет аутентификацию.

2) Полезный побочный эффект от хранения корзины в БД это её переносимость между разными компьютерами и сохранность даже если пользователь очистит cookie. В этом случае после входа на сайт нужно проверить есть ли к БД корзина для данного пользователя. Если есть, а cookie с ID корзины нет, то отправить её.

3) Если не планируешь работать с ID корзины из JS, то следует использовать http-only cookie.
...
Рейтинг: 0 / 0
11.04.2015, 22:17
    #38933965
kolyan2288
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пишу свою корзину
bazile3) Если не планируешь работать с ID корзины из JS, то следует использовать http-only cookie.
JS не планирую, тока ajax обновлять корзину, http-only cookie корзины включу.)
...
Рейтинг: 0 / 0
12.04.2015, 01:23
    #38934017
Пишу свою корзину
Сессия уже есть... у нее есть идентификатор... уникальный... не будет хвостов в таблице с незаконченными покупками и тд. Не нужно будет заморачиваться с куками и прочим.... обсуждалось не раз на этих форумах;) там пару методов crud написать в классе!;)
...
Рейтинг: 0 / 0
12.04.2015, 01:28
    #38934019
Пишу свою корзину
Кстати. Про побочный эффект от хранения в бд;) пользователь зашел через недельку с др компа а товара уже и нету в продаже... или цена изменилась или скидка закончилась...! Корзина дело такое! Здесь и сейчас. заказал и забыл;)
...
Рейтинг: 0 / 0
12.04.2015, 05:54
    #38934036
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пишу свою корзину
как то так...Про побочный эффект от хранения в бд;) пользователь зашел через недельку с др компа а товара уже и нету в продаже... или цена изменилась или скидка закончилась...!Какая разница, в базе хранить корзину или в куках или ещё где... При правильном подходе описанные ситуации (и не только их) необходимо предусмотреть независимо от способа хранения данных.

как то так...Здесь и сейчас.Да-да, особенно радуют магазины, у кого корзина помирает вместе с сессией. Отвлёкся на пол-часика - а корзина уже пуста... Сессия издохла :-)
...
Рейтинг: 0 / 0
12.04.2015, 09:18
    #38934054
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пишу свою корзину
как то так...не будет хвостов в таблице с незаконченными покупками
потеря информации о поведении посетителя
...
Рейтинг: 0 / 0
12.04.2015, 10:18
    #38934064
Пишу свою корзину
автор При правильном подходе описанные ситуации (и не только их) необходимо предусмотреть независимо от способа хранения данных.
Да-да, особенно радуют магазины...
Об чем и речь;) Используя сессию предусмотреть нужно будет на порядок меньше чем в случае с бд!
значит, я не одинок!
авторпотеря информации о поведении посетителя
корзина и статистика - разные вещи;)

напочитать ;) http://www.sql.ru/forum/729339/kak-realizovat-korzinu-v-internet-magazine
...
Рейтинг: 0 / 0
12.04.2015, 17:50
    #38934251
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пишу свою корзину
как-то так...значит, я не одинок!
это аргумент?
...
Рейтинг: 0 / 0
13.04.2015, 23:41
    #38935383
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пишу свою корзину
bazilekolyan2288, раз ты используешь cookie, то любые изменения подразумевают полную замену значения. Никак иначе. И не важно корзина это или что-то другое.

kolyan22881. Получаю Get параметр id товара;
Добавлять товары в корзину следует POST запросом т.к. GET запрос не должен иметь побочных эффектов.

kolyan22884. Записываю все данные в массив;
Хранения цены в cookie плохая идея т.к. её значение несложно исправить или подделать.

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


ГЕТ запрос, по умолчанию кешируеться. тоесть если у тебя заказ первого товара 1, и ответ попадёт в кеш, то для следующей покупки, в теории, при покупке сначала товаров 2, 3, ...100, а потом первого, ответ может вернуться из кеша - и в корзине твоей в куках получиться купленый товар только первый!!!

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

(вообще конечно же ты можешь возразить, а какже пагинация на сайте новостей...там всегда любая страница новостей выдаёт немного другой список новостей(новости пополняються) - ответ, управление кешем, последняя дата модификации/етег в хедерах)...ты первый раз делаешь, делай проще!)

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

насчёт защиты от третьих лиц...ну тут шттпс надо а не куки или не куки.

другое дело, что любые данные от клиента надо проверять, дабы небыло сбоя в работе.

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

не вдаваясь в более глубокие дебри - вывод, зрани на сервере - в данных сесии.
так просто проще. да и логичней.(при заказе по телефону, тебе же на каждое слово не возвращают список текущего всего заказа, и в конце ты не должен его огласить целиком.
...
Рейтинг: 0 / 0
14.04.2015, 09:43
    #38935552
bazile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пишу свою корзину
alex564657498765453гет запрос должен отдавать всегда одно и тоже на один и тот же запрос
alex564657498765453(вообще конечно же ты можешь возразить, а какже пагинация на сайте новостей...там всегда любая страница новостей выдаёт немного другой список новостей(новости пополняються) - ответ, управление кешем, последняя дата модификации/етег в хедерах
Сам придумал про "гет запрос должен" и сразу же себя опровергнул. Молодец.

alex564657498765453хранить корзину в куках - вполне нормально, с точки зрения сервера, ему всеравно кто и как будет подделывать корзину. от этого торговая логика не изменится. пришол заказ 10 коробок трусов, ну счёт на платёжную систему будет выставлен на 10 коробок трусов, и побую что человек подделал корзину.
Я говорил только о хранении цены, а не корзины.
...
Рейтинг: 0 / 0
14.04.2015, 17:00
    #38936243
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пишу свою корзину
bazilealex564657498765453гет запрос должен отдавать всегда одно и тоже на один и тот же запрос
alex564657498765453(вообще конечно же ты можешь возразить, а какже пагинация на сайте новостей...там всегда любая страница новостей выдаёт немного другой список новостей(новости пополняються) - ответ, управление кешем, последняя дата модификации/етег в хедерах
Сам придумал про "гет запрос должен" и сразу же себя опровергнул. Молодец.

alex564657498765453хранить корзину в куках - вполне нормально, с точки зрения сервера, ему всеравно кто и как будет подделывать корзину. от этого торговая логика не изменится. пришол заказ 10 коробок трусов, ну счёт на платёжную систему будет выставлен на 10 коробок трусов, и побую что человек подделал корзину.
Я говорил только о хранении цены, а не корзины.

учи мат часть


Используется для запроса содержимого указанного ресурса. С помощью метода GET можно также начать какой-либо процесс. В этом случае в тело ответного сообщения следует включить информацию о ходе выполнения процесса.

Клиент может передавать параметры выполнения запроса в URI целевого ресурса после символа «?»:
GET /path/resource?param1=value1&param2=value2 HTTP/1.1

Согласно стандарту HTTP, запросы типа GET считаются идемпотентными

последнее слово, означает - но один и тот же запрос должен быть один и тот же ответ, при условии что содержимое не изменилось по иным причинам.

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

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

хотя если ссылка по типу /tovar50/col30/addcart/sess_key_fjlkdsjflkdsjfldsjflksdjflkds
и последнее генерируеться уникально и однорозовоиспользуеться...то можно и гетом.
Читаем строку - или гет запрос может начать какой либо процесс, и ответ - состаяние этого процесса. в данном случае процес, заталкивание выбранной части покупки, идентифицированную сессионым ключом, который только для этой покупки, и только один раз, в корзину... но это уже маразм для интернет магазина. подобное нужно если в магазине выбираеться не готовый товар, а через кучу кликов конструируеться заказ. например пица из запчастей.
собственно тогда добавление сконтруированой пицы мало чем отличаеться к продвижению заказа к исполнению(корзины). и вполне нормально использовать гет, но надо добавить чтото уникальное в ссылку, что б не нарушать феншуй.
...
Рейтинг: 0 / 0
14.04.2015, 17:08
    #38936255
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пишу свою корзину
bazile,

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

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

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

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

исходя из это и строить логику. и пренебрегать, тем чем готов пренебречь...
например для случая описания товара с числом просмотров, что вася смотря 1000м товар, увидит описание из кеша с числом просмотра 700. устраивает вперёд, нет, начинаем играться хедарами управления кешированием, или исчём другой путь.
...
Рейтинг: 0 / 0
14.04.2015, 21:52
    #38936520
Пишу свою корзину
https://ru.m.wikipedia.org/wiki/Бритва_Оккама почему то вспомнилось;)
...
Рейтинг: 0 / 0
15.04.2015, 01:24
    #38936618
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пишу свою корзину
как то так... https://ru.m.wikipedia.org/wiki/Бритва_Оккама почему то вспомнилось;)
йад в аптеке
...
Рейтинг: 0 / 0
04.05.2015, 15:42
    #38951153
kolyan2288
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пишу свою корзину
написал корзину как сказал bazile спасибо, удобная реализация
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Пишу свою корзину / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]