Pomožte s počítadlem

Zase potřebuju helfnout :-). Zkoušim si udělat počítadlo přístupů, takové to super-počítadlo, které by mělo počítat přístupy: celkem, za měsíc, za tejden, za den a on-line. Jednoduše to zapisuju do tabulky:

MySQL_Query("CREATE TABLE pocitadlo (
id int(10) NOT NULL auto_increment,
datum int(20) NOT NULL default '0',
PRIMARY KEY (id,datum))");

Mám hodně problémů:
1) Nevim, jakym příkazem zjistit právě ty přístupy třeba za den, napadlo mě toto:

$day = (int)Date("j");
$count_den = MySQL_Query("SELECT count(*) AS pocet FROM pocitadlo WHERE datum LIKE '$day'");
while ($d = MySQL_Fetch_Array($count_den)):
$den = $d[pocet];
endwhile;

ale místo toho LIKE by to chtělo něco jako náleží, či je podmnožinou, nebo něco takovýho, nevíte jak to vymyslet? Dál bych potřeboval jako ten den *$day = (int)Date("j");* napsat tejden, ale nic podobnýho jsem nenašel, jen den, měsíc, rok, hodiny...., ale tejden ne. Jak na to?

2) Dál nevim, jak vymyslet počítadlo on-line. Jednou jsem si stáhl příklad on-line (zdroják dole) přístupů, ale je to dělaný přes čas, nevíte, jak jinak by to šlo udělat? (pokud to teda jde)

Zdroják počítadla on-line:

$timestamp=time();
$timeout=$timestamp-$timeoutseconds;
mysql_connect($server, $db_user, $db_pass);
mysql_db_query($database, "INSERT INTO online VALUES ('$timestamp','$REMOTE_ADDR','$PHP_SELF')");
mysql_db_query($database, "DELETE FROM online WHERE timestamp<$timeout");
$result=mysql_db_query($database, "SELECT DISTINCT ip FROM online WHERE file='$PHP_SELF'");
$user =mysql_num_rows($result);
mysql_close();

if ($user=="1"):
$ozne = "";
echo"PHPzone si právě čte $user člověk";
else:
if ($user<"5"):
$ozne = "é"; //toto nám zajistí koncovku (čtenáři,čtenářů,...)
echo"PHPzone si právě čtou: $user lid$ozne";
else:
$ozne = "í";
echo"PHPzone si právě čte: $user lid$ozne";
endif;
endif;
Sory, že jsem to sem hodil dvakrát, byla to chyba
Podivej se na Interval.cz,
asi pred rokem (?) tam presne o tomhle bezel serial ...
Na ten interval jsem koukal, nenašel jsem nic, co by se mi hodilo. To on-line asi udělam přes těch 300 sekund, bude to nejjednodušší. Teď jsem ale vymejšlel, jak udělat, aby to z uloženýho času zjistilo, jestli byl přístup v tomto měcísi (dni, týdnu), aby se to pak zapsalo na obrázek. Zkoušel jsem to takhle, ale to neni dobrý řešení, hodně to zdržuje:

<?php
Header("Content-type: image/png");

include "db.php";

If ($pocitat=='ano')
{
SetCookie("vkdccount", "ano", Time()+1800);
$datum = Time();
@MySQL_Query("INSERT into pocitadlo values (0, '$datum')");
}

$count_celkem = MySQL_Query("SELECT count(*) AS pocet FROM pocitadlo");
while ($c = MySQL_Fetch_Array($count_celkem)):
$celkem = $c[pocet];
endwhile;

for($i=0;$i<2678400;$i++):
$cas = Time() - $i;
$count_mesic = MySQL_Query("SELECT count(*) AS pocet FROM pocitadlo WHERE datum = '$cas'");
while ($m = MySQL_Fetch_Array($count_mesic)):
$mesic = $m[pocet];
endwhile;
endfor;

for($j=0;$j<604800;$j++):
$cas = Time() - $j;
$count_tyden = MySQL_Query("SELECT count(*) AS pocet FROM pocitadlo WHERE datum = '$cas'");
while ($t = MySQL_Fetch_Array($count_tyden)):
$tyden = $t[pocet];
endwhile;
endfor;

