2016-10-05 8 views
0

Danke fürs Lesen und meine Frage unter Berücksichtigung ..PHP PDO Dependency Injection

Ich bin neu in PDO und OOP (richtig - ich habe Objekte mehr ähnliche Funktionen seit einiger Zeit verwendet wird), und ich Ich versuche meine aktuellen Benutzeranmeldeskripte zu konvertieren, um Session-Hijacking zu verhindern (und gleichzeitig die Daten aus der Datenbank leichter zu machen) ... trotzdem ...

Zusätzlich - ich mache das, um zu lernen, nicht weil Ich brauche ein Login-Skript. Wenn ich so etwas brauchte, würde ich ein Framework verwenden, das bereits bewiesen ist.

ich diese Klasse bin Konstruktion für UserSessions, definiert so:

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 
} 

ich die Klasse instanziiert hier:

$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); 

Allerdings habe ich den folgenden Fehler: Anruf auf eine Elementfunktion query() auf null

Also, das sagt mir, dass das $pdoConn Objekt ist null (I denke) ... aber ich kann nicht herausfinden warum.

Ich habe versucht, eine neue Variable in die $pdoConn Wert, der für den lokalen Gebrauch, wie dies in von außerhalb des Konstruktor übergeben wird:

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

Vielleicht bin ich Missverständnis, was genau soll ich hier tun.

Grundsätzlich - diese UserSession Klasse muss aktualisieren oder fügen Sie einige Felder in eine Tabelle ein, dennoch wird es Zugriff auf PDO benötigen, aber ich möchte nicht jedes Mal ein 'neues PDO' aufrufen müssen benutze es in allen meinen Klassen. Wie soll ich das angehen?

+1

Sie könnten aussehen wollen in 'Dependency Injection container' wie; http://php-di.org/ oder http://pimple.sensiolabs.org/ – Perspective

+0

Ich frage mich, ob setLoggedInUserId-Methode ist eine echte –

+0

@tadman finden Sie im dritten Absatz. ... @ Ihr gesunder Menschenverstand, Nein, diese Abfrage gibt nur 1 zurück, aber es gibt nur 1 zurück, wenn die Verbindung gut ist. – Jeff

Antwort

1

Ihr Konstruktor empfängt einen $pdoConn Parameter, aber Sie tun nichts damit.

Erstellen Sie ein Klassenattribut, speichern Sie $pdoConn im Konstruktor, und verwenden Sie das dann, um Abfragen auszugeben.

So:

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

Seltsamerweise hatte ich das mit einem Setter versucht, aber es scheint, ich muss es falsch gemacht haben, weil das funktioniert. Vielen Dank! – Jeff