2016-08-12 2 views
0

현재 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에서는 작동하지 않습니다. 왜?

조언, 팁 또는 생각은 크게 감사하겠습니다.

감사합니다.

+1

왜 세션 변수 인코딩을위한 자체 형식을 고안하고 있습니까? 'serialize' 또는'json_encode'를 사용하십시오. – Barmar

+3

왜 그렇게 열심히하고 계십니까? – icecub

+0

'addToSession'은'$ CategoryID'가 이미 sesion 변수에 있는지 검사하지 않습니다. "do nothing -> 이미 세션에서"라는 주석이있는'if()'는'$ CategoryID'를 체크하지 않습니다. 그것은'if ($ temp [0] == $ CategoryID)'이어야합니다. – Barmar

답변

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']++; 
    } 
} 
+0

정확하게 나는 멘토. +1 – icecub

+0

이것은 내가하려고했던 것보다 훨씬 깔끔하고/더 좋습니다. 고마워, 바머. 연관 배열을 포함하도록 코드를 다시 만들고 있지만 유용한 가이드가 될 것입니다. –

+0

후속 조치 : 내 코드를 다시 작성하고 내가 원하는 작업을 얻을 수있었습니다. 고마워, 바머. –

관련 문제