直接返回这个空结果集,上层调用时需要额外判断,不够友好

当前代码中,查询语句会返回mysqli_result对象(结果集),但如果查询结果为空(比如SELECT * FROM table WHERE id=999),这个结果集对象依然是有效的,只是里面没有数据。直接返回这个空结果集,上层调用时需要额外判断,不够友好。

我们可以优化代码,让查询语句返回统一格式的结果(比如空数组 / 数据数组),增删改仍返回布尔值,同时保留错误异常机制,这样上层调用会更直观。

protected function executePreparedStatement($sql, $types = '', $params = [])

{

try {

$stmt = $this->conn->prepare($sql);

if (!$stmt) {

throw new Exception("预处理语句创建失败: " . $this->conn->error);

}

// 如果有参数,绑定参数

if (!empty($types) && !empty($params)) {

// 使用可变参数绑定

$stmt->bind_param($types, ...$params);

}

// 执行语句

$executeSuccess = $stmt->execute();

if (!$executeSuccess) {

throw new Exception("SQL执行失败: " . $stmt->error);

}

// 区分查询语句和增删改语句

if ($stmt->affected_rows > -1) {

// 查询语句:获取结果集并转为数组(空结果集则返回空数组)

$resultSet = $stmt->get_result();

$result = [];

// 遍历结果集,转为关联数组

while ($row = $resultSet->fetch_assoc()) {

$result[] = $row;

}

// 释放结果集资源

$resultSet->free();

} else {

// 增删改语句:返回执行是否成功的布尔值

$result = $executeSuccess;

}

$stmt->close();

return $result;

} catch (Exception $e) {

// 可以记录日志,这里先抛出异常让上层处理

throw new Exception("预处理执行失败: " . $e->getMessage());

}

}

关键修改说明

查询语句结果处理:

原代码直接返回mysqli_result对象,现在遍历结果集转为关联数组;

如果结果集为空(没有匹配的数据),则返回空数组[],而非空对象,上层调用时只需判断empty($result)即可。

资源释放:新增$resultSet->free()释放结果集资源,避免内存泄漏。

保持增删改逻辑不变:增删改语句仍返回布尔值(true/false),保证原有逻辑兼容。

调用示例

// 1. 查询空结果集的情况

try {

$sql = "SELECT * FROM users WHERE id = ?";

$result = $this->executePreparedStatement($sql, 'i', [999]); // 假设id=999不存在

if (empty($result)) {

echo "查询结果为空"; // 会执行这行

} else {

print_r($result);

}

} catch (Exception $e) {

echo "查询失败:" . $e->getMessage();

}

// 2. 查询有结果的情况

try {

$sql = "SELECT * FROM users WHERE id = ?";

$result = $this->executePreparedStatement($sql, 'i', [1]); // 假设id=1存在

if (empty($result)) {

echo "查询结果为空";

} else {

print_r($result); // 输出包含数据的数组

}

} catch (Exception $e) {

echo "查询失败:" . $e->getMessage();

}

// 3. 增删改语句

try {

$sql = "UPDATE users SET name = ? WHERE id = ?";

$result = $this->executePreparedStatement($sql, 'si', ['测试', 1]);

if ($result) {

echo "更新成功";

} else {

echo "更新失败(无数据被修改)";

}

} catch (Exception $e) {

echo "更新失败:" . $e->getMessage();

}

总结

核心优化:将查询语句的mysqli_result对象转为数组,空结果集返回空数组,让上层调用无需处理数据库对象,只需判断数组是否为空;

兼容性:增删改语句仍返回布尔值,不改变原有调用逻辑;

可靠性:新增资源释放逻辑,避免长期运行导致的内存泄漏问题。

这样处理后,你可以通过empty($result)清晰判断查询结果是否为空,且能区分 “执行失败(抛异常)” 和 “执行成功但无数据(返回空数组)” 两种情况。

文件名精灵2025年最新版 机器翻译 AI智能
...
批量修改文件名称、文件夹名称

免费使用 功能无限制

全面接入机器自动翻译功能,主流AI大模型智能改名

方便快捷,支持正则表达式、无需安装功能齐全、支持定制无广告、无插件,放心使用。

免费下载
本站中所有的计算器的计算结果仅供参考,本站对此结果的准确性不承担任何责任,实际数额以银行/保险公司/国家相关机构确认的结果为准。
在线客服QQ:543690914,备案号: 苏ICP备15037649号-27。东海县白塔埠镇佳诚电脑经营部版权所有。