Помогите написать счётчик php+MySQL

1. Жека (18.12.2009 / 16:33)
Подскажите как сделать счётчик. Опредиление онлайн я сделал, а как сделать статистику посещений? Хосты / хиты...
Мне нужен алгоритм, я просто ни когда не писал счётчики

2. iNeeXT (18.12.2009 / 16:43)
Hиктo нe пoмoжeт здecь нeт yжe мacтepoв!

3. Люций (18.12.2009 / 16:46)
2, есть, но помогать не будут

4. Станислав (18.12.2009 / 16:57)
1 вот блин, лень в гугле вбить запрос?? И здесь и везде это уже 1000000000 раз обсуждалось. Отправляю на http://php.su . Смотри в php на примерах

5. ramzes (18.12.2009 / 17:17)
#2 да, тут только такие флудеры как ты остались.
#3 ну вот тебе то и не помогут теперьsmile
#4 а че ты его в гугл и на пхп.су посылаешь?
Форум на что тогда?
Он сюда пришел за помощью, а не за посылами.
//
принцип:
в шапке пишешь в таблицу:
ип, арбуз, session_id(), time() (логин если есть)
дальше выбираешь по (логину если есть), иначе по ид сессии, иначе по ип + арбуз.
if($online['time'] > (time()-300)){ echo' Online'; }else{ echo' Offline'; }
если авторизированного то сразу выбираешь логин и время ^, нашел - на сайте. Не нашел - значит в офф.
Думаю понятно обьяснил.smile
статистика - собственно выборка из таблицы и будет статистикойsmile

6. ramzes (18.12.2009 / 17:19)
А забыл добавить, в шапке сначала проверяешь есть ли такой пользователь в таблице если есть и время не вышло то обновляешь, если нет то записываешь нового.

7. Жека (18.12.2009 / 17:43)
6, спасибо...это я как раз умею...примерно так у меня и сделано...только без session_id(), мне нужно защитовать хосты и хиты...

