2009-06-22 4 views
6

내 친구가 초대하는 데 사용되는 양식이 있습니다. 그것은 간단한 텍스트 필드와 제출 버튼입니다. 오류가있는 경우이 페이지로 다시 리디렉션하고 세션 변수가 설정된 경우 오류 메시지를 표시합니다.세션 변수 설정을 해제하는 중 문제가 발생했습니다.

if (isset($_SESSION['invite_error'])) { 
    echo $_SESSION['invite_error']; 
    unset($_SESSION['invite_error']); 
} 

그러나이 페이지에서 나가서 다시 방문하면 오류 메시지가 계속 표시됩니다. 내가 돌아 서서 한 번 더 돌아 오면 끝날 것입니다. 그 페이지를 새로 고침 할 때도 마찬가지입니다. 새로 고침하면 제거되지 않지만 2이면 새로 고침됩니다. 전체 세션을 파기 할 수는 없지만이 변수를 설정 해제하고 싶습니다. PHP 버전은 5.2.5 빌드 6, 전역 등록 해제,이 페이지의 맨 위에서 session_start()를 호출하고 있는데, no-cache 헤더도 사용하려고했습니다.

편집 : 전체 코드가 추가되었습니다.

<?php 
ob_start(); 
session_start(); 

$user_id = $_SESSION['user_id']; 
$user_name = $_SESSION['user_name']; 

if ($user_id==null) header("Location: /login.php"); 

if (isset($_SESSION['invite_errors'])) { 

    $error = $_SESSION['invite_errors']; 
    unset($_SESSION['invite_errors']); 

} 

require_once("ui/header.php"); 
?> 



<div id="invite" class="content"> 

    <?php if($error) { ?> 
     <div class="errors round"> 
      <?php echo $error ?> 
     </div> 
    <?php } ?> 

    <h3>Invite Your Friends</h3> 

    <div class="invite-form"> 
     <form method="post" action="controllers/invite.php"> 
      <div class="row"> 
       <textarea class="txt-area" name="emails" id="emails" rows="5"></textarea> 
       <div class="tip">Separate multiple email addresses with ,</div> 
      </div> 
      <div class="row-submit"> 
       <input type="submit" name="submit" id="submit" class="submit-btn" value="Submit" /> 
      </div> 
     </form> 
    </div> 

</div> 

<?php 
    require_once("ui/footer.php"); 
?> 
+0

unset ($ _ SESSION [ 'invite_error']; => 설정되지 않은 권한)이 없습니다. 복사 붙여 넣기 문제라고 생각합니다. – Macarse

+0

요청에 AJAX를 사용하고 있습니까? –

+0

$ _SESSION var을 설정 해제하기 전에 설정되는 다른 변수에 오류가있을 수 있습니까? – alex

답변

2

제공 한 예가 작동해야합니다. 어쩌면 어떤 종류의 세션 캐시가 당신의 방식으로 갈 것입니다. 당신은 다음과 같이 코드를 수정 시도 할 수 :

if (isset($_SESSION['invite_errors']) && $_SESSION['invite_errors']) { 

    $error = $_SESSION['invite_errors']; 
    $_SESSION['invide_errors'] = false; 
    unset($_SESSION['invite_errors']); 

    // Explicitly write and close the session for good measure 
    session_write_close(); 

} 
1

어쩌면 당신은 출력 버퍼링을 시작하기 전에 세션을 시작 오류

if (isset($_SESSION['invite_error'])) { 
    echo $_SESSION['invite_error']; 
    $_SESSION['invite_error'] = null; 
    unset($_SESSION['invite_error']); 
} 
13

을 echo'ing 후 값을 변경할 수 있습니다. 따라서 ob_start()session_start() 호출을 전환하십시오.

브라우저에 보낸 헤더에 세션 쿠키가 정의되어 있고 버퍼를 시작할 때 헤더가 브라우저로 전송되므로 전에 버퍼를 버퍼로 시작해야합니다.

+0

ob_start()를 호출 할 때 브라우저에 HTTP 헤더를 보내면 출력 버퍼링의 주요 지점을 무력화시킬 수 있습니다. 왜 그렇게 말하고있는 것입니까? 더 나아가, 비록 그렇게했다하더라도,이 맥락에서 어떤 변화도 가져 오지 않을 것이다. 왜 거짓 진술에 근거한 비 sequitur가이 많은 상향 음을 얻었습니까? –

1

제 경험상 PHP 세션은 가치가 없으며 빠르고 쉬운 솔루션으로 만 설계되었습니다. $ _SESSION 동작은 항상 명확하지는 않지만 전통적인 의미에서 세션을 사용하는 것은 대부분 피할 수 없습니다. 자신의 id와 토큰 쿠키를 발행하고 이것들에 대한 세션 값을 데이터베이스에 저장할 수 있습니다. 이것은 또한 여러 서버에 확장 가능하다는 이점이 있습니다.

관련 문제