2012-10-08 50 views
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(); 
} 
+0

对不起,这是一个错字..我的意思是print_r($ _ SESSION) – Chris

回答

0

这是很难当我调试代码不亲自动手。 :-)

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

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

因此,向sessionfn.php中添加一个名为writeToLog($ someStr)的函数,它可以写入您自己的某个customlog文件。给它添加时间戳。附加到现有文件。

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

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

设置起来并不是很多工作,你可以看到你所有的问题。

+0

现在我已经重新阅读了php.net,这一切都变得更有意义。感谢您对此进行调试的建议。 – Chris

相关问题