session_destroy没有取消设置session_id

时间:2011-12-27 06:50:50

标签: php session sessionid

我正在开发一个在线机票预订系统,在预订成功后(付款后)我想清除会话ID。但问题是我无法清除它,尽管我使用session_destroy()来破坏会话。

注意:我已经回应了session_id以检查它是否重置。

网址: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';
        }
    }
}

5 个答案:

答案 0 :(得分:10)

session_destroy()不会删除客户端cookie,因此下次用户访问时,他们仍然会设置相同的会话ID(但他们的服务器端会话信息将被销毁)

从文档(强调我的):

  

session_destroy()会销毁与当前关联的所有数据   会话。它不会取消任何与之相关的全局变量   会话,或取消设置会话cookie。 ......为了杀人   完全会话,喜欢将用户注销,会话ID也必须   没有设置。如果使用cookie来传播会话ID(默认值)   行为),然后必须删除会话cookie。

您可以使用session_regenerate_id(true)生成新会话ID并删除旧会话ID。请注意,这会将$_SESSION中的所有信息保留为新会话ID的一部分,因此如果您要清除会话信息并重新开始,则仍需要使用session_destroy

e.g。

<?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

  响应标题
  设置Cookie:PHPSESSID =删除;到期=周一,27-Dec-2010 16:47:57 GMT
  PHPSESSID = gigtleqddo84l8cm15qe4il3q3;路径= /

(你可以在没有setcookie()调用的情况下离开,因为你无论如何都要创建一个新的会话,所以cookie会被新的ID覆盖,但是明确销毁这个cookie是个好习惯。旧饼干。

答案 1 :(得分:2)

session_id之前致电session_start,然后手动设置session_id

示例1:将使用相同的session_id

<?php
session_start();

echo session_id(); //4ef975b277b52

session_destroy();

session_start();

echo session_id();  //4ef975b277b52
?>

示例2:手动设置session_id(在session_start()之前调用)

<?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

另一个解决方案,不要使用session_id(),只需创建新的会话数组:

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

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

答案 2 :(得分:1)

在使用session_destroy()销毁会话后,这对我有用:

的setcookie( 'PHPSESSID' “”,时间() - 3600, '/');

对我而言,关键是将路径设置为'/'。这是真正破坏cookie的唯一方法。

答案 3 :(得分:0)

试试这个:

unset($session_id);
session_destroy();

答案 4 :(得分:0)

而不是

session_destroy();

我宁愿只做一个

session_regenerate_id(true);

您将获得一个新的session_id