我正在学习pdo中的pdo,以便使数据库访问更容易和更有效。我读过fetch _class的一个解释是你的对象的属性是在调用构造函数之前设置的。这是什么意思?任何方向都非常感谢。
答案 0 :(得分:42)
这意味着当使用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将无法从范围外设置值,因为没有定义属性。
答案 1 :(得分:33)
假设你有这个代码片段
<?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');
这会导致在将结果分配给属性
之前调用构造函数答案 2 :(得分:3)
回顾PDO :: FETCH_CLASS,你真的不需要将变量定义为public或private(从PHP 7.0开始),你可以定义一个空类,PHP PDO将这些属性填充为$ Class-&gt ;属性,即使它们没有定义。
这非常有用,因为您可以重用具有多个查询的类来处理同一个表但可能返回不同的列
答案 3 :(得分:0)
而不是使用: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;