websitebeaver / simple-mysqli
MySQLi 预处理语句包装类
Requires
- php: >=7.1.0
This package is not auto-updated.
Last update: 2024-09-29 06:02:29 UTC
README
使用 MySQLi 预处理语句是防止 SQL 注入的好方法,但用久了可能会觉得麻烦。我认为这可以稍微改进一下,这就是为什么我想创建一个易于使用的 MySQLi 数据库包装器,同时确保 SQL 查询不会被分成专有语法糖链。这样,您可以拥有极其简洁的代码,同时仍保持您的 SQL 语法完整。这个类的目的是尽可能地让使用纯 SQL 查询变得愉快,同时又不使用 ORM。在许多方面,我将这个类模拟成了我认为的通用 MySQLi/PDO 语法。
我特别选择了 MySQLi 而不是 PDO,以便能够使用 MySQL 特定功能。目前,我正在使用的是 mysqli::info 和正确的关闭/释放方法。不幸的是,异步查询目前还没有对预处理语句的支持,所以我将等到它们支持后再实现它们。
顺便说一下,如果您想了解如何使用 MySQLi 的“纯”方法,请查看这个关于 MySQLi 预处理语句的教程。
为什么我应该使用 Simple MySQLi?
- 简洁的代码
- 出色的获取模式
- SQL 查询是纯的
- 考虑了大多数常见用途
- 变量类型是可选的
- 绑定变量和值(不确定这有多有用)
为什么不使用它?
- 没有命名参数
- 如果您需要使用一些更不常见的 MySQLi 函数,那么这个可能不适合您。
- 仅支持 MySQL 和 MariaDB
这个类的目的是尽可能简单,同时考虑最常见的使用。如果您想让我添加某些功能,请随时提出建议或发送拉取请求。
支持的版本
PHP 7.1+
安装
点击这里查看每个版本的更改。
Composer
composer require websitebeaver/simple-mysqli
然后在您的 PHP 页面中包含或引入该文件。
require 'vendor/autoload.php';
Git
克隆最新版本或通过标签。
//Get by version number
git clone https://github.com/WebsiteBeaver/Simple-MySQLi/tree/{your version number}
//Get the latest
git clone https://github.com/WebsiteBeaver/Simple-MySQLi.git
然后在您的 PHP 页面中包含或引入该文件。
require 'simple-mysqli.php';
目录
示例
让我们直接进入主题!最好的学习方法是通过示例。
创建新的 MySQL 连接
我非常喜欢MySQLi的一个方面是错误报告是自动关闭的。不幸的是,我无法复现这一点,因为我在构造函数中抛出异常,因此可能会暴露参数值。这就是为什么我通过执行mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT)
来开启mysqli报告——因为无论如何你都会将它包装在try/catch
块中。所以你必须将其包装在try/catch
块中,或者创建自己的自定义处理程序。确保你使用$e->getMessage()
而不是$e
,这样你的密码就不会暴露。无论如何,你必须只在自己的错误日志中报告错误。为此,请确保你的php.ini
文件在生产环境中具有以下设置:display_errors = Off
和log_errors = On
。请记住,使用echo
、die
或exit
来打印错误消息也是极其危险的。
Try/Catch
try { $mysqli = new SimpleMySQLi("localhost", "username", "password", "dbName", "utf8mb4", "assoc"); } catch(Exception $e) { error_log($e->getMessage()); exit('Someting weird happened'); //Should be a message a typical user could understand }
自定义异常处理程序
这非常方便,因为你可以避免嵌套。它通常用于重定向到单个错误页面,但也像以下那样使用。你可以重新分配它,以便在你的AJAX页面上给出特定的消息。这将捕获在该页面上使用的每个页面上的所有异常。所以你将不得不在每个页面上调用set_exception_handler()
,或者使用restore_exception_handler()
来恢复到上一个处理程序。
set_exception_handler(function($e) { error_log($e->getMessage()); exit('Someting weird happened'); //Should be a message a typical user could understand }); $mysqli = new SimpleMySQLi("localhost", "username", "password", "dbName", "utf8mb4", "assoc");
插入、更新、删除
插入
$insert = $mysqli->query("INSERT INTO myTable (name, age) VALUES (?, ?)", [$_POST['name'], $_POST['age']]); echo $insert->affectedRows(); echo $insert->insertId();
更新
$update = $mysqli->query("UPDATE myTable SET name = ? WHERE id = ?", [$_POST['name'], $_SESSION['id']]); echo $update->affectedRows();
删除
$delete = $mysqli->query("DELETE FROM myTable WHERE id = ?", [$_SESSION['id']]); echo $delete->affectedRows();
更新相同值
affectedRows()
的问题在于它只会告诉你是否有任何行受到影响。所以如果它返回0,你不知道这是否意味着WHERE子句没有匹配,或者你使用相同的值更新了行。Simple MySQLi提供的一个解决方案是使用info()
,它利用mysqli::info并将结果字符串转换为数组。你可以在它支持的任何其他查询中使用它。
$update = $mysqli->query("UPDATE myTable SET name = ? WHERE id = ?", [$_POST['name'], $_SESSION['id']]); echo $update->affectedRows(); var_export($update->info()); //For more specific version
这是info()
会打印的内容。这可以用来检查你是否用与旧值完全相同的新值更新了值。
['Rows matched' => 1, 'Changed' => 0, 'Warnings' => 0]
虽然这很好,但在某些情况下,将affectedRows()
的行为更改为使用匹配的行而不是更改的行可能更方便。
$update = $mysqli->query("UPDATE myTable SET name = ? WHERE id = ?", [$_POST['name'], $_SESSION['id']]); echo $update->rowsMatched(); //Rows Matched: 1 echo $update->affectedRows(); //Rows Changed: 0
选择
你可以使用fetchAll()
将整个结果数组化,或者使用fetch()
循环逐行处理,如果你打算修改数组。显然,对于任何场景,你都可以使用fetchAll()
,但如果你在修改数组,使用fetch()
在内存效率上更高效,因为它会为你节省第二次遍历数组。然而,根据我的经验,大多数查询不需要任何修改,所以fetchAll()
应该主要用于。如果你只需要一行,那么显然应该使用fetch()
。
获取关联数组
$arr = $mysqli->query("SELECT id, name, age FROM events WHERE id <= ?", [4])->fetchAll("assoc"); if(!$arr) exit('No rows'); var_export($arr);
输出
[ ['id' => 24 'name' => 'Jerry', 'age' => 14], ['id' => 201 'name' => 'Alexa', 'age' => 22] ]
获取对象数组
$arr = $mysqli->query("SELECT id, name, age FROM events WHERE id <= ?", [4])->fetchAll("obj"); if(!$arr) exit('No rows'); var_export($arr);
输出
[ stdClass Object ['id' => 24 'name' => 'Jerry', 'age' => 14], stdClass Object ['id' => 201 'name' => 'Alexa', 'age' => 22] ]
你甚至可以将结果提取到类的新的实例中。
class myClass {} $arr = $mysqli->query("SELECT id, name, age FROM events WHERE id <= ?", [4])->fetchAll("obj", "myClass"); if(!$arr) exit('No rows'); var_export($arr);
输出
[ myClass Object ['id' => 24 'name' => 'Jerry', 'age' => 14], myClass Object ['id' => 201 'name' => 'Alexa', 'age' => 22] ]
获取单行
$arr = $mysqli->query("SELECT id, name, age FROM events WHERE id <= ?", [12])->fetch("assoc"); if(!$arr) exit('No rows'); var_export($arr);
输出
['id' => 24 'name' => 'Jerry', 'age' => 14]
像 bind_result() 一样获取单行
$arr = $mysqli->query("SELECT id, name, age FROM myTable WHERE name = ?", [$_POST['name']])->fetchAll("num"); //must use number array to use in list if(!$arr) exit('No rows'); list($id, $name, $age) = $arr; echo $age; //Output 34
获取标量(单个值)
这是提取标量的理想方式。使用MySQL的COUNT
函数得到一个数字,所以你可以很容易地检查其真值,因为没有行会给你一个值0
。
$count = $mysqli->query("SELECT COUNT(*) FROM myTable WHERE name = ?", [$_POST['name']])->fetch("col"); if(!$count) exit('No rows'); echo $count; //Output: 284
但如果你要在列可能具有布尔值(如NULL
或0
)的情况下从数据库中提取单个值的情况下,这将使你无法区分没有行或假值。这就是为什么我建议在其他所有情况下使用numRows()
。
$favoriteSport = $mysqli->query("SELECT favorite_sport FROM myTable WHERE id = ?", [23])->fetch("col"); if($favoriteSport->numRows() < 1) exit('No rows'); echo $favoriteSport; //Output: 'basketball'
将单列作为数组获取
$heights = $mysqli->query("SELECT height FROM myTable WHERE id < ?", [500])->fetchAll("col"); if(!$heights) exit('No rows'); var_export($heights);
输出
[78, 64, 68, 54, 58, 63]
将每个列作为单独的数组变量获取
$result = $mysqli->query("SELECT name, email, number FROM events WHERE id <= ?", [450]); while($row = $result->fetch("assoc")) { $names[] = $row['name']; $emails[] = $row['email']; $numbers[] = $row['number']; } if(!isset($names) || !isset($emails) || !isset($numbers)) exit('No rows'); var_export($names);
输出
['Bobby', 'Jessica', 'Victor', 'Andrew', 'Mallory']
获取键/值对
//First column must be unique, like a primary key; can only select 2 columns $arr = $mysqli->query("SELECT id, name FROM myTable WHERE age <= ?", [25])->fetchAll("keyPair"); if(!$arr) exit('No rows'); var_export($arr);
输出
[7 => 'Jerry', 10 => 'Bill', 29 => 'Bobby']
获取键/值对数组
//First column must be unique, like a primary key $arr = $mysqli->query("SELECT id, max_bench, max_squat FROM myTable WHERE weight < ?", [205])->fetchAll("keyPairArr"); if(!$arr) exit('No rows'); var_export($arr);
输出
[ 17 => ['max_bench' => 230, 'max_squat' => 175], 84 => ['max_bench' => 195, 'max_squat' => 235], 136 => ['max_bench' => 135, 'max_squat' => 285] ]
分组获取
//First column must be common value to group by $arr = $mysqli->query("SELECT eye_color, name, weight FROM myTable WHERE age < ?", [29])->fetchAll("group"); if(!$arr) exit('No rows'); var_export($arr);
输出
[ 'green' => [ ['name' => 'Patrick', 'weight' => 178], ['name' => 'Olivia', 'weight' => 132] ], 'blue' => [ ['name' => 'Kyle', 'weight' => 128], ['name' => 'Ricky', 'weight' => 143] ], 'brown' => [ ['name' => 'Jordan', 'weight' => 173], ['name' => 'Eric', 'weight' => 198] ] ]
分组获取,单列
//First column must be common value to group by $arr = $mysqli->query("SELECT eye_color, name FROM myTable WHERE age < ?", [29])->fetchAll("groupCol"); if(!$arr) exit('No rows'); var_export($arr);
输出
[ 'green' => ['Patrick', 'Olivia'], 'blue' => ['Kyle', 'Ricky'], 'brown' => ['Jordan', 'Eric'] ]
分组获取,对象数组
//First column must be common value to group by $arr = $mysqli->query("SELECT eye_color, name, weight FROM myTable WHERE age < ?", [29])->fetchAll("groupObj"); if(!$arr) exit('No rows'); var_export($arr);
你甚至可以传递一个类名,就像传递'obj'一样。
$mysqli->query("SELECT eye_color, name, weight FROM myTable WHERE age < ?", [29])->fetchAll("groupObj", "myClass");
输出
[ 'green' => [ stdClass Object ['name' => 'Patrick', 'weight' => 178], stdClass Object ['name' => 'Olivia', 'weight' => 132] ], 'blue' => [ stdClass Object ['name' => 'Kyle', 'weight' => 128], stdClass Object ['name' => 'Ricky', 'weight' => 143] ], 'brown' => [ stdClass Object ['name' => 'Jordan', 'weight' => 173], stdClass Object ['name' => 'Eric', 'weight' => 198] ] ]
Like
$search = "%{$_POST['search']}%"; $arr = $mysqli->query("SELECT id, name, age FROM events WHERE name LIKE ?", [$search])->fetchAll(); if(!$arr) exit('No rows'); var_export($arr);
Where In Array
$inArr = [12, 23, 44]; $clause = $mysqli->whereIn($inArr); //Create question marks $arr = $mysqli->query("SELECT event_name, description, location FROM events WHERE id IN($clause)", $inArr)->fetchAll(); if(!$arr) exit('No rows'); var_export($arr);
与其他占位符一起使用
$inArr = [12, 23, 44]; $clause = $mysqli->whereIn($inArr); //Create question marks $fullArr = array_merge($inArr, [5]); //Merge WHERE IN values with rest of query $arr = $mysqli->query("SELECT event_name, description, location FROM events WHERE id IN($clause) AND id < ?", $fullArr)->fetchAll(); if(!$arr) exit('No rows'); var_export($arr);
事务
这可能是我最喜欢的这个类的特性,因为从代码行数的差异来看是荒谬的。这还会在affectedRows()
小于一的情况下自动回滚,如果没有任何行受到影响,这不会触发异常。如果发生任何错误,它将消息附加到你的错误日志中。此外,如果affectedRows()
等于零,它将抛出任何异常。
$sql[] = "INSERT INTO myTable (name, age) VALUES (?, ?)"; $sql[] = "UPDATE myTable SET name = ? WHERE id = ?"; $sql[] = "UPDATE myTable SET name = ? WHERE id = ?"; $arrOfValues = [[$_POST['name'], $_POST['age']], ['Pablo', 34], [$_POST['name'], $_SESSION['id']]]; $mysqli->atomicQuery($sql, $arrOfValues);
相同模板,不同值
$sql = "INSERT INTO myTable (name, age) VALUES (?, ?)"; $arrOfValues = [[$_POST['name'], $_POST['age']], ['Pablo', 34], [$_POST['name'], 22]]; $mysqli->atomicQuery($sql, $arrOfValues);
使用回调的事务
在Simple MySQLi中使用atomicQuery()
进行事务处理的方式非常简洁,适用于大多数情况。然而,有时你可能需要更多的控制。例如,在底层,它只检查每个查询的affectedRows()
是否大于一。这对于像INSERT多行或DELETE/UPDATE影响多行这样的查询并不合适。
不需要启动事务,也不需要处理回滚。如果你想回滚,只需抛出异常,它会自动回滚,同时仅在错误日志中打印异常。执行允许你高效地使用不同的值重用你的预处理语句。
$mysqli->transaction(function($mysqli) { $insert = $mysqli->query("INSERT INTO myTable (sender, receiver) VALUES (?, ?)", [28, 330]); if($insert->affectedRows() < 1) throw new Exception('Error inserting'); echo $insert->insertId(); $insert->execute([243, 49]); //reuse same insert query $delete = $mysqli->query("DELETE FROM myTable WHERE max_bench < ?", [125]); });
错误异常处理
你可以用单个try/catch
包裹所有查询,或者使用set_exception_handler()
函数将错误重定向到全局错误页面或每个页面的单独页面。**不要忘记在生产环境中删除echo**,因为你显然不需要让客户端看到这些信息。
异常处理的注意事项
由于某种原因,当在bind_param()
中绑定太多的变量或类型时,mysqli_sql_exception
无法正确地将错误转换为异常。这就是为什么你可能需要设置一个全局错误处理程序来将此错误转换为异常的原因。我展示了如何将所有错误转换为异常,但需要注意的是,许多程序员认为这是有争议的。在这种情况下,你实际上只需要担心E_WARNING
。
set_error_handler(function($errno, $errstr, $errfile, $errline) { throw new Exception("$errstr on line $errline in file $errfile"); });
Try/Catch
//include mysqli_connect.php try { $insert = $mysqli->query("INSERT INTO myTable (name, age) VALUES (?, ?)", [$_POST['name'], $_POST['age']]); } catch (Exception $e) { error_log($e); exit('Error inserting'); }
自定义异常处理程序
//include mysqli_connect.php set_exception_handler(function($e) { error_log($e); exit('Error inserting'); }); $insert = $mysqli->query("INSERT INTO myTable (name, age) VALUES (?, ?)", [$_POST['name'], $_POST['age']]);
释放和关闭
释放结果和关闭预处理语句非常简单。
$arr = $mysqli->query("SELECT id, name, age FROM events WHERE id <= ?", [4])->fetchAll("assoc"); if(!$arr) exit('No rows'); $mysqli->freeResult(); //Free result $mysqli->closeStmt(); //Close statement $mysqli->close(); //Close connection
你甚至可以链式调用它们。
$arr = $mysqli->query("SELECT id, name, age FROM events WHERE id <= ?", [4])->fetchAll("assoc"); if(!$arr) exit('No rows'); $mysqli->freeResult()->closeStmt()->close();
文档
构造函数
new SimpleMySQLi(string $host, string $username, string $password, string $dbName, string $charset = 'utf8mb4', string $defaultFetchType = 'assoc')
参数
- string $host - 主机名或IP地址,如localhost或127.0.0.1
- string $username - 数据库用户名
- string $password - 数据库密码
- string $dbName - 数据库名
- string $charset = 'utf8mb4'(可选)- 默认字符编码
- string defaultFetchType = 'assoc'(可选)- 默认获取类型。可以是
- 'assoc' - 关联数组
- 'obj' - 对象数组
- 'num' - 数字数组
- 'col' - 1D数组。等同于
PDO::FETCH_COLUMN
抛出
- SimpleMySQLiException如果指定的
$defaultFetchType
不是允许的获取模式之一 - mysqli_sql_exception如果由于
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT)
而任何mysqli函数失败
query()
function query(string $sql, array|string|int $values = [], string $types = ''): self
描述
所有查询都放在这里。如果为SELECT语句,需要与fetch()
(用于单行和循环获取)或fetchAll()
(用于获取所有结果)一起使用。
参数
- string $sql - SQL查询
- array|string|int $values = [](可选)- 要绑定到查询的值或变量;对于选择所有行可以是空的
- string $types = ''(可选)- 每个绑定值/变量的变量类型
返回
$this
抛出
- mysqli_sql_exception如果由于
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT)
而任何mysqli函数失败
execute()
function execute(array $values = [], string $types = ''): self
描述
用于更有效地在具有不同值的相同SQL语句中使用。实际上是一个重新执行函数
参数
- array $values = [](可选)- 要绑定到查询的值或变量;对于选择所有行可以是空的
- string $types = ''(可选)- 每个绑定值/变量的变量类型
返回
$this
抛出
- mysqli_sql_exception如果由于
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT)
而任何mysqli函数失败
whereIn()
function whereIn(array $inArr): string
描述
为WHERE IN()
数组创建正确数量的问号。
参数
- array $inArr - 用于WHERE IN子句的数组
返回
string 正确数量的问号
抛出
- mysqli_sql_exception如果由于
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT)
而任何mysqli函数失败
numRows()
function numRows(): int
描述
从SELECT获取行数。
返回
- int $mysqli->num_rows
抛出
- mysqli_sql_exception如果由于
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT)
而任何mysqli函数失败
affectedRows()
function affectedRows(): int
描述
获取受影响的行数。可以在SELECT中替代numRows()使用
返回
- int $mysqli->affected_rows
抛出
- mysqli_sql_exception如果由于
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT)
而任何mysqli函数失败
info()
function info(): array
描述
affectedRows()的一个更具体版本,可以提供更多关于发生了什么的信息。在底层使用$mysqli::info。可以用于以下情况
返回
- array 从结果字符串转换的关联数组
抛出
- mysqli_sql_exception如果由于
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT)
而任何mysqli函数失败
rowsMatched()
function rowsMatched(): int
描述
获取匹配的行而不是更改的行。只能在UPDATE中严格使用。否则返回false
返回
- int 匹配的行数
抛出
- mysqli_sql_exception如果由于
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT)
而任何mysqli函数失败
insertId()
function insertId(): int
描述
获取最新插入的主键
返回
- int $mysqli->insert_id
抛出
- mysqli_sql_exception如果由于
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT)
而任何mysqli函数失败
fetch()
function fetch(string $fetchType = '', string $className = 'stdClass', array $classParams = [])
描述
每次获取一行
参数
- string $fetchType = '' (可选) - 这将覆盖构造函数中设置的默认获取类型。在此处检查可能的值这里
- string $className = 'stdClass' (可选) - 如果$fetchType为'obj',则将获取到的数据存入该类
- array $classParams = [] (可选) - 如果$fetchType为'obj',则用于类的构造函数参数数组
返回
- 指定了
$fetchType
的1数组行 - 标量 如果选择了'col'类型
- NULL 如果在循环的末尾(与vanilla MySQLi相同的操作行为)
抛出
- SimpleMySQLiException
- 如果指定的$fetchType不是允许的获取模式之一
- 如果违反了获取模式规范
- mysqli_sql_exception如果由于
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT)
而任何mysqli函数失败
fetchAll()
function fetchAll(string $fetchType = '', string $className = 'stdClass'): array
描述
以数组形式获取所有结果
参数
- string $fetchType = '' (可选) - 这将覆盖构造函数中设置的默认获取类型。在此处检查可能的值这里。
fetchAll()
还具有额外的获取模式- 'keyPair' - 唯一键(第1列)到单个值(第2列)。与
PDO::FETCH_KEY_PAIR
相同 - 'keyPairArr' - 唯一键(第1列)到数组。与
PDO::FETCH_UNIQUE
相同 - 'group' - 根据第1列中的公共值分组到关联子数组中。与
PDO::FETCH_GROUP
相同 - 'groupCol' - 根据第1列中的公共值分组到1维子数组中。与
PDO::FETCH_GROUP | PDO::FETCH_COLUMN
相同 - 'groupObj' - 根据第1列中的公共值分组到对象子数组中。与
PDO::FETCH_GROUP | PDO::FETCH_CLASS
相同
- 'keyPair' - 唯一键(第1列)到单个值(第2列)。与
- string $className = 'stdClass' (可选) - 如果$fetchType为'obj',则将获取到的数据存入该类
- array $classParams = [] (可选) - 如果$fetchType为'obj',则用于类的构造函数参数数组
返回
- 指定了
$fetchType
的全数组 - 如果没有结果,则为
[]
抛出
- SimpleMySQLiException
- 如果指定的$fetchType不是允许的获取模式之一
- 如果违反了获取模式规范
- mysqli_sql_exception如果由于
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT)
而任何mysqli函数失败
atomicQuery()
function atomicQuery(array|string $sql, array $values, array $types = []): void
描述
这是一个普通的交易,将自动回滚并将您的消息打印到错误日志中。如果affectedRows()
小于1,也会回滚。
参数
- array|string $sql - SQL查询;可以是数组用于不同的查询,或者是一个字符串用于具有不同值的相同查询
- array $values - 绑定到查询的值或变量
- array $types = [] (可选) - 绑定值/变量的变量类型数组
抛出
- SimpleMySQLiException 如果参数值、参数类型或SQL不匹配
- mysqli_sql_exception 如果由于
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT)
而导致事务失败
transaction()
function transaction(callable $callback($this)): void
描述
在事务内部执行操作
参数
- callable $callback($this) - 闭包,用于在内部执行事务操作。参数值是
$this
抛出
- mysqli_sql_exception 如果由于
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT)
而导致事务失败
freeResult()
function freeResult(): self
描述
释放MySQL结果
返回
$this
抛出
- mysqli_sql_exception 如果由于
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT)
而导致mysqli函数失败
closeStmt()
function closeStmt(): self
描述
关闭MySQL预处理语句
返回
$this
抛出
- mysqli_sql_exception 如果由于
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT)
而导致mysqli函数失败
close()
function close(): void
描述
关闭MySQL连接
抛出
- mysqli_sql_exception 如果由于
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT)
而导致mysqli函数失败
变更日志
变更日志可以在这里找到