@lev89

Как запретить повторный лайк?

у меня не получается в js установить условие - если пользователь проголосовал, то вывести сообщение "Вы уже голосовали". На сервере все работает хорошо, но = только с перезагрузкой страницы. Я так понимаю, в коде PHP надо сообщение об ошибке установить в переменную и эту переменную передать через json_encode в js. Как это сделать?

PHP-код обрабатывает клик по ссылке
$comment_id = !empty($_GET['id']) ? (int)$_GET['id'] : null;

        if ($comment_id) {
            // проверяем, не голосовал пользователь ранее
            $sql = \R::getAll("SELECT count(*) FROM post_comment_votes WHERE user_id = {$_SESSION['user']['id']} AND post_comment_id = {$comment_id}");
            if ($sql[0] > 0) {
                $_SESSION['error'] = 'Вы уже голосовали';
            }
            // записываем ID пользователя и комментария
            \R::exec("INSERT INTO post_comment_votes (user_id, post_comment_id) VALUES ({$_SESSION['user']['id']}, {$comment_id})");
        }

HTML-код (ссылка в виде кнопки "лайк")
<a data-id="<?=$id;?>" class="counter pull-right"><i class="fa fa-thumbs-up"></i>
            <span><?php if ($comment['vote'] == 0) echo ''; ?><?=$comment['vote'];?></span>
        </a>

JS-код (отправляет аякс запрос на сервер)
$('.like-counter').on('click', '.counter', function (e) {
    e.preventDefault();

    var id = $(this).data('id');
    var a = this;
    $.ajax({
        url: location.href,
        data: {id: id},
        type: 'GET',
        success: function () {
            var count = parseInt($(a).find('span').text()) || 0;
            $(a).find('span').text(count + 1);
            //console.log(count);
        },
        error: function () {
            alert('Error, try again.');
        }
    });
});
  • Вопрос задан
  • 146 просмотров
Пригласить эксперта
Ответы на вопрос 1
samodum
@samodum
Какой вопрос - такой и ответ
Какая-то каша, а не код.
Это же элементарная задача для бэкенда.
Клиент через Ajax отправляет команду на голосование с параметром ID коммента. POST-запрос типа /vote {id:234, type:"up"}, ID юзера вычисляем на стороне сервера по сессии из хедера запроса или через JWT.
Сервер смотрит, голосовал юзер или нет.
И соответственно отправляет клиенту ответ - ок, или ошибку: уже голосовал.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы