В этой статье мы будем разбирать, как сделать счетчик просмотров по дням. Делать мы это будем на MVC при помощи MySQL и PHP, приступим.
Для начала создаем таблицу в базе данных, в которой будут храниться просмотры наших страниц. Она будет содержать поля: id – id записи, является ключевым полем; see – количество просмотров; id_art – id страницы для которой будем считать просмотры и date – дата. Выглядеть она будет вот так:
Теперь зайдем в папку models и откроем файл Page.php. В нем нам нужно написать следующие функции:
Для начала напишем функцию, которая будет определять текущую дату. С помощью функции date получаем текущую дату и время через пробел, записываем все это в переменную date_time_string.
Далее разбиваем переменную date_time_string через пробел и берем первую ее часть – в ней лежит наша дата. Разбиваем дату через точки и получаем в массив с датой, месяцем и годом. Все эти элементы мы через точку записываем в аргументы функции trim, она нужна, чтобы удалить пробелы в начале и конце предложения. Полученный результат записываем в переменную date.
public static function dateToday(){
$date_time_string = date('d.m.Y');
$dt_elements = explode(' ',$date_time_string);
$date_elements = explode('.',$dt_elements[0]);
$date = trim($date_elements[0].'.'.$date_elements[1].'.'.$date_elements[2]);
return $date;
}
Функция checkSeeArticle. Эта функция проверяет, существует ли в базе данных запись с просмотрами на сегодняшнюю дату, если да, то возвращает true иначе false. В качестве аргументов принимает id страницы и текущую дату:
public static function checkSeeArticle($id, $date)
{
$db = Db::getConnection();
$sql = 'SELECT * FROM counter_article WHERE id_art= :id_art AND date= :date';
$result = $db->prepare($sql);
$result->bindParam(':id_art', $id, PDO::PARAM_INT);
$result->bindParam(':date', $date, PDO::PARAM_STR);
$result->execute();
$art = $result->fetch();
if ($art) return true;
else return false;
}
Функция viewsSeeTodayArticle. Функция возвращает количество просмотров по текущей дате. В качестве аргументов принимает id страницы и текущую дату:
public static function viewsSeeTodayArticle($id,$date)
{
$db = Db::getConnection();
$result = $db->prepare('SELECT see FROM counter_article WHERE id_art= :id_art AND date= :date');
$result->bindParam(':id_art', $id, PDO::PARAM_INT);
$result->bindParam(':date', $date, PDO::PARAM_STR);
$result->execute();
$see = $result->fetchColumn();
return $see;
}
Функция viewsSeeAllArticle. Эта функция в SQL запросе считает общее количество просмотров страницы. В качестве аргумента принимает id страницы:
public static function viewsSeeAllArticle($id) {
// Сумма всех ячеек с предварительным условием PDO
$db = Db::getConnection();
$result = $db->prepare('SELECT sum(see) FROM counter_article WHERE id_art= :id_art');
$result->bindParam(':id_art', $id, PDO::PARAM_INT);
$result->execute();
$all = $result->fetchColumn();
return $all;
}
Функция counterArticle. Эта функция принимает id страницы, его она записывает в переменную id_art. Потом с помощью функции dateToday получает текущую дату. В переменную check получаем true или flase (есть запись по просмотрам страницы на сегодня или нет):
public static function counterArticle($id) {
$id_art = $id;
$date = self::dateToday();
$check = self::checkSeeArticle($id, $date);
Если в записи о просмотрах на сегодня нет, то создаем новую запись с помощью просто SQL запроса:
if (!$check)
{
$db = Db::getConnection();
$see = 1;
$sql = 'INSERT INTO counter_article (see, id_art, date) VALUES (:see, :id_art, :date)';
$result = $db->prepare($sql);
$result->bindParam(':see', $see, PDO::PARAM_INT);
$result->bindParam(':id_art', $id_art, PDO::PARAM_INT);
$result->bindParam(':date', $date, PDO::PARAM_STR);
return $result->execute();
}
Иначе, если запись на текущую дату уже имеется в нашей таблице, то с помощью SQL запроса прибавляем количество просмотров на единицу:
else
{
$db = Db::getConnection();
$sql = "UPDATE counter_article SET see = `see` + 1 WHERE id_art =:id_art AND date =:date";
$result = $db->prepare($sql);
$result->bindParam(':id_art', $id_art, PDO::PARAM_INT);
$result->bindParam(':date', $date, PDO::PARAM_STR);
return $result->execute();
}
}
Теперь, когда алгоритм написан, нам нужно где-то вызвать функцию counterArticle. Проходим в папку SiteController и открываем метод отрисовки одной из страниц, у меня это будет метод actionIndex. В начало метода нужно написать следующий код:
$page_content = 2;
Page::counterArticle($page_content);
$all = Page::viewsSeeAllArticle($page_content);
$date = Page::dateToday();
$see = Page::viewsSeeTodayArticle($page_content, $date);
В каждом методе отрисовки нам нужно задавать id страницы. Своей странице я задал id равный двум. При загрузке страницы с помощью второй строчки будет прибавляться один просмотр. В переменную all с помощью функции viewsSeeAllArticle получаем общее количество просмотров страницы за все время.
Далее получаем текущую дату и с помощью функции viewsSeeTodayArticle, в переменную see получаем количество просмотров, которые были совершены сегодня.
На самой странице можно выводить просмотры, используя простую PHP конструкцию:
<?php
echo 'Общее количество просмотров этой страницы: '.$all.<br>;
echo 'Количество просмотров за сегодня: '.$see;
?>
Выглядеть это будет вот так:
Данный счетчик просмотров считает каждое посещение страницы. Очень удобно реализована запись даты, с ее помощью можно выяснить, какие статьи пользуются интересом у пользователей, а какие нет.
Ещё пока нет комментариев, будь первым!