В первую очередь при разработке информационной системы, надо автоматизировать работу с базой данных.
И самое базовые, что нужно сделать, это создать генератор запросов к базе данных.
Для этого понадобится описать такие понятие, как:
- База данных
- Таблица
- Столбец
- Запрос к базе данных
Сегодня я начинаю работать над первым пунктом и создаю первые наработки по подключению к базе данных.
Для подключения к базе данных я буду использовать 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