我正在尝试在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;
}
}
?>
答案 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