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

使用include_once引入PHP文件后$con变量未定义报错如何解决

问题原因
  • 路径错误:这是最高发的原因。你当前写的include_once 'includes/dbh.inc.php'是相对路径,需要保证dbh.inc.php确实存放在index.php同级的includes目录下。include_once加载不存在的文件时仅会抛出警告,不会终止脚本运行,如果你关闭了PHP警告显示,就只会看到后续$con未定义的报错。
  • include_once重复加载特性:如果dbh.inc.php在当前页面生命周期内已经被其他代码引入过一次,include_once不会重复加载文件,若之前引入的上下文没有将$con传递到当前作用域,就会出现变量未定义。
  • 作用域问题:如果你的include_once语句是写在函数/方法内部的,那$con会成为局部变量,全局代码无法直接访问。
  • 数据库连接失败:dbh.inc.php中没有加入连接校验逻辑,如果连接数据库出错,$con会是布尔值false,部分场景下也会触发类似未定义的报错。
修复方案
  • 第一步优先排查路径问题:
    把include_once临时换成require 'includes/dbh.inc.php'测试,require加载不存在的文件会直接抛出致命错误,可以快速确认是否是路径不对导致的加载失败。
    更稳妥的写法是用绝对路径引入,避免相对路径受PHP执行目录影响的问题:
    include_once __DIR__ . '/includes/dbh.inc.php';
    
    其中__DIR__是当前index.php文件所在的目录,会自动拼接正确的绝对路径。
  • 解决重复加载/作用域问题:
    推荐把数据库连接封装成函数,避免全局变量污染和作用域问题,修改dbh.inc.php代码如下:
    <?php
    function get_db_conn() {
        // 静态变量保证连接只初始化一次
        static $con = null;
        if ($con === null) {
            $dbServername = "localhost";
            $dbUsername = "root";
            $dbPassword = "";
            $dbName = "loginsystem";
            $con = mysqli_connect($dbServername, $dbUsername, $dbPassword, $dbName);
            // 加入连接错误校验
            if (!$con) {
                die("数据库连接失败:" . mysqli_connect_error());
            }
        }
        return $con;
    }
    
    之后在index.php中调用函数获取连接即可:
    $con = get_db_conn();
    
  • 如果确认是重复加载导致的问题,也可以临时把include_once换成include测试,确认问题后再调整代码引入逻辑即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 23:24:04