如何修复mysqli_query中$con变量为NULL的致命错误?
错误修复方法及代码优化建议
一、核心问题根源
你遇到的mysqli_query(): Argument #1 ($mysql) must be of type mysqli, null given错误,本质是页面初始化时$con变量未被赋值(为NULL),但你在index.php里直接调用了这个未初始化的连接对象执行查询。问题出在connection.php仅在点击搜索按钮b1时才创建数据库连接,而非页面加载时就完成连接初始化。
二、具体修复步骤
1. 修改connection.php:确保页面加载时就建立数据库连接
把原本放在b1按钮判断里的连接代码移出来,让页面一加载就完成连接,而不是仅在搜索时才创建。示例代码:
// connection.php <?php // 直接初始化数据库连接,不要嵌套在按钮判断里 $host = 'localhost'; // 你的数据库主机,XAMPP默认是localhost $dbname = '你的数据库名称'; $username = 'root'; // XAMPP默认用户名 $password = ''; // XAMPP默认密码(未设置则为空) // 创建连接 $con = mysqli_connect($host, $username, $password, $dbname); // 检查连接是否成功 if (!$con) { die("数据库连接失败: " . mysqli_connect_error()); } ?>
2. 调整index.php的调用逻辑
在index.php开头引入connection.php,不需要用global $con(全局变量不推荐),直接使用引入后的$con即可:
// index.php <?php // 先引入连接文件,确保$con已初始化 require_once 'connection.php'; // 页面加载时默认查询所有数据 $query = "SELECT * FROM train_schedule"; $result = mysqli_query($con, $query); // 保留搜索按钮的逻辑:点击后执行带条件的查询 if (isset($_POST['b1'])) { $searchContent = $_POST['你的搜索输入框名称']; // 替换为实际输入框name属性值 // 注意:这里后续要优化为预处理语句,先保持基础逻辑 $query = "SELECT * FROM train_schedule WHERE 对应列名 LIKE '%$searchContent%'"; $result = mysqli_query($con, $query); } // 后续处理查询结果(比如遍历输出) ?>
三、代码优化建议
- 避免使用全局变量:全局变量容易引发变量污染和调试困难,通过
require_once引入连接文件后直接使用$con即可,无需global $con。 - 用预处理语句防止SQL注入:如果涉及用户输入(比如搜索内容),必须用预处理语句替代直接拼接SQL,示例:
// 预处理语句示例(替换index.php中的搜索查询逻辑) if (isset($_POST['b1'])) { $searchContent = $_POST['你的搜索输入框名称']; $query = "SELECT * FROM train_schedule WHERE train_name LIKE ?"; $stmt = mysqli_prepare($con, $query); $likeTerm = "%$searchContent%"; mysqli_stmt_bind_param($stmt, "s", $likeTerm); // "s"表示参数为字符串类型 mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); }
- 优化错误处理:不要仅用
die()输出错误,可结合错误日志和友好提示,同时开启PHP错误日志便于调试:
// connection.php中优化错误处理 if (!$con) { error_log("数据库连接失败: " . mysqli_connect_error()); echo "抱歉,数据库连接出现问题,请稍后重试。"; exit; }
- 分离业务逻辑:把数据库操作(比如查询时刻表)封装成函数,放在单独的文件(如
db_functions.php)中,提升代码复用性和可维护性:
// db_functions.php function getTrainSchedule($con, $searchTerm = null) { if ($searchTerm) { $query = "SELECT * FROM train_schedule WHERE train_name LIKE ?"; $stmt = mysqli_prepare($con, $query); $likeTerm = "%$searchTerm%"; mysqli_stmt_bind_param($stmt, "s", $likeTerm); mysqli_stmt_execute($stmt); return mysqli_stmt_get_result($stmt); } else { $query = "SELECT * FROM train_schedule"; return mysqli_query($con, $query); } }
在index.php中调用:
require_once 'connection.php'; require_once 'db_functions.php'; $result = getTrainSchedule($con, $_POST['你的搜索输入框名称'] ?? null);
内容的提问来源于stack exchange,提问作者Virtualization
相关产品推荐
相关产品推荐

