sentgine / db
一个轻量级的基于PHP PDO的数据库交互查询构建器。
v1.0.3
2024-07-01 08:53 UTC
Requires
- php: ^8.1
README
使用PDO独立数据库查询构建器包装器。
特性
数据库连接
- 使用PDO(PHP数据对象)建立数据库连接,以与MySQL数据库交互。
- 支持包括MySQL、PostgreSQL和SQLite在内的多种数据库驱动程序。
- 优雅地处理数据库连接错误和异常。
查询构建
- 提供构建SQL查询的流畅接口方法,如select、join、where、orWhere、andWhere、limit和offset。
- 支持从表中选择特定的列或所有列(*)。
- 允许使用不同类型的连接(例如,INNER JOIN、LEFT JOIN、RIGHT JOIN)连接表。
- 可以添加具有各种运算符(例如,'=', '>', '<', '>=', '<=')的WHERE子句。
查询执行
- 使用预处理语句执行SQL查询,以防止SQL注入攻击。
- 将查询结果作为对象数组检索,以便于操作。
- 处理PDO异常并提供错误处理机制。
数据操作
- 支持使用insert方法将数据插入表中,提供列名和值的关联数组。
- 允许使用update方法更新表中的数据,提供新的数据作为关联数组,条件作为条件数组。
- 使用delete方法从表中删除数据,提供条件作为列名和值的关联数组。
分页
- 使用paginate方法实现查询结果的分页,允许指定每页的项目数量和当前页码。
- 计算分页信息,包括总项目、总页数和当前页。
- 支持与现有的查询构建器方法无缝集成,以构建分页查询。
附加工具
- 提供getLastQuery方法,用于检索最后执行的查询,以进行调试。
- 实现truncate方法,用于截断表,删除所有行。
- 提供raw方法,在需要时执行原始SQL查询。
要求
- PHP 8.0或更高版本。
安装
您可以通过运行以下命令使用Composer安装此包
composer require sentgine/db:^1.0
DB的示例用法
基本用法
<?php use Sentgine\Db\QueryBuilder; // Create a new QueryBuilder instance $queryBuilder = new QueryBuilder(); // Select all columns from the 'users' table $queryBuilder->select('users')->get();
选择特定列
// Select specific columns from the 'users' table $queryBuilder->select('users', ['id', 'name', 'email'])->get();
WHERE子句
// Select users where 'id' is equal to 1 $queryBuilder->select('users')->where('id', 1)->get();
WHERE子句(大于等于 >=)
// Select users where 'age' is greater than or equal to 18 $queryBuilder->select('users')->where('age', 18, '>='); // Equivalent to SQL: SELECT * FROM users WHERE age >= 18
WHERE子句(小于等于 <=)
// Select users where 'points' are less than or equal to 100 $queryBuilder->select('users')->where('points', 100, '<='); // Equivalent to SQL: SELECT * FROM users WHERE points <= 100
WHERE子句(大于 >)
// Select users where 'salary' is greater than 50000 $queryBuilder->select('users')->where('salary', 50000, '>'); // Equivalent to SQL: SELECT * FROM users WHERE salary > 50000
WHERE子句(小于 <)
// Select users where 'rating' is less than 4.5 $queryBuilder->select('users')->where('rating', 4.5, '<'); // Equivalent to SQL: SELECT * FROM users WHERE rating < 4.5
AND WHERE子句
// Select users where 'id' is equal to 1 and 'status' is 'active' $queryBuilder->select('users')->where('id', 1)->andWhere('status', 'active')->get();
OR WHERE子句
// Select users where 'id' is equal to 1 or 'status' is 'inactive' $queryBuilder->select('users')->where('id', 1)->orWhere('status', 'inactive')->get();
LIMIT
// Select only 10 users $queryBuilder->select('users')->limit(10)->get();
OFFSET
// Select users with pagination, skipping the first 10 records $queryBuilder->select('users')->limit(10)->offset(10)->get();
JOIN
// Select users along with their corresponding posts $queryBuilder->select('users') ->join('INNER', 'posts', 'users.id = posts.user_id') ->get();
INSERT
// Insert a new user into the 'users' table $queryBuilder->insert('users', [ 'name' => 'John Doe', 'email' => 'john@example.com' ]);
UPDATE
// Update user with id 1 $queryBuilder->update('users', ['name' => 'Jane Doe'], ['id' => 1] );
DELETE
// Delete users with id greater than 10 $queryBuilder->delete('users', [ 'id' => [10, 20] ], '>');
原始查询
// Execute a raw SQL query $queryBuilder->raw('SELECT * FROM users WHERE id = 1')->get();
截断表
// Truncate the 'users' table $queryBuilder->truncate('users');
分页
use Sentgine\Db\QueryBuilder; // Instantiate the QueryBuilder class $queryBuilder = new QueryBuilder(); // Set the number of items per page $perPage = 10; // Get the current page number from the request, default to 1 if not provided $current_page = $_GET['page'] ?? 1; // Perform select statement $queryBuilder->select('users'); $queryBuilder->where('age', 30, '>'); // Paginate the query results $paginationData = $queryBuilder->paginate($perPage, $current_page); // Retrieve the paginated data and pagination information $data = $paginationData['data']; $pagination = $paginationData['pagination']; // Display the paginated data foreach ($data as $row) { // Output each row of data echo $row->id . ' - ' . $row->name . '<br>'; } // Display pagination links echo '<br>Pagination:'; for ($page = 1; $page <= $pagination['total_pages']; $page++) { // Output pagination links echo '<a href="?page=' . $page . '">' . $page . '</a> '; }
高级场景
提供的SQL构建器旨在仅用于构建SQL查询和确保正确的格式。虽然已经尽力减轻安全风险,但不应将其作为安全功能单独依赖。请注意,复杂的SQL查询可能会增加SQL注入漏洞的可能性。在部署到生产环境之前,务必彻底编码并进行彻底的审查。
WHERE子句上的复杂嵌套(逻辑驱动搜索)
利用WHERE子句中的嵌套作为表达式,特别是对于严格条件和业务逻辑决策。嵌套表达式可以在任何所需级别应用,但过度嵌套可能会导致复杂。请注意,关键字{{nest1}}通过{{nest20}}是保留的。不允许在nestWhereExpression方法中嵌套其他关键字或字符。这确保了不欢迎在此区域中的不受欢迎的语法。
$db->select('targetTable1', array("*")); $db->nestWhereExpression(' ( {{nest1}} OR {{nest2}} ) AND ( {{nest3}} ) '); $db->where('target_colum1', 235,"=", expression: 'nest1'); $db->orWhere('target_colum1', 543,"=", expression: 'nest1'); // same area as nest1 with OR operator $db->orWhere('target_colum1', 111,"=", expression: 'nest1'); // same area as nest1 with OR operator $db->where('target_colum1', 111,"=", expression: 'nest2'); $db->where('target_colum1', 111,"=", expression: 'nest3'); $db->andWhere('target_colum1', 111,"=", expression: 'nest3'); // same area as nest3 with AND operator $sql = $db->buildSQL();; // Build the SQL query $db->raw($sql)->execute(); // Execute the query
更新日志
请查看变更日志文件以了解有哪些变化。
安全
如果您发现任何安全相关的问题,请通过电子邮件sentgine@gmail.com联系,而不是使用问题跟踪器。
鸣谢
DB由Adrian Navaja开发和维护。
- 在YouTube上查看一些有趣的教程和内容!
- 在Twitter(前身为X)上关注我的最新推文和更新!
- 在LinkedIn上以更专业的方式与我取得联系!
- 有关我的更多信息和工作,请访问我的网站:sentgine.com。
- 特别感谢尊敬的数据库专家顾问Dodie Batoctoy,他显著增强了查询构建器的功能,以支持复杂的边缘情况。Dodie的专业知识对项目至关重要。要获取更多专家见解,请通过(LinkedIn)与他取得联系。
许可证
MIT许可证(MIT)。请查看许可证文件以获取更多信息。