for($k=0;$k<86400;$k++):
$cas = Time() - $k;
$count_den = MySQL_Query("SELECT count(*) AS pocet FROM pocitadlo WHERE datum = '$cas'");
while ($d = MySQL_Fetch_Array($count_den)):
$den = $d[pocet];
endwhile;
endfor;

for($l=0;$l<300;$l++):
$cas = Time() - $l;
$count_online = MySQL_Query("SELECT count(*) AS pocet FROM pocitadlo WHERE datum = '$cas'");
while ($o = MySQL_Fetch_Array($count_online)):
$online = $o[pocet];
endwhile;
endfor;

$im = imageCreateFromPng("pocitadlo.png");
$white = ImageColorAllocate($im, 220, 220, 220);
$cpx = (imagesx($im)-5*strlen($celkem))-7;
$mpx = (imagesx($im)-5*strlen($mesic))-7;
$tpx = (imagesx($im)-5*strlen($tyden))-7;
$dpx = (imagesx($im)-5*strlen($den))-7;
$opx = (imagesx($im)-5*strlen($online))-7;
ImageString($im,1,$cpx,6,$celkem,$white);
ImageString($im,1,$mpx,19,$mesic,$white);
ImageString($im,1,$tpx,32,$tyden,$white);
ImageString($im,1,$dpx,46,$den,$white);
ImageString($im,1,$opx,59,$online,$white);
ImagePng($im);
ImageDestroy($im);

?>

Dost blbej nápad co? I kdyby to php stihlo, asi by admin neměl radost :-)
jen k tem dvou otazkam, vic se me toho cist nechtelo:
1)
SELECT * FROM `users` WHERE DATE_FORMAT (`reg`, '%e') = '".Date ("d")."'; # den
SELECT * FROM `users` WHERE DATE_FORMAT (`reg`, '%M') = '".Date ("m")."'; #mesic
SELECT * FROM `users` WHERE DATE_FORMAT (`reg`, '%Y) = '".Date ("Y")."'; #rok

2) pocitadlo online stahnes kdekoliv, ale navod:
napis na svy stranky velkym pismem aby vsichni co sou online vyplnili kazdych 15min. takovej formular kterym ti odeslou email s presnym casem prichodu na stranky a ty pak jen budes sedet a upravovat pocet online lidi podle emailu..
a ted lepsi moznost :-) : do souboru nebo do databaze zapises ip adresu pc spolu s casem posledni aktivity a pak jen nastavis za jakej cas to jejich ip odstrani .. a pocet online uzivatelu zjistis kdyz je vsechny spocitas
<?


$server = "mysql.webzdarma.cz";
$login = "jmeno";
$password = "heslo";
$databaze = "tabulka";


