Привет, я пытаюсь понять, как работают сеансы и как работает 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();
}
}
теперь приведенный выше код работает нормально, единственная проблема заключается в том, что когда я пишу сеанс в БД, я получаю следующую вставку:
дамп из 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', '');
Как вы можете видеть, значение сеанса не вставлено, я получаю только идентификатор сеанса. на var_dump($sessionsData)
я получаю:
"name|s:6:"Bogdan";"
и для var_dump($sessionsId)
я получаю:
lhig71coed8ur81n85iiovje37
Не могли бы вы помочь? я не получаю никаких ошибок проверенные журналы настройки xampp отображают ошибки при сообщении об ошибках все, что я знал, даже в php.ini все еще нет ошибок, что-либо использовалось, даже попробуйте блоки catch. большое спасибо, что прочитали это и помогли мне.
serialize()
- есть ли какой-либо HTML/xml, хранящийся в массиве сеансов, который может быть скрыт представлением браузера? Что вы видите в исходном коде браузера? - person Marc B   schedule 25.07.2011var_dump
выглядит очень хорошо для данных сеанса.serialize()
не работает должным образом с данными сеанса, я думаю, вы немного смешиваете это, потому что он близок, но данные сеанса список имен переменных с их сериализованными значениями примерно так({varname}|{serialized($varname)})*
. - person hakre   schedule 25.07.2011serialize($_SESSION)
. Действительный сериализованный массив сеансов будет как минимум начинаться сa:...
.|
не является допустимым разделителем. - person Marc B   schedule 25.07.2011serialize()
, аsession_encode()
а>. Прочтите также самое верхнее примечание на этой странице руководства. - person hakre   schedule 25.07.2011session_encode()
, потому что он позволяет вам проверить этот внутренний процесс и продемонстрировать, что сериализация сеанса отличается отserialize()
. Вывод функции изменится, если вы измените сериализацию сеанса. значение обработчика. - person hakre   schedule 25.07.2011