Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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获取单个类不工作_Php_Pdo - Fatal编程技术网

Php PDO获取单个类不工作

Php PDO获取单个类不工作,php,pdo,Php,Pdo,我正在创建一个数据库抽象类,它将对象绑定为ORM。我遇到了一个特殊的问题,获取一行并绑定到一个类。虽然fetchAll()也能很好地工作,但我不明白为什么使用fetch(PDO::fetch_类)时对象返回null。 如果我使用PDO::FETCH_LAZY,它可以工作,但不是对传递的类的正确绑定。 这是代码。 Database()类使用PDO连接到数据库。Products()是由具有相同表名的公共属性组成的类。 控制员: public function editProducts($params

我正在创建一个数据库抽象类,它将对象绑定为ORM。我遇到了一个特殊的问题,获取一行并绑定到一个类。虽然fetchAll()也能很好地工作,但我不明白为什么使用fetch(PDO::fetch_类)时对象返回null。 如果我使用PDO::FETCH_LAZY,它可以工作,但不是对传递的类的正确绑定。 这是代码。 Database()类使用PDO连接到数据库。Products()是由具有相同表名的公共属性组成的类。 控制员:

public function editProducts($params) {
    $products = new Products();
    $db = new Database ();
    $id = array_keys($params);
    $products = $db->findById($products, $id[0]); // auto Bind object fetched=no and POST params?
    $this->template = new Template();
    $this->template->renderArgs("product", $products);
    $this->template->renderArgs("page_title", "Edit product " . $products->title);
    $this->template->render(get_class($this), "editProducts");

}
DB类:

public function findById($object,$id) {
    try {
    $table = $this->objectInjector($object);
    } catch (Exception $e) {
        if (APP_DEBUG) {
            d($e->getTrace());
        }
        return;
    }
    $statement = "SELECT * FROM $table WHERE id=:id";
    $this->stm = $this->pdo->prepare($statement);
    $this->bindValue(":id",$id);
    return $this->fetchSingleObject($object);
}
提取抽象数据的方法:

public function fetchSingleObject($object) {
    $this->execute();
    $this->stm->setFetchMode(PDO::FETCH_CLASS, get_class($object));
    return $this->stm->fetch(PDO::FETCH_CLASS);
    //return $this->stm->fetch(PDO::FETCH_LAZY); this works!
}
我错过了什么?fetchAll()的工作方式如下:

 public function fetchObjectSet($object) {
        $this->execute();
        $this->stm->setFetchMode(PDO::FETCH_CLASS, get_class($object));
        return $this->stm->fetchAll(PDO::FETCH_CLASS);
    }
非常感谢你。 PS:$this->execute()之类的一些方法只是对pdo->statment方法的简化,因为pdo和stm是db类实例变量。

手册说明:

bool PDOStatement::setFetchMode(int$PDO::FETCH_类,字符串 $classname,数组$args)

因此,不妨尝试:

$this->stm->setFetchMode(PDO::FETCH_CLASS, 'get_class', $object );/* is $object an array ? */
or, without
$this->stm->setFetchMode(PDO::FETCH_CLASS, 'get_class' );

我自己找到了这个问题的答案,我把答案贴给大家

我没有直接使用PDO::FETCH_CLASS,$CLASS,而是使用setFetchMode()将PDO_FETCH_传递到新的$Object实例

这将正确返回给定对象的新实例(带有对象方法和字段)。适用于公共属性和重载构造函数

前面的语句“findAll()works”不是真的,我以某种方式返回,就像数据库表的对象表示形式FETCH_OBJ一样

以下是解决方案:

public function fetchSingleObject($object) {
    $this->stm->setFetchMode(PDO::FETCH_INTO, new $object());
    $this->execute();
    return $this->stm->fetch();
}
返回传入对象的新实例

也可以用作fetchAll()

编辑:


否。get_类($object)以字符串形式返回“Products”。因为类抽象对象(类型),所以我传入对象的实例。我还尝试直接将PDO::FETCH_类放入“产品”,但没有解决问题。无论如何,save、delete和fetchAll也是一样的。不知道为什么会得到null,但需要注意的是:
fetchAll()
根据第二个参数返回一个类。它与
setFetchMode()
无关,因此两者之间的比较不准确。我得到了一个具有null属性的对象。类似于使用空值执行构造函数。对象是正确的产品
public function fetchObjectSet($object) {

    $this->execute();
    return $this->stm->fetchAll(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, get_class($object));
}