2009-08-30 7 views
6

세션을 무효화하려면 다음 코드를 사용하고 있습니다. 많은 페이지에서 logout.php에 링크되어 있습니다. 해당 로그 아웃 링크를 클릭하면 logout.php 페이지가 호출됩니다. 다음 코드는 logout.php입니다.PHP 세션 문제

unset($_SESSION['admin']); 
session_destroy(); 
header('Location: index.php'); 

세션이 무효화되면 index.php 페이지를 열고 싶습니다. 하지만 다음과 같은 오류가 발생합니다 :

Warning: session_destroy() [function.session-destroy]: Trying to destroy uninitialized session in C:\xampp\htdocs\Selection\logout.php on line 3

Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\Selection\logout.php:3) in C:\xampp\htdocs\Selection\logout.php on line 4

무엇이 잘못 되었나요?

답변

16

세션을 삭제하기 전에 session_start() 함수를 호출 할 수 없다고 생각합니다.

+0

왜 항상 downvoted, 그는 맞습니다. –

+0

감사합니다 ... 어쨌든 session_start()는 스크립트 시작 부분에서 호출되어야합니다. – mck89

8

이 페이지 호출이 세션에 속한다는 것을 PHP에 상기시키기 위해 페이지 상단에 session_start()를 호출해야합니다. - 적어도 PHP manual에 알려줍니다.

해당 매뉴얼 페이지의 노트는 $ _SESSION 변수를 사용하지 않는 이전 환경에서만 session_unset()이 사용된다는 힌트를 제공합니다.

header('Location: index.php'); 
session_start(); 
session_unset(); 
session_destroy(); 
+0

그럼'session_unset()'을 사용하지 않는 것이 좋습니다. – nickf

+0

@nickf : 정확함, 올바르게 인식하지 못했습니다 –

2

은 먼저 세션을 열어야합니다. 그런 다음 브라우저에 울리는 경고가 발생합니다. 다음 문제는 브라우저에 출력 된 후에 헤더를 보낼 수 없다는 것입니다. 따라서 다른 경고가 발생합니다.

당신은 단지 세션이 첫 번째 존재하는지 확인해야

:

if (session_name() != '') { 
    session_destroy(); 
} 
+1

이 코드를 작성하기 때문에 끝에 리디렉션을 넣어야한다고 생각합니다. 리디렉션을 수행하고 다른 기능을 실행하지 않습니다. – mck89

+0

아니요, 예상대로 작동합니다. – rodrigoap

+1

헤더가 전송 된 후에도 스크립트가 계속 실행되기 때문에 예상대로 작동합니다. 그러나 코드의 혼동을 줄이기 위해 세션이 삭제 된 후에 헤더를 배치해야합니다. – MitMaro

1

문제는 당신이 시작되지 않은 세션을 파괴 할 수 있다는 것입니다 :

0

당신은 항상()으로 session_start를 사용해야합니다; 세션 함수/변수를 사용하기 전에. 따라서 session_start();로 모든 PHP 파일을 시작하십시오. 또한 logout.php :

session_start(); 
session_destroy(); 
header('Location: index.php'); 

또한 설정을 해제 할 필요가 없습니다.

+0

PHP 문서는 $ _SESSION 배열을 수동으로'$ _SESSION = array();'로 닦아내라고 말한다. 왜 당신이 그것을 해제 할 필요가 없다고합니까? [이것은 내가 참조하고있는 문서입니다] (http://php.net/manual/en/function.session-destroy.php). – doug65536