2016-10-05 66 views
0

感謝您的閱讀,並考慮我的問題..PHP 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

所以,這告訴我,$pdoConn對象是null(我想想)...但我不明白爲什麼。

我已經嘗試了新的變量設置爲是在通過從構造的外供本地使用這樣的$pdoConn值:

$this->setPdoConn($pdoConn) // and within that method it's a simple setter... 

也許我誤解究竟我應該在這裏做。

基本上 - 這個UserSession類將需要更新或插入一個表中的幾個字段,但它將需要訪問PDO,但我不想每次我想要調用一個'新的PDO'在我的所有課程中使用它。 我應該如何解決這個問題?

+1

你可能想看看'依賴注入container'如; http://php-di.org/或http://pimple.sensiolabs.org/ – Perspective

+0

我想知道setLoggedInUserId方法是否是一個真實的 –

+0

@tadman請見第三段。 ... @你的常識,沒有那個查詢只返回1,但它只返回1,如果連接是好的。 – Jeff

回答

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]; 
    } 
} 
+0

奇怪的是,我試圖用一個setter,但似乎我必須做錯了,因爲這是工作。謝謝! – Jeff