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

我是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/

10-16 15:13