Db
Описание
Удобная обертка для PDO
Настройка
// config file db.php return array( "connect" => array( "type" => "mysql", "host" => "localhost", "name" => "bluz", "user" => "root", "pass" => "", "options" => array( \PDO::ATTR_PERSISTENT => true ) ), "attributes" => array( \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION ) );
Использование
с версии 0.6.0 изменился способ вызова - теперь рекомендуется использовать Proxy
Соединение
Для настройки соединения следует использовать метод setConnect():
// init settings, not connect! $db->setConnect(array( 'type' => 'mysql', 'host' => 'localhost', 'name' => 'db name', 'user' => 'root', 'pass' => '' ));
Затем можно уже вызвать метод connect() и disconnect() при необходимости.
Метод handler() автоматически вызывает метод connect() и возвращает объект PDO
Квотирование и экранирование переменных
// quote variable $db->quote($id) // quote column name $db->quoteIdentifier($column)
Запросы к БД
Для запросов к БД, которые не требуют возврата данных следует использовать метод query(/*string*/ $sql):
// query $db->query("SET NAMES 'utf8'");
Запросы INSERT, UPDATE и DELETE также идут через метод query() и он вернёт для них количество затронутых строк (см. rowcount).
Выборки
Выбираем один элемент fetchOne(/*string*/ $sql, /*array*/ $params = []):
// get one $db->fetchOne("SELECT COUNT(*) FROM test");
Результат:
Выбираем одну строку fetchRow(/*string*/ $sql, /*array*/ $params = []):
$id = 1; // get row array $db->fetchRow("SELECT * FROM users WHERE id = ". $db->quote($id)); $db->fetchRow("SELECT * FROM users WHERE id = ?", array($id)); $db->fetchRow("SELECT * FROM users WHERE id = :id", array(':id'=>$id));
Результат одинаковый для всех вызовов:
['id'=>1, 'login'=>'admin']
Выборка набора строк fetchAll(/*string*/ $sql, /*array*/ $params = []):
// get array $db->fetchAll("SELECT * FROM users WHERE ip = ?", array('127.0.0.1'));
Результат:
[
['id'=>1, 'login'=>'admin'],
['id'=>2, 'login'=>'user'],
['id'=>3, 'login'=>'another'],
]Получение колонки из таблицы fetchColumn(/*string*/ $sql, /*array*/ $params = []):
// get column $db->fetchColumn("SELECT login FROM users WHERE ip = :ip", array(':ip'=>'127.0.0.1'));
Результатом будет простой одномерный массив содержащий запрашиваемую колонку:
['admin', 'user', 'another']
Получение связки ключ-значение fetchPairs(/*string*/ $sql, /*array*/ $params = []):
// get pairs $db->fetchPairs("SELECT ip, COUNT(id) FROM users GROUP BY ip LIMIT 2");
Результатом будет ассоциативный одномерный массив:
['127.0.0.1' => 3, '192.168.1.1' => 2]
Выборка с группировкой по первому полю fetchGroup(/*string*/ $sql, /*array*/ $params = []):
// get group $db->fetchGroup("SELECT ip, id, login FROM users");
Результатом будет ассоциативный многомерный массив:
[
'127.0.0.1' => [
['id'=>1, 'login'=>'admin'],
['id'=>2, 'login'=>'user'],
['id'=>3, 'login'=>'another'],
],
'192.168.1.1' => [
['id'=>4, 'login'=>'ivanov'],
['id'=>5, 'login'=>'petrov'],
],
]Если вам надо выбрать результат как
"42" => ["id"=>42, "login"=>"Name"], то можно использовать методfetchGroup(), но в дальнейшем обработай запрос$result = array_map('reset', $result);
Выборка колонки с группировкой по первому полю fetchColumnGroup(/*string*/ $sql, /*array*/ $params = []):
// get column by group $db->fetchColumnGroup("SELECT ip, id FROM users");
Результатом будет ассоциативный массив:
[
'127.0.0.1' => [1, 2, 3],
'192.168.1.1' => [4, 5],
]Выборки данных в объекты
Следующие запросы устанавливают fetch mode в \PDO::FETCH_OBJ, \PDO::FETCH_INTO или \PDO::FETCH_CLASS в зависимости от 3-го параметра функции, что позволяет работать нам с результатами выборок как с соответствующими объектами:
// get object // .. to stdClass $stdClass = $db->fetchObject('SELECT * FROM some_table WHERE id = ?', array($id)); // .. to new Some object $someClass = $db->fetchObject('SELECT * FROM some_table WHERE id = ?', array($id), 'Some'); // .. to exists instance of Some object $someClass = $db->fetchObject('SELECT * FROM some_table WHERE id = ?', array($id), $someClass);
Синтаксис использования метода fetchObjects аналогичен приведенному выше, различие заключается лишь в результате.
Дополнительные методы
-
select()- возвращает соответствующий конструктор запроса - select -
insert()- insert -
update()- update -
delete()- delete
Транзакции
// controller code if (Db::transaction(function() { Db::delete('acl_privileges')->execute(); })) { Messages::addSuccess('All data was saved'); } else { Messages::addError('Internal server error'); }