kea255/dbi

Класс для удобной работы с Mysql

1.1.5 2025-07-02 16:18 UTC

This package is auto-updated.

Last update: 2025-08-02 16:28:03 UTC


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();