Счетчик просмотров постов php+mysql

_ne_scaju_

Привет ребята, у меня возникло желание сделать счетчик просмотров постов.
Т.е. вывожу посты на главной странице, когда пользователь тыкнул на конкретный пост, типа прочитать полностью, в базе сделал update плюсанул пост просмотрели 1 раз, и так далее плюсую просмотры когда статью читают полностью.
Объясните логику какие поля в таблицу постов добавлять или доп. таблицу для постов создавать, думаю тут js не нужен.
Жду ваших советов, спасибо.

 

twim32

Посты — в одной таблице, счетчик просмотров — в другой. И прежде чем выдать view в конторллере, тут 2 дороги:
1. Увеличить счётчик просмотров поста
2. Добавить новую запись. Можно указывать доп. инфу : пользователя, который просмотрел тему, время, и т.д. Потом просто выводить кол-во записей просмотров к определённому посту.

 

_ne_scaju_

Хорошо, мне нужно создать таблицу, какие обычно поля для такой реализации делают?
Кто просмотрел и когда просмотрел мне не нужно пока что, сейчас мне чисто считать кол просмотров, дальше по надобности расширять буду.

 

twim32

Тут сразу нужно выбрать, так как структура у них разная.

Я подумал про первый вариант, проще сделать новую колонку в таблице posts:
id, title, content, viewed (int)
И при отображении поста увеличивать viewed на 1 ед.

У второго варианта, создать отдельную таблицу
id, post_id (bigint, unsigned), user_id (bigint, unsigned), viewed_at(datetime)
И при отображении поста добавлять новую запись с данными.

 

Dimon2x

Многое зависит от того, для чего это.

Если надо просто счётчик сделать, то можно и дополнительное поле добавить, а если надо делать какие-нибудь действия, например, вывести список юзеров, кто смотрел эту статью и по скольку раз или кто последний смотрел эту статью и.т.п., то тут уже надо будет создавать новую таблицу.
— Добавлено —

Это надо всё сразу продумывать, что бы в легаси не превратить.

 

_ne_scaju_

Мне по мимо счётчика просмотров нужно будет ещё кол лайков, и это наверное вторая таблица нужна будет)
— Добавлено —

Вроде как первый вариант подходит. Но возможно если добавить комментарий кто лайков ещё больше разширю таблицу постов и это не круто.

 

miketomlin

«Читают полностью» – это в смысле открывают страницу поста? Иначе без JS – маразм. Кстати, такие счетчики часто устанавливают на JS (AJAX), чтобы считать в основном живчиков. Выводят тоже частенько на JS (AJAX), как и лайки. Это данные «второго эшелона». Можно написать с нуля или переписать имеющийся серверный обработчик от плагина Pageviews.
— Добавлено —
Но в принципе можно вообще без JS.

 

_ne_scaju_

да открывают страницу поста.
на плагин гляну, js тоже использовать буду

 

_ne_scaju_

Так я вас понял, советы конечно нормальные) буду смотреть искать примеры логику, читать как правильно это делается, найду напишу сюда выложу сделанный пример.

 

_ne_scaju_

PHP:
  1. # у контроллера получили id поста
  2. $postID = 12; # юзер клацнул на кнопку прочитать полностью у поста 12, получили это id
  3.  
  4. # …
  5.  
  6. # передали в модель, и уже работаем с этим id
  7. public function postCountView($postID)
  8. {
  9.    # получаем id таблицы visits по полю пост_ид
  10.    $id =  $this -> db -> sel(‘SELECT `id` FROM `visits` WHERE `post_id` = ?’, [$postID], false); # fetch()
  11.  
  12.     # проверяем если пуста $id добавляем запись иначе обновляем запись
  13.    if (empty($id))
  14.         $this -> db -> ins(‘INSERT INTO `visits` (`post_id`, `counter`, `viewdate`) VALUES (?, 1, NOW())’, [$id[‘id’]]);
  15.     else
  16.         $this -> db -> upd(‘UPDATE `visits` SET `counter` = `counter`+1 WHERE `id` = ?’, [$id[‘id’]]);
  17. }

