Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как проверить наличие куков? (https://javascript.ru/forum/misc/81345-kak-proverit-nalichie-kukov.html)

StartGames 12.11.2020 14:40

Как проверить наличие куков?
 
Здравствуйте. Есть код:

<script type="text/javascript">
$(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;
  syslike = getCookie('syslike');
  alert(syslike)
}

if (syslike = undefined) {
  document.cookie = "syslike=Y55YY56YY57Y; expires=" + date;
  alert(syslike)
}
});
</script>


По идее он должен создавать куки если их нету. Куки он создает, но мне нужно создавать их только в том случае, если их нет.

Пробовал условием:
if (syslike = undefined) {


Но ничего не получилось. :help:

рони 12.11.2020 15:44

Цитата:

Сообщение от StartGames
Пробовал условием:
if (syslike = undefined) {

где условие?

StartGames 12.11.2020 15:56

Цитата:

Сообщение от рони (Сообщение 530686)
где условие?

вот) просто я не сильно в этом разбираюсь))

if (syslike = undefined) {
  document.cookie = "syslike=Y55YY56YY57Y; expires=" + date;
  alert(syslike)
}

рони 12.11.2020 16:00

StartGames,
это скорее присвоение, а нужно условие, чего-то самую малость не хватает в строке 1.

StartGames 12.11.2020 16:07

if (syslike == undefined) {
  document.cookie = "syslike=Y55YY56YY57Y; expires=" + date;
  alert(syslike)
}


вот так?) если да, то пробовал - без резрезультатно...

рони 12.11.2020 16:24

StartGames,
проверять на своём сервере
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<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'))
}
});
</script>

StartGames 12.11.2020 16:58

Не знаю как, но работает))) Я же вроде так делал но эффекта не было(( Благодарю)

Пытаюсь вызвать событие клика по кнопке, и ищу в куках значение Y55Y оно там есть, но при клике не реагирует никак...

<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'))
}
});
</script>



<script type="text/javascript">
  $(document).ready(function() {
    $(document).on('click','#syslike',function(){

      if (syslike.indexOf('Y55Y') > -1){
        alert('есть')
      } else {
        alert('нет')
      }

    });
  });
</script>



<button id="syslike">but</button>

StartGames 12.11.2020 17:20

почему то не может увидеть поисковую фразу Y55Y в куках...
пробую вот так но безрезультатно...

if (syslike.indexOf('Y55Y') > -1){

рони 12.11.2020 17:22

StartGames,
где строка 4? смотреть строку 11 выше код.

StartGames 12.11.2020 17:30

вы имеете ввиду пропуски?

сделал так:
<script type="text/javascript">
  $(document).ready(function() {
    $(document).on('click','#syslike',function(){
      if (syslike.indexOf('Y55Y') > -1){
        alert('есть')
      } else {
        alert('нет')
      }
    });
  });
</script>


результата к сожалению это не дало... возможно дело в том что они в разных блоках <script type="text/javascript"> Хотя клик вызывается. Не проходит именно условие:

if (syslike.indexOf('Y55Y') > -1){
        alert('есть')
      } else {
        alert('нет')
      }

рони 12.11.2020 17:39

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>

StartGames 12.11.2020 18:47

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

В общем решил описать что это и для чего я это делаю. Решил создать интернет магазин (движок 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 {+}


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

рони 12.11.2020 18:55

StartGames,
тут я мало чем могу помочь, ждите специалистов по php.

StartGames 12.11.2020 18:58

Цитата:

Сообщение от рони (Сообщение 530711)
StartGames,
тут я мало чем могу помочь, ждите специалистов по php.

в любом случае благодарю за поддержку)
Буду ждать и надеяться))

StartGames 12.11.2020 19:27

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


Часовой пояс GMT +3, время: 14:49.