Implementace nákupního košíku
- TanisCZ
- Člen | 80
Zdravím,
Dělám na jednom „e-shopu“, který se snažim implementovat s pomocí
Nette. Dostal jsem se do následujicího problému.
Ten e-shop je na zboží, které není neomezené, spíš naopak od každého
druhu je jen jeden kus.
Pro příklad : snažim se udělat e-shop, který se bude zabývat prodejem
hokejových kartiček (vzpomínáte ještě na tu dobu?.-)). Každá kartička
bude identifikovaná svým id. Nákup je umožněn pouze registrovaným a
hlavně přihlášeným uživatelům.
Každému registrovanému uživateli mám v plánu udělat košík
v databázi. A jak se budou kupovat položky, tak se bude
databáze plnit.
Až sem je to celkem bezproblémů. Problém je ale ten, že nemám od každého zboží více kusů. A to vede k situaci, kdy si kupujicí objedná kartičku a já ji hned v té chvíli musím zneaktivnit. Tak aby nedošlo k tomu, že si jednu kartičku bude chtít koupit více zákazníku.
Tak a těď ten hlavní problém : když má nakupujicí kartičku
v košíku je zablokovaná pro ostatní dokud nedokončí nákup a nebo se
neodhlásí se. Pokud se odhlásí klasickou cestu přes signout, jsem schopen,
košík vyprázdnit a kartičku znova zaktivnit. Problém ale nastává
v době, kdy si zákazník objedná kartičku a zavře prohlížeč a nebo jde
od pc. Dokud nedokončí nákup a nebo se řádně neodhlásí je kartička
zablokována.
Bojim se situace, kdy lidi takhle budou využívat e-shop jenom k blokaci
vzácných kusů kartiček.
Jak z toho ale ven? Díky tomu, že je http bezstavový protkol, tak neexistuje nic jako údálostmi řízený model. Tak jako při programování třeba v C#. Tam by to bylo jednoduché – počkal bych si na zprávu, kterou dává OS, když se zavírá okno aplikace a příslušně bych na ni zareagoval. Ale jak tohoto docílit v PHP?
Za každou radu budu vděčný :)
Editoval TanisCZ (7. 11. 2008 23:30)
- Honza Marek
- Člen | 1664
Napadlo mě ukládat datum zneaktivnění a aktualizovat ho… Pokud by bylo starší než půl hodiny, tak by se na něj nebral ohled.
- PetrP
- Člen | 587
A proč třeba „zneaktivnit“ kartičku až při dokončení objednávky, a až v tu chvíli ještě skontrolovat jestli je „aktivní/skladem“. Človek stějně musí každou objednávku řešit takže v prípadě že by se nedokončila tak jí stornovat (znovuaktivnit kartičku) popřípadě jí stornovat ještě po nějaké době (pro jistotu) kdy se nedokončí (dokončí myslím reálně prodá).
- phx
- Člen | 651
Nebo mu tam udelat upozorneni, ze karticka je blokovana na 30 min a pokud do te doby nedokonci objednavku tak ma smulu. S tim, ze na webu by mohlo byt take podpocitavani (karticka blokovana do…) Mozna by i umoznil prodlouzeni blokace. Pokud by zavrel okno tak po 30min by mel karticky fuc (v prodeji).
- TanisCZ
- Člen | 80
Díky všem za náměty. Přesně nějak podobně jsem přemýšlel taky. Teď se rozhoduji mezi tím, zneaktivnit kartičku až teda po dokončení objednávky a možností blokovat kartičku na určitý počet minut. Ale jak tohohle dosáhnout? Chci říct, jak databáze pozná, že má danou objednávku stornovat? Existuje sice položka TIMESTAP, ale ta se aktualizuje po každém přistupu do db…
- satano
- Člen | 3
O tom, že je užívateľ prihlásený hádam máš informáciu v systéme, takže pri nej si držať čas poslednej aktivity človeka – tzn. pri každom prístupne na stránku tento čas aktualizovať. A potom odblokovávať rezervované kartičky tých užívateľov, ktorí nejakú definovanú dobu nič nerobili – teda napr. vypli browser.
Ad TIMESTAMP. Takýto stĺpec sa automaticky aktualizuje nie po každom prístupe do DB, ale pri každej zmene daného záznamu (aj keď explicitne ten stĺpec nemením). Pričom ak je v tabuľke viacero stĺpcov TIMESTAMP, tak sa automaticky mení iba prvý z nich (v MySQL 5 je možné určiť ktorý stĺpec sa má automaticky meniť, prípadne to vypnúť).
- TanisCZ
- Člen | 80
takže pri nej si držať čas poslednej aktivity človeka – tzn. pri každom prístupne na stránku tento čas aktualizovať. A potom odblokovávať rezervované kartičky tých užívateľov
To ale znamená, že při každém přistupu na stránku registrovaného uživatele budu muset šahat do databáze ⇒ a to bude znamenat velký nárust dat přenesených mezi mysql a serverem…
- xificurk
- Člen | 121
TanisCZ napsal(a):
Díky všem za náměty. Přesně nějak podobně jsem přemýšlel taky. Teď se rozhoduji mezi tím, zneaktivnit kartičku až teda po dokončení objednávky a možností blokovat kartičku na určitý počet minut. Ale jak tohohle dosáhnout? Chci říct, jak databáze pozná, že má danou objednávku stornovat? Existuje sice položka TIMESTAP, ale ta se aktualizuje po každém přistupu do db…
Z těchto dvou možností je správná ta, kdy se položka zneaktivní při dokončení objednávky.
Kdyby se zneaktivnila hned po přidání do košíku, tak tím jen otevíráš dveře dokořán pro DoS utoky. ;-)
- Jod
- Člen | 701
Myslím, že, keď to zvládneš normálne, tak v nette by to už nemal byť problém :)
No, navrhol by som aby sa vytvorila nová téma, či subfórum, či jak sa to volá, kde by sa mohli riešiť takéto veci. Lebo predsalen, keď niečo robím v nette a potrebujem poradiť v nejakej indej problematike než ono samo, tak sa mi nece loziť na iné fóra a radšej to prasnem sem, ni? Myslím, že tu je dosť mozgov čo rado poradí :)
- Honza Marek
- Člen | 1664
Navrhuju tvářit se, že http://diskuse.jakpsatweb.cz/ je subfórum, kde se budou řešit věci bez souvislosti s nette :-)
- David Grudl
- Nette Core | 8218
Na tomto fóru je téma jasně dané – Nette Framework. Mohu vytvořit samostatné fórum pro PHP obecně, ale zdá se mi to zbytečné, pokud taková fóra už existují.