Подтвердить что ты не робот

PDO PHP Fetch Class

Я изучаю pdo в php, чтобы сделать доступ к базе данных более простым и эффективным. Одно объяснение, которое я прочитал для fetch, - это то, что свойства вашего объекта установлены до того, как вызывается конструктор. Что это значит? Любое направление приветствуется.

4b9b3361

Ответ 1

Это означает, что при использовании 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 не сможет установить значения извне области видимости, поскольку не определены свойства.

Ответ 2

Скажите, что у вас есть этот фрагмент кода

<?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()
?>

Свойство bar для $obj будет установлено на "1", а не на то, что было восстановлено из базы данных.

Если вы хотите, чтобы он был установлен на результат из базы данных вместо "1", вы можете изменить режим выборки на

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

Это приводит к вызову конструктора перед назначением результатов свойствам

Ответ 3

Оглядываясь на PDO:: FETCH_CLASS, вам не нужно определять переменные как общедоступные, так и частные (с PHP 7.0), вы можете определить пустой класс, а PHP PDO будет заполнять атрибуты как $Class- > атрибут, даже если они не определены.

это очень полезно, потому что вы можете повторно использовать классы с несколькими запросами, которые обрабатывают одну и ту же таблицу, но могут возвращать разные столбцы.