Implementace nákupního košíku

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
TanisCZ
Člen | 80
+
0
-

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
+
0
-

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
+
0
-

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á).

Jod
Člen | 701
+
0
-

Ja by som to spravil tak, že by som kartičku zneaktívnil až po odoslaní obiednávky a prípadne keby si chcel vtedy niekto kúpiť tú istú kartičku vypísal, že ľutujeme, ale kartičku si už niekto kúpil pred vami.

phx
Člen | 651
+
0
-

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
+
0
-

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…

phx
Člen | 651
+
0
-

Pred kazdym vypisem prozenes DB jeden update kde stornujes vsechny zahnamy kde blokacecas<NOW()

TanisCZ
Člen | 80
+
0
-

Jenže to se můžu dostat do sitauce, kdy někdo umyslně objedná položku a hned zavře prohlížeč. To znamená, že položka je blokována a já už nemám jak zjistit, zda je potřeba známku vrátit. Jenom doplním, že pro každého zákazníka používám novou tabulku v db…

Jod
Člen | 701
+
0
-

Keď si ju objedná tak mu ju pošleš nie? :)

TanisCZ
Člen | 80
+
0
-

Já to myslel tak, že když si klikne na poožku, tak se mu dá do košíku a v systému se zneaktivnéí. jenže do doby než člověk dokončí objednávku, tak je položka neaktivni. A ja se bojim lidí, kteří si schválně kliknou na položku, aby ji rezervovali a pak vypnou prohlížeč…

satano
Člen | 3
+
0
-

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
+
0
-

Hmm to je zajímavá myšlenka. Takže sloupce timestap na tento typ problému není idealni? Ale ten nápad se mi líbí. Zkusim se nad tím zítra zamyslet. Dik za zajimavou myslenku

satano
Člen | 3
+
0
-

V podstate je jedno či to bude stĺpec TIMESTAMP, alebo DATETIME. Akurát ak sa robí UPDATE, prvý stĺpec typu TIMESTAMP sa automaticky nastaví na aktuálny čas aj keď ho nešpecifikuješ v zozname UPDATE-ovaných stĺpcov.

TanisCZ
Člen | 80
+
0
-

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
+
0
-

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. ;-)

TanisCZ
Člen | 80
+
0
-

Taky mě to napadlo. A bylo by to nejjednoduší na naprogramování. Ale dostal bych se do situace, kdy by si zákazník dal do košíku spoustu položek (mám jich asi 2500) a při dokončení objednávky by zjistil, že mu někdo známku vyfoukl…

Jod
Člen | 701
+
0
-

No tak musí rýchlo klikať )))

A.
Člen | 87
+
0
-

Nepatri tahle diskuze spise na jina fora? Imho s nette to ma houby co spolecneho.

Spise podme rozvest, jak udelat v Nette „poradnej kvalitni kosik“ – pres identitu? Ja tuhle cast jeste moc nezkoumal, nechtelo se mi, ale asi se chystam :-)

Jod
Člen | 701
+
0
-

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
+
0
-

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
+
0
-

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í.

TanisCZ
Člen | 80
+
0
-

Už to mám :) Omlouvám se za OT, ale spoléhal jsem, že tu najdu chytré mozky a nemýlil se. Jinak samozřejmě je celý web implementován pomocí Nette.

David Grudl
Nette Core | 8218
+
0
-