2011-12-12 54 views
2

我想將從DataManager對象中的PDO收集的值傳遞給用戶對象。在使用PDO的php中的兩個對象之間的相互作用

  1. 用戶對象首先被調用,用請求檢索帶ID的用戶。
  2. 用戶創建到構造中的數據管理器的連接。
  3. datamanager構造調用PDO連接。
  4. 運行用戶選擇創建查詢以在數據庫上執行預製。
  5. 然後將查詢傳遞給處理查詢並返回結果的數據管理器。
  6. 應將此結果傳遞/設置爲用戶對象。

我不確定是否第5步或第6步是錯誤的。

class Datamanager { 
public function __construct() { 
    try { 
     $this->dbh = new PDO("mysql:host=$this->hostName;dbname=$this->dbName", $this->dbUser, $this->dbPassword); 
    } catch(PDOException $e) { 
     echo $e->getMessage(); 
    } 
} 
public function runQuery($query, $obj){ 
    try { 
     $STH = $this->dbh->query($query); 
     $STH->setFetchMode(PDO::FETCH_INTO, $obj); 
    } catch(PDOException $e) { 
     echo $e->getMessage(); 
    } 
    return($obj); 
} 
class User { 
public $user_id; 
public $user_name; 
public $user_password; 
public $session_id; 
private $dbc; 

public function __construct() { 
    $this->dbc = new Datamanager(); 
} 

function selectUser ($userID, $obj) { 
    $query = 'SELECT user_id, user_name, user_password, session_id FROM users'; 
    $results = $this->dbc->runQuery($query, $this); 
} 

$userID = "1"; 

$test = new User; 

$test->selectUser($userID, $test); 

我運行用戶的初始設置,然後嘗試加載數據管理器中檢索到的值。我明白PDO本身就是一個對象,但我仍然試圖創建一個普通的交互,因爲這個代碼將被擴展以允許更多的用戶對象訪問數據庫。

回答

2

這裏是我的版本。

class Datamanager { 

    public $hostName = 'localhost'; 
    public $dbName = 'stackoverflow'; 
    public $dbUser = 'xxx'; 
    public $dbPassword = 'xxx'; 

    public function __construct() { 
     try { 
      $this->dbh = new PDO("mysql:host=$this->hostName;dbname=$this->dbName", $this->dbUser, $this->dbPassword); 
     } catch (PDOException $e) { 
      echo $e->getMessage(); 
     } 
    } 

    public function runQuery($query, $obj) { 
     try { 
      $STH = $this->dbh->prepare($query); 
      $STH->bindParam(':id', $obj->user_id); 

      $STH->setFetchMode(PDO::FETCH_INTO, $obj); 
      $STH->execute(); 
      $STH->fetch(); 
     } catch (PDOException $e) { 
      echo $e->getMessage(); 
     } 
     return $obj; 
    } 

} 

class User { 

    public $user_id; 
    public $user_name; 
    public $user_password; 
    public $session_id; 
    private $dbc; 

    public function __construct() { 
     $this->dbc = new Datamanager(); 
    } 

    function selectUser($userID, $obj) { 
     $this->user_id = $userID; 
     $query = 'SELECT user_id, user_name, user_password, session_id FROM users WHERE user_id=:id'; 
     $results = $this->dbc->runQuery($query, $this); 
    } 

} 

$userID = "1"; 
$test = new User; 

$test->selectUser($userID, $test); 

var_dump($test); 

我添加了一個WHERE user_id=:id到您的查詢,並改變了PDO使用prepare()

0

你錯過了幾個閉幕式的。這只是一個複製和粘貼錯誤?

而且,不應該在該行:

$results = $this->dbc->runQuery($query, $this); 

改爲:

$results = $this->dbc->runQuery($query, $obj);