gpt4 book ai didi

php - 页面重定向后在 session_start() 上删除的 session 数据

转载 作者:可可西里 更新时间:2023-11-01 07:08:22 25 4
gpt4 key购买 nike

经过大量调试后,问题似乎(令人尴尬地)出现在我的数据库 session 代码中,而不是典型的 session 问题。你可以看到我的相关回答here - 谢谢


我知道这可能是类似问题的重复(例如 onetwothree),但尽管遵循了这方面的最佳实践,但我仍然遇到问题。

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

我的观察概述:

  • session1.php中数据正确存入数据库
  • session2.php 中的 session_start() 数据丢失
  • 在重定向之后和在 session2.php 中调用 session_start() 之前,数据仍在数据库中
  • session ID 保持不变并存储在 cookie 中,该 cookie 在请求 header 中正确发送回服务器
  • 使用 PHP 的默认 Session 处理可以正常工作

注意:

  • exit() 在 header() 之后使用
  • session_start() 在输出前的每一页上

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

在此先感谢您提供的任何帮助。

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

session1.php

<?php

require_once('session.php');

session_start();

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

session_write_close();
header('Location: session2.php');
exit;

session2.php

<?php

require_once('session.php');

session_start();

// Nothing?
var_dump( $_SESSION );

session.php

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

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

}

最佳答案

您正在清除当前时间之前的 session 数据。它应该是当前时间 - max_lifetime

解决办法

public function gc( $max_lifetime )
{
$current_time = time() - $max_lifetime;
$statement = $this->connection->prepare( "DELETE FROM `session`
WHERE `expiry_time` < ?" );
$statement->bind_param( "i", $current_time );

if ( !$statement->execute() )
return false;

return true;
}

关于php - 页面重定向后在 session_start() 上删除的 session 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11863606/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com