Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Добавление товаров для интернет магазина
 
 автор: deff   (25.01.2009 в 00:33)   письмо автору
 
 

Здравствуйте!
Возникла такая проблемка. Надо написать код, добавляющий выбранные товары в корзину. Сначала думал все просто - создал табличку basket в базе, заполняется в соответствии с выбранными товарами, из нее же выводится общая сумма покупки, сами добаленные товары, их цены и т.д.
Вопрос: Как в этой табличке идентифицировать юзера? (регистрация не предусмотрена). Сначала думал просто удалять табличку при выходе с сайта и заново создавать при входе, но в этом случае я думаю будут конкретные глюки при заказе товара несколькими юзерами одновременно..... т.е. табличка всегда должна существовать, быть наполнена разными заказами, и при этом по какому то параметру корзина текущего юзера должна наполняться только его заказами...
Вроде это делается как то с помощью session_id(), но никак не разберусь с синтаксисом этой функции... Заранее благодарен за ответ)

  Ответить  
 
 автор: Trianon   (25.01.2009 в 00:43)   письмо автору
 
   для: deff   (25.01.2009 в 00:33)
 

как сейчас Вы идентифицируете посетителя в самом сайте?
Создавать таблички и удалять их не надо.
Надо один раз создать таблицу при установке скрипта.
В таблице предусмотреть поле идентификатора клиента.
Строки удалять либо при завершении работы с заказом, либо по истечении таймаута (24часа к примеру).

Между прочим, ничто не мешает Вам держать корзину не в таблице, а в сессионном массиве, или даже в кукисах.
Уж коль скоро регистрации нет, то длительное хранение заказа ничем не обусловлено.

  Ответить  
 
 автор: deff   (25.01.2009 в 00:49)   письмо автору
 
   для: Trianon   (25.01.2009 в 00:43)
 

Идентификация происходит уже после того как заказ сформирован... При нажатии на кнопочку "оформить заказ". До этого момента никак...
А чем это поле в табличке заполнять? Просто не хочется до заказа инфу какую то у клиента запрашивать... Я думал - сначала накидал заказов в корзину - потом уже имя, контактные данные и т.д на этапе оформления заказа

  Ответить  
 
 автор: Trianon   (25.01.2009 в 00:51)   письмо автору
 
   для: deff   (25.01.2009 в 00:49)
 

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

  Ответить  
 
 автор: deff   (25.01.2009 в 00:55)   письмо автору
 
   для: Trianon   (25.01.2009 в 00:51)
 

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

  Ответить  
 
 автор: sim5   (25.01.2009 в 02:19)   письмо автору
 
   для: deff   (25.01.2009 в 00:55)
 

У вас должны быть две таблицы - корзина содержащая товары заказа, и таблица заказов содержащая номера заказов и информацию о покупателе. В то время когда покупатель набирает товар, как его зовут, да и вообще кто он такой, вам совсем не важно знать. Товары, при их выборе, нужно помещать в сессию, а как только покупатель оформит заказ, заполняется таблица заказов информацией о пользователе: ФИО, адрес, способ оплаты, доставки и т.п.. После этого товары этого заказа из сессии переписываются в таблицу корзины, родителем для которых указать номер только что вставленной записи ID заказа.
Корзина в таблице на этапе выбора товара - ну это, если пользователь зарегистрированный, и вы предоставляете ему сервис типа отложенной покупки. Иначе какой смысл в таком геморрое.

  Ответить  
 
 автор: deff   (25.01.2009 в 10:08)   письмо автору
 
   для: sim5   (25.01.2009 в 02:19)
 

Извиняюсь за возможно глупый вопрос, я еще пока только учусь..... А помещать товары в сессию это как?)

  Ответить  
 
 автор: sim5   (25.01.2009 в 10:13)   письмо автору
 
   для: deff   (25.01.2009 в 10:08)
 

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

  Ответить  
 
 автор: Trianon   (25.01.2009 в 12:24)   письмо автору
 
   для: deff   (25.01.2009 в 10:08)
 

