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

如何修复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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 14:30:39