Про web-разработку
Для программистов, фрилансеров, предпринимателей
Инструменты

ModuleBZ. Шаг 1. Подключение к БД

В первую очередь при разработке информационной системы, надо автоматизировать работу с базой данных.

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

Для этого понадобится описать такие понятие, как:

  • База данных
  • Таблица
  • Столбец
  • Запрос к базе данных

Сегодня я начинаю работать над первым пунктом и создаю первые наработки по подключению к базе данных.

Для подключения к базе данных я буду использовать php-библиотеку PDO, которая отвечает за генерацию безопасных SQL-запросов, и у неё уже есть готовые функции для работы с PostgreSQL

В классе я буду использовать fluent функции. Они позволяют использовать цепочки вызовов, так как каждая из этих функций возвращает в качестве результата ссылка на исходный объект, который её вызывает.

Например:

$db->connect()->disconnect()->reconnect();

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

$db->connect()
    ->disconnect()
    ->reconnect();

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

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

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

Чтобы переменные не были бы случайно изменены разработчиками, они все объявляются как protected.

Первичный набор переменных выглядит так:

class DB {
    /** @var PDO ссылка на подключение к БД */
    protected $DB = null;
    /** @var int переменная для подсчёта времени всех запросов всех соединений */
    protected static $totals_time = 0;
    /** @var int переменная для подсчёта времени всех запросов текущего соединения */
    protected $total_time = 0;
    /** @var int переменная для подсчёта времени сколько ушло на соединение с базой данных */
    protected $connect_time = 0;

    /** @var bool кэшировать ли все запросы, по умолчанию да */
    protected $isQueryLog = true;
    /** @var array кэшируем все запросы */
    protected $query_log = [];

    /** @var string название базы данных */
    protected $dbname;
    /** @var string имя пользователя */
    protected $username;
    /** @var string пароль пользователя */
    protected $password;
    /** @var string адрес базы данных */
    protected $host='127.0.0.1';
    /** @var int порт доступа к базе данных */
    protected $port=5432;
    /** @var array дополнительные опции соединения с базой данных */
    protected $options = [];
}

Затем создаём конструктор и основные функции для работы с базой данных - подключение к ней, и отключение. И возможность переподключиться, она понадобится при смене каких-либо опций, используемых в конструкторе.

class DB{
    //...
    /**
     * DB constructor.
     * @param string $dbname
     * @param string $username
     * @param string $password
     * @param string $host
     * @param int $port
     * @param array $options @see PDO
     */
    function __construct(string $dbname,
                         string $username,
                         string $password,
                         string $host = '127.0.0.1',
                         int    $port = 5432,
                         array  $options = []){
        $this->dbname    = $dbname;
        $this->username  = $username;
        $this->password  = $password;
        $this->host      = $host;
        $this->port      = $port;
        $this->options   = $options;

        $this->connect();
    }

    /**
     * Функция подключения к базе данных, с хранящимися настройками
     * @return DB
     */
    function connect(){
        $dsn = "pgsql:host=".$this->host.";port=".$this->port.";dbname=".$this->dbname;
        $time = microtime(true);
        $this->DB = new PDO($dsn,$this->username,$this->password, $this->options);
        $this->connect_time = microtime(true)-$time;
        return $this;
    }
    /**
     * Функция отключения от базы данных
     * @return DB
     */
    function disconnect():DB{
        $this->DB = null;
        return $this;
    }
    /**
     * функция переподключения к базе данных
     * @return DB
     */
    function reconnect():DB{
        $this->disconnect();
        $this->connect();
        return $this;
    }

    //...
}

Ссылка на репозиторий modulebz/db

Поделиться:

ModuleBZ. Шаг 1. Подключение к БД
ModuleBZ. Шаг 1. Подключение к БД