То есть для Вас добавить строку в таблицу проще, чем добавить в массив еще один элемент?

  Ответить  
 
 автор: mechanic   (25.01.2009 в 12:06)   письмо автору
 
   для: deff   (25.01.2009 в 00:49)
 

заходит клиент, проверяете у него спец.куку, если ее нет - генерите и ставите, создавая при этом временного пользователя в таблице юзеров, если она есть - выбираете по ней ID юзера, вот к этому ID и привязывается корзина
примеры таблиц:
- юзеры
id (integer)
uniqueCookieID (string)
остальные поля типа фио, емайл пароль и т.д.
- корзина
user_id (integer) = юзеры.id
item_id (integer) = прайслист.id_товара

т.е. получится, что у вас будет создаваться новый пустой пользователь в таблице только лишь по факту ЗАХОДА на сайт, а далее все данные будут просто добавляться к его профилю, он даже и знать не будет, что все его действия записываются )

  Ответить  
 
 автор: BinLaden   (25.01.2009 в 12:15)   письмо автору
 
   для: mechanic   (25.01.2009 в 12:06)
 

Зачем использовать таблицу пользователей в качестве таблицы идентификаторов сессий, хоть Вы это явно так и не называете?

  Ответить  
 
 автор: deff   (25.01.2009 в 14:41)   письмо автору
 
   для: BinLaden   (25.01.2009 в 12:15)
 

Всем спасибо за помощь, проблему решил) Может быть не самым оптимальным способом, но вполне действенным. Табличка корзины в базе содержит поле session_id, в которое записывается результат работы функции: session_id() (только предварительно сесиию надо создать функцией session_start()). Вункция возвращает шестнадцатиричный уникальный идентификатор сессии, причем он хранится вроде бы не только в куках, но и на сервере до завершения сессии (поправьте если не прав).... Ну и потом просто делаю выбор из базы по этому полю session_id и все работает!) Если этот способ имеет принципиальные недостатки буду благодаоен за комментарии)

  Ответить  
 
 автор: sim5   (25.01.2009 в 15:10)   письмо автору
 
   для: deff   (25.01.2009 в 14:41)
 

А если у пользователя куки отключены?

  Ответить  
 
 автор: Valick   (25.01.2009 в 15:15)   письмо автору
 
   для: sim5   (25.01.2009 в 15:10)
 

Это не так страшно как если бы у пользователя небыло бы компьютера ;)

  Ответить  
 
 автор: sim5   (25.01.2009 в 15:17)   письмо автору
 
   для: Valick   (25.01.2009 в 15:15)
 

Вы так думаете? Ну тогда эта временная корзина (а тем более не оформленная, так как все строится совсем не на 100% выполняемых условиях), это мертвый груз в базе.

  Ответить  
 
 автор: Valick   (25.01.2009 в 15:28)   письмо автору
 
   для: sim5   (25.01.2009 в 15:17)
 

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

  Ответить  
 
 автор: sim5   (25.01.2009 в 15:53)   письмо автору
 
   для: Valick   (25.01.2009 в 15:28)
 

А при чем тут вх./вых данные? Ну записали вы куки, не записали, суть то не в этом. В базу вы пишите. Если заказ оформлен, то зачем записывать его в куки? Зачем при этом хранить идентификатор сессии? Если не оформлен, то тоже самое - куча недостатков. Есть простой механизм - сессия, и для незарегистрированных покупателей, это самый выгодный инструмент, который лишает головной боли.
Так уж получилось, что я более всего связан с магазином, и большая часть покупателей делает заказы во время работы, и не факт, что каждый из них является единственным пользователем рабочего компьютера. Это уже не в пользу записи товаров в куки, передачи идентификатора сессии и т.п..
Если покупатель зарегистрирован, значит можно держать его покупку в его личном кабинете - вы всегда можете обратиться к покупателю в случае, если он "забыл" о своем заказе. Но зачем держать мусор в базе корзины заказа не оформленного, проверять его постоянно... В общем это лишнее и совсем не нужное.

  Ответить  
 
 автор: Valick   (25.01.2009 в 16:18)   письмо автору
 
   для: sim5   (25.01.2009 в 15:53)
 

