@Dreaded

Почему первый id записывается в куку сколько угодно раз?

Суть задачи записывать в куку просмотренные лоты на сайте, но только в том случае, если кука еще не содержит в себе id лота. То есть все id в куке должны быть уникальными.
У меня, почему-то уникальность соблюдается только для второго и последующих записей в куку. То есть если я с чистыми куками захожу на страничку с id=1, и нажимаю f5, то все обновления записываются в куку. Т.е. кука будет в себе содержать 1,1,1,1,1 и т.д. Но начиная со второго элемента условие уникальности уже соблюдается. Т.е. если после того как кука уже содержит 1,1,1,1,1 зайти на страничку c другим id , то он уже запишется в куку только один раз.
if(isset($_COOKIE['lot_history'])) {
        $lot_history = json_decode($_COOKIE['lot_history']);
        if (!(array_search($_GET['id']-1, $lot_history))){
            $lot_history[] = $_GET['id']-1;
            $lot_history = json_encode($lot_history);
            setcookie("lot_history", $lot_history, strtotime("+1 day"), "/");
        }
    }
    else {
        $lot_history = json_encode(array($_GET['id']-1));
        setcookie("lot_history", $lot_history, strtotime("+1 day"), "/");
    }
  • Вопрос задан
  • 88 просмотров
Решения вопроса 2
qonand
@qonand
Software Engineer
array_search может вернуть как false так и 0 (в качестве индекса элемента). В Вашей ситуации как раз 0 и возвращается, который в нестрогой проверке интерпретируется как false.
Просто сделайте строгую проверку ...
if (array_search($_GET['id']-1, $lot_history) === false){
 ...
}


P.S. и от такого ужаса как $_GET['id']-1 по всему коду нужно избавляться..
Ответ написан
@Arik
Согласен с Максимом, но еще добавлю что куки имеют ограничения и после скорее всего nginx будет кидать 500 ошибку т.к. не может прочитать заголовки.

Как-то проще нужно
<?php
$maxHistory = 20;
$addId = $_GET['id'] - 1;

$lot_history = isset($_COOKIE['lot_history']) ? (array)json_decode($_COOKIE['lot_history']) : [];
$lot_history[] = $addId;
$lot_history = array_slice(array_unique($lot_history), -$maxHistory);

setcookie("lot_history", $lot_history, strtotime("+1 day"), "/");
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Dreaded Автор вопроса
Спасибо, за ответы. Что бы не создавать новый вопрос, задам еще один тут, напрямую касающийся темы:
Если пользователь вводит в get запросе id несуществующего лота, то как лучше поступить : изначально не писать его в куку, или потом на странице отображения лотов просто не выводить не существующие?
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽
25 апр. 2024, в 19:22
18000 руб./за проект
25 апр. 2024, в 19:21
10000 руб./за проект
25 апр. 2024, в 18:47
2795100 руб./за проект