Autor Zpráva
lamič
Profil
Ahoj, řekl jsem si, že by bylo fajn se pokust vytvořit no spíše předělat počítadlo, které by mi ukazovalo kolik lidí se na mých stránkách pohybovalo(pohybuje). Budu upřímný a z velké části je to zkopírované z nějakého jiného serveru. o co jde:
1) počítadlo má tabulku v databázi, která vypadá takto: http://www.imghosting.cz/view-39schema_databaze.png
2) přidal jsem do scriptu návštěvnost za týden a měsíčně - bohužel mi při těchto dvou položkách to vyhazuje chybu (ostatní dení, online a celkem návštěvnost funguje)
3) sice funguje celková návštěvnost ale nedaří se mi ošetřit aby script zjistil v databázi, že již se IP adresa na serveru vyskytla a tímpádem ji nezapočítával do dalšího celkového součtu návštěv.

P.S. vím, že 100x jednoduší by si bylo vygenerovat počítadlo přes toplist či blueboard nebo si jej jen vytvořit pomocí txt zapisovatlných souborů, kde by se zapisovali jen IP adresy a počet, ale chtěl bych to přes databázi. :-)

teď ke scriptu a chybám.. tito chyby mi to zatím vypisuje: Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in /srv/www/aplikace/pocitadlo.php on line 39 Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in /srv/www/aplikace/pocitadlo.php on line 44

nyní celý kód daného souboru:
<?php

function pocitadlo()
{
# funkce zjisti, jestli je dnes v tabulce navstevnik a podle toho ho bud vlozi, nebo mu zmeni cas navstevy na aktualni

$ip = getenv("REMOTE_ADDR"); //zjistime IP

#zjistime, jestli se IP dnes nachazi v tabulce
$dotaz = mysql_query("SELECT * FROM pocitadlo 
WHERE datum=NOW() AND ip='$ip'");

#jestli tam je, tak zmenime cas navstevy (kvuli online uzivatelum)
if (mysql_num_rows($dotaz)) 
$dotaz2 = mysql_query("UPDATE pocitadlo SET cas='".time()."' 
WHERE datum=NOW() AND ip='$ip'");
else #pokud neni, tak IP vlozime
$dotaz2 = mysql_query("INSERT INTO pocitadlo (ip, datum, cas) VALUES('$ip',NOW(),'".time()."');");
}

function navstevy()
{
#funkce vraci pole s poctem navstev

$navstevnici = array(); 
#vybereme pocet vsech ulozenych IP adres
$dotaz = mysql_query("SELECT count(*) FROM pocitadlo");
#vlozime hodnotu do pole
list($navstevnici['celkem'])=mysql_fetch_array($dotaz);

#vybereme pocet unikatnich dennich IP adres pro dnesni den
$dotaz = mysql_query("SELECT count(*) FROM pocitadlo WHERE datum=NOW()");
#vlozime hodnotu do pole
list($navstevnici['dnes'])=mysql_fetch_array($dotaz);

#vybereme pocet unikatnich týdenních IP adres pro tento týden
$dotaz = mysql_query("SELECT count(*) FROM pocitadlo WHERE datum=WEEK() ");
#vlozime hodnotu do pole
list($navstevnici['tyden'])=mysql_fetch_array($dotaz);

#vybereme pocet unikatnich týdenních IP adres pro tento týden
$dotaz = mysql_query("SELECT count(*) FROM pocitadlo WHERE datum=MONTH() ");
#vlozime hodnotu do pole
list($navstevnici['mesic'])=mysql_fetch_array($dotaz);

#vybereme dnesni IP, ktere nejsou starsi nez 180 sekund = 3 minuty
$dotaz = mysql_query("SELECT count(*) FROM pocitadlo WHERE datum=NOW() AND cas>='".(time()-180)."'");
#vlozime hodnotu do pole
list($navstevnici['online'])=mysql_fetch_array($dotaz);

#vratime pole
# $navstevnici['celkem'] = pocet navstev celkem
# $navstevnici['dnes'] = pocet navstev za dnesni den
# $navstevnici['online'] = pocet navstev, ktere nejsou starsi jak 3 minuty
return $navstevnici;
}


#zavolame pocitadlo
pocitadlo();
#vytvorime pole s pristupy
$navstevnici = navstevy();


$sql="SELECT ip
From pocitadlo
WHERE ip='$_SERVER[REMOTE_ADDR]' And id='$_SERVER[REMOTE_ADDR]'" ; 
//nefunkcni zabezpeceni IP adresy;

if ($vysledek = mysql_query("$sql")) {   
if(mysql_num_rows($vysledek)>0) {
$celkem = true;
}else{
$celkem = false;
}   
} mysql_error();

#pole $navstevnici vypiseme
echo "ONLINE: $navstevnici[online]<br>
DNES: $navstevnici[dnes]<br>
TÝDNĚ: $navstevnici[tyden]<br>
MĚSÍČNĚ: $navstevnici[mesic]<br>
CELKEM: $navstevnici[celkem]<br>";
?>


P.S. ve scriptu nejde vidět připojení k databázi.. je to proto, že tento soubor includuju do leveho sloupce (footeru) kde již připojení k databázi je, takže připojením to nebude..

Uff zdlouhaví dotaz já vím a moc bych rád poděkoval všem, kteří se mi s tím budou snažit pomoci. Snad se někdo objeví :-)
Actimel
Profil
lamič:

WEEK() ani MONTH() jsem nikdy zatím nepoužíl, ale podle dokumentace to používáš špatně. Tyto funkce neslouží k tomu, čemu si myslíš.

Takže tohle to budeš muset (asi) nechat na PHPku ;)
lamič
Profil
Actimel:
WEEK() ani MONTH() jsem nikdy zatím nepoužíl, ale podle dokumentace to používáš špatně. Tyto funkce neslouží k tomu, čemu si myslíš.
>
Takže tohle to budeš muset (asi) nechat na PHPku ;)
Actimel:

