简单的PHP OOP查询null

时间:2018-10-16 00:45:07

标签: php mysqli

我正在尝试编写一个简单的程序,使用面向对象的编程将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();
    ?>

1 个答案:

答案 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来检查任何潜在的问题。