Autor | Zpráva | ||
---|---|---|---|
Anonymní Profil * |
#1 · Zasláno: 13. 2. 2006, 10:00:09
Zdravím,
prosím, koukněte mi na tenhle kódík. Je to moje prvotina, všechno funguje, ale jelikož si programuju jen tak doma, nemám žádnou kontrolu, jestli jsem to tzv. "vzal za správný konec". Je to počítadlo přístupů, přístupy z jední IP adresy v rámci 1 dne zvyšují "celkové přístupy" ale nezvyšují "unikátní přístupy". Budu Vám vděčný za komentáře. <?php class CSpojeni { public function __construct() { MySQL_Connect("localhost","","") or exit("Chybka: nepodařilo se připojit k DB serveru."); MySQL_Select_DB("pocitadlo") or exit("Chybka: nepodařilo se připojit k DB."); } } class CPocitadlo { private $ip_uzivatele; private $datum; private $cas; private $predchozi_pristup; private $c_pocet; //celkové přístupy private $u_pocet; //unikátní přístupy, stejná IP druhý den je unikátní přístup public function __construct() { $this->ip_uzivatele = $_SERVER["REMOTE_ADDR"]; $this->datum = Date("Y-m-d"); $this->cas = Date("H:i:s"); self::over(); self::vypis(); } private function vypis() { echo "Tvoje IP adresa: $this->ip_uzivatele<br>\n Dnešní datum: $this->datum.<br>\n Čas přístupu: $this->cas<br>\n Celkový počet přístupů: $this->c_pocet<br>\n Počet unikátních přistupů: $this->u_pocet<br>\n"; } private function over() { $spoj = new CSpojeni(); $vysledek = MySQL_Query("select max(datum) as 'stare' from pocitadlo where ip = '$this->ip_uzivatele';"); $zaznam = MySQL_Fetch_Array($vysledek); if($zaznam["stare"]== NULL) //tzn. tato IP adresa není v dbs { $this->predchozi_pristup = 0; self::zapis(); } else { $this->predchozi_pristup = $zaznam["stare"]; if($this->predchozi_pristup == $this->datum) //tzn. tato IP adresa již dnes byla uložena do dbs { self::zapis(); } else // tzn. tato IP adresa je v dbs, ale ne z dnešního dne = nový unik.přístup { $this->predchozi_pristup = 0; self::zapis(); } } } private function zapis() { $spoj = new CSpojeni(); $vysledek = MySQL_Query("select max(c_pocet) as 'max_c', max(u_pocet) as 'max_u' from pocitadlo;"); $zaznam = MySQL_Fetch_Array($vysledek); $this->c_pocet = $zaznam["max_c"]; $this->u_pocet = $zaznam["max_u"]; if($this->predchozi_pristup == 0) { $this->c_pocet++; $this->u_pocet++; MySQL_Query("insert into pocitadlo (c_pocet,ip,datum,cas) values ($this->c_pocet,'$this->ip_uzivatele', '$this->datum','$this->cas');"); } else { $this->c_pocet++; MySQL_Query("update pocitadlo set c_pocet = $this->c_pocet where u_pocet=$this->u_pocet; "); } } } $pocitadlo = new CPocitadlo(); ?> |
||
Marty Profil |
#2 · Zasláno: 13. 2. 2006, 10:47:59
Nevypadá to špatně, udělat objektivní hodnocení je těžší (každý má jiné techniky) ale já bych psal vše malými písmeny (tedy až na příkazy SQL, ty naopak velkými). Potom bych si ještě pro jistotu ověřoval, zda SQL dotaz proběhl úspěšně a pokud ne, nějak ošetřil výstup.
|
||
Anonymní Profil * |
#3 · Zasláno: 13. 2. 2006, 11:28:10
Díky Marty,
asi máš pravdu, bude to přehlednější. Co třeba obecně ten způsob počítání unikátních přístupů: stejná IP adresa každý den nový zápočet? Jinak jsem čekal víc kritiky ;) kk.. |
||
Marty Profil |
#4 · Zasláno: 13. 2. 2006, 11:34:57
Doporučuji přečíst metodiku měření unikátních IP a přístupů na Toplistu, myslím že mají ale podobné řešení jako ty.
|
||
roberta Profil |
#5 · Zasláno: 13. 2. 2006, 11:36:59
počítanie prístupov podľa IP je síce pekné, len je potrebné si uvedomiť, že existujú tzv. verejné IP adresy, čo znamená, že napr. nejaká firma, ktorá má napr. 6000 zamestnancov, tak na internete sa javia všetci, že majú len 1 IP adresu...
|
||
Anonymní Profil * |
#6 · Zasláno: 13. 2. 2006, 11:37:00
Díky za tip.
kk.. |
||
mila Profil |
#7 · Zasláno: 13. 2. 2006, 12:54:49
Přkvapuje mě, že prvotina je napsána objektově. Buť přecházíš z javy, nebo se tu chceš vytáhnout:)
Rozhodně to není špatné, ale nězdají se mi právě ty objekty: Předpokládal bych, že CSpojeni - bude mít nějakou metodu, která na něj provede query - Že si bude pamatovat svůj link na databázi - že bude mít metodu, která spojení zruší - a hlavně půjde nastavit, kam se má připojit. Tohle není objekt, jen hra na něj. Podobně počítadlo. - Je na jediné použití. Zavolat __contruct a skončit. - Představoval bych si, že bude mít různé metody, podle toho, co s ním člověk chce zrovna dělat. - Například teď, když budeš chtít počítadlo vypsat jinak (nevypsat vůbec), tak musíš přepsat třídu. Když nebude konstruktor volat fci vypis, a ta bude verejna, tak si ji můžeš zavolat jen když chceš. Krom toho bych vracel jen čísla, ať si je vypíše každý jak chce. |
||
Anonymní Profil * |
#8 · Zasláno: 13. 2. 2006, 14:57:44
Mila:
oops, jsem odhalen :o) ... sorry, fakt to nebylo úplně přesně, už jsem dřív něco v PHP3 dělal ( uložit do mysql, vybrat z mysql), ale nebral jsem to jako "programování". Myslel jsem prvotina v PHP5. Kdybych si myslel, že se mám čím vytáhnout, tak bych něco vytáhnul a asi ne tenhle "kódík". Díky za rady, díky za kritiku. Mohl(a) bys, prosím, ještě upřesnit? re: - bude mít nějakou metodu, která na něj provede query ......tomuhle nerozumím re: - Že si bude pamatovat svůj link na databázi ..... jako, že místo "localhost" bude ... taky nerozumím re: - že bude mít metodu, která spojení zruší ....myslel jsem, že spojení se zruší automaticky po skončení skriptu kk.. |
||
mila Profil |
#9 · Zasláno: 14. 2. 2006, 15:48:31
re: - bude mít nějakou metodu, která na něj provede query
......tomuhle nerozumím Když mám objekt, který představuje databázi, tak bych si představoval, že se na něj budou provádět dotazi něco jako $result = $db->query ('SELECT ...'); Co je to za databázi, když na ní nelze vykonat dotaz? Jasně že to jde, tak jak to máš, ale když už objekty, tak pořádně. Tvoje třída není třída, ale funkce. re: - Že si bude pamatovat svůj link na databázi ..... jako, že místo "localhost" bude ... taky nerozumím Když se podíváš do manuálu, tak mysql_connect vrací link na databázi. Díky tomu můžeš mít více připojení zároveň. Trochu souvisí s předchozím. Úplně nejjednodušeji bych to vyděl takto: - Konstructor vytvoří připojení, ten link si uloží do nějaké private proměné. - Metoda query provede mysql_query, použije přitom připojení, které má uloženo od konstruktoru. Můžeš do ní pak zakomponovat třeba ošetření chyb (např. pomocí exceptions) re: - že bude mít metodu, která spojení zruší ....myslel jsem, že spojení se zruší automaticky po skončení skriptu Jasně, ale když construktor vytvoří spojení, tak by ho mohl destruktor zavřít. Ty ho nemusíš volat, ale můžeš, pokud to budeš chtít zavřít dřive. Rozhodně si ale nemyslím, že by stálo za to psát nějakou takovouto třídu. Budeš jen objevovat ameriku. Jen když si chtěl názor na kód, tak se mi zdálo, že nepoužíváš objekty správně. Zdá se mi to jako taková hra na ně. Podívej se na něco co už je napsáno, jak by taková třída pro přístup k databázi měla fungovat: PDO MySQLi PEAR DB ADODB |
||
Časová prodleva: 18 let
|
Toto téma je uzamčeno. Odpověď nelze zaslat.
0