【发布时间】:2011-07-25 14:27:13
【问题描述】:
您好,我正在尝试了解会话是如何工作的以及 session_set_handler() 是如何工作的,所以我已经开始构建一个用于会话处理的类,但是我遇到了 write() 函数的一些问题,你能帮帮我吗解决问题?
<?php
class Session extends Model
{
public
$connectionName = 'sessions',
$sessionsId,
$sessionsData;
public function __construct()
{
parent::__construct();
session_set_save_handler(
array($this, 'Open'),
array($this, 'Close'),
array($this, 'Read'),
array($this, 'Write'),
array($this, 'Destroy'),
array($this, 'Gc'));
session_start();
}
public function __destruct()
{
session_write_close();
}
public function Open()
{
return true;
}
public function Close()
{
return true;
}
public function Read($sessionsId)
{
$this->stmt = $this->prepare("SELECT * FROM `sessions` WHERE `id` = :sessionId");
$this->stmt->bindParam(":sessionId", $sessionsId);
$this->stmt->execute();
return $this->stmt->fetchAll();
}
public function Write($sessionsId, $sessionsData)
{
$this->stmt = $this->prepare("REPLACE INTO `sessions`.`sessions`
(`id`, `access`, `data`)
VALUES
(:sessionId, NOW(), :sessionValue)");
$this->stmt->bindParam(":sessionId", $sessionsId);
$this->stmt->bindParam(":sessionValue", $sessionsData);
$this->stmt->execute();
}
public function Destroy($sessionsId)
{
$this->stmt = $this->prepare("DELETE FROM `sessions`.`sessions` WHERE `id` = :sessionId");
$this->stmt->bindParam(":sessionId", $sessionsId);
$this->stmt->execute();
}
public function Gc()
{
$this->stmt = $this->prepare("DELETE FROM `sessions`.`sessions` WHERE `access` < NOW() - INTERVAL 1 HOUR");
$this->stmt->execute();
}
}
现在上面的代码似乎工作得很好,唯一的问题是当我在 db 中编写会话时,我得到以下插入:
从 mysql 转储
CREATE TABLE IF NOT EXISTS `sessions` (
`id` varchar(32) NOT NULL,
`access` datetime NOT NULL,
`data` text NOT NULL,
UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `sessions` (`id`, `access`, `data`) VALUES
('lhig71coed8ur81n85iiovje37', '2011-07-25 15:37:57', '');
正如您所看到的,它没有插入会话的值,我只获取会话 ID。
在var_dump($sessionsData) 我得到:
"name|s:6:"Bogdan";"
对于var_dump($sessionsId),我得到:
lhig71coed8ur81n85iiovje37
你能帮忙吗?我没有收到任何错误检查 xampp 日志设置显示错误报告所有我知道的错误,即使在 php.ini 中仍然没有任何错误,甚至尝试使用 catch 块。非常感谢您阅读本文并帮助我。
【问题讨论】:
-
你能确认 $sessionsData 是否有值吗?尝试在进程之前回显它。
-
var_dump 看起来很可疑。
serialize()输出无效 - 会话数组中是否存储了任何可能被浏览器视图“隐藏”的 HTML/xml?你在浏览器的 view-source 中看到了什么? -
@Marc B:
var_dump看起来非常适合会话数据。serialize()不能与会话数据一起正常工作,我认为您将其混为一谈,因为它很接近,但会话数据是 a list of variable names with their serialized values,就像({varname}|{serialized($varname)})*一样。 -
serialize() 不在乎它的会话数据。它只是另一个数据结构,基本上是
serialize($_SESSION)。一个有效的序列化会话数组至少以a:...开头。|不是有效的分隔符。 -
@Marc B:你最好自己试试,函数不是
serialize(),而是session_encode()。阅读该手册页最上面的注释。