读取构造函数和析构函数中会话变量的I/O


reading I/O of session variables in constructor and destructor

我有一个在循环中被调用多次的页面。我有一个版本,它是从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