php - PDO 获取单个类不起作用

标签 php pdo

我正在制作一个数据库抽象类,它像 ORM 一样绑定(bind)对象。我在特殊情况下遇到问题,获取单行并绑定(bind)到一个类。虽然同样可以很好地使用 fetchAll() 我无法弄清楚为什么使用 fetch(PDO::FETCH_CLASS) 对象返回 null。 如果我使用 PDO::FETCH_LAZY 它可以工作,但不是对传递的类的正确绑定(bind)。 这是代码。 Database() 类使用 PDO 连接到数据库。 Products() 是一个由与表同名的公共(public)属性组成的类。 Controller :

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");

}

数据库类:

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->statement 方法的抽象,因为 pdo 和 stm 是 db 类实例变量。

最佳答案

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

我没有直接使用 PDO::FETCH_CLASS、$Class,而是使用 setFetchMode() 传递 PDO_FETCH_INTO、新的 $Object 实例。

这会正确返回给定对象的新实例(具有对象方法和字段)。与公共(public)属性和重载构造函数配合良好。

之前的声明“findAll() Works”不是真的,我以某种方式返回类似 FETCH_OBJ 的数据,数据库表的对象表示。

解决方案如下:

public function fetchSingleObject($object) {
    $this->stm->setFetchMode(PDO::FETCH_INTO, new $object());
    $this->execute();
    return $this->stm->fetch();
}

返回传入对象的新实例。

也可用作 fetchAll()

编辑:

public function fetchObjectSet($object) {

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

关于php - PDO 获取单个类不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32526575/

相关文章:

php - 开奖号码分析

php - 如何将 Rgraph 与 PHP 和 MySQL 集成?

php - 准备好的 PDO 查询返回 0 个受影响的行

php - 在 PHP 中使用 PDO 绑定(bind) decimal/double/float 值的最佳方法是什么?

php - 使用 PDO MySQL 编译 PHP 5.1.6

php - 一个 PHP 文件中的多个 MySQL 查询

javascript - 如何使用 PHP 加载 html 文件来替换全 ajax 站点中的部分页面?

javascript - 如何在表单操作或 window.location(PHP) 中使用数据切换?

php - jquery jtable 与tinymce

php - 使用 PDO 语句更新 mysql 时遇到问题