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

