Класс для работы с базой данных

29.06.2018 в 19:18
17379
+982

В этом уроке мы с вами научимся работать с базой данных в ООП-стиле. Как мы с вами уже говорили в уроке о взаимодействии PHP и MySQL, в современном PHP для работы с базами данных принято использовать PDO.

Так как мы учимся работать в ООП-стиле, то, как вы уже наверное догадались, мы будем использовать для соединения и работы с базой данных специальный класс. Давайте создадим в нашем проекте папку src/MyProject/Services и внутри неё создадим класс Db.php
src/MyProject/Services/Db.php

<?php

namespace MyProject\Services;

class Db
{

}

Давайте также создадим файл с настройками для подключения к базе данных. Он будет представлять собой простой массив.
src/settings.php

<?php

return [
    'db' => [
        'host' => 'localhost',
        'dbname' => 'my_project',
        'user' => 'root',
        'password' => '',
    ]
];

Если у вас как и у меня установлен OpenServer, то настройки будут такими же. Иначе – задавайте здесь свои настройки.

Теперь давайте в конструкторе нашего класса установим соединение с базой данных. Мы будем работать через PDO, подробнее об этом читайте в статье Взаимодействие PHP и MySQL.
src/MyProject/Services/Db.php

<?php

namespace MyProject\Services;

class Db
{
    /** @var \PDO */
    private $pdo;

    public function __construct()
    {
        $dbOptions = (require __DIR__ . '/../../settings.php')['db'];

        $this->pdo = new \PDO(
            'mysql:host=' . $dbOptions['host'] . ';dbname=' . $dbOptions['dbname'],
            $dbOptions['user'],
            $dbOptions['password']
        );
        $this->pdo->exec('SET NAMES UTF8');
    }
}

Свойство $this->pdo теперь можно использовать для работы с базой данных через PDO. Давайте напишем отдельный метод для выполнения запросов в базу.

<?php

namespace MyProject\Services;

class Db
{
    /** @var \PDO */
    private $pdo;

    public function __construct()
    {
        $dbOptions = (require __DIR__ . '/../../settings.php')['db'];

        $this->pdo = new \PDO(
            'mysql:host=' . $dbOptions['host'] . ';dbname=' . $dbOptions['dbname'],
            $dbOptions['user'],
            $dbOptions['password']
        );
        $this->pdo->exec('SET NAMES UTF8');
    }

    public function query(string $sql, $params = []): ?array
    {
        $sth = $this->pdo->prepare($sql);
        $result = $sth->execute($params);

        if (false === $result) {
            return null;
        }

        return $sth->fetchAll();
    }
}

Всё, класс для работы с базой данных готов. Давайте теперь попробуем его использовать для вывода статей на сайте прямо из базы.
src/MyProject/Controllers/MainController.php

<?php

namespace MyProject\Controllers;

use MyProject\Services\Db;
use MyProject\View\View;

class MainController
{
    /** @var View */
    private $view;

    /** @var Db */
    private $db;

    public function __construct()
    {
        $this->view = new View(__DIR__ . '/../../../templates');
        $this->db = new Db();
    }

    public function main()
    {
        $articles = $this->db->query('SELECT * FROM `articles`;');
        var_dump($articles);
        //$this->view->renderHtml('main/main.php', ['articles' => $articles]);
    }
}

Давайте посмотрим на результат.

Статьи в виде массива

То есть сейчас $articles – это массив с двумя вложенными элементами-массивами, представляющих собой статьи из базы данных.

Наш класс для работы с базой данных готов. В следующем уроке мы начнём его использовать для вывода статей на сайте.

Текущая версия кода на гитхабе.

loader
29.06.2018 в 19:18
17379
+982
Комментарии
Этот урок набрал набрал достаточно большое количество комментариев и дальнейшее его комментирование отключено. Если вы хотели убедиться в правильности выполнения ДЗ или у вас возник вопрос по уроку, посмотрите ранее добавленные комментарии, кликнув по кнопке ниже. Скорее всего вы найдете там то, что искали. Если это не помогло - задайте вопрос в чате в телеграме - https://t.me/php_zone
Логические задачи с собеседований