Вы используете базу данных тупо для хранения информации? Если так то, лучше вообще от неё отказаться а ограничиться сессией и файлами.
А вот для детального анализа приобретаемой продукции, динамики цен, сопутствующих товаров да и ещё кучухренпоймичего , лично я бы поместил информацию не просто в сессионную переменную, а именно в базу.
У меня не хватает слов (патамушо трезвый) и времени (патамушо на работе) объяснить свою точку зрения))

  Ответить  
 
 автор: sim5   (25.01.2009 в 16:22)   письмо автору
 
   для: Valick   (25.01.2009 в 16:18)
 

>Вы используете базу данных тупо для хранения информации?

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

  Ответить  
 
 автор: Николай2357   (25.01.2009 в 17:28)   письмо автору
 
   для: Valick   (25.01.2009 в 16:18)
 

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

  Ответить  
 
 автор: sim5   (25.01.2009 в 17:38)   письмо автору
 
   для: Николай2357   (25.01.2009 в 17:28)
 

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

  Ответить  
 
 автор: Valick   (25.01.2009 в 17:38)   письмо автору
 
   для: Николай2357   (25.01.2009 в 17:28)
 

Вам и в интернет магазине никто не запрещает ограничить время ожидания оплаты товара. Не в этом суть.

  Ответить  
 
 автор: Trianon   (25.01.2009 в 16:20)   письмо автору
 
   для: sim5   (25.01.2009 в 15:53)
 

>Если покупатель зарегистрирован, значит можно держать его покупку в его личном кабинете - вы всегда можете обратиться к покупателю в случае, если он "забыл" о своем заказе. Но зачем держать мусор в базе корзины заказа не оформленного, проверять его постоянно... В общем это лишнее и совсем не нужное.

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

  Ответить  
 
 автор: sim5   (25.01.2009 в 16:34)   письмо автору
 
   для: Trianon   (25.01.2009 в 16:20)
 

Я не говорю о заказе, я говорю о корзине. Я исхожу из того, что корзина товаров, это еще не заказ. О куках забудем (не для автора). Теперь ситуация, когда пользователь набрал корзину и "успешно забыл" о ней. В случае с базой, вам нужно самостоятельно ее "чистить", устанавливая период и т.п.. Никакой вам идентификатор не поможет, тут только от фонаря на глазок брать время, проверять...
Личный кабинет клиента, может держать заказы в базе, а также корзину. Время такого отложенного заказа вы обуславливаете конечно, но это сервис для клиента. Уж коли вы торгуете, то вы следите и за заказами, и ведете статистику, а уж тем более хотите привлечь клиентов. Это розыгрыши товара, скидки, накопления и многое другое. Но это только по итогам реально реализованных заказов, а не по "плавающим" корзинам.
Корзина, она и есть корзина, набрали, оплатили, и она больше не нужна. Ну а коли не оплатили, то тут уж как кому и какой геморрой нравиться. Для пользователей незарегистрированных (одноразовых) писать ее в базу, ну это нечто...
Впрочем, вы с Valik'om можете торговать так :)

  Ответить  
 
 автор: Trianon   (25.01.2009 в 16:44)   письмо автору
 
   для: sim5   (25.01.2009 в 16:34)
 

>Я не говорю о заказе, я говорю о корзине. Я исхожу из того, что корзина товаров, это еще не заказ. О куках забудем (не для автора).
Если забыть, то я не вижу предмета для спора.

  Ответить  
 
 автор: Valick   (25.01.2009 в 17:14)   письмо автору
 
   для: sim5   (25.01.2009 в 16:34)
 

