php 页面清除session,php – 页面重定向后在session_start()上删除会话数据

经过大量调试后,似乎问题是(令人尴尬)在我的数据库会话代码中,而不是典型的会话问题.你可以看到我的答案

here – 谢谢

我理解这可能是类似问题的重复(例如one,two,three),但尽管遵循了似乎最好的做法,我仍然遇到问题.

当使用session_set_save_handler()来使用我的数据库会话类时,会话数据在从session1.php重定向后在session2.php上开始时被清除.

我的观察概述:

>数据在session1.php中正确保存到数据库中

> session2.php中的session_start()数据丢失

>在重定向之后和session2.php中调用session_start()之前,数据仍在数据库中

>会话ID保持不变,并存储在cookie中,该cookie正在请求头中正确地发送回服务器

>使用PHP的默认会话处理它可以正常工作

并注意:

> header()之后使用exit()

输出前每个页面上的session_start()

我做过一个愚蠢的错字吗?愚蠢的错误?或者这是一个奇怪的怪癖?

提前感谢您提供的任何帮助.

这是代码(在修复此问题时提取到测试文件中):

session1.php

require_once('session.php');

session_start();

$_SESSION['KEY'] = 'VALUE PHPSESSID: ' . session_id();

session_write_close();

header('Location: session2.php');

exit;

session2.php

require_once('session.php');

session_start();

// Nothing?

var_dump( $_SESSION );

session.php文件

define( "DB_HOST", 'localhost' );

define( "DB_USER", '******' );

define( "DB_PWD", '******' );

define( "DB_NAME", '******' );

require_once('class/DatabaseSessionHandler.php');

// Use the DatabaseSessionHandler class to handle sessions

$session_handler = new DatabaseSessionHandler;

// Set up the handler above as the default session handler

session_set_save_handler(

array($session_handler, 'open'),

array($session_handler, 'close'),

array($session_handler, 'read'),

array($session_handler, 'write'),

array($session_handler, 'destroy'),

array($session_handler, 'gc')

);

DatabaseSessionHandler.php

class DatabaseSessionHandler

{

protected $connection;

protected $session_life_time;

public function __construct()

{

// Ensure that everything is closed correctly as

// per warning on http://uk3.php.net/session_set_save_handler

register_shutdown_function( 'session_write_close' );

}

public function open( $save_path, $session_name )

{

$this->connection = new mysqli( DB_HOST, DB_USER, DB_PWD, DB_NAME );

$this->session_life_time = get_cfg_var( "session.gc_maxlifetime" );

if ( $this->connection->connect_error )

return false;

return true;

}

public function close()

{

$this->connection->close();

return true;

}

public function read( $session_id )

{

$data = '';

$statement = $this->connection->prepare( "SELECT `session_data`

FROM `session`

WHERE `session_id` = ? " );

$statement->bind_param( "s", $session_id );

$statement->execute();

$statement->bind_result( $data );

return (string) $data;

}

public function write( $session_id, $session_data )

{

$expiry_time = time() + $this->session_life_time;

$statement = $this->connection->prepare( "REPLACE INTO `session`

(`session_id`, `session_data`,

`expiry_time`)

VALUES (?, ?, ?)" );

$statement->bind_param( "ssi", $session_id, $session_data, $expiry_time );

if ( !$statement->execute() )

return false;

return true;

}

public function destroy( $session_id )

{

$statement = $this->connection->prepare( "DELETE FROM `session`

WHERE `session_id` = ?" );

$statement->bind_param( "s", $session_id );

if ( !$statement->execute() )

return false;

return true;

}

public function gc( $max_lifetime )

{

$current_time = time();

$statement = $this->connection->prepare( "DELETE FROM `session`

WHERE `expiry_time` < ?" );

$statement->bind_param( "i", $current_time );

if ( !$statement->execute() )

return false;

return true;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值