我正在尝试编写一个简单的程序,使用面向对象的编程将sql查询到数据库。我不断收到错误消息:
致命错误:未捕获错误:在null上调用成员函数query() 在C:\ xampp \ htdocs \ learning \ core \ classes \ core.php:11堆栈跟踪:#0 C:\ xampp \ htdocs \ learning \ core \ classes \ core.php(23): 核心->查询('SELECT * FROM c ...')#1 C:\ xampp \ htdocs \ learning \ core \ classes \ core.php(27):test-> test()#2 C:\ xampp \ htdocs \ learning \ core \ init.php(6): require('C:\ xampp \ htdocs ...')#3 {main}被抛出 第11行的C:\ xampp \ htdocs \ learning \ core \ classes \ core.php
<?php
class core{
protected $db, $results;
private $rows;
public function __construct(){
$this->db = new mysqli('localhost', 'root','','test');
}
public function query($sql){
$this->result = $this->db->query($sql);
}
public function rows(){
for($x = 1; $x <= $this->db->affected_rows; $x++){
$this->rows[] = $this->result->fetch_assoc();
}
return $this->rows;
}
}
class test extends core{
public function test(){
$this->query("SELECT * FROM currentseason");
}
}
$test = new test();
$test->test();
?>
答案 0 :(得分:3)
您尚未从测试类中调用父构造函数。
PHP文档说:
注意:如果子类定义了一个父类,则不会隐式调用父类构造函数。 构造函数。为了运行父构造函数,请调用parent :: __ construct() 在子构造函数中是必需的。如果子级未定义构造函数>,则可以像常规的类方法一样从父类继承它(如果 它没有被声明为私有)。
我修改了您的测试类,如下所示: (对我的测试数据库中的表进行修改后的查询)
class test extends core {
public function __construct(){
parent::__construct();
}
public function test() {
$this->query("SELECT * FROM bug_table");
foreach ($this->rows() as $row) {
echo $row['category_id'], '<br>';
}
}
}
输出:
Server
Database
Server
Server
Server
...在与here相同的PHP信息下,我将test()
类的构造函数更改为__construct
,就像在core
类中一样,但是保留了该函数名为test()
的查询。具有与该类相同名称的构造函数很快就会被弃用。根据您的PHP版本,在文件的命令行上运行php -l file.php
来检查任何潜在的问题。