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