感谢您阅读并考虑我的问题。
我是PDO和OOP的新手(正确的方法-我一段时间以来一直在使用类似于函数的对象),并且我正尝试转换当前的用户登录脚本以防止会话劫持(同时)使得从数据库中获取数据更加容易)...无论如何...
另外-我这样做是为了学习,而不是因为我需要登录脚本。如果我需要这样的东西,我会使用一个已经被证实的框架。
我正在为UserSessions
构造此类,因此定义为:
class UserSession {
public $userSessionId;
public $loggedInUserId;
public $userIp;
public $userFwdIp;
public $httpUserAgent;
public $authenticated;
private $hashedPassword;
private $suppliedUserName;
private $suppliedPassword;
public function __construct ($pdoConn) {
$this->setUserSessionId();
$this->setUserIp();
$this->setUserFwdIp();
$this->setSessionExpire();
$this->setHttpUserAgent();
$this->setLoggedInUserId();
$this->updateCurrentSession();
}
private function setLoggedInUserId() {
$query = 'select 1 from dual';
$this->loggedInUserId = $pdoConn->query($query)->fetch()[0];
}
// several other methods below that all function properly
}
我在这里实例化该类:
$databaseConnect = new $config['database_type']($config);
$pdoConn = new PDO( $databaseConnect->connectString
, $databaseConnect->getDataBaseUser()
, $databaseConnect->getDataBasePass()
, array(PDO::ATTR_EMULATE_PREPARES=>false
, pdo::ATTR_ERRMODE=>pdo::ERRMODE_EXCEPTION)
);
$httpReqUser = new UserSession($pdoConn);
但是,出现以下错误:
在null上调用成员函数query()
所以,这告诉我
$pdoConn
对象是null
(我认为)...但是我不知道为什么。我尝试将新变量设置为从构造函数外部传入的
$pdoConn
值,以供本地使用,如下所示:$this->setPdoConn($pdoConn) // and within that method it's a simple setter...
也许我误会了我应该在这里做什么。
基本上-此
UserSession
类将需要更新或在表中插入一些字段,尽管如此,它将需要访问PDO,但是我不想每次使用它时都不必调用“新PDO”在我所有的课程中。我应该如何处理? 最佳答案
您的构造函数接收到一个$pdoConn
参数,但您并未对其进行任何操作。
创建一个类属性,将$pdoConn
保存在构造函数中,然后使用该属性发出查询。
像这样:
class UserSession {
private $pdoConn;
// rest of your class attributes
public function __construct ($pdoConn) {
$this->pdoConn = $pdoConn;
// rest of your constructor
}
private function setLoggedInUserId() {
$this->loggedInUserId = $this->pdoConn->query(...)->fetch()[0];
}
}
关于php - PHP PDO依赖注入(inject),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39864253/