загрузить данные в сам класс с помощью FETCH_CLASS - PullRequest
0 голосов
/ 07 мая 2019

Я хочу загрузить данные из базы данных (с помощью PDO) и поместить их в класс. Но это должно быть универсальным, поэтому я использую абстрактный класс, который будет делать все основные вещи. И каждый подкласс (1 для каждой таблицы базы данных) должен быть максимально сокращен.

В то же время я хочу сохранить контроль над общими свойствами и функциями.

<code>abstract class myTable {
    protected static $table
    protected static $classname

    public function __construct($id) {
        $pdo = new MyMagicPdoClass();

        $sql  = "SELCT * FROM ".self::$table." WHERE id = {$id}";
        $stmt = pdo->prepare($sql);
        $stmt->execute();
        $result = $stmt->fetchAll(PDO::FETCH_CLASS, self::$classname);

        // Here is my OBJECT in the CLASS-TYPE i want (POINT 1)
        // Show evidence for testing: 
        echo "<pre>",print_r($result),"
"; } } Класс User расширяет myTable { // для каждого доступного поля: property-name = column-name -> as PRIVATE приватный $ id; личное $ FirstName; личное $ LastName; приватная электронная почта $; // избежать автоматического создания свойства (с помощью PDO :: FETCH_CLASS), // использование метода __set () помогает отфильтровать все свойства. // Только свойства (объявленные в этом классе), которые совпадают с именем столбца // будет инициировано. Если этого не сделать, ВСЕ столбцы будут // автоматически создается как свойство класса PUBLIC. // Так что нет управления через Gettes и Setters. публичная функция __set ($ name, $ value) {} публичная функция __construct ($ id = null) { self :: $ classname = __CLASS__; // будет использоваться в абстрактном классе self :: $ table = "tblUser"; // будет использоваться в абстрактном классе // вызываем конструктор родительского класса Родитель :: __ конструкт ($ ID); / ** * Я думаю, ЗДЕСЬ ДОЛЖЕН БЫТЬ ВОЛШЕБНЫМ (ТОЧКА 2) * / } // SETTERS публичная функция setFirstName ($ value) { $ this-> FirstName = $ value; } [...] // ДЖЕТТЕРС публичная функция getFirstName () { вернуть $ this-> FirstName; } [...] // НЕКОТОРЫЕ МЕТОДЫ публичная функция doWhatOnlyThisClassShallDo () {...} }

Пример использования

$id = 234;
$user = new User($id);

echo $user->FirstName;                    // shall be forbidden
echo $user->getFirstName();               // shall be used instead
echo $user->doWhatOnlyThisClassShallDo(); // shall be possible

В родительском конструкторе у меня есть ОБЪЕКТ, который я ищу в $result. Теперь я хочу получить это как результат моего конструктора (см. Пункт 2) из ​​подкласса.

Конечно, теперь я могу вручную загрузить каждое свойство в конструкторе по результату абстрактного класса, но, как написано выше, я хочу, чтобы каждый подкласс был максимально простым. Сверху это то, что все усилия с FETCH_CLASS бесполезны, так как я просто присваиваю значения свойствам в конструкторе подкласса.

Есть предложения? Или я использую неправильный подход?

1 Ответ

0 голосов
/ 08 мая 2019

Итак, вы хотите извлечь строку из базы данных и заполнить каждое значение столбца соответствующим свойством?Кроме того, я уверен, что вы хотите выполнять безопасные и надежные запросы к базе данных .Я думаю, это то, что вы ищете:

abstract class myTable {
    protected static $table
    protected static $classname

    public function __construct($id) {
        $pdo = new MyMagicPdoClass();

        $sql  = "SELECT * FROM " . self::$table . " WHERE id = ?";
        $stmt = $pdo->prepare($sql);
        $stmt->execute([$id]);
        $result = $stmt->fetch(\PDO::FETCH_ASSOC);
        foreach ($result as $k=>$v) {
            if (property_exists($this, $k)) {
                $this->$k = $v;
            }
        }
    }

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