2011-03-11 56 views
1

我一直在轉換一些更基本的腳本,因此他們開始使用PDO,而我似乎無法讓我的靜態身份驗證方法正常工作。不過,我已經得到它與靜態工作。使用pdo的靜態身份驗證方法

繼承人的培訓相關的代碼與非靜態身份驗證方法:

private $dbh; 
public function __construct() 
{ 
    $this->dbh = new PDO("mysql:host=localhost;dbname=carmen", 'root', ''); 
    $this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
} 

public function authenticate($username="", $password="") 
{ 
    $sql = "SELECT * FROM user "; 
    $sql .= "WHERE username = :username "; 
    $sql .= "AND pass = :password "; 
    $sql .= "LIMIT 1"; 

    $stmt = $this->dbh->prepare($sql); 
    $stmt->bindParam(':username', $username); 
    $stmt->bindParam(':password', $password); 
    $stmt->execute(); 
    $result = $stmt->fetchAll(PDO::FETCH_ASSOC); 

    return !empty($result) ? true : false; 
} 

我嘗試在一個解決方案通常試圖申報mehthod靜態時遇到的SQL語句後的第一行的問題。我猜測它必須處理在課程開始時聲明爲private的$ dbh。

回答

0

您的問題是,一旦您轉換爲靜態方法,$this->dbh不起作用。

如果您希望將此方法設爲靜態,那麼最簡單的方法是將您的PDO對象作爲參數傳遞給該函數。

您可以將$dbh聲明爲靜態變量,然後使用self::$dbh來訪問它,但是您還需要添加一些方法來初始化它(可能是另一種靜態方法),而不是構造函數。

0

靜態函數不能訪問$this指針。在這種情況下沒有意義。

一些解決方案是:

  • 保持功能的非靜態,​​或

  • 充分利用$胸徑處理靜態。您可能會用某種靜態初始化函數替換構造函數,或者將$ dbh句柄傳遞給需要它的靜態函數。

您可能需要重新審視整體設計。