За последние 24 часа нас посетили 20635 программистов и 1112 роботов. Сейчас ищут 380 программистов ...

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

Тема в разделе "PHP для новичков", создана пользователем _ne_scaju_, 18 янв 2021.

  1. _ne_scaju_

    _ne_scaju_ Старожил

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

    twim32 Активный пользователь

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

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Хорошо, мне нужно создать таблицу, какие обычно поля для такой реализации делают?
    Кто просмотрел и когда просмотрел мне не нужно пока что, сейчас мне чисто считать кол просмотров, дальше по надобности расширять буду.
     
  4. twim32

    twim32 Активный пользователь

    С нами с:
    29 мар 2017
    Сообщения:
    275
    Симпатии:
    58
    Тут сразу нужно выбрать, так как структура у них разная.

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

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

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    184
    Многое зависит от того, для чего это.

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

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Мне по мимо счётчика просмотров нужно будет ещё кол лайков, и это наверное вторая таблица нужна будет)
    --- Добавлено ---
    Вроде как первый вариант подходит. Но возможно если добавить комментарий кто лайков ещё больше разширю таблицу постов и это не круто.
     
  7. miketomlin

    miketomlin Старожил

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

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    да открывают страницу поста.
    на плагин гляну, js тоже использовать буду
     
  9. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Так я вас понял, советы конечно нормальные) буду смотреть искать примеры логику, читать как правильно это делается, найду напишу сюда выложу сделанный пример.
     
  10. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    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. }
    если решение сводится к такому минимуму, то это просто, может что подскажете чего не хватает?
     
    #10 _ne_scaju_, 20 янв 2021
    Последнее редактирование: 20 янв 2021
  11. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    поправка в запросе insert вместо $id['id'] нужно поставить $postID
     
  12. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    стоит ли ограничивать пользователя на один просмотр страницы? ну типа если он просмотрел и обновил страницу следующий просмотр не защитался, в каких случаях это плохо будет что сколько обновил стр. столько и просмотров доплюсовал?
     
  13. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Какого пользователя? Авторизованного или нет.
    Если нет, то вам роботы накрутят ваш счетчик за пару дней. Если страница будет изменяться.
    Если да, то опять же нужно принимать во внимание что считать просмотром - если, например, это какие-то комментарии к новости, это одно, если сама новость - другое.
    Единого решения здесь нет.
     
  14. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.787
    Симпатии:
    646
    Выкинуть этот код и сделать просто SET `hits`=`hits`+1 на таблице постов?
    --- Добавлено ---
    P.S. Проверку наличия поста оставляем. Я просто использую движки, где такие проверки выполняются автоматом.
    --- Добавлено ---
    P.P.S. Это на случай отдельного HTTP-запроса для инкремента счетчика. При отображении поста, естественно, вы и так проверяете его наличие.
    --- Добавлено ---
    Вы кол-во «пользователей в сутки» считаете? Или тупо кол-во просмотров? Я за тупость в этом вопросе :)
     
  15. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.787
    Симпатии:
    646
    P.S. Если закешируете страницу в браузере грубо говоря на пять мин. и будете инкрементировать счетчик без JS, можете существенно снизить «эффект накликивания» отдельно взятым пользователем.
    --- Добавлено ---
    Только тут надо комменты на AJAX вешать, чтобы они не «морозились».
     
  16. _ne_scaju_

    _ne_scaju_ Старожил

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

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Я приблизительно о том же. В этом случае не вижу смысла вообще что-то считать.
     
  18. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    а как же тогда количество натыканных просмотров? :D
     
  19. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Такой вопрос, есть 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}, и так для каждого поста, подскажите как правильно сделать, спасибо.
     
  20. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Это не так работает.
    Начните новый топик, конкретней опишите проблему.
    Отделите php от sql и тд.
     
  21. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    зачем создавать новый топик, я и так создал его, сейчас идет конкретно работа с счетчиком, я написал последним сообщением что у меня да как не получается, а теперь жду ваших отзывов.
     
  22. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.787
    Симпатии:
    646
    Нафига две таблицы для простого счетчика? Чтобы было? :)
    --- Добавлено ---
    Я тебе написал, «выкинь [весь] этот код и сделать просто SET `hits`=`hits`+1 на таблице постов». Код кривой даже для двух таблиц. Почитай про INSERT... ON DUPLICATE KEY UPDATE... Но в данной случае это лишнее. Просто добавь в таблицу постов поле с нулевым дефолтным значением и делай его инкремент.
     
  23. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.787
    Симпатии:
    646
    Не применительно к данному топику, а вообще: когда у тебя одно или нет соответствия в присоединяемой таблице, используй LEFT (OUTER) JOIN, а не INNER/CROSS ;)

    Когда нет соответствия, в поле будет NULL (можно прямо в запросе менять NULL на ноль).
     
  24. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    ок, сделаю так, сейчас переделаю, спасибо)))
     
  25. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    вот что получилось, код стал еще меньше, добавив в таблицу постов поле col_view - количество просмотров
    PHP:
    1. /**
    2.      * Метод "получает общее количество просмотров (поста)"
    3.      * В качестве аргумента принимает id поста"
    4.      */
    5.     public function visitAllCount($postID)
    6.     {
    7.         return $this -> db -> column('SELECT sum(`col_view`) FROM `posts` WHERE `id` = ?', [$postID]); # fetchcolumn()
    8.     }
    9.  
    10.     /**
    11.      * Метод "для обновления количества просмотров поста"
    12.      * @param - $postID - id поста который просмотрели
    13.      */
    14.     public function visitViewCount($postID)
    15.     {
    16.         $this -> db -> upd('UPDATE `posts` SET `col_view` = `col_view` + 1 WHERE `id` = ?', [$postID]);
    17.     }