Php PDO';s FETCH_to$此类不起作用
我想使用PDO的Php PDO';s FETCH_to$此类不起作用,php,pdo,Php,Pdo,我想使用PDO的FETCH_,用构造函数填充类: 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_
,用构造函数填充类:
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\u ASSOC
工作正常
FETCH\u INTO
有什么问题?您的代码中有两个错误:
1) 您忘记了$q->fetch()
2) 但即使在添加$q->fetch()之后,您也会得到以下结果:
致命错误:无法访问专用数据库
属性用户::$name在
所以,正如您所看到的,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;
}
也可以将
$name
设置为公共变量。这听起来确实很有帮助。+这个例子非常有用,但仍然会引发相同的错误:致命错误:无法访问私有属性用户::$name in…
您需要添加一个访问器来设置私有变量。我最近用这种方法定义了对象,对我来说,使用PDO和fetch方法填充对象是我能看到的最方便的方法。
...
$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;
}