При просмотре новости скрипт DLE считает просмотры (если конечно включено в настройках, вот только считаются все просмотры, дае одним и тем же посетителем, то делает статистику "кривой" так как посетитель может обновлять страницу в ожидании нового комментария.
Как бы это поправить...
Строки отвечающие за подсчет просмотров новости находятся в файле show.full.php который лежит в папке engine/modules
Вот эти строки:
if( $config['allow_read_count'] == "yes" ) {
if( $config['cache_count'] ) $db->query( "INSERT INTO " . PREFIX . "_views (news_id) VALUES ('{$row['id']}')" );
else $db->query( "UPDATE " . PREFIX . "_post set news_read=news_read+1 where id='{$row['id']}'" );
}
Все достаточно просто, просто в зависимости от настроек генерируется запрос к БД.
Нам же нужно чтобы в некотрых случаях счетчик не обновлялся.
Что нам нужноНам нужно запомнить какой посетитель какую новость смотрел, при этом эту инфу убрать через скажем несколько часов, так как если посетитель вернется на новость через час то уже можно сменло засчитывать этот просмотр, (для подсчета хостов есть другие решения, например тот же
http://www.liveinternet.ru/).
Как это сделатьМожно хранить информацию либо в cookie самого посетителя либо в БД, если мы будет все это записывать в cookie то .... словом нереально, разве что у вас на сайте только 10 новостей (почти как у меня сейчас :) )
Тогда нужно записывать инфу в БД, тут то т трабла
В чём траблаТрабла в том что это один или два лишних запроса к БД, один чтобы посмотреть есть ли запись, второй чтобы эту запись создать (в случае если её там нет).
Нафиг это нужно, словом рекомендую забить и
не читать дальшеПочему читаете? Вам сервер не жалко?
Ну фиг с вами, если уж так надо читайте, но я
не рекомендую делать так как написано ниже.
Сначала иде м phpmyadmin, там выполняем такой запорос:
ALTER TABLE `dle_views` ADD `ip` VARCHAR( 16 ) NOT NULL;
dle это ваш префикс таблиц, если забыли можно вспомнить заглнув в файл dbconfig.php который в папке data, парметр "PREFIX".
Открываем show.full.php находим там:
if( $config['allow_read_count'] == "yes" ) {
if( $config['cache_count'] ) $db->query( "INSERT INTO " . PREFIX . "_views (news_id) VALUES ('{$row['id']}')" );
else $db->query( "UPDATE " . PREFIX . "_post set news_read=news_read+1 where id='{$row['id']}'" );
}
Заменяем на
//Смотрим смотрел ли данный посетиетель эту новость.
$test_ip = $db->super_query ("SELECT news_id FROM " . PREFIX . "_views WHERE news_id='{$row['id']}' and ip='{$_IP}'");
//Смотрим смотрел ли данный посетиетель эту новость.
if($config['allow_read_count'] == "yes") {
if($config['cache_count']){
if(!$test_ip['news_id']){
$db->query("INSERT INTO " . PREFIX . "_views (news_id, ip) VALUES ('{$row['id']}', '{$_IP}')");
}
}
else {
if(!$test_ip['news_id']){
$db->query("INSERT INTO " . PREFIX . "_views (news_id, ip) VALUES ('{$row['id']}', '{$_IP}')");//Вот еще один дполнительный запрос
$db->query("UPDATE " . PREFIX . "_post set news_read=news_read+1 where id='{$row['id']}'");
}
}
}
Видете какой кашмар?
дополнительный запрос к БД, а в случае отключенного дополнительно два запроса к БД, все это лишняя нагрузка на сервер плюс замдление времни генерации страницы.
Ну если вам так нужно то как хотите, идем дальше.
Откройте файл engine/modules/cron.php
там найдите строки:
if( $config['cache_count'] ) {
$result = $db->query( "SELECT COUNT(*) as count, news_id FROM " . PREFIX . "_views GROUP BY news_id" );
while ( $row = $db->get_array( $result ) ) {
$db->query( "UPDATE " . PREFIX . "_post set news_read=news_read+{$row['count']} where id='{$row['news_id']}'" );
}
$db->free( $result );
$db->query( "TRUNCATE TABLE " . PREFIX . "_views" );
clear_cache( 'news_' );
}
Ниже вставьте (чтобы таблица логов просмотров регулярно чистилась вне зависмиости от того включено ли кеширование просмотров.
if (!$config['cache_count']) {
$db->query("TRUNCATE TABLE " . PREFIX . "_views");
}
Это уже третий дополнительный запрос к БД (правда выполнятся он будет относительно редко).
Вот, собсно все, готово :)
p.s.
На этом блоге всеатки поставил, пока посещаемость не очень так что можно ставить, но вам
не советуюp.p.s
Перед всеми этими телодвижениями незабывайте делать бакуп того что меняете.