Skip to content
Anton edited this page Dec 19, 2013 · 22 revisions

Описание

Удобная обертка для PDO

Настройка

<?php
// configuration example
"db" => 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
    ),
    "defaultAdapter" => true
),

Использование

Соединение

<?php
// init settings, not connect!
$db->setConnect(array(
    'type' => 'mysql',
    'host' => 'localhost',
    'name' => 'db name',
    'user' => 'root',
    'pass' => ''
));

Квотирование и экранирование переменных

<?php
// quote variable
$db->quote($id)
// quote column name
$db->quoteIdentifier($column)

Запрос

<?php
// query
$db->query("SET NAMES 'utf8'");

Выборки

Выбираем один элемент:

<?php
// get one
$db->fetchOne("SELECT COUNT(*) FROM test");

Результат:

42

Выбираем одну строку:

<?php
$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']

Выборка массива строк:

<?php
// 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'],
]

Получение колонки из таблицы:

<?php
// get column
$db->fetchColumn("SELECT login FROM users WHERE ip = :ip", array(':ip'=>'127.0.0.1'));

Результатом будет простой одномерный массив содержащий запрашиваемую колонку:

['admin', 'user', 'another']

Получение связки ключ-значение:

<?php 
// 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]

Выборка с группировкой по первому полю:

<?php 
// 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'],
    ], 
]

Выборка колонки с группировкой по первому полю:

<?php 
// 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-го параметра функции:

<?php
// 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);

Дополнительные методы

  • select() - возвращает соответствующий конструктор запроса - select
  • insert() - insert
  • update() - update
  • delete() - delete

Транзакции

<?php
// controller code
if ($this->getDb()->transaction(function() {
    /**
     * @var \Bluz\Application $this
     */
    $this->getDb()->delete('acl_privileges');
})) {
    $this->getMessages()->addSuccess('All data was saved');
} else {
    $this->getMessages()->addError('Internal server error');
}

Clone this wiki locally