aha, v tom bude asi zakopanej pes, ale nemáš nějakej nápad jak to udělat v tom php? Pořád to php může porovnávat ty Ipčka z databáze nebo máš na mysli to celý překopat a udělat to přes cookies? Cookies bych raději vynechal...
Actimel
Profil
lamič:
záleží jestli chceš vytahovat přístupy za poslední týden - uplynulých 7 dní - a nebo od začátku týdne.

V prvním případě, jestli používáš datum v db unix timestamp, tak by ten čas od, kterého hledáš by byl time()-60*60*24*7.
Jestli datetime ta strtotime(-1 week)

Druhý případ, když potřebuješ čas od začátku týdne tak opět strtotime(first day of week) (teda alespoň tak nějak by to mělo být).

Potom ten tvůj čas doplníš do dotazu a to je vše :)
lamič
Profil
Promiň, ale nějak se nechytám, kam to do toho kódu mám napsat? napsal jsem to do 37. řádku za where datum=time()-60*60*24*7 .. nic se nestalo pořád to píše chybu na 39 řádku, chyby jso ustejné jako jsem psal u prvního příspěvku(37. řádek nyní vypadá takto: $dotaz = mysql_query("SELECT count(*) FROM pocitadlo WHERE datum=time()-60*60*24*7 "); vybral jsem si teda tu možnost v timestampu, páč to tak mám v databázi navolený u datumu, co jsem posílal odkaz na ten obrázek. Vím, že jsem to asi jen vložil do sql příkazu, ale nevím jak to nadefinovat v php scriptu...
Actimel
Profil
lamič:
vybral jsem si teda tu možnost v timestampu
Myslím že v date time-u by se s tím líp pracovalo..
Nicméně v MySQL je pro získání aktuálního času funkce NOW(), ale raději bych tam ten čas dával proměnnou, kterou si vlastně PHPkem nachystáš.
$weekAgo = time()*60*60*24*7;
$query = mysql_query("SELECT * FROM visits WHERE time>'" . $weekAgo . "'");

Každopádně doporučuji ti podívat se na mysqli funkce a učit se rovnou na tom.
lamič
Profil
takže pokusil jsem se to tedy nějak upravit vyšlo mi tedy z toho toto:
<?php

function pocitadlo()
{
# funkce zjisti, jestli je dnes v tabulce navstevnik a podle toho ho bud vlozi, nebo mu zmeni cas navstevy na aktualni

$ip = getenv("REMOTE_ADDR"); //zjistime IP
$za_tyden = time()*60*60*24*7;
$za_mesic = time()*60*60*24*30;
#zjistime, jestli se IP dnes nachazi v tabulce
$dotaz = mysql_query("SELECT * FROM pocitadlo 
WHERE datum=NOW() AND ip='$ip'");

#jestli tam je, tak zmenime cas navstevy (kvuli online uzivatelum)
if (mysql_num_rows($dotaz)) 
$dotaz2 = mysql_query("UPDATE pocitadlo SET cas='".time()."' 
WHERE datum=NOW() AND ip='$ip'");
else #pokud neni, tak IP vlozime
$dotaz2 = mysql_query("INSERT INTO pocitadlo (ip, datum, cas) VALUES('$ip',NOW(),'".time()."');");
}

function navstevy()
{
#funkce vraci pole s poctem navstev

$navstevnici = array(); 
#vybereme pocet vsech ulozenych IP adres
$dotaz = mysql_query("SELECT count(*) FROM pocitadlo");
#vlozime hodnotu do pole
list($navstevnici['celkem'])=mysql_fetch_array($dotaz);

#vybereme pocet unikatnich dennich IP adres pro dnesni den
$dotaz = mysql_query("SELECT count(*) FROM pocitadlo WHERE datum=NOW()");
#vlozime hodnotu do pole
list($navstevnici['dnes'])=mysql_fetch_array($dotaz);

#vybereme pocet unikatnich týdenních IP adres pro tento týden
$dotaz = mysql_query("SELECT * FROM pocitadlo WHERE datum>'" . $za_tyden . "'");
#vlozime hodnotu do pole
list($navstevnici['tyden'])=mysql_fetch_array($dotaz);

#vybereme pocet unikatnich týdenních IP adres pro tento měsíc
$dotaz = mysql_query("SELECT * FROM pocitadlo WHERE datum>'" . $za_mesic . "'");
#vlozime hodnotu do pole
list($navstevnici['mesic'])=mysql_fetch_array($dotaz);

#vybereme dnesni IP, ktere nejsou starsi nez 180 sekund = 3 minuty
$dotaz = mysql_query("SELECT count(*) FROM pocitadlo WHERE datum=NOW() AND cas>='".(time()-180)."'");
#vlozime hodnotu do pole
list($navstevnici['online'])=mysql_fetch_array($dotaz);

#vratime pole
# $navstevnici['celkem'] = pocet navstev celkem
# $navstevnici['dnes'] = pocet navstev za dnesni den
# $navstevnici['online'] = pocet navstev, ktere nejsou starsi jak 3 minuty
return $navstevnici;
}


#zavolame pocitadlo
pocitadlo();
#vytvorime pole s pristupy
$navstevnici = navstevy();


$sql="SELECT ip
From pocitadlo
WHERE ip='$_SERVER[REMOTE_ADDR]' And id='$_SERVER[REMOTE_ADDR]'" ; 
//nefunkcni zabezpeceni IP adresy;

if ($vysledek = mysql_query("$sql")) {   
if(mysql_num_rows($vysledek)>0) {
$celkem = true;
}else{
$celkem = false;
}   
} mysql_error();

#pole $navstevnici vypiseme
echo "ONLINE: $navstevnici[online]<br>
DNES: $navstevnici[dnes]<br>
TÝDNĚ: $navstevnici[tyden]<br>
MĚSÍČNĚ: $navstevnici[mesic]<br>
CELKEM: $navstevnici[celkem]<br>";
?>

nyní mi to píše 2 chybky (spíše notice: že nemám správně definovanou promenou)
výpis: Notice: Undefined variable: za_tyden in /srv/www/aplikace/pocitadlo.php on line 38 Notice: Undefined variable: za_mesic in /srv/www/aplikace/pocitadlo.php on line 43
Actimel
Profil
To proto, že definici těch proměnných máš ve funkci pocitadlo a ne ve funkci navstevnici. Funkce pracuje s proměnnými, které vytvoříš ve funkci a nebo je do ní šoupneš parametrem.

Dále ale jsem udělal chybu ve znamínku a ty jsi ji tupě opsal $weekAgo = time()*60*60*24*7; (napsal jsem špatně znamínko - time() ti vrátí aktuální čas v unix timestampu a ty od něj potřebuješ odečíst týden (v sekundách), takže to bude $weekAgo = time()-60*60*24*7;)
lamič
Profil
máš úplnou pravdu než jsem to "tupě opsal jak píšeš" jsem se musel podívat na netu jak napsat měsíc, také to tam bylo podobně, tak se k tomu přiznávám.. a díky, chybu už to nehází žádnou, ale musím nyní vyřešit celkový počet návštěv, poněvadž se mi při každé aktualizaci f5 přičte návštěvník, což nechci proto musím zabezpečit IP adresu, aby když už se nachází v databázi se již nepřičítala, tuším, že jsem něco podobného jsem již dělal u ankety, musím se na to mrknout a prostudovat, každopádně díky, kdyžtak se ještě ozvu, kdybych byl opět v koncích já nebo má "tupá" hlava...
Actimel
Profil
jo to je věc, na kterou jsem se díval, ale už jsem ji pak sem zapomněl napsat. Takže pokud na to nepříjdeš sám, tak na ř. 12 máš špatně ten dotaz
$dotaz = mysql_query("SELECT * FROM pocitadlo 
WHERE datum=NOW() AND ip='$ip'");

tady to NOW() jak jsem psal je aktuální čas, ale ty tam potřebuješ dnešní den, takže si musíš zase přes strtotime() dostat začátek dnešního dne a změnit na mysql_query(SELECT * FROM navstevy WHERE datum > '" . $dnesniDen ."' AND IP = '' . $ip . ");

Ale stejně IP adresou bych uživatele nerozeznával... Muže se stát, že se na ten web bude dívat 20 lidí z 20 různých počítačů, ale se stejnou ip. A nebo pořád ten jeden, ale s dynamickou ip.
lamič
Profil
Vím, že to má své nevýhody a vím, že relativně přesnější měření je pomocí sušenek (cookies) ale příjde mi, že cookies jsou mnohem jednodušeji zmanipulovatelné. S těmi dynam. IP máš také pravdu. Logicky, když se uživateli mění každej den či hodinu IP bude jej to pořád započítávat.
Na druhou stranu kdo má veřejnou IP toho to započítá a již po druhé nikoliv. Což se do budoucna, kde budou IPv6 téměř všechny IP veřejné může hodit více. Kdežto u cookies když někdo bude chtít změnit výsledky třeba ankety (u toho počítadla to zase až tak moc nebolí) tak si jednoduše vymaže cookies v prohlížeči a nebo mu stačí si stáhnout další prohlížeč a znovu může hlasovat.
Proto mi ani tak nyní nejde o to, že to nezapočítá nějaké uživatele, kteří mají smůlu a hold mají stejnou IP jako člověk co byl před nimi, ale jde mi o to, až se IPv6 rozšíří bude to mnohem přesnější měření než-li cookies.
To že mi bude nyní vypisovat počítadlo, že tam bylo 100 uživatelů ale ve skutečnosti jich tam bylo třeba 200 mi až tak moc nevadí, páč budu vědět, že jich tam bylo více jak 100(pokud někdo kdo má dyn. Ip nebude furt mačkat f5) a v budoucnu to bude jen přesnější. Nebude se jednat o stránky, které by musel uživatel navštěvovat denně, nebude to žádný e-shop a kdybych chtěl, bude to jen statická stránka, ale chtěl jsem si s tím trochu vyhrát, proto tam bude administrace, anketa a snad i počítadlo.

edit: zasílám progress, píše mi to asi chybu v dotazu ale jsem už dneska mrtvej. Jelikož jsi předtím psal že strtotime() se užívá u datetime a já mám timestamp udělal jsem to trochu jinak, snad to bude správně definované. Kód zde..
<?php

function pocitadlo()
{
# funkce zjisti, jestli je dnes v tabulce navstevnik a podle toho ho bud vlozi, nebo mu zmeni cas navstevy na aktualni
$dnesniDen = date( "w");
$ip = getenv("REMOTE_ADDR"); //zjistime IP

#zjistime, jestli se IP dnes nachazi v tabulce
$dotaz = mysql_query("SELECT * FROM pocitadlo WHERE datum >'" . $dnesniDen ."' AND IP = '' . $ip . ");

#jestli tam je, tak zmenime cas navstevy (kvuli online uzivatelum)
if (mysql_num_rows($dotaz)) 
$dotaz2 = mysql_query("UPDATE pocitadlo SET cas='".time()."' 
WHERE datum=NOW() AND ip='$ip'");
else #pokud neni, tak IP vlozime
$dotaz2 = mysql_query("INSERT INTO pocitadlo (ip, datum, cas) VALUES('$ip',NOW(),'".time()."');");
}

function navstevy()
{
#funkce vraci pole s poctem navstev
$za_tyden = time() -60*60*24*7;
$za_mesic = time() -60*60*24*30;



$navstevnici = array(); 
#vybereme pocet vsech ulozenych IP adres
$dotaz = mysql_query("SELECT count(*) FROM pocitadlo");
#vlozime hodnotu do pole
list($navstevnici['celkem'])=mysql_fetch_array($dotaz);

#vybereme pocet unikatnich dennich IP adres pro dnesni den
$dotaz = mysql_query("SELECT count(*) FROM pocitadlo WHERE datum=NOW()");
#vlozime hodnotu do pole
list($navstevnici['dnes'])=mysql_fetch_array($dotaz);

#vybereme pocet unikatnich týdenních IP adres pro tento týden
$dotaz = mysql_query("SELECT * FROM pocitadlo WHERE datum>'" . $za_tyden . "'");
#vlozime hodnotu do pole
list($navstevnici['tyden'])=mysql_fetch_array($dotaz);

#vybereme pocet unikatnich týdenních IP adres pro tento měsíc
$dotaz = mysql_query("SELECT * FROM pocitadlo WHERE datum>'" . $za_mesic . "'");
#vlozime hodnotu do pole
list($navstevnici['mesic'])=mysql_fetch_array($dotaz);

#vybereme dnesni IP, ktere nejsou starsi nez 180 sekund = 3 minuty
$dotaz = mysql_query("SELECT count(*) FROM pocitadlo WHERE datum=NOW() AND cas>='".(time()-180)."'");
#vlozime hodnotu do pole
list($navstevnici['online'])=mysql_fetch_array($dotaz);

#vratime pole
# $navstevnici['celkem'] = pocet navstev celkem
# $navstevnici['dnes'] = pocet navstev za dnesni den
# $navstevnici['online'] = pocet navstev, ktere nejsou starsi jak 3 minuty
return $navstevnici;
}


#zavolame pocitadlo
pocitadlo();
#vytvorime pole s pristupy
$navstevnici = navstevy();


$sql="SELECT ip
From pocitadlo
WHERE ip='$_SERVER[REMOTE_ADDR]' And id='$_SERVER[REMOTE_ADDR]'" ; 
//nefunkcni zabezpeceni IP adresy;

if ($vysledek = mysql_query("$sql")) {   
if(mysql_num_rows($vysledek)>0) {
$celkem = true;
}else{
$celkem = false;
}   
} mysql_error();

#pole $navstevnici vypiseme
echo "ONLINE: $navstevnici[online]<br>
DNES: $navstevnici[dnes]<br>
TÝDNĚ: $navstevnici[tyden]<br>
MĚSÍČNĚ: $navstevnici[mesic]<br>
CELKEM: $navstevnici[celkem]<br>";
?>

chyb. hláška: " Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in /srv/www/aplikace/pocitadlo.php on line 13 ".

P.S. jinak díky, že se mi snažíš poradit, věřím, že to v mém případě není tak jednoduché jako u ostatních

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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