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

Php 读取构造函数和析构函数中会话变量的I/O,php,debugging,constructor,session-variables,destructor,Php,Debugging,Constructor,Session Variables,Destructor,我有一个在循环中多次被调用的页面。我有一个版本,在页面加载时从MySQL中提取数据,在页面再次重复该过程之前,每次提交时都会将修改后的数据推回。其中一些数据仅对会话的运行很重要,在会话结束时转储 我在玩一个类的想法,这个类从构造函数中的会话变量加载它的变量,然后将最终值推回到析构函数中的相同会话变量。我有一些大致如下的东西。变量在第一次调用构造函数时被成功初始化,并由析构函数的第一个实例传递出去。但是,在第二次调用构造函数时无法加载它们。我错过什么了吗 提前谢谢 class counters {

我有一个在循环中多次被调用的页面。我有一个版本,在页面加载时从MySQL中提取数据,在页面再次重复该过程之前,每次提交时都会将修改后的数据推回。其中一些数据仅对会话的运行很重要,在会话结束时转储

我在玩一个类的想法,这个类从构造函数中的会话变量加载它的变量,然后将最终值推回到析构函数中的相同会话变量。我有一些大致如下的东西。变量在第一次调用构造函数时被成功初始化,并由析构函数的第一个实例传递出去。但是,在第二次调用构造函数时无法加载它们。我错过什么了吗

提前谢谢

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;
}