簡體   English   中英

PDO 獲取單個類不起作用

[英]PDO fetch single class not working

我正在制作一個數據庫抽象類,它可以像 ORM 一樣綁定對象。 我在特定情況下遇到問題,獲取單行並綁定到一個類。 雖然同樣適用於 fetchAll(),但我無法弄清楚為什么使用 fetch(PDO::FETCH_CLASS) 對象返回 null。 如果我使用 PDO::FETCH_LAZY 它可以工作,但不是對傳遞的類的正確綁定。 這里是代碼。 Database() 類使用 PDO 連接到 db。 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");

}

數據庫類:

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

抽象fetch的方法:

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 類實例變量。

我自己找到了這個問題的答案,我把答案貼出來給大家。

我沒有直接使用 PDO::FETCH_CLASS, $Class,而是使用 setFetchMode() 傳遞 PDO_FETCH_INTO,新的 $Object 實例。

這將正確返回給定對象的新實例(帶有對象方法和字段)。 適用於公共屬性和重載的構造函數。

先前的語句“findAll() 工作”不是真的,我以某種方式返回了 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));
}

該手冊指出:

bool PDOStatement::setFetchMode ( int $PDO::FETCH_CLASS , string $classname , array $ctorargs )

所以也許嘗試:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM