обработчик сохранения набора сеансов — PHP Fatal Error SessionHandlerInterface

Я пытаюсь реализовать пользовательский SessionHandler в PHP, который обрабатывает сеанс через базу данных с помощью транзакций.

Проблема, однако, в том, что я продолжаю получать фатальные ошибки о том, что функция на нуле.

«Неустранимая ошибка: вызов функции-члена begin_transaction () со значением NULL«
«Неустранимая ошибка: вызов функции-члена commit () в null«

Если я закомментирую предыдущие два, я получу:

«Неустранимая ошибка: вызов функции-члена prepare () с нулевым значением«
«Неустранимая ошибка: вызов функции-члена close () в 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

Решение

$db переменная является переменной экземпляра, что означает, что на нее нужно ссылаться, используя $this,

пример

$this->db->begin_transaction(...);

Но прежде чем ссылаться $db таким образом, вы должны установить его, используя метод конструктора.

class MysqlSessionHandler implements SessionHandlerInterface {
protected $db;

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

public function read(...) {
...
$this->db->begin_transaction(...);
$this->db->prepare(...);
...
}
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]