Как мне остановить предотвращение повторяющихся записей в моем сеансе PHP?

В настоящее время я работаю над проектом, в котором я храню данные в PHP Sessions (PS). По разным причинам я хочу использовать только один PS для этой конкретной проблемы, что, конечно, означает, что мой PS будет большой, длинной строкой. Чтобы решить эту проблему, у меня есть шаблон; каждый "блок" хранится в следующем формате: $CategoryID;$StartingPoint;$Available;&.

Чтобы получить доступ к начальной точке определенного "блока", я использую следующий код:

function getStartPosition($CategoryID)
{
    $feedItems = explode("&", $_SESSION['feedData']);
    foreach($feedItems as $fI)
    {
        $temp = explode(";", $fI);
        /*
        $temp[0] = Category ID;
        $temp[1] = Starting Position;
        $temp[2] = Available;
        */

        if($CategoryID == $temp[0])
        {
            $startPos = $temp[1];
        }
    }
    return $startPos;
}

Затем я выполняю цикл for с динамическим начальным значением - начальным значением, полученным из предыдущего кода. В конце каждого цикла внутри цикла for я увеличиваю начальное значение на единицу с помощью следующего кода:

function setStartPosition($CategoryID)
    {
        $feedItems = explode("&", $_SESSION["feedData"]);
        foreach($feedItems as $fI)
        {
            $temp = explode(";", $fI);

            /*$temp[0] = Category ID;
            $temp[1] = Starting Position;
            $temp[2] = Available;*/

            if($temp[0] == $CategoryID)
            {
                $search = $temp[0] . ";" . $temp[1] . ";" . $temp[2] . ";&";
                $replacement = $temp[0] . ";" . ($temp[1]+1) . ";" . $temp[2] . ";&";
                $_SESSION["feedData"] = str_replace($search, $replacement, $_SESSION["feedData"]);
                return;
            }
        }
    }

Мои геттеры и сеттеры работают - они получают, они устанавливают, они делают свою работу. Со следующей строкой: 6;0;Y;&14;0;Y;&33;0;Y;&64;0;Y;& I можно получить начальные значения категорий 6, 14, 33 и 64 через $temp[0]. Поэтому я могу предположить, что мой метод двойного взрыва + foreach работает.

Моя проблема, однако, заключается в их инициализации. Если у меня есть строка 6;0;Y;&14;0;Y;&33;0;Y;&64;0;Y;&, я могу определить начальную позицию категории. Если у меня есть 6;0;Y;&6;0;Y;&, то я сталкиваюсь с проблемами, потому что, как только каждый цикл цикла завершается, строка становится 6;1;0;Y;&6;0;0;Y;&... на какой "блок" уходит мой геттер? Это моя проблема.

Я не понимаю, почему мой код не работает. Он использует один и тот же метод двойного взрыва + для каждого для получения данных и, таким образом, для идентификации каждого блока, но мое решение не предотвращает повторяющиеся записи. Поэтому, когда я повторно выполню код через вызов AJAX, у меня будет несколько повторяющихся записей. Мой код:

function addToSession($CategoryID)
    {
        if(isset($_SESSION["feedData"]))
        {
            $feedItems = explode("&", $_SESSION['feedData']);
            foreach($feedItems as $fI)
            {
                $temp = explode(";", $fI);
                /*$temp[0] = cid;
                $temp[1] = sp;
                $temp[2] = av;*/
                $temp[1] = (int)$temp[1];
                // also tried: 
                // if ($temp[1] == $CategoryID)
                // but does not work either
                if($temp[1] == 1 || $temp[1] > 1)
                {
                 // do nothing -> already in session
                }
                else
                {
                    $_SESSION["feedData"] .= $CategoryID . ";0;Y;&";
                }
                //return $temp[0];
            }
        }
        else
        {
            $_SESSION["feedData"] .= $CategoryID . ";0;Y;&";

        }
        return;
    }

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

Код "работает" при первой загрузке, потому что строка имеет уникальные значения. Однако после моего вызова AJAX строка имеет длину 150 символов (обычно 30 и т. Д.) И имеет повторяющиеся значения.

TL; DR; Я получаю повторяющиеся значения в своей переменной PHP Session, и я не понимаю, почему, поскольку я пытаюсь предотвратить повторяющиеся записи с помощью моего оператора if. Работает при первой загрузке, но не после AJAX. Зачем?

Любые советы, советы или мысли будут с благодарностью.

Благодарю.

1 ответ

Решение

Весь ваш подход кажется сумасшедшим, поскольку вы можете хранить ассоциативные массивы в переменной сеанса. Вы не можете получить дубликаты, потому что ключи массива всегда уникальны.

function addToSession($CategoryID) {
    if (!isset($_SESSION['feedData'])) {
        $_SESSION['feedData'] = array();
    }
    if (isset($_SESSION['feedData'][$CategoryID]) {
        // do nothing - already in session
    } else {
        $_SESSION['feedData'][$CategoryID] = array('startingPosition' => 0, 'available' => 'Y');
    }
}

function getStartingPosition($CategoryID) {
    if (isset($_SESSION['feedData'][$CategoryID]) {
        return $_SESSION['feedData'][$CategoryID]['startingPosition'];
    } else {
        return null;
    }
}

function setStartingPosition($CategoryID) {
    if (isset($_SESSION['feedData'][$CategoryID]) {
        $_SESSION['feedData'][$CategoryID]['startingPosition']++;
    }
}
Другие вопросы по тегам