PHP报Undefined variable: con及null调用query()致命错误求助
报错信息
- 提示级错误:
Undefined variable: con,触发文件:D:\xampp\htdocs\tanmay.com\p\andooze\include\dbconfig.php,第15行 - 致命错误:
Uncaught Error: Call to a member function query() on null,触发文件:D:\xampp\htdocs\tanmay.com\p\andooze\include\dbconfig.php第15行,调用栈:- 栈帧0:
front_header.php第3行通过require()引入dbconfig.php - 栈帧1:
index.php第2行通过require()引入front_header.php - 栈帧2:主入口逻辑抛出未捕获异常
- 栈帧0:
问题根因
- 变量作用域错误:
$con数据库连接对象仅在try代码块内初始化赋值,一旦数据库连接失败抛出异常,代码进入catch分支后不会给$con赋值,该变量不存在。后续在try/catch块外部直接调用$con->query()时,$con为null,直接触发两个报错。 - 异常分支无阻断:
catch块仅做了错误日志记录,没有终止后续执行逻辑,导致强依赖数据库连接的查询代码依然会运行。 - 重复逻辑冲突:
front_header.php开头重复调用session_start(),和dbconfig.php中已做的session启动判断逻辑冲突,会触发"session已启动"的额外警告。
修复方案
- 修改
dbconfig.php代码,调整变量作用域、增加异常阻断,修复后代码如下:
<?php if (session_status() == PHP_SESSION_NONE) { session_start(); } mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); // 提前初始化连接变量,避免未定义变量提示 $con = null; try { // 数据库连接参数 $con = new mysqli("localhost", "tanmayna_andooze", "andooze123@", "tanmayna_andooze"); $con->set_charset("utf8mb4"); } catch(Exception $e) { error_log($e->getMessage()); // 连接失败直接终止执行,返回通用提示 die("数据库服务暂时不可用,请稍后重试"); } // 连接成功后再执行查询逻辑 $fset = $con->query("select * from setting")->fetch_assoc(); $fetch_main = $con->query("select * from main_setting")->fetch_assoc(); date_default_timezone_set($fset['timezone']); $dirname = dirname( dirname(__FILE__) ).'/api'; $dirname = dirname( dirname(__FILE__) ).'/rapi'; ?>
- 修改
front_header.php开头代码,删除重复的session启动逻辑:
<?php // 删除冗余的session_start()调用,dbconfig.php已做兼容处理 require 'dbconfig.php'; ?>
- 额外排查项:如果修改代码后仍触发数据库连接错误,依次检查:
- XAMPP控制面板中MySQL服务是否正常启动
- 本地数据库中是否存在
tanmayna_andooze这个库 - 配置的数据库用户名、密码是否和本地XAMPP的数据库账号权限匹配
内容的提问来源于stack exchange,提问作者Tanmay Nandwana
相关产品推荐
相关产品推荐

