繁体   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