2010-07-21 3 views
7

funktioniert Ich möchte mit Konstruktor FETCH_INTO von PDO-Klasse füllen mit:

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

Dies funktioniert nicht. Kein Fehler, nur nichts. Skript hat keine Fehler, FETCH_ASSOC funktioniert gut.

Was ist los mit FETCH_INTO?

+0

ich vor kurzem durch diese Art und Weise ging Objekte zu definieren, für mich PDO verwenden und die Abrufmethode Objekte zu füllen ist die bequemste ich sehen konnte. – user544262772

Antwort

14

Sie haben zwei Fehler im Code:

1) Sie haben vergessen q- $> holen()

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

2) Aber auch nach q- $ Hinzufügen> holen() finden Sie erhalten diese:

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

so, wie Sie sehen können, können PDO Zugriff nicht private Mitglieder, selbst wenn es in der Klasse Methode aufgerufen wird.

Hier ist meine Lösung:

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

Sie können auch '$ name' eine öffentliche Variable machen. Es klingt sicher wie einer. – Matchu

+3

Hinzufügen von öffentlichen Eigenschaften ist nicht immer eine gute Idee – Serg

+0

+ dieses Beispiel war super hilfreich – Nathan