Skip to content
AntonShevchuk edited this page Oct 6, 2014 · 22 revisions

Описание

Удобная обертка для 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");

Результат:

42

Выбираем одну строку 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');
}
Clone this wiki locally