【发布时间】:2017-02-13 07:48:18
【问题描述】:
感谢您阅读并考虑我的问题..
我是 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”在我所有的课程中使用它。 我应该如何处理?
【问题讨论】:
-
您可能想查看
dependency injection container,例如; php-di.org 或 pimple.sensiolabs.org -
我想知道 setLoggedInUserId 方法是不是真的
-
@tadman 请看第三段。 ...@你的常识,不是那个查询只返回 1,但如果连接良好,它只返回 1。
-
@Jeff 虽然你说这是一个学术练习,但你也暗示你正在其他项目中使用它。虽然我完全是为了学习,但在这里对毫无戒心的用户进行测试时要非常小心。 There's a lot of threats 你需要减轻压力才能达到它需要的水平。尽量小心,祝你好运。
-
谢谢塔德曼。虽然我很欣赏这些反馈,但我向您保证,我的网站可悲且不安全的登录脚本绝不包含任何类型的敏感数据。这对我来说是一种爱好,当涉及到真正的身份验证和适当的安全性时,我知道让专家在我做我的工作时做他们的工作。