【问题标题】:save php session to db (session_set_save_handler)将 php 会话保存到数据库 (session_set_save_handler)
【发布时间】:2015-04-17 14:33:52
【问题描述】:

我在一个网站上工作,我们需要集群服务器以让超过 1 台计算机处理流量。 所以我需要将 php 会话(文件会话)转换为 db 来进行集群工作。

我有一个简单的登录文件: 检查是否发布用户 == 密码,如果 num 行 == 1:

$_SESSION['user']=$_POST['user'];

我的问题从这里开始,如何使用 session_set_save_handler 在我的数据库中写入这个 USER? 我需要改变什么让_write工作?

public function _write($id){
  // Create time stamp
  $data = time();

  // Set query  
  $this->db->query('INSERT INTO sessions (id,user,data) VALUES (:id, :user, :data)');

  // Bind data
  $this->db->bind(':id', $id);
  $this->db->bind(':user', $user);  //how can i get login user?
  $this->db->bind(':data', $data);

  // Attempt Execution
  // If successful
  if($this->db->execute()){
    // Return True
    return true;
  }

  // Return False
  return false;
}

数据库

CREATE TABLE IF NOT EXISTS `sessions` (
  `id` varchar(32) NOT NULL,
  `user` varchar(20),
  `data` text,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

【问题讨论】:

  • 到底发生了什么?什么错误?
  • 您的代码中不存在 $user 变量。
  • 我无法让登录用户保存在我的会话数据库中,我不知道如何将此登录用户名发送到我的函数
  • $this->db->bind(':user', $_SESSION['user']);
  • 你为什么不:公共函数 _write($id, $user, $data) ?正如@Heru-Luin 所说,您缺少变量

标签: php session


【解决方案1】:

首先,您的_write 函数缺少第二个参数,在本例中为$user

function _write($id,$user)

这就是您的数据($_SESSION 数组的内容)所在的位置。 $user 这个名字很容易混淆,它只是包含在 $_SESSION 数组中的任何数据,所以最好使用 $value 这个名字。

另外,你的会话表中的 id 应该是唯一的,如果已经有这样的会话,它可能不会成功。所以在这种情况下,你用过期时间更新它:

if($this->db->execute()){
    return true;
}else{
    $this->db->query('UPDATE sessions SET user=:user, data:data WHERE id=$id');

    $this->db->bind(':access', $access);  
    $this->db->bind(':data', $data);

    $this->db->execute();
}

至于时间,应该是过期时间,你最好改成:

$data = time()+ini_get("session.gc_maxlifetime");

【讨论】:

  • 哦,所以 $sessionId 具有来自用户浏览器和我的数据库中的会话的 ID?和所有其他 $_SESSION['SOMETHING'] 的数据?
  • 是的,这个表应该有唯一的会话ID,到期时间和所有$_SESSION序列化的值。
【解决方案2】:

session_set_save_handler的write函数,接受两个参数:

function write(string $sessionId, string $data)
{
    //$data = serialized presentation of your whole session, including 'user'
    ...
}

查看What kind of serialization uses PHP function session_set_save_handler's write function?了解更多信息

【讨论】:

  • 非常感谢!我的问题在于 $data,我知道它包含所有会话值!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 2013-01-29
  • 2016-03-18
  • 2010-09-14
相关资源
最近更新 更多