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
相关产品推荐
相关产品推荐

