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

MySQL数据更新报错:Call to a member function query() on null求助

解决MySQL UPDATE时的"Call to a member function query() on null"错误

你的问题核心很明确:数据库连接变量$conexion是null,所以调用query()方法才会抛出这个致命错误。下面一步步帮你排查和解决:

1. 先定位连接失败的根源

你的Pay类里用了global $conexion;来获取数据库连接,但这个变量没正确初始化,大概率是以下两个原因之一:

原因A:Conexion.php的路径错误

你的require_once "../../model/Conexion.php";路径是否正确?
Pay.php在C:\xampp\htdocs\solventas\dashboard\Modelos\,所以../../model/Conexion.php对应的实际路径是C:\xampp\htdocs\solventas\model\Conexion.php——先确认这个文件确实存在,文件名大小写也和代码里的一致(Windows虽不区分大小写,但最好保持统一避免意外)。

原因B:Conexion.php的连接代码有问题

打开Conexion.php检查:

  • 是否正确创建了$conexion全局变量?比如应该有类似代码:
    define('HOST', 'localhost');
    define('USER', 'root'); // 你的数据库用户名
    define('PASS', ''); // 你的数据库密码
    define('DB', 'solventas'); // 你的目标数据库名
    
    $conexion = new mysqli(HOST, USER, PASS, DB);
    // 必须加连接失败的检查!
    if ($conexion->connect_error) {
        die("数据库连接失败: " . $conexion->connect_error);
    }
    
  • 如果连接代码里没有错误处理,可能连接失败了但你没察觉,导致$conexion变成null。可以在Conexion.php末尾加一行var_dump($conexion);,运行代码看输出是不是有效的mysqli实例。

2. 优化代码:摆脱全局变量依赖

全局变量很容易出现作用域问题,建议把数据库连接封装到Pay类的属性里,这样更可靠:

class Pay {
    // 用类属性存储连接实例
    private $conexion;

    public function __construct() {
        require_once "../../model/Conexion.php";
        // 直接把全局连接赋值给类属性
        $this->conexion = $GLOBALS['conexion'];
        // 更推荐的方式:直接在构造函数里初始化连接(减少对外部全局变量的依赖)
        // $this->conexion = new mysqli(HOST, USER, PASS, DB);
        // if ($this->conexion->connect_error) {
        //     die("连接失败: " . $this->conexion->connect_error);
        // }
    }

    public function Users ($id, $idem, $c_user, $num_pay, $total_pay) {
        // 用$this->conexion代替全局变量
        $update = "UPDATE Users SET Users = $c_user, num_pay = $num_pay, total_pay = $total_pay WHERE id_user = $id AND idem = $idem";
        $query = $this->conexion->query($update);
        return $query;
    }
}

3. 紧急修复:SQL注入风险!

你的UPDATE语句直接把变量拼进SQL里,不仅容易被SQL注入攻击,还可能因为变量类型(比如$c_user是字符串)导致SQL语法错误。建议立刻改用预处理语句:

public function Users ($id, $idem, $c_user, $num_pay, $total_pay) {
    // 用?作为参数占位符
    $update = "UPDATE Users SET Users = ?, num_pay = ?, total_pay = ? WHERE id_user = ? AND idem = ?";
    // 初始化预处理语句
    $stmt = $this->conexion->prepare($update);
    // 绑定参数:第一个参数是类型字符串,i=整数,d=浮点数,s=字符串,根据你的字段类型调整
    $stmt->bind_param("idiii", $c_user, $num_pay, $total_pay, $id, $idem);
    // 执行更新
    $stmt->execute();
    // 返回是否更新成功(受影响行数大于0)
    return $stmt->affected_rows > 0;
}

4. 额外检查点

  • 对比UsersCount函数的数据库连接方式,看看它和Users函数的区别,是不是哪里的连接逻辑不一样;
  • 如果你最近调整过文件目录结构,一定要重新核对所有require_once的路径是否正确。

内容的提问来源于stack exchange,提问作者Carmen B.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:23:56