感谢您阅读并考虑我的问题..
我是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'每次我想在我的所有课程中使用它。 我该如何处理?
答案 0 :(得分:1)
您的构造函数会收到$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];
}
}