amiano4/mysqli_extended

使用标准mysqli类的一种简化方式。

v1.2.0 2024-04-23 01:57 UTC

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操作:该类提供了针对 insertselectupdatedelete 操作的专用方法,简化了数据库操作。
  • 支持预编译语句:该类提供了一个 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 函数展示了预编译语句在类中的无缝集成。以下是其主要步骤的分解
    1. 准备语句:它使用提供的查询字符串,通过 prepare 方法(可能是类内的)创建预编译语句。
    2. 绑定参数(如果提供):如果向 execute 传递了参数,它将遍历它们,确定它们的类型,并使用 bind_param 将它们绑定到预编译语句。
    3. 执行语句:在成功准备和潜在参数绑定后,该函数执行准备好的语句。
    4. 错误处理:在整个过程中,函数在语句准备、参数绑定或执行过程中抛出异常。
    5. 返回对象:如果成功,函数返回自身的 mysqli_extended 对象,允许方法链。

安装

mysqli_extended 类作为单个文件提供,便于集成。以下是将其安装到您项目中的方法:

  1. 下载 mysqli_extended 类文件。
  2. 使用 require_onceinclude_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 数据库类)