Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Пишу свою корзину
|
|||
|---|---|---|---|
|
#18+
Привет IT- специалистам, пишу первый интернет-магазин, разрабатываю на Yii, пишу Class корзины, было решено хранить данные корзины в Cookie. 1. Получаю Get параметр id товара; 2. Кол-во товара по умолчанию = 1; 3. Получаю цену товара из БД; 4. Записываю все данные в массив; 5. Отправляю в куки формат JSON сформированного массива; вот что получаем Код: javascript 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. т е в [value] храниться многомерный массив в формате json, пугает одно : при изменении кол-во товара или добавлении нового товара, переписывается все значение [value] новый строкой json (массива) или это норма на практике для корзины? спасибо наверное вопрос можно было написать короче ))))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2015, 12:25 |
|
||
|
Пишу свою корзину
|
|||
|---|---|---|---|
|
#18+
kolyan2288, раз ты используешь cookie, то любые изменения подразумевают полную замену значения. Никак иначе. И не важно корзина это или что-то другое. kolyan22881. Получаю Get параметр id товара; Добавлять товары в корзину следует POST запросом т.к. GET запрос не должен иметь побочных эффектов. kolyan22884. Записываю все данные в массив; Хранения цены в cookie плохая идея т.к. её значение несложно исправить или подделать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2015, 12:48 |
|
||
|
Пишу свою корзину
|
|||
|---|---|---|---|
|
#18+
bazilekolyan2288, раз ты используешь cookie, то любые изменения подразумевают полную замену значения. Никак иначе Так и предполагал, но вроде время обработки быстрое на куки. bazileДобавлять товары в корзину следует POST запросом т.к. GET запрос не должен иметь побочных эффектов. Переправлю на POST, какие побочные эффекты у GET ? инфы не встречал bazileХранения цены в cookie плохая идея т.к. её значение несложно исправить или подделать. Даже не подумал об этом спасибо предупрелили, тогда напишу функцию return price по id товара, а в куки тока записывать кол-во выбранного товара. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2015, 13:29 |
|
||
|
Пишу свою корзину
|
|||
|---|---|---|---|
|
#18+
kolyan2288какие побочные эффекты у GET ? инфы не встречал Ты не понял. У GET запроса как раз не должно быть побочных эффектов. В данном случае таким эффектом является добавление товара в корзину. Поэтому здесь правильнее использовать POST который создан как раз для операций с побочным эффектом. Именно поэтому при попытке обновить страницу полученную через POST все браузеры спрашивают разрешение на повторную отправку данных. Подробности смотри в RFC 7231: 4.2.1 Safe Methods . kolyan2288Даже не подумал об этом спасибо предупрелили, тогда напишу функцию return price по id товара, а в куки тока записывать кол-во выбранного товара. Советую хранить всю корзину в БД, а в cookie хранить только идентификатор корзины. Причем чтобы избежать подбора идентификаторов с целью доступа к чужим корзинам следует использовать длинные и непоследовательные идентфикаторы. Например, GUID. Ну и если на сайте есть авторизация делать проверку что пользователь обращается к своей корзине. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2015, 17:24 |
|
||
|
Пишу свою корзину
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2015, 19:32 |
|
||
|
Пишу свою корзину
|
|||
|---|---|---|---|
|
#18+
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 и миграция завершена. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2015, 20:35 |
|
||
|
Пишу свою корзину
|
|||
|---|---|---|---|
|
#18+
bazileВажный момент который нельзя упустить, это регистрация анонимного пользователя с корзиной. В этом случае после завершения регистрации - то есть когда известен user_id - мы выполняем запрос вида UPDATE cart SET user_id = AAA WHERE cart_id = ZZZ и миграция завершена. Это тоже хотел спросить, но теперь разобрался. bazile спасибо что уделил время на рассмотрение теоретической части моей корзины, подсказал много нужных моментов, буду теперь реализовывать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2015, 21:34 |
|
||
|
Пишу свою корзину
|
|||
|---|---|---|---|
|
#18+
kolyan2288, пожалуйста. Кстати есть еще пара моментов 1) Что делать если авторизованный посетитель с корзиной сделает logout? Т.к. удобство пользователя должно быть приоритетом, то следует дать возможность рабоать с ней дальше. Или показывать корзину в режиме только-чтение пока он не пройдет аутентификацию. 2) Полезный побочный эффект от хранения корзины в БД это её переносимость между разными компьютерами и сохранность даже если пользователь очистит cookie. В этом случае после входа на сайт нужно проверить есть ли к БД корзина для данного пользователя. Если есть, а cookie с ID корзины нет, то отправить её. 3) Если не планируешь работать с ID корзины из JS, то следует использовать http-only cookie. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2015, 21:57 |
|
||
|
Пишу свою корзину
|
|||
|---|---|---|---|
|
#18+
bazile3) Если не планируешь работать с ID корзины из JS, то следует использовать http-only cookie. JS не планирую, тока ajax обновлять корзину, http-only cookie корзины включу.) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2015, 22:17 |
|
||
|
Пишу свою корзину
|
|||
|---|---|---|---|
|
#18+
Сессия уже есть... у нее есть идентификатор... уникальный... не будет хвостов в таблице с незаконченными покупками и тд. Не нужно будет заморачиваться с куками и прочим.... обсуждалось не раз на этих форумах;) там пару методов crud написать в классе!;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.04.2015, 01:23 |
|
||
|
Пишу свою корзину
|
|||
|---|---|---|---|
|
#18+
Кстати. Про побочный эффект от хранения в бд;) пользователь зашел через недельку с др компа а товара уже и нету в продаже... или цена изменилась или скидка закончилась...! Корзина дело такое! Здесь и сейчас. заказал и забыл;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.04.2015, 01:28 |
|
||
|
Пишу свою корзину
|
|||
|---|---|---|---|
|
#18+
как то так...Про побочный эффект от хранения в бд;) пользователь зашел через недельку с др компа а товара уже и нету в продаже... или цена изменилась или скидка закончилась...!Какая разница, в базе хранить корзину или в куках или ещё где... При правильном подходе описанные ситуации (и не только их) необходимо предусмотреть независимо от способа хранения данных. как то так...Здесь и сейчас.Да-да, особенно радуют магазины, у кого корзина помирает вместе с сессией. Отвлёкся на пол-часика - а корзина уже пуста... Сессия издохла :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.04.2015, 05:54 |
|
||
|
Пишу свою корзину
|
|||
|---|---|---|---|
|
#18+
как то так...не будет хвостов в таблице с незаконченными покупками потеря информации о поведении посетителя ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.04.2015, 09:18 |
|
||
|
Пишу свою корзину
|
|||
|---|---|---|---|
|
#18+
автор При правильном подходе описанные ситуации (и не только их) необходимо предусмотреть независимо от способа хранения данных. Да-да, особенно радуют магазины... Об чем и речь;) Используя сессию предусмотреть нужно будет на порядок меньше чем в случае с бд! значит, я не одинок! авторпотеря информации о поведении посетителя корзина и статистика - разные вещи;) напочитать ;) http://www.sql.ru/forum/729339/kak-realizovat-korzinu-v-internet-magazine ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.04.2015, 10:18 |
|
||
|
Пишу свою корзину
|
|||
|---|---|---|---|
|
#18+
как-то так...значит, я не одинок! это аргумент? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.04.2015, 17:50 |
|
||
|
Пишу свою корзину
|
|||
|---|---|---|---|
|
#18+
bazilekolyan2288, раз ты используешь cookie, то любые изменения подразумевают полную замену значения. Никак иначе. И не важно корзина это или что-то другое. kolyan22881. Получаю Get параметр id товара; Добавлять товары в корзину следует POST запросом т.к. GET запрос не должен иметь побочных эффектов. kolyan22884. Записываю все данные в массив; Хранения цены в cookie плохая идея т.к. её значение несложно исправить или подделать. не слушай его... человек говрит общие фразы не понимая их смысл. ГЕТ запрос, по умолчанию кешируеться. тоесть если у тебя заказ первого товара 1, и ответ попадёт в кеш, то для следующей покупки, в теории, при покупке сначала товаров 2, 3, ...100, а потом первого, ответ может вернуться из кеша - и в корзине твоей в куках получиться купленый товар только первый!!! проще говоря, дабы не стоять на тонком льду, гет запрос должен отдавать всегда одно и тоже на один и тот же запрос. так что для корзины не самый лучший способ. (вообще конечно же ты можешь возразить, а какже пагинация на сайте новостей...там всегда любая страница новостей выдаёт немного другой список новостей(новости пополняються) - ответ, управление кешем, последняя дата модификации/етег в хедерах)...ты первый раз делаешь, делай проще!) хранить корзину в куках - вполне нормально, с точки зрения сервера, ему всеравно кто и как будет подделывать корзину. от этого торговая логика не изменится. пришол заказ 10 коробок трусов, ну счёт на платёжную систему будет выставлен на 10 коробок трусов, и побую что человек подделал корзину. насчёт защиты от третьих лиц...ну тут шттпс надо а не куки или не куки. другое дело, что любые данные от клиента надо проверять, дабы небыло сбоя в работе. хранил бы корзину на сервере, не надо валидировать...а то вот пришла корзина, при валидации оказалось что вписан товар с несуществующим айди...и что пользователю вывести? а ведь может ошибка на сайте... при заказе товара 100, данные на сервер пошли 1000(один нолик от верстальщика остался лишний). не вдаваясь в более глубокие дебри - вывод, зрани на сервере - в данных сесии. так просто проще. да и логичней.(при заказе по телефону, тебе же на каждое слово не возвращают список текущего всего заказа, и в конце ты не должен его огласить целиком. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2015, 23:41 |
|
||
|
Пишу свою корзину
|
|||
|---|---|---|---|
|
#18+
alex564657498765453гет запрос должен отдавать всегда одно и тоже на один и тот же запрос alex564657498765453(вообще конечно же ты можешь возразить, а какже пагинация на сайте новостей...там всегда любая страница новостей выдаёт немного другой список новостей(новости пополняються) - ответ, управление кешем, последняя дата модификации/етег в хедерах Сам придумал про "гет запрос должен" и сразу же себя опровергнул. Молодец. alex564657498765453хранить корзину в куках - вполне нормально, с точки зрения сервера, ему всеравно кто и как будет подделывать корзину. от этого торговая логика не изменится. пришол заказ 10 коробок трусов, ну счёт на платёжную систему будет выставлен на 10 коробок трусов, и побую что человек подделал корзину. Я говорил только о хранении цены, а не корзины. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2015, 09:43 |
|
||
|
Пишу свою корзину
|
|||
|---|---|---|---|
|
#18+
bazilealex564657498765453гет запрос должен отдавать всегда одно и тоже на один и тот же запрос alex564657498765453(вообще конечно же ты можешь возразить, а какже пагинация на сайте новостей...там всегда любая страница новостей выдаёт немного другой список новостей(новости пополняються) - ответ, управление кешем, последняя дата модификации/етег в хедерах Сам придумал про "гет запрос должен" и сразу же себя опровергнул. Молодец. alex564657498765453хранить корзину в куках - вполне нормально, с точки зрения сервера, ему всеравно кто и как будет подделывать корзину. от этого торговая логика не изменится. пришол заказ 10 коробок трусов, ну счёт на платёжную систему будет выставлен на 10 коробок трусов, и побую что человек подделал корзину. Я говорил только о хранении цены, а не корзины. учи мат часть Используется для запроса содержимого указанного ресурса. С помощью метода GET можно также начать какой-либо процесс. В этом случае в тело ответного сообщения следует включить информацию о ходе выполнения процесса. Клиент может передавать параметры выполнения запроса в URI целевого ресурса после символа «?»: GET /path/resource?param1=value1¶m2=value2 HTTP/1.1 Согласно стандарту HTTP, запросы типа GET считаются идемпотентными последнее слово, означает - но один и тот же запрос должен быть один и тот же ответ, при условии что содержимое не изменилось по иным причинам. в случае пагинации, мы спомощью хедоров сообщаем всем промежуточным узлам, что список новостей(страница) изменчива...меняеться часто, поэтому при кешировании, нужно валидировать кеш. (условный гет посылать на сервер) и таки да, страница будет кеширована пока не появиться есчё одна новость. и это ни капли не перечит вышесказанному. в его случае с корзиной - это не подходит, опять же изза последнего слова... характерной особеностью этого являеться то, что многократные запросы должны быть эквивалентны оддинарному. в его случае это точно не так. хотя если ссылка по типу /tovar50/col30/addcart/sess_key_fjlkdsjflkdsjfldsjflksdjflkds и последнее генерируеться уникально и однорозовоиспользуеться...то можно и гетом. Читаем строку - или гет запрос может начать какой либо процесс, и ответ - состаяние этого процесса. в данном случае процес, заталкивание выбранной части покупки, идентифицированную сессионым ключом, который только для этой покупки, и только один раз, в корзину... но это уже маразм для интернет магазина. подобное нужно если в магазине выбираеться не готовый товар, а через кучу кликов конструируеться заказ. например пица из запчастей. собственно тогда добавление сконтруированой пицы мало чем отличаеться к продвижению заказа к исполнению(корзины). и вполне нормально использовать гет, но надо добавить чтото уникальное в ссылку, что б не нарушать феншуй. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2015, 17:00 |
|
||
|
Пишу свою корзину
|
|||
|---|---|---|---|
|
#18+
bazile, ты же сам по сути это же говорил, только не понимая что говоришь... я про фразу "без побочного эффекта" побочных ефектов может быть куча, главное чтоб целевой запрос не изменялся изза самого обращения. хотя это очень скользкий момент. если часть описания товара, являеться его рейтинг=число просмотров, то получаем что любой просмотр товара меняет само описание товара.это на многих сайтах встречаеться. я к тому, что идти путём дао, порой очень сложно... поэтому стоит абстрагироваться от идиализации, и посмотреть только на практическую сторону дела. гет бытсрее поста /пута гет кешируеться, пут нет(априори его не закеширует никто), пост в теории можно закешировать... но на деле... лишено смысла в большинстве случаев. исходя из это и строить логику. и пренебрегать, тем чем готов пренебречь... например для случая описания товара с числом просмотров, что вася смотря 1000м товар, увидит описание из кеша с числом просмотра 700. устраивает вперёд, нет, начинаем играться хедарами управления кешированием, или исчём другой путь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2015, 17:08 |
|
||
|
Пишу свою корзину
|
|||
|---|---|---|---|
|
#18+
https://ru.m.wikipedia.org/wiki/Бритва_Оккама почему то вспомнилось;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2015, 21:52 |
|
||
|
Пишу свою корзину
|
|||
|---|---|---|---|
|
#18+
как то так... https://ru.m.wikipedia.org/wiki/Бритва_Оккама почему то вспомнилось;) йад в аптеке ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2015, 01:24 |
|
||
|
|

start [/forum/topic.php?fid=23&msg=38951153&tid=1461799]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
159ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
66ms |
get tp. blocked users: |
1ms |
| others: | 258ms |
| total: | 527ms |

| 0 / 0 |
