2016-10-05 4 views
0

おかげ..PHP PDO依存性の注入読書と私の質問を検討するための

私はPDOへとOOPに新しいです(右の方法 - 私は今、いくつかの時間のためのより多くの機能のようなオブジェクトを使用してきた)、およびI現在のユーザーログインスクリプトを変換してセッションハイジャックを防止しようとしています(同時にデータをデータベースから簡単に取得できるようにします)...とにかく...

さらに、私はログインスクリプトが必要です。このようなものが必要な場合は、すでに証明されているフレームワークを使用します。

私はこのように定義され、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); 

しかし、私は以下のエラーを取得:メンバ関数へ コールquery()on null

これは、$pdoConnオブジェクトがnull(I思う)...しかし、私は理由を理解することはできません。

私はこのような局所的な使用のためのコンストラクタの外から中に渡された$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第3段落をご覧ください。 ... @あなたの常識は、そのクエリはただ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

奇妙なことに、私はセッターでそれを試しましたが、これはうまくいっているに違いないと思われます。ありがとうございました! – Jeff