2010-07-21 3 views
7

voglio riempire di classe con il costruttore utilizza FETCH_INTO della DOP:

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

Questo non funziona. Nessun errore, solo niente. Lo script non ha errori, FETCH_ASSOC funziona correttamente.

Cosa c'è che non va con FETCH_INTO?

+0

Ho recentemente ha attraversato questo modo di definire gli oggetti, per me utilizzando DOP e il metodo per riempire gli oggetti è il più conveniente vedevo recupero. – user544262772

risposta

14

Hai due errori nel codice:

1) Avete dimenticato $ q-> fetch()

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

2), ma anche dopo l'aggiunta di $ q-> fetch() Avrete ottenere questo:

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

Quindi, come si può vedere, DOP non può accedere ai membri privati, anche se viene chiamato all'interno metodo di classe.

Ecco la mia soluzione:

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

Puoi anche rendere '$ name' una variabile pubblica. Suona sicuramente come uno. – Matchu

+3

L'aggiunta di proprietà pubbliche non è sempre una buona idea – Serg

+0

+ questo esempio è stato super utile – Nathan