0

有人可以帮我让自定义会话处理程序工作吗?

这似乎成功了一半,在某些页面上它将会话写入数据库,但在其他页面上写入没有数据的会话。此外 print_r($_SESSION) 不再显示任何会话变量。

数据库表:

id - varchar(32 - NULL No - Default None - Primary Key
access - int(10) - unsigned - NULL Yes - Default NULL
data - text - NULL Yes - Default NULL

前端控制器(定制框架)

require_once('../application/models/sessionfn.php');

session_set_save_handler('_open','_close','_read','_write','_destroy','_clean');
session_start(); 

在 sessionfn.php

function _open()
{
    $config = Configuration::getInstance();
    $host=$config->get("dbhost");
    $dbname=$config->get("db");

    $user=$config->get("dbuser");
    $pass=$config->get("dbpass");

    $dbh = new PDO("mysql:host=$host;dbname=$dbname",$user,$pass); 
}   

function _close()
{
    $dbh = null;
}

function _read($id)
{
    $config = Configuration::getInstance();
    $host=$config->get("dbhost");
    $dbname=$config->get("db");
    $user=$config->get("dbuser");
    $pass=$config->get("dbpass");

    $dbh = new PDO("mysql:host=$host;dbname=$dbname",$user,$pass);
    $sth = $dbh->prepare("SELECT data FROM sessions WHERE id = '$id'");
    $sth->execute();
}

function _write($id, $data)
{
    $config = Configuration::getInstance();
    $host=$config->get("dbhost");
    $dbname=$config->get("db");
    $user=$config->get("dbuser");
    $pass=$config->get("dbpass");

    $dbh = new PDO("mysql:host=$host;dbname=$dbname",$user,$pass);
    $access = time();
    $sth = $dbh->prepare("REPLACE INTO sessions VALUES ('$id', '$access', '$data')");
    $sth->execute();
}

function _destroy($id)
{   
    $config = Configuration::getInstance();
    $host=$config->get("dbhost");
    $dbname=$config->get("db");
    $user=$config->get("dbuser");
    $pass=$config->get("dbpass");

    $dbh = new PDO("mysql:host=$host;dbname=$dbname",$user,$pass);
    $sth = $dbh->prepare("DELETE FROM sessions WHERE id = '$id'");
    $sth->execute();
}

function _clean($max)
{
$config = Configuration::getInstance();
$host=$config->get("dbhost");
    $dbname=$config->get("db");
    $user=$config->get("dbuser");
    $pass=$config->get("dbpass");

    $dbh = new PDO("mysql:host=$host;dbname=$dbname",$user,$pass);
    $old = time() - $max;
    $sth = $dbh->prepare("DELETE FROM sessions WHERE  access < '$old'");
    $sth->execute();
}
4

1 回答 1

0

当我不亲自动手时,很难调试您的代码。:-)

但这可能会有所帮助:如何调试您自己的会话处理程序?

设置一个可以将您的输出写入文件的系统。使用您自己的会话处理程序时,不会显示任何错误。

因此,向 sessionfn.php 添加一个名为:writeToLog($someStr) 的函数,该函数写入您自己的一些自定义日志文件。为其添加时间戳。追加到现有文件。

现在您可以检查函数调用的所有返回值。

只需清空您的日志文件,然后开始您的测试。在每一步检查日志文件。

设置起来工作量不大,你可以看到你所有的问题。

于 2012-10-08T11:49:33.803 回答