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

Php 自定义会话处理程序不工作,php,session,Php,Session,有人能帮我让自定义会话处理程序工作吗 这似乎起到了一半的作用,在某些页面上,它将会话写入数据库,但在其他页面上,它在没有数据的情况下写入会话。另外,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

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

这似乎起到了一半的作用,在某些页面上,它将会话写入数据库,但在其他页面上,它在没有数据的情况下写入会话。另外,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
前端控制器(定制框架)

在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();
}
函数_open()
{
$config=Configuration::getInstance();
$host=$config->get(“dbhost”);
$dbname=$config->get(“db”);
$user=$config->get(“dbuser”);
$pass=$config->get(“dbpass”);
$dbh=newpdo(“mysql:host=$host;dbname=$dbname”,$user,$pass);
}   
函数_close()
{
$dbh=null;
}
函数_read($id)
{
$config=Configuration::getInstance();
$host=$config->get(“dbhost”);
$dbname=$config->get(“db”);
$user=$config->get(“dbuser”);
$pass=$config->get(“dbpass”);
$dbh=newpdo(“mysql:host=$host;dbname=$dbname”,$user,$pass);
$sth=$dbh->prepare(“从id='$id'的会话中选择数据”);
$sth->execute();
}
函数_write($id,$data)
{
$config=Configuration::getInstance();
$host=$config->get(“dbhost”);
$dbname=$config->get(“db”);
$user=$config->get(“dbuser”);
$pass=$config->get(“dbpass”);
$dbh=newpdo(“mysql:host=$host;dbname=$dbname”,$user,$pass);
$access=time();
$sth=$dbh->prepare(“替换为会话值('$id','$access','$data');
$sth->execute();
}
函数_销毁($id)
{   
$config=Configuration::getInstance();
$host=$config->get(“dbhost”);
$dbname=$config->get(“db”);
$user=$config->get(“dbuser”);
$pass=$config->get(“dbpass”);
$dbh=newpdo(“mysql:host=$host;dbname=$dbname”,$user,$pass);
$sth=$dbh->prepare(“从id='$id'的会话中删除”);
$sth->execute();
}
功能清洁($max)
{
$config=Configuration::getInstance();
$host=$config->get(“dbhost”);
$dbname=$config->get(“db”);
$user=$config->get(“dbuser”);
$pass=$config->get(“dbpass”);
$dbh=newpdo(“mysql:host=$host;dbname=$dbname”,$user,$pass);
$old=time()-$max;
$sth=$dbh->prepare(“从access<'$old'的会话中删除”);
$sth->execute();
}

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

但这可能会有所帮助:如何调试自己的sessionhandler

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

因此,在sessionfn.php中添加一个名为writeToLog($someStr)的函数,该函数可以写入您自己的某个自定义日志文件。添加时间戳。附加到现有文件

现在,您可以检查functioncalls的所有返回值

只需清空日志文件,然后开始测试。在每个步骤上检查日志文件


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

很抱歉,这是一个输入错误。。我的意思是print_r($_SESSION),现在我重新阅读了php.net,这一切都更有意义。感谢您提供有关调试此文件的建议。
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();
}