Кнопка нравится с использованием cookie

90
13 ноября 2019, 00:10

Есть код кнопки нравится. На данный момент один пользователь может нажимать на кнопку любое количество раз. Хотелось бы привязать как-то это все к cookie, чтобы пользователь мог нажать на кнопку нравится один раз. Также необходимо учесть, что на одной странице должно быть несколько статей с кнопкой нравится.

ФАЙЛ like.php

<?php
    /** Данные для подключения к Базе Данных */
    $host = 'localhost';
    $database = 'test';
    $user = 'root';
    $password = '';
    /** Подключаемся в Базе Данных */
    $pdo = new PDO('mysql:host='. $host .';dbname='.$database.';charset=utf8', $user, $password);
    $pdo->exec("SET NAMES utf8");
    /** Получаем наш ID статьи из запроса */
    $id = intval($_POST['id']);
    $count = 0;
    $message = '';
    $error = true;
    /** Если нам передали ID то обновляем */
    if($id){
        /** Обновляем количество лайков в статье */
        $query = $pdo->prepare("UPDATE article SET count_like = count_like+1  WHERE id = :id");
        $query->execute(array(':id'=>$id));
        /** Выбираем количество лайков в статье */
        $query = $pdo->prepare("SELECT count_like FROM article WHERE id = :id");
        $query->execute(array(':id'=>$id));
        $result = $query->fetch(PDO::FETCH_ASSOC);
        $count = isset($result['count_like']) ? $result['count_like']  : 0;
        $error = false;
    }else{
        /** Если ID пуст - возвращаем ошибку */
        $error = true;
        $message = 'Статья не найдена';
    }

    /** Возвращаем ответ скрипту */
    // Формируем масив данных для отправки
    $out = array(
        'error' => $error,
        'message' => $message,
        'count' => $count,
    );
    // Устанавливаем заголовот ответа в формате json
    header('Content-Type: text/json; charset=utf-8');
    // Кодируем данные в формат json и отправляем
    echo json_encode($out);
    ?>

ФАЙЛ script.js

$(document).ready(function() {
    $(".like").bind("click", function() {
        var link = $(this);
        var id = link.data('id');
        $.ajax({
            url: "/like.php", 
            type: "POST",
            data: {id:id}, // Передаем ID нашей статьи
            dataType: "json", 
            success: function(result) {
                if (!result.error){ //если на сервере не произойло ошибки то обновляем количество лайков на странице
                    link.addClass('active'); // помечаем лайк как "понравившийся"
                    $('.counter',link).html(result.count);
                }else{
                    alert(result.message);
                }
            }
        });
    });
});
Answer 1

$(document).ready(function() { 
  $(".like").bind("click", function() { 
    var link = $(this); 
    var id = link.data('id'); 
    if ($.cookie('like') != 'true') { 
      $.ajax({ 
        url: "/like.php", 
        type: "POST", 
        data: { 
          id: id 
        }, // Передаем ID нашей статьи 
        dataType: "json", 
        success: function(result) { 
          if (!result.error) { //если на сервере не произойло ошибки то обновляем количество лайков на странице 
            $.cookie('like', 'true'); 
            link.addClass('active'); // помечаем лайк как "понравившийся" 
            $('.counter', link).html(result.count); 
          } else { 
            alert(result.message); 
          } 
        } 
      }); 
    } else { 
      alert("Вы уже ставили лайк"); 
    } 
  }); 
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> 
<button class="like">like</button>

Answer 2

jquery cookie

внутри $(".like").bind("click", function() проверяйте есть ли кука, если нет, реагировать если есть то ничего не делать.

Но куки удаляются периодически, если хотите для пользователя хранить постоянно статус "лайкнуто", то лучше это как-то в БД хранить

READ ALSO
Оптимизировать цикл парсинга

Оптимизировать цикл парсинга

Есть некоторый цикл (представлен частично от основного кода, но суть передает):

103
Не сохраняет предыдущий submit

Не сохраняет предыдущий submit

когда я нажимаю на submit появляется форма, но когда я нажимаю на следующий, то прошлый забывается

99
Qt и staticMetaObject

Qt и staticMetaObject

При работе с qt с компилятором mingw столкнулся с такой проблемой: не мог создать коннекты с сигналами которые были определены в моей кастомной...

125