В случае с базой, вам нужно самостоятельно ее "чистить", устанавливая период и т.п.
Я всегда считал, что именно поэтому и придумали программирование ;)
Любите кататься, любите и саночки возить))

  Ответить  
 
 автор: sim5   (25.01.2009 в 17:17)   письмо автору
 
   для: Valick   (25.01.2009 в 17:14)
 

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

  Ответить  
 
 автор: Valick   (25.01.2009 в 15:19)   письмо автору
 
   для: deff   (25.01.2009 в 14:41)
 

Да идентификатор хранится в куках, а если они отключены то передаётся в адресной строке принудительно или автоматически. На сервере он храниться само собой и сравнивается с переданным от браузера пользователя.

[поправлено модератором]

  Ответить  
 
 автор: deff   (26.01.2009 в 17:34)   письмо автору
 
   для: Valick   (25.01.2009 в 15:19)
 

Спасибо всем за комменарии)

to Valick: "Интересно зачем Вы с таким уровнем знаний берётесь за корзину?"
Ну ведь сделал же) И принципиальных ошибок пока не обнаружено.... Учатся же на чем то люди)

to sim5 "А если у пользователя куки отключены?"
Я так понимаю понимаю, что это пофиг, если идентификатор сессии хранится на сервере

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

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

  Ответить  
 
 автор: sim5   (26.01.2009 в 18:03)   письмо автору
 
   для: deff   (26.01.2009 в 17:34)
 

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

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

  Ответить  
 
 автор: deff   (26.01.2009 в 18:27)   письмо автору
 
   для: sim5   (26.01.2009 в 18:03)
 

to sim5: Полностью согласен с Вами! Только в этой теме я хотел спросить немного не о том... а именно о технической реализации данного вопроса.
Я не говорю, что регистрация не нужна, я говорю что она НЕ ОБЯЗАТЕЛЬНА для покупки, хотя она и дает пользователю определенные преимущества. А меркетинг это ведь не программирование, там все гораздо неоднозначнее, там все зависит от товара, целевой аудитории и т.д.... хотя мы ушли от темы)

to Trianon: "На сервере хранится набор сериализованных сессионных массивов. Всех живых сессий"
Если можно поподробнее по этому вопросу. Что он из себя представляет? Его формат? Как получить его значения?

  Ответить  
 
 автор: Trianon   (26.01.2009 в 18:38)   письмо автору
 
   для: deff   (26.01.2009 в 18:27)
 

зачем?

  Ответить  
 
 автор: sim5   (26.01.2009 в 19:40)   письмо автору
 
   для: deff   (26.01.2009 в 18:27)
 

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

  Ответить  
 
 автор: dim0s   (26.01.2009 в 21:10)   письмо автору
 
   для: deff   (26.01.2009 в 18:27)
 

Делал я именно такую карзину. две таблицы - shopping_carts и shopping_carts_to_products.
при первом клике на купить или добавить в корзину создается новая корзина и ее id записывается посетителю в сесию. Потом он туда может добавлять или удалять, тыры-пыры(shopping_carts_to_products).

Если всеж купить собрался предлагается идентифицироваться(ввести пароль если уже есть или новая регистрация) и уж все из корзины с тем id что в сесии ему в заказ валиться.


в shopping_carts присутствует поле куда записывается время последнего обращения к корзине. (при добавлении, удалении обновляется.)

В crone каждый день скрипт удаляет записи у которых интервал от последнего доступа больше 12 часов. из обоих таблиц.

  Ответить  
 
 автор: Trianon   (26.01.2009 в 18:05)   письмо автору
 
   для: deff   (26.01.2009 в 17:34)
 

>to sim5 "А если у пользователя куки отключены?"
>Я так понимаю понимаю, что это пофиг, если идентификатор сессии хранится на сервере

неправильно понимаете.
Никакой идентификатор сессии на сервере не хранится.
На сервере хранится набор сериализованных сессионных массивов. Всех живых сессий.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования