2010-07-21 7 views
7

Ben PDO FETCH_INTO kullanılarak yapıcısı ile Sınıfı doldurmak istiyorum:

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; 
    } 
} 

Bu işe yaramaz. Hata yok, sadece hiçbir şey. Komut dosyası hata içermiyor, FETCH_ASSOC iyi çalışıyor.

FETCH_INTO ile ilgili sorun nedir?

+0

Geçenlerde PDO kullanarak benim için nesneleri tanımlama bu şekilde geçti ve nesneleri doldurmak için yöntem Görebildiğim en uygun getirme:

İşte benim çözümdür. – user544262772

cevap

14

iki kodunuzda hata var:

1) Sen (fetch> $ q unuttum)

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

2) Ama $ q ekledikten sonra> sen olacak) (fetch bu olsun:

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

Yani, gördüğünüz gibi, PDO o sınıf yöntemi içinde denir bile özel üye erişemez.

... 
$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

Ayrıca "$ name" genel değişkenini de yapabilirsiniz. Birine benziyor. – Matchu

+3

Genel özellikler eklemek her zaman iyi bir fikir değildir – Serg

+0

+ bu örnek, aynı hatayı atmaya devam eden süper yararlı – Nathan