kea255 / dbi
Класс для удобной работы с Mysql
1.1.5
2025-07-02 16:18 UTC
Requires
- php: >=7.3
README
Класс для удобной работы с Mysql небольшая обертка к модулю mysqli реализующая:
- placeholder-ы
- авто соединение при первом запросе
- удобные выборки в массив
Установка
composer require kea255/dbi
Добавте в конфигурационный файл вашего проекта константы с вашими данными соединения
const dbhost = 'localhost'; const dbuser = 'username'; const dbpass = 'password'; const dbname = 'databaseName';
Использование placeholder-ов
Простые, скалярные данные, плейсхолдер: ?
$rows = DBi::select('SELECT * FROM tbl WHERE a=? AND b=? AND c=?', 1, 'test', null);
будет выполнен запрос
SELECT * FROM tbl WHERE a=1 AND b='test' AND c=NULL
Массив, плейсхолдер: ?a
$rows = DBi::select('SELECT * FROM tbl WHERE date IN(?a)', ['2006-03-02', '2012-01-02', '2022-05-01']);
будет выполнен запрос
SELECT * FROM tbl WHERE date IN('2006-03-02', '2012-01-02', '2022-05-01')
Ассоциативный массив для запросов типа UPDATE
DBi::query('UPDATE tbl SET ?a', ['id'=>10, 'date'=>"2006-03-02"]);
будет выполнен запрос
UPDATE tbl SET `id`='10', `date`='2006-03-02'
Пример для запроса INSERT
$data = ['id' => 101, 'name' => 'Rabbit', 'age' => 30]; DBi::query('INSERT INTO table(?#) VALUES(?a)', array_keys($data), array_values($data));
будет выполнен запрос
INSERT INTO table(`id`, `name`, `age`) VALUES(101, 'Rabbit', 30)
Пример для запроса INSERT ON DUPLICATE KEY UPDATE
$data = ['id' => 101, 'name' => 'Rabbit', 'age' => 30]; DBi::query('INSERT INTO table(?#) VALUES(?a) ON DUPLICATE KEY UPDATE ?a', array_keys($data), array_values($data), $data);
будет выполнен запрос
INSERT INTO table(`id`, `name`, `age`) VALUES(101, 'Rabbit', 30) ON DUPLICATE KEY UPDATE `id`='101', `name`='Rabbit', `age`='30'
Использование выборок
Выборка всего результата: select()
$rows = DBi::select('SELECT Name, CountryCode FROM City'); foreach($rows as $row){ printf("%s (%s)\n", $row["Name"], $row["CountryCode"]); }
Выборка строки: selectRow()
$row = DBi::selectRow('SELECT Name, CountryCode FROM City LIMIT 1'); printf("%s (%s)\n", $row["Name"], $row["CountryCode"]);
Выборка столбца: selectCol()
$names = DBi::selectCol('SELECT Name FROM City'); foreach($names as $name){ printf("%s\n", $name); }
Выборка ячейки: selectCell()
$name = DBi::selectCell('SELECT Name FROM City WHERE CountryCode=?', 'RU'); printf("%s\n", $name);
Можно использовать временные таблицы
DBi::query('CREATE TEMPORARY TABLE t1 SELECT Name, CountryCode FROM City'); $rows = DBi::select('SELECT * FROM t1'); foreach($rows as $row){ printf("%s (%s)\n", $row["Name"], $row["CountryCode"]); }
Экономия памяти для больших выборок
Можно получать результат по одной строке, не загружая всю выборку в память
$result = DBi::query('SELECT Name, CountryCode FROM City'); while($row = $result->fetch_assoc()){ printf("%s (%s)\n", $row["Name"], $row["CountryCode"]); } $result->free();
Логирование запросов
DBi::$query_log_file = __DIR__.'/db_log.txt';
Не останавливать скрипт при ошибках SQL
DBi::$skip_error = true;
Получить число строк, затронутых INSERT, UPDATE, REPLACE или DELETE запросом.
echo DBi::query_cnt('UPDATE table SET dat=NOW() WHERE id IN(13,17)');
Транзакции
Пример ускорения обновления большого количества строк в цикле
$cnt = 0; $query_in_trans = 10000; DBi::transaction(); while($reader->read()){ $cnt++; if($cnt % $query_in_trans == 0){ DBi::commit(); DBi::transaction(); } DBi::query("UPDATE `table` SET ?a WHERE id=?", $data, $id); } DBi::commit();