В настоящее время я работаю над проектом, в котором храню данные в PHP Sessions (PS). По разным причинам я хочу использовать только один PS для этой конкретной проблемы, что, конечно же, означает, что мой PS будет большой длинной строкой. Чтобы решить эту проблему, у меня есть шаблон; каждый «блок» хранится в следующем формате: $ CategoryID; $ StartingPoint; $ Available; &.Как остановить предотвращение дублирования записей на моем сеансе PHP?
Чтобы получить доступ к начальной точке конкретного «блок», я использую следующий код:
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;
}
Я тогда проводить для цикла, с динамическим начальным значением - начальное значение, извлеченным из предыдущий код. В конце каждого цикла внутри для цикла, я увеличиваю начальное значение по одному с помощью следующего кода:
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; & Я могу получить начальные значения категорий 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, и я не понимаю, почему, поскольку я пытаюсь предотвратить дублирование записей через мой if-statement. Он работает при первой загрузке, но не после этого с AJAX. Зачем?
Любые советы, советы или мысли будут очень полезны.
Спасибо.
Почему вы разрабатываете свой собственный формат для кодирования переменной сеанса? Используйте 'serialize' или' json_encode'. – Barmar
Почему ты так сильно на себя нападаешь? Вы можете просто хранить массивы в сеансе :) – icecub
'addToSession' никогда не проверяет, находится ли' $ CategoryID' уже в переменной sesion. 'If ()', который имеет комментарий, ничего не делает -> уже в сеансе "не проверяет' $ CategoryID'. Это должно быть 'if ($ temp [0] == $ CategoryID)'. – Barmar