$spojeni = MySQL_Connect($server, $login, $password);
MySQL_Select_DB($databaze);
$ipadresa = $REMOTE_ADDR;
$dnesnidatum = Date("Y-m-d");
$mesic = Date("m");
SetType($mesic, "integer");
$rok = Array(1=>"Leden","Únor","Březen","Duben","Květen","Červen","Červenec","Srpen","Z áří","Říjen","Listopad","Prosinec");
$result = Array();
$counter = Array();
$month = $rok[$mesic];
$result[0] = MySQL_Query("SELECT * FROM Host WHERE IP='".$ipadresa."'");
$host = MySQL_Fetch_Object($result[0]);
$poslednipristup = $host->Datum;
if ($poslednipristup==""):
$pocitat=true;
MySQL_Query("INSERT INTO Host VALUES('".$ipadresa."', '".$dnesnidatum."',1)");
else:
if ($poslednipristup!=$dnesnidatum):
$pocitat = true;
MySQL_Query("UPDATE Host SET Datum = '".$dnesnidatum."', Pocet = Pocet+1 WHERE IP = '".$ipadresa."'");
else:
$pocitat=false;
MySQL_Query("UPDATE Host SET Pocet = Pocet+1 WHERE IP = '".$ipadresa."'");
endif;
endif;
if ($pocitat):
$result[1] = MySQL_Query("SELECT * FROM Celkem");
if (MySQL_Num_Rows($result[1])!=0):
$counter[0] = MySQL_Result($result[1],0)+1;
MySQL_Query("UPDATE Celkem SET Pocet = Pocet+1");
else:
$counter[0] = 1;
MySQL_Query("INSERT INTO Celkem VALUES(1)");
endif;
$result[2] = MySQL_Query("SELECT * FROM Mesicni WHERE Mesic = '$month'");
$aktmesic = MySQL_Fetch_Object($result[2]);
$counter[1] = $aktmesic->Pocet+1;
if ($counter[1]==1):
MySQL_Query("INSERT INTO Mesicni VALUES('$month',1)");
else:
MySQL_Query("UPDATE Mesicni SET Pocet = Pocet+1 WHERE Mesic = '$month'");
endif;
$result[3] = MYSQL_Query("SELECT * FROM Dnes WHERE Datum='$dnesnidatum'");
$zaznam = MySQL_Fetch_Object($result[3]);
$counter[2] = $zaznam->Pocet+1;
if ($counter[2] == 1):
MySQL_Query("INSERT INTO Dnes VALUES ('$dnesnidatum', 1)");
else:
MySQL_Query("UPDATE Dnes SET Pocet = Pocet+1 WHERE Datum = '$dnesnidatum'");
endif;
else:
$result[4] = MySQL_Query("SELECT * FROM Celkem");
$counter[0] = MySQL_Result($result[4],0);
$result[5] = MySQL_Query("SELECT * FROM Mesicni WHERE Mesic = '$month'");
$tentom = MySQL_Fetch_Object($result[5]);
$counter[1] = $tentom->Pocet;
$result[6] = MYSQL_Query("SELECT * FROM Dnes WHERE Datum='$dnesnidatum'");
$dnes = MySQL_Fetch_Object($result[6]);
$counter[2] = $dnes->Pocet;
endif;
$result[7] = MySQL_Query("SELECT * FROM Host WHERE IP = '".$ipadresa."'");
$counter[3] = MySQL_Result($result[7],0,2);
echo "Celkem: ".$counter[0]."<br>";
echo $month.": ".$counter[1]."<br>";
echo "Dnes: ".$counter[2]."<br>";

?>
Tak jsem konečně pochopil, jak to lynx myslel. (Jasně, že se stydim :o))

Teď ale ještě jeden problém. Dost by se mi hodilo, kdybych mohl zobrazit přístupy za tejden. Nevíte, jak na to?


Tabulku mam takhle:

CREATE TABLE pocitadlo (
date date NOT NULL default '0',
time int(20) NOT NULL default '0',
PRIMARY KEY (date,time))


A pak to počítam takhle(např. pro denní přístupy):

$sqld = "SELECT count(*) AS pocetd FROM pocitadlo WHERE (DATE_FORMAT(`date`, '%Y') = " . Date('Y') . ") AND (DATE_FORMAT(`date`, '%m') = " . Date('m') . ") AND (DATE_FORMAT(`date`, '%d') = " . Date('d') . ")";
$count_den = MySQL_Query($sqld);
MySQL_Error();
$d = MySQL_Fetch_Array($count_den);
$den = $d[pocetd];


Já hledal všude možně nějakou funkci, která by uměla z datumu zjistit číslo tejdne v roce, nebo něco podobnýho, ale beznadějně. Tak jsem zkoušel i udělat i vlastní funkci, ale u toho jsem taky pěkně pohořel :o(. Nevim, na jakym principu to udělat. Nevim jak to spočítat.

Předem dík
Proboha, jaktože jsi na tom Intervalu nic nenašel?!
A co tady: http://interval.cz/search.asp?hledej=po%E8%EDtadlo

Konkrétně tady je jeden ze článků zmiňovaného seriálu:
http://interval.cz/clanek.asp?id=1422.
Dole najdeš odkazy na všechny předchozí díly.
ja bych radeji pouzil INT(10) a time () .. potom bys jenom vybiral z databaze v intervalu (ted nemam na mysli web Interval.cz) time (); time () - 3600*24*7 ...... ted si presne nevzpominam kolik to je .... :-)
fce ktea zvobrazuje den v roce tejden v roce atd skus date()
viz manual

