Autor Zpráva
Demoniak
Profil
Dobrý den,

mám takovou teorii na nákupní košík pomocí DB a cookies a to:

Vytvořím tabulku
mysql_query("CREATE TABLE IF NOT EXISTS `kosik` (
            `id` INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
            `id_uzivatele` INT NOT NULL,
            `id_neprihlaseneho_uzivatele` VARCHAR (32) NOT NULL,
            `id_zbozi`INT NOT NULL,
            `pocet_kusu` INT NOT NULL
            )");

a při přidávání nebo vypisování položek bych ověřoval zda je uživatel přihlášen
function vlozzbozidokosiku($id_zbozi,$pocet_kusu){
  if(isset($_SESSION['prihlasen']) and $_SESSION['prihlasen'] == 1) {
    mysql_query("INSERT INTO kosik (id_uzivatele, id_zbozi, pocet_kusu) VALUES ('$_SESSION['id']', '$id_zbozi', '$pocet_kusu') ");
  }elseif(isset($_COOKIE['kosik'])){
    mysql_query("INSERT INTO kosik (id_neprihlaseneho_uzivatele, id_zbozi, pocet_kusu) VALUES ('$_COOKIE['kosik']', '$id_zbozi', '$pocet_kusu') ");
  }

//pokud by uživatel byl zde poprvé tak bych vytvořil cookies ze session

  else{
    setcookie ("kosik", $_SESSION['PHPSESSID'], time() + 60*60*24*30*12,"/");
    vlozzbozidokosiku($id_zbozi,$pocet_kusu);
  }
}

A můj dotaz zní, tváří se tahle funkce z profesionálního hlediska alespoň trochu korektně? Pominu-li SQL injection.
Nenapadá mě totiž jiný způsob aby zahrnul jak registrované tak i neregistrované uživatele tak aby po skončení prohlížeče zůstal košík naplněn.
Virtus
Profil
Pokud nehodláte dělat nějakou statistiku, tak pro nepřihlášené uživatele, je zbytečné ukládat obsah košíku do databáze, protože nejste schopen poznat uživatele, který si nakupování rozmyslel a ze stránky odešel, databáze by se vám pak plnila zbytečnými daty. Pro nepřihlášené uživatele, je nejefektivnější, podle mně, ukládat celý obsah košíku do $_SESSION a až teprv v momentě, když si nepřihlášený uživatel objedná, uložit data do databáze, dřív to nemá význam. U registrovaných uživatelů, to záleží na více parametrech, pokud po odhlášení přepisujete session, nechte košík ukládat do DB, pokud jen ze session mažete nějaký parametr přihlášení, můžete u registrovaných uživatelů použít stejnou logiku košíku jako u neregistrovaných uživatelů, tj. celý obsah košíku v session a až v momentě objednání uložit do DB.


databáze by se vám pak plnila zbytečnými daty
Nedej bože, když tyto data vydí nějaký manager někde v administraci, zkuste mu pak vysvětlit, že zato nemůžete, že tam jsou a že je nejste schopen odfiltrovat, protože co kdybyste náhodou smazal košík nějakému aktivnímu zákazníkovi.
Demoniak
Profil
Dobře, když pominu nepřihlášené uživatele, tak jak jinak zachovám hodnotu košíku pro registrované na dlouhou dobu (jako to mají třeba na alza.cz)?
Pokud to udělám přes cookies, tak se uživatel přihlásí na jiném PC a už tam ten košík nemá. To by se dalo v případě ukládání do DB vymazávat třeba po měsíci CRONem nebo je to blbost?
Virtus
Profil
Myšlenka s více PC mně nenapadla, v takovém případě je jistě správné řešení ukládat pro registrované uživatele košík do DB a v podstatě ho ani nemusíte poté mazat, jakmile si zákazník totiž bude chtít něco objednat, smaže si košík sám, pokud v něm bude mít uložené nějaké věci od posledního přihlášení, které již objednat nechce, tj. správa košíku v tomhle případě spadá na uživatele samotné, jediný případ kdy registrovaným uživatelům smazat košík, nastává až v momentě, pokud Vám podají podmět, že si již dále nepřejí být na Vašich stránkách registrováni, tj. při zrušení registrace.


Nebo ještě další možnost a to sice, že vedení e-shopu si nastaví nějaké podmínky, třeba že všechny košíky starší jak měsíc automaticky mazat.
Demoniak
Profil
Ok děkuji za pomoc, registrované budu tedy řešit přes DB a neregistrované přes session. Jinak mě to nenapadá. Nebo přes cookies? Tam se dá alespoň nastavit délka platnosti, protože platnost 20 minut nebo do zavření prohlížeče mi připadá poněkud málo.


Což mi připadá zase škoda mazat košík registrovaný uživatelům. Znám od sebe, že si něco zadám do košíku a třeba za dva měsíce se přihlásím a objednám. někdy se tak prostě stane ale napadá mě ještě jedna možnost:
ukládat jak registrované tak i neregistrované do DB a po měsíci mazat pomocí cronu pouze řádky s obsahem $id_neregistrovaneho_uzivatele.
Virtus
Profil
Osobně bych to nechal v session, přece jen, ikdyž mi spadne prohlížeč, a chci si něco objednat, tak ikdyž se mi košík smázne, přesto si to do toho košíku znova přidám, a jestli se nepletu (kdyžtak mně někdo opraví), pokud mi spadne prohlížeč a já ho do doby vypršení session na serveru opět zapnu, obnoví se mi daná session jakou jsem měl před pádem prohlížeče, pokud mám povolené cookies (kdo dneska taky nemá). Teď trochu odbočím od tématu, ale kdybych provozoval e-shop s registrací, chtěl bych aby se mojí zákazníci registrovali, čím větší uživatelská základna tím líp pro mně: reklama, rozesílání newsletterů, nabízení dalších sloužeb, databáze emailů kterou můžu třeba pak prodat třetí straně, atd., tohle všechno ale většinou můžu až po registraci, mít takové věci v obchodník podmínkách jenom při jednorázovém nákupu není moc efektivní a uživatele to spíš odradí, podmínky při registraci, pokud po uživateli nechci peníze nebo osobní informace tipu: bydliště, rodné číslo atd., stejně skoro nikdo nečte. Všichni si čtou jenom výhody, které registrací získaj, pro demonstraci tady v tom případě byste mohl mít výhodu trvalého pamatování obsahu košíku: Spadne vám prohlížeč, porouchá se vám systém, nebojte se, u nás o svůj košík nepřídete, stačí se jen zaregistrovat a zároveň jako bonus dostanete funkci sdílení košíku na všech počítačích. Něco takového a spostu dalších. Tím sem chtěl jenom říct, že je lepší zvýhodnit poze registrované uživatele a neregistrované nějakým způsobem nutit k registraci.
Demoniak
Profil
To sice napomůže k registraci, ale řadu lidí to taky odradí, když něco hledají, hodí do košíku a ten se jim po 20-minutách smaže, tak mě osobně by to odradilo natolik, že bych se na stránky už nevrátil a radši nakoupil někde jinde. Jako bonus k registraci uvažuji o jiných věcech.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: