我有一个在循环中被调用多次的页面。我有一个版本,它是从MySQL的页面加载中提取数据,在页面再次重复这个过程之前,每次提交修改后的数据。其中一些数据仅对会话运行很重要,在会话结束时转储
我正在玩一个类的想法,它从构造函数中的会话变量加载它的变量,然后将最终值推回到析构函数中相同的会话变量。我有一些类似下面的东西。变量在第一次调用构造函数时成功初始化,并通过析构函数的第一个实例传递出去。但是,它们在第二次调用构造函数时无法加载。我错过什么了吗?
thanks in advance
class counters
{
protected $qCounters;
function __construct()
{
$this->qCounters = $_SESSION['q']['counters'];
}
// process happen here to alter values
function __destruct()
{
$_SESSION['q']['counters'] = $this->qCounters;
}
}
这是我的[非常简单]会话处理程序。注意db_query()是mysqli_query()的简单包装器,并在内部处理所有连接细节。
function session_close() {
return true;
}
function session_die($id) {
db_query("DELETE FROM session WHERE ID='$id'");
return true;
}
function session_gc($maxlifetime) {
return true;
}
function session_open($path,$name) {
return true;
}
function session_read($id) {
$dchk = db_query("SELECT data FROM session WHERE ID='$id'");
if(db_numrows($dchk) == 1) {
if(!isset($_SESSION['row'])) { $_SESSION['row'] = 1; }
list($data) = db_rows($dchk);
return base64_decode($data);
} else {
return "";
}
db_free($dchk);
return true;
}
function session_write($id,$data) {
global $visitor;
$data = base64_encode($data);
if(!isset($_SESSION['row'])) {
db_query("INSERT IGNORE INTO session (ID,data,accessed) VALUES('$id','$data',UNIX_TIMESTAMP(NOW()))");
} else {
db_query("UPDATE session SET data='$data',accessed=UNIX_TIMESTAMP(NOW()) WHERE ID='$id'");
}
return true;
}
引用
- Doc Bug #27555:无法从__destruct()中修改$_SESSION