PHP自定义会话处理程序不工作?

时间:2013-09-18 08:50:42

标签: php mysql session pdo session-variables

我正在构建一个需要包含用户身份验证的数据库驱动的网站。如果我使用基于标准文件的会话管理,则所有操作都按预期工作,但如果我尝试使用自定义会话处理程序(以便将会话保存在数据库中),那么似乎唯一存储的内容是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();

(使用上面标题行中的完整网址没有任何区别,我仍然有消失的会话变量)。

感谢您花时间阅读本文,希望有人可以指出我错过的任何内容? :)

0 个答案:

没有答案