2010-07-21 15 views
7

Quiero poblar clase con el constructor usando FETCH_INTO de PDO:

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

Esto no funciona. Ningún error, solo nada. El script no tiene errores, FETCH_ASSOC funciona bien.

¿Qué ocurre con FETCH_INTO?

+0

Recientemente fui a través de esta forma de definir los objetos, para mí el uso de DOP y el método para llenar los objetos es el más conveniente pude ver captación. – user544262772

Respuesta

14

usted tiene dos errores en su código:

1) Se le olvido $ q-> fetch()

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

2), pero incluso después de la adición de $ q-> fetch() se le conseguir esto:

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

Por lo tanto, como se puede ver, PDO no puede acceder a los miembros privados, incluso si se llama método de clase en el interior.

Aquí está mi solución:

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

También puede simplemente hacer que '$ name' sea una variable pública. Seguro que suena como uno. – Matchu

+3

Agregar propiedades públicas no siempre es buena idea – Serg

+0

+ este ejemplo fue super útil – Nathan

Cuestiones relacionadas