2010-07-21 41 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