如何重置会话ID?

时间:2011-12-26 12:50:37

标签: php session sessionid

我试图在他成功付款后销毁会话。

 $session_id = session_id();

    $sql = "
        UPDATE
            tbl_seat_book
        SET
            final_book = 'Y'
        WHERE
            session_id = '$session_id'
    ";
    $r = $this->db->executeQuery($sql);

        session_unset();
        session_destroy();

    echo 'Booking successfull';

但是当我预订门票时,会出现相同的session_id。如何在成功付款后销毁session_id

编辑:

$sql = "
        INSERT INTO
            tbl_seat_book
        SET
            booking_date = '$_REQUEST[bus_date]',
            booking_time = '$_REQUEST[bus_time]',
            bus_id = '$_REQUEST[bus_id]',
            route_id = '$_REQUEST[route_id]',
            session_id = '$session_id',
            session_start_time = '$time',
            temp_book = 'Y',
            final_book = 'N',
            $cond
    ";
    $booked = $this->db->insertQuery($sql);

EDIT2:

function book_final_tickets()
{

    $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 :(得分:4)

使用session_regenerate_id(true)生成新会话ID并删除旧会话ID。请注意,这会将$_SESSION中的所有信息保留为新会话ID的一部分。

e.g。 获取新的会话ID,但将会话信息保存在$_SESSION

// Regenerate session ID, user gets a new sid, and cookie is updated.
session_regenerate_id(true);

// Make sure you pick up the new session ID
$session_id = session_id();

// Note, $_SESSION will be the same here as before, but $session_id will be diff.
// Old session info has been moved to new session.


如果您不想将信息保留在$_SESSION中,那么您希望使用session_destroy()销毁服务器端的会话信息,并setcookie()手动取消设置会话客户端的ID cookie。然后,您可以像以前一样开始新会话并生成新的会话ID。

e.g。 获取新的session_id并删除所有会话信息。

session_unset();   // Remove the $_SESSION variable information.
session_destroy(); // Remove the server-side session information.

// Unset the cookie on the client-side.
setcookie("PHPSESSID", "", 1); // Force the cookie to expire.

// Start a new session
session_start();

// Generate a new session ID
session_regenerate_id(true);

// Then finally, make sure you pick up the new session ID
$session_id = session_id();

// $_SESSION will now be empty, and $session_id will have been regenerated.
// You have a completely empty, new session.

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


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

从文档(强调我的):

  

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

答案 1 :(得分:2)

你只需用session_destroy()

替换session_unset()
$session_id = session_id();

$sql = "
    UPDATE
        tbl_seat_book
    SET
        final_book = 'Y'
    WHERE
        session_id = '$session_id'
";
if($this->db->executeQuery($sql))
{
    session_destroy();
    echo 'Booking successfull';
}

答案 2 :(得分:1)

session_unset();只释放您已注册的变量,如果要销毁所有会话,请使用session_destroy();

答案 3 :(得分:1)

试试这个:

session_unset(); //destroys variables
session_destroy(); //destroys session

答案 4 :(得分:1)

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