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

PHP引入外部数据库连接文件后$con为null的问题解决

解决mysqli_query提示参数1为null的变量作用域问题

看起来你遇到的核心问题是数据库连接变量$con无法在代码块中正常访问,即便尝试了global $con也没效果。我们一步步来排查和解决:

第一步:先确认数据库连接是否真的成功

很多时候$con为null不是作用域的问题,而是mysqli_connect本身连接失败了。先修改你的includes/db.php,添加连接错误检查:

<?php 
$con = mysqli_connect("localhost","root","","ecommerce",3307);
// 强制检查连接状态,避免后续排查走弯路
if (!$con) {
    die("数据库连接失败: " . mysqli_connect_error());
}
?>

如果连接失败,页面会直接输出错误信息,你可以根据提示调整账号、密码、端口或数据库名称。

第二步:排除文件引入路径问题

如果连接没问题,那就要确认includes/db.php是否被正确引入。相对路径很容易出错,比如当前页面是否和includes文件夹在同一层级?你可以在引入后添加校验:

<!DOCTYPE>
<?php 
include("includes/db.php");
// 检查$con是否被正确定义
if (!isset($con)) {
    die("错误:无法引入数据库连接文件");
}
?>

如果这里报错,说明路径不对,调整include的路径(比如用绝对路径$_SERVER['DOCUMENT_ROOT'] . '/includes/db.php'会更可靠)。

第三步:去掉不必要的global $con

你当前的代码块是在页面顶层(没有嵌套在函数里),而include在顶层的文件里定义的变量默认就是全局变量,直接使用即可,不需要额外加global $con——这个声明反而可能在某些环境下造成混淆。修改后的代码块应该是:

<select name="product_cat">
<option>Select a Category</option>
<?php 
$get_cats = "select * from categories"; 
$run_cats = mysqli_query($con,$get_cats); 
// 顺便检查查询是否成功
if (!$run_cats) {
    die("查询失败: " . mysqli_error($con));
}
while($row_cats=mysqli_fetch_array($run_cats)){ 
    $cat_id = $row_cats['cat_id']; 
    $cat_title = $row_cats['cat_title']; 
    echo " <option value='$cat_id'>$cat_title</option> "; 
} 
?>
</select>

进阶方案:避免全局变量,用函数封装连接

全局变量容易引发作用域问题,推荐把数据库连接封装成函数,这样更可靠也更易维护:
修改includes/db.php为:

<?php
function getDbConnection() {
    // static确保连接只建立一次
    static $con;
    if (!$con) {
        $con = mysqli_connect("localhost","root","","ecommerce",3307);
        if (!$con) {
            die("数据库连接失败: " . mysqli_connect_error());
        }
    }
    return $con;
}
?>

然后在页面中使用:

<select name="product_cat">
<option>Select a Category</option>
<?php 
$get_cats = "select * from categories"; 
$run_cats = mysqli_query(getDbConnection(), $get_cats); 
if (!$run_cats) {
    die("查询失败: " . mysqli_error(getDbConnection()));
}
while($row_cats=mysqli_fetch_array($run_cats)){ 
    $cat_id = $row_cats['cat_id']; 
    $cat_title = $row_cats['cat_title']; 
    echo " <option value='$cat_id'>$cat_title</option> "; 
} 
?>
</select>

这种方式彻底避免了全局变量的作用域问题,而且多次调用也只会建立一次数据库连接,性能更好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:04:34