Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno Počítadlo přístupů na web

Ahoj,

chtěl bych si napsat počítadlo přístupů na web, (JS,PHP,MYSQL umím) ale nevím na jakým principu to udělat,
napadlo mě že by se při prvním načtení vytvořila cookie s platností 24 hodin a započítal by se přístup, dokud by cookie platila tak by se další nezapočítával, ale přinejmenším IE9, a možná i jiní uživatelé mají cookies blokované, takže by se nezapočítaly všechny přístupy všech,
a nebo to udělat přes zjištění IP adresy a času, zapsání do databáze a pak porovnávat získanou ip a čas návštěvy s databází?
a nebo to mám udělat uplně jinak?

díky

Předmět Autor Datum
Jednou jsem psal článek o počítadlu přístupů pomocí souborů - http://martindev.posterous.com/pocitad…
martin.developer 29.10.2011 12:52
martin.developer
jako inspirace dobrý, podíval sem se na to jen v rychlosti řeší se tam jeden přístup jednou za 24 ho…
Banshee 29.10.2011 13:18
Banshee
Ne je to celkové počítadlo. Pokud to chcete pomocí databáze a pouze pro 24h. Tak při přístupu na we…
martin.developer 29.10.2011 13:24
martin.developer
Určitě bych do toho netahal cookies. Ale kontrolou a zápisem do MySQl databáze, jak píšeš. MySQL má…
hynajs 29.10.2011 14:54
hynajs
Chtěl jsem aby se návštěva z jedné IP počítala jen jednou denně. Moje řešení níže umí počítat celko…
Banshee 30.10.2011 19:30
Banshee
nejsem zadny profik ale po vlozeni kodu jsem zjistil ze tam neco faliruje nejdriv nazvy tabulek a pa…
matesking 28.10.2012 22:51
matesking
Chyba může být v čemkoliv. Když se neobtěžuješ napsat, co prohlížeč hlásí a jak jsi přesně postupova…
host 28.10.2012 22:54
host
Já bych si tam dal Toplist a je to bez práce. Navíc tam jsou různé statistiky. Prima to bývá také u… poslední
Kráťa 28.10.2012 22:55
Kráťa

Ne je to celkové počítadlo.

Pokud to chcete pomocí databáze a pouze pro 24h. Tak při přístupu na web uživatele dělejte tyto kroky:

- zkontrolujte unikátnost uživatele podle IP
- pokud je nový zapište ho do databáze

Potom bych si v pomocné tabulce uložil timestamp posledního mazání starý dat (více jak 24h) a před vložením návštěvníka bych data případně promazal.
Tzn. bude tam třeba 00:01 28.10. 2011 a pokud tam nyní (13:30 29.10.) přijde uživatel tak se spustí procedura, která smaže starší data.

Toto řešení bude fungovat, že bude ukazovat něco jako "Tento den tady bylo X uživatelů.". Pokud by jste to chtěl od okamžiku přístupu uživatele - 24h tak by se to zase řešilo jinak, ale osobně si myslím, že informace "Tento den" je lepší.

Ale pokud máte přístup ke CRONu tak to máte ještě lehčí.

EDIT z telefonu - teď koukám, že jsem asi přesně nepochopil co potřebujete a že odpovídám trošku mimo.

Chtěl jsem aby se návštěva z jedné IP počítala jen jednou denně.

Moje řešení níže umí počítat celkový počet návštěv (z jedné IP jedna denně) a počet návštěv v aktuální den (opět z jedné IP jedna denně)

Tabulka SQL

SET NAMES utf8;

SET SQL_MODE='';

USE `counter`;

DROP TABLE IF EXISTS `items`;

CREATE TABLE `items` (
	`ip` varchar(254) NOT NULL DEFAULT '',
	`day` tinyint(5) DEFAULT '0',
	PRIMARY KEY (`ip`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `counts`;

CREATE TABLE `counts` (
	`id` int(11) DEFAULT '0',
	`count_all` int(11) UNSIGNED DEFAULT '0',
	`count_today` int(11) UNSIGNED DEFAULT '0',
	`day_today` tinyint(5) DEFAULT '0',
	PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

PHP

<?
 $spojeni = mysql_connect("127.0.0.1","root","root" ) or die ('<strong>Critical error!</strong><br>Nepodarilo se pripojit k databazi!');
  mysql_select_db("název databáze", $spojeni) or die ('Spatne zadana databaze v db.php');
  mysql_query("SET character_set_client=utf8");
  mysql_query("SET character_set_connection=utf8");
  mysql_query("SET character_set_results=utf8");
  mysql_query("set names 'utf8'");

$ip_now = getenv('REMOTE_ADDR');
$day_now = date("d" ,time());

$query = mysql_query("SELECT `day_today` FROM `visits_counts` WHERE `id` = '1' LIMIT 1;");
$day_today = mysql_result($query, 0);

if($day_today != $day_now)
	{
	mysql_query("UPDATE `visits_counts` SET `count_today` = '0' WHERE `id` = '1' ;");
	mysql_query("UPDATE `visits_counts` SET `day_today` = '$day_now' WHERE `id` = '1' ;");
	}

$query2 = mysql_query("SELECT * FROM `visits_items` WHERE `ip` = '$ip_now' ;");
$row= mysql_fetch_array($query2);

if ($row == 0) 
	{
	mysql_query("INSERT IGNORE INTO `visits_items` VALUES ('$ip_now', '$day_now') ;");
	mysql_query("UPDATE `visits_counts` SET `count_all` = `count_all` + '1' WHERE `id` = '1' ;");
	mysql_query("UPDATE `visits_counts` SET `count_today` = `count_today` + '1' WHERE `id` = '1' ;");
	}
else
	{
	if ($row['day'] != $day_now)
		{
		mysql_query("UPDATE `visits_items` SET `day` = '$day_now' WHERE `id` = '$row[ip]' ;");
		mysql_query("UPDATE `visits_counts` SET `count_all` = `count_all` + '1' WHERE `id` = '1' ;");
		mysql_query("UPDATE `visits_counts` SET `count_today` = `count_today` + '1' WHERE `id` = '1' ;");
		}
	}

if ($day_now >= 3)
	{
	mysql_query("DELETE * FROM `visits_items` WHERE `day` > '$day_now' ;");
	$day_x = $day_now - 3;
	mysql_query("DELETE * FROM `visits_items` WHERE `day` < '$day_x' ;");
	}

$query3 = mysql_query("SELECT `count_all`,`count_today` FROM `visits_counts` WHERE `id` = '1' ;");
$visits = mysql_fetch_array($query3);


print "Návštěvy dnes: ".$visits[0]."<br />Návštěvy celkem:".$visits[1]."</div>"."\n";

?>

Zpět do poradny Odpovědět na původní otázku Nahoru