Запросите базу данных и передайте результаты дочернему классу в отдельном файле. - PullRequest
0 голосов
/ 17 января 2020

Я схожу с ума здесь, и я знаю, что задавал один и тот же вопрос раньше - но я планирую сохранить остальную часть моих волос.

Чтобы обрисовать мою проблему: у меня есть класс, который запрашивает базу данных (QueryDB) и сохраняет результаты в виде ассоциативного массива с именем $data, а другой класс (DisplayTable) должен отображать таблицу на основе этих результатов.

I могу print_r($data) из самого класса, но как мне получить доступ к переменной $data из дочернего класса в отдельном файле? Я провел последнюю неделю, пытаясь почти все - с или без $this->, делая методы получения и установки, возвращает / не возвращает, но массив в DisplayTable либо выходит пустым, либо просто возвращает NULL.

Если я жестко закодирую массив ($defined) в QueryDB, который идентичен результатам, которые я получаю из массива $data, я могу просто передать его в дочерний класс, используя $this->defined, так что единственное очевидное отличие между $data $defined означает, что $data генерируется динамически. Относятся ли они к совершенно другим, чем к stati c, или я пропускаю некоторые базовые c вещи в классе (ах) моего родителя или ребенка?

И, если вы могли бы кратко объяснить мою ошибку (ы) вместо того, чтобы просто сказать «вам нужно то или иное в строке X» . Это не помогает мне учиться, и я действительно хочу стать лучше в этом:)

querydb. php:

class QueryDB extends DBCon {

    public $q;
    public $result;
    public $data = array();
    public $defined = array(
        array(
            "id" => 1,
            "user" => "user1",
            "pass" => "pass1"),
        array(
            "id" => 2,
            "user" => "user2",
            "pass" => "pass2")
    );

    public function __construct($q) {

        $result = $this->connect()->query($q) or die("Database error");
        $numRows = $result->num_rows;

        if ( $numRows > 0 ) {

            while ($row = $result->fetch_assoc()) {

                $this->data[] = $row;

            }

            return $this->data;

        } else {

            echo 'No rows found.';

        }

    }

}

displaytable. php:

<code>class DisplayTable extends QueryDB {

    public function __construct() {
        echo '<pre>';
        print_r($this->defined); // Returns the hardcoded array
        print_r($this->data);    // Returns an empty array
        echo '
'; }}

РЕДАКТИРОВАТЬ Jan 18: Хорошо, немного повозившись, я неожиданно заставил его работать. Возможно, это не оптимальный или правильный способ сделать это, но мой код выглядит следующим образом:

querydb. php:

class QueryDB extends DBCon {
    public $q;
    public $result;
    public $data = array();

    public function __construct() {
    }

    public function query($q) {

        $result = $this->connect()->query($q) or die("Database error");
        $numRows = $result->num_rows;

        if ( $numRows > 0 ) {

            while ($row = $result->fetch_assoc()) {

                $this->data[] = $row;

            }

            return $this->data;

        } else {

            echo 'No rows found.';

        }

    }

}

displaytable. php:

<code>class DisplayTable extends QueryDB {

    public $foo;

    public function __construct() {
        parent::__construct();
    }

    public function getTable($foo) {
        echo '<pre>';
        print_r($foo->data);
        echo '
'; }}

index. php:

$res    = new QueryDB();

$res->query("SELECT * FROM `testdb`");

$tab    = new DisplayTable();
$tab->getTable($res);

Я правильно понимаю?:

  1. $res = new QueryDB(); // Я создаю экземпляр Объект QueryDB как $res в index.php
  2. $res->query("SELECT * FROM 'testdb'"); // Я передаю запрос в качестве аргумента
  3. В QueryDB классе возвращается массив $data: return $this->data;
  4. $res теперь содержит массив $data, верно?
  5. Я создаю экземпляр объекта DisplayTable() как $tab в index.php
  6. Я вызываю getTable() метод с использованием $res в качестве аргумента
  7. getTable() метод принимает $foo в качестве аргумента-заполнителя (который на самом деле $res)
  8. Теперь у меня есть доступ к $foo->data / ($res->data)

Возможно, это слишком много назад и вперед, но это единственное решение, которое я могу найти прямо сейчас. Предложения по упрощению (если возможно) по-прежнему очень ценятся:)

1 Ответ

0 голосов
/ 17 января 2020

Если переопределить конструктор в классе, который расширяет другой класс, этот дочерний конструктор запускает вместо (вместо в дополнение к ) конструктора родительского класса. Таким образом, вы (обычно) хотите явно вызвать конструктор родительского класса из конструктора дочернего класса:

class DisplayTable extends QueryDB {
    public function __construct() {
        parent::__construct();
        // stuff specific to this child class
    }
}

При этом конструкторы не должны ничего возвращать или выводить что-либо. Их следует использовать только для инициализации объекта. Не помещайте основные логики c для вашего класса в конструктор, поместите их в метод с именем query() или что-то в этом роде.

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