我正在构建一个需要包含用户身份验证的数据库驱动的网站。如果我使用基于标准文件的会话管理,则所有操作都按预期工作,但如果我尝试使用自定义会话处理程序(以便将会话保存在数据库中),那么似乎唯一存储的内容是ID和时间戳。
保存在$_SESSION
变量中的任何内容都会被破坏(尽管有趣的是,只有在成功登录后我使用header(Location: ...)
重定向到另一个页面时才会出现这种情况。
这是我的会话处理程序类文件:
// include class files
require_once('database.php');
require_once('database-functions.php');
// set up session handler class
class Session {
private $session_login = null;
private $session_db = null;
public function __construct() {
// connect to database
$this -> session_login = new Database;
$this -> session_db = new SimplifiedDB;
$session_db_info = $this -> session_login -> getLogin();
$this -> session_db -> dbConnect(
$session_db_info['host'],
$session_db_info['user'],
$session_db_info['pass'],
$session_db_info['database']);
}
// open
public function open($save_path, $session_name) {
return true;
}
// close
public function close() {
return true;
}
// read
public function read($id) {
$get_data = $this -> session_db -> dbGetVariable('session', 'data', array('id' => $id));
if(empty($get_data)) {
return '';
} else {
return $get_data['data'];
}
}
// write
public function write($id, $data) {
$access = time();
$get_data = $this -> session_db -> dbGetVariable('session', 'id', array('id' => $id));
if(empty($get_data)) {
// no ID, insert a record
$write_query = $this -> session_db -> dbInsert('session', array(
'id' => $id,
'data' => $data,
'access' => $access));
return true;
} else {
// ID exists, update it
$write_query = $this -> session_db -> dbUpdate('session', array(
'id' => $id,
'data' => $data,
'access' => $access));
return true;
}
return false;
}
// destroy (destroys a session)
public function destroy($sessionId) {
$destroy_query = $this -> session_db -> dbDelete('session', array('id' => $sessionId));
return true;
}
// garbage collector (randomly deletes old sessions)
public function gc($lifetime) {
$the_time = time();
$sql = "DELETE FROM 'session' WHERE 'access' + $lifetime < $this_time";
$gc_query = $this -> session_db -> dbExecuteQuery($sql);
return true;
}
}
我使用SimplifiedDB类(database-functions.php
)使用PDO连接到MySQL数据库,database.php
文件是包含我的数据库凭据的另一个类。
我花了很多时间研究这个问题,因为我的生活无法弄清楚我哪里出错了。我有一个header.php
文件作为每个PHP文件的第一行,内容如下:
require_once('sessions.php');
$user_session = new Session();
session_set_save_handler(
array($user_session, 'open'),
array($user_session, 'close'),
array($user_session, 'read'),
array($user_session, 'write'),
array($user_session, 'destroy'),
array($user_session, 'gc'));
register_shutdown_function('session_write_close');
session_start();
我最初在会话处理程序类的Session构造函数中有这些东西,但我最后将它放在一个单独的类中(可能是出于绝望)。我的网站主机说会话管理方面没有服务器问题,我的localhost网络服务器上也存在这个问题,所以代码中肯定有问题。
我还应该指出,我已经做了一些其他检查,例如确保我的header.php
文件位于每个PHP文件的第一行,并且我在所有重定向后使用exit()
,如下:
$_SESSION['test'] = 'testval';
header("Location: /index.php");
exit();
(使用上面标题行中的完整网址没有任何区别,我仍然有消失的会话变量)。
感谢您花时间阅读本文,希望有人可以指出我错过的任何内容? :)