Простой PHP ООП-запрос null - PullRequest
       1

Простой PHP ООП-запрос null

0 голосов
/ 16 октября 2018

Я пытаюсь написать простую программу, которая запрашивает sql в базу данных, используя объектно-ориентированное программирование.Я получаю сообщение об ошибке:

Неустранимая ошибка: необученная ошибка: вызов функции-члена query () для null в C: \ xampp \ htdocs \ learning \ core \ classes \ core.php: 11Трассировка стека: # 0 C: \ xampp \ htdocs \ learning \ core \ classes \ core.php (23): core-> query ('SELECT * FROM c ...') # 1 C: \ xampp \ htdocs \ learning\ core \ classes \ core.php (27): test-> test () # 2 C: \ xampp \ htdocs \ learning \ core \ init.php (6): требуется ('C: \ xampp \ htdocs ...') # 3 {main} в C: \ xampp \ htdocs \ learning \ core \ classes \ core.php в строке 11

<?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 голосов
/ 16 октября 2018

Вы не вызвали родительский конструктор из тестового класса.

Документы 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

... при той же самой информации PHP, найденной здесь , я изменил конструктор класса test() на __construct, как у вас в классе core, но сохранил функцию с именем test(), которая выполняетзапрос.Наличие конструктора с тем же именем, что и у класса, быстро устареет.В зависимости от вашей версии PHP, запустите php -l file.php в командной строке вашего файла, чтобы проверить возможные проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...