Autor Zpráva
Honza Bažant
Profil *
Naprogramoval jsem si svůj statistický systém, už funguje dobře, ale jedna věc mě trápí: občas najdu v souboru z chybami (ne nějaký serverový, ale můj vlastní) MySQL chybu 1062 (jakože řádek s určitým id už existuje). Problém je v tom, že jsem zjistil, že v daném čase se uložil jiný přístup (se stejným id, takže proto ta chyba), většinou od stejného návštěvníka. Co je ale zarážející je to, že přístup s pozdějším časem se uložil a ten první ne. Jen na vysvětlenou: údaj o přístupu se ukládá jen při prvním přístupu - když ještě neexistuje cookie nebo z dané ip adresy nikdo nepřišel za posledních půl hodiny. Zdá se tedy, že se občas stává, že uživatel rychle proklikne na další stránku aniž se ještě stačí cookie vytvořit a něco uložit do db. Napadlo mě, jestli by se to nedalo udělat nějakou frontou, kde by se třeba do souboru zaznamenávaly dotazy k vykonání a po nějaké době by se vykonaly a odstranily. Ale chtěl bych vědět názor ještě někoho jiného.
peta
Profil
Honza Bažant
popisujes to dlouze, ale jaksi to nechapu :)

Cookies do databaze samo o sobe nic nezapisuje.
Cookies se obvykle vytvari, obdobne jako session na zacatku PHP souboru. Predpokladam, ze pouzivas PHP k MySQL. Misto cookies bych pouzival urcite session.
Pokud se neco ulozi do databaze, pak presne vis, jake udaje v PHP pro MySQL odesilas a tim padem neco jako neuplne udaje se tam zapsat nemuzou. Rozvnez se do databaze nemuzou zapsat udaje se stejnym ID, pokud je ID zvolene jako autoincrement nebo nastaveno jako UNIQUE. Otazka je, co tve ID je zac a k cemu jej pouzivas.
Cili je tu nedostatek informaci. Schazi php script, schazi sql struktura databaze, schazi napsat, ktere sloupce mas autoincremet, ktere jsou indexy (klice) a tak. Vetsinou klic, pokud je primary je typu unique a autoincrement.
Honza Bažant
Profil *
Sorry.
Struktura databáze:
navstevy - hlavní tabulka, sloupec id je primární a auto_increment, jsou zde věci jako prohlížeč, os, referer, datum a tak
stranky - sem se ukládají stránky; primarni - primární a auto_increment, id - číslo stejné jako navstevy.id (identifikace návštěvníka), ...
grfinfo - údaje o monitoru; primarni, id - to samé jako u předchozí tabulky
Session jsem také na začátku používal, ale občas se stávalo, že nešlo uložit session cookie takže se přidal parametr do adresy stránky. To teda bylo dřív ještě když se mi statistiky ukládaly ještě před doctypem (hrozná prasárna :-) ). Teď ukládání probíhá takhle: ve stránce je obrázek (něco jako má Toplist), což je php skript, který funguje takhle:
1) existuje cookie? jestli jo tak nic nedělej
2) jestli ne, tak otestuj, jestli z dané ip adresy nikdo nepřišel během půl hodiny
a) Přišel? Tak asi smazal cookie, hlavní statistiky neukládej a zjisti id z tabulky.
b) Ne? Tak zjisti nejvyšší id z tab. navstevy, přičti k němu 1 a to je id tohohle návštěvníka

Pak se vždy uloží cookie s dobou platnosti 30 minut a návštěvníkovým id.
Údaje o monitoru se ukládají stejně jako hlavní statistiky, info o stránce se uloží vždy.

Jde tady o to, že když uživatel přijde na web a hned se někam proklikne, tak se při velkém zatížení serveru může stát to, že
ukládací skript z první stránky se může začít zpracovávat až skoro ve stejném čase jako z té druhé stránky, takže oba dojdou k tomu, že cookie neexistuje a oba vygenerují stejné id a můžou ten dotaz provést ve stejném čase. No i když je to navstevy.id auto_increment, takže by se automaticky zvýšilo a nebyl by problém, tak já ho ukládám "natvrdo" (insert into navstevy values(xxx, ...) kde xxx je konkrétní id daného návštěvníka). Chtěl jsem to udělat takhle aby se to id pak dalo uložit i do záznamů v ostatních tabulkách (abych věděl které rozlišení monitoru a které stránky patří ke kterému návštěvníkovi). Takže to je možná chyba. Takže by asi bylo lepší nechat to id, aby se automaticky při vložení zvýšilo (insert into navstevy values(NULL, ...)) a pak ho dalším dotazem zpětně zjistit?
ah01
Profil
Honza Bažant
Generovat ID tímto způsobem je dost velká chyba. Nemam čas se v tom moc pitvat, tak střelím od boku. Proč ten záznam nevložíš rovnou do té hlavní tabulky (kde je auto_increment), a pak si id nezjistíš po vložení (fce. mysqli_insert_id/mysql_insert_id)
Honza Bažant
Profil *
Dík, tohle asi bude ta správná cesta :-) Jak jsem psal poslední příspěvek, tak mě tenhle způsob teprv napad :-) A to už na tom systému pracuju dva roky. :-)

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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