3 кило
Требуется PHP5 + mysqli
Библиотека представляет собой расширение над mysqli.
Дополнения сделаны в стиле предыдущей версии либы.
Основное отличие от предыдущей версии в том, что вместо одного статического класса используются объекты, что позволяет работать в одном сценарии с несколькими базами. Кроме того, класс DB является расширением над mysqli, что позволяет использовать все mysqli-методы (хотя некоторые изменены).
[size=11]Конструктор[/size]
Конструктор совпадает с mysqli-конструктором.
Единственное отличие — в случае ошибочного подключения генерируется исключение DBExceptionConnect.
try {
$db = new DB('localhost', 'test', 'test', 'test');
$db->select('table'); // Используем методы библиотеки
$db->autocommit(true); // Использует обычные методы mysqli
$db->query('select * from ?t', Array('table'), 'assoc'); // Используем переопределенный метод
} catch (DBExceptionConnect $e) {
print 'error';
}
[size=11]Запрос к базе[/size]
Для запроса используется метод query(), переопределенный в DB.
Метод real_query() не переопределен, его можно продолжать использовать в стиле mysqli.
mixed query(string $pattern [, array $data [, int $fetch [, $prefix])
Аргументы практически аналогичны старому DB::query.
Отличия:
Теперь формат результата указывается не в виде констаны (DB::fAssoc), а в виде строки (регистронезависимой): "no", "id", "ar", "num", "row", "assoc", "col", "irow", "iassoc", "icol", "rowrow", "rowassoc", "el". Убран "bool" - в нем и раньше особого смысла не было.
Добавлен параметр prefix, позволяющий указывать префикс имен таблиц только для данного запроса, не затрагивая префикс по умолчанию, устанавливаемый методом setPrefix().
$db->query('insert into ?t (?c,?c,?c) values(?,?,?i)', Array('table', 'one', 'two', 'three', 'value1', 'value2', 3), 'id');
[size=11]setPrefix, setDebug[/size]
Как и в прошлой либе позволяют установить префикс имен таблиц (добавляются к именам при использовании плейсхолдера ?t) и вывод запросов в браузер.
[size=11]makeQuery и fetch[/size]
string makeQuery(string $pattern, array $data) - формирование sql-запроса на основании шаблона и входных данных
mixed fetch(mysqli_result $result, string $fetch) - разбор результата запроса в нужном формате
Вспомогательный методы, используемые в query(). Вынесены в public, так как могут быть полезны при обработке мультизапросов:
$sql = Array(
$db->makeQuery('select ?c from ?t where ?c=?i', Array('one', 'tbl', 'id', 1)),
$db->makeQuery('select ?c from ?t where ?c=?i', Array('two', 'tbl', 'id', 2)),
$db->makeQuery('select ?c from ?t where ?c=?i', Array('two', 'tbl', 'id', 3)),
);
$sql = implode(";\r\n", $sql);
#select `one` from `tbl` where `id`>=5;
#select `two` from `tbl` where `id`>=15;
#select `two` from `tbl` where `id`>=25
if ($db->multi_query($sql)) {
do {
var_dump($db->fetch($db->store_result(), 'el'));
} while ($db->next_result());
}
При таком обращении в fetch() недоступны форматы "id" (последний автоинкремент) и "ar" (количество затронутых записей), так как они не привязаны к результату.
На специфические методы забил.
[size=11]Исключения[/size]
По сравнению с прошлым разом иерархия исключений несколько изменена.
Убраны DBExceptionConnectHost и DBExceptionConnectBase. Оставлен один DBExceptionConnect.
DBExceptionConfig и производные убраны, так как используются различные базы.
DBExceptionData и производные оставлены как были.
Добавлены DBExceptionDB и производные DBExceptionDBAlready, DBExceptionDBNotFound о чем ниже.
[size=11]Итераторы[/size]
По сравнению с прошлым разом для итераторов (возвращаемый формат "irow", "iassoc", "icol") реализован интерфейс ArrayAccess. То есть их можно не просто перебирать в foreach(), но и получать данные обычным "массивным" синтаксисом:
$res = $db->query('select * from ?t', Array('table'), 'iassoc');
print 'Столбец ONE для 4-й строки: '.$res[3]['one'];
[size=11]Пространство имен[/size]
Чтобы объекты баз не болтались по глобальному пространству имен их можно хранить непосредственно в классе DB.
setDB(DB $db, string $name) - сохраняет в DB объект базы под именем name.
getDB(string $name) - возвращает объект базы с заданным именем
make(string $host, string $user, string $password, string $dbname, string $name) - создает базу с заданными параметрами и сохраняет её у себя.
Параметр $name можно не указывать, тогда вместо него будет использоваться определенное базовое имя. Что удобно при использовании одной базы в сценарии (или одной основной базы).
// В начале
DB::make('localhost', 'test', 'test', 'test');
// Где-то в недрах программы
$db = DB::get();
$db->query('…');
$db->query('…');
либо
// В начале
DB::make('localhost', 'test', 'test', 'test1', 'one');
DB::make('localhost', 'test', 'test', 'test1', 'two');
// Где-то в недрах программы
$db = DB::get('one')->query('…');
$db = DB::get('two')->query('…');
При попытке создать базу с уже существующем именем или запросить несуществующую, генерируются исключения DBExceptionDBAlready, DBExceptionDBNotFound.
Основной метод (query) так же реализован и в статическом виде (queryDB), последним параметром так же добавляется имя базы.
DB::queryDB('select ?c from ?t', Array('id', 'table'), 'el'); // И не надо париться с объектами.