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

PHP导入含MySQLi函数的文件后调用页面出现数据库连接未定义错误

问题解决说明

错误原因

PHP函数作用域默认无法访问全局定义的变量,你在config.php中定义的$link属于全局变量,clubsData.php里的checkEnrollment()是独立函数,内部没有引入全局$link就直接调用,所以$link为null,触发参数错误。
同时你现有代码中mysqli_stmt_close($stmt)写在return语句之后,永远不会被执行,属于无效代码。

解决方案

方案1:将数据库连接作为参数传入函数(最推荐,无全局依赖)

修改clubsData.php中的函数定义,新增$link参数:

function checkEnrollment($link, $user_id, $club_id) {
    $sql = "SELECT role FROM in_clubs WHERE user_id = ? AND club_id = ?";
    $stmt = mysqli_prepare($link, $sql);
    $param_user_id = $user_id;
    $param_club_id = $club_id;
    mysqli_stmt_bind_param($stmt, "ss", $param_user_id, $param_club_id);
    mysqli_stmt_execute($stmt);
    mysqli_stmt_store_result($stmt);
    $exists = mysqli_stmt_num_rows($stmt) == 1;
    mysqli_stmt_close($stmt); // 移到return之前执行
    return $exists;
}

调用时传入$link变量,修改main.php的调用代码:

checkEnrollment($link, $user_id, $clubid);

方案2:函数内声明使用全局$link(写法简单,不推荐大型项目使用)

在checkEnrollment函数开头声明全局变量即可:

function checkEnrollment($user_id, $club_id) {
    global $link; // 新增这行,引入全局$link
    $sql = "SELECT role FROM in_clubs WHERE user_id = ? AND club_id = ?";
    $stmt = mysqli_prepare($link, $sql);
    $param_user_id = $user_id;
    $param_club_id = $club_id;
    mysqli_stmt_bind_param($stmt, "ss", $param_user_id, $param_club_id);
    mysqli_stmt_execute($stmt);
    mysqli_stmt_store_result($stmt);
    $exists = mysqli_stmt_num_rows($stmt) == 1;
    mysqli_stmt_close($stmt);
    return $exists;
}

方案3:封装数据库单例方法(适合多场景复用连接)

在config.php中新增连接获取方法,避免重复创建数据库连接:

// config.php新增代码
function getDbLink() {
    static $link = null;
    if ($link === null) {
        $DB_SERVER = getenv('DB_HOST');
        $DB_USERNAME = getenv('DB_USER');
        $DB_PASSWORD = getenv('DB_PASSWORD');
        $DB_NAME = getenv('DB_NAME');
        $link = mysqli_connect($DB_SERVER, $DB_USERNAME, $DB_PASSWORD, $DB_NAME);
        mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    }
    return $link;
}

函数内直接调用方法获取连接即可:

function checkEnrollment($user_id, $club_id) {
    $link = getDbLink();
    $sql = "SELECT role FROM in_clubs WHERE user_id = ? AND club_id = ?";
    $stmt = mysqli_prepare($link, $sql);
    $param_user_id = $user_id;
    $param_club_id = $club_id;
    mysqli_stmt_bind_param($stmt, "ss", $param_user_id, $param_club_id);
    mysqli_stmt_execute($stmt);
    mysqli_stmt_store_result($stmt);
    $exists = mysqli_stmt_num_rows($stmt) == 1;
    mysqli_stmt_close($stmt);
    return $exists;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 12:45:01