현재 PHP 세션 (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;
}
그때 수행을 A A 동적 시작 값과, - 루프 -로부터 검색 시작 값 이전 코드. 에 대한 루프 내에서 각주기의 끝에서, 나는 다음과 같은 코드를 하나 시작 값을 증가 :
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;
}
}
}
내 getter 및 setter 작동 - 그들이 얻을, 그들이 설정 그들의 일을하고 있어요. 다음 문자열로 : 6; 0; Y; & 14; 0; Y; & 33; 0; Y; &64; 0; Y; & $ temp [0]을 통해 범주 6, 14, 33 및 64의 시작 값을 얻을 수 있습니다. 그러므로 내 이중 폭발 + 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이 존재하지 않는 경우, 다음을 작성하고 블록에 추가 할 수 있습니다. 그런 다음, 이후의 모든 함수 호출에서 블록에 이미 1보다 큰 시작 포인터 값이 있는지 확인하십시오. 그렇다면 이미 추가되었으므로 다른 항목을 추가 할 필요가 없습니다. 그렇지 않으면 새로운 항목을 새로 추가하십시오.
문자열에 고유 한 값이 있으므로 첫 번째로드시 코드가 작동합니다. 그러나, 내 AJAX 호출 후 문자열을 150 자 (일반적으로 30ish 등) 및 중복 값이 있습니다.
TL; 내 PHP 세션 변수에 중복 값이 생기고, if 문을 통해 중복 항목을 막으려 고하는 이유를 이해하지 못합니다. 처음로드에서는 작동하지만 AJAX에서는 작동하지 않습니다. 왜?
조언, 팁 또는 생각은 크게 감사하겠습니다.
감사합니다.
왜 세션 변수 인코딩을위한 자체 형식을 고안하고 있습니까? 'serialize' 또는'json_encode'를 사용하십시오. – Barmar
왜 그렇게 열심히하고 계십니까? – icecub
'addToSession'은'$ CategoryID'가 이미 sesion 변수에 있는지 검사하지 않습니다. "do nothing -> 이미 세션에서"라는 주석이있는'if()'는'$ CategoryID'를 체크하지 않습니다. 그것은'if ($ temp [0] == $ CategoryID)'이어야합니다. – Barmar