если решение сводится к такому минимуму, то это просто, может что подскажете чего не хватает?

 

_ne_scaju_

поправка в запросе insert вместо $id[‘id’] нужно поставить $postID

 

_ne_scaju_

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

 

Drunkenmunky

Какого пользователя? Авторизованного или нет.
Если нет, то вам роботы накрутят ваш счетчик за пару дней. Если страница будет изменяться.
Если да, то опять же нужно принимать во внимание что считать просмотром — если, например, это какие-то комментарии к новости, это одно, если сама новость — другое.
Единого решения здесь нет.

 

miketomlin

Выкинуть этот код и сделать просто SET `hits`=`hits`+1 на таблице постов?
— Добавлено —
P.S. Проверку наличия поста оставляем. Я просто использую движки, где такие проверки выполняются автоматом.
— Добавлено —
P.P.S. Это на случай отдельного HTTP-запроса для инкремента счетчика. При отображении поста, естественно, вы и так проверяете его наличие.
— Добавлено —

Вы кол-во «пользователей в сутки» считаете? Или тупо кол-во просмотров? Я за тупость в этом вопросе :)

 

miketomlin

P.S. Если закешируете страницу в браузере грубо говоря на пять мин. и будете инкрементировать счетчик без JS, можете существенно снизить «эффект накликивания» отдельно взятым пользователем.
— Добавлено —
Только тут надо комменты на AJAX вешать, чтобы они не «морозились».

 

_ne_scaju_

общее количество считаю да и все. Когда пишешь выкинуть код, хоть бы показал что, ибо мне кажется что и так сойдет.

на многих сайтах просматриваю посты где есть подсчет, они гостя не ограничивают, пусть себе обновляет страницу да хоть 1000 раз если ему делать не чего. А вот по поводу Ajax можно почитать, есть страница где описано, об этом?
— Добавлено —
Как вывести кол просмотров на главной странице,
если я вывожу циклом информацию о постах (нескольких) из одной таблицы
а из второй таблицы пытаюсь вытащить информацию о кол просмотров.
Если это объединенный запрос, то что лучше использовать join и какой?

 

Drunkenmunky

Я приблизительно о том же. В этом случае не вижу смысла вообще что-то считать.

 

_ne_scaju_

а как же тогда количество натыканных просмотров? :D

 

_ne_scaju_

Такой вопрос, есть 2 таблицы:
Posts (id, title, desc)
Visits(id, post_id, col_view)

Я хочу вытащить данные и вывести их на страницу, для того чтобы вытащить данные постов делаю запрос:

PHP:
  1. $this -> db -> sel(‘SELECT * FROM `posts` ORDER BY `id` DESC LIMIT ‘ . 10, 1, true); # fetchAll()

Чтобы вывести на странице делаю цикл:

PHP:
  1. <?php foreach($postList AS $value):?>
  2.   <div class=»wp-block property list»>
  3.     <div class=»wp-block-body»>
  4.       <div class=»img-thumbnail wp-block-img»>
  5.         <a href=»#»><img src=»/<?=POST_FILES_IMG.$value[‘image’];?>» alt=»»></a>
  6.       </div>
  7.       <div class=»wp-block-content»>
  8.         <h4 class=»content-title»><?=$value[‘title’];?></h4>
  9.         <p class=»description»><?=$value[‘content’];?></p>
  10.         <p class=»col»>количество просмотров </p>
  11.       </div>
  12. <?php endforeach; ?>

а теперь вместо надписи «количество просмотров» хочу число просмотров поставить, как это сделать пока не понял, попробовал сделать объединенный запрос:

PHP:
  1. $this -> db -> sel(
  2.            SELECT `t2`.`col_view`
  3.            FROM `posts` `t1`
  4.            INNER JOIN `visits` `t2`
  5.            ON `t2`.`post_id` = `t1`.`id`’, [], false); # fetchAll()

и вывести но не чего не получилось, для одного поста выводит список просмотров всех постов типа {54, 33, 20 1}, и так для каждого поста, подскажите как правильно сделать, спасибо.

 

Drunkenmunky

Это не так работает.
Начните новый топик, конкретней опишите проблему.
Отделите php от sql и тд.

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *