Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 12.11.2020, 17:39
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,105

StartGames,

<script>
$(function() {
        function getCookie(syslike) {
            let matches = document.cookie.match(new RegExp(
                "(?:^|; )" + syslike.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)"
            ));
            return matches ? decodeURIComponent(matches[1]) : undefined;
        }

        $(document).on('click', '#syslike', function() {
            var syslike = getCookie('syslike');
            if (syslike.indexOf('Y55Y') > -1) {
                alert('есть')
            } else {
                alert('нет')
            }

        });
    });
</script>
Ответить с цитированием
  #12 (permalink)  
Старый 12.11.2020, 18:47
Кандидат Javascript-наук
Отправить личное сообщение для StartGames Посмотреть профиль Найти все сообщения от StartGames
 
Регистрация: 13.06.2014
Сообщений: 143

рони, спасибо тебе добрый человек))

В общем решил описать что это и для чего я это делаю. Решил создать интернет магазин (движок opencart 2.3.0.2). И мне нужна система лайков на сайте. Чтобы при клике на добавить в избранное (переделал под сердечко) https://prnt.sc/vi2s9e добавлялся + 1 лайк. Но если пользователь повторно кликает - лайк отнимается. Вот для этого мне нужен был скрипт с куками. Это хотя бы базовая защита от накруток. Я понимаю что куки можно удалить, но мне большего пока и не надо. Пробовал делать через БД - не увенчалось успехом. Потом нашел вот такой вот скриптик: https://myrusakov.ru/php-likes.html

Я понимаю что довольно костыльно делать все это через сохранение лайков в файлик а не БД, но пока варианта другого не встречал, а на первое время и этого достаточно.

Вот что у меня получилось на данный момент:
<?php
  $tovar_id = $product_id; // ID товара
  $data = parse_ini_file("likes.ini"); // Парсим INI-файл
  $likes = $data[$tovar_id]; // Получаем количество лайков у статьи
?>

<script>
$(document).ready(function() {
let date = new Date(Date.now() + 86400e3);
date = date.toUTCString();
function getCookie(syslike) {
  let matches = document.cookie.match(new RegExp(
    "(?:^|; )" + syslike.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)"
  ));
  return matches ? decodeURIComponent(matches[1]) : undefined;
}
var syslike = getCookie('syslike');
alert(syslike);
if (!syslike) {
  document.cookie = "syslike=Y55YY56YY57Y; expires=" + date;
  alert(getCookie('syslike'))
}
});

$(function() {
        function getCookie(syslike) {
            let matches = document.cookie.match(new RegExp(
                "(?:^|; )" + syslike.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)"
            ));
            return matches ? decodeURIComponent(matches[1]) : undefined;
        }

        $(document).on('click', '#syslike', function() {
            var syslike = getCookie('syslike');
            if (syslike.indexOf('Y<?php echo $product_id; ?>Y') > -1) {
                  $.ajax({
                    url: "like.php",
                    type: "POST",
                    data: ("id=" + $("#like").attr("data-id")),
                    dataType: "text",
                    success: function(result) {
                      if (result) {
                          $("#like").text(Number($("#like").text()) - 1);
                          syslike = syslike.replace('Y<?php echo $product_id; ?>Y', '');
                          let date = new Date(Date.now() + 86400e3);
                          date = date.toUTCString();
                          document.cookie = "syslike=" + syslike + "; expires=" + date;
                      }
                    }
                  });
                alert('есть')
            } else {
                  $.ajax({
                    url: "like.php",
                    type: "POST",
                    data: ("id=" + $("#like").attr("data-id")),
                    dataType: "text",
                    success: function(result) {
                      if (result) {
                          $("#like").text(Number($("#like").text()) + 1);
                          let date = new Date(Date.now() + 86400e3);
                          date = date.toUTCString();
                          document.cookie = "syslike=" + syslike + "Y<?php echo $product_id; ?>Y; expires=" + date;
                      }
                    }
                  });
                alert('нет')
            }

        });
});
</script>


<div id="like" data-id="<?=$id?>"><?=$likes?></div>
<button id="syslike">but</button>


содержимое файлика ini:
50=0
51=0
52=0
53=0
54=0
55=90
56=2
57=31
58=0
59=0
60=0
61=0
62=0
63=0
64=0
65=0
66=0
67=0
68=0
69=0
70=0


и так до 5000)) создаю вручную для каждого товара, потому что если ида товара нет в файле, тогда ошибка. было бы отлично если бы добавлялась новая строка с идом товара <?php echo $product_id; ?>=0 если ее нет

