Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php PDO';s FETCH_to$此类不起作用_Php_Pdo - Fatal编程技术网

Php PDO';s FETCH_to$此类不起作用

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:

我想使用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;
}