2011-12-27 2 views
4

나는 성공적인 예약 (지불 후) 후에 세션 ID를 지우고 싶은 온라인 티켓 예약 시스템에서 일하고 있습니다. 그러나 문제는 내가 세션을 파괴하기 위해 session_destroy()을 사용했지만 그것을 지울 수 없다는 것입니다.session_destroy가 session_id를 설정하지 않음

NB : session_id를 반향 여부를 확인하기 위해 에코했습니다.

URL : http://7sisters.in/7sislabs/

function book_final_tickets() 
{ 

    //var_dump($_SESSION); 
    $session_id = session_id(); 


    $sql = " 
     UPDATE 
      tbl_seat_book 
     SET 
      final_book = 'Y' 
     WHERE 
      session_id = '$session_id' 
    "; 


    //session_unset(); 

    if($r = $this->db->executeQuery($sql)){ 
     if(session_destroy()){ 
      unset($session_id); 
      echo 'Booking successfull'; 
     } 
    } 
} 
+0

쿼리가 실행되고 echo 문이 인쇄됩니까? – Virendra

+0

예.하지만 티켓을 성공적으로 예약 한 후 세션을 파괴하고 싶습니다. – AssamGuy

+0

echo 문이 인쇄되면 세션이 삭제 된 상태 여야합니다. 왜 그런 일이 일어날 수 있는지 디버깅하려고합니다. – Virendra

답변

2

전화 session_start 전에 session_id 및 수동 session_id을 설정합니다.

예 1 : 동일한 SESSION_ID를

<?php 
session_start(); 

echo session_id(); //4ef975b277b52 

session_destroy(); 

session_start(); 

echo session_id(); //4ef975b277b52 
?> 

예 2를 사용한다 : 수동 (session_start() 전에 호출) session_id

<?php 
session_id(uniqid()); 
session_start(); 

echo session_id(); //4ef975d3d52f5 (A) 

session_destroy(); 


session_id(uniqid()); 
session_start(); 

echo session_id(); //4ef975d3b3399 (B) 
?> 

(A)를 설정 = (B)! 따라서 session_id를 수동으로 설정할 수 있습니다. 자세한 내용은 http://php.net/manual/en/function.session-id.php을 참조하십시오.

혼자
<?php 
$_SESSION['booked'] = false; 

if($r = $this->db->executeQuery($sql)) 
{ 
    $_SESSION['booked'] = true; 
    echo 'Booking successfull'; 
} 
?> 
+0

'session_id (uniqid()); '로 수동으로 세션 ID를 설정하는 것은 좋지 않습니다. 'uniqid()'는 타임 스탬프를 기반으로하므로 무작위가 아닙니다. 'session_id'를 PHP가 자동으로 생성하는 것을'session_regenerate_id()'로하는 것이 훨씬 낫습니다. 왜냐하면 더 나은 엔트로피 소스를 사용할 수 있기 때문입니다 (예 :'ini_set ('session.entropy_file', '/ dev/urandom'); –

+0

잘 알고 있습니다. 감사 –

0

이 시도 :

unset($session_id); 
session_destroy(); 
+0

$ session_id가 여기에서 문제라고 생각하지 않습니다 ... 너무 명확합니다. 난 쿠키 whitch session_destroy() 후에 세션 ID가 여전히 보유하고 있다고 생각; –

10

session_destroy()는 클라이언트 측 쿠키를 제거하지 않을 것이다, 그래서 다음 번에 사용자가 방문, 그들은 ':

또 다른 해결책은 SESSION_ID을(), 단지 새로운 세션 배열을 만들 사용하지 말아 여전히 동일한 세션 ID가 설정되지만 (서버 측 세션 정보는 삭제됩니다). 워드 프로세서 (강조 광산)에서

:

로 세션() 현재의 세션과 관련된 모든 데이터를 파괴합니다. 세션 과 관련된 전역 변수를 설정 해제하지 않거나 세션 쿠키를 설정 해제하지 않습니다. ... 세션을 모두 종료하려면 사용자를 로그 아웃하는 것처럼 세션 ID도 이어야합니다 (). 쿠키가 세션 ID (기본값 : 동작)를 전파하는 데 사용되는 경우 세션 쿠키를 삭제해야합니다.

session_regenerate_id(true)을 사용하면 새 세션 ID를 생성하고 이전 세션 ID를 삭제할 수 있습니다. 이렇게하면 모든 정보가 $_SESSION에 새 세션 ID의 일부로 유지되므로 세션 정보를 지우고 새로 시작하려면 session_destroy을 사용해야합니다.

<?php 
    session_start();  
    $_SESSION['blah'] = true; 

    var_dump(session_id()); // q4ufhl29bg63jbhr8nsjp665b1 
    var_dump($_SESSION); // blah = true 

    session_unset(); 
    session_destroy(); 
    setcookie("PHPSESSID", "", 1); // See note below 
    session_start(); 
    session_regenerate_id(true); 

    var_dump(session_id()); // gigtleqddo84l8cm15qe4il3q3 
    var_dump($_SESSION); // (empty) 
?> 

상기 헤더는 클라이언트 측에 변경 세션 ID 보여줄 것이다 :

요청 헤더
쿠키 : PHPSESSID = q4ufhl29bg63jbhr8nsjp665b1

응답 헤더
세트 -을 쿠키 : PHPSESSID = 삭제됨; 만료 = 2010 년 27 월 27 일 16:47:57 GMT
PHPSESSID = gigtleqddo84l8cm15qe4il3q3; 경로 =/

(쿠키가 새로운 ID로 덮어 쓸 수 있도록 당신이, 어쨌든 새로운 세션을 생성하고 있기 때문에 당신은 멀리 여기 setcookie() 호출하지 않고 얻을 수 있지만, 명시 적으로 파괴하는 것이 좋습니다입니다 오래된 쿠키). 대신

session_destroy();

0

차라리 단지

session_regenerate_id(true);

을 할 거라고하고 (로 세션 세션을 파괴 한 후 새로운 SESSION_ID에게

0

을 얻을 것이다),이 나를 위해 일했다 :

setcookie ('PHPSESSID', "", 시간() - 3600, '/');

나를위한 열쇠는 '/'경로를 설정하는 것이 었습니다. 그것이 쿠키를 정말로 파괴 할 수있는 유일한 방법이었습니다.

관련 문제