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

