一个轻量级的基于PHP PDO的数据库交互查询构建器。

v1.0.3 2024-07-01 08:53 UTC

This package is auto-updated.

Last update: 2024-10-01 00:09:26 UTC


README

License Latest Stable Version Total Downloads

使用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)。请查看许可证文件以获取更多信息。