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

