Отсутствует параметр записи пользовательского сеанса PHP - PullRequest
1 голос
/ 16 октября 2011

Я получаю странную ошибку, которую я не видел раньше при использовании пользовательского обработчика сеансов в PHP (код ниже).Когда вызывается session_start (), я получаю предупреждение: отсутствует аргумент 2 для Session :: write () в строке 22 и переменная Notice: Undefined: данные в строке 25.

Строка 22 - открытая функция write ($id, $ data) и строка 25, где переменная данных используется чуть ниже.

Может кто-нибудь увидеть ошибку в моем коде?

Спасибо

    class Session {

    private $db;
    private $expires_time;

    public function __construct($database, $expires_time) {
        $this->db = $database;
        $this->expires_time = $expires_time;
    }

    public function open($path, $name) {
        return true;
    }

    public function close() {
        return true;
    }

    public function write($id, $data) {
        $expires = time() + $this->expires_time;
        $query = $this->db->prepare('REPLACE INTO sessions (id, data, expires) VALUES (:id, :data, :expires)');
        return $query->execute(array(":id" => $id, ":data" => $data, ":expires" => $expires));
    }

    public function read($id) {
        $query = $this->db->prepare('SELECT data FROM sessions WHERE id = :id AND expires > :expires LIMIT 1');
        $query->execute(array(':id' => $id, ':expires' => time()));
        if($session = $query->fetch()) {
            return $session['data'];
        }
        return '';
    }

    public function destroy($id) {
        $query = $this->db->prepare('DELETE FROM sessions WHERE id = :id');
        return $query->execute(array(':id', $id));
    }

    public function clean($max) {
        $query = $this->db->prepare('DELETE FROM sessions WHERE expires < :expires');
        return $query->execute(array(':expires', $max));
    }

}

Иследующий код создает объект и устанавливает обработчик сохранения сеанса.

    $sess_expires_time = 3600;
$session = new Session($_DATABASE, $sess_expires_time);
session_set_save_handler(
    array($session, '_open'),
    array($session, '_close'),
    array($session, '_write'),
    array($session, '_read'),
    array($session, '_destroy'),
    array($session, '_clean')   
);
session_start();

Ответы [ 2 ]

0 голосов
/ 16 октября 2011

Проблема обнаружена. Тупой тупой.

У меня был неправильный порядок методов в session_set_save_handler, и я вызывал write и read в неправильном порядке.

Спасибо за совет.

0 голосов
/ 16 октября 2011
register_shutdown_function('session_write_close');

PHP уже позаботился об этом.Не то чтобы вы писали второй раз (а потом провоцировали ошибку, о которой идет речь).Так что удалите эту строку.

Для целей отладки включите xdebug на своей платформе разработки, где вы можете спровоцировать эту ошибку и / или конфигурацию php-ошибок и записать трассировки стека в журнал ошибок .Должен дать вам представление о том, что происходит, и особенно когда (обычно вы можете надежно работать только с журналом ошибок здесь, STDOUT часто закрывается, когда запись запускается в вашем обработчике сохранения).

Кроме того, вы не открываете/ Закрыть отслеживание в вашем обработчике сохранения.Как вы можете знать, что вы должны писать, когда сессия закрыта?

Также ваш обработчик сессий не имеет дело с именами сессий.Вы должны сделать это немного более гибким, например, при переключении сессий.Если переключение сеансов не предназначено, вам следует сделать исключение, а не молча выкинуть класс обработчика сохранения сеанса из рабочего процесса незамеченным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...