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

PHP面向对象连接MySQL报错:Call to a member function query() on null求助

PHP OOP数据库连接错误排查与解决

问题背景

正在学习PHP面向对象编程,尝试以OOP方式连接名为lead_gen_business的MySQL数据库,基于预构建函数修改代码后遇到数据库连接相关错误,最后出现的错误信息如下:

Fatal error: Uncaught Error: Call to a member function query() on null in C:\wamp64\www\OOP Fundamentals\Advance OOP\Query Builder\database.php on line 38

错误原因分析

错误核心在于Database类的查询方法中误用了全局变量$connection:

  • 类中通过connect方法将连接实例赋值给了类的属性$this->connection
  • 但所有查询方法(fetch_all、fetch_record等)却使用global $connection来调用数据库连接,而这个全局变量从未被定义过,因此值为null,调用query()方法时自然报错。

解决方案

1. 修正Database类的查询方法

将所有查询方法中的global $connection替换为类实例属性$this->connection,同时新增连接和查询的错误检查,避免后续隐藏问题:

class Database
{
    public $connection;

    public function __construct()
    {
        if (!defined('DB_HOST')) {
            define('DB_HOST', 'localhost');
        }

        if (!defined('DB_USER')) {
            define('DB_USER', 'root');
        }

        if (!defined('DB_PASS')) {
            define('DB_PASS', 'Yourpass');
        }
    }

    public function connect($db_name)
    {
        $this->connection = new mysqli(DB_HOST, DB_USER, DB_PASS, $db_name);
        
        // 检查连接是否成功
        if ($this->connection->connect_error) {
            die("数据库连接失败: " . $this->connection->connect_error);
        }
    }

    /*-----------------------END OF CONNECTION PROCESS------------------------*/
    /*----------------------DATABASE QUERYING FUNCTIONS-----------------------*/
    //SELECT - 用于获取单条或多条结果,返回包含关联数组的数组
    function fetch_all($query)
    {
        $data = array();
        $result = $this->connection->query($query);
        
        // 检查查询是否成功
        if (!$result) {
            die("查询失败: " . $this->connection->error);
        }
        
        while ($row = mysqli_fetch_assoc($result)) {
            $data[] = $row;
        }
        return $data;
    }
    //SELECT - 用于获取单条结果,返回关联数组
    function fetch_record($query)
    {
        $result = $this->connection->query($query);
        
        if (!$result) {
            die("查询失败: " . $this->connection->error);
        }
        
        return mysqli_fetch_assoc($result);
    }
    // 用于执行INSERT/DELETE/UPDATE语句,返回最近插入记录的ID
    function run_mysql_query($query)
    {
        $result = $this->connection->query($query);
        
        if (!$result) {
            die("执行失败: " . $this->connection->error);
        }
        
        return $this->connection->insert_id;
    }
    // 转义字符串,防止SQL注入
    function escape_this_string($string)
    {
        return $this->connection->real_escape_string($string);
    }
}

2. 修复Sites类的select方法逻辑

原select方法循环赋值会覆盖$this->client,导致最终只有最后一个列名被保留,需修改为拼接所有传入的列名:

public function select($myClient)
{
    // 将数组中的列名用逗号拼接,支持多列查询
    $this->client = implode(', ', $myClient);
    return $this;
}

3. 验证代码运行

修改完成后,重新运行Query_builder类的代码,即可正常连接数据库并执行查询。

内容的提问来源于stack exchange,提问作者Gad Ashell

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 11:42:15