Vrací řetězec formátovaný podle daného formátovacího řetězce s použitím daného celočíselného časového razítka timestamp nebo aktuálního místního času (není-li časové razítko zadáno).

Ve formátovacím řetězci lze používat tyto znaky:


a - "am" nebo "pm"

A - "AM" nebo "PM"

B - internetový čas Swatch ("zavináče")

d - den v měsíci, 2 číslice s úvodními nulami, "01" až "31"

D - den v týdnu, textově, 3 písmena, např. "Fri"

F - měsíc, textově, dlouhý název, např. "January"

g - hodina, 12-hodinový formát bez úvodních nul, "1" až "12"

G - hodina, 24-hodinový formát bez úvodních nul, "0" až "23"

h - hodina, 12-hodinový formát, "01" až "12"

H - hodina, 24-hodinový formát, "00" až "23"

i - minuty, "00" až "59"

I (velké i) - "1" pro letní čas, jinak "0"

j - den v měsíci bez úvodních nul, např. "1" až "31"

l (malé 'L') - den v týdnu, textově, dlouhý název, např. "Friday"

L - pravdivostní hodnota určující, zda je přestupný rok, "0" nebo "1"

m - měsíc, "01" až "12"

M - měsíc, textově, 3 písmena, např. "Jan"

n - měsíc bez úvodních nul, "1" až "12"

O - odchylka od greenwichského času v hodinách, např. "+0200"

r - datum formátované podle RFC 822, např. "Thu, 21 Dec 2000 16:01:07 +0200" (přidáno v PHP 4.0.4)

s - sekundy, "00" až "59"

S - anglická přípona řadové číslovky pro den v měsíci, 2 znaky, "st", "nd", "rd" nebo "th"

t - počet dní v daném měsíci, "28" až "31"

T - časová zóna nastavená na serveru, např. "EST" nebo "MDT"

U - sekundy od Unix Epoch (1.1.1970 00:00:00 GMT)

w - den v týdnu, číselně, "0" (neděle) až "6" (sobota)

W - počet týdnů v roce podle ISO-8601, týden začíná v pondělí (přidáno v PHP 4.1.0)

Y - rok, 4 číslice, např. "1999"

y - rok, 2 číslice, např. "99"

z - den v roce, "0" až "365"

Z - časový posun v sekundách ("-43200" až "43200"). Posun má pro časové zóny na západ od UTC zápornou hodnotu, na východ kladnou.

Nerozpoznané znaky ve formátovacím řetězci se vytiskou tak, jak jsou. Při použití gmdate() má formát "Z" vždy hodnotu 0.

Příklad 1. Příklad - date()

echo date ("l dS of F Y h:i:s A");
echo "July 1, 2000 is on a " . date ("l", mktime(0,0,0,7,1,2000));
Díky,
to sem ani nevěděl, že date() má tolik parametrů. Já znal jen těch pár, který vypsal Kosek ve svý knížce.
knizku koska sice nemam, ale rekl bych ze je dobra spis na nauceni se neceho .. na prohloubeni znalosti potrebujes php manual .. tam je vsechno ..
Tak jsem to s tim tejdnem už vyřešil a nebylo to ani tak těžky, stačilo jen myslet :o)

for($i=0;$i<=6;$i++)
{
$wden = Date("w");
If($wden = $i)
{
$kden = Date('d') - $i;
$sqlt = "SELECT count(*) AS pocett FROM pocitadlo WHERE (DATE_FORMAT(`date`, '%Y') = " . Date('Y') . ") AND (DATE_FORMAT(`date`, '%m') = " . Date('m') . ") AND (DATE_FORMAT(`date`, '%d') >= " . $kden . ")";
}
}
$count_tyden = MySQL_Query($sqlt);
MySQL_Error();
$t = MySQL_Fetch_Array($count_tyden);
$tyden = $t[pocett];