@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 несуществующего лота, то как лучше поступить : изначально не писать его в куку, или потом на странице отображения лотов просто не выводить не существующие?
Ответ написан
Ваш ответ на вопрос

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

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