Я хочу заполнить класс конструктором, используя FETCH_INTO
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; } }
Это не работает. Нет ошибки, просто ничего. У FETCH_ASSOC
нет ошибок, FETCH_ASSOC
отлично работает.
Что случилось с FETCH_INTO
?
В вашем коде две ошибки:
1) Вы забыли $ q-> fetch ()
... $q->execute(array($id)); $q->fetch(); // This line is required
2) Но даже после добавления $ q-> fetch () вы получите следующее:
Неустранимая ошибка: не удается получить доступ к частной собственности 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; }