PDO PHP Fetch Class - PullRequest
       3

PDO PHP Fetch Class

41 голосов
/ 28 февраля 2011

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

Ответы [ 4 ]

45 голосов
/ 28 февраля 2011

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

34 голосов
/ 09 июня 2012

Допустим, у вас есть этот фрагмент кода

<?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'); 

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

3 голосов
/ 09 марта 2016

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

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

0 голосов
/ 14 июня 2018

Вместо использования: 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;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...