簡體   English   中英

PDO PHP Fetch Class

[英]PDO PHP Fetch Class

我正在學習pdo中的pdo,以便使數據庫訪問更容易和更有效。我讀過fetch _class的一個解釋是你的對象的屬性是在調用構造函數之前設置的。這是什么意思? 任何方向都非常感謝。

這意味着當使用PDO將結果返回到自定義對象時,您需要設置與查詢結果鍵對應的成員變量。

如:

class User
{
    //Predefine Here
    public $id;
    public $username;
    public $password;
    public $email;
    public $hash;

    public function profileLink()
    {
         return sprintf('<a href="/profile/%s">%s</a>',$this->id,$this->username);
    }
}

$result = $sth->fetchAll(PDO::FETCH_CLASS, "User");
foreach($result as $user)
{
    echo $user->profileLink();
}

這樣,PDO可以將變量設置為其內部范圍之外的對象。

如果您的用戶類是這樣的:

class User
{
}

然后PDO將無法從范圍外設置值,因為沒有定義屬性。

假設你有這個代碼的snippit

<?php
class Foo {
    public $bar;

    public function __construct()
    {
        $this->bar = 1;
    }
}

$stmt = $dbh->prepare("SELECT bar FROM foo");
$stmt->setFetchMode(PDO::FETCH_CLASS, 'Foo'); 
$stmt->execute();
$obj = $stmt->fetch()
?>

$ obj的條形圖將被設置為“1”而不是從數據庫中檢索到的內容。

如果您希望將其設置為數據庫而不是“1”的結果,則可以將獲取模式更改為

$stmt->setFetchMode(PDO::FETCH_CLASS|PDO::FETCH_PROPS_LATE, 'Foo'); 

這會導致在將結果分配給屬性之前調用構造函數

回顧一下PDO :: FETCH_CLASS,你真的不需要將變量定義為public或private(從PHP 7.0開始),你可以定義一個空類,PHP PDO會將屬性填充為$ Class->屬性,即使它們沒有定義。

這非常有用,因為您可以重用具有多個查詢的類來處理同一個表但可能返回不同的列

而不是使用: FetchAll(PDO::FETCH_CLASS, 'classname')您可以使用: fetchObject('classname')

例:

class Car extends DatabaseTable {

const TABLE_NAME = 'cars';

// Table Columns
private $color;
private $brand;
private $type;

public function __construct($pdo, $id = false)
{
    parent::__construct($pdo, TABLE_NAME, $id);
}

public static function getAll($pdo, $order = 'id') {
    $query =   'SELECT * FROM ' . self::TABLE_NAME . ' 
                ORDER BY ' . $order;

    $statement = $pdo->prepare($query);

    $objects = [];
    while ($obj = $statement->fetchObject(self::class, [$pdo])) {
        $objects[$obj->getId()] = $obj;
    }
    return $objects;
}

父構造函數只設置其3個屬性,如: $this->id = $id;

暫無
暫無

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

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