2010-07-21 43 views
7

我想填充類使用PDO的FETCH_INTO構造:

class user 
{ 
    private $db; 
    private $name; 

    function __construct($id) 
    { 
     $this->db = ...; 

     $q = $this->db->prepare("SELECT name FROM users WHERE id = ?"); 
     $q->setFetchMode(PDO::FETCH_INTO, $this); 
     $q->execute(array($id)); 

     echo $this->name; 
    } 
} 

這是行不通的。沒有錯誤,只是沒有。腳本沒有錯誤,FETCH_ASSOC工作正常。

有什麼不對FETCH_INTO

+0

我最近通過使用PDO定義對象,對我的這種方式去和獲取方法來填充對象是最方便的,我可以看到。 – user544262772 2013-05-23 07:51:22

回答

14

你在你的代碼的兩個錯誤:)

1)你忘了$ Q->取(

... 
$q->execute(array($id)); 
$q->fetch(); // This line is required 

2)但是,即使加上$ Q-後>取(),你會得到這個:

Fatal error: Cannot access private property User::$name in ...

所以,正如你所看到的,即使在類方法中調用PDO也不能訪問私有成員。

這裏是我的解決方案:

... 
$q->execute(array($id)); 
$q->setFetchMode(PDO::FETCH_ASSOC); 
$data = $q->fetch(); 
foreach ($data as $propName => $propValue) 
{ 
    // here you can add check if class property exists if you don't want to 
    // add another properties with public visibility 
    $this->{$propName} = $propValue; 
} 
+2

你也可以把'$ name'變成一個公共變量。它聽起來像一個。 – Matchu 2010-07-21 04:03:37

+3

添加公共性質並不總是好主意 – Serg 2010-07-21 04:48:08

+0

+這個例子是超級有幫助 – Nathan 2012-02-26 01:16:34