DataBase
Библиотека-обертка над стандартным PDO PHP для простой, удобной работы с различными базами данных и с защитой от SQL инъекций
Install / Use
/learn @digitalstars/DataBaseREADME
Комьюнити:
Беседа ВК (Помощь) | Беседа ВК (Лог обновлений) --- | --- |
Почему DataBase?
- Универсальность — Благодаря тому, что DataBase наследуется от
PHP-PDO, её можно использовать с различными БД. - Простота — DataBase включает в себя удобные заполнители, которы серьёзно упрощают работу с SQL запросами. Также частые SQL запросы уже составлены и вынесены в виде методов.
- При использовании Заполнителей, вы полностью защищены от
SQL инъекций.
Функционал
В библиотеке поддерживается:
- Все методы PHP-PDO
- Свои заполнители
- ORM конструкции
Оглавление
- Подключение
- Заполнители
- Настройка PhpStorm
- Хандлер sql запросов
- Типы заполнителей
- Дополнительные методы
- getQueryString
- execCommit
- rows($sql, $args = [], $fetchMode = PDO::FETCH_ASSOC)
- row($sql, $args = [], $fetchMode = PDO::FETCH_ASSOC)
- getById($table, $id, $fetchMode = PDO::FETCH_ASSOC)
- count($sql, $args = [])
- insert($table, $data)
- update($table, $data, $where = [])
- delete($table, $where, $limit = -1)
- deleteAll($table)
- deleteById($table, $id)
- deleteByIds($table, $column, $ids)
- truncate($table)
Подключение
Используя composer
composer require digitalstars/database
require_once "vendor/autoload.php"; //Подключаем библиотеку
Вручную
- Скачать последний релиз
- Подключить
autoload.php
Вот так будет происходить подключение, если ваш бот находится в той же папке, что и папка
DataBase-master
require_once "DataBase-master/autoload.php"; //Подключаем библиотеку
Подключение к СуБД
Синтаксис конструктора базового класса такой же, как и у PHP-PDO
use DigitalStars\DataBase\DB;
$dsn = ''; // Имя источника данных или DSN, содержащее информацию, необходимую для подключения к базе данных.
$login = ''; // Логин
$pass = ''; // Пароль
$options = []; // Массив ключ=>значение специфичных для драйвера настроек подключения.
$db = new DB($dsn, $login, $pass, $options);
Пример подключения к MySQL
use DigitalStars\DataBase\DB;
$db_type = 'mysql'; // Это может быть mysql, sybase или любой другой, в зависимости от вашей СуБД
$db_name = 'test'; // Имя БД
$login = 'root'; // Логин
$pass = 'pass'; // Пароль
$ip = 'localhost'; // Адрес
// С портом по умолчанию
$db = new DB("$db_type:host=$ip;dbname=$db_name", $login, $pass);
// С нестандартным портом
$port = 1234;
$db = new DB("$db_type:host=$ip;port=$port;dbname=$db_name", $login, $pass);
// Подключение с выбором кодировки UTF8
$db = new DB("$db_type:host=$ip;dbname=$db_name;charset=UTF8", $login, $pass);
// Или вот так (советуем использовать этот вариант)
$db = new DB("$db_type:host=$ip;dbname=$db_name;", $login, $pass, [
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'",
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);
// В этом примере, сразу после подключения выполнится SQL запрос "SET NAMES 'utf8'"
Пример подключение к SQLite
use DigitalStars\DataBase\DB;
$db_type = 'sqlite';
$db_path = 'path/to/file/test.sqlite'; // Путь к файлу с базой данных
// Подключение
$db = new DB("$db_type:$db_path");
Что такое заполнители?
Заполнители — специальные типизированные маркеры, которые пишутся в строке SQL запроса вместо явных значений (параметров запроса), чем упрощают читаемость кода и защищают от SQL инъекций.
Заполнители поддерживаются в следующих методах:
- exec()
- execCommit()
- query()
- prepare()
О том как работают эти методы можно посмотреть в PHP-PDO.
<?php
require 'vendor/autoload.php';
use DigitalStars\DataBase\DB;
// Соединение с СУБД SQLite и получение объекта, который включает в себя все методы PHP-PDO и библиотеки
$db = new DB("sqlite:./test.sqlite");
// Получение объекта результата PDOStatement
$result = $db->query("SELECT * FROM users WHERE name = ?s AND age = ?i", ["Василий", 30]);
// Получаем данные (в виде ассоциативного массива)
$data = $result->fetch();
// Не работает запрос? Не проблема - выведите его на печать:
echo $db->getQueryString();
Параметры SQL-запроса, прошедшие через заполнители, обрабатываются специальными функциями экранирования, в зависимости от типа заполнителей. Т.е. вам теперь нет необходимости заключать переменные в функции экранирования типа
quote()или приводить их к числовому типу, как это было раньше
Типы заполнителей и типы параметров SQL-запроса
Типы заполнителей и их предназначение описываются ниже. Прежде чем знакомиться с типами заполнителей, необходимо понять как работает механизм библиотеки DataBase.
$db->query("SELECT ?i", [123]);
SQL-запрос после преобразования шаблона:
SELECT 123
В процессе исполнения этой команды библиотека проверяет, является ли аргумент
123целочисленным значением. Заполнитель?iпредставляет собой символ?(знак вопроса) и первую букву словаinteger. Если аргумент действительно представляет собой целочисленный тип данных, то в шаблоне SQL-запроса заполнитель?iзаменяется на значение123и SQL передается на исполнение.
Поскольку PHP слаботипизированный язык, то вышеописанное выражение эквивалентно нижеописанному:
$db->query("SELECT ?i", '123');
SQL-запрос после преобразования шаблона:
SELECT 123
Т.е. числа (целые и с плавающей точкой) представленные как в своем типе, так и в виде
string— равнозначны с точки зрения библиотеки.
Приведение к типу заполнителя
$db->query("SELECT ?i", '123.7');
SQL-запрос после преобразования шаблона:
SELECT 123
В данном примере заполнитель целочисленного типа данных ожидает значение типа integer, а передается double.
Допускаются следующие преобразования:
- К типу
int(заполнитель?i) приводятся:- Числа с плавающей точкой, представленные как
stringилиdouble bool(true)преобразуется вint(1)bool(false)иnullпреобразуется вint(0)
- Числа с плавающей точкой, представленные как
- К типу
double(заполнитель?d) приводятся:- Целые числа, представленные как
stringилиint bool(true)преобразуется вfloat(1)bool(false)иnullпреобразуется вfloat(0)
- Целые числа, представленные как
- К типу
string(заполнитель?s) приводятся:numericпреобразуется вstringnullпреобразуется вstring(0) ""bool(true)преобразуется вstring(1) "1"bool(false)преобразуется вstring(1) "0"
Это поведение отличается от приведения типа
boolкintв PHP, т.к. зачастую на практикеboolзаписывается в MySql именно как число. - Тип
null(заполнитель?n) просто вставляетNULLв место заполнителя.
Входные параметры не требуются
Настройка PhpStorm
Для того, что-бы IDE нормально реагировала