8. Жека (18.12.2009 / 17:45)
<?php
mysql_query("DELETE FROM `online` WHERE `time` < ".(time()-300)." || `ip`='".$_SERVER["REMOTE_ADDR"]."'");
mysql_query("INSERT INTO `online` 
	                SET `login`='".$user_login."', 
	                    `ip`='".$_SERVER["REMOTE_ADDR"]."', 
                        `self`='".$_SERVER['REQUEST_URI']."', 
                        `agent`='".$_SERVER['HTTP_USER_AGENT']."', 
                        `time`='".time()."'");
$sql=mysql_query("SELECT * FROM `online`");
$online=mysql_num_rows($sql);
?>


9. Жека (18.12.2009 / 17:47)
ну впринцепи разрулить юзеров и гостей не сложно...
Я хочю выводить сколько хитов/хостов и сколько времени провели на сайте...

10. ramzes (18.12.2009 / 18:02)
#8 это зачем? Не удаляй записи, удаляй их раз в день.
Считаешь сколько строк - столько хостов в день. Добавь поле под хиты и когда обновляешь запись при переходе добавляй +1. Потом считаешь общую сумму этого поля у всех строк и получаешь хиты в день.
Записываешь эти данные куда ни будь и после этого чистишь таблицу.
Я так делаюsmile
может есть еще варианты но по мне этот самый удобный. И на один запрос меньше (удаление раз в сутки а не каждый раз)

11. ramzes (18.12.2009 / 18:07)
А session_id() - ключ надежнее чем ип + арбуз.
Он не плавает в отличии от ип'а, но этому его предпочитаю.
Собственно сравнивал
фиксвап.нет 300, этот счетчик 310-350.
Достаточно точно.

12. Станислав (18.12.2009 / 19:13)
5 да хотяб потому, что здесь по 2 раза в неделю такую тему создают.

13. Жека (18.12.2009 / 19:34)
12, про хосты / хиты ни разу не видел!!!!!!!!!!!!!!!!!!

14. Жека (18.12.2009 / 19:38)
ramzes, пасиб большое! Сегодня не хочю уже делать, а завтро с утра начну пробовать. Если чё отпишуsmile

15. Удаленный (19.12.2009 / 15:26)
Ггг. есть такая штука в браузере как Авто обновление страницы.
Здесь уже надо проверяять $_SERVER['HTTP_REFERER'];
если совпадает с текущей страницей или пустой ещё записать в сесию предыдущую страницу и сверять с рефером потом уже защитуем.

16. Удаленный (19.12.2009 / 15:54)
Можа сделать такую проверку.
<? $ref=preg_replace('/http:\/\/.*?\//si','/',$_SERVER['HTTP_REFERER'];
$uri=$_SERVER['REQUEST_URI'];
$ref2=$_SESSION['ref2'];
$_SESSION['ref2']=$uri;
if(!empty($ref) || !empty($ref2) || $ref==$ref2 || $uri!==$ref)
{Записуем}


17. Жека (19.12.2009 / 17:05)
$update=mysql_query("UPDATE `online` 
	                SET `login`='".$user_login."', 
		                `sid`='".session_id()."',
	                    `ip`='".$_SERVER["REMOTE_ADDR"]."', 
	                    `agent`='".$_SERVER['HTTP_USER_AGENT']."', 
                        `self`='".$_SERVER['REQUEST_URI']."', 
                        `host`=`host`+1,
                        `time`='".time()."' WHERE `time` > ".(time()-300)." || `ip`='".$_SERVER["REMOTE_ADDR"]."'");
if(!$update) {  mysql_query("INSERT INTO `online` 
	                SET `login`='".$user_login."', 
		                `sid`='".session_id()."',
	                    `ip`='".$_SERVER["REMOTE_ADDR"]."', 
	                    `agent`='".$_SERVER['HTTP_USER_AGENT']."', 
                        `self`='".$_SERVER['REQUEST_URI']."', 
                        `host`=`host`+1,
                        `time`='".time()."'"); }


18. Жека (19.12.2009 / 17:08)
чёта не работает sad

19. ramzes (19.12.2009 / 18:29)
#17 это ты че такое изобразил? Обновляешь какую запись то? Чего добиться этим хочешь?))
WHERE session_id = '".session_id()."'
или по логину или по ип+арбуз.
#16 Жесть. Регулярки во все подряд пихать..
$rq = $_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'];
if($_SESSION['request']!=$rq){
//ok update table online
$_SESSION['request'] == $rq;
}

20. Жека (19.12.2009 / 18:33)
всё..разобрался...smile

21. Жека (19.12.2009 / 18:37)
19, тип такого?
$sql=mysql_query("SELECT * FROM `on` WHERE `time` > ".(time()-300)." || `sid`='".session_id()."'");
if(mysql_fetch_array($sql)) {
mysql_query("UPDATE `on` 
	                SET `sid`='".session_id()."',
                        `host`=`host`+1,
                        `time`='".time()."' WHERE `time` > ".(time()-300)." || `sid`='".session_id()."'");
} else {
mysql_query("INSERT INTO `on` 
	                SET `sid`='".session_id()."',
                        `host`=`host`+1,
                        `time`='".time()."'"); 
}


22. Жека (19.12.2009 / 18:39)
так работает..теперь надо доработать

23. ramzes (20.12.2009 / 01:12)
#21 ну я делаю, проверяю сначала по логину, потом по сессии потом по арбузу и ип'у если предыдущего совпадения не нашлось.
Иногда бывает сессии теряются х.з. Почему. Редко но все таки..

24. Жека (21.12.2009 / 18:48)
Спасибо всем кто участвовал в темеsmile
http://mangos.op-wap.ru/online.php.txt код...правда там надо отфильтровать пару переменных....
http://mangos.op-wap.ru/ вот так вышло на сайте
P.S Не реклама! Особая благодарность ramzes'у klass

URL: https://visavi.net/topics/4020