2015-04-17 52 views
2

我在一个网站上工作,我们需要集群服务器有超过1台计算机处理流量。 所以我需要将php会话(文件会话)转换为此群集工作的数据库。将php会话保存到db(session_set_save_handler)

我有一个简单的登录文件: 检查后用户==密码,如果NUM行== 1:

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

我的问题就在这里开始,我怎么能写这样的用户在我的数据库使用的session_set_save_handler ? 我需要更改get _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; 
} 

DB

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

到底会发生什么?什么是错误? –

+1

您的代码中不存在$ user变量。 –

+0

我不能获得登录用户保存在我的会话数据库,我不知道如何发送此登录用户名到我的功能 –

回答

0

首先,你_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");

+0

哦,所以$ sessionId有来自用户浏览器和我的数据库的会话的ID?和其他所有$ _ SESSION ['SOMETHING']的数据? –

+0

是的,这个表应该有唯一的会话ID,到期时间和所有'$ _SESSION'序列化的值。 –

+0

谢谢!我想现在我明白了这个过程 –