You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP封装含switch的查询函数返回NULL 直接写switch可正常运行

问题原因

函数调用返回NULL是两个核心问题导致的:

  • 函数没有定义返回值。你在switch分支里把查询结果存到了局部变量$results,但没有通过return把结果传递到函数外部,PHP中没有显式返回值的函数默认返回NULL,这是问题的直接原因。
  • 写法不规范:在函数内部引入数据库配置文件,容易触发重复加载错误;header跳转后没有加exit终止流程,会导致后续代码继续执行;三个分类分支的SQL逻辑完全一致,重复编码提升维护成本;直接把参数拼入SQL存在注入风险。
修正代码

首先调整functions.php中的函数逻辑:

// 函数外部统一引入配置,不要在函数内重复加载
include 'includes/config.php';

function showListsByCat($cat, $conn) {
    // 白名单校验参数,仅允许合法分类值传入
    $allowCat = ['X', 'Y', 'Z'];
    if (!in_array($cat, $allowCat)) {
        header("Location: index.php?error=noListsFound");
        exit; // 跳转后立刻终止后续代码运行
    }
    // 用预处理语句绑定参数,避免SQL注入,无需重复写三个分支的相同SQL
    $sql = "SELECT * FROM lists 
            INNER JOIN categories ON lists.subject = categories.id 
            WHERE categories.name = ?";
    $stmt = mysqli_prepare($conn, $sql);
    mysqli_stmt_bind_param($stmt, "s", $cat);
    mysqli_stmt_execute($stmt);
    $results = mysqli_stmt_get_result($stmt);
    // 把查询结果返回给调用方
    return $results;
}

再调整页面B的调用逻辑:

include 'functions.php';
// 兼容参数不存在的场景,避免Undefined array key警告
$query = isset($_GET['cat']) ? trim($_GET['cat']) : "";
// 传入数据库连接,接收函数返回的结果集
$listData = showListsByCat($query, $conn);
// 遍历结果集输出内容即可
while ($item = mysqli_fetch_assoc($listData)) {
    // 按需输出列表字段,例如echo $item['list_title'];
}
优化说明
  • 移除了冗余的switch分支,三个分类的查询逻辑完全一致,统一处理后后续修改逻辑只需要调整一处。
  • 增加参数白名单+预处理SQL,从根源上避免SQL注入风险。
  • 修正了header跳转无终止逻辑的问题,避免异常流程下代码继续执行。
  • 数据库连接通过参数传入函数,不依赖全局作用域变量,代码可维护性更强。

内容的提问来源于stack exchange,提问作者krzyzws

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 11:54:21