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

