PHP PDO依赖注入

时间:2016-10-05 01:47:50

标签: php mysql oop pdo

感谢您阅读并考虑我的问题..

我是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'每次我想在我的所有课程中使用它。 我该如何处理?

1 个答案:

答案 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];
    }
}