Чат PHP-разработчиков
Класс для работы с базой данных

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

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

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

Код доступен только после покупки курса ООП в PHP.

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

Код доступен только после покупки курса ООП в PHP.

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

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

Код доступен только после покупки курса ООП в PHP.

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

Код доступен только после покупки курса ООП в PHP.

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

Код доступен только после покупки курса ООП в PHP.

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

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

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

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

Онлайн обучение PHP
Путь с полного нуля до джуниора!
Начать бесплатно
Читайте также
Курс программирования на PHP
Подготовка до уровня устройства на работу!
Начать бесплатно
Комментарии (19)


rusgil

Каждый раз при обращении к БД устанавливается кодировка:

$this->pdo->exec('SET NAMES UTF8');

Зачем это нужно? Если таблицы в БД уже в UTF-8. Или это проверка на случай, если таблицы в другой кодировке? Поясните, пожалуйста, подробнее про кодировки и зачем это делается.
Спасибо.

ivashkevich

Это задаётся кодировка не для самой базы данных, а для соединения, в рамках которого мы будем с базой данных работать. В зависимости от ОС, на которой запущен сервер и дополнительной конфигурации, эта кодировка может отличаться. Нам важно чтобы наш клиент работал с базой в той же кодировке, что и сама база. Иначе мы в результате запросов будем получать кракозябры.

ArtemijeKA

Спасибо.

ArtemijeKA

У меня такой вопрос:
Почему мы используем fetchAll который выводит и индексы и ключи?
Не лучше ли доставать либо только ключи либо только индексы?

ivashkevich

Лучше) Можете сюда написать, как Вы улучшили.

virtual2018

С fetchAll проблема может возникнуть только на больших объемах данных возвращаемых из запроса в БД. Зато, при передаче в шаблон, эта функция становится просто незаменимой, позволяя не писать циклы вручную, и тем самым сократить количество кода.

Todd

http://prntscr.com/lg1k1z тут наверно символ ? лишний

ivashkevich

Нет, это значит либо массив может вернуться, либо null.

Todd

странно, почему то у меня ругается, говорит синтаксическая ошибка (Parse error: syntax error, unexpected '?' in C:\OpenServer\domains\test\app\Services\Db.php on line 24)

ivashkevich

PHP какая версия?

Todd

виноват, версия была 7, надо было повыше поставить , спасибо)

ivashkevich

Не за что)

zenap@inbox.ru

Добрый день. Можно, на ваш взгляд, как то это оптимизировать или это имеет право на жизнь.

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

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

    while ($row = ibase_fetch_object($sth)){
    $resar[] = $row;
    $countar = count($resar);
    $ar = $resar[$countar - 1] -> TEXT;
    $blinfo = ibase_blob_info($ar);
    $blob = ibase_blob_open($ar);
    $bltext = ibase_blob_get($blob, $blinfo[0]);
    $resar[$countar - 1] -> TEXT = $bltext;
    $resar[$countar - 1] = (array)$resar[$countar - 1];

    }
ivashkevich

Выглядит сложновато, рекомендую ознакомиться с другими решениями в комментах.

zenap@inbox.ru

по firebird нет вроде вариантов....

ivashkevich

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

excent63

Можно узнать, для чего существуют такие комментарии?

/** @var Db */

Я где то возможно что то упустил, но погуглив не совсем понимаю для чего они.

ivashkevich

Это используется затем IDEшкой - она знает что это за тип лежит в этом свойстве и даёт подсказки по тому, какие у него есть методы и свойства. Называется это phpdoc.

excent63

Вот теперь понял) спасибо!

Самый понятный курс PHP
Онлайн-уроки в удобное время!
Начать бесплатно
Популярное за сутки
Онлайн-курсы PHP и MySQL
Обучение с полного нуля до уровня джуниора!
Начать бесплатно
Сейчас читают
Онлайн-курсы PHP и MySQL
Обучение с полного нуля до уровня джуниора!
Начать бесплатно
Новые статьи
Логические задачи с собеседований