2014-03-02 37 views
1

訪問PDO對象我想我已經創建了一個類中訪問PDO對象,但它拋出一個錯誤:在另一個類

Call to undefined method EntelDB::prepare()

下面是代碼。我如何訪問prepare()query()等原生方法PDO

class DB 
{ 
    private $dbName = ''; 
    private $dbUsername = ''; 
    private $dbPassword = ''; 
    static protected $instance; 
    public $conn; 

    protected function __construct($dbName, $dbUsername, $dbPassword) 
    { 
     $this->dbName = $dbName; 
     $this->dbUsername = $dbUsername; 
     $this->dbPassword = $dbPassword; 
     $this->conn = new PDO("mysql:host=localhost;dbname=" . $this->dbName . ";charset=utf8", 
      $this->dbUsername, $this->dbPassword); 

     $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    } 

    public static function getInstance($dbName, $dbUsername, $dbPassword) 
    { 
     if (!self::$instance) 
     { 
      self::$instance = new self($dbName, $dbUsername, $dbPassword); 
     } 

     return self::$instance; 
    } 
} 


class Auth 
{  
    private $loginQuery = "SELECT userIdusername,password FROM login WHERE username=? AND password=?"; 
    public $conn; 

    function login($username, $password) 
    { 
     /*here's the DB class usage*/ 
     $this->conn = DB::getInstance("patikana", "root", ""); 
     $_SESSION['user_allow'] = FALSE; 
     $_SESSION['user'] = ''; 
     $_SESSION['userId'] = ''; 
     $_SESSION['loggedInTime'] = ''; 
     $query = $this->loginQuery; 
     /* 
      NOT ACCESSING PREPARE METHODS. 
     */ 
     $stmt = $this->conn->prepare($query); 
    } 
} 


//instatiation and usage. 
$userAuthenticate = new Auth(); 
$userAuthenticate->login(); 
+0

我不知道PDO,但你準備不公開你不能稱之爲它。 –

回答

2

您正在使用單例模式,但是您也希望將「conn」變量作爲Auth類中的公共屬性。

添加一個構造函數的驗證類:

public function __construct() 
{ 
    $this->conn = DB::getInstance()->conn; 
} 

在行:

$this->conn= DB::getInstance("patikana","root",""); 

您沒有安裝連接,但DB對象實例。

也考慮使用依賴注入而不是單例。辛格爾頓是一個難以維護的反模式。

我建議重構:

class Auth { 

private $loginQuery="SELECT userIdusername,password FROM login WHERE username=? AND password=?"; 
private $db; 

function __construct(DB $db) { 
    $this->db = $db; 
} 

function login($username, $password) { 

    $_SESSION['user_allow']=FALSE; 
    $_SESSION['user']=''; 
    $_SESSION['userId']=''; 
    $_SESSION['loggedInTime']=''; 
    $query = $this->loginQuery; 

    $stmt = $this->db->conn->prepare($query); 
} 
} 

然後初始化您的驗證對象:

$aut = new Auth($db); 

其中$ db是你的數據庫訪問類的實例;

+0

謝謝,這很好。乾杯 –