PHP. Счетчик просмотров для каждой страницы сайта. Рейтинг страниц сайта

Автор: Беляев Александр
Сайт Автора: wm-help.net
E-mail Автора: [email protected]
Дата написания: 14.12.2006
    Эта статья является продолжением статьи о создании счетчика просмотров для каждой страницы сайта на php и MySQL (если Вы ее не читали, то обязательно прочтите, иначе ничего не поймете из ниже сказанного). В этой статья я решил продолжить тему и расширить возможности счетчика просмотров страниц.

    Для увеличения возможностей и получения статистики просмотров страниц сайта к базовому php скрипту необходимо добавить несколько строк и своих функций. В частности нужно будет создать еще одну таблицу, которая имеет следующую структуру:
CREATE TABLE `my_log_urls` (
  `page_id` varchar(32) NOT NULL default '',
  `page_url` text NOT NULL,
  KEY `page_id` (`page_id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
 

    Как видно из структуры MySQL таблицы, она состоит всего из двух полей (page_id – хэш сумма md5() от  urla страницы и page_url – url страницы) и индекса, установленного на поле page_id – для значительного ускорения поиска значения в таблице. И еще, я не стал изменять изначальную таблицу my_log, которая использовалась для подсчета количества просмотров страниц, а создал другую по одной простой, но очень весомой причине: чем больше данных в таблице – тем медленнее осуществляется поиск по таблице. А скорость работы php скриптов такого уровня не должна ощутимо влиять на работу сайта в целом. Ведь если у вас коммерческий и при этом очень посещаемый сайт, то тратить строго ограниченное процессорное время на второстепенные задачи просто невыгодно, ведь зачастую прибыль зависит от того, сколько человек сможет увидеть ваш сайт.

    Теперь перейдем непосредственно к коду php скрипта. Я внес в него незначительные изменения, в основном это новые функции для работы с MySQL таблицей my_log_urls.

В counter.php внес следующие изменения:
добавляем функцию Default_Write_URL
function Default_Write_URL($id, $url)
{
$id = addslashes($id);
$result = mysql_query ("INSERT INTO `my_log_urls` ( `page_id` , `page_url` ) VALUES ('".$id."' , '".$url."');");
return $result;
}
В коде, заменяем
if (!searchID($unical_page_id_gid)) // существует ли запись с таким id
{
    Default_Write($unical_page_id_gid); // запись всех значений по умолчанию
}
на
if (!searchID($unical_page_id_gid)) // существует ли запись с таким id
{
    Default_Write($unical_page_id_gid); // запись всех значений по умолчанию
    Default_Write_URL($unical_page_id_gid, $_SERVER['REQUEST_URI']);
}

    В результате, получаем значительную экономию времени т.к. делаем всего одну запись в таблицу my_log_urls и одну в my_log, и при следующих запросах этой же страницы запрос к таблице my_log_urls выполняться не будет, т.к. запись уже существует в таблице my_log, следовательно и в таблице my_log_urls она то же есть.
    Для подсчета рейтинга страниц сайта, предлагаю написать другой php скрипт, который будет по значениям просмотров страницы в таблице my_log брать значения в таблице my_log_urls. А результат представлять в виде таблицы с данными о просмотрах страниц, отсортированными по убыванию (от большего значения к меньшему).
    Ниже приведен код php скрипта, который необходимо скопировать в созданный вами файл top.php:
<?php
/* https://wm-help.net/ */
 
$INFO['sql_host'] = "localhost";
$INFO['sql_user'] = "username";
$INFO['sql_pass'] = "userpass";
$INFO['sql_database'] = "my_db";
 
/* Top 10 сегодня */
function MySQLReadToday()
{
$result = mysql_query ("SELECT * FROM `my_log` ORDER BY `today` DESC LIMIT 0 , 10 ") or print ("Query failed");
$new_arr = array();
while ($row = mysql_fetch_array($result, MYSQL_ASSOC))
{
    if (time()<$row['date']) // если сутки еще не прошли
    {
        $new_arr[] = $row;
    }
}
return $new_arr;
}
 
/* Top 10 за все время работы счетчика */
function MySQLReadAll()
{
$result = mysql_query ("SELECT * FROM `my_log` ORDER BY `all` DESC LIMIT 0 , 10 ") or print ("Query failed");
$new_arr = array();
while ($row = mysql_fetch_array($result, MYSQL_ASSOC))
{
    $new_arr[] = $row;
}
return $new_arr;
}
 
/* по хэш-сумме получить url страницы */
function MySQLRead_url($id)
{
$id = addslashes($id);
$result = mysql_query ("SELECT * FROM `my_log_urls` WHERE `page_id` LIKE '".$id."'");
return (array)mysql_fetch_assoc($result);
}
 
/* печать таблицы с данными */
function print_table($data)
{
echo <<<END
<table border="1" width="100%" align="center">
    <tr>
        <td rowspan="2" align="center" valign="middle">URL страницы</td>
        <td colspan="3" align="center" valign="middle" width="235">Просмотры страниц</td>
    </tr>
    <tr>
        <td height="35" align="center" valign="middle" width="125">дата доступа</td>
        <td height="35" align="center" valign="middle" width="55">сегодня</td>
        <td height="35" align="center" valign="middle" width="55">всего</td>
    </tr>
END;
foreach($data as $val)
{
    $tmp = MySQLRead_url($val['page_id']);
    $url = "<a href=\"http://".$_SERVER['HTTP_HOST'].$tmp['page_url']."\">http://".$_SERVER['HTTP_HOST'].$tmp['page_url']."</a>";
    $date = date("d.m.y H:i:s", $val['date']);
    $today = $val['today'];
    $all = $val['all'];
    echo <<<END
    <tr>
        <td valign="middle">$url</td>
        <td align="center" valign="middle">$date</td>
        <td align="center" valign="middle" width="55">$today</td>
        <td align="center" valign="middle" width="55">$all</td>
    </tr>
END;
}
echo "</table>";
}
 
$link = mysql_connect($INFO['sql_host'], $INFO['sql_user'], $INFO['sql_pass']); // Соединение с MySQL
mysql_select_db ($INFO['sql_database']); // Выбор базы данных
 
/* Самые популярные страницы сегодня */
$data = MySQLReadToday(); // получение данных из MySQL таблицы
echo "<h1>Самые популярные страницы в течении суток</h1>";
print_table($data); // печать таблицы с данными
 
/* Самые популярные страницы за все время */
$data = MySQLReadAll(); // получение данных из MySQL таблицы
echo "<h1>Самые популярные за все время</h1>";
print_table($data); // печать таблицы с данными
?>


    Данный php скрипт выводит 10 самых популярных страниц вашего сайта за последние сутки и за все время. В принципе, можно осуществлять вывод и большего числа страниц, изменив в php функциях MySQLReadAll и MySQLReadToday лимит считываемых из таблицы записей. А так же можно вместо самых популярных страниц увидеть самые непопулярные, изменив способ сортировки в этих же функциях с DESC на ASC.
    Скачать данный php скрипт, вместе с модифицированным php скриптом подсчета просмотров страниц, можно по этой ссылке: https://wm-help.net/download/top_page_and_counter.zip
Источник: https://wm-help.net/my-articles/article/top-page-of-site.counter-vievs.php-mysql.htmPage copy protected against web site content infringement by Copyscape
Перепечатка данной статьи разрешается только при письменном(e-mail) разрешении автора (Беляева Александра Дмитриевича) и при полном сохранении исходного вида статьи (ссылки, авторские реферальные ссылки, e-mail'ы, форматирование текста, ...), а так же указания точных данных об авторстве (данные автора + прямая [без редиректа и не закрытая от индексации] ссылка на статью).
В случае не выполнения данных правил, возможно применение «особых» мер, к нарушителям.