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 注入的方式准备语句,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
andand
运算符:
$ 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(简单缓存)标准,确保广泛的兼容性和灵活性。
符合 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
参数是可选的。如果未提供,库将使用 PsrSimpleCache 实例设置的 TTL 值。
$ allResults = $ select -> fetchAll ();
$ firstResult = $ select -> fetchFirst ();
$ column1Values = $ select -> fetchColumn ( ' column1 ' );
$ column3DistinctValues = $ select -> fetchDistincts ( ' column3 ' );
主要优点
PHP-DbHandler 库中的Insert
类简化了在数据库中创建和执行插入查询的过程。该类配备了多种特征和接口,提供了一种复杂的方法来处理具有各种高级功能的插入操作。
查询生成
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
类是一个用于处理数据库中插入操作的全方位解决方案,提供易用性和高级功能来有效管理复杂的插入任务。
PHP-DbHandler 库中的Update
类提供了一种复杂而灵活的方法来在数据库中构造和执行更新查询。它旨在与现有数据库结构无缝集成,同时提供强大的功能来有效管理更新操作。
查询生成
$ 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 应用程序中管理数据库更新的理想选择。
PHP-DbHandler 库中的Delete
类提供了一种在数据库中构建和执行删除查询的复杂方法。此类确保删除操作精确且安全地进行,集成必要的检查和功能以实现最佳查询处理。
查询生成
该类允许使用条件表达式精确定位要删除的记录。这是通过where
方法实现的,允许根据给定条件选择特定行进行删除。
$ delete = $ db -> delete ()
-> from ( ' table_name ' )
-> where (Where:: equals ( ' column ' , ' value ' ));
强制Where子句:为了避免意外删除表中的所有记录,该类需要指定
WHERE
子句。这可以防止无意的批量删除。
执行
$ success = $ delete -> execute ();
该类在执行删除操作之前执行基本检查,包括验证表是否存在并确保数据库不处于只读模式。
Delete
类旨在以高度的控制和安全性处理删除操作。它确保在尊重数据库结构和约束的情况下准确执行删除。无论您执行简单还是复杂的删除任务,此类都提供了可靠、安全地执行这些任务所需的工具。
PHP-DbHandler 库中的StoredProcedure
类提供了一种在数据库中执行存储过程的简化且高效的方法。此类提供了一种与存储过程交互、轻松处理参数管理、执行和结果获取的强大方法。
查询生成
设置存储过程调用:通过动态参数管理轻松设置对存储过程的调用。指定过程名称及其所需的参数。
$ 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 ();
该功能在需要一起执行多个相关数据库操作的场景下特别有用。如果事务中的任何操作失败,则可以使用回滚方法来恢复从事务开始时所做的所有更改,从而防止可能导致数据不一致的部分更新。相反,如果所有操作都成功,则commit方法会将所有更改保存到数据库中。
利用这些事务控制,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 问题