【问题标题】:PHP PDO Dependancy InjectionPHP PDO 依赖注入
【发布时间】: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.orgpimple.sensiolabs.org
  • 我想知道 setLoggedInUserId 方法是不是真的
  • @tadman 请看第三段。 ...@你的常识,不是那个查询只返回 1,但如果连接良好,它只返回 1。
  • @Jeff 虽然你说这是一个学术练习,但你也暗示你正在其他项目中使用它。虽然我完全是为了学习,但在这里对毫无戒心的用户进行测试时要非常小心。 There's a lot of threats 你需要减轻压力才能达到它需要的水平。尽量小心,祝你好运。
  • 谢谢塔德曼。虽然我很欣赏这些反馈,但我向您保证,我的网站可悲且不安全的登录脚本绝不包含任何类型的敏感数据。这对我来说是一种爱好,当涉及到真正的身份验证和适当的安全性时,我知道让专家在我做我的工作时做他们的工作。

标签: php mysql oop pdo


【解决方案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];
    }
}

【讨论】:

  • 奇怪的是,我已经用 setter 尝试过,但似乎我一定做错了,因为这是有效的。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-27
  • 2014-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多