PHP-DbHandler — это библиотека PHP, предназначенная для упрощения взаимодействия с базами данных MySQL. Он предлагает полный набор инструментов для создания и выполнения запросов, управления транзакциями и обработки схемы базы данных через соединения PDO.
Where
и Having
or
и and
операторыУстановите пакет через Composer:
composer require tribal2/db-handler
Начните с создания экземпляра Db
:
use Tribal2 DbHandler Core PDOWrapper ;
use Tribal2 DbHandler Db ;
use Tribal2 DbHandler DbConfig ;
$ config = DbConfig:: create ( ' my_database ' )
-> withUser ( ' username ' )
-> withPassword ( ' password ' )
-> withHost ( ' localhost ' ) // Optional. Default: 'localhost'
-> withPort ( 3306 ) // Optional. Default: 3306
-> withCharset ( ' utf8mb4 ' ); // Optional. Default: 'utf8mb4'
$ pdoWrapper = new PDOWrapper (
$ config ,
// Optional PsrLogLoggerInterface instance.
// $logger, // Default: PsrLogNullLogger
);
$ db = new Db (
$ pdoWrapper ,
// Optional PsrSimpleCacheCacheInterface instance.
// $cache, // Default: NULL
);
Where
и Having
Класс Where предоставляет гибкий и интуитивно понятный способ создания условий запроса. Он поддерживает различные операции сравнения и логические операторы, позволяя точно определить критерии выбора или фильтрации данных из вашей базы данных.
Методы возвращают объект Where, инкапсулирующий условие, а также параметризованное значение для безопасного и эффективного выполнения запросов.
Предложения Where не только упрощают построение синтаксиса запроса, но и повышают безопасность за счет внутреннего управления рисками, связанными с внедрением SQL. Эта библиотека автоматически заменяет значения именованными параметрами PDO и выполняет привязку с использованием соответствующих типов данных PDO. Управляя этими важными аспектами, он гарантирует, что ваши запросы будут не только чистыми и удобными в обслуживании, но и безопасными.
Вам больше не нужно беспокоиться о ручной очистке входных данных для запросов к базе данных. Библиотека заботится о подготовке операторов таким образом, чтобы защититься от SQL-инъекций, одной из наиболее распространенных уязвимостей безопасности в приложениях, управляемых базами данных. Такой подход позволяет вам сосредоточиться на бизнес-логике вашего приложения, полагая, что взаимодействие с базой данных осуществляется безопасно и эффективно.
$ where = Where:: equals ( ' status ' , ' active ' );
// Output: `status` = :status___1
$ where = Where:: notEquals ( ' category ' , ' archived ' );
// Output: `category` <> :category___1
$ where = Where:: greaterThan ( ' price ' , 100 );
// Output: `price` > :price___1
$ where = Where:: greaterThanOrEquals ( ' price ' , 100 );
// Output: `price` >= :price___1
$ where = Where:: lessThan ( ' price ' , 50 );
// Output: `price` < :price___1
$ where = Where:: lessThanOrEquals ( ' price ' , 50 );
// Output: `price` <= :price___1
$ where = Where:: isNull ( ' description ' );
// Output: `description` IS NULL
$ whereNotNull = Where:: isNotNull ( ' description ' );
// Output: Output: `description` IS NOT NULL
$ where = Where:: like ( ' name ' , ' %Apple% ' );
// Output: `name` LIKE :name___1
$ where = Where:: notLike ( ' name ' , ' %Apple% ' );
// Output: `name` NOT LIKE :name___1
$ where = Where:: between ( ' date ' , ' 2021-01-01 ' , ' 2021-12-31 ' );
// Output: `date` BETWEEN :date___1 AND :date___2
$ where = Where:: notBetween ( ' date ' , ' 2021-01-01 ' , ' 2021-12-31 ' );
// Output: `date` NOT BETWEEN :date___1 AND :date___2
$ where = Where:: in ( ' status ' , [ ' active ' , ' pending ' , ' on-hold ' ]);
// Output: `status` IN (:status___1, :status___2, :status___3)
$ where = Where:: notIn ( ' status ' , [ ' active ' , ' pending ' , ' on-hold ' ]);
// Output: `status` NOT IN (:status___1, :status___2, :status___3)
or
и and
операторы $ where1 = Where:: equals ( ' status ' , ' active ' );
$ where2 = Where:: greaterThan ( ' price ' , 100 );
$ orWhere = Where:: or ( $ where1 , $ where2 );
// Output: (`status` = :status___1 OR `price` > :price___1)
$ andWhere = Where:: and ( $ where1 , $ where2 );
// Output: (`status` = :status___1 AND `price` > :price___1)
Вы также можете вкладывать операторы
or
иand
:
$ where3 = Where:: equals ( ' category ' , ' archived ' );
$ combinedWhere = Where:: and ( $ where3 , $ orWhere );
// Output: (`category` = :category___1 AND (`status` = :status___1 OR `price` > :price___1))
В следующих подразделах мы рассмотрим, как создавать и выполнять запросы с использованием этой библиотеки. Для простоты будем считать, что переменная $db
является экземпляром класса Db
.
Во всех приведенных ниже примерах мы отделили построение запроса от его выполнения. Этот подход позволяет повторно использовать объект запроса и выполнять его несколько раз с разными параметрами, но вы также можете связать методы для создания и выполнения запроса в одном операторе, например:
$ results = $ db
-> select ()
-> columns ([ ' column1 ' , ' column2 ' ])
-> from ( ' table_name ' )
-> where (Where:: equals ( ' column2 ' , 1 ))
-> fethAll ();
$ select = $ db -> select ()
-> columns ([ ' column1 ' , ' column2 ' ])
-> column ( ' column3 ' )
-> from ( ' table_name ' )
-> where (Where:: equals ( ' column2 ' , 1 )) // See "Where Clauses" section above
-> groupBy ( ' column1 ' )
-> having (Where:: equals ( ' sum(column2) ' , 5 ))
-> orderBy ( ' column3 ' , ' ASC ' )
-> limit ( 10 )
-> offset ( 5 );
$ sql = $ select -> getSql ();
// $sql:
// SELECT
// `column1`,
// `column2`,
// `column3`
// FROM
// `table_name`
// WHERE
// `column2` = :column2___1
// GROUP BY
// `column1`
// HAVING
// `sum(column2)` = :sum_column2____1
// ORDER BY
// `column3` ASC
// LIMIT
// 10
// OFFSET
// 5;
Получение результатов:
По умолчанию метод fetchAll()
возвращает массив объектов (по умолчанию используется PDO::FETCH_OBJ
), где каждый объект представляет собой строку данных. Вы также можете получить результаты в виде массива ассоциативных массивов, передав константу PDO::FETCH_ASSOC
в качестве аргумента методу построения fetchMethod()
перед выполнением запроса.
$ allResults = $ select -> fetchAll ();
$ firstResult = $ select -> fetchFirst ();
$ column1Values = $ select -> fetchColumn ( ' column1 ' );
$ column3DistinctValues = $ select -> fetchDistincts ( ' column3 ' );
// Output: object(FetchResult) {
// data => array(n) {
// [0]...
// [1]...
// [n-1]...
// },
// count => int(n)
// }
Вы также можете получить количество результатов с помощью:
$ countResults = $ select -> fetchCount ();
// Output: 5
Пагинация:
Эффективная обработка больших наборов данных и предоставление удобного интерфейса для навигации по данным необходимы для любого надежного приложения. Функция нумерации страниц в PHP-DbHandler элегантно решает эти задачи. Он упрощает процесс разделения ваших данных на управляемые фрагменты или «страницы», облегчая работу с большими наборами данных, не перегружая систему или пользователя.
Настройка нумерации страниц
Есть два способа настроить нумерацию страниц для ваших запросов:
Использование метода paginate. Этот метод позволяет кратко определить количество элементов на странице. Это эффективный способ подготовить запрос к разбиению на страницы.
$ select = $ db -> select ()
-> from ( ' table_name ' )
// ...
-> paginate (itemsPerPage: 10 );
Установка ограничения и смещения вручную. Для большего контроля вы можете вручную указать ограничение (количество элементов на странице) и смещение (начальную точку в наборе данных) для вашего запроса.
$ select = $ db -> select ()
-> from ( ' table_name ' )
// ...
-> limit ( 10 )
-> offset ( 0 );
Получение результатов с помощью нумерации страниц
После настройки нумерации страниц вы можете получать результаты различными способами, с легкостью перемещаясь по набору данных:
fetchPage(?int $page)
: Получить текущую или конкретную страницу.fetchNextPage()
: Получить результаты для следующей страницы.fetchPreviousPage()
: извлекает результаты предыдущей страницы.fetchFirstPage()
: Получить результаты для первой страницы.fetchLastPage()
: Получить результаты для последней страницы. Каждый из этих методов возвращает объект FetchPaginatedResult
, который содержит следующие свойства:
data
: Массив записей на текущей странице.count
: общее количество записей в наборе данных.page
: номер текущей страницы.perPage
: количество записей на странице.totalPages
: общее количество страниц. // Example output structure of FetchPaginatedResult
object (FetchPaginatedResult) {
data => array (n) {
[ 0 ]. . .
[ 1 ]. . .
[n- 1 ]. . .
},
count => int(n),
page => int( 10 ),
perPage => int( 10 ),
totalPages => int( 23 )
}
Эта система нумерации страниц в PHP-DbHandler гарантирует, что вы сможете эффективно управлять большими наборами данных и перемещаться по ним, повышая общую производительность и удобство использования вашего приложения.
Кэширование:
В современных приложениях, управляемых данными, эффективность и производительность являются ключевыми факторами. Чтобы улучшить эти аспекты взаимодействия с базой данных, библиотека включает функцию кэширования в своих запросах Select
. Эта функция повышает производительность за счет кэширования результатов запросов, тем самым снижая нагрузку на базу данных и увеличивая время ответа для часто выполняемых запросов. Важно отметить, что он полностью соответствует стандарту PSR-16 (Simple Cache), что обеспечивает широкую совместимость и гибкость.
Кэширование, совместимое с PSR-16
Функция кэширования в запросах Select принимает любой экземпляр кэша, реализующий PsrSimpleCacheCacheInterface. Соответствие стандартам PSR-16 означает, что вы можете легко интегрировать широкий спектр библиотек кэширования, поддерживающих этот интерфейс, предлагая вам гибкость в выборе решения кэширования, которое лучше всего соответствует потребностям вашего приложения.
Db
предоставлен экземпляр PsrSimpleCacheCacheInterface
, вы можете пропустить этот шаг. Если вы этого не сделали, вы можете использовать метод setCache
: $ select = $ db -> select ()-> setCache ( $ simpleCacheInstance );
Примечания:
- Если вы не предоставили экземпляр кэша при инициализации класса
Db
, вы должны установить его для каждого запросаSelect
, который вы хотите кэшировать.- Вы также можете использовать этот метод, если хотите установить конкретный экземпляр кэша для запроса
Select
. Это позволяет вам использовать разные решения кэширования для разных запросов в зависимости от потребностей вашего приложения.
withCache
. Вы можете указать возвращаемое значение по умолчанию для отсутствующих записей кэша и TTL (время жизни) для кэшированных данных. $ select -> withCache (defaultValue, ttl);
Примечания:
- Аргумент
defaultValue
не является обязательным. Если не указано, библиотека вернетNULL
для отсутствующих записей в кэше.- Аргумент
ttl
не является обязательным. Если он не указан, библиотека будет использовать значение TTL, установленное экземпляром PsrSimpleCache.
$ allResults = $ select -> fetchAll ();
$ firstResult = $ select -> fetchFirst ();
$ column1Values = $ select -> fetchColumn ( ' column1 ' );
$ column3DistinctValues = $ select -> fetchDistincts ( ' column3 ' );
Ключевые преимущества
Класс Insert
в библиотеке PHP-DbHandler упрощает процесс создания и выполнения запросов на вставку в базу данных. Этот класс, оснащенный множеством функций и интерфейсов, предлагает сложный подход к обработке операций вставки с различными расширенными функциями.
Генерация запроса
Insert
позволяет динамически присваивать значения столбцам для вставки. Вы можете добавить одно значение или несколько значений одновременно: $ insert = $ db -> insert ()
-> into ( ' table_name ' )
-> value ( ' column1 ' , ' value1 ' )
-> values ([ ' column2 ' => ' value2 ' , ' column3 ' => ' value3 ' ]);
Класс проверит, существует ли столбец в таблице, прежде чем добавлять значение, а также позаботится о необходимой привязке PDO.
$ rows = [
[ ' column1 ' => ' value1 ' , ' column2 ' => ' value2 ' ],
[ ' column1 ' => ' value3 ' , ' column2 ' => ' value4 ' ],
// ...
];
$ insert -> rows ( $ rows );
Исполнение
$ success = $ insert -> execute ();
Чеки
Перед выполнением операции вставки класс автоматически проверит:
- Если база данных находится в режиме только для чтения , предотвращение непреднамеренных операций записи.
- Если есть коллизии в первичных ключах без автоинкремента , обеспечение целостности данных.
Класс Insert
— это комплексное решение для обработки операций вставки в базе данных, предлагающее простоту использования и расширенные функции для эффективного управления сложными задачами вставки.
Класс Update
в библиотеке PHP-DbHandler предоставляет сложный и гибкий способ создания и выполнения запросов на обновление в базе данных. Он предназначен для полной интеграции с существующей структурой базы данных и предлагает надежные функции для эффективного управления операциями обновления.
Генерация запроса
$ update = $ db -> update ()
-> table ( ' table_name ' )
-> set ( ' column1 ' , ' newValue1 ' )
-> set ( ' column2 ' , ' newValue2 ' );
```
2. **Conditional Updates**: Incorporate conditions into your update queries using the `where` method. This allows for precise targeting of records to be updated.
``` php
$ update -> where (Where:: equals ( ' column3 ' , ' conditionValue ' ));
Исполнение
$ success = $ update -> execute ();
Проверка режима только для чтения : перед выполнением класс проверяет, находится ли база данных в режиме только для чтения, тем самым предотвращая непреднамеренные операции записи.
Класс Update
представляет собой комплексное решение для создания и выполнения операций обновления в базе данных. Сочетание гибкости, надежности и простоты использования делает его идеальным выбором для управления обновлениями баз данных в приложениях PHP.
Класс Delete
в библиотеке PHP-DbHandler предлагает сложный подход к созданию и выполнению запросов на удаление в базах данных. Этот класс гарантирует, что операции удаления выполняются точно и безопасно, объединяя необходимые проверки и функции для оптимальной обработки запросов.
Генерация запроса
Класс позволяет точно нацеливаться на удаление записей с помощью условных выражений. Это достигается с помощью where
, позволяющего выбирать определенные строки для удаления на основе заданных критериев.
$ delete = $ db -> delete ()
-> from ( ' table_name ' )
-> where (Where:: equals ( ' column ' , ' value ' ));
Обязательное предложение WHERE : чтобы избежать случайного удаления всех записей в таблице, класс требует указания предложения
WHERE
. Это служит защитой от непреднамеренного массового удаления.
Исполнение
$ success = $ delete -> execute ();
Класс выполняет важные проверки перед выполнением операции удаления, включая проверку существования таблицы и проверку того, что база данных не находится в режиме только для чтения.
Класс Delete
предназначен для обработки операций удаления с высокой степенью контроля и безопасности. Это гарантирует, что удаления выполняются точно, с учетом структуры и ограничений базы данных. Независимо от того, выполняете ли вы простые или сложные задачи удаления, этот класс предоставляет необходимые инструменты для их надежного и безопасного выполнения.
Класс StoredProcedure
в библиотеке PHP-DbHandler предлагает упрощенный и эффективный подход к выполнению хранимых процедур в базах данных. Этот класс обеспечивает надежный способ взаимодействия с хранимыми процедурами, легкое управление параметрами, выполнение и получение результатов.
Генерация запроса
Настройка вызовов хранимых процедур . Легко настраивайте вызовы хранимых процедур с помощью динамического управления параметрами. Укажите имя процедуры и необходимые ей параметры.
$ procedure = $ db -> storedProcedure ()
-> call ( ' procedure_name ' )
-> with ( ' paramName ' , $ value )
// ...
-> with ( ' paramName2 ' , $ value );
Исполнение
$ results = $ procedure -> execute ();
Проверки режима только для чтения . Перед выполнением класс проверяет, находится ли база данных в режиме только для чтения, гарантируя, что операции записи не выполняются непреднамеренно.
Класс StoredProcedure
— незаменимый инструмент для обработки вызовов хранимых процедур в приложениях PHP. Он упрощает взаимодействие с хранимыми процедурами, делая процесс более интуитивным и менее подверженным ошибкам, особенно в приложениях, которые в значительной степени полагаются на сложные операции с базами данных.
Управление транзакциями базы данных является важнейшим аспектом обеспечения целостности данных, особенно в приложениях, занимающихся сложным манипулированием данными. PHP-DbHandler упрощает этот процесс, предлагая интуитивно понятный и простой способ обработки транзакций.
Благодаря предоставленным возможностям управления транзакциями вы можете легко запускать, фиксировать или откатывать транзакции, предоставляя вам полный контроль над операциями с базой данных. Это гарантирует, что серию операций с базой данных можно рассматривать как единую атомарную единицу, которая либо завершается полностью, либо не завершается вообще, что обеспечивает согласованность и надежность ваших данных.
$ db -> transaction -> begin ();
$ db -> transaction -> commit ();
$ db -> transaction -> rollback ();
Эта функция особенно полезна в сценариях, где необходимо одновременно выполнять несколько связанных операций с базой данных. Если какая-либо операция внутри транзакции завершается неудачно, метод отката можно использовать для отмены всех изменений, внесенных с начала транзакции, тем самым предотвращая частичные обновления, которые могут привести к несогласованности данных. И наоборот, если все операции прошли успешно, метод фиксации сохранит все изменения в базе данных.
Используя эти элементы управления транзакциями, PHP-DbHandler гарантирует, что управление данными вашего приложения является надежным, последовательным и устойчивым к ошибкам. Независимо от того, имеете ли вы дело со сложными вводами данных, обновлениями или пакетными процессами, эти транзакционные возможности предоставляют необходимые инструменты для эффективного управления операциями вашей базы данных.
Класс Transaction
также предоставляет мощную функцию для управления сложными сценариями транзакций. Эта функция позволяет вам глобально контролировать фиксации транзакций, что особенно полезно, если вы хотите объединить несколько методов, использующих транзакции, в едином всеобъемлющем транзакционном контексте.
Обработка транзакций по всему миру
Вы можете управлять несколькими транзакционными операциями как частью более крупной транзакции, отключив автоматическую фиксацию. Это особенно полезно в сценариях, где несколько операций, каждая из которых способна обрабатывать транзакции независимо, необходимо выполнить как часть одной атомарной транзакции.
// Begin a transaction
$ db -> transaction -> begin ();
// Disable automatic commits
$ db -> transaction -> setCommitsModeOff ();
// Execute other methods that use transactions
// $db->transaction->begin();
// ...
// $db->transaction->commit();
// Re-enable automatic commits
$ db -> transaction -> setCommitsModeOn ();
// Commit the transaction
$ db -> transaction -> commit ();
Эта функция улучшает контроль над транзакционными операциями, позволяя использовать более сложные и надежные сценарии манипулирования данными. Это гарантирует, что все изменения, внесенные в рамках глобальной транзакции, либо фиксируются вместе, либо откатываются, обеспечивая целостность и согласованность данных.
Мы высоко ценим и приветствуем вклад в проект! Если вы заинтересованы в участии, прочтите наш файл CONTRIBUTING.md, где вы найдете подробную информацию о том, как начать, рекомендации по отправке вкладов и советы, как сделать этот процесс максимально простым и эффективным.
Исправляете ли вы ошибку, добавляете функцию или улучшаете документацию, ваш вклад высоко ценится и оказывает значительное влияние на проект.
Если у вас есть вопросы или вы хотите обсудить идеи перед написанием кода, смело открывайте проблему на нашей странице «Проблемы» GitHub для обсуждения.
Мы ценим вашу готовность внести свой вклад и с нетерпением ждем ваших материалов!
Эта библиотека лицензируется по лицензии MIT. Более подробную информацию смотрите в файле ЛИЦЕНЗИИ.
Для получения поддержки посетите страницу проблем в репозитории GitHub: Проблемы GitHub.