224   221     15   57    

Функционал количества просмотров товара в интернет-магазине

В статье расскажем об основных способах реализации такого функционала в интернет-магазинах, как количество просмотров товара (с точки зрения серверной логики). Опишем реализации данного функционала в нескольких случаях: когда не важна уникальность пользователя, когда она важна, когда важно время просмотров (за последние сутки, за текущий день).

При создании интернет-магазина довольно часто возникает необходимость в добавлении такого функционала, как подсчет количества просмотров каждого из товаров. Другими словами, вам нужно знать, сколько уникальных (или неуникальных) посетителей посещало страницу с описанием товара за определенный промежуток времени, чтобы, к примеру, можно было предоставить пользователям список самых популярных товаров, либо делать скидки на товары, не обладающие достаточной популярностью.

Общий принцип учета количества просмотров страницы связан с увеличением счетчика в базе данных. При этом следует учитывать два момента - уникальность посетителей и время, в течение которого увеличиваются (засчитываются) просмотры.

Для начала рассмотрим самый простой вариант, когда уникальность посетителей не учитывается, а время, за которое считываются просмотры, не ограничено. Допустим, что все товары хранятся в базе данных в таблице под названием "products".

Там могут быть такие поля, как:

  • "name" (название товара),
  • "price" (цена),
  • "count" (оставшееся на складе количество)
  • и т.д.

Для учета количества просмотров нужно добавить новое поле под названием "views" - int, в котором значение по умолчанию будет равно 0.

Далее при каждом открытии страницы с товаром мы выполняем один простой запрос в базу:

UPDATE products SET views = views + 1 WHERE id = ?

Вместо знака ? подставляем id нужного товара. Теперь при каждом открытии страницы счетчик количества просмотров будет увеличиваться. На его основе впоследствии можно выполнять сортировку / фильтрацию товаров, к примеру, в отдельном разделе для списка самых популярных товарных позиций.

Допустим, чтобы получить из базы данных 10 самых просматриваемых товаров, нужно выполнить примерно такой запрос:

SELECT * FROM products ORDER BY views DESC LIMIT 10

Теперь рассмотрим более интересный кейс - нужно учитывать только уникальные просмотры. То есть от одного пользователя должен засчитываться лишь один просмотр, несмотря на то, сколько раз он открыл страницу с товаром. И тут есть два варианта, где хранить информацию о том, кто и что просмотрел - на стороне клиента (в куках браузера) или на стороне сервера (в базе данных).

Что касается первого варианта, то здесь при каждом открытии страницы с товаром мы будем выполнять примерно следующий алгоритм действий:

  1. Искать у пользователя куку с названием, к примеру, "{site}_products_views" (вместо site нужно подставить название вашего сайта).
  2. Если такой куки нет, то создавать ее и устанавливать пользователю, записывая в тело куки id товара, страница с которым открыта.
  3. Если кука есть, то брать ее содержимое (список id уже просмотренных ранее товаров) и добавлять туда текущий id, естественно, при условии, что его там еще нет. Затем снова устанавливаем ее пользователю при помощи функции:
    setcookie("{site}_products_views", json_encode($ids), time() + (10 * 365 * 24 * 60 * 60))
    где $ids - массив id товаров. При помощи последнего параметра мы устанавливаем почти бесконечное время жизни (10 лет) для куки.

В результате получается, что на стороне клиента будет храниться кука, содержащая id товаров, которые когда-либо были просмотрены пользователем. Запрос в базу для увеличения количества просмотров:

(UPDATE products SET views = views + 1 WHERE id = ?)

Это мы будем делать лишь тогда, когда id текущего товара еще нет в теле куки пользователя.

Основной недостаток такого способа хранения информации о просмотрах - вероятность удаления кук из браузера или их отключение. Но такое происходит не настолько часто, так что информация о количестве уникальных просмотров все равно будет более-менее объективной.

Второй вариант хранения уникальных просмотров подразумевает использование базы данных. В данном случае уникальность пользователя обычно определяют по его IP, что также не является гарантией достоверности. Однако, часто этого вполне достаточно. Для начала мы создадим новую таблицу в базе под названием "products_views" со следующими полями:

  • "product_id" - int,
  • "user_ip" - varchar.

При каждом открытии страницы с товаром мы будем проверять, есть ли в данной таблице запись с id данного товара и IP текущего пользователя. Если есть - мы ничего не делаем. Если нет - добавляем такую запись и выполняем запрос:

UPDATE products SET views = views + 1 WHERE id = ?

Помимо возможной изменчивости IP-адреса пользователя (у некоторых он динамический), основной проблемой здесь будет возросшее количество запросов к базе и необходимость создавать новую таблицу для хранения данных.

Теперь усложним ситуацию еще больше. Допустим, нам нужно считать количество просмотров каждого товара не за все время, а лишь за какой-то определенный промежуток, к примеру, за последние сутки. В этом случае явно не хватит лишь одной колонки "views" в таблице"products", ведь необходимо учитывать еще и дату просмотров, дабы отфильтровать те из них, которые выполнились более суток назад.

Получается, надо в любом случае заводить таблицу "products_views", куда помимо описанных выше полей, добавлять еще одно: "created_at" - datetime (дата просмотра). Кроме того, нужно создать cron-скрипт, который бы выполнялся раз в 10-20 минут и пересчитывал актуальное количество просмотров для каждого из товаров.

Примерный алгоритм действий в таком скрипте:

  1. Удаляем все записи из таблицы "products_views", у которых дата в поле "created_at" меньше, чем текущая дата минус одни сутки (для того, чтобы не хранить ненужные данные и не обрабатывать их впоследствии).
  2. Получаем все товары из базы, проходимся по ним в цикле и для каждого узнаем кол-во записей из таблицы "products_views".

Полученное значение заносим в таблицу "products" в поле "views". Сохраняем товары.

Также существует более простой вариант подсчета количества просмотров товаров - не за последние сутки, а за текущий день (начиная, к примеру, с полуночи). Здесь также можно использовать таблицу "products_views" с полем "created_at" и скрипт, выполняющийся по крону.

Однако, алгоритм работы скрипта будет значительно более простым. Запускаться он будет раз в сутки, в полночь. Основные и единственные действия, выполняемые им - обнуление поля "views" у всех товаров (установка значения в 0) и удаление всех записей из таблицы "products_views". Соответственно, если это происходит, то начиная с 0 часов 0 минут каждого дня количество просмотров для всех товаров будет набираться заново.

Ардуино+