zyxus/db

PHP Wrapper for MySQL PDO

dev-master 2020-05-15 17:28 UTC

This package is auto-updated.

Last update: 2024-04-16 03:01:44 UTC


README

Небольшой класс оберкта для PDO. Был разработан для служебных нужд, с целью облегчения перехода на PDO. Конструктор запросов расширяет функционал использования PDO.

Установка

Установка через Composer.

$ composer require zyxus/db

Оглавление

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

DB::query()

Возвращает результат true - если запрос выполнен, false - если запрос ничего не вернул. В случае ошибки выбрасывается исключение и выводится скрипт и строка ошибки и описание ошибки.

bool DB::query($query);

rowCount()

Возвращает количество обработанных запросом строк

$count = DB::query($query)->rowCount();

fetch()

Возвращает 1 строку с результатом запроса

$count = DB::query($query)->fetch();

fetchAll()

Возвращает все строки с результатами запроса

$count = DB::query($query)->fetch();

lastInsertId()

Возвращает последний вставленный запросом id

$count = DB::instance()->lastInsertId();

Подготовленные выражения (prepared statements)

Использование prepared statements укрепляет защиту от SQL-инъекций.

Prepared statement — это заранее скомпилированное SQL-выражение, которое может быть многократно выполнено путем отправки серверу лишь различных наборов данных. Дополнительным преимуществом является невозможность провести SQL-инъекцию через данные, используемые в placeholder’ах.

Безымянные placeholder’ы (?)

$query = "SELECT `field1`, `field2` FROM `table` WHERE `id` = ? AND `field3` = ?";
$params = [100, 'Y'];
$data = DB::query($query, params)->fetch();

Именные placeholder’ы (:placeholder_name)

$query = "SELECT `field1`, `field2` FROM `table` WHERE `id` = :id AND `field3` = :field3";
$params = [
    ':id' => 100,
    ':field3' => 'Y',
];
$data = DB::query($query, params)->fetch();

Выборка результатов запроса SELECT

Выбор одной строки fetch()

$query = "SELECT `field` FROM `table` WHERE `id` = :id";
$articul = DB::query($query, [':id' => 2797])->fetch(); // если не указан PDO::FETCH_NUM то вернется ассоциативный массив

Возвращает

[
    [id] => 1234
    [name] => Название поля
]
// или если в fetch(PDO::FETCH_NUM) то вернется нумерованный массив
[
    [0] => 1234
    [1] => Название поля
]

Выбор всех результатов запроса fetchAll()

$data = DB::query($query)->fetchAll();

Выбор варианта возвращаемых индексов FETCH_STYLE

Выборка ассоциативного массива данных

$data = DB::query($query)->fetchAll(PDO::FETCH_ASSOC);

Возвращает

[
    [0] => Array
        (
            [id] => 1234
            [name] => Название поля 1
        )
    [1] => Array
        (
            [id] => 1235
            [name] => Название поля 2
        )
    [2] => Array
        (
            [id] => 1236
            [name] => Название поля 3
        )
]

Выборка нумерованного массива данных

$data = DB::query($query)->fetchAll(PDO::FETCH_NUM);

Возвращает

[
    [0] => Array
        (
            [0] => 1234
            [1] => Название поля 1
        )
    [1] => Array
        (
            [0] => 1235
            [1] => Название поля 2
        )
    [2] => Array
        (
            [0] => 1236
            [1] => Название поля 3
        )
]

Проверка результатов запроса

$query = "SELECT `id`, `name` FROM `table` WHERE `id` = ?";
if (!$array = DB::query($query, [$id])->fetchAll()) {
    echo "Нет записей";
}
$query = "SELECT `name` FROM `table` WHERE `id` = ?";
$result = DB::query($query, [$articul]);

if ($result->rowCount() > 0) {

    $row = $result->fetch();
    echo $row['name'];

} else {

    echo "Empty results";
}

Вставка строки в таблицу INSERT

$query = "
    INSERT INTO `table` (
        `id`,
        `title`
    ) VALUES (
        NULL,
        :title
    );
";
$params = array(
    ':title' => $title,
);
DB::query($query, $params);

Синтаксис INSERT ON DUPLICATE KEY UPDATE

INSERT INTO 
    `table` 
SET 
    `field1` = :field1, 
    `field2` = :field2 
ON DUPLICATE KEY UPDATE 
    `field2` = VALUES(`field2`)

Конструктор запросов

Пример

$menu = DB::table('table')
    ->fields('table.id, table.name, table_parent.name as parent')
    ->limit(2, 2)
    ->order('table.id');

$menu->join('table', 'table_parent.id', 'table.parent_id', null, 'table_parent');
$menu->where('table.articul', '', '<>');
$products = $menu->exec();

table($table)

Установка таблицы

$query = DB::table('table');

fields($fields)

Назначаем поля таблицы

$query->fields('table.field1, table.field2');

join($table, $field1, $field2, $condition = ' = ', $alias = '')

$query->join('table', 'table.id', 'table.parent_id', null, 'table_alias');

innerJoin($table, $field1, $field2, $condition = ' = ', $alias = '')

Аналогичен join.

where($field, $value, $condition = ' = ', $combine_condition = 'AND')

$query->where('table.title', '', '<>');

whereRaw($where)

$query->whereRaw('id = :id');

order($field, $direction = 'ASC')

Сортировка по полю $field с направлением $direction

$query->order('id');

limit($limit, $from = '0')

Выбор $limit записей начиная от $from

$query->limit(10);

exec()

Выполнение подготовленного запроса

$products = $query->exec();