содержимое файла php:

<?php
  $text = file_get_contents("likes.ini"); // Получаем содержимое файла
  $likes = explode("\n", $text); // Разбиваем строку на массив по разделителю в виде перехода на новую строку
  $new_likes = array(); // Массив лайков с новыми данными
  for ($i = 0; $i < count($likes); $i++) {
    $parts = explode("=", $likes[$i]); // Разбиваем строку вида "id_статьи=количество_лайков" по знаку равно
    if ($parts[0] == $_POST["id"]) $parts[1] += 1; // Увеличиваем число лайков на 1 у статьи с переданным ID
    $new_likes[] = implode("=", $parts); // Формируем новую строку вида "id_статьи=количество_лайков" и добавляем в массив
  }
  $text = implode("\n", $new_likes); // Преобразуем массив с новыми данными в строку с разделителем в виде перехода на новую строку
  echo file_put_contents("likes.ini", $text); // Записываем строку в файл и выводим false в случае неудачи
?>



На данный момент все хотя бы базово работает. Есть только две проблемы:
1) первая как и сказал выше - создаю в файлике лайков ид товара вручную, потому что если ид товара нет в файле, тогда ошибка. было бы отлично если бы добавлялась новая строка с идом товара <?php echo $product_id; ?>=0 если ее нет. я так понимаю что это делается в файле php обработки. Собственно с этим файликом выходит и вторая ошибка.
2) Дело в том, что текущее наработки не умеют отнимать лайк при повторном клике по сердечку (сейчас это кнопка but). Точнее на сайте все работает как надо, счетчик отнимает -1 при повторном нажатии https://prnt.sc/vi36jr Но после перезагрузки страницы, там опять старое значение https://prnt.sc/vi37ie Причем плюсует первый раз как надо. И больше 1 лайка не проставляет, и это то что надо. Но не отнимает при повторном нажатии. т.е. снять лайк нельзя.

Я так понимаю что проблема тут:

$.ajax({
                    url: "like.php",
                    type: "POST",
                    data: ("id=" + $("#like").attr("data-id")),


После клика из страницы передаются эти данные в файл like.php и происходит их обработка:
if ($parts[0] == $_POST["id"]) $parts[1] += 1; // Увеличиваем число лайков на 1 у статьи с переданным ID

но в нем нет условия. в нем только +1 при любом раскладе. Наверное нужно отправлять с данными и номер операции. Например:

$.ajax({
                    url: "like.php",
                    type: "POST",
                    data: ("id=" + $("#like").attr("data-id"); "operation="minus;),


И в самом обработчике php сделать проверку:
if ($_POST["operation"] == 'minus') {-} else {+}


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

Последний раз редактировалось StartGames, 12.11.2020 в 18:53.
Ответить с цитированием
  #13 (permalink)  
Старый 12.11.2020, 18:55
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,105

StartGames,
тут я мало чем могу помочь, ждите специалистов по php.
Ответить с цитированием
  #14 (permalink)  
Старый 12.11.2020, 18:58
Кандидат Javascript-наук
Отправить личное сообщение для StartGames Посмотреть профиль Найти все сообщения от StartGames
 
Регистрация: 13.06.2014
Сообщений: 143

Сообщение от рони Посмотреть сообщение
StartGames,
тут я мало чем могу помочь, ждите специалистов по php.
в любом случае благодарю за поддержку)
Буду ждать и надеяться))
Ответить с цитированием
  #15 (permalink)  
Старый 12.11.2020, 19:27
Кандидат Javascript-наук
Отправить личное сообщение для StartGames Посмотреть профиль Найти все сообщения от StartGames
 
Регистрация: 13.06.2014
Сообщений: 143

Как только я подбираюсь к решению, оно тут же ускользает(( Теперь по видимому сам хром заблокировал для сайта доступ менять содержимое файла. Все работало, содержимое менялось. Но теперь к сожалению нет((
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как проверить все имена объекта на пустоту? Artur_Hopf Общие вопросы Javascript 4 31.10.2018 07:52
Как проверить свёрнут ли div или нет? drakulawz Events/DOM/Window 4 14.10.2018 14:54
Как проверить заполненность полей в пошаговой форме? adash Элементы интерфейса 29 31.08.2018 14:15
Как проверить корректность поля e-mail? daniilino Общие вопросы Javascript 9 15.05.2012 16:50
Как проверить ссылку на работоспособнось? Oleg_777 Общие вопросы Javascript 23 19.03.2009 18:57