2015-12-25 10 views
1

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

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

«Фатальная ошибка: Вызов функции члена begin_transaction() на нуль»
«Фатальная ошибка: Вызов функции-члена совершить() на нуль»

Если я закомментируйте предыдущая два я получаю:
«Фатальная ошибка: Вызов функции-члена подготовить() на нуль»
"Фатальная ошибка: Вызов члена функция закрытия() на нуль "

Etc. Etc.

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

<?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; 
    } 
} 
?> 
+0

В рамках ваших методов нет переменной с именем '$ db'. – PeeHaa

+0

Начать чтение документации http://php.net/manual/en/language.oop5.basic.php – PeeHaa

+0

@PeeHaa Переменная $ db передается при запуске самого класса MysqlSessionHandler? Сразу после проверки пароля. – Berkan

ответ

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(...); 
     ... 
    } 
}