PHP致命错误SessionHandlerInterface

时间:2015-12-25 19:18:13

标签: php session-set-save-handler

我正在尝试在PHP中实现一个自定义SessionHandler,它使用事务处理通过数据库的会话。

但问题是,我一直遇到致命错误,关于函数为null。

致命错误:在null上调用成员函数begin_transaction()
致命错误:在null上调用成员函数commit()

如果我评论前两个我得到:
致命错误:在null上调用成员函数prepare()
致命错误:调用成员函数close()on null

等。等

现在很明显,你会认为我忘了发起与数据库的连接。嗯,惊讶,我没有。

<?php
    if (!empty($_POST)) {
        $username = trim($_POST['username']);
        $password = trim($_POST['password']);

        require_once '../psl-config.php';
        $db = new mysqli('localhost', USER, PASSWORD, DATABASE, 0, '/var/run/mysqld/mysqld.sock');

        if (!$db->connect_errno) {
            $login = $db->prepare('SELECT hashedPassword FROM gebruikerGegevens WHERE username = ?');
            $login->bind_param('s', $username);
            $login->execute();
            $login->bind_result($hashedPassword);
            $login->fetch();
        }

        if (password_verify($password, $hashedPassword)) {
            require_once 'sessionHandler.php';

            $handler = new MysqlSessionHandler($db);
            session_set_save_handler($handler);
            session_start();
        } else {
            echo "Username or password is incorrect.";
        }
    }
?>

在我启动MysqlSessionHandler函数之前一切顺利。 注意:我还没有插入回滚功能,因为我仍在忙着搞清楚错误。

<?php
class MysqlSessionHandler implements SessionHandlerInterface {
    protected $db;

    public function open($save_path, $session_name) {
        return true;
    }

    public function read($session_id) {
        $db->begin_transaction(MYSQLI_TRANS_START_READ_WRITE);
        $db->prepare('SELECT expiry, data FROM sessions WHERE sid = ?');
        $db->bind_param('s', $session_id);
        $db->execute();
        $db->bind_result($expiry, $data);
        $result = $mysqli->fetch();

        if ($result) {
            if ($expiry < time()) {
                return '';
            }
            return $data;
        }

        //Inserts sessionID into database, if no sessionID could be found in the database.
        $db->prepare('INSERT INTO sessions (sid, expiry, data) VALUES (?,?,?)');
        $db->bind_param('sib', $session_id, $create_expiry, $empty_data);
        $create_expiry = session_cache_expire();
        $empty_data = '';
        $db->execute;
        return '';
    }

    public function write($session_id, $session_data) {
        $db->begin_transaction(MYSQLI_TRANS_START_READ_WRITE);
        $db->prepare('INSERT INTO sessions (sid, expiry, data) VALUES (?,?,?)');
        $db->bind_param('sib', $session_id, $create_expiry, $session_data);
        $create_expiry = session_cache_expire();
        $db->execute();
        return true;
    }

    public function close() {
        $db->commit();
        $db->close();
        return true;
    }

    public function  destroy($session_id) {
        $db->prepare('DELETE FROM sessions WHERE sid = ?');
        $db->bind_param('s', $session_id);
        $db->execute();
        return true;
    }

    public function gc($maxlifetime) {
        return true;
    }
}
?>

1 个答案:

答案 0 :(得分:1)

// Angular 2 import 'angular2/platform/browser'; import 'angular2/platform/common_dom'; import 'angular2/core'; import 'angular2/router'; import 'angular2/http'; // RxJS import 'rxjs'; import {bootstrap} from 'angular2/platform/browser' import {AppComponent} from './app.component' bootstrap(AppComponent); 变量是一个实例变量,这意味着它必须使用$db来引用。

实施例

$this

但是在能够以这种方式引用$this->db->begin_transaction(...); 之前,你必须使用构造函数方法来设置它。

$db