amiano4/mysqli_extended
使用标准mysqli类的一种简化方式。
Requires
- php: >=8.0
This package is auto-updated.
Last update: 2024-09-23 02:56:25 UTC
README
概述
mysqli_extended
是一个PHP类,旨在简化并增强与MySQL数据库的交互。它从内置的 mysqli
类继承功能,并添加了用户友好的CRUD(创建、读取、更新、删除)操作和其他常见任务的方法。该类旨在
- 提高易用性:通过提供更直观的方法名称和简化的语法,
mysqli_extended
使开发者更容易与MySQL数据库交互。 - 编写更简洁的代码:简化的界面鼓励开发者编写更简洁、易读的数据库代码。
- 提高效率:虽然不是核心重点,但一些优化可能有助于提高与直接使用原始
mysqli
类相比的代码效率(性能提升可能取决于您的特定使用场景)。
主要功能
- 简化CRUD操作:该类提供了针对
insert
、select
、update
和delete
操作的专用方法,简化了数据库操作。 - 支持预编译语句:该类提供了一个
execute
函数,可以执行常规SQL查询和预编译语句。- fetchAll():将结果集中的所有行作为关联数组检索。可选地接受一个回调函数,可以在返回结果之前修改每一行。
- fetchAssoc():将结果集中的单行作为关联数组检索。类似于
fetchAll
,它允许可选的回调函数进行行操作。
- 抽象方法:提供用户友好的常用任务方法,提高可读性和可维护性。
escapeString
(用于mysqli_real_escape_string
)- 通过转义字符串中的特殊字符来防止SQL注入漏洞。getInsertId
- 在成功插入操作后检索最后插入行的ID。affectedRows
- 返回上一个插入、更新或删除查询影响的行数。numRows
- 返回最后选择查询返回的行数。
- 错误处理:在执行过程中对错误/异常的定制实现。
预编译语句支持(强烈推荐)
$conn = new mysqli_extended(...);
$query = "INSERT INTO users (name, email) VALUES (?, ?);
$conn->execute($query, "John Doe", "johndoe@example.com");
mysqli_extended
提供了一个execute
函数,作为执行数据库查询的统一接口。此函数可以处理常规SQL查询和预编译语句。但是,该类强烈建议使用预编译语句和参数绑定,原因如下- 增强安全性:预编译语句通过将SQL查询结构从要插入的数据中分离出来,防止SQL注入漏洞。
- 提高可读性:显式参数绑定使代码更容易理解和维护。
- 降低错误风险:参数绑定减少了由手动字符串连接引起的语法错误的风险。
execute
函数和预编译语句
execute
函数展示了预编译语句在类中的无缝集成。以下是其主要步骤的分解- 准备语句:它使用提供的查询字符串,通过
prepare
方法(可能是类内的)创建预编译语句。 - 绑定参数(如果提供):如果向
execute
传递了参数,它将遍历它们,确定它们的类型,并使用bind_param
将它们绑定到预编译语句。 - 执行语句:在成功准备和潜在参数绑定后,该函数执行准备好的语句。
- 错误处理:在整个过程中,函数在语句准备、参数绑定或执行过程中抛出异常。
- 返回对象:如果成功,函数返回自身的
mysqli_extended
对象,允许方法链。
- 准备语句:它使用提供的查询字符串,通过
安装
mysqli_extended
类作为单个文件提供,便于集成。以下是将其安装到您项目中的方法:
- 下载
mysqli_extended
类文件。 - 使用
require_once
或include_once
将下载的文件包含到您的项目中。
示例用法
// Including the class file
require_once 'path/to/mysqli_extended.php';
// Assuming you've connected to your MySQL database
$conn = new mysqli_extended($hostname, $username, $password, $database);
...
$records = $conn->execute("SELECT * FROM users")->fetchAll();
$user = $conn->select("users", "*", "id = 1")->fetchAssoc(function($x) {
unset($x['password']);
return $x;
});
execute(string $query, array $params?)
$conn->execute("SELECT * FROM users WHERE username = ? AND password = ?", "test", "test");
// or
$conn->execute("SELECT * FROM users WHERE username = ? AND password = ?", ["test", "test"]);
// or
$conn->execute("SELECT * FROM users");
CRUD 方法内部使用
execute
函数,但它们抽象了为每个 CRUD 操作编写特定 SQL 查询的需要。
insert(string $table, array $values)
$data = ["column_name" => "input value", ...];
$conn->insert("users", $data);
update(string $table, array $values, $condition?, $opr?)
$opr (运算符) 默认为 AND,当 $condition 是一个数组类型且有多个元素时使用。期望的值字符串为 "AND" 或 "OR",$condition 也可以是一个有效的 SQL 条件语句字符串。
$condition = ["column" => "value", ...];
$conn->update("users", $data, $condition);
// or
$conn->update("users", $data, "id = 1");
// or
$conn->update("users", $data);
select(string $table, array | string $columns, $condition?, $opr?)
$conn->select("users", "name, username", ...);
// or
$conn->select("users", ["name","username"], ...);
// fetching all columns
$all = "*"; // can be: "" or "*" or "[]" or []
$conn->select("users", $all, ...);
delete(string $table, array | string $condition, $opr?)
$conn->delete("users", "id = 1");
// or
$conn->delete("users", ["name" => "test", "username" => "test"], "AND");
fetchAll($callback?)
$results = $conn->fetchAll();
// or
$results = $conn->fetchAll(function($x) {
// modify data here...
return $x;
});
// output: [[...], [...], ...]
fetchAssoc($callback?)
$row = $conn->fetchAssoc();
// output: [...] (single row)
getInsertId() 或 lastInsertID()
$conn->insert(...);
$conn->getInsertId(); // 1
// $conn->lastInsertID();
escapeString(string $str)
$value = $conn->escapeString($str);
安全考虑
- 始终在将用户输入包含到 SQL 查询之前对其进行转义,以防止 SQL 注入漏洞。
- 正确处理和验证所有用户输入,以避免潜在的安全问题。
致谢
此类受到 David Adams 的工作启发 (超级快速 PHP MySQL 数据库类)