Autor Zpráva
Anonymní
Profil *
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
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 *
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
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
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 *
Díky za tip.

kk..
mila
Profil
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 *
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
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
Toto téma je uzamčeno. Odpověď nelze zaslat.

0