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

